示例#1
0
        public void PqsqlConnectionTest6()
        {
            PqsqlConnection connection = new PqsqlConnection(connectionString);

            connection.Open();
            Assert.AreEqual(ConnectionState.Open, connection.State, "wrong connection state");

            PqsqlCommand cmd = connection.CreateCommand();

            Assert.AreEqual(CommandType.Text, cmd.CommandType, "wrong command type");
            Assert.AreEqual(-1, cmd.CommandTimeout, "wrong command timeout");
            Assert.AreEqual(string.Empty, cmd.CommandText, "wrong command text");
            Assert.AreEqual(connection, cmd.Connection, "wrong command connection");
            Assert.AreEqual(null, cmd.Transaction, "wrong command transaction");

            cmd.CommandText = "select pg_terminate_backend(pg_backend_pid()); select pg_sleep(5);";

            cmd.ExecuteNonQuery();             // must execute both statements

            cmd.Cancel();

            cmd.CommandText = "";

            cmd.ExecuteNonQuery();
        }
示例#2
0
        public void PqsqlConnectionTest4()
        {
            PqsqlConnection connection = new PqsqlConnection(connectionString);

            connection.Open();
            Assert.AreEqual(ConnectionState.Open, connection.State, "wrong connection state");

            IntPtr conn_attempt1 = connection.PGConnection;

            int sock1 = PqsqlWrapper.PQsocket(conn_attempt1);

            Assert.AreNotEqual(-1, sock1, "wrong socket");

            // close the underlying socket without letting Pqsql and libpq know
            int closed = CloseSocket(sock1);

            Assert.AreEqual(0, closed, "closesocket failed");

            connection.Close();
            Assert.AreEqual(ConnectionState.Closed, connection.State, "wrong connection state");

            connection.Open();
            IntPtr conn_attempt2 = connection.PGConnection;

            ConnStatusType status = PqsqlWrapper.PQstatus(conn_attempt2);

            Assert.AreEqual(ConnStatusType.CONNECTION_OK, status, "connection broken");
            Assert.AreEqual(ConnectionState.Open, connection.State, "wrong connection state");

            int sock2 = PqsqlWrapper.PQsocket(conn_attempt2);

            // close the underlying socket without letting Pqsql and libpq know
            closed = CloseSocket(sock2);
            Assert.AreEqual(0, closed, "closesocket failed");
        }
示例#3
0
        public void PqsqlConnectionTest9()
        {
            PqsqlConnection connection = new PqsqlConnection(connectionString);
            string          s          = connection.GetErrorMessage();

            Assert.AreEqual(string.Empty, s);

            PqsqlCommand cmd = connection.CreateCommand();

            cmd.CommandText = "foobar command";

            try
            {
                cmd.ExecuteNonQuery();
            }
            catch (PqsqlException exception)
            {
                // SYNTAX_ERROR = 16801924, // 42601 (syntax_error)
                //Assert.AreNotSame(string.Empty, exception.Hint);
                Assert.AreEqual("42601", exception.SqlState);
                Assert.AreEqual(16801924, exception.ErrorCode);
            }

            s = connection.GetErrorMessage();
            Assert.IsNotNull(s);
            Assert.AreNotSame(string.Empty, s);
        }
示例#4
0
        public void PqsqlConnectionTest8()
        {
            PqsqlConnection connection = new PqsqlConnection(connectionString);
            DataTable       connschema = connection.GetSchema();

            Assert.Fail();
        }
        public void PqsqlTypeRegistryTest6()
        {
            Action[] actions = new Action[20];

            // stress test user-defined type setup
            for (int i = 0; i < 20; i++)
            {
                actions[i] = () =>
                {
                    using (PqsqlConnection conn = new PqsqlConnection(mConnection.ConnectionString))
                        using (PqsqlCommand cmd = new PqsqlCommand("select 'hello world'::citext", conn))
                            using (PqsqlDataReader reader = cmd.ExecuteReader())
                            {
                                bool read = reader.Read();
                                Assert.IsTrue(read);
                                object helloWorld = reader.GetValue(0);                 // must access by GetValue, GetString verifies typoid
                                Assert.AreEqual("hello world", helloWorld);
                                read = reader.Read();
                                Assert.IsFalse(read);
                            }
                };
            }

            using (PqsqlCommand check = new PqsqlCommand("select oid from pg_extension where extname='citext'", mConnection))
                using (PqsqlCommand create = new PqsqlCommand("create extension citext", mConnection))
                    using (PqsqlTransaction t = mConnection.BeginTransaction())
                    {
                        object o = null;

                        try
                        {
                            check.Transaction = t;
                            o = check.ExecuteScalar();

                            if (o == null)
                            {
                                create.Transaction = t;
                                int aff = create.ExecuteNonQuery();
                                Assert.AreEqual(0, aff);
                            }

                            t.Commit();

                            Parallel.Invoke(actions);
                        }
                        finally
                        {
                            if (o == null)
                            {
                                using (PqsqlCommand drop = new PqsqlCommand("drop extension if exists citext", mConnection))
                                {
                                    int aff = drop.ExecuteNonQuery();
                                    Assert.AreEqual(0, aff);
                                }
                            }
                        }
                    }
        }
