diff options
47 files changed, 2804 insertions, 0 deletions
@@ -15,6 +15,8 @@ # Generated build system files. # *-dynamic.make +build/db.options +build/db-driver # Generated .gitignore files. # diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..f90caed --- /dev/null +++ b/Makefile.am @@ -0,0 +1,9 @@ +# file : Makefile.am +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +# license : GNU GPL v2; see accompanying LICENSE file + +SUBDIRS = __path__(dirs) + +EXTRA_DIST = __file__(extra_dist) +ACLOCAL_AMFLAGS = -I m4 diff --git a/bootstrap b/bootstrap new file mode 100755 index 0000000..ceb2ea7 --- /dev/null +++ b/bootstrap @@ -0,0 +1,18 @@ +#! /bin/sh + +# file : bootstrap +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +# license : GNU GPL v2; see accompanying LICENSE file + +# +# Bootstrap the automake build system. +# + +rm -f config.cache + +if test ! -d m4; then + mkdir m4 +fi + +autoreconf --install diff --git a/build/bootstrap.make b/build/bootstrap.make new file mode 100644 index 0000000..b4f7ed8 --- /dev/null +++ b/build/bootstrap.make @@ -0,0 +1,122 @@ +# file : build/bootstrap.make +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +# license : GNU GPL v2; see accompanying LICENSE file + +project_name := odb-examples + +# First try to include the bundled bootstrap.make if it exist. If that +# fails, let make search for the external bootstrap.make. +# +build := build-0.3 + +-include $(dir $(lastword $(MAKEFILE_LIST)))../../$(build)/bootstrap.make + +ifeq ($(patsubst %build/bootstrap.make,,$(lastword $(MAKEFILE_LIST))),) +include $(build)/bootstrap.make +endif + +# Configuration +# +$(call include,$(scf_root)/configuration.make) + +def_goal := $(.DEFAULT_GOAL) + +# Include C++ configuration. We need to know if we are using the generic +# C++ compiler in which case we need to compensate for missing dependency +# auto-generation (see below). +# +$(call include,$(bld_root)/cxx/configuration.make) + +# Aliases +# +.PHONY: $(out_base)/ \ + $(out_base)/.test \ + $(out_base)/.dist \ + $(out_base)/.clean + +ifdef %interactive% + +.PHONY: test dist clean + +test: $(out_base)/.test +dist: $(out_base)/.dist +clean: $(out_base)/.clean + +endif + +# Dist setup. +# +ifneq ($(filter $(MAKECMDGOALS),dist),) + +# Make sure the distribution prefix is set if the goal is dist. +# +ifeq ($(dist_prefix),) +$(error dist_prefix is not set) +endif + +databases := mysql +$(dist): databases := $(databases) + +# $1 project template without the -vcN.vc[x]proj suffix. +# $2 project name without the -vcN.vc[x]proj suffix. +# +$(dist): meta-vc9projs = \ +$(foreach d,$(databases),$(call \ +meta-vc9proj,$1-vc9.vcproj,$(if $2,$2,$(notdir \ +$1))-$d-vc9.vcproj,database,$d)$(literal_newline)$(literal_tab))@: + +$(dist): meta-vc10projs = \ +$(foreach d,$(databases),$(call \ +meta-vc10proj,$1-vc10.vcxproj,$(if $2,$2,$(notdir \ +$1))-$d-vc10.vcxproj,database,$d)$(literal_newline)$(literal_tab))@: + +# $1 project name without the -vcN.vc[x]proj suffix. +# +vc9projs = $(addprefix $1-,$(addsuffix -vc9.vcproj,$(databases))) +vc10projs = $(addprefix $1-,$(addsuffix -vc10.vcxproj,$(databases))) \ +$(addprefix $1-,$(addsuffix -vc10.vcxproj.filters,$(databases))) + +# $1 solution name without the -vcN.sln suffix. +# +$(dist): meta-vc9slns = \ +$(foreach d,$(databases),$(call \ +meta-vc9sln,$1-vc9.sln,$1-$d-vc9.sln,-$d-vc9.vcproj,database,$d)$(literal_newline)\ +$(literal_tab))@: + +$(dist): meta-vc10slns = \ +$(foreach d,$(databases),$(call \ +meta-vc10sln,$1-vc10.sln,$1-$d-vc10.sln,-$d-vc10.vcxproj,database,$d)$(literal_newline)\ +$(literal_tab))@: + +vc9slns = $(addprefix $1-,$(addsuffix -vc9.sln,$(databases))) +vc10slns = $(addprefix $1-,$(addsuffix -vc10.sln,$(databases))) + +endif + +# If we don't have dependency auto-generation then we need to manually +# make sure that ODB files are generated before C++ file are compiler. +# To do this we make the object files ($2) depend in order-only on +# generated files ($3). +# +ifeq ($(cxx_id),generic) + +define include-dep +$(if $2,$(eval $2: | $3)) +endef + +else + +define include-dep +$(call -include,$1) +endef + +endif + +# Don't include dependency info for certain targets. +# +ifneq ($(filter $(MAKECMDGOALS),clean disfigure dist),) +include-dep = +endif + +.DEFAULT_GOAL := $(def_goal) diff --git a/build/configuration-rules.make b/build/configuration-rules.make new file mode 100644 index 0000000..19e7ef0 --- /dev/null +++ b/build/configuration-rules.make @@ -0,0 +1,20 @@ +# file : build/configuration-rules.make +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +# license : GNU GPL v2; see accompanying LICENSE file + +$(dcf_root)/configuration-dynamic.make: | $(dcf_root)/. + $(call message,,$(scf_root)/configure $@) + +ifndef %foreign% + +disfigure:: + $(call message,rm $$1,rm -f $$1,$(dcf_root)/configuration-dynamic.make) + $(call message,rm $$1,rm -f $$1,$(dcf_root)/db.options) + $(call message,rm $$1,rm -f $$1,$(dcf_root)/db-driver) + +endif + +ifeq ($(.DEFAULT_GOAL),$(dcf_root)/configuration-dynamic.make) +.DEFAULT_GOAL := +endif diff --git a/build/configuration.make b/build/configuration.make new file mode 100644 index 0000000..fe27430 --- /dev/null +++ b/build/configuration.make @@ -0,0 +1,22 @@ +# file : build/configuration.make +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +# license : GNU GPL v2; see accompanying LICENSE file + +$(call include-once,$(scf_root)/configuration-rules.make,$(dcf_root)) + +# Dynamic configuration. +# +db_id := + +$(call -include,$(dcf_root)/configuration-dynamic.make) + +ifdef db_id + +$(out_root)/%: db_id := $(db_id) + +else + +.NOTPARALLEL: + +endif diff --git a/build/configure b/build/configure new file mode 100755 index 0000000..0bb1e07 --- /dev/null +++ b/build/configure @@ -0,0 +1,32 @@ +#! /usr/bin/env bash + +# file : build/configure +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +# license : GNU GPL v2; see accompanying LICENSE file + +# $1 out file +# +# bld_root - build root +# project_name - project name +# + +source $bld_root/dialog.bash + +$echo +$echo +$echo "configuring '$project_name'" +$echo +$echo + +$echo +$echo "Please select the database you would like to use:" +$echo +$echo "(1) MySQL" +$echo + +db_id=`read_option "mysql" "mysql"` + +echo "db_id := $db_id" >$1 + +source $scf_root/$db_id/configure diff --git a/build/import/libodb-mysql/LICENSE b/build/import/libodb-mysql/LICENSE new file mode 100644 index 0000000..ed9c55c --- /dev/null +++ b/build/import/libodb-mysql/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-mysql/configuration-rules.make b/build/import/libodb-mysql/configuration-rules.make new file mode 100644 index 0000000..b57907c --- /dev/null +++ b/build/import/libodb-mysql/configuration-rules.make @@ -0,0 +1,15 @@ +# file : build/import/libodb-mysql/configuration-rules.make +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +# license : GNU GPL v2; see accompanying LICENSE file + +$(dcf_root)/import/libodb-mysql/configuration-dynamic.make: | $(dcf_root)/import/libodb-mysql/. + $(call message,,$(scf_root)/import/libodb-mysql/configure $@) + +ifndef %foreign% + +$(dcf_root)/.disfigure:: + $(call message,rm $(dcf_root)/import/libodb-mysql/configuration-dynamic.make,\ +rm -f $(dcf_root)/import/libodb-mysql/configuration-dynamic.make) + +endif diff --git a/build/import/libodb-mysql/configure b/build/import/libodb-mysql/configure new file mode 100755 index 0000000..b16cabe --- /dev/null +++ b/build/import/libodb-mysql/configure @@ -0,0 +1,55 @@ +#! /usr/bin/env bash + +# file : build/import/libodb-mysql/configure +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +# license : GNU GPL v2; 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-mysql' for '$project_name'." +$echo + +$echo +$echo "Would you like to configure dependency on the installed version" +$echo "of 'libodb-mysql' 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-mysql'." +$echo + +src_root=`read_path --directory --exist` + +$echo +$echo "Please enter the out_root for 'libodb-mysql'." +$echo + +out_root=`read_path --directory $src_root` + +fi + +echo libodb_mysql_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-mysql/stub.make b/build/import/libodb-mysql/stub.make new file mode 100644 index 0000000..259f1a1 --- /dev/null +++ b/build/import/libodb-mysql/stub.make @@ -0,0 +1,30 @@ +# file : build/import/libodb-mysql/stub.make +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +# license : GNU GPL v2; see accompanying LICENSE file + +$(call include-once,$(scf_root)/import/libodb-mysql/configuration-rules.make,$(dcf_root)) + +libodb_mysql_installed := + +$(call -include,$(dcf_root)/import/libodb-mysql/configuration-dynamic.make) + +ifdef libodb_mysql_installed + +ifeq ($(libodb_mysql_installed),y) + +$(call export,l: -lodb-mysql -lodb -lmysqlclient,cpp-options: ) + +else + +# Include export stub. +# +$(call include,$(scf_root)/export/libodb-mysql/stub.make) + +endif + +else + +.NOTPARALLEL: + +endif diff --git a/build/import/libodb/LICENSE b/build/import/libodb/LICENSE new file mode 100644 index 0000000..ed9c55c --- /dev/null +++ b/build/import/libodb/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/configuration-rules.make b/build/import/libodb/configuration-rules.make new file mode 100644 index 0000000..2c30e7f --- /dev/null +++ b/build/import/libodb/configuration-rules.make @@ -0,0 +1,15 @@ +# file : build/import/libodb/configuration-rules.make +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +# license : GNU GPL v2; see accompanying LICENSE file + +$(dcf_root)/import/libodb/configuration-dynamic.make: | $(dcf_root)/import/libodb/. + $(call message,,$(scf_root)/import/libodb/configure $@) + +ifndef %foreign% + +$(dcf_root)/.disfigure:: + $(call message,rm $(dcf_root)/import/libodb/configuration-dynamic.make,\ +rm -f $(dcf_root)/import/libodb/configuration-dynamic.make) + +endif diff --git a/build/import/libodb/configure b/build/import/libodb/configure new file mode 100755 index 0000000..792bb80 --- /dev/null +++ b/build/import/libodb/configure @@ -0,0 +1,55 @@ +#! /usr/bin/env bash + +# file : build/import/libodb/configure +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +# license : GNU GPL v2; 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' for '$project_name'." +$echo + +$echo +$echo "Would you like to configure dependency on the installed " +$echo "version of 'libodb' 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'." +$echo + +src_root=`read_path --directory --exist` + +$echo +$echo "Please enter the out_root for 'libodb'." +$echo + +out_root=`read_path --directory $src_root` + +fi + +echo libodb_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/stub.make b/build/import/libodb/stub.make new file mode 100644 index 0000000..9196552 --- /dev/null +++ b/build/import/libodb/stub.make @@ -0,0 +1,30 @@ +# file : build/import/libodb/stub.make +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +# license : GNU GPL v2; see accompanying LICENSE file + +$(call include-once,$(scf_root)/import/libodb/configuration-rules.make,$(dcf_root)) + +libodb_installed := + +$(call -include,$(dcf_root)/import/libodb/configuration-dynamic.make) + +ifdef libodb_installed + +ifeq ($(libodb_installed),y) + +$(call export,l: -lodb,cpp-options: ) + +else + +# Include export stub. +# +$(call include,$(scf_root)/export/libodb/stub.make) + +endif + +else + +.NOTPARALLEL: + +endif diff --git a/build/import/odb/LICENSE b/build/import/odb/LICENSE new file mode 100644 index 0000000..ed9c55c --- /dev/null +++ b/build/import/odb/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/odb/configuration-rules.make b/build/import/odb/configuration-rules.make new file mode 100644 index 0000000..817f1b1 --- /dev/null +++ b/build/import/odb/configuration-rules.make @@ -0,0 +1,15 @@ +# file : build/import/odb/configuration-rules.make +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +# license : GNU GPL v2; see accompanying LICENSE file + +$(dcf_root)/import/odb/configuration-dynamic.make: | $(dcf_root)/import/odb/. + $(call message,,$(scf_root)/import/odb/configure $@) + +ifndef %foreign% + +$(dcf_root)/.disfigure:: + $(call message,rm $(dcf_root)/import/odb/configuration-dynamic.make,\ +rm -f $(dcf_root)/import/odb/configuration-dynamic.make) + +endif diff --git a/build/import/odb/configure b/build/import/odb/configure new file mode 100755 index 0000000..1ba2f09 --- /dev/null +++ b/build/import/odb/configure @@ -0,0 +1,55 @@ +#! /usr/bin/env bash + +# file : build/import/odb/configure +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +# license : GNU GPL v2; 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 'odb' for '$project_name'." +$echo + +$echo +$echo "Would you like to configure dependency on the installed " +$echo "version of 'odb' 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 'odb'." +$echo + +src_root=`read_path --directory --exist` + +$echo +$echo "Please enter the out_root for 'odb'." +$eche + +out_root=`read_path --directory $src_root` + +fi + +echo odb_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/odb/hxx-cxx.make b/build/import/odb/hxx-cxx.make new file mode 100644 index 0000000..c9f3325 --- /dev/null +++ b/build/import/odb/hxx-cxx.make @@ -0,0 +1,62 @@ +# file : build/import/odb/hxx-cxx.make +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +# license : GNU GPL v3; see accompanying LICENSE file + +# Here we are operating in the importing project's space, not in odb's. +# + +# Get the C++ configuration (file extensions, and extra CPP options). +# +$(call include,$(bld_root)/cxx/configuration.make) + +odb_pattern := \ +$(out_base)/%-odb.$(cxx_s_suffix) \ +$(out_base)/%-odb.$(cxx_h_suffix) \ +$(out_base)/%-odb.$(cxx_i_suffix) \ +$(out_base)/%.sql + +$(odb_pattern): odb_options := \ +--hxx-suffix .$(cxx_h_suffix) \ +--ixx-suffix .$(cxx_i_suffix) \ +--cxx-suffix .$(cxx_s_suffix) + +$(odb_pattern): odb-expand-cpp-options-impl = \ +$(if $1,$(shell sed -e 's%include: \(.*\)%\1%' -e t -e d $1)) + +$(odb_pattern): odb-expand-cpp-options = \ +$(call odb-expand-cpp-options-impl,$(filter %.cpp-options,$1)) + +.PRECIOUS: $(odb_pattern) + +ifeq ($(out_base),$(src_base)) + +$(odb_pattern): $(src_base)/%.$(cxx_h_suffix) + $(call message,odb $<,$(odb) $(cpp_options) \ +$(call expand-cpp-options,$^) $(cxx_pp_extra_options) $(odb_options) \ +--output-dir $(dir $@) $<) + +else + +$(odb_pattern): $(src_base)/%.$(cxx_h_suffix) | $$(dir $$@). + $(call message,odb $<,$(odb) $(cpp_options) \ +$(call expand-cpp-options,$^) $(cxx_pp_extra_options) $(odb_options) \ +--output-dir $(dir $@) $<) + +$(odb_pattern): $(out_base)/%.$(cxx_h_suffix) | $$(dir $$@). + $(call message,odb $<,$(odb) $(cpp_options) \ +$(call expand-cpp-options,$^) $(cxx_pp_extra_options) $(odb_options) \ +--output-dir $(dir $@) $<) +endif + +.PHONY: $(out_base)/%-odb.cxx.hxx.clean + +$(out_base)/%-odb.cxx.hxx.clean: cxx_s_suffix := $(cxx_s_suffix) +$(out_base)/%-odb.cxx.hxx.clean: cxx_h_suffix := $(cxx_h_suffix) +$(out_base)/%-odb.cxx.hxx.clean: cxx_i_suffix := $(cxx_i_suffix) + +$(out_base)/%-odb.cxx.hxx.clean: + $(call message,rm $$1,rm -f $$1,$(@:.cxx.hxx.clean=.$(cxx_s_suffix))) + $(call message,rm $$1,rm -f $$1,$(@:.cxx.hxx.clean=.$(cxx_h_suffix))) + $(call message,rm $$1,rm -f $$1,$(@:.cxx.hxx.clean=.$(cxx_i_suffix))) + $(call message,rm $$1,rm -f $$1,$(@:-odb.cxx.hxx.clean=.sql)) diff --git a/build/import/odb/stub.make b/build/import/odb/stub.make new file mode 100644 index 0000000..48585f0 --- /dev/null +++ b/build/import/odb/stub.make @@ -0,0 +1,30 @@ +# file : build/import/odb/stub.make +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +# license : GNU GPL v2; see accompanying LICENSE file + +$(call include-once,$(scf_root)/import/odb/configuration-rules.make,$(dcf_root)) + +odb_installed := + +$(call -include,$(dcf_root)/import/odb/configuration-dynamic.make) + +ifdef odb_installed + +ifeq ($(odb_installed),y) + +$(call export,odb: odb,odb-rules: $(scf_root)/import/odb/hxx-cxx.make) + +else + +# Include export stub. +# +$(call include,$(scf_root)/export/odb/stub.make) + +endif + +else + +.NOTPARALLEL: + +endif diff --git a/build/mysql/configure b/build/mysql/configure new file mode 100755 index 0000000..a454fc0 --- /dev/null +++ b/build/mysql/configure @@ -0,0 +1,77 @@ +#! /usr/bin/env bash + +# file : build/mysql/configure +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +# license : GNU GPL v2; see accompanying LICENSE file + +# +# dcf_root - dynamic configuration root +# + +$echo +$echo "Please enter the MySQL client program path." +$echo + +driver=`read_path --command mysql` + +$echo +$echo "Please enter the MySQL database user." +$echo + +user=`read_value "odb_test"` + +$echo +$echo "Please enter the MySQL database password. Enter NULL for" +$echo "unspecified password as opposed to the empty password." +$echo + +passwd=`read_value "NULL"` + +$echo +$echo "Please enter the MySQL database name. Note that it WILL BE" +$echo "MODIFIED by the tests." +$echo + +db=`read_value "odb_test"` + +$echo +$echo "Please enter the MySQL database host." +$echo + +host=`read_value ""` + +$echo +$echo "Please enter the MySQL database port." +$echo + +port=`read_value "0"` + +$echo +$echo "Please enter the MySQL database socket name. Enter NULL for" +$echo "unspecified name as opposed to the empty name." +$echo + +socket=`read_value "NULL"` + +opt=$dcf_root/db.options +drv=$dcf_root/db-driver + +echo "--user '$user'" >$opt + +if [ "$passwd" != "NULL" ]; then +echo "--password '$passwd'" >>$opt +fi + +echo "--database '$db'" >>$opt +echo "--host '$host'" >>$opt +echo "--port $port" >>$opt + +if [ "$socket" != "NULL" ]; then +echo "--socket '$socket'" >>$opt +fi + +echo "#!/bin/sh" >$drv +echo "opt=\`cat $opt\`" >>$drv +echo "eval $scf_root/mysql/mysql --driver $driver \$opt \$*" >>$drv +chmod 755 $drv diff --git a/build/mysql/mysql b/build/mysql/mysql new file mode 100755 index 0000000..c273d56 --- /dev/null +++ b/build/mysql/mysql @@ -0,0 +1,56 @@ +#! /usr/bin/env bash + +# file : build/mysql/mysql +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +# license : GNU GPL v2; see accompanying LICENSE file + +# +# MySQL driver wrapper. +# + +while [ $# -gt 0 ]; do + case $1 in + --driver) + driver=$2 + shift 2 + ;; + --user) + opt="$opt --user=$2" + shift 2 + ;; + --password) + opt="$opt --password=$2" + shift 2 + ;; + --database) + opt="$opt --database=$2" + shift 2 + ;; + --host) + opt="$opt --host=$2" + shift 2 + ;; + --port) + opt="$opt --port=$2" + shift 2 + ;; + --socket) + opt="$opt --socket=$2" + shift 2 + ;; + *) + break + ;; + esac +done + +if [ -z "$driver" ]; then + driver=mysql +fi + +if [ -n "$1" ]; then + exec $driver $opt <$1 +else + exec $driver $opt +fi diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..a6d58d8 --- /dev/null +++ b/configure.ac @@ -0,0 +1,56 @@ +# file : configure.ac +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +# license : GNU GPL v2; see accompanying LICENSE file + +AC_PREREQ(2.60) +AC_INIT([odb-examples], [__value__(version)], [odb-users@codesynthesis.com]) +AC_CONFIG_AUX_DIR([config]) +AC_CONFIG_MACRO_DIR([m4]) +AC_CONFIG_SRCDIR([template/driver.cxx]) + +AM_INIT_AUTOMAKE([-Wall -Werror foreign nostdinc subdir-objects dist-bzip2 dist-zip tar-ustar]) + +LT_INIT + +AC_CANONICAL_HOST + +# Check for C++ compiler and use it to compile the tests. +# +AC_PROG_CXX +AC_LANG(C++) + +# Create the libtool executable so that we can use it in further tests. +# +LT_OUTPUT + +# Check for threads. +# +THREADS + +AM_CONDITIONAL([ODB_EXAMPLES_THREADS], [test x$threads != xnone]) + +# Check for the ODB libs. +# +LIBODB([], [AC_MSG_ERROR([libodb is not found; consider using --with-libodb=DIR])]) + +# Check which database we are using. +# +DATABASE + +case $database in + mysql) + LIBODB_MYSQL([], [AC_MSG_ERROR([libodb-mysql is not found; consider using --with-libodb-mysql=DIR])]) + MYSQL + ;; +esac + +# Check for the ODB compiler. +# +ODB_COMPILER([], [AC_MSG_ERROR([odb compiler is not found; consider setting ODB variable or using --with-odb=DIR])]) + +# Output. +# +AC_CONFIG_HEADERS([config.h]) +AC_CONFIG_FILES([__path__(config_files)]) +AC_OUTPUT diff --git a/examples-vc10.sln b/examples-vc10.sln new file mode 100644 index 0000000..9a5dc32 --- /dev/null +++ b/examples-vc10.sln @@ -0,0 +1,15 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +__projects__ +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution +__solution_configurations__ + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution +__project_configurations__ + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/examples-vc9.sln b/examples-vc9.sln new file mode 100644 index 0000000..2ec9432 --- /dev/null +++ b/examples-vc9.sln @@ -0,0 +1,15 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +__projects__ +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution +__solution_configurations__ + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution +__project_configurations__ + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/m4/acx-pthread.m4 b/m4/acx-pthread.m4 new file mode 100644 index 0000000..feeb01d --- /dev/null +++ b/m4/acx-pthread.m4 @@ -0,0 +1,254 @@ +dnl +dnl NOTE: This file was modified. See the comments starting with 'CS:' +dnl for more information. In particular, it was changed to use C++ +dnl instead of C. +dnl +dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +dnl +dnl @summary figure out how to build C++ programs using POSIX threads +dnl +dnl This macro figures out how to build C++ programs using POSIX threads. +dnl It sets the PTHREAD_LIBS output variable to the threads library and +dnl linker flags, and the PTHREAD_CXXFLAGS output variable to any special +dnl C++ compiler flags that are needed. (The user can also force certain +dnl compiler flags/libs to be tested by setting these environment +dnl variables.) +dnl +dnl Also sets PTHREAD_CXX to any special C++ compiler that is needed for +dnl multi-threaded programs (defaults to the value of CXX otherwise). +dnl (This is necessary on AIX to use the special xlC_r compiler alias.) +dnl +dnl NOTE: You are assumed to not only compile your program with these +dnl flags, but also link it with them as well. e.g. you should link +dnl with $PTHREAD_CXX $CXXFLAGS $PTHREAD_CXXFLAGS $LDFLAGS ... $PTHREAD_LIBS +dnl $LIBS +dnl +dnl If you are only building threads programs, you may wish to use +dnl these variables in your default LIBS, CXXFLAGS, and CXX: +dnl +dnl LIBS="$PTHREAD_LIBS $LIBS" +dnl CXXFLAGS="$CXXFLAGS $PTHREAD_CXXFLAGS" +dnl CXX="$PTHREAD_CXX" +dnl +dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute +dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to +dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +dnl +dnl ACTION-IF-FOUND is a list of shell commands to run if a threads +dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to +dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the +dnl default action will define HAVE_PTHREAD. +dnl +dnl Please let the authors know if this macro fails on any platform, or +dnl if you have any other suggestions or comments. This macro was based +dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with +dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros +dnl posted by Alejandro Forero Cuervo to the autoconf macro repository. +dnl We are also grateful for the helpful feedback of numerous users. +dnl +dnl @category InstalledPackages +dnl @author Steven G. Johnson <stevenj@alum.mit.edu> +dnl @version 2006-05-29 +dnl @license GPLWithACException + +AC_DEFUN([ACX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_SAVE +AC_LANG(C++) +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CXXFLAGS" != x; then + save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS $PTHREAD_CXXFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CXXFLAGS=$PTHREAD_CXXFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) + AC_MSG_RESULT($acx_pthread_ok) + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CXXFLAGS="" + fi + LIBS="$save_LIBS" + CXXFLAGS="$save_CXXFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +# CS: On GNU/Linux with gcc both -pthread and -lpthread are valid. +# However, libtool links libraries with -nostdlib which results in +# -pthread being stripped from the linker command line. To resolve +# this we move pthread from after -mthreads to after pthreads. +# +acx_pthread_flags="pthreads pthread none -Kthread -kthread lthread -pthread -pthreads -mthreads --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CXXFLAGS="$flag" + ;; + + pthread-config) + AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) + if test x"$acx_pthread_config" = xno; then continue; fi + PTHREAD_CXXFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CXXFLAGS="$CXXFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CXXFLAGS="$CXXFLAGS $PTHREAD_CXXFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + # + AC_TRY_LINK([#include <pthread.h>], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0);], + [acx_pthread_ok=yes]) + + LIBS="$save_LIBS" + CXXFLAGS="$save_CXXFLAGS" + + AC_MSG_RESULT($acx_pthread_ok) + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CXXFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS $PTHREAD_CXXFLAGS" + +dnl # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. +dnl AC_MSG_CHECKING([for joinable pthread attribute]) +dnl attr_name=unknown +dnl for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do +dnl AC_TRY_LINK([#include <pthread.h>], [int attr=$attr; return attr;], +dnl [attr_name=$attr; break]) +dnl done +dnl AC_MSG_RESULT($attr_name) +dnl if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then +dnl AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, +dnl [Define to necessary symbol if this constant +dnl uses a non-standard name on your system.]) +dnl fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + AC_MSG_RESULT(${flag}) + if test "x$flag" != xno; then + PTHREAD_CXXFLAGS="$flag $PTHREAD_CXXFLAGS" + fi + + LIBS="$save_LIBS" + CXXFLAGS="$save_CXXFLAGS" + +dnl # More AIX lossage: must compile with xlC_r +dnl if test x"$GXX" != xyes; then +dnl AC_CHECK_PROGS(PTHREAD_CXX, xlC_r, ${CXX}) +dnl else +dnl PTHREAD_CXX=$CXX +dnl fi + +else + PTHREAD_CXX="$CXX" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CXXFLAGS) +AC_SUBST(PTHREAD_CXX) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) + : +else + acx_pthread_ok=no + $2 +fi +AC_LANG_RESTORE +])dnl ACX_PTHREAD diff --git a/m4/database.m4 b/m4/database.m4 new file mode 100644 index 0000000..d49c7d2 --- /dev/null +++ b/m4/database.m4 @@ -0,0 +1,41 @@ +dnl file : m4/database.m4 +dnl author : Boris Kolpackov <boris@codesynthesis.com> +dnl copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +dnl license : GNU GPL v2; see accompanying LICENSE file +dnl +dnl DATABASE +dnl +AC_DEFUN([DATABASE], [ +database=none + +AC_MSG_CHECKING([for database to use]) + +AC_ARG_WITH( + [database], + [AC_HELP_STRING([--with-database=db], + [database to use for tests; valid values are: 'mysql'])], + [case $withval in + no | yes) + AC_MSG_RESULT([]) + AC_MSG_ERROR([no database specified in the --with-database option]) + ;; + mysql) + database=mysql + AC_DEFINE([DATABASE_MYSQL], [1], [Using MySQL.]) + ;; + *) + AC_MSG_RESULT([]) + AC_MSG_ERROR([unknown database $withval]) + ;; + esac], + [ + AC_MSG_RESULT([]) + AC_MSG_ERROR([no database specified with the --with-database option]) + ]) + +AC_MSG_RESULT([$database]) +AC_SUBST([database]) + +AM_CONDITIONAL([DATABASE_MYSQL], [test x$database = xmysql]) + +])dnl diff --git a/m4/libodb-mysql.m4 b/m4/libodb-mysql.m4 new file mode 100644 index 0000000..13e3ff3 --- /dev/null +++ b/m4/libodb-mysql.m4 @@ -0,0 +1,84 @@ +dnl file : m4/libodb-mysql.m4 +dnl author : Boris Kolpackov <boris@codesynthesis.com> +dnl copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +dnl license : GNU GPL v2; see accompanying LICENSE file +dnl +dnl LIBODB_MYSQL([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +dnl +dnl +AC_DEFUN([LIBODB_MYSQL], [ +libodb_mysql_found=no + +AC_ARG_WITH( + [libodb-mysql], + [AC_HELP_STRING([--with-libodb-mysql=DIR],[location of libodb-mysql build directory])], + [libodb_mysql_dir=${withval}], + [libodb_mysql_dir=]) + +AC_MSG_CHECKING([for libodb-mysql]) + +# If libodb_mysql_dir was given, add the necessary preprocessor and +# linker flags. +# +if test x"$libodb_mysql_dir" != x; then + save_CPPFLAGS="$CPPFLAGS" + save_LDFLAGS="$LDFLAGS" + + AS_SET_CATFILE([abs_libodb_mysql_dir], [$ac_pwd], [$libodb_mysql_dir]) + + CPPFLAGS="$CPPFLAGS -I$abs_libodb_mysql_dir" + LDFLAGS="$LDFLAGS -L$abs_libodb_mysql_dir/odb/mysql" +fi + +save_LIBS="$LIBS" +LIBS="-lodb-mysql $LIBS" + +CXX_LIBTOOL_LINK_IFELSE( +AC_LANG_SOURCE([[ +#include <odb/mysql/exceptions.hxx> + +void +f () +{ +} + +const char* +g () +{ + try + { + f (); + } + catch (const odb::mysql::database_exception& e) + { + return e.what (); + } + return 0; +} + +int +main () +{ + const char* m (g ()); + return m != 0; +} +]]), +[libodb_mysql_found=yes]) + +if test x"$libodb_mysql_found" = xno; then + LIBS="$save_LIBS" + + if test x"$libodb_mysql_dir" != x; then + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + fi +fi + +if test x"$libodb_mysql_found" = xyes; then + AC_MSG_RESULT([yes]) + $1 +else + AC_MSG_RESULT([no]) + $2 +fi +])dnl diff --git a/m4/libodb.m4 b/m4/libodb.m4 new file mode 100644 index 0000000..a205afd --- /dev/null +++ b/m4/libodb.m4 @@ -0,0 +1,83 @@ +dnl file : m4/libodb.m4 +dnl author : Boris Kolpackov <boris@codesynthesis.com> +dnl copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +dnl license : GNU GPL v2; see accompanying LICENSE file +dnl +dnl LIBODB([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +dnl +dnl +AC_DEFUN([LIBODB], [ +libodb_found=no + +AC_ARG_WITH( + [libodb], + [AC_HELP_STRING([--with-libodb=DIR],[location of libodb build directory])], + [libodb_dir=${withval}], + [libodb_dir=]) + +AC_MSG_CHECKING([for libodb]) + +# If libodb_dir was given, add the necessary preprocessor and linker flags. +# +if test x"$libodb_dir" != x; then + save_CPPFLAGS="$CPPFLAGS" + save_LDFLAGS="$LDFLAGS" + + AS_SET_CATFILE([abs_libodb_dir], [$ac_pwd], [$libodb_dir]) + + CPPFLAGS="$CPPFLAGS -I$abs_libodb_dir" + LDFLAGS="$LDFLAGS -L$abs_libodb_dir/odb" +fi + +save_LIBS="$LIBS" +LIBS="-lodb $LIBS" + +CXX_LIBTOOL_LINK_IFELSE( +AC_LANG_SOURCE([[ +#include <odb/exception.hxx> + +void +f () +{ +} + +const char* +g () +{ + try + { + f (); + } + catch (const odb::exception& e) + { + return e.what (); + } + return 0; +} + +int +main () +{ + const char* m (g ()); + return m != 0; +} +]]), +[libodb_found=yes]) + +if test x"$libodb_found" = xno; then + LIBS="$save_LIBS" + + if test x"$libodb_dir" != x; then + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + fi +fi + +if test x"$libodb_found" = xyes; then + AC_MSG_RESULT([yes]) + $1 +else + AC_MSG_RESULT([no]) + $2 +fi +])dnl diff --git a/m4/libtool-link.m4 b/m4/libtool-link.m4 new file mode 100644 index 0000000..229b270 --- /dev/null +++ b/m4/libtool-link.m4 @@ -0,0 +1,31 @@ +dnl file : m4/libtool-link.m4 +dnl author : Boris Kolpackov <boris@codesynthesis.com> +dnl copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +dnl license : GNU GPL v2; see accompanying LICENSE file +dnl +dnl +dnl CXX_LIBTOOL_LINK_IFELSE (input, [action-if-true], [action-if-false]) +dnl +dnl Similar to AC_LINK_IFELSE except it uses libtool to perform the +dnl linking and it does this using the C++ compiler. +dnl +AC_DEFUN([CXX_LIBTOOL_LINK_IFELSE],[ +AC_LANG_SAVE +save_CXX="$CXX" +CXX="./libtool --tag=CXX --mode=link $CXX -no-install" +AC_LANG(C++) + +if test -d .libs; then + delete_libs_dir=no +else + delete_libs_dir=yes +fi + +AC_LINK_IFELSE([$1], [$2], [$3]) + +if test x"$delete_libs_dir" != xyes; then + rm -rf .libs +fi + +CXX="$save_CXX" +AC_LANG_RESTORE])dnl diff --git a/m4/mysql.m4 b/m4/mysql.m4 new file mode 100644 index 0000000..b1a9d6a --- /dev/null +++ b/m4/mysql.m4 @@ -0,0 +1,270 @@ +dnl file : m4/mysql.m4 +dnl author : Boris Kolpackov <boris@codesynthesis.com> +dnl copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +dnl license : GNU GPL v2; see accompanying LICENSE file +dnl +dnl MYSQL +dnl +AC_DEFUN([MYSQL], [ + +# Client. +# +AC_MSG_CHECKING([for mysql client program]) +AC_ARG_WITH( + [mysql-client], + [AC_HELP_STRING([--with-mysql-client=path], [MySQL client program path (mysql by default)])], + [case $withval in + yes) + mysql_client=mysql + ;; + no) + AC_MSG_RESULT([]) + AC_MSG_ERROR([need mysql client to run the tests]) + ;; + *) + mysql_client=$withval + ;; + esac], + [mysql_client=mysql]) + +$mysql_client --version 2>/dev/null 1>&2 + +if test x"$?" = x0; then + AC_MSG_RESULT([$mysql_client]) +else + AC_MSG_RESULT([no]) + AC_MSG_ERROR([mysql client is not found; consider using --with-mysql-client=PATH]) +fi + +# User. +# +AC_MSG_CHECKING([for mysql database user]) +AC_ARG_WITH( + [mysql-user], + [AC_HELP_STRING([--with-mysql-user=login], [MySQL database user (odb_test by default)])], + [case $withval in + yes) + mysql_user=odb_test + mysql_user_set=yes + ;; + no) + mysql_user_set=no + ;; + *) + mysql_user=$withval + mysql_user_set=yes + ;; + esac], + [mysql_user=odb_test + mysql_user_set=yes]) + +if test x$mysql_user_set = xyes; then + AC_MSG_RESULT(['$mysql_user']) +else + AC_MSG_RESULT([none]) +fi + +# Password. +# +AC_MSG_CHECKING([for mysql database password]) +AC_ARG_WITH( + [mysql-password], + [AC_HELP_STRING([--with-mysql-password=login], [MySQL database password (no password by default)])], + [case $withval in + yes) + mysql_password= + mysql_password_set=yes + ;; + no) + mysql_password_set=no + ;; + *) + mysql_password=$withval + mysql_password_set=yes + ;; + esac], + [mysql_password_set=no]) + +if test x$mysql_password_set = xyes; then + AC_MSG_RESULT(['$mysql_password']) +else + AC_MSG_RESULT([none]) +fi + +# Database name. +# +AC_MSG_CHECKING([for mysql database name]) +AC_ARG_WITH( + [mysql-db], + [AC_HELP_STRING([--with-mysql-db=name], [MySQL database name (odb_test by default). Note that all data in this database WILL BE LOST!])], + [case $withval in + yes) + mysql_db=odb_test + mysql_db_set=yes + ;; + no) + mysql_db_set=no + ;; + *) + mysql_db=$withval + mysql_db_set=yes + ;; + esac], + [mysql_db=odb_test + mysql_db_set=yes]) + +if test x$mysql_db_set = xyes; then + AC_MSG_RESULT(['$mysql_db']) +else + AC_MSG_RESULT([none]) +fi + +# Host. +# +AC_MSG_CHECKING([for mysql database host]) +AC_ARG_WITH( + [mysql-host], + [AC_HELP_STRING([--with-mysql-host=host], [MySQL database host (localhost by default)])], + [case $withval in + yes) + mysql_host=localhost + mysql_host_set=yes + ;; + no) + mysql_host_set=no + ;; + *) + mysql_host=$withval + mysql_host_set=yes + ;; + esac], + [mysql_host_set=no]) + +if test x$mysql_host_set = xyes; then + AC_MSG_RESULT(['$mysql_host']) +else + AC_MSG_RESULT([localhost]) +fi + +# Port. +# +AC_MSG_CHECKING([for mysql database port]) +AC_ARG_WITH( + [mysql-port], + [AC_HELP_STRING([--with-mysql-port=port], [MySQL database port (standard MySQL port by default)])], + [case $withval in + yes) + mysql_port=0 + mysql_port_set=yes + ;; + no) + mysql_port_set=no + ;; + *) + mysql_port=$withval + mysql_port_set=yes + ;; + esac], + [mysql_port_set=no]) + +if test x$mysql_port_set = xyes; then + AC_MSG_RESULT(['$mysql_port']) +else + AC_MSG_RESULT([default]) +fi + +# Socket. +# +AC_MSG_CHECKING([for mysql database socket]) +AC_ARG_WITH( + [mysql-socket], + [AC_HELP_STRING([--with-mysql-socket=socket], [MySQL database socket (standard MySQL socket by default)])], + [case $withval in + yes) + mysql_socket= + mysql_socket_set=yes + ;; + no) + mysql_socket_set=no + ;; + *) + mysql_socket=$withval + mysql_socket_set=yes + ;; + esac], + [mysql_socket_set=no]) + +if test x$mysql_socket_set = xyes; then + AC_MSG_RESULT(['$mysql_socket']) +else + AC_MSG_RESULT([default]) +fi + +# Create options file. +# +AC_CONFIG_COMMANDS([db.options], + [ + rm -f db.options + echo '#! /bin/sh' >db-driver + + if test x$mysql_user_set = xyes; then + echo "--user '$mysql_user'" >>db.options + echo 'opt="$opt --user='"$mysql_user"'"' >>db-driver + fi + + if test x$mysql_password_set = xyes; then + echo "--password '$mysql_password'" >>db.options + echo 'opt="$opt --password='"$mysql_password"'"' >>db-driver + fi + + if test x$mysql_db_set = xyes; then + echo "--database '$mysql_db'" >>db.options + echo 'opt="$opt --database='"$mysql_db"'"' >>db-driver + fi + + if test x$mysql_host_set = xyes; then + echo "--host '$mysql_host'" >>db.options + echo 'opt="$opt --host='"$mysql_host"'"' >>db-driver + fi + + if test x$mysql_port_set = xyes; then + echo "--port '$mysql_port'" >>db.options + echo 'opt="$opt --port='"$mysql_port"'"' >>db-driver + fi + + if test x$mysql_socket_set = xyes; then + echo "--socket '$mysql_socket'" >>db.options + echo 'opt="$opt --socket='"$mysql_socket"'"' >>db-driver + fi + + echo 'if test x$[]1 != x; then' >>db-driver + echo " exec $mysql_client "'$opt <$[]1' >>db-driver + echo "else" >>db-driver + echo " exec $mysql_client "'$opt' >>db-driver + echo "fi" >>db-driver + + chmod +x db-driver + ], + [ + mysql_client="$mysql_client" + + mysql_user="$mysql_user" + mysql_user_set="$mysql_user_set" + + mysql_password="$mysql_password" + mysql_password_set="$mysql_password_set" + + mysql_db="$mysql_db" + mysql_db_set="$mysql_db_set" + + mysql_host="$mysql_host" + mysql_host_set="$mysql_host_set" + + mysql_port="$mysql_port" + mysql_port_set="$mysql_port_set" + + mysql_socket="$mysql_socket" + mysql_socket_set="$mysql_socket_set" + ]) + +])dnl diff --git a/m4/odb.m4 b/m4/odb.m4 new file mode 100644 index 0000000..b632f8c --- /dev/null +++ b/m4/odb.m4 @@ -0,0 +1,45 @@ +dnl file : m4/odb.m4 +dnl author : Boris Kolpackov <boris@codesynthesis.com> +dnl copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +dnl license : GNU GPL v2; see accompanying LICENSE file +dnl +dnl ODB_COMPILER([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +dnl +AC_DEFUN([ODB_COMPILER], [ +odb_found=no + +AC_ARG_VAR([ODB],[ODB compiler command]) +AC_ARG_VAR([ODBFLAGS],[ODB compiler flags]) +AC_ARG_VAR([ODBCPPFLAGS],[ODB-specific C++ preprocessor flags]) + +AC_ARG_WITH( + [odb], + [AC_HELP_STRING([--with-odb=DIR],[location of odb build directory])], + [odb_dir=${withval}], + [odb_dir=]) + +AC_MSG_CHECKING([for odb]) + +save_ODB="$ODB" + +if test x"$ODB" = x; then + if test x"$odb_dir" != x; then + AS_SET_CATFILE([abs_odb_dir], [$ac_pwd], [$odb_dir]) + ODB="$abs_odb_dir/odb/odb" + else + ODB=odb + fi +fi + +$ODB --version 2>/dev/null 1>&2 + +if test x"$?" = x0; then + AC_MSG_RESULT([$ODB]) + $1 +else + AC_MSG_RESULT([no]) + ODB="$save_ODB" + $2 +fi + +])dnl diff --git a/m4/threads.m4 b/m4/threads.m4 new file mode 100644 index 0000000..ea547c0 --- /dev/null +++ b/m4/threads.m4 @@ -0,0 +1,61 @@ +dnl file : m4/threads.m4 +dnl author : Boris Kolpackov <boris@codesynthesis.com> +dnl copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +dnl license : GNU GPL v2; see accompanying LICENSE file +dnl +AC_DEFUN([THREADS],[ + +threads_thread_keyword=no + +AC_ARG_ENABLE( + [threads], + AS_HELP_STRING([--disable-threads], [disable threads (enabled by default)]), + [AS_IF([test x"$enableval" = xno], [threads=none], [threads=check])], + [threads=check]) + +# If thread support is not disabled by the user, figure out what we can use. +# +if test x$threads = xcheck; then + case $host_os in + windows* | mingw*) + case $host_os in + mingw*) + CXXFLAGS="$CXXFLAGS -mthreads" + ;; + esac + threads=win32 + ;; + *) + ACX_PTHREAD + + if test x$acx_pthread_ok = xyes; then + threads=posix + LIBS="$LIBS $PTHREAD_LIBS" + CXXFLAGS="$CXXFLAGS $PTHREAD_CXXFLAGS" + + # Check if we can use the __thread keyword. + # + AC_MSG_CHECKING([for __thread keyword]) + + CXX_LIBTOOL_LINK_IFELSE( + AC_LANG_SOURCE([[ + __thread int tls_var; + + int + main () + { + tls_var = 0; + } + ]]), + [threads_thread_keyword=yes]) + + AC_MSG_RESULT([$threads_thread_keyword]) + fi + ;; + esac +fi + +if test x$threads = xcheck; then + AC_MSG_ERROR([thread support not available; use --disable-threads to force single-threaded mode]) +fi +])dnl diff --git a/makefile b/makefile new file mode 100644 index 0000000..f82f6ae --- /dev/null +++ b/makefile @@ -0,0 +1,49 @@ +# file : makefile +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +# license : GNU GPL; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))build/bootstrap.make + +dirs := template +dist_dirs := $(dirs) +#dist_dirs := $(filterout $(dirs),template) + +default := $(out_base)/ +dist := $(out_base)/.dist +test := $(out_base)/.test +clean := $(out_base)/.clean + +$(default): $(addprefix $(out_base)/,$(addsuffix /,$(dirs))) + +$(dist): name := examples +$(dist): export dirs := $(dist_dirs) +$(dist): data_dist := GPLv2 LICENSE README NEWS version tester.bat \ +mysql-driver.bat mysql.options +$(dist): exec_dist := bootstrap tester +$(dist): export extra_dist := $(data_dist) $(exec_dist) test.bat \ +$(call vc9slns,$(name)) $(call vc10slns,$(name)) +$(dist): export version = $(shell cat $(src_root)/version) + +$(dist): $(addprefix $(out_base)/,$(addsuffix /.dist,$(dist_dirs))) + $(call dist-data,$(data_dist)) + $(call dist-exec,$(exec_dist)) + $(call dist-dir,m4) + $(call meta-automake) + $(call meta-autoconf) + $(call meta-vc9slns,$(name)) + $(call meta-vc10slns,$(name)) + $(call meta-vctest,$(name)-mysql-vc10.sln,test.bat) + +$(test): $(addprefix $(out_base)/,$(addsuffix /.test,$(dirs))) +$(clean): $(addprefix $(out_base)/,$(addsuffix /.clean,$(dirs))) + +$(call include,$(bld_root)/dist.make) +$(call include,$(bld_root)/meta/vc9sln.make) +$(call include,$(bld_root)/meta/vc10sln.make) +$(call include,$(bld_root)/meta/vctest.make) +$(call include,$(bld_root)/meta/automake.make) +$(call include,$(bld_root)/meta/autoconf.make) + +$(foreach d,$(dirs),$(call import,$(src_base)/$d/makefile)) + diff --git a/mysql-driver.bat b/mysql-driver.bat new file mode 100644 index 0000000..f246e7b --- /dev/null +++ b/mysql-driver.bat @@ -0,0 +1,48 @@ +@echo off +rem file : mysql-driver.bat +rem author : Boris Kolpackov <boris@codesynthesis.com> +rem copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +rem license : GNU GPL v2; see accompanying LICENSE file + +rem +rem mysql-driver.bat sql-file +rem +rem Run the mysql client on the SQL file specified. Adjust the +rem option below to match your MySQL setup. +rem + +setlocal + +set "options=%MYSQL_OPTIONS%" +set "options=%options% --user=odb_test" +set "options=%options% --database=odb_test" +rem set "options=%options% --password=" +rem set "options=%options% --host=" +rem set "options=%options% --post=" +rem set "options=%options% --socket=" + +set "mysql=%MYSQL_CLIENT%" + +if "_%mysql%_" == "__" set "mysql=mysql" + +if "_%1_" == "__" ( + echo no sql file specified + goto usage +) + +%mysql% %options% < %1 + +if errorlevel 1 goto error +goto end + +:usage +echo. +echo usage: mysql-driver.bat sql-file +echo. + +:error +endlocal +exit /b 1 + +:end +endlocal diff --git a/mysql.options b/mysql.options new file mode 100644 index 0000000..fe79a7c --- /dev/null +++ b/mysql.options @@ -0,0 +1,10 @@ +# Sample MySQL options file used to run the tests. Adjust to +# match your MySQL setup. +# + +--user odb_test +--database odb_test +# --password +# --host +# --port +# --socket diff --git a/template/Makefile.am b/template/Makefile.am new file mode 100644 index 0000000..4c76f3e --- /dev/null +++ b/template/Makefile.am @@ -0,0 +1,28 @@ +# file : template/Makefile.am +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : not copyrighted - public domain + +EXTRA_DIST = __file__(extra_dist) + +noinst_PROGRAMS = driver +driver_SOURCES = driver.cxx database.hxx __path__(extra_sources) __path__(extra_headers) + +if DATABASE_MYSQL +AM_CPPFLAGS = -DDATABASE_MYSQL +endif + +TESTS=$(top_builddir)/tester +TESTS_ENVIRONMENT=top_builddir=$(top_builddir); export top_builddir; + +# ODB compilation. +# +driver_SOURCES += __path__(odb_header_stem).hxx +nodist_driver_SOURCES = __path__(odb_header_stem)-odb.cxx +BUILT_SOURCES = __path__(odb_header_stem)-odb.hxx +CLEANFILES = __path__(odb_header_stem)-odb.hxx __path__(odb_header_stem)-odb.ixx __path__(odb_header_stem)-odb.cxx + +ODB = @ODB@ +ODBFLAGS = @ODBFLAGS@ + +__path__(odb_header_stem)-odb.hxx: __path__(odb_header_stem).hxx + $(ODB) $(ODBCPPFLAGS) $(CPPFLAGS) $(ODBFLAGS) __value__(odb_options) $< diff --git a/template/database.hxx b/template/database.hxx new file mode 100644 index 0000000..624bf1b --- /dev/null +++ b/template/database.hxx @@ -0,0 +1,41 @@ +// file : hello/database.hxx +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : not copyrighted - public domain + +// +// Create concrete database based on the DATABASE_* macros. +// + +#include <string> +#include <memory> // std::auto_ptr +#include <cstdlib> // std::exit +#include <iostream> + +#include <odb/database.hxx> + +#if defined(DATABASE_MYSQL) +# include <odb/mysql/database.hxx> +#endif + +inline std::auto_ptr<odb::database> +create_database (int& argc, char* argv[]) +{ + using namespace std; + using namespace odb; + + if (argc > 1 && argv[1] == string ("--help")) + { + cerr << "Usage: " << argv[0] << " [options]" << endl + << "Options:" << endl; + +#if defined(DATABASE_MYSQL) + mysql::database::print_usage (cerr); +#endif + + exit (0); + } + +#if defined(DATABASE_MYSQL) + return auto_ptr<database> (new mysql::database (argc, argv)); +#endif +} diff --git a/template/driver.cxx b/template/driver.cxx new file mode 100644 index 0000000..e9dab52 --- /dev/null +++ b/template/driver.cxx @@ -0,0 +1,39 @@ +// file : hello/driver.cxx +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : not copyrighted - public domain + +#include <memory> // std::auto_ptr +#include <iostream> + +#include <odb/database.hxx> +#include <odb/transaction.hxx> + +#include "database.hxx" // create_database + +#include "person.hxx" +#include "person-odb.hxx" + +using namespace std; +using namespace odb; + +int +main (int argc, char* argv[]) +{ + try + { + auto_ptr<database> db (create_database (argc, argv)); + + { + person p ("John", "Doe", 21); + + transaction t (db->begin_transaction ()); + db->persist (p); + t.commit (); + } + } + catch (const odb::exception& e) + { + cerr << e.what () << endl; + return 1; + } +} diff --git a/template/makefile b/template/makefile new file mode 100644 index 0000000..887385f --- /dev/null +++ b/template/makefile @@ -0,0 +1,116 @@ +# file : template/makefile +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +# license : GNU GPL v2; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../build/bootstrap.make + +cxx_tun := driver.cxx +odb_hdr := person.hxx +cxx_obj := $(addprefix $(out_base)/,$(cxx_tun:.cxx=.o) $(odb_hdr:.hxx=-odb.o)) +cxx_od := $(cxx_obj:.o=.o.d) + +driver := $(out_base)/driver +dist := $(out_base)/.dist +test := $(out_base)/.test +clean := $(out_base)/.clean + +# Import. +# +$(call import,\ + $(scf_root)/import/odb/stub.make,\ + odb: odb,odb-rules: odb_rules) + +$(call import,\ + $(scf_root)/import/libodb/stub.make,\ + l: odb.l,cpp-options: odb.l.cpp-options) + +ifdef db_id +$(call import,\ + $(scf_root)/import/libodb-$(db_id)/stub.make,\ + l: odb_db.l,cpp-options: odb_db.l.cpp-options) +endif + +ifeq ($(odb_db.l.cpp-options),) +odb_db.l.cpp-options := $(out_base)/.unbuildable +endif + +# Build. +# +$(driver): $(cxx_obj) $(odb_db.l) $(odb.l) +$(cxx_obj) $(cxx_od): cpp_options := -I$(out_base) +$(cxx_obj) $(cxx_od): $(odb.l.cpp-options) $(odb_db.l.cpp-options) + +ifeq ($(db_id),mysql) +$(cxx_obj) $(cxx_od): cpp_options += -DDATABASE_MYSQL +endif + +genf := $(addprefix $(odb_hdr:.hxx=-odb),.hxx .ixx .cxx) $(odb_hdr:.hxx=.sql) +gen := $(addprefix $(out_base)/,$(genf)) + +$(gen): $(odb) +$(gen): odb := $(odb) +$(gen) $(dist): export odb_options += --database $(db_id) --generate-schema +$(gen): cpp_options := -I$(out_base) +$(gen): $(odb.l.cpp-options) + +$(call include-dep,$(cxx_od),$(cxx_obj),$(gen)) + +# Alias for default target. +# +$(out_base)/: $(driver) + +# Dist +# +name := $(notdir $(src_base)) + +$(dist): db_id := @database@ +$(dist): sources := $(cxx_tun) +$(dist): headers := $(odb_hdr) +$(dist): export name := $(name) +$(dist): export odb_header_stem := $(basename $(odb_hdr)) +$(dist): export extra_dist := $(call vc9projs,$(name)) $(call vc10projs,$(name)) +$(dist): + $(call dist-data,$(sources) $(headers) database.hxx) + $(call meta-automake,../template/Makefile.am) + $(call meta-vc9projs,../template/template,$(name)) + $(call meta-vc10projs,../template/template,$(name)) + +# Test. +# +$(test): schema := $(src_base)/$(basename $(odb_hdr)).sql +$(test): $(driver) + $(call message,sql $$1,$(dcf_root)/db-driver $$1,$(schema)) + $(call message,test $<,$< --options-file $(dcf_root)/db.options) + +# Clean. +# +$(clean): \ + $(driver).o.clean \ + $(addsuffix .cxx.clean,$(cxx_obj)) \ + $(addsuffix .cxx.clean,$(cxx_od)) \ + $(addprefix $(out_base)/,$(odb_hdr:.hxx=-odb.cxx.hxx.clean)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver $(genf) +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/dist.make) +$(call include,$(bld_root)/meta/vc9proj.make) +$(call include,$(bld_root)/meta/vc10proj.make) +$(call include,$(bld_root)/meta/automake.make) + +$(call include,$(odb_rules)) +$(call include,$(bld_root)/cxx/cxx-d.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/o-e.make) + diff --git a/template/person.hxx b/template/person.hxx new file mode 100644 index 0000000..455bed8 --- /dev/null +++ b/template/person.hxx @@ -0,0 +1,60 @@ +// file : template/person.hxx +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : not copyrighted - public domain + +#ifndef PERSON_HXX +#define PERSON_HXX + +#include <string> + +#include <odb/core.hxx> + +#pragma db object +struct person +{ + person (const std::string& first, + const std::string& last, + unsigned short age) + : first_ (first), last_ (last), age_ (age) + { + } + + const std::string& + first () const + { + return first_; + } + + const std::string& + last () const + { + return last_; + } + + unsigned short + age () const + { + return age_; + } + +public: + unsigned long + id () const + { + return id_; + } + +private: + friend class odb::access; + + person () {} + + #pragma db id auto + unsigned long id_; + + std::string first_; + std::string last_; + unsigned short age_; +}; + +#endif // PERSON_HXX diff --git a/template/template-vc10.vcxproj b/template/template-vc10.vcxproj new file mode 100644 index 0000000..45cf0c6 --- /dev/null +++ b/template/template-vc10.vcxproj @@ -0,0 +1,174 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{__uuid__()}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>__value__(name)</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>true</LinkIncremental> + <OutDir>$(Configuration)\</OutDir> + <TargetName>driver</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>true</LinkIncremental> + <OutDir>$(Platform)\$(Configuration)\</OutDir> + <TargetName>driver</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(Configuration)\</OutDir> + <TargetName>driver</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(Platform)\$(Configuration)\</OutDir> + <TargetName>driver</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;__upcase__(database_)__upcase__(__value__(database));%(PreprocessorDefinitions)</PreprocessorDefinitions> + <DisableSpecificWarnings>4068;4355;4800;4290;%(DisableSpecificWarnings)</DisableSpecificWarnings> + </ClCompile> + <Link> + <AdditionalDependencies>odb-__value__(database)-d.lib;odb-d.lib;%(AdditionalDependencies)</AdditionalDependencies> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;__upcase__(database_)__upcase__(__value__(database));%(PreprocessorDefinitions)</PreprocessorDefinitions> + <DisableSpecificWarnings>4068;4355;4800;4290;%(DisableSpecificWarnings)</DisableSpecificWarnings> + </ClCompile> + <Link> + <AdditionalDependencies>odb-__value__(database)-d.lib;odb-d.lib;%(AdditionalDependencies)</AdditionalDependencies> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;__upcase__(database_)__upcase__(__value__(database));%(PreprocessorDefinitions)</PreprocessorDefinitions> + <DisableSpecificWarnings>4068;4355;4800;4290;%(DisableSpecificWarnings)</DisableSpecificWarnings> + </ClCompile> + <Link> + <AdditionalDependencies>odb-__value__(database).lib;odb.lib;%(AdditionalDependencies)</AdditionalDependencies> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;__upcase__(database_)__upcase__(__value__(database));%(PreprocessorDefinitions)</PreprocessorDefinitions> + <DisableSpecificWarnings>4068;4355;4800;4290;%(DisableSpecificWarnings)</DisableSpecificWarnings> + </ClCompile> + <Link> + <AdditionalDependencies>odb-__value__(database).lib;odb.lib;%(AdditionalDependencies)</AdditionalDependencies> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + </ItemDefinitionGroup> + <ItemGroup> +__custom_build_entry__( +__path__(odb_header_stem).hxx, +odb __path__(odb_header_stem).hxx, +odb.exe __xml__(__shell_quotes__(m4_patsubst(__value__(odb_options), @database@, __value__(database)))) __path__(odb_header_stem).hxx, +__path__(odb_header_stem)-odb.hxx;__path__(odb_header_stem)-odb.ixx;__path__(odb_header_stem)-odb.cxx) + </ItemGroup> + <ItemGroup> +__header_entry__(__path__(odb_header_stem)-odb.hxx) +__header_entry__(__path__(odb_header_stem)-odb.ixx) +__header_entries__(database.hxx) +__header_entries__(extra_headers) + </ItemGroup> + <ItemGroup> +__source_entry__(driver.cxx) +__source_entry__(__path__(odb_header_stem)-odb.cxx) +__source_entries__(extra_sources) + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> diff --git a/template/template-vc10.vcxproj.filters b/template/template-vc10.vcxproj.filters new file mode 100644 index 0000000..f754d41 --- /dev/null +++ b/template/template-vc10.vcxproj.filters @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <UniqueIdentifier>{__uuid__()}</UniqueIdentifier> + <Extensions>cxx</Extensions> + </Filter> + <Filter Include="Header Files"> + <UniqueIdentifier>{__uuid__()}</UniqueIdentifier> + <Extensions>h;hxx;ixx;txx</Extensions> + </Filter> + </ItemGroup> + <ItemGroup> +__header_filter_entry__(__path__(odb_header_stem).hxx) +__header_filter_entry__(__path__(odb_header_stem)-odb.hxx) +__header_filter_entry__(__path__(odb_header_stem)-odb.ixx) +__header_filter_entries__(database.hxx) +__header_filter_entries__(extra_headers) + </ItemGroup> + <ItemGroup> +__source_filter_entry__(driver.cxx) +__source_filter_entry__(__path__(odb_header_stem)-odb.cxx) +__source_filter_entries__(extra_sources) + </ItemGroup> +</Project> diff --git a/template/template-vc9.vcproj b/template/template-vc9.vcproj new file mode 100644 index 0000000..f0dadeb --- /dev/null +++ b/template/template-vc9.vcproj @@ -0,0 +1,357 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="__value__(name)" + ProjectGUID="{__uuid__()}" + RootNamespace="__value__(name)" + Keyword="Win32Proj" + TargetFrameworkVersion="196613" + > + <Platforms> + <Platform + Name="Win32" + /> + <Platform + Name="x64" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="1" + CharacterSet="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions="/wd4068 /wd4355 /wd4800 /wd4290" + Optimization="0" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;__upcase__(database_)__upcase__(__value__(database))" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + UsePrecompiledHeader="0" + WarningLevel="3" + DebugInformationFormat="4" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="odb-__value__(database)-d.lib odb-d.lib" + OutputFile="$(OutDir)\driver.exe" + LinkIncremental="2" + GenerateDebugInformation="true" + SubSystem="1" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="1" + CharacterSet="1" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions="/wd4068 /wd4355 /wd4800 /wd4290" + Optimization="2" + EnableIntrinsicFunctions="true" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;__upcase__(database_)__upcase__(__value__(database))" + RuntimeLibrary="2" + EnableFunctionLevelLinking="true" + UsePrecompiledHeader="0" + WarningLevel="3" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="odb-__value__(database).lib odb.lib" + OutputFile="$(OutDir)\driver.exe" + LinkIncremental="1" + GenerateDebugInformation="true" + SubSystem="1" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Debug|x64" + OutputDirectory="$(PlatformName)\$(ConfigurationName)" + IntermediateDirectory="$(PlatformName)\$(ConfigurationName)" + ConfigurationType="1" + CharacterSet="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + TargetEnvironment="3" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions="/wd4068 /wd4355 /wd4800 /wd4290" + Optimization="0" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;__upcase__(database_)__upcase__(__value__(database))" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + UsePrecompiledHeader="0" + WarningLevel="3" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="odb-__value__(database)-d.lib odb-d.lib" + OutputFile="$(OutDir)\driver.exe" + LinkIncremental="2" + GenerateDebugInformation="true" + SubSystem="1" + TargetMachine="17" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|x64" + OutputDirectory="$(PlatformName)\$(ConfigurationName)" + IntermediateDirectory="$(PlatformName)\$(ConfigurationName)" + ConfigurationType="1" + CharacterSet="1" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + TargetEnvironment="3" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions="/wd4068 /wd4355 /wd4800 /wd4290" + Optimization="2" + EnableIntrinsicFunctions="true" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;__upcase__(database_)__upcase__(__value__(database))" + RuntimeLibrary="2" + EnableFunctionLevelLinking="true" + UsePrecompiledHeader="0" + WarningLevel="3" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="odb-__value__(database).lib odb.lib" + OutputFile="$(OutDir)\driver.exe" + LinkIncremental="1" + GenerateDebugInformation="true" + SubSystem="1" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="17" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cxx" + UniqueIdentifier="{__uuid__()}" + > +__source_entry__(driver.cxx) +__source_entry__(__path__(odb_header_stem)-odb.cxx) +__source_entries__(extra_sources) + </Filter> + <Filter + Name="Header Files" + Filter="h;hxx;ixx;txx" + UniqueIdentifier="{__uuid__()}" + > +__file_entry_custom_build__( +__path__(odb_header_stem).hxx, +odb __path__(odb_header_stem).hxx, +odb.exe __xml__(__shell_quotes__(m4_patsubst(__value__(odb_options), @database@, __value__(database)))) __path__(odb_header_stem).hxx, +__path__(odb_header_stem)-odb.hxx;__path__(odb_header_stem)-odb.ixx;__path__(odb_header_stem)-odb.cxx) +__file_entry__(__path__(odb_header_stem)-odb.hxx) +__file_entry__(__path__(odb_header_stem)-odb.ixx) +__file_entries__(database.hxx) +__file_entries__(extra_headers) + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/test.bat b/test.bat new file mode 100644 index 0000000..e367eaf --- /dev/null +++ b/test.bat @@ -0,0 +1,80 @@ +@echo off +rem file : test.bat +rem author : Boris Kolpackov <boris@codesynthesis.com> +rem copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +rem license : GNU GPL v2; see accompanying LICENSE file + +setlocal + +set "tests=__path__(dirs)" +set "confs=__path__(configurations)" +set "plats=__path__(platforms)" +set "topdir=__path__(topdir)\.." +set "failed=" + +if "_%1_" == "__" ( + echo no database specified + goto usage +) + +goto start + +rem +rem %1 - test directory +rem %2 - configuration +rem %3 - platform +rem %4 - database +rem +:run_test + cd %1 + + if "_%3_" == "_Win32_" ( + set "dir=%2" + ) else ( + set "dir=%3\%2" + ) + + if exist %dir%\driver.exe ( + echo %1\%3\%2 + call %topdir%\tester.bat %4 %2 %3 + if errorlevel 1 ( + set "failed=%failed% %1\%3\%2" + ) + ) + + cd .. +goto :eof + +:start + +for %%t in (%tests%) do ( + for %%c in (%confs%) do ( + for %%p in (%plats%) do ( + call :run_test %%t %%c %%p %1 + ) + ) +) + +if not "_%failed%_" == "__" goto error + +echo. +echo ALL EXAMPLES PASSED +echo. +goto end + +:usage +echo. +echo usage: test.bat database +echo. + +:error +if not "_%failed%_" == "__" ( + echo. + for %%t in (%failed%) do echo FAILED: %%t + echo. +) +endlocal +exit /b 1 + +:end +endlocal @@ -0,0 +1,24 @@ +#! /bin/sh + +# file : tester +# author : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +# license : GNU GPL v2; see accompanying LICENSE file + +# +# Run an ODB example. The example driver is in the current directory. +# The data files, if any, are in $srcdir. +# + +schema=`echo *.sql` + +if test -f $schema; then + $top_builddir/db-driver $schema + + if test $? -ne 0; then + exit 1 + fi +fi + +echo ./driver --options-file "$top_builddir/db.options" +./driver --options-file "$top_builddir/db.options" diff --git a/tester.bat b/tester.bat new file mode 100644 index 0000000..28a36de --- /dev/null +++ b/tester.bat @@ -0,0 +1,42 @@ +@echo off +rem file : tester.bat +rem author : Boris Kolpackov <boris@codesynthesis.com> +rem copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +rem license : GNU GPL v2; see accompanying LICENSE file + +rem +rem Run an ODB example. The example directory is the current directory. +rem +rem %1 database +rem %2 configuration, for example, Debug or Release +rem %3 platform, for example Win32 or x64 +rem topdir variable containing the path to top project directory +rem + +setlocal + +if "_%3_" == "_Win32_" ( + set "dir=%2" +) else ( + set "dir=%3\%2" +) + +if exist *.sql ( + for %%f in (*.sql) do ( + call %topdir%\%1-driver.bat %%f + if errorlevel 1 goto error + ) +) + +%dir%\driver.exe --options-file %topdir%\%1.options +if errorlevel 1 goto error + +goto end + +:error +endlocal +exit /b 1 + +:end +endlocal + |