aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorConstantin Michael <constantin@codesynthesis.com>2011-11-17 11:44:45 +0200
committerConstantin Michael <constantin@codesynthesis.com>2011-11-17 11:44:45 +0200
commit9616e3e84946c23f64448978d9459d2a25202833 (patch)
tree209fe102c7d73b57ff3d2a4cdf68ad2df705704f
parent508512b8db199c5bcc1affc237d6eac4e0a4818d (diff)
Add examples for Oracle
-rw-r--r--boost/database.hxx7
-rw-r--r--build/bootstrap.make2
-rw-r--r--build/configuration.make4
-rwxr-xr-xbuild/configure3
-rw-r--r--build/import/libodb-oracle/LICENSE12
-rw-r--r--build/import/libodb-oracle/configuration-rules.make15
-rwxr-xr-xbuild/import/libodb-oracle/configure55
-rw-r--r--build/import/libodb-oracle/stub.make30
-rwxr-xr-xbuild/oracle/configure99
-rwxr-xr-xbuild/oracle/oracle75
-rw-r--r--composite/database.hxx7
-rw-r--r--composite/makefile2
-rw-r--r--container/database.hxx7
-rw-r--r--hello/database.hxx7
-rw-r--r--inheritance/database.hxx7
-rw-r--r--inheritance/makefile2
-rw-r--r--inverse/database.hxx7
-rw-r--r--mapping/database.hxx7
-rw-r--r--mapping/traits-oracle.hxx95
-rw-r--r--mapping/traits.hxx2
-rw-r--r--optimistic/database.hxx7
-rw-r--r--qt/database.hxx7
-rw-r--r--query/database.hxx7
-rw-r--r--relationship/database.hxx7
-rw-r--r--relationship/makefile2
-rw-r--r--schema/custom/database.hxx7
-rw-r--r--schema/custom/driver.cxx59
-rw-r--r--schema/custom/employee.hxx4
-rw-r--r--schema/embedded/database.hxx7
-rw-r--r--template/database.hxx7
-rw-r--r--view/database.hxx7
-rw-r--r--view/driver.cxx55
-rw-r--r--view/employee.hxx34
33 files changed, 639 insertions, 16 deletions
diff --git a/boost/database.hxx b/boost/database.hxx
index d47fac3..46610ec 100644
--- a/boost/database.hxx
+++ b/boost/database.hxx
@@ -25,6 +25,8 @@
# include <odb/sqlite/database.hxx>
#elif defined(DATABASE_PGSQL)
# include <odb/pgsql/database.hxx>
+#elif defined(DATABASE_ORACLE)
+# include <odb/oracle/database.hxx>
#endif
inline std::auto_ptr<odb::database>
@@ -44,6 +46,8 @@ create_database (int& argc, char* argv[])
odb::sqlite::database::print_usage (cerr);
#elif defined(DATABASE_PGSQL)
odb::pgsql::database::print_usage (cerr);
+#elif defined(DATABASE_ORACLE)
+ odb::oracle::database::print_usage (cerr);
#endif
exit (0);
@@ -73,6 +77,9 @@ create_database (int& argc, char* argv[])
}
#elif defined(DATABASE_PGSQL)
auto_ptr<database> db (new odb::pgsql::database (argc, argv));
+#elif defined(DATABASE_ORACLE)
+ auto_ptr<database> db (
+ new odb::oracle::database (argc, argv, false, 873, 873));
#endif
return db;
diff --git a/build/bootstrap.make b/build/bootstrap.make
index 17ee203..dae84fc 100644
--- a/build/bootstrap.make
+++ b/build/bootstrap.make
@@ -64,7 +64,7 @@ ifeq ($(dist_prefix),)
$(error dist_prefix is not set)
endif
-databases := mysql sqlite pgsql
+databases := mysql sqlite pgsql oracle
$(dist): databases := $(databases)
# $1 project template without the -vcN.vc[x]proj suffix.
diff --git a/build/configuration.make b/build/configuration.make
index 5dc9e16..e2d0077 100644
--- a/build/configuration.make
+++ b/build/configuration.make
@@ -25,6 +25,10 @@ ifeq ($(db_id),pgsql)
db_macro := DATABASE_PGSQL
endif
+ifeq ($(db_id),oracle)
+db_macro := DATABASE_ORACLE
+endif
+
$(out_root)/%: db_id := $(db_id)
$(out_root)/%: db_macro := $(db_macro)
diff --git a/build/configure b/build/configure
index 70413fc..9aee64a 100755
--- a/build/configure
+++ b/build/configure
@@ -25,9 +25,10 @@ $echo
$echo "(1) MySQL"
$echo "(2) SQLite"
$echo "(3) PostgreSQL"
+$echo "(4) Oracle"
$echo
-db_id=`read_option "mysql sqlite pgsql"`
+db_id=`read_option "mysql sqlite pgsql oracle"`
echo "db_id := $db_id" >$1
diff --git a/build/import/libodb-oracle/LICENSE b/build/import/libodb-oracle/LICENSE
new file mode 100644
index 0000000..ed9c55c
--- /dev/null
+++ b/build/import/libodb-oracle/LICENSE
@@ -0,0 +1,12 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License version 2 as
+published by the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
diff --git a/build/import/libodb-oracle/configuration-rules.make b/build/import/libodb-oracle/configuration-rules.make
new file mode 100644
index 0000000..a4a8c99
--- /dev/null
+++ b/build/import/libodb-oracle/configuration-rules.make
@@ -0,0 +1,15 @@
+# file : build/import/libodb-oracle/configuration-rules.make
+# author : Constantin Michael <constantin@codesynthesis.com>
+# copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC
+# license : ODB NCUEL; see accompanying LICENSE file
+
+$(dcf_root)/import/libodb-oracle/configuration-dynamic.make: | $(dcf_root)/import/libodb-oracle/.
+ $(call message,,$(scf_root)/import/libodb-oracle/configure $@)
+
+ifndef %foreign%
+
+$(dcf_root)/.disfigure::
+ $(call message,rm $(dcf_root)/import/libodb-oracle/configuration-dynamic.make,\
+rm -f $(dcf_root)/import/libodb-oracle/configuration-dynamic.make)
+
+endif
diff --git a/build/import/libodb-oracle/configure b/build/import/libodb-oracle/configure
new file mode 100755
index 0000000..9934d03
--- /dev/null
+++ b/build/import/libodb-oracle/configure
@@ -0,0 +1,55 @@
+#! /usr/bin/env bash
+
+# file : build/import/libodb-oracle/configure
+# author : Constantin Michael <constantin@codesynthesis.com>
+# copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC
+# license : ODB NCUEL; see accompanying LICENSE file
+
+
+# $1 - out file
+#
+# bld_root - build root
+# project_name - project name
+#
+
+source $bld_root/dialog.bash
+
+
+$echo
+$echo "Configuring external dependency on 'libodb-oracle' for '$project_name'."
+$echo
+
+$echo
+$echo "Would you like to configure dependency on the installed version"
+$echo "of 'libodb-oracle' as opposed to the development build?"
+$echo
+
+installed=`read_y_n y`
+
+path=
+
+if [ "$installed" = "n" ]; then
+
+$echo
+$echo "Please enter the src_root for 'libodb-oracle'."
+$echo
+
+src_root=`read_path --directory --exist`
+
+$echo
+$echo "Please enter the out_root for 'libodb-oracle'."
+$echo
+
+out_root=`read_path --directory $src_root`
+
+fi
+
+echo libodb_oracle_installed := $installed >$1
+
+if [ "$installed" = "n" ]; then
+
+echo src_root := $src_root >>$1
+echo scf_root := \$\(src_root\)/build >>$1
+echo out_root := $out_root >>$1
+
+fi
diff --git a/build/import/libodb-oracle/stub.make b/build/import/libodb-oracle/stub.make
new file mode 100644
index 0000000..2432246
--- /dev/null
+++ b/build/import/libodb-oracle/stub.make
@@ -0,0 +1,30 @@
+# file : build/import/libodb-oracle/stub.make
+# author : Constantin Michael <constantin@codesynthesis.com>
+# copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC
+# license : ODB NCUEL; see accompanying LICENSE file
+
+$(call include-once,$(scf_root)/import/libodb-oracle/configuration-rules.make,$(dcf_root))
+
+libodb_oracle_installed :=
+
+$(call -include,$(dcf_root)/import/libodb-oracle/configuration-dynamic.make)
+
+ifdef libodb_oracle_installed
+
+ifeq ($(libodb_oracle_installed),y)
+
+$(call export,l: -lodb-oracle -lodb -lclntsh,cpp-options: )
+
+else
+
+# Include export stub.
+#
+$(call include,$(scf_root)/export/libodb-oracle/stub.make)
+
+endif
+
+else
+
+.NOTPARALLEL:
+
+endif
diff --git a/build/oracle/configure b/build/oracle/configure
new file mode 100755
index 0000000..9746133
--- /dev/null
+++ b/build/oracle/configure
@@ -0,0 +1,99 @@
+#! /usr/bin/env bash
+
+# file : build/oracle/configure
+# author : Constantin Michael <constantin@codesynthesis.com>
+# copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC
+# license : ODB NCUEL; see accompanying LICENSE file
+
+#
+# dcf_root - dynamic configuration root
+#
+
+$echo
+$echo "Please enter the Oracle client program path."
+$echo
+
+driver=`read_path --command sqlplus`
+
+$echo
+$echo "Please enter the Oracle database user."
+$echo
+
+user=`read_value "odb_test"`
+
+$echo
+$echo "Please enter the Oracle database password."
+$echo
+
+# If the user is odb_test then default to odb_test as a password since
+# it is unlikely there is the odb_test user with external authentication.
+#
+if [ "$user" = "odb_test" ]; then
+ def_passwd=odb_test
+else
+ def_passwd=
+fi
+
+passwd=`read_value "$def_passwd"`
+
+$echo
+$echo "Please enter the Oracle listener host (localhost if left empty)."
+$echo
+
+host=`read_value ""`
+
+$echo
+$echo "Please enter the Oracle listener port (default port if left empty)."
+$echo
+
+port=`read_value ""`
+
+$echo
+$echo "Please enter the Oracle service to use (default service if left"
+$echo "empty). Note that the database associated with user $user on this"
+$echo "service WILL BE MODIFIED."
+$echo
+
+service=`read_value ""`
+
+opt=$dcf_root/db.options
+drv=$dcf_root/db-driver
+
+if [ -n "$user" ]; then
+echo "--user '$user'" >$opt
+fi
+
+if [ -n "$passwd" ]; then
+echo "--password '$passwd'" >>$opt
+fi
+
+if [ -n "$service" ]; then
+echo "--service '$service'" >>$opt
+fi
+
+if [ -n "$host" ]; then
+echo "--host '$host'" >>$opt
+fi
+
+if [ -n "$port" ]; then
+echo "--port '$port'" >>$opt
+fi
+
+echo "#!/bin/sh" >$drv
+
+dir=`dirname $driver`
+if [ "$dir" != "." ]; then
+ echo >>$drv
+ echo 'LD_LIBRARY_PATH="'$dir':$LD_LIBRARY_PATH"' >>$drv
+ echo "export LD_LIBRARY_PATH" >>$drv
+ echo >>$drv
+ echo 'if [ -z "$SQLPATH" ]; then' >>$drv
+ echo ' SQLPATH="'$dir'"' >>$drv
+ echo " export SQLPATH" >>$drv
+ echo "fi" >>$drv
+ echo >>$drv
+fi
+
+echo "opt=\`cat $opt\`" >>$drv
+echo "eval $scf_root/oracle/oracle --driver $driver \$opt \$*" >>$drv
+chmod 755 $drv
diff --git a/build/oracle/oracle b/build/oracle/oracle
new file mode 100755
index 0000000..9228025
--- /dev/null
+++ b/build/oracle/oracle
@@ -0,0 +1,75 @@
+#! /usr/bin/env bash
+
+# file : build/oracle/oracle
+# author : Constantin Michael <constantin@codesynthesis.com>
+# copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC
+# license : ODB NCUEL; see accompanying LICENSE file
+
+#
+# Oracle driver wrapper.
+#
+
+while [ $# -gt 0 ]; do
+ case $1 in
+ --driver)
+ driver=$2
+ shift 2
+ ;;
+ --user)
+ user="$2"
+ shift 2
+ ;;
+ --password)
+ passwd="$2"
+ shift 2
+ ;;
+ --service)
+ service="$2"
+ shift 2
+ ;;
+ --host)
+ host="$2"
+ shift 2
+ ;;
+ --port)
+ port="$2"
+ shift 2
+ ;;
+ *)
+ break
+ ;;
+ esac
+done
+
+if [ -z "$driver" ]; then
+ driver=sqlplus
+fi
+
+conn=$user
+
+if [ -n "$passwd" ]; then
+ conn="$conn/$passwd"
+fi
+
+if [ -n "$host" ]; then
+ conn="$conn@//$host"
+
+ if [ -n "$port" ]; then
+ conn="$conn:$port"
+ fi
+
+ if [ -n "$service" ]; then
+ conn="$conn/$service"
+ fi
+elif [ -n "$service" ]; then
+ conn="$conn@$service"
+fi
+
+opt="-L $opt"
+
+if [ -n "$1" ]; then
+ opt="-S $opt"
+ exec $driver $opt $conn @$1
+else
+ exec $driver $opt $conn
+fi
diff --git a/composite/database.hxx b/composite/database.hxx
index 2a13381..dafdd56 100644
--- a/composite/database.hxx
+++ b/composite/database.hxx
@@ -25,6 +25,8 @@
# include <odb/sqlite/database.hxx>
#elif defined(DATABASE_PGSQL)
# include <odb/pgsql/database.hxx>
+#elif defined(DATABASE_ORACLE)
+# include <odb/oracle/database.hxx>
#endif
inline std::auto_ptr<odb::database>
@@ -44,6 +46,8 @@ create_database (int& argc, char* argv[])
odb::sqlite::database::print_usage (cerr);
#elif defined(DATABASE_PGSQL)
odb::pgsql::database::print_usage (cerr);
+#elif defined(DATABASE_ORACLE)
+ odb::oracle::database::print_usage (cerr);
#endif
exit (0);
@@ -73,6 +77,9 @@ create_database (int& argc, char* argv[])
}
#elif defined(DATABASE_PGSQL)
auto_ptr<database> db (new odb::pgsql::database (argc, argv));
+#elif defined(DATABASE_ORACLE)
+ auto_ptr<database> db (
+ new odb::oracle::database (argc, argv, false, 873, 873));
#endif
return db;
diff --git a/composite/makefile b/composite/makefile
index 8a9c5fc..af78ec7 100644
--- a/composite/makefile
+++ b/composite/makefile
@@ -47,7 +47,7 @@ gen := $(addprefix $(out_base)/,$(genf))
$(gen): $(odb)
$(gen): odb := $(odb)
$(gen) $(dist): export odb_options += --database $(db_id) --generate-schema \
---generate-query --table-prefix composite_
+--generate-query --table-prefix c_
$(gen): cpp_options := -I$(src_base)
$(gen): $(odb.l.cpp-options)
diff --git a/container/database.hxx b/container/database.hxx
index 9a30039..ae0ed92 100644
--- a/container/database.hxx
+++ b/container/database.hxx
@@ -25,6 +25,8 @@
# include <odb/sqlite/database.hxx>
#elif defined(DATABASE_PGSQL)
# include <odb/pgsql/database.hxx>
+#elif defined(DATABASE_ORACLE)
+# include <odb/oracle/database.hxx>
#endif
inline std::auto_ptr<odb::database>
@@ -44,6 +46,8 @@ create_database (int& argc, char* argv[])
odb::sqlite::database::print_usage (cerr);
#elif defined(DATABASE_PGSQL)
odb::pgsql::database::print_usage (cerr);
+#elif defined(DATABASE_ORACLE)
+ odb::oracle::database::print_usage (cerr);
#endif
exit (0);
@@ -73,6 +77,9 @@ create_database (int& argc, char* argv[])
}
#elif defined(DATABASE_PGSQL)
auto_ptr<database> db (new odb::pgsql::database (argc, argv));
+#elif defined(DATABASE_ORACLE)
+ auto_ptr<database> db (
+ new odb::oracle::database (argc, argv, false, 873, 873));
#endif
return db;
diff --git a/hello/database.hxx b/hello/database.hxx
index b56851d..6466e6b 100644
--- a/hello/database.hxx
+++ b/hello/database.hxx
@@ -25,6 +25,8 @@
# include <odb/sqlite/database.hxx>
#elif defined(DATABASE_PGSQL)
# include <odb/pgsql/database.hxx>
+#elif defined(DATABASE_ORACLE)
+# include <odb/oracle/database.hxx>
#endif
inline std::auto_ptr<odb::database>
@@ -44,6 +46,8 @@ create_database (int& argc, char* argv[])
odb::sqlite::database::print_usage (cerr);
#elif defined(DATABASE_PGSQL)
odb::pgsql::database::print_usage (cerr);
+#elif defined(DATABASE_ORACLE)
+ odb::oracle::database::print_usage (cerr);
#endif
exit (0);
@@ -73,6 +77,9 @@ create_database (int& argc, char* argv[])
}
#elif defined(DATABASE_PGSQL)
auto_ptr<database> db (new odb::pgsql::database (argc, argv));
+#elif defined(DATABASE_ORACLE)
+ auto_ptr<database> db (
+ new odb::oracle::database (argc, argv, false, 873, 873));
#endif
return db;
diff --git a/inheritance/database.hxx b/inheritance/database.hxx
index af683a7..85605b8 100644
--- a/inheritance/database.hxx
+++ b/inheritance/database.hxx
@@ -25,6 +25,8 @@
# include <odb/sqlite/database.hxx>
#elif defined(DATABASE_PGSQL)
# include <odb/pgsql/database.hxx>
+#elif defined(DATABASE_ORACLE)
+# include <odb/oracle/database.hxx>
#endif
inline std::auto_ptr<odb::database>
@@ -44,6 +46,8 @@ create_database (int& argc, char* argv[])
odb::sqlite::database::print_usage (cerr);
#elif defined(DATABASE_PGSQL)
odb::pgsql::database::print_usage (cerr);
+#elif defined(DATABASE_ORACLE)
+ odb::oracle::database::print_usage (cerr);
#endif
exit (0);
@@ -73,6 +77,9 @@ create_database (int& argc, char* argv[])
}
#elif defined(DATABASE_PGSQL)
auto_ptr<database> db (new odb::pgsql::database (argc, argv));
+#elif defined(DATABASE_ORACLE)
+ auto_ptr<database> db (
+ new odb::oracle::database (argc, argv, false, 873, 873));
#endif
return db;
diff --git a/inheritance/makefile b/inheritance/makefile
index 27e0bc2..02e057a 100644
--- a/inheritance/makefile
+++ b/inheritance/makefile
@@ -47,7 +47,7 @@ gen := $(addprefix $(out_base)/,$(genf))
$(gen): $(odb)
$(gen): odb := $(odb)
$(gen) $(dist): export odb_options += --database $(db_id) --generate-schema \
---generate-query --table-prefix inheritance_
+--generate-query --table-prefix i_
$(gen): cpp_options := -I$(src_base)
$(gen): $(odb.l.cpp-options)
diff --git a/inverse/database.hxx b/inverse/database.hxx
index 8b97823..12cccc4 100644
--- a/inverse/database.hxx
+++ b/inverse/database.hxx
@@ -25,6 +25,8 @@
# include <odb/sqlite/database.hxx>
#elif defined(DATABASE_PGSQL)
# include <odb/pgsql/database.hxx>
+#elif defined(DATABASE_ORACLE)
+# include <odb/oracle/database.hxx>
#endif
inline std::auto_ptr<odb::database>
@@ -44,6 +46,8 @@ create_database (int& argc, char* argv[])
odb::sqlite::database::print_usage (cerr);
#elif defined(DATABASE_PGSQL)
odb::pgsql::database::print_usage (cerr);
+#elif defined(DATABASE_ORACLE)
+ odb::oracle::database::print_usage (cerr);
#endif
exit (0);
@@ -73,6 +77,9 @@ create_database (int& argc, char* argv[])
}
#elif defined(DATABASE_PGSQL)
auto_ptr<database> db (new odb::pgsql::database (argc, argv));
+#elif defined(DATABASE_ORACLE)
+ auto_ptr<database> db (
+ new odb::oracle::database (argc, argv, false, 873, 873));
#endif
return db;
diff --git a/mapping/database.hxx b/mapping/database.hxx
index 4f3bb9a..4badc4e 100644
--- a/mapping/database.hxx
+++ b/mapping/database.hxx
@@ -25,6 +25,8 @@
# include <odb/sqlite/database.hxx>
#elif defined(DATABASE_PGSQL)
# include <odb/pgsql/database.hxx>
+#elif defined(DATABASE_ORACLE)
+# include <odb/oracle/database.hxx>
#endif
inline std::auto_ptr<odb::database>
@@ -44,6 +46,8 @@ create_database (int& argc, char* argv[])
odb::sqlite::database::print_usage (cerr);
#elif defined(DATABASE_PGSQL)
odb::pgsql::database::print_usage (cerr);
+#elif defined(DATABASE_ORACLE)
+ odb::oracle::database::print_usage (cerr);
#endif
exit (0);
@@ -73,6 +77,9 @@ create_database (int& argc, char* argv[])
}
#elif defined(DATABASE_PGSQL)
auto_ptr<database> db (new odb::pgsql::database (argc, argv));
+#elif defined(DATABASE_ORACLE)
+ auto_ptr<database> db (
+ new odb::oracle::database (argc, argv, false, 873, 873));
#endif
return db;
diff --git a/mapping/traits-oracle.hxx b/mapping/traits-oracle.hxx
new file mode 100644
index 0000000..f1dcfe9
--- /dev/null
+++ b/mapping/traits-oracle.hxx
@@ -0,0 +1,95 @@
+// file : mapping/traits-oracle.hxx
+// author : Constantin Michael <constantin@codesynthesis.com>
+// copyright : not copyrighted - public domain
+
+#ifndef TRAITS_ORACLE_HXX
+#define TRAITS_ORACLE_HXX
+
+//
+// Oracle implementation.
+//
+
+#include <cstddef> // std::size_t
+#include <cstring> // std::strncmp, std::memcpy
+
+#include <odb/oracle/traits.hxx>
+#include <odb/oracle/details/date.hxx>
+
+#include "person.hxx" // date
+
+namespace odb
+{
+ namespace oracle
+ {
+ template <>
+ class value_traits<bool, id_string>
+ {
+ public:
+ typedef bool value_type;
+ typedef bool query_type;
+ typedef char* image_type;
+
+ static void
+ set_value (bool& v,
+ const char* b,
+ std::size_t n,
+ bool is_null)
+ {
+ v = (!is_null && n == 4 && std::strncmp ("true", b, n) == 0);
+ }
+
+ static void
+ set_image (char* b,
+ std::size_t c,
+ std::size_t& n,
+ bool& is_null,
+ bool v)
+ {
+ is_null = false;
+ n = v ? 4 : 5;
+
+ assert (n <= c);
+
+ std::memcpy (b, (v ? "true" : "false"), n);
+ }
+ };
+
+ template <>
+ class value_traits<date, id_date>
+ {
+ public:
+ typedef date value_type;
+ typedef date query_type;
+ typedef char* image_type;
+
+ static void
+ set_value (date& v, const char* b, bool is_null)
+ {
+ if (!is_null)
+ {
+ short y;
+ unsigned char m, d, h, min, s;
+ details::get_date (b, y, m, d, h, min, s);
+
+ v = date (y, m, d);
+ }
+ else
+ v = date (0, 0, 0);
+ }
+
+ static void
+ set_image (char* b, bool& is_null, const date& v)
+ {
+ is_null = false;
+
+ short y (static_cast<short> (v.year ()));
+ unsigned char m (static_cast<unsigned char> (v.month ()));
+ unsigned char d (static_cast<unsigned char> (v.day ()));
+
+ details::set_date (b, y, m, d, 0, 0, 0);
+ }
+ };
+ }
+}
+
+#endif // TRAITS_ORACLE_HXX
diff --git a/mapping/traits.hxx b/mapping/traits.hxx
index 1d2412b..1ef2858 100644
--- a/mapping/traits.hxx
+++ b/mapping/traits.hxx
@@ -13,6 +13,8 @@
# include "traits-sqlite.hxx"
#elif defined(DATABASE_PGSQL)
# include "traits-pgsql.hxx"
+#elif defined(DATABASE_ORACLE)
+# include "traits-oracle.hxx"
#endif
#endif // TRAITS_HXX
diff --git a/optimistic/database.hxx b/optimistic/database.hxx
index dc9b389..4441188 100644
--- a/optimistic/database.hxx
+++ b/optimistic/database.hxx
@@ -25,6 +25,8 @@
# include <odb/sqlite/database.hxx>
#elif defined(DATABASE_PGSQL)
# include <odb/pgsql/database.hxx>
+#elif defined(DATABASE_ORACLE)
+# include <odb/oracle/database.hxx>
#endif
inline std::auto_ptr<odb::database>
@@ -44,6 +46,8 @@ create_database (int& argc, char* argv[])
odb::sqlite::database::print_usage (cerr);
#elif defined(DATABASE_PGSQL)
odb::pgsql::database::print_usage (cerr);
+#elif defined(DATABASE_ORACLE)
+ odb::oracle::database::print_usage (cerr);
#endif
exit (0);
@@ -73,6 +77,9 @@ create_database (int& argc, char* argv[])
}
#elif defined(DATABASE_PGSQL)
auto_ptr<database> db (new odb::pgsql::database (argc, argv));
+#elif defined(DATABASE_ORACLE)
+ auto_ptr<database> db (
+ new odb::oracle::database (argc, argv, false, 873, 873));
#endif
return db;
diff --git a/qt/database.hxx b/qt/database.hxx
index 6afccbe..55ee4f5 100644
--- a/qt/database.hxx
+++ b/qt/database.hxx
@@ -25,6 +25,8 @@
# include <odb/sqlite/database.hxx>
#elif defined(DATABASE_PGSQL)
# include <odb/pgsql/database.hxx>
+#elif defined(DATABASE_ORACLE)
+# include <odb/oracle/database.hxx>
#endif
inline std::auto_ptr<odb::database>
@@ -44,6 +46,8 @@ createDatabase (int& argc, char* argv[])
odb::sqlite::database::print_usage (cerr);
#elif defined(DATABASE_PGSQL)
odb::pgsql::database::print_usage (cerr);
+#elif defined(DATABASE_ORACLE)
+ odb::oracle::database::print_usage (cerr);
#endif
exit (0);
@@ -73,6 +77,9 @@ createDatabase (int& argc, char* argv[])
}
#elif defined(DATABASE_PGSQL)
auto_ptr<database> db (new odb::pgsql::database (argc, argv));
+#elif defined(DATABASE_ORACLE)
+ auto_ptr<database> db (
+ new odb::oracle::database (argc, argv, false, 873, 873));
#endif
return db;
diff --git a/query/database.hxx b/query/database.hxx
index f96b9a3..68ed36b 100644
--- a/query/database.hxx
+++ b/query/database.hxx
@@ -25,6 +25,8 @@
# include <odb/sqlite/database.hxx>
#elif defined(DATABASE_PGSQL)
# include <odb/pgsql/database.hxx>
+#elif defined(DATABASE_ORACLE)
+# include <odb/oracle/database.hxx>
#endif
inline std::auto_ptr<odb::database>
@@ -44,6 +46,8 @@ create_database (int& argc, char* argv[])
odb::sqlite::database::print_usage (cerr);
#elif defined(DATABASE_PGSQL)
odb::pgsql::database::print_usage (cerr);
+#elif defined(DATABASE_ORACLE)
+ odb::oracle::database::print_usage (cerr);
#endif
exit (0);
@@ -73,6 +77,9 @@ create_database (int& argc, char* argv[])
}
#elif defined(DATABASE_PGSQL)
auto_ptr<database> db (new odb::pgsql::database (argc, argv));
+#elif defined(DATABASE_ORACLE)
+ auto_ptr<database> db (
+ new odb::oracle::database (argc, argv, false, 873, 873));
#endif
return db;
diff --git a/relationship/database.hxx b/relationship/database.hxx
index eb55885..dd4a62f 100644
--- a/relationship/database.hxx
+++ b/relationship/database.hxx
@@ -25,6 +25,8 @@
# include <odb/sqlite/database.hxx>
#elif defined(DATABASE_PGSQL)
# include <odb/pgsql/database.hxx>
+#elif defined(DATABASE_ORACLE)
+# include <odb/oracle/database.hxx>
#endif
inline std::auto_ptr<odb::database>
@@ -44,6 +46,8 @@ create_database (int& argc, char* argv[])
odb::sqlite::database::print_usage (cerr);
#elif defined(DATABASE_PGSQL)
odb::pgsql::database::print_usage (cerr);
+#elif defined(DATABASE_ORACLE)
+ odb::oracle::database::print_usage (cerr);
#endif
exit (0);
@@ -73,6 +77,9 @@ create_database (int& argc, char* argv[])
}
#elif defined(DATABASE_PGSQL)
auto_ptr<database> db (new odb::pgsql::database (argc, argv));
+#elif defined(DATABASE_ORACLE)
+ auto_ptr<database> db (
+ new odb::oracle::database (argc, argv, false, 873, 873));
#endif
return db;
diff --git a/relationship/makefile b/relationship/makefile
index 96440be..e8715ef 100644
--- a/relationship/makefile
+++ b/relationship/makefile
@@ -48,7 +48,7 @@ $(gen): $(odb)
$(gen): odb := $(odb)
$(gen) $(dist): export odb_options += --database $(db_id) --generate-query \
--generate-schema --default-pointer std::tr1::shared_ptr \
---table-prefix relationship_
+--table-prefix r_
$(gen): cpp_options := -I$(src_base)
$(gen): $(odb.l.cpp-options)
diff --git a/schema/custom/database.hxx b/schema/custom/database.hxx
index 76dedb6..5bca839 100644
--- a/schema/custom/database.hxx
+++ b/schema/custom/database.hxx
@@ -22,6 +22,8 @@
# include <odb/sqlite/database.hxx>
#elif defined(DATABASE_PGSQL)
# include <odb/pgsql/database.hxx>
+#elif defined(DATABASE_ORACLE)
+# include <odb/oracle/database.hxx>
#endif
inline std::auto_ptr<odb::database>
@@ -41,6 +43,8 @@ create_database (int& argc, char* argv[])
odb::sqlite::database::print_usage (cerr);
#elif defined(DATABASE_PGSQL)
odb::pgsql::database::print_usage (cerr);
+#elif defined(DATABASE_ORACLE)
+ odb::oracle::database::print_usage (cerr);
#endif
exit (0);
@@ -54,6 +58,9 @@ create_database (int& argc, char* argv[])
argc, argv, false, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE));
#elif defined(DATABASE_PGSQL)
auto_ptr<database> db (new odb::pgsql::database (argc, argv));
+#elif defined(DATABASE_ORACLE)
+ auto_ptr<database> db (
+ new odb::oracle::database (argc, argv, false, 873, 873));
#endif
return db;
diff --git a/schema/custom/driver.cxx b/schema/custom/driver.cxx
index 9d049ed..a140ee1 100644
--- a/schema/custom/driver.cxx
+++ b/schema/custom/driver.cxx
@@ -116,6 +116,65 @@ main (int argc, char* argv[])
t.commit ();
}
+#elif defined(DATABASE_ORACLE)
+ {
+ // Oracle-specific PL/SQL.
+ //
+ transaction t (db->begin ());
+
+ db->execute ("BEGIN "
+ " EXECUTE IMMEDIATE "
+ " 'DROP TABLE \"Employer\" CASCADE CONSTRAINTS';"
+ " EXCEPTION "
+ " WHEN OTHERS THEN "
+ " IF SQLCODE != -942 THEN RAISE; END IF;"
+ "END;");
+
+ db->execute ("BEGIN "
+ " EXECUTE IMMEDIATE "
+ " 'DROP TABLE \"Employee\" CASCADE CONSTRAINTS';"
+ " EXCEPTION "
+ " WHEN OTHERS THEN "
+ " IF SQLCODE != -942 THEN RAISE; END IF;"
+ "END;");
+
+ db->execute ("BEGIN "
+ " EXECUTE IMMEDIATE 'DROP TABLE \"EmployeeDegree\"';"
+ " EXCEPTION "
+ " WHEN OTHERS THEN "
+ " IF SQLCODE != -942 THEN RAISE; END IF;"
+ "END;");
+
+ db->execute (
+ "CREATE TABLE \"Employer\" ("
+ "\"name\" VARCHAR (255) PRIMARY KEY)");
+
+ db->execute (
+ "CREATE TABLE \"Employee\" ("
+ "\"ssn\" NUMBER(10) PRIMARY KEY,"
+ "\"first_name\" VARCHAR (255) NOT NULL,"
+ "\"last_name\" VARCHAR (255) NOT NULL,"
+ "\"employer\" VARCHAR (255) NOT NULL)");
+
+ db->execute (
+ "CREATE TABLE \"EmployeeDegree\" ("
+ "\"ssn\" NUMBER(10) NOT NULL,"
+ "\"degree\" VARCHAR (255) NOT NULL)");
+
+ db->execute (
+ "ALTER TABLE \"Employee\" "
+ "ADD FOREIGN KEY (\"employer\") "
+ "REFERENCES \"Employer\" "
+ "INITIALLY DEFERRED");
+
+ db->execute (
+ "ALTER TABLE \"EmployeeDegree\" "
+ "ADD FOREIGN KEY (\"ssn\") "
+ "REFERENCES \"Employee\" "
+ "INITIALLY DEFERRED");
+
+ t.commit ();
+ }
#else
# error unknown database
#endif
diff --git a/schema/custom/employee.hxx b/schema/custom/employee.hxx
index 651f8c3..0f15cf8 100644
--- a/schema/custom/employee.hxx
+++ b/schema/custom/employee.hxx
@@ -133,8 +133,8 @@ private:
employee (): name_ ("", "") {}
- #pragma db id type("INTEGER UNSIGNED") column("ssn")
- unsigned long id_;
+ #pragma db id type("INTEGER") column("ssn")
+ long id_;
#pragma db column("") // No column prefix.
name_type name_;
diff --git a/schema/embedded/database.hxx b/schema/embedded/database.hxx
index 9a2cbed..f1cf1e5 100644
--- a/schema/embedded/database.hxx
+++ b/schema/embedded/database.hxx
@@ -22,6 +22,8 @@
# include <odb/sqlite/database.hxx>
#elif defined(DATABASE_PGSQL)
# include <odb/pgsql/database.hxx>
+#elif defined(DATABASE_ORACLE)
+# include <odb/oracle/database.hxx>
#endif
inline std::auto_ptr<odb::database>
@@ -41,6 +43,8 @@ create_database (int& argc, char* argv[])
odb::sqlite::database::print_usage (cerr);
#elif defined(DATABASE_PGSQL)
odb::pgsql::database::print_usage (cerr);
+#elif defined(DATABASE_ORACLE)
+ odb::oracle::database::print_usage (cerr);
#endif
exit (0);
@@ -54,6 +58,9 @@ create_database (int& argc, char* argv[])
argc, argv, false, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE));
#elif defined(DATABASE_PGSQL)
auto_ptr<database> db (new odb::pgsql::database (argc, argv));
+#elif defined(DATABASE_ORACLE)
+ auto_ptr<database> db (
+ new odb::oracle::database (argc, argv, false, 873, 873));
#endif
return db;
diff --git a/template/database.hxx b/template/database.hxx
index cd7dd51..9ddc0f8 100644
--- a/template/database.hxx
+++ b/template/database.hxx
@@ -25,6 +25,8 @@
# include <odb/sqlite/database.hxx>
#elif defined(DATABASE_PGSQL)
# include <odb/pgsql/database.hxx>
+#elif defined(DATABASE_ORACLE)
+# include <odb/oracle/database.hxx>
#endif
inline std::auto_ptr<odb::database>
@@ -44,6 +46,8 @@ create_database (int& argc, char* argv[])
odb::sqlite::database::print_usage (cerr);
#elif defined(DATABASE_PGSQL)
odb::pgsql::database::print_usage (cerr);
+#elif defined(DATABASE_ORACLE)
+ odb::oracle::database::print_usage (cerr);
#endif
exit (0);
@@ -73,6 +77,9 @@ create_database (int& argc, char* argv[])
}
#elif defined(DATABASE_PGSQL)
auto_ptr<database> db (new odb::pgsql::database (argc, argv));
+#elif defined(DATABASE_ORACLE)
+ auto_ptr<database> db (
+ new odb::oracle::database (argc, argv, false, 873, 873));
#endif
return db;
diff --git a/view/database.hxx b/view/database.hxx
index c68e3e1..dbf573d 100644
--- a/view/database.hxx
+++ b/view/database.hxx
@@ -25,6 +25,8 @@
# include <odb/sqlite/database.hxx>
#elif defined(DATABASE_PGSQL)
# include <odb/pgsql/database.hxx>
+#elif defined(DATABASE_ORACLE)
+# include <odb/oracle/database.hxx>
#endif
inline std::auto_ptr<odb::database>
@@ -44,6 +46,8 @@ create_database (int& argc, char* argv[])
odb::sqlite::database::print_usage (cerr);
#elif defined(DATABASE_PGSQL)
odb::pgsql::database::print_usage (cerr);
+#elif defined(DATABASE_ORACLE)
+ odb::oracle::database::print_usage (cerr);
#endif
exit (0);
@@ -73,6 +77,9 @@ create_database (int& argc, char* argv[])
}
#elif defined(DATABASE_PGSQL)
auto_ptr<database> db (new odb::pgsql::database (argc, argv));
+#elif defined(DATABASE_ORACLE)
+ auto_ptr<database> db (
+ new odb::oracle::database (argc, argv, false, 873, 873));
#endif
return db;
diff --git a/view/driver.cxx b/view/driver.cxx
index bc32513..118b126 100644
--- a/view/driver.cxx
+++ b/view/driver.cxx
@@ -33,7 +33,18 @@ main (int argc, char* argv[])
transaction t (db->begin ());
try
{
- db->execute ("DROP TABLE view_employee_extra");
+#ifndef DATABASE_ORACLE
+ db->execute ("DROP TABLE \"view_employee_extra\"");
+#else
+ db->execute ("BEGIN "
+ " EXECUTE IMMEDIATE "
+ " 'DROP TABLE \"view_employee_extra\" "
+ " CASCADE CONSTRAINTS';"
+ " EXCEPTION "
+ " WHEN OTHERS THEN "
+ " IF SQLCODE != -942 THEN RAISE; END IF;"
+ "END;");
+#endif
t.commit ();
}
catch (const odb::exception&)
@@ -44,11 +55,19 @@ main (int argc, char* argv[])
{
transaction t (db->begin ());
+#ifndef DATABASE_ORACLE
db->execute (
"CREATE TABLE view_employee_extra ("
"employee_id INTEGER NOT NULL,"
"vacation_days INTEGER NOT NULL,"
"previous_employer_id INTEGER)");
+#else
+ db->execute (
+ "CREATE TABLE \"view_employee_extra\" ("
+ "\"employee_id\" INTEGER NOT NULL,"
+ "\"vacation_days\" INTEGER NOT NULL,"
+ "\"previous_employer_id\" INTEGER)");
+#endif
t.commit ();
}
@@ -94,6 +113,7 @@ main (int argc, char* argv[])
// Populate the legacy table.
//
+#ifndef DATABASE_ORACLE
db->execute ("INSERT INTO view_employee_extra ("
"employee_id, vacation_days, previous_employer_id)"
"VALUES (1, 5, 2)");
@@ -109,6 +129,31 @@ main (int argc, char* argv[])
db->execute ("INSERT INTO view_employee_extra ("
"employee_id, vacation_days, previous_employer_id)"
"VALUES (4, 15, 1)");
+#else
+ db->execute ("INSERT INTO \"view_employee_extra\" ("
+ "\"employee_id\", "
+ "\"vacation_days\", "
+ "\"previous_employer_id\") "
+ "VALUES (1, 5, 2)");
+
+ db->execute ("INSERT INTO \"view_employee_extra\" ("
+ "\"employee_id\", "
+ "\"vacation_days\", "
+ "\"previous_employer_id\") "
+ "VALUES (2, 10, NULL)");
+
+ db->execute ("INSERT INTO \"view_employee_extra\" ("
+ "\"employee_id\", "
+ "\"vacation_days\", "
+ "\"previous_employer_id\") "
+ "VALUES (3, 0, NULL)");
+
+ db->execute ("INSERT INTO \"view_employee_extra\" ("
+ "\"employee_id\", "
+ "\"vacation_days\", "
+ "\"previous_employer_id\") "
+ "VALUES (4, 15, 1)");
+#endif
t.commit ();
}
@@ -244,7 +289,11 @@ main (int argc, char* argv[])
// With native views we have to use the native SQL query syntax.
//
+#ifndef DATABASE_ORACLE
result r (db->query<employee_vacation> ("vacation_days <> 0"));
+#else
+ result r (db->query<employee_vacation> ("\"vacation_days\" <> 0"));
+#endif
cout << "Employees with accumulated vacation days" << endl;
@@ -264,7 +313,11 @@ main (int argc, char* argv[])
transaction t (db->begin ());
+#ifndef DATABASE_ORACLE
result r (db->query<employee_vacation2> ("vacation_days <> 0"));
+#else
+ result r (db->query<employee_vacation2> ("\"vacation_days\" <> 0"));
+#endif
cout << "Employees with accumulated vacation days (take 2)" << endl;
diff --git a/view/employee.hxx b/view/employee.hxx
index 110cb9e..848a30c 100644
--- a/view/employee.hxx
+++ b/view/employee.hxx
@@ -236,8 +236,13 @@ struct employee_country
// on an ad-hoc table. This view allows us to load the employee vacation
// information from the legacy employee_extra table.
//
-#pragma db view query("SELECT employee_id, vacation_days " \
- "FROM view_employee_extra")
+#ifndef ODB_DATABASE_ORACLE
+ #pragma db view query("SELECT employee_id, vacation_days " \
+ "FROM view_employee_extra")
+#else
+ #pragma db view query("SELECT \"employee_id\", \"vacation_days\" " \
+ "FROM \"view_employee_extra\"")
+#endif
struct employee_vacation
{
#pragma db type("INTEGER")
@@ -265,8 +270,14 @@ struct employee_vacation1
// add the employee object to this view and use a custom join condition
// to tie it up with our legacy table.
//
-#pragma db view table("view_employee_extra") \
- object(employee: "view_employee_extra.employee_id = " + employee::id_)
+#ifndef ODB_DATABASE_ORACLE
+ #pragma db view table("view_employee_extra") \
+ object(employee: "view_employee_extra.employee_id = " + employee::id_)
+#else
+ #pragma db view table("view_employee_extra") \
+ object(employee: "\"view_employee_extra\".\"employee_id\" = " + \
+ employee::id_)
+#endif
struct employee_vacation2
{
std::string first;
@@ -279,10 +290,17 @@ struct employee_vacation2
// A mixed view that associates two objects and a legacy table. It returns
// the previous employer information for each employee.
//
-#pragma db view object(employee) \
- table("view_employee_extra" = "extra": \
- "extra.employee_id = " + employee::id_) \
- object(employer: "extra.previous_employer_id = " + employer::id_)
+#ifndef ODB_DATABASE_ORACLE
+ #pragma db view object(employee) \
+ table("view_employee_extra" = "extra": \
+ "extra.employee_id = " + employee::id_) \
+ object(employer: "extra.previous_employer_id = " + employer::id_)
+#else
+ #pragma db view object(employee) \
+ table("view_employee_extra" = "extra": \
+ "\"extra\".\"employee_id\" = " + employee::id_) \
+ object(employer: "\"extra\".\"previous_employer_id\" = " + employer::id_)
+#endif
struct employee_prev_employer
{
std::string first;