From 76e18b050c02c9dc04d25015a9b3d0a0ce162ebe Mon Sep 17 00:00:00 2001 From: Shane Wegner Date: Thu, 7 Apr 2011 13:29:15 -0700 Subject: [PATCH] Conditionally compile MySQL and SQLite3 support --- Makefile.am | 6 +- autogen.sh | 2 +- config.c | 7 +- configure.ac | 5 +- db-mysql.c | 3 + db-sqlite.c | 3 + m4/ax_lib_mysql.m4 | 147 +++++++++++++++++++++++++++++++++++++++++ m4/ax_lib_sqlite3.m4 | 151 +++++++++++++++++++++++++++++++++++++++++++ server.c | 9 ++- server.h | 6 ++ 10 files changed, 330 insertions(+), 9 deletions(-) create mode 100644 m4/ax_lib_mysql.m4 create mode 100644 m4/ax_lib_sqlite3.m4 diff --git a/Makefile.am b/Makefile.am index c5be0b3..78c5b90 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,7 +1,7 @@ EXTRA_DIST = example-cfg.json -INCLUDES = $(PTHREAD_FLAGS) @MYSQL_CLIENT_CFLAGS@ -fno-strict-aliasing +INCLUDES = $(PTHREAD_FLAGS) @SQLITE3_CFLAGS@ @MYSQL_CFLAGS@ -fno-strict-aliasing bin_PROGRAMS = pushpoold @@ -10,6 +10,6 @@ pushpoold_SOURCES = anet.h elist.h htab.h protocol.h server.h ubbp.h \ db-sqlite.c db-mysql.c pushpoold_LDFLAGS = $(PTHREAD_FLAGS) pushpoold_LDADD = @LIBCURL@ @EVENT_LIBS@ @PTHREAD_LIBS@ @JANSSON_LIBS@ \ - @CRYPTO_LIBS@ @Z_LIBS@ @SQLITE3_LIBS@ \ - @MYSQL_CLIENT_LIBS@ + @CRYPTO_LIBS@ @Z_LIBS@ @SQLITE3_LDFLAGS@ \ + @MYSQL_LDFLAGS@ diff --git a/autogen.sh b/autogen.sh index 989604a..e333194 100755 --- a/autogen.sh +++ b/autogen.sh @@ -5,7 +5,7 @@ set -e -aclocal +aclocal -I m4 autoheader automake --gnu --add-missing --copy autoconf diff --git a/config.c b/config.c index dcfa059..fb3053a 100644 --- a/config.c +++ b/config.c @@ -167,12 +167,17 @@ static void parse_database(const json_t *db_obj) tmp_str = json_string_value(json_object_get(db_obj, "engine")); if (tmp_str) { - if (!strcmp(tmp_str, "sqlite3")) { + if (0) { +#ifdef HAVE_SQLITE3 /**/ + } else if (!strcmp(tmp_str, "sqlite3")) { srv.db_eng = SDB_SQLITE; srv.db_ops = &sqlite_db_ops; +#endif +#ifdef HAVE_MYSQL } else if (!strcmp(tmp_str, "mysql")) { srv.db_eng = SDB_MYSQL; srv.db_ops = &mysql_db_ops; +#endif } else { applog(LOG_ERR, "invalid database.engine"); exit(1); diff --git a/configure.ac b/configure.ac index 5c30dba..7d3f9d5 100644 --- a/configure.ac +++ b/configure.ac @@ -38,12 +38,11 @@ AC_CHECK_LIB(jansson, json_loads, JANSSON_LIBS=-ljansson, [AC_MSG_ERROR([Missing required jansson library])]) AC_CHECK_LIB(crypto, MD5_Init, CRYPTO_LIBS=-lcrypto, [AC_MSG_ERROR([Missing required OpenSSL library])]) -AC_CHECK_LIB(sqlite3, sqlite3_open_v2, SQLITE3_LIBS=-lsqlite3, - [AC_MSG_ERROR([Missing required SQLite 3.x library])]) PKG_PROG_PKG_CONFIG() -MYSQL_CLIENT() +AX_LIB_SQLITE3() +AX_LIB_MYSQL() LIBCURL_CHECK_CONFIG(, 7.10.1, , [AC_MSG_ERROR([Missing required libcurl >= 7.10.1])]) diff --git a/db-mysql.c b/db-mysql.c index eda9187..ed6d53c 100644 --- a/db-mysql.c +++ b/db-mysql.c @@ -22,6 +22,8 @@ #endif #include "autotools-config.h" +#ifdef HAVE_MYSQL + #include #include #include @@ -126,3 +128,4 @@ struct server_db_ops mysql_db_ops = { .close = my_close, }; +#endif /* HAVE_MYSQL */ diff --git a/db-sqlite.c b/db-sqlite.c index 5285db0..d540149 100644 --- a/db-sqlite.c +++ b/db-sqlite.c @@ -22,6 +22,8 @@ #endif #include "autotools-config.h" +#ifdef HAVE_SQLITE3 /**/ + #include #include #include @@ -96,3 +98,4 @@ struct server_db_ops sqlite_db_ops = { .close = sql_close, }; +#endif /* HAVE_SQLITE3 /**/ */ diff --git a/m4/ax_lib_mysql.m4 b/m4/ax_lib_mysql.m4 new file mode 100644 index 0000000..e27d755 --- /dev/null +++ b/m4/ax_lib_mysql.m4 @@ -0,0 +1,147 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_lib_mysql.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_LIB_MYSQL([MINIMUM-VERSION]) +# +# DESCRIPTION +# +# This macro provides tests of availability of MySQL client library of +# particular version or newer. +# +# AX_LIB_MYSQL macro takes only one argument which is optional. If there +# is no required version passed, then macro does not run version test. +# +# The --with-mysql option takes one of three possible values: +# +# no - do not check for MySQL client library +# +# yes - do check for MySQL library in standard locations (mysql_config +# should be in the PATH) +# +# path - complete path to mysql_config utility, use this option if +# mysql_config can't be found in the PATH +# +# This macro calls: +# +# AC_SUBST(MYSQL_CFLAGS) +# AC_SUBST(MYSQL_LDFLAGS) +# AC_SUBST(MYSQL_VERSION) +# +# And sets: +# +# HAVE_MYSQL +# +# LICENSE +# +# Copyright (c) 2008 Mateusz Loskot +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 12 + +AC_DEFUN([AX_LIB_MYSQL], +[ + AC_ARG_WITH([mysql], + AS_HELP_STRING([--with-mysql=@<:@ARG@:>@], + [use MySQL client library @<:@default=yes@:>@, optionally specify path to mysql_config] + ), + [ + if test "$withval" = "no"; then + want_mysql="no" + elif test "$withval" = "yes"; then + want_mysql="yes" + else + want_mysql="yes" + MYSQL_CONFIG="$withval" + fi + ], + [want_mysql="yes"] + ) + AC_ARG_VAR([MYSQL_CONFIG], [Full path to mysql_config program]) + + MYSQL_CFLAGS="" + MYSQL_LDFLAGS="" + MYSQL_VERSION="" + + dnl + dnl Check MySQL libraries + dnl + + if test "$want_mysql" = "yes"; then + + if test -z "$MYSQL_CONFIG" ; then + AC_PATH_PROGS([MYSQL_CONFIG], [mysql_config mysql_config5], [no]) + fi + + if test "$MYSQL_CONFIG" != "no"; then + MYSQL_CFLAGS="`$MYSQL_CONFIG --cflags`" + MYSQL_LDFLAGS="`$MYSQL_CONFIG --libs`" + + MYSQL_VERSION=`$MYSQL_CONFIG --version` + + found_mysql="yes" + else + found_mysql="no" + fi + fi + + dnl + dnl Check if required version of MySQL is available + dnl + + + mysql_version_req=ifelse([$1], [], [], [$1]) + + if test "$found_mysql" = "yes" -a -n "$mysql_version_req"; then + + AC_MSG_CHECKING([if MySQL version is >= $mysql_version_req]) + + dnl Decompose required version string of MySQL + dnl and calculate its number representation + mysql_version_req_major=`expr $mysql_version_req : '\([[0-9]]*\)'` + mysql_version_req_minor=`expr $mysql_version_req : '[[0-9]]*\.\([[0-9]]*\)'` + mysql_version_req_micro=`expr $mysql_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` + if test "x$mysql_version_req_micro" = "x"; then + mysql_version_req_micro="0" + fi + + mysql_version_req_number=`expr $mysql_version_req_major \* 1000000 \ + \+ $mysql_version_req_minor \* 1000 \ + \+ $mysql_version_req_micro` + + dnl Decompose version string of installed MySQL + dnl and calculate its number representation + mysql_version_major=`expr $MYSQL_VERSION : '\([[0-9]]*\)'` + mysql_version_minor=`expr $MYSQL_VERSION : '[[0-9]]*\.\([[0-9]]*\)'` + mysql_version_micro=`expr $MYSQL_VERSION : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` + if test "x$mysql_version_micro" = "x"; then + mysql_version_micro="0" + fi + + mysql_version_number=`expr $mysql_version_major \* 1000000 \ + \+ $mysql_version_minor \* 1000 \ + \+ $mysql_version_micro` + + mysql_version_check=`expr $mysql_version_number \>\= $mysql_version_req_number` + if test "$mysql_version_check" = "1"; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + fi + + if test "$found_mysql" = "yes" ; then + AC_DEFINE([HAVE_MYSQL], [1], + [Define to 1 if MySQL libraries are available]) + fi + + AC_SUBST([MYSQL_VERSION]) + AC_SUBST([MYSQL_CFLAGS]) + AC_SUBST([MYSQL_LDFLAGS]) +]) diff --git a/m4/ax_lib_sqlite3.m4 b/m4/ax_lib_sqlite3.m4 new file mode 100644 index 0000000..89f4025 --- /dev/null +++ b/m4/ax_lib_sqlite3.m4 @@ -0,0 +1,151 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_lib_sqlite3.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_LIB_SQLITE3([MINIMUM-VERSION]) +# +# DESCRIPTION +# +# Test for the SQLite 3 library of a particular version (or newer) +# +# This macro takes only one optional argument, required version of SQLite +# 3 library. If required version is not passed, 3.0.0 is used in the test +# of existance of SQLite 3. +# +# If no intallation prefix to the installed SQLite library is given the +# macro searches under /usr, /usr/local, and /opt. +# +# This macro calls: +# +# AC_SUBST(SQLITE3_CFLAGS) +# AC_SUBST(SQLITE3_LDFLAGS) +# AC_SUBST(SQLITE3_VERSION) +# +# And sets: +# +# HAVE_SQLITE3 +# +# LICENSE +# +# Copyright (c) 2008 Mateusz Loskot +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 10 + +AC_DEFUN([AX_LIB_SQLITE3], +[ + AC_ARG_WITH([sqlite3], + AS_HELP_STRING( + [--with-sqlite3=@<:@ARG@:>@], + [use SQLite 3 library @<:@default=yes@:>@, optionally specify the prefix for sqlite3 library] + ), + [ + if test "$withval" = "no"; then + WANT_SQLITE3="no" + elif test "$withval" = "yes"; then + WANT_SQLITE3="yes" + ac_sqlite3_path="" + else + WANT_SQLITE3="yes" + ac_sqlite3_path="$withval" + fi + ], + [WANT_SQLITE3="yes"] + ) + + SQLITE3_CFLAGS="" + SQLITE3_LDFLAGS="" + SQLITE3_VERSION="" + + if test "x$WANT_SQLITE3" = "xyes"; then + + ac_sqlite3_header="sqlite3.h" + + sqlite3_version_req=ifelse([$1], [], [3.0.0], [$1]) + sqlite3_version_req_shorten=`expr $sqlite3_version_req : '\([[0-9]]*\.[[0-9]]*\)'` + sqlite3_version_req_major=`expr $sqlite3_version_req : '\([[0-9]]*\)'` + sqlite3_version_req_minor=`expr $sqlite3_version_req : '[[0-9]]*\.\([[0-9]]*\)'` + sqlite3_version_req_micro=`expr $sqlite3_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` + if test "x$sqlite3_version_req_micro" = "x" ; then + sqlite3_version_req_micro="0" + fi + + sqlite3_version_req_number=`expr $sqlite3_version_req_major \* 1000000 \ + \+ $sqlite3_version_req_minor \* 1000 \ + \+ $sqlite3_version_req_micro` + + AC_MSG_CHECKING([for SQLite3 library >= $sqlite3_version_req]) + + if test "$ac_sqlite3_path" = ""; then + for ac_sqlite3_path_tmp in /usr /usr/local /opt ; do + if test -f "$ac_sqlite3_path_tmp/include/$ac_sqlite3_header" \ + && test -r "$ac_sqlite3_path_tmp/include/$ac_sqlite3_header"; then + ac_sqlite3_path=$ac_sqlite3_path_tmp + break; + fi + done + fi + + ac_sqlite3_ldflags="$ac_sqlite3_ldflags -lsqlite3" + + saved_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $ac_sqlite3_cppflags" + + AC_LANG_PUSH(C++) + AC_COMPILE_IFELSE( + [ + AC_LANG_PROGRAM([[@%:@include ]], + [[ +#if (SQLITE_VERSION_NUMBER >= $sqlite3_version_req_number) +// Everything is okay +#else +# error SQLite version is too old +#endif + ]] + ) + ], + [ + AC_MSG_RESULT([yes]) + success="yes" + ], + [ + AC_MSG_RESULT([not found]) + success="no" + ] + ) + AC_LANG_POP([C++]) + + CPPFLAGS="$saved_CPPFLAGS" + + if test "$success" = "yes"; then + + SQLITE3_CFLAGS="$ac_sqlite3_cppflags" + SQLITE3_LDFLAGS="$ac_sqlite3_ldflags" + + ac_sqlite3_header_path="$ac_sqlite3_path/include/$ac_sqlite3_header" + + dnl Retrieve SQLite release version + if test "x$ac_sqlite3_header_path" != "x"; then + ac_sqlite3_version=`cat $ac_sqlite3_header_path \ + | grep '#define.*SQLITE_VERSION.*\"' | sed -e 's/.* "//' \ + | sed -e 's/"//'` + if test $ac_sqlite3_version != ""; then + SQLITE3_VERSION=$ac_sqlite3_version + else + AC_MSG_WARN([Can not find SQLITE_VERSION macro in sqlite3.h header to retrieve SQLite version!]) + fi + fi + + AC_SUBST(SQLITE3_CFLAGS) + AC_SUBST(SQLITE3_LDFLAGS) + AC_SUBST(SQLITE3_VERSION) + AC_DEFINE([HAVE_SQLITE3], [], [Have the SQLITE3 library]) + fi + fi +]) diff --git a/server.c b/server.c index 8d00643..c30bc6f 100644 --- a/server.c +++ b/server.c @@ -93,9 +93,16 @@ struct server srv = { .req_fd = -1, .share_fd = -1, +#if defined(HAVE_SQLITE3) .db_eng = SDB_SQLITE, - .db_port = -1, .db_ops = &sqlite_db_ops, +#elif defined(HAVE_MYSQL) + .db_eng = SDB_MYSQL, + .db_ops = &mysql_db_ops, +#else +#error("No valid database engines defined") +#endif + .db_port = -1, .cred_expire = 30, }; diff --git a/server.h b/server.h index 6bcaa89..43df03c 100644 --- a/server.h +++ b/server.h @@ -20,6 +20,8 @@ * */ +#include + #include #include #include @@ -210,7 +212,11 @@ extern bool hex2bin(unsigned char *p, const char *hexstr, size_t len); extern unsigned char * g_base64_decode (const char *text, size_t *out_len); /* db-*.c */ +#ifdef HAVE_SQLITE3 /**/ extern struct server_db_ops sqlite_db_ops; +#endif +#ifdef HAVE_MYSQL extern struct server_db_ops mysql_db_ops; +#endif #endif /* __SERVER_H__ */