From c80b70bea4edc37d505e2e1042433c473eb44217 Mon Sep 17 00:00:00 2001 From: Justin M <63619224+JustinMDotNet@users.noreply.github.com> Date: Tue, 15 Sep 2020 13:34:21 -0700 Subject: [PATCH] 3715 Default database name for Kusto (#1076) * 3715 Refactored GetDatabaseName to load database names from kusto server when no database name available in connection string. * 3715 Removed variable name from GetDatabaseName --- .../DataSource/KustoDataSource.cs | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.Kusto.ServiceLayer/DataSource/KustoDataSource.cs b/src/Microsoft.Kusto.ServiceLayer/DataSource/KustoDataSource.cs index 8d7b6e73..b7a0ead5 100644 --- a/src/Microsoft.Kusto.ServiceLayer/DataSource/KustoDataSource.cs +++ b/src/Microsoft.Kusto.ServiceLayer/DataSource/KustoDataSource.cs @@ -86,8 +86,8 @@ namespace Microsoft.Kusto.ServiceLayer.DataSource public KustoDataSource(string connectionString, string azureAccountToken) { ClusterName = GetClusterName(connectionString); - DatabaseName = GetDatabaseName(connectionString); UserToken = azureAccountToken; + DatabaseName = GetDatabaseName(connectionString); SchemaState = Task.Run(() => KustoIntellisenseHelper.AddOrUpdateDatabaseAsync(this, GlobalState.Default, DatabaseName, ClusterName, throwOnError: false)).Result; @@ -117,14 +117,31 @@ namespace Microsoft.Kusto.ServiceLayer.DataSource } /// - /// Extracts the database name from the connectionstring, if it exists - /// - /// A connection string coming over the Data management protocol - private static string GetDatabaseName(string connectionString) + /// Extracts the database name from the connectionString if it exists + /// otherwise it takes the first database name from the server + /// + /// + /// Database Name + private string GetDatabaseName(string connectionString) { var csb = new SqlConnectionStringBuilder(connectionString); - return csb.InitialCatalog; + if (!string.IsNullOrWhiteSpace(csb.InitialCatalog)) + { + return csb.InitialCatalog; + } + + CancellationTokenSource source = new CancellationTokenSource(); + CancellationToken token = source.Token; + + string query = ".show databases | project DatabaseName"; + + using (var reader = ExecuteQuery(query, token)) + { + var rows = reader.ToEnumerable(); + var row = rows?.FirstOrDefault(); + return row?[0].ToString() ?? string.Empty; + } } ///