changeset 6474:46c3e1ee196f HEAD

Added module_contexts to struct sql_db.
author Timo Sirainen <tss@iki.fi>
date Sat, 22 Sep 2007 19:01:19 +0300
parents bd886e12aaa0
children ee420f238104
files src/lib-sql/driver-mysql.c src/lib-sql/driver-pgsql.c src/lib-sql/driver-sqlite.c src/lib-sql/sql-api-private.h src/lib-sql/sql-api.c
diffstat 5 files changed, 91 insertions(+), 68 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-sql/driver-mysql.c	Sat Sep 22 18:33:02 2007 +0300
+++ b/src/lib-sql/driver-mysql.c	Sat Sep 22 19:01:19 2007 +0300
@@ -245,14 +245,11 @@
 static struct sql_db *driver_mysql_init_v(const char *connect_string)
 {
 	struct mysql_db *db;
-	pool_t pool;
 
-	pool = pool_alloconly_create("mysql driver", 512);
-
-	db = p_new(pool, struct mysql_db, 1);
-	db->pool = pool;
+	db = i_new(struct mysql_db, 1);
+	db->pool = pool_alloconly_create("mysql driver", 512);;
 	db->api = driver_mysql_db;
-	p_array_init(&db->connections, pool, 6);
+	p_array_init(&db->connections, db->pool, 6);
 
 	driver_mysql_parse_connect_string(db, connect_string);
 	return &db->api;
@@ -657,21 +654,23 @@
 struct sql_db driver_mysql_db = {
 	"mysql",
 
-	driver_mysql_init_v,
-	driver_mysql_deinit_v,
-	driver_mysql_get_flags,
-        driver_mysql_connect_all,
-        driver_mysql_escape_string,
-	driver_mysql_exec,
-	driver_mysql_query,
-	driver_mysql_query_s,
+	MEMBER(v) {
+		driver_mysql_init_v,
+		driver_mysql_deinit_v,
+		driver_mysql_get_flags,
+		driver_mysql_connect_all,
+		driver_mysql_escape_string,
+		driver_mysql_exec,
+		driver_mysql_query,
+		driver_mysql_query_s,
 
-	driver_mysql_transaction_begin,
-	driver_mysql_transaction_commit,
-	driver_mysql_transaction_commit_s,
-	driver_mysql_transaction_rollback,
+		driver_mysql_transaction_begin,
+		driver_mysql_transaction_commit,
+		driver_mysql_transaction_commit_s,
+		driver_mysql_transaction_rollback,
 
-	driver_mysql_update
+		driver_mysql_update
+	}
 };
 
 struct sql_result driver_mysql_result = {
--- a/src/lib-sql/driver-pgsql.c	Sat Sep 22 18:33:02 2007 +0300
+++ b/src/lib-sql/driver-pgsql.c	Sat Sep 22 19:01:19 2007 +0300
@@ -213,7 +213,6 @@
         driver_pgsql_close(db);
 	i_free(db->error);
 	i_free(db->connect_string);
-	i_free(db);
 }
 
 static enum sql_db_flags
@@ -864,21 +863,23 @@
 struct sql_db driver_pgsql_db = {
 	"pgsql",
 
-	driver_pgsql_init_v,
-	driver_pgsql_deinit_v,
-        driver_pgsql_get_flags,
-	driver_pgsql_connect,
-	driver_pgsql_escape_string,
-	driver_pgsql_exec,
-	driver_pgsql_query,
-	driver_pgsql_query_s,
+	MEMBER(v) {
+		driver_pgsql_init_v,
+		driver_pgsql_deinit_v,
+		driver_pgsql_get_flags,
+		driver_pgsql_connect,
+		driver_pgsql_escape_string,
+		driver_pgsql_exec,
+		driver_pgsql_query,
+		driver_pgsql_query_s,
 
-	driver_pgsql_transaction_begin,
-	driver_pgsql_transaction_commit,
-	driver_pgsql_transaction_commit_s,
-	driver_pgsql_transaction_rollback,
+		driver_pgsql_transaction_begin,
+		driver_pgsql_transaction_commit,
+		driver_pgsql_transaction_commit_s,
+		driver_pgsql_transaction_rollback,
 
-	driver_pgsql_update
+		driver_pgsql_update
+	}
 };
 
 struct sql_result driver_pgsql_result = {
--- a/src/lib-sql/driver-sqlite.c	Sat Sep 22 18:33:02 2007 +0300
+++ b/src/lib-sql/driver-sqlite.c	Sat Sep 22 19:01:19 2007 +0300
@@ -60,13 +60,11 @@
 static struct sql_db *driver_sqlite_init_v(const char *connect_string)
 {
 	struct sqlite_db *db;
-	pool_t pool;
 
 	i_assert(connect_string != NULL);
 
-	pool = pool_alloconly_create("sqlite driver", 512);
-	db = p_new(pool, struct sqlite_db, 1);
-	db->pool = pool;
+	db = i_new(struct sqlite_db, 1);
+	db->pool = pool_alloconly_create("sqlite driver", 512);;
 	db->api = driver_sqlite_db;
 	db->dbfile = p_strdup(db->pool, connect_string);
 	db->connected = FALSE;
@@ -374,20 +372,22 @@
 struct sql_db driver_sqlite_db = {
 	"sqlite",
 
-	driver_sqlite_init_v,
-	driver_sqlite_deinit_v,
-	driver_sqlite_get_flags,
-	driver_sqlite_connect,
-	driver_sqlite_escape_string,
-	driver_sqlite_exec,
-	driver_sqlite_query,
-	driver_sqlite_query_s,
+	MEMBER(v) {
+		driver_sqlite_init_v,
+		driver_sqlite_deinit_v,
+		driver_sqlite_get_flags,
+		driver_sqlite_connect,
+		driver_sqlite_escape_string,
+		driver_sqlite_exec,
+		driver_sqlite_query,
+		driver_sqlite_query_s,
 
-	driver_sqlite_transaction_begin,
-	driver_sqlite_transaction_commit,
-	driver_sqlite_transaction_commit_s,
-	driver_sqlite_transaction_rollback,
-	driver_sqlite_update
+		driver_sqlite_transaction_begin,
+		driver_sqlite_transaction_commit,
+		driver_sqlite_transaction_commit_s,
+		driver_sqlite_transaction_rollback,
+		driver_sqlite_update
+	}
 };
 
 struct sql_result driver_sqlite_result = {
--- a/src/lib-sql/sql-api-private.h	Sat Sep 22 18:33:02 2007 +0300
+++ b/src/lib-sql/sql-api-private.h	Sat Sep 22 19:01:19 2007 +0300
@@ -2,10 +2,19 @@
 #define SQL_API_PRIVATE_H
 
 #include "sql-api.h"
+#include "module-context.h"
 
-struct sql_db {
-	const char *name;
+struct sql_db_module_register {
+	unsigned int id;
+};
 
+union sql_db_module_context {
+	struct sql_db_module_register *reg;
+};
+
+extern struct sql_db_module_register sql_db_module_register;
+
+struct sql_db_vfuncs {
 	struct sql_db *(*init)(const char *connect_string);
 	void (*deinit)(struct sql_db *db);
 
@@ -29,6 +38,12 @@
 	void (*update)(struct sql_transaction_context *ctx, const char *query);
 };
 
+struct sql_db {
+	const char *name;
+	struct sql_db_vfuncs v;
+	ARRAY_DEFINE(module_contexts, union sql_db_module_context *);
+};
+
 struct sql_result_vfuncs {
 	void (*free)(struct sql_result *result);
 	int (*next_row)(struct sql_result *result);
--- a/src/lib-sql/sql-api.c	Sat Sep 22 18:33:02 2007 +0300
+++ b/src/lib-sql/sql-api.c	Sat Sep 22 19:01:19 2007 +0300
@@ -42,52 +42,60 @@
 {
 	const struct sql_db *const *drivers;
 	unsigned int i, count;
+	struct sql_db *db;
 
 	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);
+		if (strcmp(db_driver, drivers[i]->name) == 0) {
+			db = drivers[i]->v.init(connect_string);
+			i_array_init(&db->module_contexts, 5);
+			return db;
+		}
 	}
 
 	i_fatal("Unknown database driver '%s'", db_driver);
 }
 
-void sql_deinit(struct sql_db **db)
+void sql_deinit(struct sql_db **_db)
 {
-	(*db)->deinit(*db);
-	*db = NULL;
+	struct sql_db *db = *_db;
+
+	*_db = NULL;
+	db->v.deinit(db);
+	array_free(&db->module_contexts);
+	i_free(db);
 }
 
 enum sql_db_flags sql_get_flags(struct sql_db *db)
 {
-	return db->get_flags(db);
+	return db->v.get_flags(db);
 }
 
 int sql_connect(struct sql_db *db)
 {
-	return db->connect(db);
+	return db->v.connect(db);
 }
 
 const char *sql_escape_string(struct sql_db *db, const char *string)
 {
-	return db->escape_string(db, string);
+	return db->v.escape_string(db, string);
 }
 
 void sql_exec(struct sql_db *db, const char *query)
 {
-	db->exec(db, query);
+	db->v.exec(db, query);
 }
 
 #undef sql_query
 void sql_query(struct sql_db *db, const char *query,
 	       sql_query_callback_t *callback, void *context)
 {
-	db->query(db, query, callback, context);
+	db->v.query(db, query, callback, context);
 }
 
 struct sql_result *sql_query_s(struct sql_db *db, const char *query)
 {
-	return db->query_s(db, query);
+	return db->v.query_s(db, query);
 }
 
 void sql_result_free(struct sql_result *result)
@@ -277,7 +285,7 @@
 
 struct sql_transaction_context *sql_transaction_begin(struct sql_db *db)
 {
-	return db->transaction_begin(db);
+	return db->v.transaction_begin(db);
 }
 
 #undef sql_transaction_commit
@@ -287,7 +295,7 @@
 	struct sql_transaction_context *ctx = *_ctx;
 
 	*_ctx = NULL;
-	ctx->db->transaction_commit(ctx, callback, context);
+	ctx->db->v.transaction_commit(ctx, callback, context);
 }
 
 int sql_transaction_commit_s(struct sql_transaction_context **_ctx,
@@ -296,7 +304,7 @@
 	struct sql_transaction_context *ctx = *_ctx;
 
 	*_ctx = NULL;
-	return ctx->db->transaction_commit_s(ctx, error_r);
+	return ctx->db->v.transaction_commit_s(ctx, error_r);
 }
 
 void sql_transaction_rollback(struct sql_transaction_context **_ctx)
@@ -304,12 +312,12 @@
 	struct sql_transaction_context *ctx = *_ctx;
 
 	*_ctx = NULL;
-	ctx->db->transaction_rollback(ctx);
+	ctx->db->v.transaction_rollback(ctx);
 }
 
 void sql_update(struct sql_transaction_context *ctx, const char *query)
 {
-	ctx->db->update(ctx, query);
+	ctx->db->v.update(ctx, query);
 }
 
 struct sql_result sql_not_connected_result = {