[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