Blob Blame History Raw
diff -Nur soci-3.0.0/src/backends/mysql/common.h soci-3.0.0_4-pack/src/backends/mysql/common.h
--- soci-3.0.0/src/backends/mysql/common.h	2008-07-03 09:22:57.000000000 +0200
+++ soci-3.0.0_4-pack/src/backends/mysql/common.h	2010-01-23 13:17:28.000000000 +0100
@@ -10,6 +10,7 @@
 
 #include <sstream>
 #include "soci-mysql.h"
+#include <ctime>
 
 namespace soci
 {
diff -Nur soci-3.0.0/src/backends/mysql/session.cpp soci-3.0.0_4-pack/src/backends/mysql/session.cpp
--- soci-3.0.0/src/backends/mysql/session.cpp	2008-05-15 15:58:38.000000000 +0200
+++ soci-3.0.0_4-pack/src/backends/mysql/session.cpp	2010-01-23 13:17:28.000000000 +0100
@@ -11,7 +11,8 @@
 #include <cctype>
 #include <cerrno>
 #include <ciso646>
-
+#include <cstdlib>
+#include <climits>
 
 #ifdef _MSC_VER
 #pragma warning(disable:4355)
diff -Nur soci-3.0.0/src/backends/mysql/standard-into-type.cpp soci-3.0.0_4-pack/src/backends/mysql/standard-into-type.cpp
--- soci-3.0.0/src/backends/mysql/standard-into-type.cpp	2008-05-30 13:33:45.000000000 +0200
+++ soci-3.0.0_4-pack/src/backends/mysql/standard-into-type.cpp	2010-01-23 13:17:28.000000000 +0100
@@ -12,6 +12,8 @@
 #include "common.h"
 #include <ciso646>
 #include <cassert>
+#include <ctime>
+#include <cstring>
 
 #ifdef _MSC_VER
 #pragma warning(disable:4355)
diff -Nur soci-3.0.0/src/backends/mysql/standard-use-type.cpp soci-3.0.0_4-pack/src/backends/mysql/standard-use-type.cpp
--- soci-3.0.0/src/backends/mysql/standard-use-type.cpp	2008-05-15 15:58:38.000000000 +0200
+++ soci-3.0.0_4-pack/src/backends/mysql/standard-use-type.cpp	2010-01-23 13:17:28.000000000 +0100
@@ -10,8 +10,10 @@
 #include "soci-mysql.h"
 #include "common.h"
 #include <soci-platform.h>
+//
 #include <ciso646>
 #include <limits>
+#include <cstdio>
 #include <cstring>
 
 #ifdef _MSC_VER
diff -Nur soci-3.0.0/src/backends/mysql/vector-use-type.cpp soci-3.0.0_4-pack/src/backends/mysql/vector-use-type.cpp
--- soci-3.0.0/src/backends/mysql/vector-use-type.cpp	2008-05-15 15:58:38.000000000 +0200
+++ soci-3.0.0_4-pack/src/backends/mysql/vector-use-type.cpp	2010-01-23 13:17:28.000000000 +0100
@@ -10,9 +10,12 @@
 #include "soci-mysql.h"
 #include "common.h"
 #include <soci-platform.h>
+//
 #include <ciso646>
 #include <limits>
+#include <cstdio>
 #include <cstring>
+#include <ctime>
 
 #ifdef _MSC_VER
 #pragma warning(disable:4355)
diff -Nur soci-3.0.0/src/backends/postgresql/common.cpp soci-3.0.0_4-pack/src/backends/postgresql/common.cpp
--- soci-3.0.0/src/backends/postgresql/common.cpp	2008-06-27 16:38:05.000000000 +0200
+++ soci-3.0.0_4-pack/src/backends/postgresql/common.cpp	2010-01-23 13:17:28.000000000 +0100
@@ -7,7 +7,9 @@
 
 #include "common.h"
 #include <soci-backend.h>
+//
 #include <cstdlib>
+#include <cstdio>
 #include <ctime>
 
 
diff -Nur soci-3.0.0/src/backends/postgresql/test/test-postgresql.cpp soci-3.0.0_4-pack/src/backends/postgresql/test/test-postgresql.cpp
--- soci-3.0.0/src/backends/postgresql/test/test-postgresql.cpp	2008-06-05 22:41:58.000000000 +0200
+++ soci-3.0.0_4-pack/src/backends/postgresql/test/test-postgresql.cpp	2010-01-23 13:17:28.000000000 +0100
@@ -15,6 +15,7 @@
 #include <cmath>
 #include <ctime>
 #include <cstdlib>
+#include <cstring>
 
 using namespace soci;
 using namespace soci::tests;
diff -Nur soci-3.0.0/src/backends/postgresql/test/test-postgresql.cpp.orig soci-3.0.0_4-pack/src/backends/postgresql/test/test-postgresql.cpp.orig
--- soci-3.0.0/src/backends/postgresql/test/test-postgresql.cpp.orig	1970-01-01 01:00:00.000000000 +0100
+++ soci-3.0.0_4-pack/src/backends/postgresql/test/test-postgresql.cpp.orig	2010-01-23 13:17:28.000000000 +0100
@@ -0,0 +1,517 @@
+//
+// Copyright (C) 2004-2008 Maciej Sobczak, Stephen Hutton
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#include "soci.h"
+#include "soci-postgresql.h"
+#include "common-tests.h"
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <cassert>
+#include <cmath>
+#include <ctime>
+#include <cstdlib>
+
+using namespace soci;
+using namespace soci::tests;
+
+std::string connectString;
+backend_factory const &backEnd = postgresql;
+
+// Postgres-specific tests
+
+struct oid_table_creator : public table_creator_base
+{
+    oid_table_creator(session& sql)
+    : table_creator_base(sql)
+    {
+        sql << "create table soci_test ("
+                " id integer,"
+                " name varchar(100)"
+                ") with oids";
+    }
+};
+
+// ROWID test
+// Note: in PostgreSQL, there is no ROWID, there is OID.
+// It is still provided as a separate type for "portability",
+// whatever that means.
+void test1()
+{
+    {
+        session sql(backEnd, connectString);
+
+        oid_table_creator tableCreator(sql);
+
+        sql << "insert into soci_test(id, name) values(7, \'John\')";
+
+        rowid rid(sql);
+        sql << "select oid from soci_test where id = 7", into(rid);
+
+        int id;
+        std::string name;
+
+#ifndef SOCI_PGSQL_NOPARAMS
+
+        sql << "select id, name from soci_test where oid = :rid",
+            into(id), into(name), use(rid);
+
+#else
+        // Older PostgreSQL does not support use elements.
+
+        postgresql_rowid_backend *rbe
+            = static_cast<postgresql_rowid_backend *>(rid.get_backend());
+
+        unsigned long oid = rbe->value_;
+
+        sql << "select id, name from soci_test where oid = " << oid,
+            into(id), into(name);
+
+#endif // SOCI_PGSQL_NOPARAMS
+
+        assert(id == 7);
+        assert(name == "John");
+    }
+
+    std::cout << "test 1 passed" << std::endl;
+}
+
+// function call test
+class function_creator : function_creator_base
+{
+public:
+
+    function_creator(session& session)
+    : function_creator_base(session)
+    {
+        // before a language can be used it must be defined
+        // if it has already been defined then an error will occur
+        try { session << "create language plpgsql"; }
+        catch (soci_error const &) {} // ignore if error
+
+#ifndef SOCI_PGSQL_NOPARAMS
+
+        session  <<
+            "create or replace function soci_test(msg varchar) "
+            "returns varchar as $$ "
+            "begin "
+            "  return msg; "
+            "end $$ language plpgsql";
+#else
+
+       session <<
+            "create or replace function soci_test(varchar) "
+            "returns varchar as \' "
+            "begin "
+            "  return $1; "
+            "end \' language plpgsql";
+#endif
+    }
+
+protected:
+
+    std::string drop_statement()
+    {
+        return "drop function soci_test(varchar)";
+    }
+};
+
+void test2()
+{
+    {
+        session sql(backEnd, connectString);
+
+        function_creator functionCreator(sql);
+
+        std::string in("my message");
+        std::string out;
+
+#ifndef SOCI_PGSQL_NOPARAMS
+
+        statement st = (sql.prepare <<
+            "select soci_test(:input)",
+            into(out),
+            use(in, "input"));
+
+#else
+        // Older PostgreSQL does not support use elements.
+
+        statement st = (sql.prepare <<
+            "select soci_test(\'" << in << "\')",
+            into(out));
+
+#endif // SOCI_PGSQL_NOPARAMS
+
+        st.execute(true);
+        assert(out == in);
+
+        // explicit procedure syntax
+        {
+            std::string in("my message2");
+            std::string out;
+
+#ifndef SOCI_PGSQL_NOPARAMS
+
+            procedure proc = (sql.prepare <<
+                "soci_test(:input)",
+                into(out), use(in, "input"));
+
+#else
+        // Older PostgreSQL does not support use elements.
+
+            procedure proc = (sql.prepare <<
+                "soci_test(\'" << in << "\')", into(out));
+
+#endif // SOCI_PGSQL_NOPARAMS
+
+            proc.execute(true);
+            assert(out == in);
+        }
+    }
+
+    std::cout << "test 2 passed" << std::endl;
+}
+
+// BLOB test
+struct blob_table_creator : public table_creator_base
+{
+    blob_table_creator(session& session)
+    : table_creator_base(session)
+    {
+        session <<
+             "create table soci_test ("
+             "    id integer,"
+             "    img oid"
+             ")";
+    }
+};
+
+void test3()
+{
+    {
+        session sql(backEnd, connectString);
+
+        blob_table_creator tableCreator(sql);
+        
+        char buf[] = "abcdefghijklmnopqrstuvwxyz";
+
+        sql << "insert into soci_test(id, img) values(7, lo_creat(-1))";
+
+        // in PostgreSQL, BLOB operations must be within transaction block
+        transaction tr(sql);
+
+        {
+            blob b(sql);
+
+            sql << "select img from soci_test where id = 7", into(b);
+            assert(b.get_len() == 0);
+
+            b.write(0, buf, sizeof(buf));
+            assert(b.get_len() == sizeof(buf));
+
+            b.append(buf, sizeof(buf));
+            assert(b.get_len() == 2 * sizeof(buf));
+        }
+        {
+            blob b(sql);
+            sql << "select img from soci_test where id = 7", into(b);
+            assert(b.get_len() == 2 * sizeof(buf));
+            char buf2[100];
+            b.read(0, buf2, 10);
+            assert(strncmp(buf2, "abcdefghij", 10) == 0);
+        }
+
+        unsigned long oid;
+        sql << "select img from soci_test where id = 7", into(oid);
+        sql << "select lo_unlink(" << oid << ")";
+    }
+
+    std::cout << "test 3 passed" << std::endl;
+}
+
+struct longlong_table_creator : table_creator_base
+{
+    longlong_table_creator(session & sql)
+        : table_creator_base(sql)
+    {
+        sql << "create table soci_test(val int8)";
+    }
+};
+
+// long long test
+void test4()
+{
+    {
+        session sql(backEnd, connectString);
+
+        longlong_table_creator tableCreator(sql);
+
+        long long v1 = 1000000000000LL;
+        assert(v1 / 1000000 == 1000000);
+
+        sql << "insert into soci_test(val) values(:val)", use(v1);
+
+        long long v2 = 0LL;
+        sql << "select val from soci_test", into(v2);
+
+        assert(v2 == v1);
+    }
+
+    // vector<long long>
+    {
+        session sql(backEnd, connectString);
+
+        longlong_table_creator tableCreator(sql);
+
+        std::vector<long long> v1;
+        v1.push_back(1000000000000LL);
+        v1.push_back(1000000000001LL);
+        v1.push_back(1000000000002LL);
+        v1.push_back(1000000000003LL);
+        v1.push_back(1000000000004LL);
+
+        sql << "insert into soci_test(val) values(:val)", use(v1);
+
+        std::vector<long long> v2(10);
+        sql << "select val from soci_test order by val desc", into(v2);
+
+        assert(v2.size() == 5);
+        assert(v2[0] == 1000000000004LL);
+        assert(v2[1] == 1000000000003LL);
+        assert(v2[2] == 1000000000002LL);
+        assert(v2[3] == 1000000000001LL);
+        assert(v2[4] == 1000000000000LL);
+    }
+
+    std::cout << "test 4 passed" << std::endl;
+}
+
+struct boolean_table_creator : table_creator_base
+{
+    boolean_table_creator(session & sql)
+        : table_creator_base(sql)
+    {
+        sql << "create table soci_test(val boolean)";
+    }
+};
+
+void test5()
+{
+    {
+        session sql(backEnd, connectString);
+
+        boolean_table_creator tableCreator(sql);
+
+        int i1 = 0;
+
+        sql << "insert into soci_test(val) values(:val)", use(i1);
+
+        int i2 = 7;
+        sql << "select val from soci_test", into(i2);
+
+        assert(i2 == i1);
+
+        sql << "update soci_test set val = true";
+        sql << "select val from soci_test", into(i2);
+        assert(i2 == 1);
+    }
+
+    std::cout << "test 5 passed" << std::endl;
+}
+
+// dynamic backend test
+void test6()
+{
+    try
+    {
+        session sql("nosuchbackend://" + connectString);
+        assert(false);
+    }
+    catch (soci_error const & e)
+    {
+        assert(e.what() == std::string("Failed to open: libsoci_nosuchbackend.so"));
+    }
+
+    {
+        dynamic_backends::register_backend("pgsql", backEnd);
+
+        std::vector<std::string> backends = dynamic_backends::list_all();
+        assert(backends.size() == 1);
+        assert(backends[0] == "pgsql");
+
+        {
+            session sql("pgsql://" + connectString);
+        }
+
+        dynamic_backends::unload("pgsql");
+
+        backends = dynamic_backends::list_all();
+        assert(backends.empty());
+    }
+
+    {
+        session sql("postgresql://" + connectString);
+    }
+
+    std::cout << "test 6 passed" << std::endl;
+}
+
+void test7()
+{
+    {
+        session sql(backEnd, connectString);
+
+        int i;
+        sql << "select 123", into(i);
+        assert(i == 123);
+
+        try
+        {
+            sql << "select 'ABC'", into (i);
+            assert(false);
+        }
+        catch (soci_error const & e)
+        {
+            assert(e.what() == std::string("Cannot convert data."));
+        }
+    }
+
+    std::cout << "test 7 passed" << std::endl;
+}
+
+void test8()
+{
+    {
+        session sql(backEnd, connectString);
+
+        assert(sql.get_backend_name() == "postgresql");
+    }
+
+    std::cout << "test 8 passed" << std::endl;
+}
+
+// DDL Creation objects for common tests
+struct table_creator_one : public table_creator_base
+{
+    table_creator_one(session& session)
+        : table_creator_base(session)
+    {
+        session << "create table soci_test(id integer, val integer, c char, "
+                 "str varchar(20), sh int2, ul numeric(20), d float8, "
+                 "tm timestamp, i1 integer, i2 integer, i3 integer, "
+                 "name varchar(20))";
+    }
+};
+
+struct table_creator_two : public table_creator_base
+{
+    table_creator_two(session& session)
+        : table_creator_base(session)
+    {
+        session  << "create table soci_test(num_float float8, num_int integer,"
+                     " name varchar(20), sometime timestamp, chr char)";
+    }
+};
+
+struct table_creator_three : public table_creator_base
+{
+    table_creator_three(session& session)
+        : table_creator_base(session)
+    {
+        session << "create table soci_test(name varchar(100) not null, "
+            "phone varchar(15))";
+    }
+};
+
+//
+// Support for soci Common Tests
+//
+
+class test_context : public test_context_base
+{
+public:
+    test_context(backend_factory const &backEnd,
+                std::string const &connectString)
+        : test_context_base(backEnd, connectString) {}
+
+    table_creator_base* table_creator_1(session& s) const
+    {
+        return new table_creator_one(s);
+    }
+
+    table_creator_base* table_creator_2(session& s) const
+    {
+        return new table_creator_two(s);
+    }
+
+    table_creator_base* table_creator_3(session& s) const
+    {
+        return new table_creator_three(s);
+    }
+
+    std::string to_date_time(std::string const &datdt_string) const
+    {
+        return "timestamptz(\'" + datdt_string + "\')";
+    }
+
+};
+
+
+int main(int argc, char** argv)
+{
+
+#ifdef _MSC_VER
+    // Redirect errors, unrecoverable problems, and assert() failures to STDERR,
+    // instead of debug message window.
+    // This hack is required to run asser()-driven tests by Buildbot.
+    // NOTE: Comment this 2 lines for debugging with Visual C++ debugger to catch assertions inside.
+    _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
+    _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
+#endif //_MSC_VER
+
+    if (argc == 2)
+    {
+        connectString = argv[1];
+    }
+    else
+    {
+        std::cout << "usage: " << argv[0]
+            << " connectstring\n"
+            << "example: " << argv[0]
+            << " \'connect_string_for_PostgreSQL\'\n";
+        return EXIT_FAILURE;
+    }
+
+    try
+    {
+        test_context tc(backEnd, connectString);
+        common_tests tests(tc);
+        tests.run();
+
+        std::cout << "\nSOCI Postgres Tests:\n\n";
+
+        test1();
+        test2();
+        test3();
+        test4();
+        test5();
+
+//         test6();
+        std::cout << "test 6 skipped (dynamic backend)\n";
+
+        test7();
+        test8();
+
+        std::cout << "\nOK, all tests passed.\n\n";
+        return EXIT_SUCCESS;
+    }
+    catch (std::exception const & e)
+    {
+        std::cout << e.what() << '\n';
+        return EXIT_FAILURE;
+    }
+}
diff -Nur soci-3.0.0/src/core/soci-simple.cpp soci-3.0.0_4-pack/src/core/soci-simple.cpp
--- soci-3.0.0/src/core/soci-simple.cpp	2008-07-01 09:42:25.000000000 +0200
+++ soci-3.0.0_4-pack/src/core/soci-simple.cpp	2010-01-23 13:17:28.000000000 +0100
@@ -9,6 +9,8 @@
 
 #include "soci-simple.h"
 #include "soci.h"
+//
+#include <cstdio>
 
 using namespace soci;