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();
            }
        }
示例#2
0
        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")
                };
            }));
        }