/// <summary> /// A method that takes a Query, and writes a log of that Query and when it was /// executed to a file on disk. All Queries executed on a given day are written /// to a file with that date as the filename. There's not a massive amount /// of complex logic here, just StreamWriters. /// </summary> /// <param name="query">The Query object to log.</param> /// <param name="remoteQuery">Whether or not this was a query processed on the server.</param> internal static void LogToDisk(Query query, bool remoteQuery) { string directoryPath = ConfigurationManager.AppSettings["LoggingDirectory"]; string queryLogString; if (remoteQuery) { queryLogString = query.ToString() + " processed on server"; } else { queryLogString = query.ToString(); } if(Directory.Exists(directoryPath)) { DateTime currentDay = DateTime.Today.Date; if (File.Exists(directoryPath + @"\" + currentDay.ToString(DATE_FORMAT) + ".txt")) { using (StreamWriter fileWriter = new StreamWriter(directoryPath + @"\" + currentDay.ToString(DATE_FORMAT) + ".txt", true)) { fileWriter.WriteLine(queryLogString); } } else { using (StreamWriter fileWriter = new StreamWriter(directoryPath + @"\" + currentDay.ToString(DATE_FORMAT) + ".txt", false)) { fileWriter.WriteLine(queryLogString); } } } }
/// <summary> /// A method that takes a Query, sends that Query /// to the NoiseDB server you're connected to, /// waits to receive the QueryResult of executing /// that Query, and returns it. /// </summary> /// <param name="query">The Query to execute on the server.</param> /// <returns> /// The QueryResult of the executed Query. /// </returns> public QueryResult SendQueryAndReturnResult(Query query) { Byte[] byteBuffer = new Byte[ByteArraySize]; string jsonSerializedQuery = JsonConvert.SerializeObject(query); byteBuffer = Encoding.ASCII.GetBytes(jsonSerializedQuery); int responseBytes; Byte[] responseByteBuffer; responseByteBuffer = WriteQueryToStreamAndReadResult(ClientStream, byteBuffer, out responseBytes); string jsonSerializedQueryResult = Encoding.ASCII.GetString(responseByteBuffer, 0, responseBytes); QueryResult response; try { response = JsonConvert.DeserializeObject<QueryResult>(jsonSerializedQueryResult); } catch(JsonException e) { return new QueryResult("Failed", e, null); } return response; }
/// <summary> /// /// </summary> /// <param name="query"></param> /// <returns></returns> public QueryResult ExecuteQuery(Query query) { if (IsConnectedToNetworkDataStore) { if (LoggingEnabled) { LoggingService.LogToDisk(query, true); } if (query.Command == Commands.SERVER_DISCONNECT) { IsConnectedToNetworkDataStore = false; } return QueryTcpClient.SendQueryAndReturnResult(query); } if (LoggingEnabled) { LoggingService.LogToDisk(query, false); } switch (query.Command) { case Commands.GET: return GetValue(query); case Commands.SET: return SetValue(query); case Commands.DELETE: return DeleteValue(query); case Commands.SERVER_START: return StartServer(query); case Commands.SERVER_STOP: return StopServer(); case Commands.SERVER_CONNECT: return ServerConnect(query); case Commands.SERVER_DISCONNECT: IsConnectedToNetworkDataStore = false; return new QueryResult("Success", null, null); case Commands.SAVE: return SaveDataStore(query); case Commands.LOAD: return LoadDataStore(query); default: return new QueryResult("Unrecognised Command", null, null); } }
/// <summary> /// /// </summary> /// <returns></returns> private QueryResult StartServer(Query query) { return QueryTcpServer.StartListener(query.Key); }
/// <summary> /// /// </summary> /// <param name="query"></param> /// <returns></returns> private QueryResult SetValue(Query query) { if (string.IsNullOrEmpty(query.Argument) || string.IsNullOrEmpty(query.Key)) { return new QueryResult("Failed", new ArgumentNullException(), null); } return DataService.SetValue(query.Key, query.Argument); }
/// <summary> /// /// </summary> /// <param name="query"></param> /// <returns></returns> private QueryResult ServerDisconnect(Query query) { IsConnectedToNetworkDataStore = false; return new QueryResult("Success", null, null); }
/// <summary> /// /// </summary> /// <param name="query"></param> /// <returns></returns> private QueryResult ServerConnect(Query query) { try { if (string.IsNullOrEmpty(query.Key)) { return new QueryResult("Failed", new ArgumentNullException(nameof(query.Key)), null); } IsConnectedToNetworkDataStore = true; return QueryTcpClient.Connect(query.Key).Result; } catch(Exception e) { return null; } }
/// <summary> /// /// </summary> /// <param name="query"></param> /// <returns></returns> private QueryResult SaveDataStore(Query query) { if (string.IsNullOrEmpty(query.Key)) { return new QueryResult("Failed", new ArgumentNullException(nameof(query.Key)), null); } return DataService.SaveStore(query.Key); }