示例#6
0
        public void PqsqlConnectionTest2()
        {
            PqsqlConnection connection = new PqsqlConnection(connectionString);

            Assert.AreEqual(ConnectionState.Closed, connection.State, "wrong connection state");
            Assert.AreEqual(connectionString.Replace(" ", "").Replace("\t", "").Replace("\n", ""), connection.ConnectionString, "wrong connection string");
            Assert.AreEqual(3, connection.ConnectionTimeout, "wrong connection timeout");

            // closed connection with service file should give us empty database name
            string dbname = connection.Database;

            Assert.AreEqual(string.Empty, dbname, "wrong connection database");

            string serverVersion = connection.ServerVersion;

            Assert.IsFalse(string.IsNullOrEmpty(serverVersion));
            Assert.AreEqual("-1", serverVersion);

            connection.Open();

            Assert.AreEqual(ConnectionState.Open, connection.State, "wrong connection state");

            dbname = connection.Database;
            Assert.AreNotEqual(string.Empty, dbname, "wrong connection database");

            serverVersion = connection.ServerVersion;
            Assert.IsFalse(string.IsNullOrEmpty(serverVersion));

            if (serverVersion.Length >= 6)             // expect 100000 or later
            {
                int version = Convert.ToInt32(serverVersion);
                Assert.IsTrue(version >= 100000);
            }
            else if (serverVersion.Length >= 5)             // expect 90400 .. 90699
            {
                int version = Convert.ToInt32(serverVersion);
                Assert.IsTrue(version >= 90400);
                Assert.IsTrue(version <= 90699);
            }
            else
            {
                Assert.Fail("wrong server version");
            }

            connection.Close();

            dbname = connection.Database;
            Assert.AreEqual(string.Empty, dbname, "wrong connection database");

            serverVersion = connection.ServerVersion;
            Assert.IsFalse(string.IsNullOrEmpty(serverVersion));
            Assert.AreEqual("-1", serverVersion);

            Assert.AreEqual(ConnectionState.Closed, connection.State, "wrong connection state");
        }
        public void PqsqlCommandBuilderTest3()
        {
            using (PqsqlConnection connection = new PqsqlConnection(connectionString))
                using (PqsqlCommand command = connection.CreateCommand())
                {
                    PqsqlTransaction transaction = connection.BeginTransaction();
                    command.Transaction = transaction;
                    command.CommandText = "create temp table temptab (c0 int4 primary key, c1 float8)";
                    command.CommandType = CommandType.Text;
                    command.ExecuteNonQuery();
                    transaction.Commit();             // temp table must be visible in the next transaction

                    transaction = connection.BeginTransaction();

                    PqsqlDataAdapter adapter = new PqsqlDataAdapter("select * from temptab", connection)
                    {
                        SelectCommand =
                        {
                            Transaction = transaction
                        }
                    };
                    PqsqlCommandBuilder builder = new PqsqlCommandBuilder(adapter);

                    // INSERT INTO "postgres"."pg_temp_2"."temptab" ("c0", "c1") VALUES (:p1, :p2)
                    PqsqlCommand inserter = builder.GetInsertCommand();
                    inserter.Parameters["p1"].Value = 1;
                    inserter.Parameters["p2"].Value = 2.1;
                    int inserted = inserter.ExecuteNonQuery();
                    Assert.AreEqual(1, inserted);

                    // UPDATE "postgres"."pg_temp_2"."temptab"
                    // SET "c0" = :p1, "c1" = :p2
                    // WHERE (("c0" = :p3) AND ((:p4 = 1 AND "c1" IS NULL) OR ("c1" = :p5)))
                    PqsqlCommand updater = builder.GetUpdateCommand();
                    updater.Parameters["p1"].Value = 2;
                    updater.Parameters["p2"].Value = 2.2;
                    updater.Parameters["p3"].Value = 1;
                    updater.Parameters["p4"].Value = 0;
                    updater.Parameters["p5"].Value = 2.1;
                    int updated = updater.ExecuteNonQuery();
                    Assert.AreEqual(1, updated);

                    // DELETE FROM "postgres"."pg_temp_2"."temptab"
                    // WHERE (("c0" = :p1) AND ((:p2 = 1 AND "c1" IS NULL) OR ("c1" = :p3)))
                    PqsqlCommand deleter = builder.GetDeleteCommand();
                    deleter.Parameters["p1"].Value = 2;
                    deleter.Parameters["p2"].Value = 0;
                    deleter.Parameters["p3"].Value = 2.2;
                    int deleted = deleter.ExecuteNonQuery();
                    Assert.AreEqual(1, deleted);

                    transaction.Rollback();
                }
        }
        public void PqsqlCommandBuilderTest2()
        {
            using (PqsqlConnection connection = new PqsqlConnection(connectionString))
                using (PqsqlCommand command = connection.CreateCommand())
                {
                    PqsqlTransaction transaction = connection.BeginTransaction();
                    command.Transaction = transaction;
                    command.CommandText = "create temp table temptab (c0 int4 primary key, c1 float8)";
                    command.CommandType = CommandType.Text;
                    command.ExecuteNonQuery();
                    transaction.Commit();             // temp table must be visible in the next transaction

                    transaction = connection.BeginTransaction();

                    PqsqlDataAdapter adapter = new PqsqlDataAdapter("select * from temptab", connection)
                    {
                        SelectCommand =
                        {
                            Transaction = transaction
                        },
                    };

                    adapter.RowUpdated += Adapter_RowUpdated;

                    PqsqlCommandBuilder builder = new PqsqlCommandBuilder(adapter);

                    DataSet ds = new DataSet();
                    adapter.FillSchema(ds, SchemaType.Source);
                    adapter.Fill(ds, "temptab");

                    DataTable temptab = ds.Tables["temptab"];
                    DataRow   row     = temptab.NewRow();
                    row["c0"] = 123;
                    row["c1"] = 1.23;
                    temptab.Rows.Add(row);

                    adapter.Update(ds, "temptab");

                    command.CommandText = "select * from temptab";
                    command.CommandType = CommandType.Text;

                    using (PqsqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            Assert.AreEqual(123, reader.GetInt32(0));
                            Assert.AreEqual(1.23, reader.GetDouble(1));
                        }
                    }

                    transaction.Rollback();
                }
        }
