private KustoRestTableOfContentsV1 SetTableOfContents(KustoRestResponseV1 responseDataSet) { KustoRestTableOfContentsV1 content = new KustoRestTableOfContentsV1(); if (responseDataSet == null || responseDataSet.Tables?.Length < 2) { Log.Debug($"no table of content table"); return(content); } KustoRestResponseTableV1 tableOfContents = responseDataSet.Tables.Last(); for (int c = 0; c < tableOfContents.Columns.Length; c++) { content.Columns.Add( new KustoRestTableOfContentsColumnV1 { _index = c, ColumnName = tableOfContents.Columns[c].ColumnName, ColumnType = tableOfContents.Columns[c].ColumnType, DataType = tableOfContents.Columns[c].DataType }); } for (int r = 0; r < tableOfContents.Rows.Length; r++) { Hashtable record = new Hashtable(); KustoRestTableOfContentsRowV1 row = new KustoRestTableOfContentsRowV1(); object[] rowFields = tableOfContents.Rows[r]; if (rowFields.Length != tableOfContents.Columns.Length) { Log.Error($"mismatch in column count and row count {rowFields.Count()} {tableOfContents.Columns.Length}"); return(content); } //typeof((tableOfContents.Columns.First(x => x.ColumnName.Equals("Id")).DataType) row._index = r; row.Id = rowFields[content.Columns.First(x => x.ColumnName.Equals("Id"))._index].ToString(); row.Kind = rowFields[content.Columns.First(x => x.ColumnName.Equals("Kind"))._index].ToString(); row.Name = rowFields[content.Columns.First(x => x.ColumnName.Equals("Name"))._index].ToString(); row.Ordinal = Convert.ToInt64(rowFields[content.Columns.First(x => x.ColumnName.Equals("Ordinal"))._index]); row.PrettyName = rowFields[content.Columns.First(x => x.ColumnName.Equals("PrettyName"))._index].ToString(); //list.Add(row.ToString()); content.Rows.Add(row); } return(content); }
public List <string> Query(string query) { Log.Info($"query:{query}", ConsoleColor.Blue); if (_kustoQueryClient == null) { _kustoQueryClient = KustoClientFactory.CreateCslQueryProvider(ManagementConnection); queryTimer = new Timer(DisposeQueryClient, null, maxKustoClientTimeMs, maxKustoClientTimeMs); } try { queryTimer.Change(maxKustoClientTimeMs, maxKustoClientTimeMs); /* * if (query.Trim().StartsWith(".")) * { * return EnumerateResults(_kustoQueryClient.ExecuteQuery(DatabaseName, query, null)); * } * else * { * // unable to parse multiple tables v1 or v2 using kusto so using httpclient and rest * return EnumerateResults(_kustoQueryClient.ExecuteQueryV2Async(DatabaseName, query, null).Result); * //xxDataSet t = (DataSet)_kustoQueryClient.ExecuteQueryV2Async(DatabaseName, query, null).Result; * } */ //test string requestBody = "{ \"db\": \"" + DatabaseName + "\", \"csl\": \"" + query + "\" }"; string requestId = new Guid().ToString(); Dictionary <string, string> headers = new Dictionary <string, string>(); headers.Add("accept", "application/json"); headers.Add("host", HostName); headers.Add("x-ms-client-request-id", requestId); Log.Info($"query:", requestBody); _httpClient.DisplayResponse = Config.LogDebug; _httpClient.SendRequest(uri: RestQueryUri, authToken: _arm.BearerToken, jsonBody: requestBody, httpMethod: HttpMethod.Post, headers: headers); ResponseDataSet = JsonConvert.DeserializeObject <KustoRestResponseV1>(_httpClient.ResponseStreamString); if (!ResponseDataSet.HasData()) { Log.Info($"no tables:", ResponseDataSet); return(new List <string>()); } KustoRestTableOfContentsV1 toc = SetTableOfContents(ResponseDataSet); if (toc.HasData) { SetExtendedProperties(); long index = toc.Rows.FirstOrDefault(x => x.Kind.Equals("QueryResult")).Ordinal; PrimaryResultTable = new KustoRestTable(ResponseDataSet.Tables[index]); return(PrimaryResultTable.RecordsCsv()); } else // if (responseDataSet.Tables.Length == 1) { TableOfContents = new KustoRestTableOfContentsV1(); Cursor = "''"; ExtendedPropertiesTable = new KustoRestTable(); PrimaryResultTable = new KustoRestTable(ResponseDataSet.Tables[0]); return(PrimaryResultTable.RecordsCsv()); } } catch (Exception e) { Log.Exception($"exception executing query: {query}\r\n{e}"); return(new List <string>()); } }