From: Timo Sirainen Date: Fri, 26 Jan 2024 22:09:42 +0000 (+0200) Subject: lib-sql: Replace sql_init*() with a new sql_init_auto() API X-Git-Tag: 2.4.1~986 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=504499d447db79d9488625b5e111635eb562281a;p=thirdparty%2Fdovecot%2Fcore.git lib-sql: Replace sql_init*() with a new sql_init_auto() API --- diff --git a/src/lib-sql/sql-api-private.h b/src/lib-sql/sql-api-private.h index b93727fcd9..a582000e19 100644 --- a/src/lib-sql/sql-api-private.h +++ b/src/lib-sql/sql-api-private.h @@ -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); diff --git a/src/lib-sql/sql-api.c b/src/lib-sql/sql-api.c index acc3186b43..98f20627c5 100644 --- a/src/lib-sql/sql-api.c +++ b/src/lib-sql/sql-api.c @@ -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 @@ -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) { diff --git a/src/lib-sql/sql-api.h b/src/lib-sql/sql-api.h index 6ec6d0fb59..3f24d50e23 100644 --- a/src/lib-sql/sql-api.h +++ b/src/lib-sql/sql-api.h @@ -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 *