From: Aki Tuomi Date: Thu, 30 Aug 2018 11:18:41 +0000 (+0300) Subject: lib-sql: Add init_full vfunction X-Git-Tag: 2.3.9~1461 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5c4f633fa22cedaa80e6f141ebfa3c6bc8d89701;p=thirdparty%2Fdovecot%2Fcore.git lib-sql: Add init_full vfunction --- diff --git a/src/lib-sql/sql-api-private.h b/src/lib-sql/sql-api-private.h index dad8646ef6..86b0d00db1 100644 --- a/src/lib-sql/sql-api-private.h +++ b/src/lib-sql/sql-api-private.h @@ -55,6 +55,8 @@ struct sql_transaction_query { struct sql_db_vfuncs { struct sql_db *(*init)(const char *connect_string); + int (*init_full)(const struct sql_settings *set, struct sql_db **db_r, + const char **error); void (*deinit)(struct sql_db *db); int (*connect)(struct sql_db *db); diff --git a/src/lib-sql/sql-api.c b/src/lib-sql/sql-api.c index fa7464ced0..95ce32b991 100644 --- a/src/lib-sql/sql-api.c +++ b/src/lib-sql/sql-api.c @@ -63,22 +63,48 @@ void sql_driver_unregister(const struct sql_db *driver) } struct sql_db *sql_init(const char *db_driver, const char *connect_string) +{ + const char *error; + struct sql_db *db; + struct sql_settings set = { + .driver = db_driver, + .connect_string = connect_string, + }; + + if (sql_init_full(&set, &db, &error) < 0) + i_fatal("%s", error); + return db; +} + +int sql_init_full(const struct sql_settings *set, struct sql_db **db_r, + const char **error_r) { const struct sql_db *driver; struct sql_db *db; + int ret = 0; - i_assert(connect_string != NULL); + i_assert(set->connect_string != NULL); - driver = sql_driver_lookup(db_driver); - if (driver == NULL) - i_fatal("Unknown database driver '%s'", db_driver); + driver = sql_driver_lookup(set->driver); + if (driver == NULL) { + *error_r = t_strdup_printf("Unknown database driver '%s'", set->driver); + return -1; + } + + if ((driver->flags & SQL_DB_FLAG_POOLED) == 0) { + if (driver->v.init_full == NULL) + db = driver->v.init(set->connect_string); + else + ret = driver->v.init_full(set, &db, error_r); + } else + ret = driver_sqlpool_init_full(set, driver, &db, error_r); + + if (ret < 0) + return -1; - if ((driver->flags & SQL_DB_FLAG_POOLED) == 0) - db = driver->v.init(connect_string); - else - db = driver_sqlpool_init(connect_string, driver); i_array_init(&db->module_contexts, 5); - return db; + *db_r = db; + return 0; } void sql_deinit(struct sql_db **_db) diff --git a/src/lib-sql/sql-api.h b/src/lib-sql/sql-api.h index 6911900b0c..7e4fd33800 100644 --- a/src/lib-sql/sql-api.h +++ b/src/lib-sql/sql-api.h @@ -70,6 +70,11 @@ struct sql_commit_result { enum sql_result_error_type error_type; }; +struct sql_settings { + const char *driver; + const char *connect_string; +}; + typedef void sql_query_callback_t(struct sql_result *result, void *context); typedef void sql_commit_callback_t(const struct sql_commit_result *result, void *context); @@ -85,6 +90,9 @@ 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. */ struct sql_db *sql_init(const char *db_driver, const char *connect_string); +int sql_init_full(const struct sql_settings *set, struct sql_db **db_r, + const char **error_r); + void sql_deinit(struct sql_db **db); /* Returns SQL database state flags. */