From 9616e3e84946c23f64448978d9459d2a25202833 Mon Sep 17 00:00:00 2001 From: Constantin Michael Date: Thu, 17 Nov 2011 11:44:45 +0200 Subject: Add examples for Oracle --- boost/database.hxx | 7 ++ build/bootstrap.make | 2 +- build/configuration.make | 4 + build/configure | 3 +- build/import/libodb-oracle/LICENSE | 12 +++ .../import/libodb-oracle/configuration-rules.make | 15 ++++ build/import/libodb-oracle/configure | 55 ++++++++++++ build/import/libodb-oracle/stub.make | 30 +++++++ build/oracle/configure | 99 ++++++++++++++++++++++ build/oracle/oracle | 75 ++++++++++++++++ composite/database.hxx | 7 ++ composite/makefile | 2 +- container/database.hxx | 7 ++ hello/database.hxx | 7 ++ inheritance/database.hxx | 7 ++ inheritance/makefile | 2 +- inverse/database.hxx | 7 ++ mapping/database.hxx | 7 ++ mapping/traits-oracle.hxx | 95 +++++++++++++++++++++ mapping/traits.hxx | 2 + optimistic/database.hxx | 7 ++ qt/database.hxx | 7 ++ query/database.hxx | 7 ++ relationship/database.hxx | 7 ++ relationship/makefile | 2 +- schema/custom/database.hxx | 7 ++ schema/custom/driver.cxx | 59 +++++++++++++ schema/custom/employee.hxx | 4 +- schema/embedded/database.hxx | 7 ++ template/database.hxx | 7 ++ view/database.hxx | 7 ++ view/driver.cxx | 55 +++++++++++- view/employee.hxx | 34 ++++++-- 33 files changed, 639 insertions(+), 16 deletions(-) create mode 100644 build/import/libodb-oracle/LICENSE create mode 100644 build/import/libodb-oracle/configuration-rules.make create mode 100755 build/import/libodb-oracle/configure create mode 100644 build/import/libodb-oracle/stub.make create mode 100755 build/oracle/configure create mode 100755 build/oracle/oracle create mode 100644 mapping/traits-oracle.hxx 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 #elif defined(DATABASE_PGSQL) # include +#elif defined(DATABASE_ORACLE) +# include #endif inline std::auto_ptr @@ -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 db (new odb::pgsql::database (argc, argv)); +#elif defined(DATABASE_ORACLE) + auto_ptr 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 +# 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 +# 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 +# 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 +# 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 +# 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 #elif defined(DATABASE_PGSQL) # include +#elif defined(DATABASE_ORACLE) +# include #endif inline std::auto_ptr @@ -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 db (new odb::pgsql::database (argc, argv)); +#elif defined(DATABASE_ORACLE) + auto_ptr 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 #elif defined(DATABASE_PGSQL) # include +#elif defined(DATABASE_ORACLE) +# include #endif inline std::auto_ptr @@ -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 db (new odb::pgsql::database (argc, argv)); +#elif defined(DATABASE_ORACLE) + auto_ptr 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 #elif defined(DATABASE_PGSQL) # include +#elif defined(DATABASE_ORACLE) +# include #endif inline std::auto_ptr @@ -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 db (new odb::pgsql::database (argc, argv)); +#elif defined(DATABASE_ORACLE) + auto_ptr 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 #elif defined(DATABASE_PGSQL) # include +#elif defined(DATABASE_ORACLE) +# include #endif inline std::auto_ptr @@ -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 db (new odb::pgsql::database (argc, argv)); +#elif defined(DATABASE_ORACLE) + auto_ptr 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 #elif defined(DATABASE_PGSQL) # include +#elif defined(DATABASE_ORACLE) +# include #endif inline std::auto_ptr @@ -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 db (new odb::pgsql::database (argc, argv)); +#elif defined(DATABASE_ORACLE) + auto_ptr 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 #elif defined(DATABASE_PGSQL) # include +#elif defined(DATABASE_ORACLE) +# include #endif inline std::auto_ptr @@ -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 db (new odb::pgsql::database (argc, argv)); +#elif defined(DATABASE_ORACLE) + auto_ptr 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 +// copyright : not copyrighted - public domain + +#ifndef TRAITS_ORACLE_HXX +#define TRAITS_ORACLE_HXX + +// +// Oracle implementation. +// + +#include // std::size_t +#include // std::strncmp, std::memcpy + +#include +#include + +#include "person.hxx" // date + +namespace odb +{ + namespace oracle + { + template <> + class value_traits + { + 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 + { + 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 (v.year ())); + unsigned char m (static_cast (v.month ())); + unsigned char d (static_cast (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 #elif defined(DATABASE_PGSQL) # include +#elif defined(DATABASE_ORACLE) +# include #endif inline std::auto_ptr @@ -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 db (new odb::pgsql::database (argc, argv)); +#elif defined(DATABASE_ORACLE) + auto_ptr 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 #elif defined(DATABASE_PGSQL) # include +#elif defined(DATABASE_ORACLE) +# include #endif inline std::auto_ptr @@ -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 db (new odb::pgsql::database (argc, argv)); +#elif defined(DATABASE_ORACLE) + auto_ptr 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 #elif defined(DATABASE_PGSQL) # include +#elif defined(DATABASE_ORACLE) +# include #endif inline std::auto_ptr @@ -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 db (new odb::pgsql::database (argc, argv)); +#elif defined(DATABASE_ORACLE) + auto_ptr 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 #elif defined(DATABASE_PGSQL) # include +#elif defined(DATABASE_ORACLE) +# include #endif inline std::auto_ptr @@ -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 db (new odb::pgsql::database (argc, argv)); +#elif defined(DATABASE_ORACLE) + auto_ptr 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 #elif defined(DATABASE_PGSQL) # include +#elif defined(DATABASE_ORACLE) +# include #endif inline std::auto_ptr @@ -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 db (new odb::pgsql::database (argc, argv)); +#elif defined(DATABASE_ORACLE) + auto_ptr 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 #elif defined(DATABASE_PGSQL) # include +#elif defined(DATABASE_ORACLE) +# include #endif inline std::auto_ptr @@ -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 db (new odb::pgsql::database (argc, argv)); +#elif defined(DATABASE_ORACLE) + auto_ptr 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 #elif defined(DATABASE_PGSQL) # include +#elif defined(DATABASE_ORACLE) +# include #endif inline std::auto_ptr @@ -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 db (new odb::pgsql::database (argc, argv)); +#elif defined(DATABASE_ORACLE) + auto_ptr 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 #elif defined(DATABASE_PGSQL) # include +#elif defined(DATABASE_ORACLE) +# include #endif inline std::auto_ptr @@ -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 db (new odb::pgsql::database (argc, argv)); +#elif defined(DATABASE_ORACLE) + auto_ptr 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 ("vacation_days <> 0")); +#else + result r (db->query ("\"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 ("vacation_days <> 0")); +#else + result r (db->query ("\"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; -- cgit v1.1