private void PersistAccessLogFile(SqliteConnection connection, string filePath) { Execute(connection, "BEGIN"); using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { // decompress, if necessary Stream readStream = fileStream; if (filePath.EndsWith(".gz")) { readStream = new GZipStream(fileStream, CompressionMode.Decompress); } // parse the file, line by line using (var streamReader = new StreamReader(readStream, Encoding.UTF8)) { string line; while ((line = streamReader.ReadLine()) != null) { var entry = _parser.ParseLine(line); PersistEntry(connection, entry); } } } Execute(connection, "COMMIT"); }
public IEnumerable <AccessLogEntry> GetLogEntryPages(ConnectionInfo connectionInfo, string remotePattern) { // get the list of files via SSH var remoteAccessLogList = GetRemoteAccessLogs(connectionInfo, remotePattern); using (var scpClient = new ScpClient(connectionInfo)) { scpClient.Connect(); foreach (var remotePath in remoteAccessLogList) { var entries = new Stack <AccessLogEntry>(); // write the file to the temporary directory string localPath = Path.GetTempFileName(); using (var localStream = new FileStream(localPath, FileMode.Create, FileAccess.ReadWrite)) { // download the log file scpClient.Download(remotePath, localStream); // reset the file cursor to the beginning of the file Stream readStream = localStream; readStream.Position = 0; // decompress the file, if necessary if (remotePath.EndsWith(".gz")) { readStream = new GZipStream(localStream, CompressionMode.Decompress); } // read the file line by line using (var reader = new StreamReader(readStream)) { string line; while ((line = reader.ReadLine()) != null) { entries.Push(_parser.ParseLine(line)); } } } // remove the local file File.Delete(localPath); // yield the results foreach (var entry in entries) { yield return(entry); } } } }