]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-sql: Add api to retrieve table names qualifiers from the driver (keyspaces, for...
authorMarco Bettini <marco.bettini@open-xchange.com>
Thu, 8 Sep 2022 14:18:03 +0000 (14:18 +0000)
committerMarco Bettini <marco.bettini@open-xchange.com>
Mon, 19 Sep 2022 09:42:31 +0000 (09:42 +0000)
src/lib-sql/driver-cassandra.c
src/lib-sql/sql-api-private.h

index 2dafbe5349b6d7dc53b36a157c2b9f3a752f3e80..d53a49ab13c7b8b608c75fc6792f74c49cc0a9d1 100644 (file)
@@ -84,7 +84,7 @@ struct cassandra_callback {
 struct cassandra_db {
        struct sql_db api;
 
-       char *hosts, *keyspace, *user, *password;
+       char *hosts, *keyspace, *table_prefix, *user, *password;
        CassConsistency read_consistency, write_consistency, delete_consistency;
        CassConsistency read_fallback_consistency, write_fallback_consistency;
        CassConsistency delete_fallback_consistency;
@@ -552,6 +552,12 @@ static void connect_callback(CassFuture *future, void *context)
        driver_cassandra_send_queries(db);
 }
 
+static const char *driver_cassandra_table_prefix(struct sql_db *_db)
+{
+       struct cassandra_db *db = (struct cassandra_db *)_db;
+       return db->table_prefix == NULL ? "" : db->table_prefix;
+}
+
 static int driver_cassandra_connect(struct sql_db *_db)
 {
        struct cassandra_db *db = (struct cassandra_db *)_db;
@@ -844,6 +850,9 @@ static int driver_cassandra_parse_connect_string(struct cassandra_db *db,
        if (db->keyspace == NULL) {
                *error_r = t_strdup_printf("No dbname given in connect string");
                return -1;
+       } else {
+               i_free(db->table_prefix);
+               db->table_prefix = i_strdup_printf("%s.", db->keyspace);
        }
 
        if ((db->ssl_cert_file != NULL && db->ssl_private_key_file == NULL) ||
@@ -943,6 +952,7 @@ static void driver_cassandra_free(struct cassandra_db **_db)
        i_free(db->metrics_path);
        i_free(db->hosts);
        i_free(db->error);
+       i_free(db->table_prefix);
        i_free(db->keyspace);
        i_free(db->user);
        i_free(db->password);
@@ -2597,6 +2607,7 @@ const struct sql_db driver_cassandra_db = {
                .statement_query = driver_cassandra_statement_query,
                .statement_query_s = driver_cassandra_statement_query_s,
                .update_stmt = driver_cassandra_update_stmt,
+               .table_prefix = driver_cassandra_table_prefix,
        }
 };
 
index a75e741ee9553e05c7ba1bca325b7128144c0429..bea9af71a44792c92c381a14e28356733784cbf7 100644 (file)
@@ -124,6 +124,11 @@ struct sql_db_vfuncs {
        void (*update_stmt)(struct sql_transaction_context *ctx,
                            struct sql_statement *stmt,
                            unsigned int *affected_rows);
+
+       /* Returns a schema/keyspace followed by a dot '.' OR an empty string
+          if none is required (in order remove the requirement for further
+          checks down the line in format strings et al.) */
+       const char *(*table_prefix)(struct sql_db *db);
 };
 
 struct sql_db {
@@ -241,6 +246,10 @@ int driver_sqlpool_init_full(const struct sql_settings *set, const struct sql_db
 
 void sql_db_set_state(struct sql_db *db, enum sql_db_state state);
 
+inline static const char *sql_db_table_prefix(struct sql_db *db) {
+       return db->v.table_prefix == NULL ? "" : db->v.table_prefix(db);
+}
+
 void sql_transaction_add_query(struct sql_transaction_context *ctx, pool_t pool,
                               const char *query, unsigned int *affected_rows);
 const char *sql_statement_get_query(struct sql_statement *stmt);