Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
96 commits
Select commit Hold shift + click to select a range
dcbf3ea
Merge pull request #736 from Azure/chgagnon/syncMain
Charles-Gagnon Mar 15, 2023
d323132
Revert "Remove trigger binding for GA release (#732)" (#733)
Charles-Gagnon Mar 15, 2023
2a82a61
vBump release/trigger 2.* -> 3.* (#738)
Charles-Gagnon Mar 15, 2023
cf18917
Add JObject support for SQL trigger (#722)
lucyzhang929 Mar 15, 2023
9d6988c
Fix trigger connection not being retried when connection is closed (#…
Charles-Gagnon Mar 15, 2023
9819cea
Add Privacy Statement to README and telemetry message (#751)
Charles-Gagnon Mar 21, 2023
5cce9d6
enable trigger oop (#750)
MaddyDev Mar 21, 2023
a424e03
Merge pull request #752 from Azure/chgagnon/portTelemetryUpdates
Charles-Gagnon Mar 22, 2023
febf17d
Enable debug logging for Python and PS samples (#754)
lucyzhang929 Mar 22, 2023
717fe16
Add docs & logging information for Leases table info (#756)
Charles-Gagnon Mar 23, 2023
cc0218f
Add ProductsTriggerWithValidation tests for Python, JS, PS (#753)
lucyzhang929 Mar 23, 2023
bc87f7e
Further clarifications to trigger retry docs (#770)
Charles-Gagnon Mar 28, 2023
e683dce
increase timeout to 120 minutes (#776)
lucyzhang929 Mar 29, 2023
f035e92
Enable more tests for OOP trigger (#777)
MaddyDev Mar 30, 2023
bbbe543
bump jackson dependency (#782)
lucyzhang929 Apr 3, 2023
5eed998
Add detailed trigger docs (#780)
Charles-Gagnon Apr 3, 2023
e367aa3
Filter out more default telemetry properties
Charles-Gagnon Mar 31, 2023
90d0ea5
Merge pull request #784 from Azure/chgagnon/portTelemetry
Charles-Gagnon Apr 3, 2023
33ee38c
Merge branch 'main' into chgagnon/mergeMain
Charles-Gagnon Apr 4, 2023
b7a76b8
bring back trigger text
Charles-Gagnon Apr 4, 2023
e8fe283
Fixes
Charles-Gagnon Apr 4, 2023
d6aa85d
Add SQLTrigger annotation to java library (#783)
lucyzhang929 Apr 4, 2023
5bdb495
Disable CSX trigger tests
Charles-Gagnon Apr 4, 2023
290fbbc
fix regex for java library version (#788)
lucyzhang929 Apr 5, 2023
b14070a
Adding rest of Trigger integration tests for Python, PS, JS (#763)
lucyzhang929 Apr 5, 2023
21837bb
Merge pull request #785 from Azure/chgagnon/mergeMain
Charles-Gagnon Apr 6, 2023
621ef15
Skip more trigger tests for CSX (#791)
Charles-Gagnon Apr 6, 2023
ff6e739
Introduce Target Based Scaling (#598)
AmeyaRele Apr 10, 2023
c414f9b
Merge branch 'main' into chgagnon/mergeMain
Charles-Gagnon Apr 10, 2023
a13da52
Merge pull request #794 from Azure/chgagnon/mergeMain
Charles-Gagnon Apr 10, 2023
0f8bdf6
Enable trace level logging for tests (#795)
Charles-Gagnon Apr 10, 2023
26d7d2e
Add java trigger samples (#793)
lucyzhang929 Apr 10, 2023
5ea34ef
Fix up performance tests & enable schedule (#799)
Charles-Gagnon Apr 11, 2023
3c1b41f
Minor trigger doc updates (#800)
Charles-Gagnon Apr 11, 2023
b56fff0
enable rest of the trigger tests for oop (#798)
MaddyDev Apr 12, 2023
3faffa6
add sample for python v2 model (#803)
lucyzhang929 Apr 14, 2023
0113f93
Merge branch 'main' into chgagnon/mergeMain
Charles-Gagnon Apr 14, 2023
0a2ec0c
Fix logs
Charles-Gagnon Apr 14, 2023
0e3a9cb
fix compile
Charles-Gagnon Apr 14, 2023
9addf97
Merge pull request #807 from Azure/chgagnon/mergeMain
Charles-Gagnon Apr 14, 2023
5c54df6
remove delegate (#809)
MaddyDev Apr 17, 2023
feaf36f
add csx trigger samples (#806)
MaddyDev Apr 18, 2023
76289eb
Cleanup trigger logging (#808)
Charles-Gagnon Apr 18, 2023
7fc9cda
[Trigger] Update from main (#820)
Charles-Gagnon Apr 21, 2023
7708a7f
Merge branch 'main' into chgagnon/mergeCommits
Charles-Gagnon Apr 21, 2023
5833327
Merge pull request #822 from Azure/chgagnon/mergeCommits
Charles-Gagnon Apr 21, 2023
8605ed6
[Trigger] Rename csharpscript and align host.json (#825)
Charles-Gagnon Apr 21, 2023
430d0cb
Fix java version in setup guide (#821)
Charles-Gagnon Apr 24, 2023
cb51425
Refactor integration tests (#813)
lucyzhang929 Apr 24, 2023
3cc33cc
Clean csx samples (#812)
MaddyDev Apr 26, 2023
845a27f
remove TriggerSamples folder
MaddyDev Apr 26, 2023
d2e41f6
update trigger docs for csx
MaddyDev Apr 26, 2023
a215097
Merge pull request #833 from Azure/maddy/mergeCsxCleanUp
Charles-Gagnon Apr 26, 2023
a0bedd2
Fix compilation error (#835)
MaddyDev Apr 28, 2023
b58a316
Add retry for Trigger tests (#836)
MaddyDev May 1, 2023
c595da7
Merge branch 'main' into chgagnon/portRevertNodePinning
Charles-Gagnon May 2, 2023
1faaac9
Merge pull request #843 from Azure/chgagnon/portRevertNodePinning
Charles-Gagnon May 3, 2023
b5966a0
Update Trigger Binding set up in SetupGuide_DotnetOutOfProc.md (#845)
lucyzhang929 May 4, 2023
a062d90
Update Trigger Binding set up in SetupGuide_Java.md (#846)
lucyzhang929 May 4, 2023
fa62795
Update SetupGuide_Javascript.md (#847)
lucyzhang929 May 4, 2023
7bdc3d8
FIx perf pipeline (#838)
lucyzhang929 May 4, 2023
4b0f96d
Update SetupGuide_PowerShell.md (#848)
lucyzhang929 May 4, 2023
cbc2f9c
Update SetupGuide_Python.md (#849)
lucyzhang929 May 4, 2023
891bda5
enable test TriggerWithException (#801)
MaddyDev May 12, 2023
c2e8116
Add additional check for closed/broken connection errors (#862)
Charles-Gagnon May 30, 2023
6274cc0
add timestamp to global state table for lease table cleanup (#861)
MaddyDev May 30, 2023
fbb87b1
add test to check LastAccessTime column creation for existing trigger…
MaddyDev May 31, 2023
c1f4671
Merge latest from main into trigger (#866)
Charles-Gagnon Jun 2, 2023
30d3610
Merge branch 'main' into chgagnon/portFix
Charles-Gagnon Jun 2, 2023
31a7c7a
Revert "Remove doc/sample references to preview bundle (#744)"
Charles-Gagnon Jun 2, 2023
9be6144
Merge pull request #869 from Azure/chgagnon/portFix
Charles-Gagnon Jun 2, 2023
cb902d1
add troubleshooting information to the overview doc (#871)
MaddyDev Jun 8, 2023
1c0b9dc
clarifying view change tracking command (#873)
dzsquared Jun 12, 2023
02dca71
Add sql trigger test for different data types (#876)
lucyzhang929 Jun 28, 2023
9759915
Bump Version of Grpc.Net.Client (#877)
chlafreniere Jul 6, 2023
1a0fe10
Merge pull request #879 from Azure/chlafren/triggergrpc
Charles-Gagnon Jul 6, 2023
f3eafb0
Fix code coverage in trigger branch (#880)
lucyzhang929 Jul 10, 2023
f5b5b9c
Fix schema parse error when using reserved keys as table names (#881)
MaddyDev Jul 17, 2023
04f64be
Add LeasesTableName to SqlTriggerAttribute (#893)
lucyzhang929 Jul 28, 2023
824e046
Add leasesTableName to SqlTrigger Java annotation (#897)
lucyzhang929 Aug 2, 2023
89ab16d
update java library to 2.1.0-preview (#899)
lucyzhang929 Aug 3, 2023
d77979f
Update docs with LeasesTableName (#898)
lucyzhang929 Aug 3, 2023
4baf194
GetLeaseLockedRows for debug logging (#900)
MaddyDev Aug 5, 2023
0ec2e69
rename leasesTableName to bracketedLeasesTableName (#902)
MaddyDev Aug 7, 2023
0e63e27
update ReadAsync with Read
MaddyDev Aug 9, 2023
92faba7
replace ExecuteReaderAsync
MaddyDev Aug 10, 2023
7c5e00f
remove missed ExecuteReaderAsync
MaddyDev Aug 10, 2023
b1a8847
remove ReadAsync
MaddyDev Aug 11, 2023
cd56e02
remove async from updated methods
MaddyDev Aug 15, 2023
3df7449
Merge branch 'main' into maddy/replaceReadAsync
MaddyDev Sep 22, 2023
714c052
merge main
MaddyDev Sep 27, 2023
4b86623
fix perf uml
MaddyDev Sep 27, 2023
fe16e4d
resolve doc conflicts
MaddyDev Sep 27, 2023
6173667
resolve remaining conflicts
MaddyDev Sep 27, 2023
7e904b1
fix incomplete merge
MaddyDev Sep 27, 2023
6fc306d
Merge branch 'main' into maddy/replaceReadAsync
MaddyDev Oct 12, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 8 additions & 9 deletions src/SqlAsyncCollector.cs
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,6 @@ private async Task UpsertRowsAsync(IList<T> rows, SqlAttribute attribute, IConfi
string cacheKey = $"{connection.ConnectionString.GetHashCode()}-{fullTableName}";

ObjectCache cachedTables = MemoryCache.Default;
var tableInfo = cachedTables[cacheKey] as TableInformation;

int timeout = AZ_FUNC_TABLE_INFO_CACHE_TIMEOUT_MINUTES;
string timeoutEnvVar = Environment.GetEnvironmentVariable("AZ_FUNC_TABLE_INFO_CACHE_TIMEOUT_MINUTES");
Expand All @@ -199,11 +198,11 @@ private async Task UpsertRowsAsync(IList<T> rows, SqlAttribute attribute, IConfi
}
}

if (tableInfo == null)
if (!(cachedTables[cacheKey] is TableInformation tableInfo))
{
TelemetryInstance.TrackEvent(TelemetryEventName.TableInfoCacheMiss, props);
// set the columnNames for supporting T as JObject since it doesn't have columns in the member info.
tableInfo = await TableInformation.RetrieveTableInformationAsync(connection, fullTableName, this._logger, GetColumnNamesFromItem(rows.First()), this._serverProperties);
tableInfo = TableInformation.RetrieveTableInformation(connection, fullTableName, this._logger, GetColumnNamesFromItem(rows.First()), this._serverProperties);
var policy = new CacheItemPolicy
{
// Re-look up the primary key(s) after timeout (default timeout is 10 minutes)
Expand Down Expand Up @@ -550,7 +549,7 @@ WHEN NOT MATCHED THEN
/// <param name="objectColumnNames">Column names from the object</param>
/// <param name="serverProperties">EngineEdition and Edition of the target Sql Server.</param>
/// <returns>TableInformation object containing primary keys, column types, etc.</returns>
public static async Task<TableInformation> RetrieveTableInformationAsync(SqlConnection sqlConnection, string fullName, ILogger logger, IEnumerable<string> objectColumnNames, ServerProperties serverProperties)
public static TableInformation RetrieveTableInformation(SqlConnection sqlConnection, string fullName, ILogger logger, IEnumerable<string> objectColumnNames, ServerProperties serverProperties)
{
Dictionary<TelemetryPropertyName, string> sqlConnProps = sqlConnection.AsConnectionProps(serverProperties);
var table = new SqlObject(fullName);
Expand All @@ -564,9 +563,9 @@ public static async Task<TableInformation> RetrieveTableInformationAsync(SqlConn
{
string getColumnDefinitionsQuery = GetColumnDefinitionsQuery(table);
var cmdColDef = new SqlCommand(getColumnDefinitionsQuery, sqlConnection);
using (SqlDataReader rdr = await cmdColDef.ExecuteReaderAsyncWithLogging(logger, CancellationToken.None))
using (SqlDataReader rdr = cmdColDef.ExecuteReaderWithLogging(logger))
{
while (await rdr.ReadAsync())
while (rdr.Read())
{
string columnName = rdr[ColumnName].ToString();
columnDefinitionsFromSQL.Add(columnName, rdr[ColumnDefinition].ToString());
Expand Down Expand Up @@ -599,9 +598,9 @@ public static async Task<TableInformation> RetrieveTableInformationAsync(SqlConn
{
string getPrimaryKeysQuery = GetPrimaryKeysQuery(table);
var cmd = new SqlCommand(getPrimaryKeysQuery, sqlConnection);
using (SqlDataReader rdr = await cmd.ExecuteReaderAsyncWithLogging(logger, CancellationToken.None))
using (SqlDataReader rdr = cmd.ExecuteReaderWithLogging(logger))
{
while (await rdr.ReadAsync())
while (rdr.Read())
{
string columnName = rdr[ColumnName].ToString();
primaryKeys.Add(new PrimaryKey(columnName, bool.Parse(rdr[IsIdentity].ToString()), bool.Parse(rdr[HasDefault].ToString())));
Expand Down Expand Up @@ -656,7 +655,7 @@ public static async Task<TableInformation> RetrieveTableInformationAsync(SqlConn
sqlConnProps.Add(TelemetryPropertyName.QueryType, queryType.ToString());
sqlConnProps.Add(TelemetryPropertyName.HasIdentityColumn, hasIdentityColumnPrimaryKeys.ToString());
TelemetryInstance.TrackDuration(TelemetryEventName.GetTableInfo, tableInfoSw.ElapsedMilliseconds, sqlConnProps, durations);
logger.LogDebug($"RetrieveTableInformationAsync DB and Table: {sqlConnection.Database}.{fullName}. Primary keys: [{string.Join(",", primaryKeys.Select(pk => pk.Name))}].\nSQL Column and Definitions: [{string.Join(",", columnDefinitionsFromSQL)}]\nObject columns: [{string.Join(",", objectColumnNames)}]");
logger.LogDebug($"RetrieveTableInformation DB and Table: {sqlConnection.Database}.{fullName}. Primary keys: [{string.Join(",", primaryKeys.Select(pk => pk.Name))}].\nSQL Column and Definitions: [{string.Join(",", columnDefinitionsFromSQL)}]\nObject columns: [{string.Join(",", objectColumnNames)}]");
return new TableInformation(primaryKeys, primaryKeyProperties, columnDefinitionsFromSQL, queryType, hasIdentityColumnPrimaryKeys);
}
}
Expand Down
8 changes: 4 additions & 4 deletions src/SqlAsyncEnumerable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ public ValueTask DisposeAsync()
/// </returns>
public ValueTask<bool> MoveNextAsync()
{
return new ValueTask<bool>(this.GetNextRowAsync());
return new ValueTask<bool>(this.GetNextRow());
}

/// <summary>
Expand All @@ -99,7 +99,7 @@ public ValueTask<bool> MoveNextAsync()
/// <returns>
/// True if there is another row left in the query to process, or false if this was the last row
/// </returns>
private async Task<bool> GetNextRowAsync()
private bool GetNextRow()
{
// check connection state before trying to access the reader
// if DisposeAsync has already closed it due to the issue described here https://github.com/Azure/azure-functions-sql-extension/issues/350
Expand All @@ -109,10 +109,10 @@ private async Task<bool> GetNextRowAsync()
{
using (SqlCommand command = SqlBindingUtilities.BuildCommand(this._attribute, this._connection))
{
this._reader = await command.ExecuteReaderAsync();
this._reader = command.ExecuteReader();
}
}
if (await this._reader.ReadAsync())
if (this._reader.Read())
{
this.Current = Utils.JsonDeserializeObject<T>(this.SerializeRow());
return true;
Expand Down
11 changes: 5 additions & 6 deletions src/SqlBindingUtilities.cs
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ public static async Task VerifyDatabaseSupported(SqlConnection connection, ILogg
string verifyDatabaseSupportedQuery = $"SELECT compatibility_level FROM sys.databases WHERE Name = DB_NAME()";

using (var verifyDatabaseSupportedCommand = new SqlCommand(verifyDatabaseSupportedQuery, connection))
using (SqlDataReader reader = await verifyDatabaseSupportedCommand.ExecuteReaderAsyncWithLogging(logger, cancellationToken))
using (SqlDataReader reader = verifyDatabaseSupportedCommand.ExecuteReaderWithLogging(logger))
{
if (!await reader.ReadAsync(cancellationToken))
{
Expand Down Expand Up @@ -326,7 +326,7 @@ public static async Task<ServerProperties> GetServerTelemetryProperties(SqlConne
string serverPropertiesQuery = $"SELECT SERVERPROPERTY('EngineEdition'), SERVERPROPERTY('Edition')";

using (var selectServerEditionCommand = new SqlCommand(serverPropertiesQuery, connection))
using (SqlDataReader reader = await selectServerEditionCommand.ExecuteReaderAsyncWithLogging(logger, cancellationToken))
using (SqlDataReader reader = selectServerEditionCommand.ExecuteReaderWithLogging(logger))
{
if (await reader.ReadAsync(cancellationToken))
{
Expand Down Expand Up @@ -431,22 +431,21 @@ public static async Task<int> ExecuteNonQueryAsyncWithLogging(this SqlCommand cm
}

/// <summary>
/// Calls ExecuteReaderAsync and logs an error if it fails before rethrowing.
/// Calls ExecuteReader and logs an error if it fails before rethrowing.
/// </summary>
/// <param name="cmd">The SqlCommand being executed</param>
/// <param name="logger">The logger</param>
/// <param name="cancellationToken">The cancellation token to pass to the call</param>
/// <param name="logCommand">Defaults to false and when set logs the command being executed</param>
/// <returns>The result of the call</returns>
public static async Task<SqlDataReader> ExecuteReaderAsyncWithLogging(this SqlCommand cmd, ILogger logger, CancellationToken cancellationToken, bool logCommand = false)
public static SqlDataReader ExecuteReaderWithLogging(this SqlCommand cmd, ILogger logger, bool logCommand = false)
{
try
{
if (logCommand)
{
logger.LogDebug($"Executing query={cmd.CommandText}");
}
return await cmd.ExecuteReaderAsync(cancellationToken);
return cmd.ExecuteReader();
}
catch (Exception e)
{
Expand Down
5 changes: 3 additions & 2 deletions src/TriggerBinding/SqlTableChangeMonitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -295,10 +295,11 @@ private async Task GetTableChangesAsync(SqlConnection connection, CancellationTo
{
var commandSw = Stopwatch.StartNew();

using (SqlDataReader reader = await getChangesCommand.ExecuteReaderAsync(token))
using (SqlDataReader reader = getChangesCommand.ExecuteReader())
{
while (await reader.ReadAsync(token))
while (reader.Read())
{
token.ThrowIfCancellationRequested();
rows.Add(SqlBindingUtilities.BuildDictionaryFromSqlRow(reader));
}
}
Expand Down
13 changes: 7 additions & 6 deletions src/TriggerBinding/SqlTriggerListener.cs
Original file line number Diff line number Diff line change
Expand Up @@ -122,8 +122,8 @@ public async Task StartAsync(CancellationToken cancellationToken)
await VerifyDatabaseSupported(connection, this._logger, cancellationToken);

int userTableId = await GetUserTableIdAsync(connection, this._userTable, this._logger, cancellationToken);
IReadOnlyList<(string name, string type)> primaryKeyColumns = await GetPrimaryKeyColumnsAsync(connection, userTableId, this._logger, this._userTable.FullName, cancellationToken);
IReadOnlyList<string> userTableColumns = await this.GetUserTableColumnsAsync(connection, userTableId, cancellationToken);
IReadOnlyList<(string name, string type)> primaryKeyColumns = GetPrimaryKeyColumnsAsync(connection, userTableId, this._logger, this._userTable.FullName, cancellationToken);
IReadOnlyList<string> userTableColumns = this.GetUserTableColumns(connection, userTableId, cancellationToken);

string bracketedLeasesTableName = GetBracketedLeasesTableName(this._userDefinedLeasesTableName, this._userFunctionId, userTableId);
this._telemetryProps[TelemetryPropertyName.LeasesTableName] = bracketedLeasesTableName;
Expand Down Expand Up @@ -208,7 +208,7 @@ public Task StopAsync(CancellationToken cancellationToken)
/// <summary>
/// Gets the column names of the user table.
/// </summary>
private async Task<IReadOnlyList<string>> GetUserTableColumnsAsync(SqlConnection connection, int userTableId, CancellationToken cancellationToken)
private IReadOnlyList<string> GetUserTableColumns(SqlConnection connection, int userTableId, CancellationToken cancellationToken)
{
const int NameIndex = 0, TypeIndex = 1, IsAssemblyTypeIndex = 2;
string getUserTableColumnsQuery = $@"
Expand All @@ -222,13 +222,14 @@ FROM sys.columns AS c
";

using (var getUserTableColumnsCommand = new SqlCommand(getUserTableColumnsQuery, connection))
using (SqlDataReader reader = await getUserTableColumnsCommand.ExecuteReaderAsyncWithLogging(this._logger, cancellationToken))
using (SqlDataReader reader = getUserTableColumnsCommand.ExecuteReaderWithLogging(this._logger))
{
var userTableColumns = new List<string>();
var userDefinedTypeColumns = new List<(string name, string type)>();

while (await reader.ReadAsync(cancellationToken))
while (reader.Read())
{
cancellationToken.ThrowIfCancellationRequested();
string columnName = reader.GetString(NameIndex);
string columnType = reader.GetString(TypeIndex);
bool isAssemblyType = reader.GetBoolean(IsAssemblyTypeIndex);
Expand Down Expand Up @@ -373,7 +374,7 @@ private async Task<long> InsertGlobalStateTableRowAsync(SqlConnection connection
string getMinValidVersionQuery = $"SELECT CHANGE_TRACKING_MIN_VALID_VERSION({userTableId});";

using (var getMinValidVersionCommand = new SqlCommand(getMinValidVersionQuery, connection, transaction))
using (SqlDataReader reader = await getMinValidVersionCommand.ExecuteReaderAsyncWithLogging(this._logger, cancellationToken))
using (SqlDataReader reader = getMinValidVersionCommand.ExecuteReaderWithLogging(this._logger))
{
if (!await reader.ReadAsync(cancellationToken))
{
Expand Down
2 changes: 1 addition & 1 deletion src/TriggerBinding/SqlTriggerMetricsProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ private async Task<long> GetUnprocessedChangeCountAsync()
await connection.OpenAsync();

int userTableId = await GetUserTableIdAsync(connection, this._userTable, this._logger, CancellationToken.None);
IReadOnlyList<(string name, string type)> primaryKeyColumns = await GetPrimaryKeyColumnsAsync(connection, userTableId, this._logger, this._userTable.FullName, CancellationToken.None);
IReadOnlyList<(string name, string type)> primaryKeyColumns = GetPrimaryKeyColumnsAsync(connection, userTableId, this._logger, this._userTable.FullName, CancellationToken.None);

// Use a transaction to automatically release the app lock when we're done executing the query
using (SqlTransaction transaction = connection.BeginTransaction(IsolationLevel.RepeatableRead))
Expand Down
9 changes: 5 additions & 4 deletions src/TriggerBinding/SqlTriggerUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public static class SqlTriggerUtils
/// <exception cref="InvalidOperationException">
/// Thrown if there are no primary key columns present in the user table or if their names conflict with columns in leases table.
/// </exception>
public static async Task<IReadOnlyList<(string name, string type)>> GetPrimaryKeyColumnsAsync(SqlConnection connection, int userTableId, ILogger logger, string userTableName, CancellationToken cancellationToken)
public static IReadOnlyList<(string name, string type)> GetPrimaryKeyColumnsAsync(SqlConnection connection, int userTableId, ILogger logger, string userTableName, CancellationToken cancellationToken)
{
const int NameIndex = 0, TypeIndex = 1, LengthIndex = 2, PrecisionIndex = 3, ScaleIndex = 4;
string getPrimaryKeyColumnsQuery = $@"
Expand All @@ -44,15 +44,16 @@ FROM sys.indexes AS i
WHERE i.is_primary_key = 1 AND i.object_id = {userTableId};
";
using (var getPrimaryKeyColumnsCommand = new SqlCommand(getPrimaryKeyColumnsQuery, connection))
using (SqlDataReader reader = await getPrimaryKeyColumnsCommand.ExecuteReaderAsyncWithLogging(logger, cancellationToken))
using (SqlDataReader reader = getPrimaryKeyColumnsCommand.ExecuteReaderWithLogging(logger))
{
string[] variableLengthTypes = new[] { "varchar", "nvarchar", "nchar", "char", "binary", "varbinary" };
string[] variablePrecisionTypes = new[] { "numeric", "decimal" };

var primaryKeyColumns = new List<(string name, string type)>();

while (await reader.ReadAsync(cancellationToken))
while (reader.Read())
{
cancellationToken.ThrowIfCancellationRequested();
string name = reader.GetString(NameIndex);
string type = reader.GetString(TypeIndex);

Expand Down Expand Up @@ -96,7 +97,7 @@ internal static async Task<int> GetUserTableIdAsync(SqlConnection connection, Sq
string getObjectIdQuery = $"SELECT OBJECT_ID(N{userTable.QuotedFullName}, 'U');";

using (var getObjectIdCommand = new SqlCommand(getObjectIdQuery, connection))
using (SqlDataReader reader = await getObjectIdCommand.ExecuteReaderAsyncWithLogging(logger, cancellationToken))
using (SqlDataReader reader = getObjectIdCommand.ExecuteReaderWithLogging(logger))
{
if (!await reader.ReadAsync(cancellationToken))
{
Expand Down