From e6fca772f02564a63847bb2103ad754f1a42ffae Mon Sep 17 00:00:00 2001 From: Sebastian Harl Date: Sun, 27 Apr 2014 00:24:13 +0200 Subject: [PATCH] dbi utils: Added compat layer for DBI < 0.9. --- src/utils/dbi.c | 56 +++++++++++++++++++++++++++++++++++++++++ t/unit/utils/dbi_test.c | 43 +++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) diff --git a/src/utils/dbi.c b/src/utils/dbi.c index de2348e..b1fdaf1 100644 --- a/src/utils/dbi.c +++ b/src/utils/dbi.c @@ -41,6 +41,62 @@ #include #include +/* + * pre 0.9 DBI compat layer + */ + +#if LIBDBI_VERSION < 900 +#include + +typedef void *dbi_inst; + +static pthread_mutex_t dbi_lock = PTHREAD_MUTEX_INITIALIZER; +static int dbi_initialized = 0; + +static int +initialize_r(const char *driverdir, dbi_inst __attribute__((unused)) *pInst) +{ + int status = 0; + pthread_mutex_lock(&dbi_lock); + if (! dbi_initialized) + status = dbi_initialize(driverdir); + dbi_initialized = 1; + pthread_mutex_unlock(&dbi_lock); + return status; +} /* initialize_r */ + +static dbi_driver +driver_open_r(const char *name, dbi_inst __attribute__((unused)) Inst) +{ + dbi_driver driver; + pthread_mutex_lock(&dbi_lock); + driver = dbi_driver_open(name); + pthread_mutex_unlock(&dbi_lock); + return driver; +} /* driver_open_r */ + +static dbi_driver +driver_list_r(dbi_driver Current, dbi_inst __attribute__((unused)) Inst) +{ + dbi_driver driver; + pthread_mutex_lock(&dbi_lock); + driver = dbi_driver_list(Current); + pthread_mutex_unlock(&dbi_lock); + return driver; +} /* driver_list_r */ + +static void +shutdown_r(dbi_inst __attribute__((unused)) Inst) +{ + /* do nothing; we don't know if DBI is still in use */ +} /* shutdown_r */ + +#define dbi_initialize_r initialize_r +#define dbi_driver_open_r driver_open_r +#define dbi_driver_list_r driver_list_r +#define dbi_shutdown_r shutdown_r +#endif /* LIBDBI_VERSION < 900 */ + /* * private data types */ diff --git a/t/unit/utils/dbi_test.c b/t/unit/utils/dbi_test.c index 8a21ace..8a0811b 100644 --- a/t/unit/utils/dbi_test.c +++ b/t/unit/utils/dbi_test.c @@ -146,6 +146,19 @@ static mock_query_t *current_query = NULL; /* dbi_driver, dbi_conn, dbi_result are void pointers */ +#if LIBDBI_VERSION < 900 +typedef void *dbi_inst; + +int +dbi_initialize_r(const char *driverdir, dbi_inst *pInst); +void +dbi_shutdown_r(dbi_inst inst); +dbi_driver +dbi_driver_open_r(const char *name, dbi_inst inst); +dbi_driver +dbi_driver_list_r(dbi_driver curr, dbi_inst inst); +#endif + int dbi_initialize_r(const char __attribute__((unused)) *driverdir, dbi_inst __attribute__((unused)) *pInst) @@ -174,6 +187,36 @@ dbi_driver_list_r(dbi_driver curr, dbi_inst __attribute__((unused)) inst) return NULL; } /* dbi_driver_list */ +#if LIBDBI_VERSION < 900 +int +dbi_initialize(const char *driverdir) +{ + return dbi_initialize_r(driverdir, NULL); +} /* dbi_initialize */ + +/* for some weird reason, gcc and clang complain about a missing prototype for + * dbi_shutdown; however, the function is declared in dbi/dbi.h */ +void +dbi_shutdown(void); +void +dbi_shutdown(void) +{ + dbi_shutdown_r(NULL); +} /* dbi_shutdown */ + +dbi_driver +dbi_driver_open(const char *name) +{ + return dbi_driver_open_r(name, NULL); +} /* dbi_driver_open */ + +dbi_driver +dbi_driver_list(dbi_driver curr) +{ + return dbi_driver_list_r(curr, NULL); +} /* dbi_driver_list */ +#endif + const char * dbi_driver_get_name(dbi_driver driver) { -- 2.30.2