/// <summary> /// Saves the result for the given query to Storage and a local tmp file /// </summary> async Task<FPath> SaveResult(IDbConnection db, FPath tempDir, ResQuery q) { var sw = Stopwatch.StartNew(); var reader = await ResQuery(db, q); var fileName = $"{q.Name}.csv.gz"; var tempFile = tempDir.Combine(fileName); using (var fileWriter = tempFile.Open(FileMode.Create, FileAccess.Write)) await reader.WriteCsvGz(fileWriter, fileName, Log); // save to both latest and the current date await SaveToLatestAndDateDirs(fileName, tempFile); Log.Information("Complete saving result {Name} in {Duration}", q.Name, sw.Elapsed); return tempFile; }
async Task<IDataReader> ResQuery(IDbConnection db, ResQuery q) { var query = q.Query ?? $"select * from {q.Name}"; if (q is FileQuery f) { var req = new Uri(ResCfg.FileQueryUri + "/" + f.Path.StringValue).Get() .AddHeader("Cache-Control", "no-cache"); var res = await Http.SendAsync(req); query = await res.ContentAsString(); } Log.Information("Saving result {Name}: {Query}", q.Name, query); try { var reader = await db.ExecuteReaderAsync(query, q.Parameters, commandType: CommandType.Text); return reader; } catch (Exception ex) { throw new InvalidOperationException($"Error when executing '{q.Name}': {ex.Message}", ex); } }