Пример #1
0
        private async Task <IReadOnlyList <IDatabaseColumn> > LoadColumnsAsyncCore(Identifier tableName, CancellationToken cancellationToken)
        {
            var query = await DbConnection.QueryAsync <ColumnDataV10>(
                ColumnsQuery,
                new { SchemaName = tableName.Schema, TableName = tableName.LocalName },
                cancellationToken
                ).ConfigureAwait(false);

            var result = new List <IDatabaseColumn>();

            foreach (var row in query)
            {
                var typeMetadata = new ColumnTypeMetadata
                {
                    TypeName  = Identifier.CreateQualifiedIdentifier(Constants.PgCatalog, row.data_type),
                    Collation = !row.collation_name.IsNullOrWhiteSpace()
                        ? Option <Identifier> .Some(Identifier.CreateQualifiedIdentifier(row.collation_catalog, row.collation_schema, row.collation_name))
                        : Option <Identifier> .None,
                    MaxLength = row.character_maximum_length > 0
                        ? row.character_maximum_length
                        : CreatePrecisionFromBase(row.numeric_precision, row.numeric_precision_radix),
                    NumericPrecision = row.numeric_precision_radix > 0
                        ? Option <INumericPrecision> .Some(CreatePrecisionWithScaleFromBase(row.numeric_precision, row.numeric_scale, row.numeric_precision_radix))
                        : Option <INumericPrecision> .None
                };

                var columnType = TypeProvider.CreateColumnType(typeMetadata);
                var columnName = Identifier.CreateQualifiedIdentifier(row.column_name);

                var isAutoIncrement = row.is_identity == Constants.Yes;
                var autoIncrement   = isAutoIncrement &&
                                      decimal.TryParse(row.identity_start, out var seqStart) &&
                                      decimal.TryParse(row.identity_increment, out var seqIncr)
                    ? Option <IAutoIncrement> .Some(new AutoIncrement(seqStart, seqIncr))
                    : Option <IAutoIncrement> .None;

                var isSerialAutoIncrement = !isAutoIncrement && !row.serial_sequence_schema_name.IsNullOrWhiteSpace() && !row.serial_sequence_local_name.IsNullOrWhiteSpace();
                if (isSerialAutoIncrement)
                {
                    autoIncrement = Option <IAutoIncrement> .Some(new AutoIncrement(1, 1));
                }

                var defaultValue = !row.column_default.IsNullOrWhiteSpace()
                    ? Option <string> .Some(row.column_default)
                    : Option <string> .None;

                var isNullable = row.is_nullable == Constants.Yes;

                var column = new DatabaseColumn(columnName, columnType, isNullable, defaultValue, autoIncrement);
                result.Add(column);
            }

            return(result);
        }