private async Task InitializeInternal(EditInitializeParams initParams, Connector connector, QueryRunner queryRunner, Func <Task> successHandler, Func <Exception, Task> failureHandler) { try { // Step 1) Look up the SMO metadata string[] namedParts = GetEditTargetName(initParams); objectMetadata = metadataFactory.GetObjectMetadata(await connector(), namedParts, initParams.ObjectType); // Step 2) Get and execute a query for the rows in the object we're looking up EditSessionQueryExecutionState state = await queryRunner(ConstructInitializeQuery(objectMetadata, initParams.Filters)); if (state.Query == null) { string message = state.Message ?? SR.EditDataQueryFailed; throw new Exception(message); } // Step 3) Setup the internal state associatedResultSet = ValidateQueryForSession(state.Query); NextRowId = associatedResultSet.RowCount; EditCache = new ConcurrentDictionary <long, RowEditBase>(); IsInitialized = true; objectMetadata.Extend(associatedResultSet.Columns); // Step 4) Return our success await successHandler(); } catch (Exception e) { await failureHandler(e); } }
/// <summary> /// Constructs a query for selecting rows in a table based on the filters provided. /// Internal for unit testing purposes only. /// </summary> internal static string ConstructInitializeQuery(EditTableMetadata metadata, EditInitializeFiltering initFilters) { StringBuilder queryBuilder = new StringBuilder("SELECT "); // If there is a filter for top n rows, then apply it if (initFilters.LimitResults.HasValue) { if (initFilters.LimitResults < 0) { throw new ArgumentOutOfRangeException(nameof(initFilters.LimitResults), SR.EditDataFilteringNegativeLimit); } queryBuilder.AppendFormat("TOP {0} ", initFilters.LimitResults.Value); } // Using the columns we know, add them to the query var columns = metadata.Columns.Select(col => col.EscapedName); var columnClause = string.Join(", ", columns); queryBuilder.Append(columnClause); // Add the FROM queryBuilder.AppendFormat(" FROM {0}", metadata.EscapedMultipartName); return(queryBuilder.ToString()); }
/// <summary> /// Extracts extended column properties from the database columns from SQL Client /// </summary> /// <param name="dbColumnWrappers">The column information provided by SQL Client</param> public void Extend(DbColumnWrapper[] dbColumnWrappers) { Validate.IsNotNull(nameof(dbColumnWrappers), dbColumnWrappers); Columns = EditTableMetadata.FilterColumnMetadata(Columns, dbColumnWrappers); // Iterate over the column wrappers and improve the columns we have for (int i = 0; i < Columns.Length; i++) { Columns[i].Extend(dbColumnWrappers[i]); } // Determine what the key columns are KeyColumns = Columns.Where(c => c.IsKey.HasTrue()).ToArray(); if (KeyColumns.Length == 0) { // We didn't find any explicit key columns. Instead, we'll use all columns that are // trustworthy for uniqueness (usually all the columns) KeyColumns = Columns.Where(c => c.IsTrustworthyForUniqueness.HasTrue()).ToArray(); } // Mark that the table is now extended HasExtendedProperties = true; }