X Tutup
using System.Collections.Generic; using System.Threading.Tasks; using Npgsql.Internal; using Npgsql.Internal.Postgres; using Npgsql.PostgresTypes; using Npgsql.Util; namespace Npgsql; sealed class PostgresMinimalDatabaseInfoFactory : INpgsqlDatabaseInfoFactory { public Task Load(NpgsqlConnector conn, NpgsqlTimeout timeout, bool async) => Task.FromResult( !conn.DataSource.Configuration.TypeLoading.LoadTypes ? (NpgsqlDatabaseInfo)new PostgresMinimalDatabaseInfo(conn) : null); } sealed class PostgresMinimalDatabaseInfo : PostgresDatabaseInfo { static PostgresType[]? _typesWithMultiranges, _typesWithoutMultiranges; static PostgresType[] CreateTypes(bool withMultiranges) { var types = new List(); Add(DataTypeNames.Int2, oid: 21, arrayOid: 1005); AddWithRange(DataTypeNames.Int4, oid: 23, arrayOid: 1007, rangeName: DataTypeNames.Int4Range, rangeOid: 3904, rangeArrayOid: 3905, multirangeOid: 4451, multirangeArrayOid: 6150); Add(DataTypeNames.Int8, oid: 20, arrayOid: 1016); AddWithRange(DataTypeNames.Int8, oid: 20, arrayOid: 1016, rangeName: DataTypeNames.Int8Range, rangeOid: 3926, rangeArrayOid: 3927, multirangeOid: 4536, multirangeArrayOid: 6157); Add(DataTypeNames.Float4, oid: 700, arrayOid: 1021); Add(DataTypeNames.Float8, oid: 701, arrayOid: 1022); AddWithRange(DataTypeNames.Numeric, oid: 1700, arrayOid: 1231, rangeName: DataTypeNames.NumRange, rangeOid: 3906, rangeArrayOid: 3907, multirangeOid: 4532, multirangeArrayOid: 6151); Add(DataTypeNames.Money, oid: 790, arrayOid: 791); Add(DataTypeNames.Bool, oid: 16, arrayOid: 1000); Add(DataTypeNames.Box, oid: 603, arrayOid: 1020); Add(DataTypeNames.Circle, oid: 718, arrayOid: 719); Add(DataTypeNames.Line, oid: 628, arrayOid: 629); Add(DataTypeNames.LSeg, oid: 601, arrayOid: 1018); Add(DataTypeNames.Path, oid: 602, arrayOid: 1019); Add(DataTypeNames.Point, oid: 600, arrayOid: 1017); Add(DataTypeNames.Polygon, oid: 604, arrayOid: 1027); Add(DataTypeNames.Bpchar, oid: 1042, arrayOid: 1014); Add(DataTypeNames.Text, oid: 25, arrayOid: 1009); Add(DataTypeNames.Varchar, oid: 1043, arrayOid: 1015); Add(DataTypeNames.Name, oid: 19, arrayOid: 1003); Add(DataTypeNames.Bytea, oid: 17, arrayOid: 1001); AddWithRange(DataTypeNames.Date, oid: 1082, arrayOid: 1182, rangeName: DataTypeNames.DateRange, rangeOid: 3912, rangeArrayOid: 3913, multirangeOid: 4535, multirangeArrayOid: 6155); Add(DataTypeNames.Time, oid: 1083, arrayOid: 1183); AddWithRange(DataTypeNames.Timestamp, oid: 1114, arrayOid: 1115, rangeName: DataTypeNames.TsRange, rangeOid: 3908, rangeArrayOid: 3909, multirangeOid: 4533, multirangeArrayOid: 6152); AddWithRange(DataTypeNames.TimestampTz, oid: 1184, arrayOid: 1185, rangeName: DataTypeNames.TsTzRange, rangeOid: 3910, rangeArrayOid: 3911, multirangeOid: 4534, multirangeArrayOid: 6153); Add(DataTypeNames.Interval, oid: 1186, arrayOid: 1187); Add(DataTypeNames.TimeTz, oid: 1266, arrayOid: 1270); Add(DataTypeNames.Inet, oid: 869, arrayOid: 1041); Add(DataTypeNames.Cidr, oid: 650, arrayOid: 651); Add(DataTypeNames.MacAddr, oid: 829, arrayOid: 1040); Add(DataTypeNames.MacAddr8, oid: 774, arrayOid: 775); Add(DataTypeNames.Bit, oid: 1560, arrayOid: 1561); Add(DataTypeNames.Varbit, oid: 1562, arrayOid: 1563); Add(DataTypeNames.TsVector, oid: 3614, arrayOid: 3643); Add(DataTypeNames.TsQuery, oid: 3615, arrayOid: 3645); Add(DataTypeNames.RegConfig, oid: 3734, arrayOid: 3735); Add(DataTypeNames.Uuid, oid: 2950, arrayOid: 2951); Add(DataTypeNames.Xml, oid: 142, arrayOid: 143); Add(DataTypeNames.Json, oid: 114, arrayOid: 199); Add(DataTypeNames.Jsonb, oid: 3802, arrayOid: 3807); Add(DataTypeNames.Jsonpath, oid: 4072, arrayOid: 4073); Add(DataTypeNames.RefCursor, oid: 1790, arrayOid: 2201); Add(DataTypeNames.OidVector, oid: 30, arrayOid: 1013); Add(DataTypeNames.Int2Vector, oid: 22, arrayOid: 1006); Add(DataTypeNames.Oid, oid: 26, arrayOid: 1028); Add(DataTypeNames.Xid, oid: 28, arrayOid: 1011); Add(DataTypeNames.Xid8, oid: 5069, arrayOid: 271); Add(DataTypeNames.Cid, oid: 29, arrayOid: 1012); Add(DataTypeNames.RegType, oid: 2206, arrayOid: 2211); Add(DataTypeNames.Tid, oid: 27, arrayOid: 1010); Add(DataTypeNames.PgLsn, oid: 3220, arrayOid: 3221); Add(DataTypeNames.Unknown, oid: 705, arrayOid: 0); Add(DataTypeNames.Void, oid: 2278, arrayOid: 0); return types.ToArray(); void Add(DataTypeName name, uint oid, uint arrayOid) { var type = new PostgresBaseType(name, oid); types.Add(type); if (arrayOid is not 0) types.Add(new PostgresArrayType(name.ToArrayName(), arrayOid, type)); } void AddWithRange(DataTypeName name, uint oid, uint arrayOid, DataTypeName rangeName, uint rangeOid, uint rangeArrayOid, uint multirangeOid, uint multirangeArrayOid) { var type = new PostgresBaseType(name, oid); var rangeType = new PostgresRangeType(rangeName, rangeOid, type); types.Add(type); types.Add(new PostgresArrayType(name.ToArrayName(), arrayOid, type)); types.Add(rangeType); types.Add(new PostgresArrayType(rangeName.ToArrayName(), rangeArrayOid, rangeType)); if (withMultiranges) { var multirangeType = new PostgresMultirangeType(rangeName.ToDefaultMultirangeName(), multirangeOid, rangeType); types.Add(multirangeType); types.Add(new PostgresArrayType(multirangeType.DataTypeName.ToArrayName(), multirangeArrayOid, multirangeType)); } } } protected override IEnumerable GetTypes() => SupportsMultirangeTypes ? _typesWithMultiranges ??= CreateTypes(withMultiranges: true) : _typesWithoutMultiranges ??= CreateTypes(withMultiranges: false); internal PostgresMinimalDatabaseInfo(NpgsqlConnector conn) : base(conn) => HasIntegerDateTimes = !conn.PostgresParameters.TryGetValue("integer_datetimes", out var intDateTimes) || intDateTimes == "on"; // TODO, split database info and type catalog. internal PostgresMinimalDatabaseInfo() : base("minimal", 5432, "minimal", "14") { } static PostgresMinimalDatabaseInfo? _defaultTypeCatalog; internal static PostgresMinimalDatabaseInfo DefaultTypeCatalog { get { if (_defaultTypeCatalog is not null) return _defaultTypeCatalog; var catalog = new PostgresMinimalDatabaseInfo(); catalog.ProcessTypes(); return _defaultTypeCatalog = catalog; } } }
X Tutup