Example #1
0
        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);
            }
        }
Example #2
0
        /// <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;
        }