Exemple #1
0
 internal static DateTime SafeGetDate(DbDataReader rdr, int index, DateTime defVal)
 {
     try
     {
         if (!DBNull.Value.Equals(rdr[index]))
         {
             NpgsqlTypes.NpgsqlDateTime tmp = (NpgsqlTypes.NpgsqlDateTime)rdr.GetProviderSpecificValue(index);
             if (tmp <= minSafe)
             {
                 return(MinValueUtc);
             }
             else if (tmp >= maxSafe)
             {
                 return(MaxValueUtc);
             }
             return(((DateTime)tmp).ToUniversalTime());
         }
     }
     catch { }
     return(defVal.ToUniversalTime());
 }
Exemple #2
0
        static void UnitTest(string connString)
        {
            using (var conn = new NpgsqlConnection(connString))
            {
                conn.ProvideClientCertificatesCallback += new ProvideClientCertificatesCallback(ProvideClientCertificatesCallback);
                conn.Open();

                using (var cmd = new NpgsqlCommand("DROP DATABASE IF EXISTS test CASCADE", conn))
                {
                    cmd.Prepare();
                    var rows = cmd.ExecuteNonQuery();
                    if (rows != -1)
                    {
                        throw new DataException(String.Format("DROP DATABASE reports {0} rows changed, expecting -1", rows));
                    }
                }

                using (var cmd = new NpgsqlCommand("CREATE DATABASE test", conn))
                {
                    cmd.Prepare();
                    var rows = cmd.ExecuteNonQuery();
                    if (rows != -1)
                    {
                        throw new DataException(String.Format("CREATE DATABASE reports {0} rows changed, expecting -1", rows));
                    }
                }

                using (var cmd = new NpgsqlCommand("CREATE TABLE test.f(x INT, ts TIMESTAMP)", conn))
                {
                    cmd.Prepare();
                    var rows = cmd.ExecuteNonQuery();
                    if (rows != -1)
                    {
                        throw new DataException(String.Format("CREATE TABLE reports {0} rows changed, expecting -1", rows));
                    }
                }

                using (var cmd = new NpgsqlCommand("INSERT INTO test.f VALUES (42, timestamp '2015-05-07 18:20:00')", conn))
                {
                    cmd.Prepare();
                    var rows = cmd.ExecuteNonQuery();
                    if (rows != 1)
                    {
                        throw new DataException(String.Format("INSERT reports {0} rows changed, expecting 1", rows));
                    }
                }

                using (var cmd = new NpgsqlCommand("SELECT * FROM test.f", conn))
                {
                    cmd.Prepare();
                    using (var reader = cmd.ExecuteReader())
                    {
                        reader.Read();
                        var a = reader.GetInt32(0);
                        if (a != 42)
                        {
                            throw new DataException(String.Format("SELECT can't find inserted value: read {0}, expecting 42", a));
                        }
                        var ts         = reader.GetTimeStamp(1);
                        var expectedTs = new NpgsqlTypes.NpgsqlDateTime(2015, 5, 7, 18, 20, 0, DateTimeKind.Unspecified);
                        if (ts != expectedTs)
                        {
                            throw new DataException(String.Format("SELECT unexpected value for ts: read {0}, expecting {1}", ts, expectedTs));
                        }
                    }
                }

                using (var cmd = new NpgsqlCommand("INSERT INTO test.f VALUES (@x, @ts)", conn))
                {
                    cmd.Parameters.Add("x", NpgsqlTypes.NpgsqlDbType.Integer).Value    = 1;
                    cmd.Parameters.Add("ts", NpgsqlTypes.NpgsqlDbType.Timestamp).Value = new NpgsqlTypes.NpgsqlDateTime(DateTime.Now);
                    cmd.Prepare();
                    var rows = cmd.ExecuteNonQuery();
                    if (rows != 1)
                    {
                        throw new DataException(String.Format("INSERT reports {0} rows changed, expecting 1", rows));
                    }
                }

                using (var cmd = new NpgsqlCommand("DROP TABLE test.f", conn))
                {
                    cmd.Prepare();
                    var rows = cmd.ExecuteNonQuery();
                    if (rows != -1)
                    {
                        throw new DataException(String.Format("DROP TABLE reports {0} rows changed, expecting -1", rows));
                    }
                }

                using (var cmd = new NpgsqlCommand("SELECT 1, 2 > @comp, @int::int, @bool::string, @long::string, @real::string, @double::string, @short::string", conn))
                {
                    cmd.Parameters.Add("comp", NpgsqlTypes.NpgsqlDbType.Integer).Value   = 3;
                    cmd.Parameters.Add("int", NpgsqlTypes.NpgsqlDbType.Integer).Value    = 3;
                    cmd.Parameters.Add("bool", NpgsqlTypes.NpgsqlDbType.Boolean).Value   = true;
                    cmd.Parameters.Add("long", NpgsqlTypes.NpgsqlDbType.Bigint).Value    = -4L;
                    cmd.Parameters.Add("real", NpgsqlTypes.NpgsqlDbType.Real).Value      = 5.31f;
                    cmd.Parameters.Add("double", NpgsqlTypes.NpgsqlDbType.Double).Value  = -6.21d;
                    cmd.Parameters.Add("short", NpgsqlTypes.NpgsqlDbType.Smallint).Value = (short)7;
                    cmd.Prepare();
                    using (var reader = cmd.ExecuteReader())
                    {
                        reader.Read();
                        var a = reader.GetInt32(0);
                        if (a != 1)
                        {
                            throw new DataException(String.Format("SELECT returns {0}, expected 1", a));
                        }
                        var b = reader.GetBoolean(1);
                        if (b)
                        {
                            throw new DataException(String.Format("SELECT returns {0}, expected false", b));
                        }
                        var c = reader.GetInt32(2);
                        if (c != 3)
                        {
                            throw new DataException(String.Format("SELECT returns {0}, expected 3", c));
                        }
                        var d = reader.GetString(3);
                        if (!d.Equals("true"))
                        {
                            throw new DataException(String.Format("SELECT returns {0}, expected true", d));
                        }
                        var e = reader.GetString(4);
                        if (!e.Equals("-4"))
                        {
                            throw new DataException(String.Format("SELECT returns {0}, expected -4", e));
                        }
                        var f = reader.GetString(5);
                        if (!f.StartsWith("5.3", StringComparison.Ordinal))
                        {
                            throw new DataException(String.Format("SELECT returns {0}, expected that it starts with 5.3", f));
                        }
                        var g = reader.GetString(6);
                        if (!g.StartsWith("-6.2", StringComparison.Ordinal))
                        {
                            throw new DataException(String.Format("SELECT returns {0}, expected that it starts with -6.2", g));
                        }
                        var h = reader.GetString(7);
                        if (!h.Equals("7"))
                        {
                            throw new DataException(String.Format("SELECT returns {0}, expected 7", h));
                        }
                    }
                }


                using (var cmd = new NpgsqlCommand("CREATE TABLE accounts (id INT PRIMARY KEY, balance INT, cdate DATE)", conn))
                {
                    cmd.Prepare();
                    var rows = cmd.ExecuteNonQuery();
                    if (rows != -1)
                    {
                        throw new DataException(String.Format("CREATE TABLE reports {0} rows changed, expecting -1", rows));
                    }
                }

                using (var cmd = new NpgsqlCommand("INSERT INTO accounts (id, balance, cdate) VALUES ( @id, @balance, @cdate )", conn))
                {
                    cmd.Parameters.Add("id", NpgsqlTypes.NpgsqlDbType.Integer).Value      = 1;
                    cmd.Parameters.Add("balance", NpgsqlTypes.NpgsqlDbType.Integer).Value = 1000;
                    cmd.Parameters.Add("cdate", NpgsqlTypes.NpgsqlDbType.Date).Value      = new NpgsqlTypes.NpgsqlDate(DateTime.Now);
                    cmd.Prepare();
                    var rows = cmd.ExecuteNonQuery();
                    if (rows != 1)
                    {
                        throw new DataException(String.Format("INSERT reports {0} rows changed, expecting 1", rows));
                    }
                }

                using (var cmd = new NpgsqlCommand("CREATE TABLE empty()", conn))
                {
                    cmd.Prepare();
                    var rows = cmd.ExecuteNonQuery();
                    if (rows != -1)
                    {
                        throw new DataException(String.Format("CREATE TABLE reports {0} rows changed, expecting -1", rows));
                    }
                }

                using (var cmd = new NpgsqlCommand("SELECT * from empty", conn))
                {
                    cmd.Prepare();
                    using (var reader = cmd.ExecuteReader())
                    {
                        if (reader.FieldCount != 0)
                        {
                            throw new DataException(String.Format("SELECT returns {0} columns, expected 0", reader.FieldCount));
                        }
                    }
                }

                using (var cmd = new NpgsqlCommand("CREATE TABLE str (s STRING)", conn))
                {
                    cmd.Prepare();
                    var rows = cmd.ExecuteNonQuery();
                    if (rows != -1)
                    {
                        throw new DataException(String.Format("CREATE TABLE reports {0} rows changed, expecting -1", rows));
                    }
                }

                using (var cmd = new NpgsqlCommand("UPDATE str SET s = @s", conn))
                {
                    cmd.Parameters.Add("s", NpgsqlTypes.NpgsqlDbType.Varchar).Value = "hello";
                    cmd.Prepare();
                    var rows = cmd.ExecuteNonQuery();
                    if (rows != 0)
                    {
                        throw new DataException(String.Format("UPDATE reports {0} rows changed, expecting 0", rows));
                    }
                }

                using (var cmd = new NpgsqlCommand("SELECT @x", conn))
                {
                    var uuid = new Guid();
                    cmd.Parameters.Add("x", NpgsqlTypes.NpgsqlDbType.Uuid).Value = uuid;
                    cmd.Prepare();
                    using (var reader = cmd.ExecuteReader())
                    {
                        reader.Read();
                        var actualUUID = reader.GetGuid(0);
                        if (actualUUID != uuid)
                        {
                            throw new DataException(String.Format("SELECT returns {0}, expected {1}", actualUUID, uuid));
                        }
                    }
                }

                // Check that imprecise placeholder typing works correctly. See issues
                // #14245 and #14311 for more detail.
                using (var cmd = new NpgsqlCommand("CREATE TABLE t (price decimal(5,2) NOT NULL)", conn))
                {
                    cmd.Prepare();
                    var rows = cmd.ExecuteNonQuery();
                    if (rows != -1)
                    {
                        throw new DataException(String.Format("CREATE TABLE reports {0} rows changed, expecting -1", rows));
                    }
                }

                using (var cmd = new NpgsqlCommand("INSERT INTO test.t VALUES(@f)", conn))
                {
                    cmd.Parameters.Add("f", NpgsqlTypes.NpgsqlDbType.Real).Value = 3.3f;
                    cmd.Prepare();
                    var rows = cmd.ExecuteNonQuery();
                    if (rows != 1)
                    {
                        throw new DataException(String.Format("INSERT reports {0} rows changed, expecting 1", rows));
                    }
                }

                using (var cmd = new NpgsqlCommand("SELECT nspname FROM pg_catalog.pg_namespace WHERE oid=@oid", conn))
                {
                    cmd.Parameters.Add("oid", NpgsqlTypes.NpgsqlDbType.Bigint).Value = 1782195457;
                    cmd.Prepare();
                    using (var reader = cmd.ExecuteReader())
                    {
                        reader.Read();
                        var nspName = reader.GetString(0);
                        if (nspName != "pg_catalog")
                        {
                            throw new DataException(String.Format("SELECT returns {0}, expected pg_catalog", nspName));
                        }
                    }
                }
            }
        }