private void OnRequestReceived(CrawlerSqlRequest x) { Logger.Information("Executing {@sql}", x.Statement); var response = new CrawlerSqlResponse(x.Guid); if (x.Statement.StartsWith("SELECT")) { try { var objects = DbConnection.Query(x.Statement).ToList(); response.QueryResult = JsonConvert.SerializeObject(objects, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); Logger.Information("Querying {@sql} resulted in {@objectCount} objects", x.Statement, objects.Count); } catch (Exception e) { response.HasFailed = true; response.Exception = e; } } else { try { var affectedRows = DbConnection.Execute(x.Statement); Logger.Information("Querying {@sql} affected {@rowsAffected} rows", x.Statement, affectedRows); } catch (Exception e) { response.HasFailed = true; response.Exception = e; } } using (var client = new HttpClient()) { client.PostAsync($"{Addresses.ServerUrl}api/crawler", new JsonContent(response)).Wait(); } }
public Task <CrawlerSqlResponse> DoSqlRequest(string statement, string groupName) { var guid = Nanoid.Nanoid.Generate(); if (!IsTerminalAvailable(groupName)) { return(Task.FromResult(new CrawlerSqlResponse(guid) { HasFailed = true, Exception = new CrawlerNotFound("No crawlers available") })); } return(Task.Run(() => { var request = new CrawlerSqlRequest(guid, statement); var resetEvent = new ManualResetEvent(false); WaitingRequests.Add(guid, resetEvent); HubContext.Clients.Group(groupName).SendCoreAsync("sql", new object[] { request }); resetEvent.WaitOne(TimeSpan.FromMinutes(10)); resetEvent.Dispose(); if (ResponsesCompleted.ContainsKey(guid)) { var crawlerSqlResponse = ResponsesCompleted[guid]; ResponsesCompleted.Remove(guid); return crawlerSqlResponse; } return new CrawlerSqlResponse(guid) { HasFailed = true, Exception = new TimeoutException("The crawler didn't respond in time") }; })); }