]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-sql: Add init_full vfunction
authorAki Tuomi <aki.tuomi@dovecot.fi>
Thu, 30 Aug 2018 11:18:41 +0000 (14:18 +0300)
committerAki Tuomi <aki.tuomi@dovecot.fi>
Tue, 4 Sep 2018 07:45:40 +0000 (10:45 +0300)
src/lib-sql/sql-api-private.h
src/lib-sql/sql-api.c
src/lib-sql/sql-api.h

index dad8646ef61751cb953ea9493eeea5a8d872dad5..86b0d00db103296cf26710834fc07f741b6ab17e 100644 (file)
@@ -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);
index fa7464ced0d73ed2a6d62224fcc1a05749803113..95ce32b991520510077b5ae9f0ca34c8f50107a7 100644 (file)
@@ -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)
index 6911900b0ce8e0fa4bd9997c97f6f9429a36a535..7e4fd33800b4216fc55e2b341fdd19a904ba3209 100644 (file)
@@ -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. */