]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-sql: Add refcounting to sql_db
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Sun, 15 Sep 2019 20:15:33 +0000 (23:15 +0300)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 16 Sep 2019 08:00:54 +0000 (08:00 +0000)
src/auth/db-sql.c
src/lib-dict-backend/dict-sql.c
src/lib-sql/driver-sqlpool.c
src/lib-sql/sql-api-private.h
src/lib-sql/sql-api.c
src/lib-sql/sql-api.h

index 79936aed75d790d505043f9e367db340e5547c6b..b5769043a9203a0e8c411e0d4d18d1a4b5dd6881 100644 (file)
@@ -131,7 +131,7 @@ void db_sql_unref(struct db_sql_connection **_conn)
        if (--conn->refcount > 0)
                return;
 
-       sql_deinit(&conn->db);
+       sql_unref(&conn->db);
        pool_unref(&conn->pool);
 }
 
index 52497ff704725940fe85a030c3ecea7f8ced1704..4a7baed6af2db59cc225fa038900a67ab6cd1d46 100644 (file)
@@ -143,7 +143,7 @@ static void sql_dict_deinit(struct dict *_dict)
        struct sql_dict *dict = (struct sql_dict *)_dict;
 
        sql_dict_prep_stmt_hash_free(dict);
-       sql_deinit(&dict->db);
+       sql_unref(&dict->db);
        pool_unref(&dict->pool);
 }
 
index 52546871174c8bc8964707f7234e710d0468d1e6..b1d3bffe30ff000910b7473060db97ec810f84b9 100644 (file)
@@ -548,7 +548,7 @@ static void driver_sqlpool_deinit(struct sql_db *_db)
        struct sqlpool_connection *conn;
 
        array_foreach_modifiable(&db->all_connections, conn)
-               sql_deinit(&conn->db);
+               sql_unref(&conn->db);
        array_clear(&db->all_connections);
 
        driver_sqlpool_abort_requests(db);
index 1c3a5426564e518e13c0a7558182daf59b493602..a4115a1ec09f3baf9ce38790de64e9319ef5e421 100644 (file)
@@ -123,6 +123,7 @@ struct sql_db_vfuncs {
 struct sql_db {
        const char *name;
        enum sql_db_flags flags;
+       int refcount;
 
        struct sql_db_vfuncs v;
        ARRAY(union sql_db_module_context *) module_contexts;
index 0aaadb6b3b02ae12eed24c154e283a1e2a89d7c1..d2da70c9ff5798c0091400314c8aa48e43d21165 100644 (file)
@@ -103,16 +103,25 @@ int sql_init_full(const struct sql_settings *set, struct sql_db **db_r,
                return -1;
 
        i_array_init(&db->module_contexts, 5);
+       db->refcount = 1;
        *db_r = db;
        return 0;
 }
 
-void sql_deinit(struct sql_db **_db)
+void sql_ref(struct sql_db *db)
+{
+       db->refcount++;
+}
+
+void sql_unref(struct sql_db **_db)
 {
        struct sql_db *db = *_db;
 
        *_db = NULL;
 
+       if (--db->refcount > 0)
+               return;
+
        timeout_remove(&db->to_reconnect);
        db->v.deinit(db);
 }
index a6600ff18301395aa99ded7513a4ccf87ac8f242..dd28841c9aa334404a84ddc976b18c57c2e6e397 100644 (file)
@@ -94,7 +94,8 @@ 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);
+void sql_ref(struct sql_db *db);
+void sql_unref(struct sql_db **db);
 
 /* Returns SQL database state flags. */
 enum sql_db_flags sql_get_flags(struct sql_db *db);