示例#9
0
        public void TestInitialize()
        {
            mConnection = new PqsqlConnection(connectionString);

            // force UTC
            using (var cmd = new PqsqlCommand("set timezone to 'UTC';", mConnection))
            {
                cmd.ExecuteNonQuery();
            }

            mCmd = mConnection.CreateCommand();
        }
        public void PqsqlConnectionStringBuilderTest1()
        {
            PqsqlConnectionStringBuilder builder = new PqsqlConnectionStringBuilder(connectionString);

            builder[PqsqlConnectionStringBuilder.keepalives]          = "1";
            builder[PqsqlConnectionStringBuilder.keepalives_idle]     = "23";
            builder[PqsqlConnectionStringBuilder.keepalives_count]    = "3";
            builder[PqsqlConnectionStringBuilder.keepalives_interval] = "3";

            string dataSource;

            using (PqsqlConnection connection = new PqsqlConnection(builder))
            {
                // closed connection with service file should give us empty data source
                Assert.IsTrue(string.IsNullOrEmpty(connection.DataSource));

                using (PqsqlCommand cmd = new PqsqlCommand("show all", connection))
                    using (PqsqlDataReader r = cmd.ExecuteReader())
                    {
                        object value;
                        if (builder.TryGetValue(PqsqlConnectionStringBuilder.host, out value))
                        {
                            Assert.AreEqual(connection.DataSource, value);
                            dataSource = value.ToString();
                        }
                        else                 // no datasource specified
                        {
                            dataSource = connection.DataSource;
                        }
                        cmd.Cancel();
                    }
            }

            builder[PqsqlConnectionStringBuilder.host] = dataSource;

            using (PqsqlConnection connection = new PqsqlConnection(builder))
                using (PqsqlCommand cmd = new PqsqlCommand("show all", connection))
                    using (PqsqlDataReader r = cmd.ExecuteReader())
                    {
                        object value;
                        if (builder.TryGetValue(PqsqlConnectionStringBuilder.host, out value))
                        {
                            Assert.AreEqual(connection.DataSource, value);
                        }
                        else
                        {
                            Assert.Fail("host part is not available");
                        }
                        cmd.Cancel();
                    }
        }
