]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-sql: Replace sql_init*() with a new sql_init_auto() API
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 26 Jan 2024 22:09:42 +0000 (00:09 +0200)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:12 +0000 (12:34 +0200)
src/lib-sql/sql-api-private.h
src/lib-sql/sql-api.c
src/lib-sql/sql-api.h

index b93727fcd93b9838453d11753a2e356b4a930152..a582000e199ec86239bc7caf65bca6d2f1031c3e 100644 (file)
@@ -65,6 +65,8 @@ struct sql_transaction_query {
 };
 
 struct sql_db_vfuncs {
+       int (*init)(struct event *event, struct sql_db **db_r,
+                   const char **error_r);
        struct sql_db *(*init_legacy)(const char *connect_string);
        int (*init_legacy_full)(const struct sql_legacy_settings *set,
                                struct sql_db **db_r, const char **error);
index acc3186b43a1db3aea18dab6ebcd173bc36b4392..98f20627c5fe03a03ebf670adc805730f149634d 100644 (file)
@@ -6,6 +6,8 @@
 #include "hash.h"
 #include "str.h"
 #include "time-util.h"
+#include "settings.h"
+#include "settings-parser.h"
 #include "sql-api-private.h"
 
 #include <time.h>
@@ -14,6 +16,27 @@ struct event_category event_category_sql = {
        .name = "sql",
 };
 
+#undef DEF
+#define DEF(type, name) \
+       SETTING_DEFINE_STRUCT_##type(#name, name, struct sql_settings)
+static const struct setting_define sql_setting_defines[] = {
+       DEF(STR, sql_driver),
+
+       SETTING_DEFINE_LIST_END
+};
+static const struct sql_settings sql_default_settings = {
+       .sql_driver = "",
+};
+const struct setting_parser_info sql_setting_parser_info = {
+       .name = "sql",
+
+       .defines = sql_setting_defines,
+       .defaults = &sql_default_settings,
+
+       .struct_size = sizeof(struct sql_settings),
+       .pool_offset1 = 1 + offsetof(struct sql_settings, pool),
+};
+
 struct sql_db_module_register sql_db_module_register = { 0 };
 ARRAY_TYPE(sql_drivers) sql_drivers;
 
@@ -75,6 +98,55 @@ void sql_driver_unregister(const struct sql_db *driver)
        }
 }
 
+int sql_init_auto(struct event *event, struct sql_db **db_r,
+                 const char **error_r)
+{
+       const struct sql_db *driver;
+       struct sql_db *db;
+       struct sql_settings *sql_set;
+       const char *error;
+
+       i_assert(event != NULL);
+
+       if (settings_get(event, &sql_setting_parser_info, 0,
+                        &sql_set, error_r) < 0)
+               return -1;
+
+       if (sql_set->sql_driver[0] == '\0') {
+               *error_r = "sql_driver setting is empty";
+               settings_free(sql_set);
+               return 0;
+       }
+       driver = sql_driver_lookup(sql_set->sql_driver);
+       if (driver == NULL) {
+               *error_r = t_strdup_printf("Unknown database driver '%s'",
+                                          sql_set->sql_driver);
+               settings_free(sql_set);
+               return -1;
+       }
+
+       if (driver->v.init == NULL) {
+               *error_r = t_strdup_printf(
+                       "Database driver '%s' only supports legacy init() API",
+                       sql_set->sql_driver);
+               settings_free(sql_set);
+               return -1;
+       }
+
+       if (driver->v.init(event, &db, &error) < 0) {
+               *error_r = t_strdup_printf("sql %s: %s",
+                                          sql_set->sql_driver, error);
+               settings_free(sql_set);
+               return -1;
+       }
+
+       sql_init_common(db);
+       settings_free(sql_set);
+       *db_r = db;
+       return 1;
+}
+
+
 struct sql_db *
 sql_init_legacy(const char *db_driver, const char *connect_string)
 {
index 6ec6d0fb5947a098103c5faa82e1c8001513873a..3f24d50e23ba9b8551051c254ecf02c8afab2144 100644 (file)
@@ -77,12 +77,19 @@ struct sql_commit_result {
        enum sql_result_error_type error_type;
 };
 
+struct sql_settings {
+       pool_t pool;
+       const char *sql_driver;
+};
+
 struct sql_legacy_settings {
        const char *driver;
        const char *connect_string;
        struct event *event_parent;
 };
 
+extern const struct setting_parser_info sql_setting_parser_info;
+
 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);
 
@@ -92,6 +99,13 @@ void sql_drivers_deinit(void);
 void sql_driver_register(const struct sql_db *driver);
 void sql_driver_unregister(const struct sql_db *driver);
 
+/* Initialize the sql db by pulling settings automatically using the event.
+   The event parameter is used as the parent event. Returns 1 if ok, 0 if
+   sql_driver setting is empty (error_r is also set), -1 if settings lookup or
+   driver initialization failed. */
+int sql_init_auto(struct event *event, struct sql_db **db_r,
+                 const char **error_r);
+
 /* Initialize database connections. db_driver is the database driver name,
    eg. "mysql" or "pgsql". connect_string is driver-specific. */
 struct sql_db *