internal NetTopologySuiteTypeHandlerResolver(
        NpgsqlConnector connector,
        CoordinateSequenceFactory coordinateSequenceFactory,
        PrecisionModel precisionModel,
        Ordinates handleOrdinates,
        bool geographyAsDefault)
    {
        _databaseInfo       = connector.DatabaseInfo;
        _geographyAsDefault = geographyAsDefault;

        var(pgGeometryType, pgGeographyType) = (PgType("geometry"), PgType("geography"));

        // TODO: In multiplexing, these are used concurrently... not sure they're thread-safe :(
        var reader = new PostGisReader(coordinateSequenceFactory, precisionModel, handleOrdinates);
        var writer = new PostGisWriter();

        if (pgGeometryType is not null)
        {
            _geometryHandler = new NetTopologySuiteHandler(pgGeometryType, reader, writer);
        }
        if (pgGeographyType is not null)
        {
            _geographyHandler = new NetTopologySuiteHandler(pgGeographyType, reader, writer);
        }
    }
Exemple #2
0
    internal JsonNetTypeHandlerResolver(
        NpgsqlConnector connector,
        Dictionary <Type, string> dataClrTypeNamesDataTypeNamesByClrClrType,
        JsonSerializerSettings settings)
    {
        _databaseInfo = connector.DatabaseInfo;

        _jsonbHandler = new JsonbHandler(PgType("jsonb"), connector, settings);
        _jsonHandler  = new JsonHandler(PgType("json"), connector, settings);

        _dataTypeNamesByClrType = dataClrTypeNamesDataTypeNamesByClrClrType;
    }
		public void SetDomainName(string domain)
		{
			DomainName = domain;
			NpgsqlDatabaseInfo.RegisterFactory(new Npgsql.CrateDb.CrateDbDatabaseInfoFactory());
			NpgsqlConnectionStringBuilder builder = new NpgsqlConnectionStringBuilder();
			builder.Database = "doc";
			builder.Username = "******";
			builder.Password = "******";
			builder.Host = DomainName;
			builder.Pooling = true;
			client = new NpgsqlConnection(builder.ToString());
			client2 = new NpgsqlConnection(builder.ToString());
			client.Open();
			client2.Open();
		}