示例#11
0
        public void PqsqlConnectionTest5()
        {
            PqsqlConnection connection = new PqsqlConnection(connectionString);

            connection.Open();
            Assert.AreEqual(ConnectionState.Open, connection.State, "wrong connection state");

            PqsqlTransaction trans = connection.BeginTransaction();

            Assert.AreEqual(IsolationLevel.ReadCommitted, trans.IsolationLevel, "wrong transaction isolation level");

            trans.Rollback();
            connection.Close();
            Assert.AreEqual(ConnectionState.Closed, connection.State, "wrong connection state");
        }
        public void PqsqlCommandBuilderTest4()
        {
            using (PqsqlConnection connection = new PqsqlConnection(connectionString))
                using (PqsqlCommand command = connection.CreateCommand())
                {
                    PqsqlTransaction transaction = connection.BeginTransaction();
                    command.Transaction = transaction;
                    command.CommandText = "create temp table temptab (c0 int4 primary key, c1 float8, c2 timestamp);";
                    command.CommandType = CommandType.Text;
                    command.ExecuteNonQuery();
                    transaction.Commit();             // temp table must be visible in the next transaction

                    transaction = connection.BeginTransaction();

                    PqsqlDataAdapter adapter = new PqsqlDataAdapter("select * from temptab", connection)
                    {
                        SelectCommand =
                        {
                            Transaction = transaction
                        },
                    };

                    adapter.RowUpdated += Adapter_RowUpdated;

                    PqsqlCommandBuilder builder = new PqsqlCommandBuilder(adapter);

                    DataTableMapping mapping = adapter.TableMappings.Add("Table", "temptab");
                    mapping.ColumnMappings.Add("c0", "id");
                    mapping.ColumnMappings.Add("c2", "time");

                    DataSet ds = new DataSet();
                    adapter.FillSchema(ds, SchemaType.Mapped);
                    adapter.Fill(ds);

                    DataTable tab = ds.Tables[0];

                    Assert.AreEqual("id", tab.Columns[0].ColumnName);
                    Assert.AreEqual("c1", tab.Columns[1].ColumnName);
                    Assert.AreEqual("time", tab.Columns[2].ColumnName);

                    transaction.Rollback();
                }
        }
示例#13
0
        public void PqsqlConnectionTest7()
        {
            PqsqlConnection connection = new PqsqlConnection(connectionString);

            bool opened = false;
            bool closed = true;

            connection.StateChange += (sender, args) =>
            {
                if (args.CurrentState == ConnectionState.Closed)
                {
                    opened = false;
                    closed = true;
                }

                if (args.CurrentState == ConnectionState.Open)
                {
                    opened = true;
                    closed = false;
                }
            };

            connection.Open();
            Assert.AreEqual(ConnectionState.Open, connection.State, "wrong connection state");

            Assert.AreEqual(true, opened);
            Assert.AreEqual(false, closed);

            try
            {
                PqsqlCommand cmd = connection.CreateCommand();
                cmd.CommandText = "select pg_terminate_backend(pg_backend_pid()); select pg_sleep(5);";
                cmd.ExecuteNonQuery();                 // must execute both statements
            }
            catch (Exception)
            {
                // ignored
                connection.Close();
            }

            Assert.AreEqual(false, opened);
            Assert.AreEqual(true, closed);
        }
        public void PqsqlConnectionStringBuilderTest3()
        {
            PqsqlConnectionStringBuilder builder = new PqsqlConnectionStringBuilder(string.Empty);

            Assert.AreEqual(string.Empty, builder.ConnectionString);
            Assert.AreEqual(0, builder.Count);

            using (PqsqlConnection connection = new PqsqlConnection(builder))
            {
                try
                {
                    connection.Open();
                }
                catch (PqsqlException)
                {
                    // ignored, depends on server config whether empty connection string is valid
                }

                connection.Close();
            }
        }
