[dovecot-cvs] dovecot/src/lib-sql .cvsignore, 1.1, 1.2 Makefile.am,
1.3, 1.4 driver-mysql.c, 1.13, 1.14 driver-pgsql.c, 1.8,
1.9 driver-sqlite.c, 1.2, 1.3 sql-api-private.h, 1.5,
1.6 sql-api.c, 1.7, 1.8 sql-api.h, 1.6, 1.7
cras at dovecot.org
cras at dovecot.org
Fri Jan 27 00:01:11 EET 2006
Update of /var/lib/cvs/dovecot/src/lib-sql
In directory talvi:/tmp/cvs-serv4769/src/lib-sql
Modified Files:
.cvsignore Makefile.am driver-mysql.c driver-pgsql.c
driver-sqlite.c sql-api-private.h sql-api.c sql-api.h
Log Message:
Added support for dynamically building SQL drivers.
Index: .cvsignore
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-sql/.cvsignore,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- .cvsignore 15 Oct 2004 23:12:52 -0000 1.1
+++ .cvsignore 26 Jan 2006 22:01:08 -0000 1.2
@@ -6,3 +6,4 @@
Makefile
Makefile.in
so_locations
+sql-drivers-register.c
Index: Makefile.am
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-sql/Makefile.am,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- Makefile.am 22 Jan 2006 12:09:14 -0000 1.3
+++ Makefile.am 26 Jan 2006 22:01:08 -0000 1.4
@@ -1,5 +1,7 @@
noinst_LIBRARIES = libsql.a
+sql_drivers = @sql_drivers@
+
AM_CPPFLAGS = \
-I$(top_srcdir)/src/lib \
$(SQL_CFLAGS)
@@ -8,8 +10,28 @@
driver-mysql.c \
driver-pgsql.c \
driver-sqlite.c \
- sql-api.c
+ sql-api.c \
+ sql-drivers-register.c
noinst_HEADERS = \
sql-api.h \
sql-api-private.h
+
+sql-drivers-register.c: Makefile
+ rm -f $@
+ echo '/* this file automatically generated by Makefile */' >$@
+ echo '#include "lib.h"' >>$@
+ echo '#include "sql-api.h"' >>$@
+ for i in $(sql_drivers) ; do \
+ echo "extern struct sql_db driver_$${i}_db;" >>$@ ; \
+ done
+ echo 'void sql_drivers_register_all(void) {' >>$@
+ for i in $(sql_drivers) ; do \
+ echo "sql_driver_register(&driver_$${i}_db);" >>$@ ; \
+ done
+ echo '}' >>$@
+
+DISTFILES = $(DIST_COMMON) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+distclean-generic:
+ rm -f Makefile sql-drivers-register.c
Index: driver-mysql.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-sql/driver-mysql.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- driver-mysql.c 14 Jan 2006 18:47:40 -0000 1.13
+++ driver-mysql.c 26 Jan 2006 22:01:08 -0000 1.14
@@ -5,7 +5,7 @@
#include "str.h"
#include "sql-api-private.h"
-#ifdef HAVE_MYSQL
+#ifdef BUILD_MYSQL
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
@@ -68,6 +68,7 @@
string_t *queries;
};
+extern struct sql_db driver_mysql_db;
extern struct sql_result driver_mysql_result;
extern struct sql_result driver_mysql_error_result;
@@ -231,7 +232,7 @@
i_fatal("mysql: No hosts given in connect string");
}
-static struct sql_db *driver_mysql_init(const char *connect_string)
+static struct sql_db *_driver_mysql_init(const char *connect_string)
{
struct mysql_db *db;
pool_t pool;
@@ -249,7 +250,7 @@
return &db->api;
}
-static void driver_mysql_deinit(struct sql_db *_db)
+static void _driver_mysql_deinit(struct sql_db *_db)
{
struct mysql_db *db = (struct mysql_db *)_db;
struct mysql_connection *conn;
@@ -573,8 +574,8 @@
struct sql_db driver_mysql_db = {
"mysql",
- driver_mysql_init,
- driver_mysql_deinit,
+ _driver_mysql_init,
+ _driver_mysql_deinit,
driver_mysql_get_flags,
driver_mysql_connect_all,
driver_mysql_exec,
@@ -621,4 +622,18 @@
FALSE
};
+
+void driver_mysql_init(void);
+void driver_mysql_deinit(void);
+
+void driver_mysql_init(void)
+{
+ sql_driver_register(&driver_mysql_db);
+}
+
+void driver_mysql_deinit(void)
+{
+ sql_driver_unregister(&driver_mysql_db);
+}
+
#endif
Index: driver-pgsql.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-sql/driver-pgsql.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- driver-pgsql.c 14 Jan 2006 18:47:40 -0000 1.8
+++ driver-pgsql.c 26 Jan 2006 22:01:08 -0000 1.9
@@ -5,7 +5,7 @@
#include "ioloop-internal.h" /* kind of dirty, but it should be fine.. */
#include "sql-api-private.h"
-#ifdef HAVE_PGSQL
+#ifdef BUILD_PGSQL
#include <stdlib.h>
#include <time.h>
#include <libpq-fe.h>
@@ -66,6 +66,7 @@
unsigned int failed:1;
};
+extern struct sql_db driver_pgsql_db;
extern struct sql_result driver_pgsql_result;
static void queue_send_next(struct pgsql_db *db);
@@ -166,7 +167,7 @@
}
}
-static struct sql_db *driver_pgsql_init(const char *connect_string)
+static struct sql_db *_driver_pgsql_init(const char *connect_string)
{
struct pgsql_db *db;
@@ -179,7 +180,7 @@
return &db->api;
}
-static void driver_pgsql_deinit(struct sql_db *_db)
+static void _driver_pgsql_deinit(struct sql_db *_db)
{
struct pgsql_db *db = (struct pgsql_db *)_db;
@@ -737,8 +738,8 @@
struct sql_db driver_pgsql_db = {
"pgsql",
- driver_pgsql_init,
- driver_pgsql_deinit,
+ _driver_pgsql_init,
+ _driver_pgsql_deinit,
driver_pgsql_get_flags,
driver_pgsql_connect,
driver_pgsql_exec,
@@ -769,4 +770,17 @@
FALSE
};
+void driver_pgsql_init(void);
+void driver_pgsql_deinit(void);
+
+void driver_pgsql_init(void)
+{
+ sql_driver_register(&driver_pgsql_db);
+}
+
+void driver_pgsql_deinit(void)
+{
+ sql_driver_unregister(&driver_pgsql_db);
+}
+
#endif
Index: driver-sqlite.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-sql/driver-sqlite.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- driver-sqlite.c 23 Jan 2006 14:22:08 -0000 1.2
+++ driver-sqlite.c 26 Jan 2006 22:01:08 -0000 1.3
@@ -4,7 +4,7 @@
#include "str.h"
#include "sql-api-private.h"
-#ifdef HAVE_SQLITE
+#ifdef BUILD_SQLITE
#include <stdlib.h>
#include <time.h>
#include <sqlite3.h>
@@ -34,6 +34,7 @@
unsigned int failed:1;
};
+extern struct sql_db driver_sqlite_db;
extern struct sql_result driver_sqlite_result;
extern struct sql_result driver_sqlite_error_result;
@@ -58,7 +59,7 @@
}
}
-static struct sql_db *driver_sqlite_init(const char *connect_string)
+static struct sql_db *_driver_sqlite_init(const char *connect_string)
{
struct sqlite_db *db;
pool_t pool;
@@ -75,7 +76,7 @@
return &db->api;
}
-static void driver_sqlite_deinit(struct sql_db *_db)
+static void _driver_sqlite_deinit(struct sql_db *_db)
{
struct sqlite_db *db = (struct sqlite_db *)_db;
@@ -331,8 +332,8 @@
struct sql_db driver_sqlite_db = {
"sqlite",
- driver_sqlite_init,
- driver_sqlite_deinit,
+ _driver_sqlite_init,
+ _driver_sqlite_deinit,
driver_sqlite_get_flags,
driver_sqlite_connect,
driver_sqlite_exec,
@@ -379,4 +380,17 @@
FALSE
};
+void driver_sqlite_init(void);
+void driver_sqlite_deinit(void);
+
+void driver_sqlite_init(void)
+{
+ sql_driver_register(&driver_sqlite_db);
+}
+
+void driver_sqlite_deinit(void)
+{
+ sql_driver_unregister(&driver_sqlite_db);
+}
+
#endif
Index: sql-api-private.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-sql/sql-api-private.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- sql-api-private.h 22 Jan 2006 12:09:14 -0000 1.5
+++ sql-api-private.h 26 Jan 2006 22:01:08 -0000 1.6
@@ -54,10 +54,7 @@
struct sql_db *db;
};
-extern struct sql_db driver_mysql_db;
-extern struct sql_db driver_pgsql_db;
-extern struct sql_db driver_sqlite_db;
-
+extern array_t ARRAY_DEFINE(sql_drivers, const struct sql_db *);
extern struct sql_result sql_not_connected_result;
#endif
Index: sql-api.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-sql/sql-api.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- sql-api.c 22 Jan 2006 12:09:14 -0000 1.7
+++ sql-api.c 26 Jan 2006 22:01:08 -0000 1.8
@@ -1,29 +1,50 @@
-/* Copyright (c) 2004 Timo Sirainen */
+/* Copyright (c) 2004-2006 Timo Sirainen */
#include "lib.h"
+#include "array.h"
#include "sql-api-private.h"
-struct sql_db *sql_db_drivers[] = {
-#ifdef HAVE_PGSQL
- &driver_pgsql_db,
-#endif
-#ifdef HAVE_MYSQL
- &driver_mysql_db,
-#endif
-#ifdef HAVE_SQLITE
- &driver_sqlite_db,
-#endif
- NULL
-};
+array_t ARRAY_DEFINE(sql_drivers, const struct sql_db *);
+
+void sql_drivers_init(void)
+{
+ ARRAY_CREATE(&sql_drivers, default_pool, const struct sql_db *, 8);
+}
+
+void sql_drivers_deinit(void)
+{
+ array_free(&sql_drivers);
+}
+
+void sql_driver_register(const struct sql_db *driver)
+{
+ array_append(&sql_drivers, &driver, 1);
+}
+
+void sql_driver_unregister(const struct sql_db *driver)
+{
+ const struct sql_db *const *drivers;
+ unsigned int i, count;
+
+ drivers = array_get(&sql_drivers, &count);
+ for (i = 0; i < count; i++) {
+ if (drivers[i] == driver) {
+ array_delete(&sql_drivers, i, 1);
+ break;
+ }
+ }
+}
struct sql_db *sql_init(const char *db_driver,
const char *connect_string __attr_unused__)
{
- int i;
+ const struct sql_db *const *drivers;
+ unsigned int i, count;
- for (i = 0; sql_db_drivers[i] != NULL; i++) {
- if (strcmp(db_driver, sql_db_drivers[i]->name) == 0)
- return sql_db_drivers[i]->init(connect_string);
+ drivers = array_get(&sql_drivers, &count);
+ for (i = 0; i < count; i++) {
+ if (strcmp(db_driver, drivers[i]->name) == 0)
+ return drivers[i]->init(connect_string);
}
i_fatal("Unknown database driver '%s'", db_driver);
Index: sql-api.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-sql/sql-api.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- sql-api.h 14 Jan 2006 18:47:40 -0000 1.6
+++ sql-api.h 26 Jan 2006 22:01:08 -0000 1.7
@@ -15,7 +15,14 @@
typedef void sql_query_callback_t(struct sql_result *result, void *context);
typedef void sql_commit_callback_t(const char *error, void *context);
-extern struct sql_db *sql_db_drivers[];
+void sql_drivers_init(void);
+void sql_drivers_deinit(void);
+
+/* register all built-in SQL drivers */
+void sql_drivers_register_all(void);
+
+void sql_driver_register(const struct sql_db *driver);
+void sql_driver_unregister(const struct sql_db *driver);
/* Initialize database connections. db_driver is the database driver name,
eg. "mysql" or "pgsql". connect_string is driver-specific. */
More information about the dovecot-cvs
mailing list