Mercurial > dovecot > original-hg > dovecot-1.2
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 = {