From 069bdeefb04bb236d718d0d6dd19be0a90c8110c Mon Sep 17 00:00:00 2001 From: Packit Service Date: Dec 09 2020 07:49:02 +0000 Subject: Prepare for a new update Reverting patches so we can apply the latest update and changes can be seen in the spec file and sources. --- diff --git a/Makefile.in b/Makefile.in index df431b5..208dd1c 100644 --- a/Makefile.in +++ b/Makefile.in @@ -73,7 +73,7 @@ top_blddir=@abs_builddir@ # Create apu-config script suitable for the install tree apu-config.out: $(APU_CONFIG) - sed 's,^\(location=\).*$$,\1installed,;s,^\(APR_.*_DIR\)=.*,\1="$${libdir}/build",' < $(APU_CONFIG) > $@ + sed 's,^\(location=\).*$$,\1installed,' < $(APU_CONFIG) > $@ install: $(TARGETS) install-modules $(APR_MKDIR) $(DESTDIR)$(includedir) $(DESTDIR)$(libdir)/pkgconfig \ diff --git a/Makefile.in.pkgconf b/Makefile.in.pkgconf deleted file mode 100644 index 208dd1c..0000000 --- a/Makefile.in.pkgconf +++ /dev/null @@ -1,123 +0,0 @@ -# -# Top-level Makefile for APRUTIL -# -CPP = @CPP@ - -# gets substituted into some targets -APRUTIL_MAJOR_VERSION=@APRUTIL_MAJOR_VERSION@ -APRUTIL_DOTTED_VERSION=@APRUTIL_DOTTED_VERSION@ - -srcdir = @srcdir@ -VPATH = @srcdir@ - -INCLUDES = @APRUTIL_PRIV_INCLUDES@ @APR_INCLUDES@ @APRUTIL_INCLUDES@ -APRUTIL_LDFLAGS = @APRUTIL_LDFLAGS@ -APRUTIL_LIBS = @APRUTIL_LIBS@ - -TARGET_LIB = lib@APRUTIL_LIBNAME@.la -INSTALL_SUBDIRS = @APR_ICONV_DIR@ -EXTRA_SOURCE_DIRS = @APR_ICONV_DIR@ -APRUTIL_PCFILE = apr-util-$(APRUTIL_MAJOR_VERSION).pc -APU_CONFIG = apu-$(APRUTIL_MAJOR_VERSION)-config -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ - -APU_MODULES = @APU_MODULES@ -LINK_MODULE = $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) $(LT_LDFLAGS) $(ALL_CFLAGS) $(ALL_LDFLAGS) $(APRUTIL_LDFLAGS) -release $(APRUTIL_MAJOR_VERSION) -module -rpath $(APU_DSO_LIBDIR) -APU_DSO_LIBDIR = @APU_DSO_LIBDIR@ - -LT_VERSION = @APU_LTVERSION@ - -EXTRA_OBJECTS = @EXTRA_OBJECTS@ - -LDADD_dbd_pgsql = @LDADD_dbd_pgsql@ -LDADD_dbd_oracle = @LDADD_dbd_oracle@ -LDADD_dbd_sqlite2 = @LDADD_dbd_sqlite2@ -LDADD_dbd_sqlite3 = @LDADD_dbd_sqlite3@ -LDADD_dbd_mysql = @LDADD_dbd_mysql@ -LDADD_dbd_odbc = @LDADD_dbd_odbc@ -LDADD_dbm_db = @LDADD_dbm_db@ -LDADD_dbm_gdbm = @LDADD_dbm_gdbm@ -LDADD_dbm_ndbm = @LDADD_dbm_ndbm@ -LDADD_ldap = @LDADD_ldap@ -LDADD_crypto_openssl = @LDADD_crypto_openssl@ -LDADD_crypto_nss = @LDADD_crypto_nss@ -LDADD_crypto_commoncrypto = @LDADD_crypto_commoncrypto@ - -TARGETS = $(TARGET_LIB) aprutil.exp apu-config.out $(APU_MODULES) - -# bring in rules.mk for standard functionality -@INCLUDE_RULES@ -@INCLUDE_OUTPUTS@ - -CLEAN_SUBDIRS = test @APR_ICONV_DIR@ - -CLEAN_TARGETS = exports.c export_vars.c aprutil.exp .make.dirs apu-config.out -DISTCLEAN_TARGETS = config.cache config.log config.status libtool \ - include/private/apu_config.h include/private/apu_private.h \ - include/private/apu_select_dbm.h include/apr_ldap.h include/apu.h \ - export_vars.sh $(APU_CONFIG) build/rules.mk include/apu_want.h \ - apr-util.pc build/pkg/pkginfo -EXTRACLEAN_TARGETS = configure aclocal.m4 include/private/apu_config.h.in \ - exports.c build-outputs.mk \ - build/apr_common.m4 build/find_apr.m4 build/install.sh \ - build/config.guess build/config.sub - -prefix=@prefix@ -exec_prefix=@exec_prefix@ -bindir=@bindir@ -libdir=@libdir@ -includedir=@includedir@ -top_srcdir=@abs_srcdir@ -top_blddir=@abs_builddir@ - -# Create apu-config script suitable for the install tree -apu-config.out: $(APU_CONFIG) - sed 's,^\(location=\).*$$,\1installed,' < $(APU_CONFIG) > $@ - -install: $(TARGETS) install-modules - $(APR_MKDIR) $(DESTDIR)$(includedir) $(DESTDIR)$(libdir)/pkgconfig \ - $(DESTDIR)$(libdir) $(DESTDIR)$(bindir) - for f in $(top_srcdir)/include/*.h $(top_blddir)/include/*.h; do \ - $(INSTALL_DATA) $${f} $(DESTDIR)$(includedir); \ - done - $(INSTALL_DATA) apr-util.pc $(DESTDIR)$(libdir)/pkgconfig/$(APRUTIL_PCFILE) - list='$(INSTALL_SUBDIRS)'; for i in $$list; do \ - ( cd $$i ; $(MAKE) DESTDIR=$(DESTDIR) install ); \ - done - $(LIBTOOL) --mode=install $(INSTALL) -m 755 $(TARGET_LIB) $(DESTDIR)$(libdir) - $(INSTALL_DATA) aprutil.exp $(DESTDIR)$(libdir) - $(INSTALL) -m 755 apu-config.out $(DESTDIR)$(bindir)/$(APU_CONFIG) - -$(TARGET_LIB): $(OBJECTS) $(EXTRA_OBJECTS) - $(LINK) @lib_target@ $(EXTRA_OBJECTS) $(ALL_LIBS) $(APRUTIL_LDFLAGS) $(APRUTIL_LIBS) - -install-modules: install-modules-@APU_HAVE_MODULES@ - -install-modules-no: - -install-modules-yes: $(APU_MODULES) - $(APR_MKDIR) $(DESTDIR)$(APU_DSO_LIBDIR) - @for m in $(APU_MODULES); do $(LIBTOOL) $(LT_LTFLAGS) $(LTFLAGS) --mode=install $(INSTALL) -m 755 $$m $(DESTDIR)$(APU_DSO_LIBDIR); done - -exports.c: $(HEADERS) - $(APR_MKEXPORT) $(HEADERS) > $@ - -export_vars.c: $(HEADERS) - $(APR_MKVAREXPORT) $(HEADERS) > $@ - -aprutil.exp: exports.c export_vars.c - @echo "#! lib@APRUTIL_LIBNAME@.so" > $@ - @echo "* This file was AUTOGENERATED at build time." >> $@ - @echo "* Please do not edit by hand." >> $@ - $(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) exports.c | grep "ap_hack_" | sed -e 's/^.*[)]\(.*\);$$/\1/' >> $@ - $(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) export_vars.c | sed -e 's/^\#[^!]*//' | sed -e '/^$$/d' >> $@ - -dox: - doxygen $(top_srcdir)/docs/doxygen.conf - -test: check -check: $(TARGET_LIB) - cd test && $(MAKE) all check - -.PHONY: install-modules install-modules-yes install-modules-no dox test check diff --git a/apr-util.pc.in b/apr-util.pc.in index 405e672..5b146af 100644 --- a/apr-util.pc.in +++ b/apr-util.pc.in @@ -9,6 +9,5 @@ Description: Companion library for APR Version: @APRUTIL_DOTTED_VERSION@ # assume that apr-util requires libapr of same major version Requires: apr-@APRUTIL_MAJOR_VERSION@ -Libs: -L${libdir} -l@APRUTIL_LIBNAME@ @LDADD_ldap@ -Libs.private: @APRUTIL_EXPORT_LIBS@ +Libs: -L${libdir} -l@APRUTIL_LIBNAME@ @LDADD_ldap@ @APRUTIL_EXPORT_LIBS@ Cflags: -I${includedir} diff --git a/apr-util.pc.in.private b/apr-util.pc.in.private deleted file mode 100644 index 5b146af..0000000 --- a/apr-util.pc.in.private +++ /dev/null @@ -1,13 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -APRUTIL_MAJOR_VERSION=@APRUTIL_MAJOR_VERSION@ -includedir=@includedir@ - -Name: APR Utils -Description: Companion library for APR -Version: @APRUTIL_DOTTED_VERSION@ -# assume that apr-util requires libapr of same major version -Requires: apr-@APRUTIL_MAJOR_VERSION@ -Libs: -L${libdir} -l@APRUTIL_LIBNAME@ @LDADD_ldap@ @APRUTIL_EXPORT_LIBS@ -Cflags: -I${includedir} diff --git a/apu-config.in b/apu-config.in index 8dc0c36..82109e5 100644 --- a/apu-config.in +++ b/apu-config.in @@ -24,10 +24,9 @@ APRUTIL_DOTTED_VERSION="@APRUTIL_DOTTED_VERSION@" prefix="@prefix@" exec_prefix="@exec_prefix@" bindir="@bindir@" +libdir="@libdir@" includedir="@includedir@" -libdir=`pkg-config --variable=libdir apr-util-@APRUTIL_MAJOR_VERSION@` - LIBS="@APRUTIL_EXPORT_LIBS@" INCLUDES="@APRUTIL_INCLUDES@" LDFLAGS="@APRUTIL_LDFLAGS@" diff --git a/apu-config.in.pkgconf b/apu-config.in.pkgconf deleted file mode 100644 index 82109e5..0000000 --- a/apu-config.in.pkgconf +++ /dev/null @@ -1,221 +0,0 @@ -#!/bin/sh -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# APR-util script designed to allow easy command line access to APR-util -# configuration parameters. - -APRUTIL_MAJOR_VERSION="@APRUTIL_MAJOR_VERSION@" -APRUTIL_DOTTED_VERSION="@APRUTIL_DOTTED_VERSION@" - -prefix="@prefix@" -exec_prefix="@exec_prefix@" -bindir="@bindir@" -libdir="@libdir@" -includedir="@includedir@" - -LIBS="@APRUTIL_EXPORT_LIBS@" -INCLUDES="@APRUTIL_INCLUDES@" -LDFLAGS="@APRUTIL_LDFLAGS@" -LDAP_LIBS="@LDADD_ldap@" -DBM_LIBS="@LDADD_dbm_db@ @LDADD_dbm_gdbm@ @LDADD_dbm_ndbm@" - -APRUTIL_LIBNAME="@APRUTIL_LIBNAME@" - -APU_SOURCE_DIR="@abs_srcdir@" -APU_BUILD_DIR="@abs_builddir@" -APR_XML_EXPAT_OLD="@APR_XML_EXPAT_OLD@" -APU_DB_VERSION="@apu_db_version@" - -# NOTE: the following line is modified during 'make install': alter with care! -location=@APU_CONFIG_LOCATION@ - -show_usage() -{ - cat << EOF -Usage: apu-$APRUTIL_MAJOR_VERSION-config [OPTION] - -Known values for OPTION are: - --prefix[=DIR] change prefix to DIR - --bindir print location where binaries are installed - --includes print include information - --includedir print location where headers are installed - --ldflags print linker flags - --libs print library information - --avoid-ldap do not include ldap library information with --libs - --ldap-libs print library information to link with ldap - --avoid-dbm do not include DBM library information with --libs - --dbm-libs print additional library information to link with DBM - --srcdir print APR-util source directory - --link-ld print link switch(es) for linking to APR-util - --link-libtool print the libtool inputs for linking to APR-util - --apu-la-file print the path to the .la file, if available - --old-expat indicate if APR-util was built against an old expat - --db-version print the DB version - --version print APR-util's version as a dotted triple - --help print this help - -When linking with libtool, an application should do something like: - APU_LIBS="\`apu-$APRUTIL_MAJOR_VERSION-config --link-libtool --libs\`" -or when linking directly: - APU_LIBS="\`apu-$APRUTIL_MAJOR_VERSION-config --link-ld --libs\`" - -An application should use the results of --includes, and --ldflags in -their build process. -EOF -} - -if test $# -eq 0; then - show_usage - exit 1 -fi - -if test "$location" = "installed"; then - LA_FILE="$libdir/lib${APRUTIL_LIBNAME}.la" -else - LA_FILE="$APU_BUILD_DIR/lib${APRUTIL_LIBNAME}.la" -fi - -flags="" - -while test $# -gt 0; do - # Normalize the prefix. - case "$1" in - -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) optarg= ;; - esac - - case "$1" in - # It is possible for the user to override our prefix. - --prefix=*) - prefix=$optarg - ;; - --prefix) - echo $prefix - exit 0 - ;; - --bindir) - echo $bindir - exit 0 - ;; - --avoid-ldap) - LDAP_LIBS="" - ;; - --avoid-dbm) - DBM_LIBS="" - ;; - --libs) - flags="$flags $LDAP_LIBS $DBM_LIBS $LIBS" - ;; - --ldap-libs) - flags="$flags $LDAP_LIBS" - ;; - --dbm-libs) - flags="$flags $DBM_LIBS" - ;; - --includedir) - if test "$location" = "installed"; then - flags="$includedir" - elif test "$location" = "source"; then - flags="$APU_SOURCE_DIR/include" - else - # this is for VPATH builds - flags="$APU_BUILD_DIR/include $APU_SOURCE_DIR/include" - fi - echo $flags - exit 0 - ;; - --includes) - if test "$location" = "installed"; then - flags="$flags -I$includedir $INCLUDES" - elif test "$location" = "source"; then - flags="$flags -I$APU_SOURCE_DIR/include $INCLUDES" - else - # this is for VPATH builds - flags="$flags -I$APU_BUILD_DIR/include -I$APU_SOURCE_DIR/include $INCLUDES" - fi - ;; - --ldflags) - flags="$flags $LDFLAGS" - ;; - --srcdir) - echo $APU_SOURCE_DIR - exit 0 - ;; - --version) - echo $APRUTIL_DOTTED_VERSION - exit 0 - ;; - --link-ld) - if test "$location" = "installed"; then - ### avoid using -L if libdir is a "standard" location like /usr/lib - flags="$flags -L$libdir -l$APRUTIL_LIBNAME" - else - flags="$flags -L$APU_BUILD_DIR -l$APRUTIL_LIBNAME" - fi - ;; - --link-libtool) - # If the LA_FILE exists where we think it should be, use it. If we're - # installed and the LA_FILE does not exist, assume to use -L/-l - # (the LA_FILE may not have been installed). If we're building ourselves, - # we'll assume that at some point the .la file be created. - if test -f "$LA_FILE"; then - flags="$flags $LA_FILE" - elif test "$location" = "installed"; then - ### avoid using -L if libdir is a "standard" location like /usr/lib - # Since the user is specifying they are linking with libtool, we - # *know* that -R will be recognized by libtool. - flags="$flags -L$libdir -R$libdir -l$APRUTIL_LIBNAME" - else - flags="$flags $LA_FILE" - fi - ;; - --apu-la-file) - if test -f "$LA_FILE"; then - flags="$flags $LA_FILE" - fi - ;; - --old-expat) - if test ! -n "$APR_XML_EXPAT_OLD"; then - echo "no" - else - echo "$APR_XML_EXPAT_OLD" - fi - exit 0 - ;; - --db-version) - echo $APU_DB_VERSION - exit 0 - ;; - --help) - show_usage - exit 0 - ;; - *) - show_usage - exit 1 - ;; - esac - - # Next please. - shift -done - -if test -n "$flags"; then - echo "$flags" -fi - -exit 0 diff --git a/build/dbd.m4 b/build/dbd.m4 index fc43c8c..c6e40e0 100644 --- a/build/dbd.m4 +++ b/build/dbd.m4 @@ -163,15 +163,10 @@ AC_DEFUN([APU_CHECK_DBD_MYSQL], [ old_cppflags="$CPPFLAGS" old_ldflags="$LDFLAGS" - my_library="mysqlclient" - AC_ARG_WITH([mysql], APR_HELP_STRING([--with-mysql=DIR], [enable MySQL DBD driver]), [ if test "$withval" = "yes"; then AC_PATH_PROG([MYSQL_CONFIG],[mysql_config]) - if test "x$MYSQL_CONFIG" = "x"; then - AC_PATH_PROG([MYSQL_CONFIG],[mariadb_config]) - fi if test "x$MYSQL_CONFIG" != 'x'; then mysql_CPPFLAGS="`$MYSQL_CONFIG --include`" mysql_LDFLAGS="`$MYSQL_CONFIG --libs_r | sed -e 's/-l[[^ ]]\+//g'`" @@ -179,40 +174,32 @@ AC_DEFUN([APU_CHECK_DBD_MYSQL], [ APR_ADDTO(CPPFLAGS, [$mysql_CPPFLAGS]) APR_ADDTO(LIBS, [$mysql_LIBS]) - - if $MYSQL_CONFIG --libs_r | grep -q mariadb; then - my_library="mariadb" - fi fi - AC_CHECK_HEADERS([mysql.h errmsg.h], [apu_have_mysql=1], [apu_have_mysql=0; break]) - if test "$apr_have_mysql" = "0"; then - AC_CHECK_HEADERS([mysql/mysql.h mysql/errmsg.h], [apu_have_mysql=1], [apu_have_mysql=0; break]) + AC_CHECK_HEADERS([mysql.h my_global.h my_sys.h], + AC_CHECK_LIB(mysqlclient, mysql_init, [apu_have_mysql=1]), + [apu_have_mysql=0; break], + [#include ]) + if test "$apu_have_mysql" = "0"; then + AC_CHECK_HEADERS([mysql/mysql.h mysql/my_global.h mysql/my_sys.h], + AC_CHECK_LIB(mysqlclient, mysql_init, [apu_have_mysql=1]), + [apu_have_mysql=0; break], + [#include ]) fi - if test "$apr_have_mysql" = "1"; then - AC_CHECK_HEADERS([my_global.h my_sys.h mysql/my_global.h mysql/my_sys.h]) - AC_CHECK_LIB($my_library, mysql_init,, [apu_have_mysql=0]) - fi - if test "$apu_have_mysql" = "1" && test "x$MYSQL_CONFIG" != 'x'; then - APR_ADDTO(APRUTIL_PRIV_INCLUDES, [$mysql_CPPFLAGS]) + if test "$apu_have_mysql" != "0" && test "x$MYSQL_CONFIG" != 'x'; then + APR_ADDTO(APRUTIL_PRIV_INCLUDES, [$mysql_CPPFLAGS]) fi elif test "$withval" = "no"; then : else AC_PATH_PROG([MYSQL_CONFIG],[mysql_config],,[$withval/bin]) - if test "x$MYSQL_CONFIG" = "x"; then - AC_PATH_PROG([MYSQL_CONFIG],[mariadb_config],,[$withval/bin]) - fi if test "x$MYSQL_CONFIG" != 'x'; then - mysql_CPPFLAGS="`$MYSQL_CONFIG --include`" - mysql_LDFLAGS="`$MYSQL_CONFIG --libs_r | sed -e 's/-l[[^ ]]\+//g'`" - mysql_LIBS="`$MYSQL_CONFIG --libs_r`" - if $MYSQL_CONFIG --libs_r | grep -q mariadb; then - my_library="mariadb" - fi + mysql_CPPFLAGS="`$MYSQL_CONFIG --include`" + mysql_LDFLAGS="`$MYSQL_CONFIG --libs_r | sed -e 's/-l[[^ ]]\+//g'`" + mysql_LIBS="`$MYSQL_CONFIG --libs_r`" else - mysql_CPPFLAGS="-I$withval/include" - mysql_LDFLAGS="-L$withval/lib " + mysql_CPPFLAGS="-I$withval/include" + mysql_LDFLAGS="-L$withval/lib " fi APR_ADDTO(CPPFLAGS, [$mysql_CPPFLAGS]) @@ -220,15 +207,18 @@ AC_DEFUN([APU_CHECK_DBD_MYSQL], [ APR_ADDTO(LIBS, [$mysql_LIBS]) AC_MSG_NOTICE(checking for mysql in $withval) - AC_CHECK_HEADERS([mysql.h errmsg.h], [apu_have_mysql=1], [apu_have_mysql=0; break]) - if test "$apr_have_mysql" = "0"; then - AC_CHECK_HEADERS([mysql/mysql.h mysql/errmsg.h], [apu_have_mysql=1], [apu_have_mysql=0; break]) - fi - if test "$apr_have_mysql" = "1"; then - AC_CHECK_HEADERS([my_global.h my_sys.h mysql/my_global.h mysql/my_sys.h]) - AC_CHECK_LIB($my_library, mysql_init,, [apu_have_mysql=0]) + AC_CHECK_HEADERS([mysql.h my_global.h my_sys.h], + AC_CHECK_LIB(mysqlclient, mysql_init, [apu_have_mysql=1]), + [apu_have_mysql=0; break], + [#include ]) + + if test "$apu_have_mysql" != "1"; then + AC_CHECK_HEADERS([mysql/mysql.h mysql/my_global.h mysql/my_sys.h], + AC_CHECK_LIB(mysqlclient, mysql_init, [apu_have_mysql=1]), + [apu_have_mysql=0; break], + [#include ]) fi - if test "$apu_have_mysql" = "1"; then + if test "$apu_have_mysql" != "0"; then APR_ADDTO(APRUTIL_PRIV_INCLUDES, [$mysql_CPPFLAGS]) fi fi @@ -239,7 +229,7 @@ AC_DEFUN([APU_CHECK_DBD_MYSQL], [ dnl Since we have already done the AC_CHECK_LIB tests, if we have it, dnl we know the library is there. if test "$apu_have_mysql" = "1"; then - APR_ADDTO(LDADD_dbd_mysql, [$mysql_LDFLAGS -l$my_library $mysql_LIBS]) + APR_ADDTO(LDADD_dbd_mysql, [$mysql_LDFLAGS -lmysqlclient $mysql_LIBS]) fi AC_SUBST(LDADD_dbd_mysql) diff --git a/build/dbd.m4.maria b/build/dbd.m4.maria deleted file mode 100644 index c6e40e0..0000000 --- a/build/dbd.m4.maria +++ /dev/null @@ -1,514 +0,0 @@ -dnl -------------------------------------------------------- -*- autoconf -*- -dnl Licensed to the Apache Software Foundation (ASF) under one or more -dnl contributor license agreements. See the NOTICE file distributed with -dnl this work for additional information regarding copyright ownership. -dnl The ASF licenses this file to You under the Apache License, Version 2.0 -dnl (the "License"); you may not use this file except in compliance with -dnl the License. You may obtain a copy of the License at -dnl -dnl http://www.apache.org/licenses/LICENSE-2.0 -dnl -dnl Unless required by applicable law or agreed to in writing, software -dnl distributed under the License is distributed on an "AS IS" BASIS, -dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -dnl See the License for the specific language governing permissions and -dnl limitations under the License. - -dnl -dnl DBD module -dnl - -dnl -dnl APU_CHECK_DBD: compile backends for apr_dbd. -dnl -AC_DEFUN([APU_CHECK_DBD], [ - apu_have_pgsql=0 - - old_libs="$LIBS" - old_cppflags="$CPPFLAGS" - old_ldflags="$LDFLAGS" - - AC_ARG_WITH([pgsql], APR_HELP_STRING([--with-pgsql=DIR], [specify PostgreSQL location]), - [ - if test "$withval" = "yes"; then - AC_PATH_PROG([PGSQL_CONFIG],[pg_config]) - if test "x$PGSQL_CONFIG" != 'x'; then - pgsql_CPPFLAGS="-I`$PGSQL_CONFIG --includedir`" - pgsql_LDFLAGS="-L`$PGSQL_CONFIG --libdir`" - - APR_ADDTO(CPPFLAGS, [$pgsql_CPPFLAGS]) - APR_ADDTO(LDFLAGS, [$pgsql_LDFLAGS]) - fi - - AC_CHECK_HEADERS(libpq-fe.h, [ - AC_CHECK_LIB(pq, PQsendQueryPrepared, [apu_have_pgsql=1],[ - if test "x$PGSQL_CONFIG" != 'x'; then - unset ac_cv_lib_pq_PQsendQueryPrepared - pgsql_LIBS="`$PGSQL_CONFIG --libs`" - APR_ADDTO(LIBS, [$pgsql_LIBS]) - AC_CHECK_LIB(pq, PQsendQueryPrepared, [apu_have_pgsql=1]) - fi - ]) - ]) - if test "$apu_have_pgsql" = "0"; then - AC_CHECK_HEADERS(postgresql/libpq-fe.h, [ - AC_CHECK_LIB(pq, PQsendQueryPrepared, [apu_have_pgsql=1],[ - if test "x$PGSQL_CONFIG" != 'x'; then - unset ac_cv_lib_pq_PQsendQueryPrepared - pgsql_LIBS="`$PGSQL_CONFIG --libs`" - APR_ADDTO(LIBS, [$pgsql_LIBS]) - AC_CHECK_LIB(pq, PQsendQueryPrepared, [apu_have_pgsql=1]) - fi - ]) - ]) - fi - if test "$apu_have_pgsql" != "0" && test "x$PGSQL_CONFIG" != 'x'; then - APR_ADDTO(APRUTIL_PRIV_INCLUDES, [$pgsql_CPPFLAGS]) - fi - elif test "$withval" = "no"; then - : - else - AC_PATH_PROG([PGSQL_CONFIG],[pg_config],,[$withval/bin]) - if test "x$PGSQL_CONFIG" != 'x'; then - pgsql_CPPFLAGS="-I`$PGSQL_CONFIG --includedir`" - pgsql_LDFLAGS="-L`$PGSQL_CONFIG --libdir`" - else - pgsql_CPPFLAGS="-I$withval/include" - pgsql_LDFLAGS="-L$withval/lib " - fi - - APR_ADDTO(CPPFLAGS, [$pgsql_CPPFLAGS]) - APR_ADDTO(LDFLAGS, [$pgsql_LDFLAGS]) - - AC_MSG_NOTICE(checking for pgsql in $withval) - AC_CHECK_HEADERS(libpq-fe.h, [ - AC_CHECK_LIB(pq, PQsendQueryPrepared, [apu_have_pgsql=1],[ - if test "x$PGSQL_CONFIG" != 'x'; then - unset ac_cv_lib_pq_PQsendQueryPrepared - pgsql_LIBS="`$PGSQL_CONFIG --libs`" - APR_ADDTO(LIBS, [$pgsql_LIBS]) - AC_CHECK_LIB(pq, PQsendQueryPrepared, [apu_have_pgsql=1]) - fi - ]) - ]) - if test "$apu_have_pgsql" != "1"; then - AC_CHECK_HEADERS(postgresql/libpq-fe.h, [ - AC_CHECK_LIB(pq, PQsendQueryPrepared, [apu_have_pgsql=1],[ - if test "x$PGSQL_CONFIG" != 'x'; then - unset ac_cv_lib_pq_PQsendQueryPrepared - pgsql_LIBS="`$PGSQL_CONFIG --libs`" - APR_ADDTO(LIBS, [$pgsql_LIBS]) - AC_CHECK_LIB(pq, PQsendQueryPrepared, [apu_have_pgsql=1]) - fi - ]) - ]) - fi - if test "$apu_have_pgsql" != "0"; then - APR_ADDTO(APRUTIL_PRIV_INCLUDES, [$pgsql_CPPFLAGS]) - fi - fi - ], [ - AC_PATH_PROG([PGSQL_CONFIG],[pg_config]) - if test "x$PGSQL_CONFIG" != 'x'; then - pgsql_CPPFLAGS="-I`$PGSQL_CONFIG --includedir`" - pgsql_LDFLAGS="-L`$PGSQL_CONFIG --libdir`" - - APR_ADDTO(CPPFLAGS, [$pgsql_CPPFLAGS]) - APR_ADDTO(LDFLAGS, [$pgsql_LDFLAGS]) - fi - - AC_CHECK_HEADERS(libpq-fe.h, [ - AC_CHECK_LIB(pq, PQsendQueryPrepared, [apu_have_pgsql=1],[ - if test "x$PGSQL_CONFIG" != 'x'; then - unset ac_cv_lib_pq_PQsendQueryPrepared - pgsql_LIBS="`$PGSQL_CONFIG --libs`" - APR_ADDTO(LIBS, [$pgsql_LIBS]) - AC_CHECK_LIB(pq, PQsendQueryPrepared, [apu_have_pgsql=1]) - fi - ]) - ]) - if test "$apu_have_pgsql" = "0"; then - AC_CHECK_HEADERS(postgresql/libpq-fe.h, [ - AC_CHECK_LIB(pq, PQsendQueryPrepared, [apu_have_pgsql=1],[ - if test "x$PGSQL_CONFIG" != 'x'; then - unset ac_cv_lib_pq_PQsendQueryPrepared - pgsql_LIBS="`$PGSQL_CONFIG --libs`" - APR_ADDTO(LIBS, [$pgsql_LIBS]) - AC_CHECK_LIB(pq, PQsendQueryPrepared, [apu_have_pgsql=1]) - fi - ]) - ]) - fi - if test "$apu_have_pgsql" != "0" && test "x$PGSQL_CONFIG" != 'x'; then - APR_ADDTO(APRUTIL_PRIV_INCLUDES, [$pgsql_CPPFLAGS]) - fi - ]) - AC_SUBST(apu_have_pgsql) - dnl Since we have already done the AC_CHECK_LIB tests, if we have it, - dnl we know the library is there. - if test "$apu_have_pgsql" = "1"; then - APR_ADDTO(LDADD_dbd_pgsql, [$pgsql_LDFLAGS -lpq $pgsql_LIBS]) - fi - AC_SUBST(LDADD_dbd_pgsql) - - LIBS="$old_libs" - CPPFLAGS="$old_cppflags" - LDFLAGS="$old_ldflags" -]) -dnl -AC_DEFUN([APU_CHECK_DBD_MYSQL], [ - apu_have_mysql=0 - - old_libs="$LIBS" - old_cppflags="$CPPFLAGS" - old_ldflags="$LDFLAGS" - - AC_ARG_WITH([mysql], APR_HELP_STRING([--with-mysql=DIR], [enable MySQL DBD driver]), - [ - if test "$withval" = "yes"; then - AC_PATH_PROG([MYSQL_CONFIG],[mysql_config]) - if test "x$MYSQL_CONFIG" != 'x'; then - mysql_CPPFLAGS="`$MYSQL_CONFIG --include`" - mysql_LDFLAGS="`$MYSQL_CONFIG --libs_r | sed -e 's/-l[[^ ]]\+//g'`" - mysql_LIBS="`$MYSQL_CONFIG --libs_r`" - - APR_ADDTO(CPPFLAGS, [$mysql_CPPFLAGS]) - APR_ADDTO(LIBS, [$mysql_LIBS]) - fi - - AC_CHECK_HEADERS([mysql.h my_global.h my_sys.h], - AC_CHECK_LIB(mysqlclient, mysql_init, [apu_have_mysql=1]), - [apu_have_mysql=0; break], - [#include ]) - if test "$apu_have_mysql" = "0"; then - AC_CHECK_HEADERS([mysql/mysql.h mysql/my_global.h mysql/my_sys.h], - AC_CHECK_LIB(mysqlclient, mysql_init, [apu_have_mysql=1]), - [apu_have_mysql=0; break], - [#include ]) - fi - if test "$apu_have_mysql" != "0" && test "x$MYSQL_CONFIG" != 'x'; then - APR_ADDTO(APRUTIL_PRIV_INCLUDES, [$mysql_CPPFLAGS]) - fi - elif test "$withval" = "no"; then - : - else - AC_PATH_PROG([MYSQL_CONFIG],[mysql_config],,[$withval/bin]) - if test "x$MYSQL_CONFIG" != 'x'; then - mysql_CPPFLAGS="`$MYSQL_CONFIG --include`" - mysql_LDFLAGS="`$MYSQL_CONFIG --libs_r | sed -e 's/-l[[^ ]]\+//g'`" - mysql_LIBS="`$MYSQL_CONFIG --libs_r`" - else - mysql_CPPFLAGS="-I$withval/include" - mysql_LDFLAGS="-L$withval/lib " - fi - - APR_ADDTO(CPPFLAGS, [$mysql_CPPFLAGS]) - APR_ADDTO(LDFLAGS, [$mysql_LDFLAGS]) - APR_ADDTO(LIBS, [$mysql_LIBS]) - - AC_MSG_NOTICE(checking for mysql in $withval) - AC_CHECK_HEADERS([mysql.h my_global.h my_sys.h], - AC_CHECK_LIB(mysqlclient, mysql_init, [apu_have_mysql=1]), - [apu_have_mysql=0; break], - [#include ]) - - if test "$apu_have_mysql" != "1"; then - AC_CHECK_HEADERS([mysql/mysql.h mysql/my_global.h mysql/my_sys.h], - AC_CHECK_LIB(mysqlclient, mysql_init, [apu_have_mysql=1]), - [apu_have_mysql=0; break], - [#include ]) - fi - if test "$apu_have_mysql" != "0"; then - APR_ADDTO(APRUTIL_PRIV_INCLUDES, [$mysql_CPPFLAGS]) - fi - fi - ]) - - AC_SUBST(apu_have_mysql) - - dnl Since we have already done the AC_CHECK_LIB tests, if we have it, - dnl we know the library is there. - if test "$apu_have_mysql" = "1"; then - APR_ADDTO(LDADD_dbd_mysql, [$mysql_LDFLAGS -lmysqlclient $mysql_LIBS]) - fi - AC_SUBST(LDADD_dbd_mysql) - - LIBS="$old_libs" - CPPFLAGS="$old_cppflags" - LDFLAGS="$old_ldflags" -]) -dnl -AC_DEFUN([APU_CHECK_DBD_SQLITE3], [ - apu_have_sqlite3=0 - - old_libs="$LIBS" - old_cppflags="$CPPFLAGS" - old_ldflags="$LDFLAGS" - - AC_ARG_WITH([sqlite3], APR_HELP_STRING([--with-sqlite3=DIR], [enable sqlite3 DBD driver]), - [ - if test "$withval" = "yes"; then - AC_CHECK_HEADERS(sqlite3.h, AC_CHECK_LIB(sqlite3, sqlite3_open, [apu_have_sqlite3=1])) - elif test "$withval" = "no"; then - : - else - sqlite3_CPPFLAGS="-I$withval/include" - sqlite3_LDFLAGS="-L$withval/lib " - - APR_ADDTO(CPPFLAGS, [$sqlite3_CPPFLAGS]) - APR_ADDTO(LDFLAGS, [$sqlite3_LDFLAGS]) - - AC_MSG_NOTICE(checking for sqlite3 in $withval) - AC_CHECK_HEADERS(sqlite3.h, AC_CHECK_LIB(sqlite3, sqlite3_open, [apu_have_sqlite3=1])) - if test "$apu_have_sqlite3" != "0"; then - APR_ADDTO(APRUTIL_PRIV_INCLUDES, [-I$withval/include]) - fi - fi - ], [ - AC_CHECK_HEADERS(sqlite3.h, AC_CHECK_LIB(sqlite3, sqlite3_open, [apu_have_sqlite3=1])) - ]) - - AC_SUBST(apu_have_sqlite3) - - dnl Since we have already done the AC_CHECK_LIB tests, if we have it, - dnl we know the library is there. - if test "$apu_have_sqlite3" = "1"; then - APR_ADDTO(LDADD_dbd_sqlite3, [$sqlite3_LDFLAGS -lsqlite3]) - fi - AC_SUBST(LDADD_dbd_sqlite3) - - LIBS="$old_libs" - CPPFLAGS="$old_cppflags" - LDFLAGS="$old_ldflags" -]) -dnl -AC_DEFUN([APU_CHECK_DBD_SQLITE2], [ - apu_have_sqlite2=0 - - old_libs="$LIBS" - old_cppflags="$CPPFLAGS" - old_ldflags="$LDFLAGS" - - AC_ARG_WITH([sqlite2], APR_HELP_STRING([--with-sqlite2=DIR], [enable sqlite2 DBD driver]), - [ - if test "$withval" = "yes"; then - AC_CHECK_HEADERS(sqlite.h, AC_CHECK_LIB(sqlite, sqlite_open, [apu_have_sqlite2=1])) - elif test "$withval" = "no"; then - : - else - sqlite2_CPPFLAGS="-I$withval/include" - sqlite2_LDFLAGS="-L$withval/lib " - - APR_ADDTO(CPPFLAGS, [$sqlite2_CPPFLAGS]) - APR_ADDTO(LDFLAGS, [$sqlite2_LDFLAGS]) - - AC_MSG_NOTICE(checking for sqlite2 in $withval) - AC_CHECK_HEADERS(sqlite.h, AC_CHECK_LIB(sqlite, sqlite_open, [apu_have_sqlite2=1])) - if test "$apu_have_sqlite2" != "0"; then - APR_ADDTO(APRUTIL_PRIV_INCLUDES, [-I$withval/include]) - fi - fi - ], [ - AC_CHECK_HEADERS(sqlite.h, AC_CHECK_LIB(sqlite, sqlite_open, [apu_have_sqlite2=1])) - ]) - - AC_SUBST(apu_have_sqlite2) - - dnl Since we have already done the AC_CHECK_LIB tests, if we have it, - dnl we know the library is there. - if test "$apu_have_sqlite2" = "1"; then - APR_ADDTO(LDADD_dbd_sqlite2, [$sqlite2_LDFLAGS -lsqlite]) - fi - AC_SUBST(LDADD_dbd_sqlite2) - - LIBS="$old_libs" - CPPFLAGS="$old_cppflags" - LDFLAGS="$old_ldflags" -]) -dnl -AC_DEFUN([APU_CHECK_DBD_ORACLE], [ - apu_have_oracle=0 - - old_libs="$LIBS" - old_cppflags="$CPPFLAGS" - old_ldflags="$LDFLAGS" - - AC_ARG_WITH([oracle-include], - APR_HELP_STRING([--with-oracle-include=DIR], [path to Oracle include files])) - AC_ARG_WITH([oracle], - APR_HELP_STRING([--with-oracle=DIR], [enable Oracle DBD driver; giving ORACLE_HOME as DIR]), - [ - if test "$withval" = "yes"; then - if test -n "$with_oracle_include"; then - oracle_CPPFLAGS="$CPPFLAGS -I$with_oracle_include" - APR_ADDTO(APRUTIL_PRIV_INCLUDES, [-I$with_oracle_include]) - fi - - APR_ADDTO(CPPFLAGS, [$oracle_CPPFLAGS]) - - AC_CHECK_HEADERS(oci.h, AC_CHECK_LIB(clntsh, OCIEnvCreate, [apu_have_oracle=1],[ - unset ac_cv_lib_clntsh_OCIEnvCreate - oracle_LIBS="-lnnz11" - APR_ADDTO(LIBS, [$oracle_LIBS]) - AC_CHECK_LIB(clntsh, OCIEnvCreate, [apu_have_oracle=1],[ - unset ac_cv_lib_clntsh_OCIEnvCreate - APR_REMOVEFROM(LIBS, [$oracle_LIBS]) - oracle_LIBS="-lnnz10" - APR_ADDTO(LIBS, [$oracle_LIBS]) - AC_CHECK_LIB(clntsh, OCIEnvCreate, [apu_have_oracle=1]) - ]) - ])) - elif test "$withval" = "no"; then - : - else - if test -n "$with_oracle_include"; then - oracle_CPPFLAGS="$CPPFLAGS -I$with_oracle_include" - APR_ADDTO(APRUTIL_PRIV_INCLUDES, [-I$with_oracle_include]) - else - oracle_CPPFLAGS="-I$withval/rdbms/demo -I$withval/rdbms/public" - fi - oracle_LDFLAGS="-L$withval/lib " - - APR_ADDTO(CPPFLAGS, [$oracle_CPPFLAGS]) - APR_ADDTO(LDFLAGS, [$oracle_LDFLAGS]) - - AC_MSG_NOTICE(checking for oracle in $withval) - AC_CHECK_HEADERS(oci.h, AC_CHECK_LIB(clntsh, OCIEnvCreate, [apu_have_oracle=1],[ - unset ac_cv_lib_clntsh_OCIEnvCreate - oracle_LIBS="-lnnz11" - APR_ADDTO(LIBS, [$oracle_LIBS]) - AC_CHECK_LIB(clntsh, OCIEnvCreate, [apu_have_oracle=1],[ - unset ac_cv_lib_clntsh_OCIEnvCreate - APR_REMOVEFROM(LIBS, [$oracle_LIBS]) - oracle_LIBS="-lnnz10" - APR_ADDTO(LIBS, [$oracle_LIBS]) - AC_CHECK_LIB(clntsh, OCIEnvCreate, [apu_have_oracle=1]) - ]) - ])) - if test "$apu_have_oracle" != "0"; then - oracle_LDFLAGS="$oracle_LDFLAGS -R$withval/lib" - if test -z "$with_oracle_include"; then - APR_ADDTO(APRUTIL_PRIV_INCLUDES, [-I$withval/rdbms/demo]) - APR_ADDTO(APRUTIL_PRIV_INCLUDES, [-I$withval/rdbms/public]) - fi - fi - fi - ]) - - AC_SUBST(apu_have_oracle) - - dnl Since we have already done the AC_CHECK_LIB tests, if we have it, - dnl we know the library is there. - if test "$apu_have_oracle" = "1"; then - APR_ADDTO(LDADD_dbd_oracle, [$oracle_LDFLAGS -lclntsh $oracle_LIBS]) - fi - AC_SUBST(LDADD_dbd_oracle) - - LIBS="$old_libs" - CPPFLAGS="$old_cppflags" - LDFLAGS="$old_ldflags" -]) - -dnl - -AC_DEFUN([APU_CHECK_DBD_ODBC], [ - apu_have_odbc=0 - - old_libs="$LIBS" - old_cppflags="$CPPFLAGS" - old_ldflags="$LDFLAGS" - - AC_ARG_WITH([odbc], APR_HELP_STRING([--with-odbc=DIR], [specify ODBC location]), - [ - if test "$withval" = "yes"; then - AC_PATH_PROG([ODBC_CONFIG],[odbc_config]) - if test "x$ODBC_CONFIG" != 'x'; then - odbc_CPPFLAGS="-I`$ODBC_CONFIG --include-prefix`" - odbc_LDFLAGS="-L`$ODBC_CONFIG --lib-prefix`" - odbc_LIBS="`$ODBC_CONFIG --libs`" - - APR_ADDTO(CPPFLAGS, [$odbc_CPPFLAGS]) - APR_ADDTO(LDFLAGS, [$odbc_LDFLAGS]) - APR_ADDTO(LIBS, [$odbc_LIBS]) - fi - - AC_CHECK_HEADERS(sql.h, AC_CHECK_LIB(odbc, SQLAllocHandle, [apu_have_odbc=1])) - if test "$apu_have_odbc" = "0"; then - AC_CHECK_HEADERS(odbc/sql.h, AC_CHECK_LIB(odbc, SQLAllocHandle, [apu_have_odbc=1])) - fi - if test "$apu_have_odbc" != "0" && test "x$ODBC_CONFIG" != 'x'; then - APR_ADDTO(APRUTIL_PRIV_INCLUDES, [$odbc_CPPFLAGS]) - fi - elif test "$withval" = "no"; then - : - else - AC_PATH_PROG([ODBC_CONFIG],[odbc_config],,[$withval/bin]) - if test "x$ODBC_CONFIG" != 'x'; then - odbc_CPPFLAGS="-I`$ODBC_CONFIG --include-prefix`" - odbc_LDFLAGS="-L`$ODBC_CONFIG --lib-prefix`" - odbc_LIBS="`$ODBC_CONFIG --libs`" - else - if test -f "$withval" && test -x "$withval"; then - odbc_CPPFLAGS="-I`$withval --include-prefix`" - odbc_LDFLAGS="-L`$withval --lib-prefix`" - odbc_LIBS="`$withval --libs`" - else - odbc_CPPFLAGS="-I$withval/include" - odbc_LDFLAGS="-L$withval/lib " - fi - fi - - APR_ADDTO(CPPFLAGS, [$odbc_CPPFLAGS]) - APR_ADDTO(LDFLAGS, [$odbc_LDFLAGS]) - APR_ADDTO(LIBS, [$odbc_LIBS]) - - AC_MSG_NOTICE(checking for odbc in $withval) - AC_CHECK_HEADERS(sql.h, AC_CHECK_LIB(odbc, SQLAllocHandle, [apu_have_odbc=1])) - if test "$apu_have_odbc" = "0"; then - AC_CHECK_HEADERS(odbc/sql.h, AC_CHECK_LIB(odbc, SQLAllocHandle, [apu_have_odbc=1])) - fi - if test "$apu_have_odbc" != "0" && test "x$ODBC_CONFIG" != 'x'; then - APR_ADDTO(APRUTIL_PRIV_INCLUDES, [$odbc_CPPFLAGS]) - fi - fi - ], [ - AC_PATH_PROG([ODBC_CONFIG],[odbc_config]) - if test "x$ODBC_CONFIG" != 'x'; then - odbc_CPPFLAGS="-I`$ODBC_CONFIG --include-prefix`" - odbc_LDFLAGS="-L`$ODBC_CONFIG --lib-prefix`" - odbc_LIBS="`$ODBC_CONFIG --libs`" - - APR_ADDTO(CPPFLAGS, [$odbc_CPPFLAGS]) - APR_ADDTO(LDFLAGS, [$odbc_LDFLAGS]) - APR_ADDTO(LIBS, [$odbc_LIBS]) - fi - - AC_CHECK_HEADERS(sql.h, AC_CHECK_LIB(odbc, SQLAllocHandle, [apu_have_odbc=1])) - if test "$apu_have_odbc" = "0"; then - AC_CHECK_HEADERS(odbc/sql.h, AC_CHECK_LIB(odbc, SQLAllocHandle, [apu_have_odbc=1])) - fi - if test "$apu_have_odbc" != "0" && test "x$ODBC_CONFIG" != 'x'; then - APR_ADDTO(APRUTIL_PRIV_INCLUDES, [$odbc_CPPFLAGS]) - fi - ]) - AC_SUBST(apu_have_odbc) - dnl Since we have already done the AC_CHECK_LIB tests, if we have it, - dnl we know the library is there. - if test "$apu_have_odbc" = "1"; then - APR_ADDTO(LDADD_dbd_odbc, [$odbc_LDFLAGS -lodbc $odbc_LIBS]) - fi - AC_SUBST(LDADD_dbd_odbc) - - LIBS="$old_libs" - CPPFLAGS="$old_cppflags" - LDFLAGS="$old_ldflags" - - apu_dbd_tests="" - test $apu_have_oracle = 1 && apu_dbd_tests="$apu_dbd_tests oracle" - test $apu_have_pgsql = 1 && apu_dbd_tests="$apu_dbd_tests pgsql" - test $apu_have_mysql = 1 && apu_dbd_tests="$apu_dbd_tests mysql" - test $apu_have_sqlite2 = 1 && apu_dbd_tests="$apu_dbd_tests sqlite2" - test $apu_have_sqlite3 = 1 && apu_dbd_tests="$apu_dbd_tests sqlite3" - test $apu_have_odbc = 1 && apu_dbd_tests="$apu_dbd_tests odbc" - AC_SUBST(apu_dbd_tests) -]) diff --git a/dbd/apr_dbd_mysql.c b/dbd/apr_dbd_mysql.c index d3e938c..3b8017d 100644 --- a/dbd/apr_dbd_mysql.c +++ b/dbd/apr_dbd_mysql.c @@ -1262,9 +1262,7 @@ static apr_status_t thread_end(void *data) static void dbd_mysql_init(apr_pool_t *pool) { -#if MYSQL_VERSION_ID < 100000 my_init(); -#endif mysql_thread_init(); /* FIXME: this is a guess; find out what it really does */ diff --git a/dbd/apr_dbd_mysql.c.maria b/dbd/apr_dbd_mysql.c.maria deleted file mode 100644 index 3b8017d..0000000 --- a/dbd/apr_dbd_mysql.c.maria +++ /dev/null @@ -1,1305 +0,0 @@ -/* Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "apu.h" - -#if APU_HAVE_MYSQL - -#include "apu_version.h" -#include "apu_config.h" - -#include -#include - -#if defined(HAVE_MYSQL_MYSQL_H) -#if defined(HAVE_MYSQL_MY_GLOBAL_H) -#include -#if defined(HAVE_MYSQL_MY_SYS_H) -#include -#endif -#endif -#include -#include -#else /* !defined(HAVE_MYSQL_MYSQL_H) */ -#if defined(HAVE_MY_GLOBAL_H) -#include -#if defined(HAVE_MY_SYS_H) -#include -#endif -#endif -#include -#include -#endif - -#include "apr_strings.h" -#include "apr_lib.h" -#include "apr_buckets.h" - -#include "apr_dbd_internal.h" - -/* default maximum field size 1 MB */ -#define FIELDSIZE 1048575 - -struct apr_dbd_prepared_t { - MYSQL_STMT* stmt; - int nargs; - int nvals; - apr_dbd_type_e *types; -}; - -struct apr_dbd_transaction_t { - int mode; - int errnum; - apr_dbd_t *handle; -}; - -struct apr_dbd_t { - MYSQL* conn ; - apr_dbd_transaction_t* trans ; - unsigned long fldsz; -}; - -struct apr_dbd_results_t { - int random; - MYSQL_RES *res; - MYSQL_STMT *statement; - MYSQL_BIND *bind; - apr_pool_t *pool; -}; -struct apr_dbd_row_t { - MYSQL_ROW row; - apr_dbd_results_t *res; - unsigned long *len; -}; - -/* MySQL specific bucket for BLOB types */ -typedef struct apr_bucket_lob apr_bucket_lob; -/** - * A bucket referring to a MySQL BLOB - */ -struct apr_bucket_lob { - /** Number of buckets using this memory */ - apr_bucket_refcount refcount; - /** The row this bucket refers to */ - const apr_dbd_row_t *row; - /** The column this bucket refers to */ - int col; - /** The pool into which any needed structures should - * be created while reading from this bucket */ - apr_pool_t *readpool; -}; - -static void lob_bucket_destroy(void *data); -static apr_status_t lob_bucket_read(apr_bucket *e, const char **str, - apr_size_t *len, apr_read_type_e block); -static apr_bucket *apr_bucket_lob_make(apr_bucket *b, - const apr_dbd_row_t *row, int col, - apr_off_t offset, apr_size_t len, - apr_pool_t *p); -static apr_bucket *apr_bucket_lob_create(const apr_dbd_row_t *row, int col, - apr_off_t offset, - apr_size_t len, apr_pool_t *p, - apr_bucket_alloc_t *list); -static int dbd_mysql_num_cols(apr_dbd_results_t *res); - -static const apr_bucket_type_t apr_bucket_type_lob = { - "LOB", 5, APR_BUCKET_DATA, - lob_bucket_destroy, - lob_bucket_read, - apr_bucket_setaside_notimpl, - apr_bucket_shared_split, - apr_bucket_shared_copy -}; - -static void lob_bucket_destroy(void *data) -{ - apr_bucket_lob *f = data; - - if (apr_bucket_shared_destroy(f)) { - /* no need to destroy database objects here; it will get - * done automatically when the pool gets cleaned up */ - apr_bucket_free(f); - } -} - -static apr_status_t lob_bucket_read(apr_bucket *e, const char **str, - apr_size_t *len, apr_read_type_e block) -{ - apr_bucket_lob *a = e->data; - const apr_dbd_row_t *row = a->row; - apr_dbd_results_t *res = row->res; - int col = a->col; - apr_bucket *b = NULL; - int rv; - apr_size_t blength = e->length; /* bytes remaining in file past offset */ - apr_off_t boffset = e->start; - MYSQL_BIND *bind = &res->bind[col]; - - *str = NULL; /* in case we die prematurely */ - - /* fetch from offset if not at the beginning */ - if (boffset > 0) { - rv = mysql_stmt_fetch_column(res->statement, bind, col, - (unsigned long) boffset); - if (rv != 0) { - return APR_EGENERAL; - } - } - blength -= blength > bind->buffer_length ? bind->buffer_length : blength; - *len = e->length - blength; - *str = bind->buffer; - - /* allocate new buffer, since we used this one for the bucket */ - bind->buffer = apr_palloc(res->pool, bind->buffer_length); - - /* - * Change the current bucket to refer to what we read, - * even if we read nothing because we hit EOF. - */ - apr_bucket_pool_make(e, *str, *len, res->pool); - - /* If we have more to read from the field, then create another bucket */ - if (blength > 0) { - /* for efficiency, we can just build a new apr_bucket struct - * to wrap around the existing LOB bucket */ - b = apr_bucket_alloc(sizeof(*b), e->list); - b->start = boffset + *len; - b->length = blength; - b->data = a; - b->type = &apr_bucket_type_lob; - b->free = apr_bucket_free; - b->list = e->list; - APR_BUCKET_INSERT_AFTER(e, b); - } - else { - lob_bucket_destroy(a); - } - - return APR_SUCCESS; -} - -static apr_bucket *apr_bucket_lob_make(apr_bucket *b, - const apr_dbd_row_t *row, int col, - apr_off_t offset, apr_size_t len, - apr_pool_t *p) -{ - apr_bucket_lob *f; - - f = apr_bucket_alloc(sizeof(*f), b->list); - f->row = row; - f->col = col; - f->readpool = p; - - b = apr_bucket_shared_make(b, f, offset, len); - b->type = &apr_bucket_type_lob; - - return b; -} - -static apr_bucket *apr_bucket_lob_create(const apr_dbd_row_t *row, int col, - apr_off_t offset, - apr_size_t len, apr_pool_t *p, - apr_bucket_alloc_t *list) -{ - apr_bucket *b = apr_bucket_alloc(sizeof(*b), list); - - APR_BUCKET_INIT(b); - b->free = apr_bucket_free; - b->list = list; - return apr_bucket_lob_make(b, row, col, offset, len, p); -} - -static apr_status_t free_result(void *data) -{ - mysql_free_result(data); - return APR_SUCCESS; -} - -static int dbd_mysql_select(apr_pool_t *pool, apr_dbd_t *sql, - apr_dbd_results_t **results, - const char *query, int seek) -{ - int sz; - int ret; - if (sql->trans && sql->trans->errnum) { - return sql->trans->errnum; - } - ret = mysql_query(sql->conn, query); - if (!ret) { - if (sz = mysql_field_count(sql->conn), sz > 0) { - if (!*results) { - *results = apr_palloc(pool, sizeof(apr_dbd_results_t)); - } - (*results)->random = seek; - (*results)->statement = NULL; - (*results)->pool = pool; - if (seek) { - (*results)->res = mysql_store_result(sql->conn); - } - else { - (*results)->res = mysql_use_result(sql->conn); - } - apr_pool_cleanup_register(pool, (*results)->res, - free_result,apr_pool_cleanup_null); - } - } else { - ret = mysql_errno(sql->conn); - } - - if (TXN_NOTICE_ERRORS(sql->trans)) { - sql->trans->errnum = ret; - } - return ret; -} - -static const char *dbd_mysql_get_name(const apr_dbd_results_t *res, int n) -{ - if ((n < 0) || (n >= (int) mysql_num_fields(res->res))) { - return NULL; - } - - return mysql_fetch_fields(res->res)[n].name; -} - -static int dbd_mysql_get_row(apr_pool_t *pool, apr_dbd_results_t *res, - apr_dbd_row_t **row, int rownum) -{ - MYSQL_ROW r = NULL; - int ret = 0; - - if (res->statement) { - if (res->random) { - if (rownum > 0) { - mysql_stmt_data_seek(res->statement, (my_ulonglong) --rownum); - } - else { - return -1; /* invalid row */ - } - } - ret = mysql_stmt_fetch(res->statement); - switch (ret) { - case 1: - ret = mysql_stmt_errno(res->statement); - break; - case MYSQL_NO_DATA: - ret = -1; - break; - default: - ret = 0; /* bad luck - get_entry will deal with this */ - break; - } - } - else { - if (res->random) { - if (rownum > 0) { - mysql_data_seek(res->res, (my_ulonglong) --rownum); - } - else { - return -1; /* invalid row */ - } - } - r = mysql_fetch_row(res->res); - if (r == NULL) { - ret = -1; - } - } - if (ret == 0) { - if (!*row) { - *row = apr_palloc(pool, sizeof(apr_dbd_row_t)); - } - (*row)->row = r; - (*row)->res = res; - (*row)->len = mysql_fetch_lengths(res->res); - } - else { - apr_pool_cleanup_run(res->pool, res->res, free_result); - } - return ret; -} -#if 0 -/* An improved API that was proposed but not followed up */ -static int dbd_mysql_get_entry(const apr_dbd_row_t *row, int n, - apr_dbd_datum_t *val) -{ - MYSQL_BIND *bind; - if (dbd_mysql_num_cols(row->res) <= n) { - return NULL; - } - if (row->res->statement) { - bind = &row->res->bind[n]; - if (mysql_stmt_fetch_column(row->res->statement, bind, n, 0) != 0) { - val->type = APR_DBD_VALUE_NULL; - return -1; - } - if (*bind->is_null) { - val->type = APR_DBD_VALUE_NULL; - return -1; - } - else { - val->type = APR_DBD_VALUE_STRING; - val->value.stringval = bind->buffer; - } - } - else { - val->type = APR_DBD_VALUE_STRING; - val->value.stringval = row->row[n]; - } - return 0; -} -#else - -static const char *dbd_mysql_get_entry(const apr_dbd_row_t *row, int n) -{ - MYSQL_BIND *bind; - if (dbd_mysql_num_cols(row->res) <= n) { - return NULL; - } - if (row->res->statement) { - bind = &row->res->bind[n]; - if (mysql_stmt_fetch_column(row->res->statement, bind, n, 0) != 0) { - return NULL; - } - if (*bind->is_null) { - return NULL; - } - else { - return bind->buffer; - } - } - else { - return row->row[n]; - } - return NULL; -} -#endif - -static apr_status_t dbd_mysql_datum_get(const apr_dbd_row_t *row, int n, - apr_dbd_type_e type, void *data) -{ - if (row->res->statement) { - MYSQL_BIND *bind = &row->res->bind[n]; - unsigned long len = *bind->length; - - if (mysql_stmt_fetch_column(row->res->statement, bind, n, 0) != 0) { - return APR_EGENERAL; - } - - if (*bind->is_null) { - return APR_ENOENT; - } - - switch (type) { - case APR_DBD_TYPE_TINY: - *(char*)data = atoi(bind->buffer); - break; - case APR_DBD_TYPE_UTINY: - *(unsigned char*)data = atoi(bind->buffer); - break; - case APR_DBD_TYPE_SHORT: - *(short*)data = atoi(bind->buffer); - break; - case APR_DBD_TYPE_USHORT: - *(unsigned short*)data = atoi(bind->buffer); - break; - case APR_DBD_TYPE_INT: - *(int*)data = atoi(bind->buffer); - break; - case APR_DBD_TYPE_UINT: - *(unsigned int*)data = atoi(bind->buffer); - break; - case APR_DBD_TYPE_LONG: - *(long*)data = atol(bind->buffer); - break; - case APR_DBD_TYPE_ULONG: - *(unsigned long*)data = atol(bind->buffer); - break; - case APR_DBD_TYPE_LONGLONG: - *(apr_int64_t*)data = apr_atoi64(bind->buffer); - break; - case APR_DBD_TYPE_ULONGLONG: - *(apr_uint64_t*)data = apr_atoi64(bind->buffer); - break; - case APR_DBD_TYPE_FLOAT: - *(float*)data = (float) atof(bind->buffer); - break; - case APR_DBD_TYPE_DOUBLE: - *(double*)data = atof(bind->buffer); - break; - case APR_DBD_TYPE_STRING: - case APR_DBD_TYPE_TEXT: - case APR_DBD_TYPE_TIME: - case APR_DBD_TYPE_DATE: - case APR_DBD_TYPE_DATETIME: - case APR_DBD_TYPE_TIMESTAMP: - case APR_DBD_TYPE_ZTIMESTAMP: - *((char*)bind->buffer+bind->buffer_length-1) = '\0'; - *(char**)data = bind->buffer; - break; - case APR_DBD_TYPE_BLOB: - case APR_DBD_TYPE_CLOB: - { - apr_bucket *e; - apr_bucket_brigade *b = (apr_bucket_brigade*)data; - - e = apr_bucket_lob_create(row, n, 0, len, - row->res->pool, b->bucket_alloc); - APR_BRIGADE_INSERT_TAIL(b, e); - } - break; - case APR_DBD_TYPE_NULL: - *(void**)data = NULL; - break; - default: - return APR_EGENERAL; - } - } - else { - if (row->row[n] == NULL) { - return APR_ENOENT; - } - - switch (type) { - case APR_DBD_TYPE_TINY: - *(char*)data = atoi(row->row[n]); - break; - case APR_DBD_TYPE_UTINY: - *(unsigned char*)data = atoi(row->row[n]); - break; - case APR_DBD_TYPE_SHORT: - *(short*)data = atoi(row->row[n]); - break; - case APR_DBD_TYPE_USHORT: - *(unsigned short*)data = atoi(row->row[n]); - break; - case APR_DBD_TYPE_INT: - *(int*)data = atoi(row->row[n]); - break; - case APR_DBD_TYPE_UINT: - *(unsigned int*)data = atoi(row->row[n]); - break; - case APR_DBD_TYPE_LONG: - *(long*)data = atol(row->row[n]); - break; - case APR_DBD_TYPE_ULONG: - *(unsigned long*)data = atol(row->row[n]); - break; - case APR_DBD_TYPE_LONGLONG: - *(apr_int64_t*)data = apr_atoi64(row->row[n]); - break; - case APR_DBD_TYPE_ULONGLONG: - *(apr_uint64_t*)data = apr_atoi64(row->row[n]); - break; - case APR_DBD_TYPE_FLOAT: - *(float*)data = (float) atof(row->row[n]); - break; - case APR_DBD_TYPE_DOUBLE: - *(double*)data = atof(row->row[n]); - break; - case APR_DBD_TYPE_STRING: - case APR_DBD_TYPE_TEXT: - case APR_DBD_TYPE_TIME: - case APR_DBD_TYPE_DATE: - case APR_DBD_TYPE_DATETIME: - case APR_DBD_TYPE_TIMESTAMP: - case APR_DBD_TYPE_ZTIMESTAMP: - *(char**)data = row->row[n]; - break; - case APR_DBD_TYPE_BLOB: - case APR_DBD_TYPE_CLOB: - { - apr_bucket *e; - apr_bucket_brigade *b = (apr_bucket_brigade*)data; - - e = apr_bucket_pool_create(row->row[n], row->len[n], - row->res->pool, b->bucket_alloc); - APR_BRIGADE_INSERT_TAIL(b, e); - } - break; - case APR_DBD_TYPE_NULL: - *(void**)data = NULL; - break; - default: - return APR_EGENERAL; - } - } - return 0; -} - -static const char *dbd_mysql_error(apr_dbd_t *sql, int n) -{ - return mysql_error(sql->conn); -} - -static int dbd_mysql_query(apr_dbd_t *sql, int *nrows, const char *query) -{ - int ret; - if (sql->trans && sql->trans->errnum) { - return sql->trans->errnum; - } - ret = mysql_query(sql->conn, query); - if (ret != 0) { - ret = mysql_errno(sql->conn); - } - *nrows = (int) mysql_affected_rows(sql->conn); - if (TXN_NOTICE_ERRORS(sql->trans)) { - sql->trans->errnum = ret; - } - return ret; -} - -static const char *dbd_mysql_escape(apr_pool_t *pool, const char *arg, - apr_dbd_t *sql) -{ - unsigned long len = strlen(arg); - char *ret = apr_palloc(pool, 2*len + 1); - mysql_real_escape_string(sql->conn, ret, arg, len); - return ret; -} - -static apr_status_t stmt_close(void *data) -{ - mysql_stmt_close(data); - return APR_SUCCESS; -} - -static int dbd_mysql_prepare(apr_pool_t *pool, apr_dbd_t *sql, - const char *query, const char *label, - int nargs, int nvals, apr_dbd_type_e *types, - apr_dbd_prepared_t **statement) -{ - /* Translate from apr_dbd to native query format */ - int ret; - - if (!*statement) { - *statement = apr_palloc(pool, sizeof(apr_dbd_prepared_t)); - } - (*statement)->stmt = mysql_stmt_init(sql->conn); - - if ((*statement)->stmt) { - apr_pool_cleanup_register(pool, (*statement)->stmt, - stmt_close, apr_pool_cleanup_null); - ret = mysql_stmt_prepare((*statement)->stmt, query, strlen(query)); - - if (ret != 0) { - ret = mysql_stmt_errno((*statement)->stmt); - } - - (*statement)->nargs = nargs; - (*statement)->nvals = nvals; - (*statement)->types = types; - - return ret; - } - - return CR_OUT_OF_MEMORY; -} - -static void dbd_mysql_bind(apr_dbd_prepared_t *statement, - const char **values, MYSQL_BIND *bind) -{ - int i, j; - - for (i = 0, j = 0; i < statement->nargs; i++, j++) { - bind[i].length = &bind[i].buffer_length; - bind[i].is_unsigned = 0; - bind[i].is_null = NULL; - - if (values[j] == NULL) { - bind[i].buffer_type = MYSQL_TYPE_NULL; - } - else { - switch (statement->types[i]) { - case APR_DBD_TYPE_BLOB: - case APR_DBD_TYPE_CLOB: - bind[i].buffer_type = MYSQL_TYPE_LONG_BLOB; - bind[i].buffer = (void*)values[j]; - bind[i].buffer_length = atol(values[++j]); - - /* skip table and column */ - j += 2; - break; - default: - bind[i].buffer_type = MYSQL_TYPE_VAR_STRING; - bind[i].buffer = (void*)values[j]; - bind[i].buffer_length = strlen(values[j]); - break; - } - } - } - - return; -} - -static int dbd_mysql_pquery_internal(apr_pool_t *pool, apr_dbd_t *sql, - int *nrows, apr_dbd_prepared_t *statement, - MYSQL_BIND *bind) -{ - int ret; - - ret = mysql_stmt_bind_param(statement->stmt, bind); - if (ret != 0) { - *nrows = 0; - ret = mysql_stmt_errno(statement->stmt); - } - else { - ret = mysql_stmt_execute(statement->stmt); - if (ret != 0) { - ret = mysql_stmt_errno(statement->stmt); - } - *nrows = (int) mysql_stmt_affected_rows(statement->stmt); - } - - return ret; -} - -static int dbd_mysql_pquery(apr_pool_t *pool, apr_dbd_t *sql, - int *nrows, apr_dbd_prepared_t *statement, - const char **values) -{ - MYSQL_BIND *bind; - int ret; - - if (sql->trans && sql->trans->errnum) { - return sql->trans->errnum; - } - - bind = apr_palloc(pool, statement->nargs * sizeof(MYSQL_BIND)); - - dbd_mysql_bind(statement, values, bind); - - ret = dbd_mysql_pquery_internal(pool, sql, nrows, statement, bind); - - if (TXN_NOTICE_ERRORS(sql->trans)) { - sql->trans->errnum = ret; - } - return ret; -} - -static int dbd_mysql_pvquery(apr_pool_t *pool, apr_dbd_t *sql, int *nrows, - apr_dbd_prepared_t *statement, va_list args) -{ - const char **values; - int i; - - if (sql->trans && sql->trans->errnum) { - return sql->trans->errnum; - } - - values = apr_palloc(pool, sizeof(*values) * statement->nvals); - - for (i = 0; i < statement->nvals; i++) { - values[i] = va_arg(args, const char*); - } - - return dbd_mysql_pquery(pool, sql, nrows, statement, values); -} - -static int dbd_mysql_pselect_internal(apr_pool_t *pool, apr_dbd_t *sql, - apr_dbd_results_t **res, - apr_dbd_prepared_t *statement, - int random, MYSQL_BIND *bind) -{ - int nfields, i; - my_bool *is_nullr; -#if MYSQL_VERSION_ID >= 50000 - my_bool *error; -#endif - int ret; - unsigned long *length, maxlen; - - ret = mysql_stmt_bind_param(statement->stmt, bind); - if (ret == 0) { - ret = mysql_stmt_execute(statement->stmt); - if (!ret) { - if (!*res) { - *res = apr_pcalloc(pool, sizeof(apr_dbd_results_t)); - } - (*res)->random = random; - (*res)->statement = statement->stmt; - (*res)->res = mysql_stmt_result_metadata(statement->stmt); - (*res)->pool = pool; - apr_pool_cleanup_register(pool, (*res)->res, - free_result, apr_pool_cleanup_null); - nfields = mysql_num_fields((*res)->res); - if (!(*res)->bind) { - (*res)->bind = apr_palloc(pool, nfields*sizeof(MYSQL_BIND)); - length = apr_pcalloc(pool, nfields*sizeof(unsigned long)); -#if MYSQL_VERSION_ID >= 50000 - error = apr_palloc(pool, nfields*sizeof(my_bool)); -#endif - is_nullr = apr_pcalloc(pool, nfields*sizeof(my_bool)); - for ( i = 0; i < nfields; ++i ) { - maxlen = ((*res)->res->fields[i].length < sql->fldsz ? - (*res)->res->fields[i].length : sql->fldsz) + 1; - if ((*res)->res->fields[i].type == MYSQL_TYPE_BLOB) { - (*res)->bind[i].buffer_type = MYSQL_TYPE_LONG_BLOB; - } - else { - (*res)->bind[i].buffer_type = MYSQL_TYPE_VAR_STRING; - } - (*res)->bind[i].buffer_length = maxlen; - (*res)->bind[i].length = &length[i]; - (*res)->bind[i].buffer = apr_palloc(pool, maxlen); - (*res)->bind[i].is_null = is_nullr+i; -#if MYSQL_VERSION_ID >= 50000 - (*res)->bind[i].error = error+i; -#endif - } - } - ret = mysql_stmt_bind_result(statement->stmt, (*res)->bind); - if (!ret) { - ret = mysql_stmt_store_result(statement->stmt); - } - } - } - if (ret != 0) { - ret = mysql_stmt_errno(statement->stmt); - } - - return ret; -} - -static int dbd_mysql_pselect(apr_pool_t *pool, apr_dbd_t *sql, - apr_dbd_results_t **res, - apr_dbd_prepared_t *statement, int random, - const char **args) -{ - int ret; - MYSQL_BIND *bind; - - if (sql->trans && sql->trans->errnum) { - return sql->trans->errnum; - } - - bind = apr_palloc(pool, statement->nargs * sizeof(MYSQL_BIND)); - - dbd_mysql_bind(statement, args, bind); - - ret = dbd_mysql_pselect_internal(pool, sql, res, statement, random, bind); - - if (TXN_NOTICE_ERRORS(sql->trans)) { - sql->trans->errnum = ret; - } - return ret; -} - -static int dbd_mysql_pvselect(apr_pool_t *pool, apr_dbd_t *sql, - apr_dbd_results_t **res, - apr_dbd_prepared_t *statement, int random, - va_list args) -{ - const char **values; - int i; - - if (sql->trans && sql->trans->errnum) { - return sql->trans->errnum; - } - - values = apr_palloc(pool, sizeof(*values) * statement->nvals); - - for (i = 0; i < statement->nvals; i++) { - values[i] = va_arg(args, const char*); - } - - return dbd_mysql_pselect(pool, sql, res, statement, random, values); -} - -static void dbd_mysql_bbind(apr_pool_t *pool, apr_dbd_prepared_t *statement, - const void **values, MYSQL_BIND *bind) -{ - void *arg; - int i, j; - apr_dbd_type_e type; - - for (i = 0, j = 0; i < statement->nargs; i++, j++) { - arg = (void *)values[j]; - - bind[i].length = &bind[i].buffer_length; - bind[i].is_null = NULL; - - type = (arg == NULL ? APR_DBD_TYPE_NULL : statement->types[i]); - switch (type) { - case APR_DBD_TYPE_TINY: - bind[i].buffer = arg; - bind[i].buffer_type = MYSQL_TYPE_TINY; - bind[i].is_unsigned = 0; - break; - case APR_DBD_TYPE_UTINY: - bind[i].buffer = arg; - bind[i].buffer_type = MYSQL_TYPE_TINY; - bind[i].is_unsigned = 1; - break; - case APR_DBD_TYPE_SHORT: - bind[i].buffer = arg; - bind[i].buffer_type = MYSQL_TYPE_SHORT; - bind[i].is_unsigned = 0; - break; - case APR_DBD_TYPE_USHORT: - bind[i].buffer = arg; - bind[i].buffer_type = MYSQL_TYPE_SHORT; - bind[i].is_unsigned = 1; - break; - case APR_DBD_TYPE_INT: - bind[i].buffer = arg; - bind[i].buffer_type = MYSQL_TYPE_LONG; - bind[i].is_unsigned = 0; - break; - case APR_DBD_TYPE_UINT: - bind[i].buffer = arg; - bind[i].buffer_type = MYSQL_TYPE_LONG; - bind[i].is_unsigned = 1; - break; - case APR_DBD_TYPE_LONG: - if (sizeof(int) == sizeof(long)) { - bind[i].buffer = arg; - } - else { - bind[i].buffer = apr_palloc(pool, sizeof(int)); - *(int*)bind[i].buffer = *(long*)arg; - } - bind[i].buffer_type = MYSQL_TYPE_LONG; - bind[i].is_unsigned = 0; - break; - case APR_DBD_TYPE_ULONG: - if (sizeof(unsigned int) == sizeof(unsigned long)) { - bind[i].buffer = arg; - } - else { - bind[i].buffer = apr_palloc(pool, sizeof(unsigned int)); - *(unsigned int*)bind[i].buffer = *(unsigned long*)arg; - } - bind[i].buffer_type = MYSQL_TYPE_LONG; - bind[i].is_unsigned = 1; - break; - case APR_DBD_TYPE_LONGLONG: - if (sizeof(my_ulonglong) == sizeof(apr_int64_t)) { - bind[i].buffer = arg; - bind[i].buffer_type = MYSQL_TYPE_LONGLONG; - } - else { /* have to downsize, long long is not portable */ - bind[i].buffer = apr_palloc(pool, sizeof(long)); - *(long*)bind[i].buffer = (long) *(apr_int64_t*)arg; - bind[i].buffer_type = MYSQL_TYPE_LONG; - } - bind[i].is_unsigned = 0; - break; - case APR_DBD_TYPE_ULONGLONG: - if (sizeof(my_ulonglong) == sizeof(apr_uint64_t)) { - bind[i].buffer = arg; - bind[i].buffer_type = MYSQL_TYPE_LONGLONG; - } - else { /* have to downsize, long long is not portable */ - bind[i].buffer = apr_palloc(pool, sizeof(long)); - *(unsigned long*)bind[i].buffer = - (unsigned long) *(apr_uint64_t*)arg; - bind[i].buffer_type = MYSQL_TYPE_LONG; - } - bind[i].is_unsigned = 1; - break; - case APR_DBD_TYPE_FLOAT: - bind[i].buffer = arg; - bind[i].buffer_type = MYSQL_TYPE_FLOAT; - bind[i].is_unsigned = 0; - break; - case APR_DBD_TYPE_DOUBLE: - bind[i].buffer = arg; - bind[i].buffer_type = MYSQL_TYPE_DOUBLE; - bind[i].is_unsigned = 0; - break; - case APR_DBD_TYPE_STRING: - case APR_DBD_TYPE_TEXT: - case APR_DBD_TYPE_TIME: - case APR_DBD_TYPE_DATE: - case APR_DBD_TYPE_DATETIME: - case APR_DBD_TYPE_TIMESTAMP: - case APR_DBD_TYPE_ZTIMESTAMP: - bind[i].buffer = arg; - bind[i].buffer_type = MYSQL_TYPE_VAR_STRING; - bind[i].is_unsigned = 0; - bind[i].buffer_length = strlen((const char *)arg); - break; - case APR_DBD_TYPE_BLOB: - case APR_DBD_TYPE_CLOB: - bind[i].buffer = (void *)arg; - bind[i].buffer_type = MYSQL_TYPE_LONG_BLOB; - bind[i].is_unsigned = 0; - bind[i].buffer_length = *(apr_size_t*)values[++j]; - - /* skip table and column */ - j += 2; - break; - case APR_DBD_TYPE_NULL: - default: - bind[i].buffer_type = MYSQL_TYPE_NULL; - break; - } - } - - return; -} - -static int dbd_mysql_pbquery(apr_pool_t *pool, apr_dbd_t *sql, - int *nrows, apr_dbd_prepared_t *statement, - const void **values) -{ - MYSQL_BIND *bind; - int ret; - - if (sql->trans && sql->trans->errnum) { - return sql->trans->errnum; - } - - bind = apr_palloc(pool, statement->nargs * sizeof(MYSQL_BIND)); - - dbd_mysql_bbind(pool, statement, values, bind); - - ret = dbd_mysql_pquery_internal(pool, sql, nrows, statement, bind); - - if (TXN_NOTICE_ERRORS(sql->trans)) { - sql->trans->errnum = ret; - } - return ret; -} - -static int dbd_mysql_pvbquery(apr_pool_t *pool, apr_dbd_t *sql, int *nrows, - apr_dbd_prepared_t *statement, va_list args) -{ - const void **values; - int i; - - if (sql->trans && sql->trans->errnum) { - return sql->trans->errnum; - } - - values = apr_palloc(pool, sizeof(*values) * statement->nvals); - - for (i = 0; i < statement->nvals; i++) { - values[i] = va_arg(args, const void*); - } - - return dbd_mysql_pbquery(pool, sql, nrows, statement, values); -} - -static int dbd_mysql_pbselect(apr_pool_t *pool, apr_dbd_t *sql, - apr_dbd_results_t **res, - apr_dbd_prepared_t *statement, int random, - const void **args) -{ - int ret; - MYSQL_BIND *bind; - - if (sql->trans && sql->trans->errnum) { - return sql->trans->errnum; - } - - bind = apr_palloc(pool, statement->nargs * sizeof(MYSQL_BIND)); - - dbd_mysql_bbind(pool, statement, args, bind); - - ret = dbd_mysql_pselect_internal(pool, sql, res, statement, random, bind); - - if (TXN_NOTICE_ERRORS(sql->trans)) { - sql->trans->errnum = ret; - } - return ret; -} - -static int dbd_mysql_pvbselect(apr_pool_t *pool, apr_dbd_t *sql, - apr_dbd_results_t **res, - apr_dbd_prepared_t *statement, int random, - va_list args) -{ - const void **values; - int i; - - if (sql->trans && sql->trans->errnum) { - return sql->trans->errnum; - } - - values = apr_palloc(pool, sizeof(*values) * statement->nvals); - - for (i = 0; i < statement->nvals; i++) { - values[i] = va_arg(args, const void*); - } - - return dbd_mysql_pbselect(pool, sql, res, statement, random, values); -} - -static int dbd_mysql_end_transaction(apr_dbd_transaction_t *trans) -{ - int ret = -1; - if (trans) { - /* rollback on error or explicit rollback request */ - if (trans->errnum || TXN_DO_ROLLBACK(trans)) { - trans->errnum = 0; - ret = mysql_rollback(trans->handle->conn); - } - else { - ret = mysql_commit(trans->handle->conn); - } - ret |= mysql_autocommit(trans->handle->conn, 1); - trans->handle->trans = NULL; - } - return ret; -} -/* Whether or not transactions work depends on whether the - * underlying DB supports them within MySQL. Unfortunately - * it fails silently with the default InnoDB. - */ - -static int dbd_mysql_transaction(apr_pool_t *pool, apr_dbd_t *handle, - apr_dbd_transaction_t **trans) -{ - /* Don't try recursive transactions here */ - if (handle->trans) { - dbd_mysql_end_transaction(handle->trans) ; - } - if (!*trans) { - *trans = apr_pcalloc(pool, sizeof(apr_dbd_transaction_t)); - } - (*trans)->errnum = mysql_autocommit(handle->conn, 0); - (*trans)->handle = handle; - handle->trans = *trans; - return (*trans)->errnum; -} - -static int dbd_mysql_transaction_mode_get(apr_dbd_transaction_t *trans) -{ - if (!trans) - return APR_DBD_TRANSACTION_COMMIT; - - return trans->mode; -} - -static int dbd_mysql_transaction_mode_set(apr_dbd_transaction_t *trans, - int mode) -{ - if (!trans) - return APR_DBD_TRANSACTION_COMMIT; - - return trans->mode = (mode & TXN_MODE_BITS); -} - -static apr_dbd_t *dbd_mysql_open(apr_pool_t *pool, const char *params, - const char **error) -{ - static const char *const delims = " \r\n\t;|,"; - const char *ptr; - int i; - const char *key; - size_t klen; - const char *value; - size_t vlen; -#if MYSQL_VERSION_ID >= 50013 - my_bool do_reconnect = 1; -#endif - MYSQL *real_conn; - unsigned long flags = 0; - - struct { - const char *field; - const char *value; - } fields[] = { - {"host", NULL}, - {"user", NULL}, - {"pass", NULL}, - {"dbname", NULL}, - {"port", NULL}, - {"sock", NULL}, - {"flags", NULL}, - {"fldsz", NULL}, - {"group", NULL}, - {"reconnect", NULL}, - {NULL, NULL} - }; - unsigned int port = 0; - apr_dbd_t *sql = apr_pcalloc(pool, sizeof(apr_dbd_t)); - sql->fldsz = FIELDSIZE; - sql->conn = mysql_init(sql->conn); - if ( sql->conn == NULL ) { - return NULL; - } - for (ptr = strchr(params, '='); ptr; ptr = strchr(ptr, '=')) { - /* don't dereference memory that may not belong to us */ - if (ptr == params) { - ++ptr; - continue; - } - for (key = ptr-1; apr_isspace(*key); --key); - klen = 0; - while (apr_isalpha(*key)) { - /* don't parse backwards off the start of the string */ - if (key == params) { - --key; - ++klen; - break; - } - --key; - ++klen; - } - ++key; - for (value = ptr+1; apr_isspace(*value); ++value); - vlen = strcspn(value, delims); - for (i = 0; fields[i].field != NULL; i++) { - if (!strncasecmp(fields[i].field, key, klen)) { - fields[i].value = apr_pstrndup(pool, value, vlen); - break; - } - } - ptr = value+vlen; - } - if (fields[4].value != NULL) { - port = atoi(fields[4].value); - } - if (fields[6].value != NULL && - !strcmp(fields[6].value, "CLIENT_FOUND_ROWS")) { - flags |= CLIENT_FOUND_ROWS; /* only option we know */ - } - if (fields[7].value != NULL) { - sql->fldsz = atol(fields[7].value); - } - if (fields[8].value != NULL) { - mysql_options(sql->conn, MYSQL_READ_DEFAULT_GROUP, fields[8].value); - } -#if MYSQL_VERSION_ID >= 50013 - if (fields[9].value != NULL) { - do_reconnect = atoi(fields[9].value) ? 1 : 0; - } -#endif - -#if MYSQL_VERSION_ID >= 50013 - /* the MySQL manual says this should be BEFORE mysql_real_connect */ - mysql_options(sql->conn, MYSQL_OPT_RECONNECT, &do_reconnect); -#endif - - real_conn = mysql_real_connect(sql->conn, fields[0].value, - fields[1].value, fields[2].value, - fields[3].value, port, - fields[5].value, flags); - - if(real_conn == NULL) { - if (error) { - *error = apr_pstrdup(pool, mysql_error(sql->conn)); - } - mysql_close(sql->conn); - return NULL; - } - -#if MYSQL_VERSION_ID >= 50013 - /* Some say this should be AFTER mysql_real_connect */ - mysql_options(sql->conn, MYSQL_OPT_RECONNECT, &do_reconnect); -#endif - - return sql; -} - -static apr_status_t dbd_mysql_close(apr_dbd_t *handle) -{ - mysql_close(handle->conn); - return APR_SUCCESS; -} - -static apr_status_t dbd_mysql_check_conn(apr_pool_t *pool, - apr_dbd_t *handle) -{ - return mysql_ping(handle->conn) ? APR_EGENERAL : APR_SUCCESS; -} - -static int dbd_mysql_select_db(apr_pool_t *pool, apr_dbd_t* handle, - const char* name) -{ - return mysql_select_db(handle->conn, name); -} - -static void *dbd_mysql_native(apr_dbd_t *handle) -{ - return handle->conn; -} - -static int dbd_mysql_num_cols(apr_dbd_results_t *res) -{ - if (res->statement) { - return mysql_stmt_field_count(res->statement); - } - else { - return mysql_num_fields(res->res); - } -} - -static int dbd_mysql_num_tuples(apr_dbd_results_t *res) -{ - if (res->random) { - if (res->statement) { - return (int) mysql_stmt_num_rows(res->statement); - } - else { - return (int) mysql_num_rows(res->res); - } - } - else { - return -1; - } -} - -static apr_status_t thread_end(void *data) -{ - mysql_thread_end(); - return APR_SUCCESS; -} - -static void dbd_mysql_init(apr_pool_t *pool) -{ - my_init(); - mysql_thread_init(); - - /* FIXME: this is a guess; find out what it really does */ - apr_pool_cleanup_register(pool, NULL, thread_end, apr_pool_cleanup_null); -} -APU_MODULE_DECLARE_DATA const apr_dbd_driver_t apr_dbd_mysql_driver = { - "mysql", - dbd_mysql_init, - dbd_mysql_native, - dbd_mysql_open, - dbd_mysql_check_conn, - dbd_mysql_close, - dbd_mysql_select_db, - dbd_mysql_transaction, - dbd_mysql_end_transaction, - dbd_mysql_query, - dbd_mysql_select, - dbd_mysql_num_cols, - dbd_mysql_num_tuples, - dbd_mysql_get_row, - dbd_mysql_get_entry, - dbd_mysql_error, - dbd_mysql_escape, - dbd_mysql_prepare, - dbd_mysql_pvquery, - dbd_mysql_pvselect, - dbd_mysql_pquery, - dbd_mysql_pselect, - dbd_mysql_get_name, - dbd_mysql_transaction_mode_get, - dbd_mysql_transaction_mode_set, - "?", - dbd_mysql_pvbquery, - dbd_mysql_pvbselect, - dbd_mysql_pbquery, - dbd_mysql_pbselect, - dbd_mysql_datum_get -}; - -#endif