示例#15
0
        public void PqsqlConnectionTest3()
        {
            PqsqlConnectionPool.Clear();

            PqsqlConnection connection = new PqsqlConnection(connectionString);

            connection.Open();
            Assert.AreEqual(ConnectionState.Open, connection.State, "wrong connection state");

            IntPtr conn_attempt1 = connection.PGConnection;

            connection.Close();
            Assert.AreEqual(ConnectionState.Closed, connection.State, "wrong connection state");

            // in order to simulate broken connections in the connection pool, we can step through this unit test and turn
            // off postgresql before we open the connection again in the next step below:
            connection.Open();
            Assert.AreEqual(ConnectionState.Open, connection.State, "wrong connection state");

            IntPtr conn_attempt2 = connection.PGConnection;

            Assert.AreEqual(conn_attempt1, conn_attempt2, "connection was not received from internal connection pool");
        }
示例#16
0
        public void PqsqlConnectionTest1()
        {
            PqsqlConnection connection = new PqsqlConnection(string.Empty);

            Assert.AreEqual(ConnectionState.Closed, connection.State, "wrong connection state");
            Assert.AreEqual(string.Empty, connection.ConnectionString, "wrong connection string");
            Assert.AreEqual(0, connection.ConnectionTimeout, "wrong connection timeout");
            Assert.AreEqual(string.Empty, connection.Database, "wrong connection database");

            connection.ConnectionString = connectionString;

            connection.Open();
            Assert.AreEqual(ConnectionState.Open, connection.State, "wrong connection state");

            connection.ChangeDatabase("postgres");
            Assert.AreEqual("postgres", connection.Database, "wrong connection database");

            connection.Open();
            Assert.AreEqual(ConnectionState.Open, connection.State, "wrong connection state");

            connection.Open();
            Assert.AreEqual(ConnectionState.Open, connection.State, "wrong connection state");

            ExecStatusType status = connection.Exec(null);

            Assert.AreEqual(ExecStatusType.PGRES_FATAL_ERROR, status);

            IntPtr res;

            status = connection.Exec(null, out res);
            Assert.AreEqual(ExecStatusType.PGRES_FATAL_ERROR, status);
            Assert.AreEqual(IntPtr.Zero, res);
            connection.Consume(res);

            connection.Dispose();
            connection.Dispose();
        }
示例#17
0
        public void PqsqlConnectionTest10()
        {
            PqsqlConnectionPool.Clear();

            PqsqlConnection connection = new PqsqlConnection(connectionString);

            connection.Open();
            Assert.AreEqual(ConnectionState.Open, connection.State, "wrong connection state");

            IntPtr pgConn          = connection.PGConnection;
            int    client_encoding = PqsqlWrapper.PQclientEncoding(pgConn);

            Assert.AreEqual((int)PgEnc.PG_UTF8, client_encoding, "wrong client_encoding");

            // setup client_encoding to sqlascii, and leave it like that

            byte[] encoding = PqsqlUTF8Statement.CreateUTF8Statement("sqlascii");
            client_encoding = PqsqlWrapper.PQsetClientEncoding(pgConn, encoding);
            Assert.AreEqual(0, client_encoding, "could not set client_encoding");

            client_encoding = PqsqlWrapper.PQclientEncoding(pgConn);
            Assert.AreEqual(0, client_encoding, "wrong client_encoding");

            connection.Close();

            // now try to get the same connection again

            connection = new PqsqlConnection(connectionString);

            connection.Open();
            Assert.AreEqual(ConnectionState.Open, connection.State, "wrong connection state");

            pgConn          = connection.PGConnection;
            client_encoding = PqsqlWrapper.PQclientEncoding(pgConn);
            Assert.AreEqual((int)PgEnc.PG_UTF8, client_encoding, "wrong client_encoding");
        }
示例#18
0
 public void TestInitialize()
 {
     mConnection = new PqsqlConnection(connectionString);
     mCmd        = mConnection.CreateCommand();
 }
示例#19
0
 public void TestInitialize()
 {
     mConnection = new PqsqlConnection(connectionString);
 }