static void c_psql_database_delete (void *data) { size_t i; c_psql_database_t *db = data; PQfinish (db->conn); db->conn = NULL; if (db->q_prep_areas) for (i = 0; i < db->queries_num; ++i) udb_query_delete_preparation_area (db->q_prep_areas[i]); free (db->q_prep_areas); sfree (db->queries); db->queries_num = 0; sfree (db->database); sfree (db->host); sfree (db->port); sfree (db->user); sfree (db->password); sfree (db->instance); sfree (db->sslmode); sfree (db->krbsrvname); sfree (db->service); return; } /* c_psql_database_delete */
static void cdbi_database_free (cdbi_database_t *db) /* {{{ */ { size_t i; if (db == NULL) return; sfree (db->name); sfree (db->driver); for (i = 0; i < db->driver_options_num; i++) { sfree (db->driver_options[i].key); if (!db->driver_options[i].is_numeric) sfree (db->driver_options[i].value.string); } sfree (db->driver_options); if (db->q_prep_areas) for (i = 0; i < db->queries_num; ++i) udb_query_delete_preparation_area (db->q_prep_areas[i]); free (db->q_prep_areas); sfree (db); } /* }}} void cdbi_database_free */
static void c_psql_database_delete (void *data) { size_t i; c_psql_database_t *db = data; --db->ref_cnt; /* readers and writers may access this database */ if (db->ref_cnt > 0) return; /* wait for the lock to be released by the last writer */ pthread_mutex_lock (&db->db_lock); if (db->next_commit > 0) c_psql_commit (db); PQfinish (db->conn); db->conn = NULL; if (db->q_prep_areas) for (i = 0; i < db->queries_num; ++i) udb_query_delete_preparation_area (db->q_prep_areas[i]); free (db->q_prep_areas); sfree (db->queries); db->queries_num = 0; sfree (db->writers); db->writers_num = 0; pthread_mutex_unlock (&db->db_lock); pthread_mutex_destroy (&db->db_lock); sfree (db->database); sfree (db->host); sfree (db->port); sfree (db->user); sfree (db->password); sfree (db->instance); sfree (db->sslmode); sfree (db->krbsrvname); sfree (db->service); /* don't care about freeing or reordering the 'databases' array * this is done in 'shutdown'; also, don't free the database instance * object just to make sure that in case anybody accesses it before * shutdown won't segfault */ return; } /* c_psql_database_delete */
static void o_database_free (o_database_t *db) /* {{{ */ { if (db == NULL) return; sfree (db->name); sfree (db->connect_id); sfree (db->username); sfree (db->password); sfree (db->queries); if (db->q_prep_areas != NULL) for (size_t i = 0; i < db->queries_num; ++i) udb_query_delete_preparation_area (db->q_prep_areas[i]); free (db->q_prep_areas); sfree (db); } /* }}} void o_database_free */