if (--conn->refcount > 0)
return;
- sql_deinit(&conn->db);
+ sql_unref(&conn->db);
pool_unref(&conn->pool);
}
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);
}
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);
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;
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);
}
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);