Exemple #4
0
        public async Task TransactionNotSupported()
        {
            if (IsMultiplexing)
            {
                Assert.Ignore("Need to rethink/redo dummy transaction mode");
            }

            var connString = new NpgsqlConnectionStringBuilder(ConnectionString)
            {
                ApplicationName = nameof(TransactionNotSupported) + IsMultiplexing
            }.ToString();

            NpgsqlDatabaseInfo.RegisterFactory(new NoTransactionDatabaseInfoFactory());
            try
            {
                using var conn = await OpenConnectionAsync(connString);

                using var tx = conn.BeginTransaction();

                // Detect that we're not really in a transaction
                var prevTxId = conn.ExecuteScalar("SELECT txid_current()");
                var nextTxId = conn.ExecuteScalar("SELECT txid_current()");
                // If we're in an actual transaction, the two IDs should be the same
                // https://stackoverflow.com/questions/1651219/how-to-check-for-pending-operations-in-a-postgresql-transaction
                Assert.That(nextTxId, Is.Not.EqualTo(prevTxId));
                conn.Close();
            }
            finally
            {
                NpgsqlDatabaseInfo.ResetFactories();
            }

            using (var conn = await OpenConnectionAsync(connString))
            {
                NpgsqlConnection.ClearPool(conn);
                conn.ReloadTypes();
            }

            // Check that everything is back to normal
            using (var conn = await OpenConnectionAsync(connString))
                using (var tx = conn.BeginTransaction())
                {
                    var prevTxId = conn.ExecuteScalar("SELECT txid_current()");
                    var nextTxId = conn.ExecuteScalar("SELECT txid_current()");
                    Assert.That(nextTxId, Is.EqualTo(prevTxId));
                }
        }
        /// <summary>
        /// Initializes the ModuleClient and sets up the callback to receive
        /// messages containing temperature information
        /// </summary>
        static async Task Init()
        {
            NpgsqlDatabaseInfo.RegisterFactory(new CrateDbDatabaseInfoFactory());

            MqttTransportSettings mqttSetting = new MqttTransportSettings(TransportType.Mqtt_Tcp_Only);

            ITransportSettings[] settings = { mqttSetting };

            // Open a connection to the Edge runtime
            ModuleClient ioTHubModuleClient = await ModuleClient.CreateFromEnvironmentAsync(settings);

            await ioTHubModuleClient.OpenAsync();

            Console.WriteLine("IoT Hub module client initialized.");

            // Register callback to be called when a message is received by the module
            await ioTHubModuleClient.SetInputMessageHandlerAsync("input1", PipeMessage, ioTHubModuleClient);
        }
    internal NodaTimeTypeHandlerResolver(NpgsqlConnector connector)
    {
        _databaseInfo = connector.DatabaseInfo;

        _timestampHandler = LegacyTimestampBehavior
            ? new LegacyTimestampHandler(PgType("timestamp without time zone"))
            : new TimestampHandler(PgType("timestamp without time zone"));
        _timestampTzHandler = LegacyTimestampBehavior
            ? new LegacyTimestampTzHandler(PgType("timestamp with time zone"))
            : new TimestampTzHandler(PgType("timestamp with time zone"));
        _dateHandler     = new DateHandler(PgType("date"));
        _timeHandler     = new TimeHandler(PgType("time without time zone"));
        _timeTzHandler   = new TimeTzHandler(PgType("time with time zone"));
        _intervalHandler = new IntervalHandler(PgType("interval"));

        // Note that the range handlers are absent on some pseudo-PostgreSQL databases (e.g. CockroachDB), and multirange types
        // were only introduced in PG14. So we resolve these lazily.

        _arrayNullabilityMode = connector.Settings.ArrayNullabilityMode;
    }
        NpgsqlDbColumn LoadColumnDefinition(NpgsqlDataReader reader, NpgsqlDatabaseInfo databaseInfo)
        {
            // Note: we don't set ColumnName and BaseColumnName. These should always contain the
            // column alias rather than the table column name (i.e. in case of "SELECT foo AS foo_alias").
            // It will be set later.
            var column = new NpgsqlDbColumn
            {
                AllowDBNull           = !reader.GetBoolean(reader.GetOrdinal("attnotnull")),
                BaseCatalogName       = _connection.Database,
                BaseSchemaName        = reader.GetString(reader.GetOrdinal("nspname")),
                BaseServerName        = _connection.Host,
                BaseTableName         = reader.GetString(reader.GetOrdinal("relname")),
                ColumnOrdinal         = reader.GetInt32(reader.GetOrdinal("attnum")) - 1,
                ColumnAttributeNumber = (short)(reader.GetInt16(reader.GetOrdinal("attnum")) - 1),
                IsKey      = reader.GetBoolean(reader.GetOrdinal("isprimarykey")),
                IsReadOnly = !reader.GetBoolean(reader.GetOrdinal("is_updatable")),
                IsUnique   = reader.GetBoolean(reader.GetOrdinal("isunique")),

                TableOID = reader.GetFieldValue <uint>(reader.GetOrdinal("attrelid")),
                TypeOID  = reader.GetFieldValue <uint>(reader.GetOrdinal("typoid"))
            };

            column.PostgresType = databaseInfo.ByOID[column.TypeOID];
            column.DataTypeName = column.PostgresType.DisplayName; // Facets do not get included

            var defaultValueOrdinal = reader.GetOrdinal("default");

            column.DefaultValue = reader.IsDBNull(defaultValueOrdinal) ? null : reader.GetString(defaultValueOrdinal);

            column.IsAutoIncrement = reader.GetBoolean(reader.GetOrdinal("isidentity")) ||
                                     column.DefaultValue != null && column.DefaultValue.StartsWith("nextval(");

            ColumnPostConfig(column, reader.GetInt32(reader.GetOrdinal("typmod")));

            return(column);
        }
        NpgsqlDbColumn LoadColumnDefinition(NpgsqlDataReader reader, NpgsqlDatabaseInfo databaseInfo, bool oldQueryMode)
        {
            // We don't set ColumnName here. It should always contain the column alias rather than
            // the table column name (i.e. in case of "SELECT foo AS foo_alias"). It will be set later.
            var column = new NpgsqlDbColumn
            {
                AllowDBNull           = !reader.GetBoolean(reader.GetOrdinal("attnotnull")),
                BaseCatalogName       = _connection.Database !,
                BaseSchemaName        = reader.GetString(reader.GetOrdinal("nspname")),
                BaseServerName        = _connection.Host !,
                BaseTableName         = reader.GetString(reader.GetOrdinal("relname")),
                BaseColumnName        = reader.GetString(reader.GetOrdinal("attname")),
                ColumnAttributeNumber = reader.GetInt16(reader.GetOrdinal("attnum")),
                IsKey      = reader.GetBoolean(reader.GetOrdinal("isprimarykey")),
                IsReadOnly = !reader.GetBoolean(reader.GetOrdinal("is_updatable")),
                IsUnique   = reader.GetBoolean(reader.GetOrdinal("isunique")),

                TableOID = reader.GetFieldValue <uint>(reader.GetOrdinal("attrelid")),
                TypeOID  = reader.GetFieldValue <uint>(reader.GetOrdinal("typoid"))
            };

            column.PostgresType = databaseInfo.ByOID[column.TypeOID];
            column.DataTypeName = column.PostgresType.DisplayName; // Facets do not get included

            var defaultValueOrdinal = reader.GetOrdinal("default");

            column.DefaultValue = reader.IsDBNull(defaultValueOrdinal) ? null : reader.GetString(defaultValueOrdinal);

            column.IsAutoIncrement =
                !oldQueryMode && reader.GetBoolean(reader.GetOrdinal("isidentity")) ||
                column.DefaultValue != null && column.DefaultValue.StartsWith("nextval(");

            ColumnPostConfig(column, reader.GetInt32(reader.GetOrdinal("typmod")));

            return(column);
        }

        NpgsqlDbColumn SetUpNonColumnField(FieldDescription field)
        {
            // ColumnName and BaseColumnName will be set later
            var column = new NpgsqlDbColumn
            {
                BaseCatalogName       = _connection.Database !,
                BaseServerName        = _connection.Host !,
                IsReadOnly            = true,
                DataTypeName          = field.PostgresType.DisplayName,
                TypeOID               = field.TypeOID,
                TableOID              = field.TableOID,
                ColumnAttributeNumber = field.ColumnAttributeNumber,
                PostgresType          = field.PostgresType
            };

            ColumnPostConfig(column, field.TypeModifier);

            return(column);
        }

        /// <summary>
        /// Performs some post-setup configuration that's common to both table columns and non-columns.
        /// </summary>
        void ColumnPostConfig(NpgsqlDbColumn column, int typeModifier)
        {
            var typeMapper = _connection.Connector !.TypeMapper;

            column.NpgsqlDbType = typeMapper.GetTypeInfoByOid(column.TypeOID).npgsqlDbType;
            column.DataType     = typeMapper.TryGetByOID(column.TypeOID, out var handler)
                ? handler.GetFieldType()
                : null;

            if (column.DataType != null)
            {
                column.IsLong = handler is ByteaHandler;

                if (handler is ICompositeHandler)
                {
                    column.UdtAssemblyQualifiedName = column.DataType.AssemblyQualifiedName;
                }
            }

            var facets = column.PostgresType.GetFacets(typeModifier);

            if (facets.Size != null)
            {
                column.ColumnSize = facets.Size;
            }
            if (facets.Precision != null)
            {
                column.NumericPrecision = facets.Precision;
            }
            if (facets.Scale != null)
            {
                column.NumericScale = facets.Scale;
            }
        }
    }
}
Exemple #9
0
 internal void Bind(NpgsqlDatabaseInfo databaseInfo)
 {
     DatabaseInfo = databaseInfo;
     BindTypes();
 }
 protected void RegisterCrateDbDatabaseInfoFactory()
 {
     NpgsqlDatabaseInfo.RegisterFactory(new CrateDbDatabaseInfoFactory());
 }