kore

a fork of the worlds most advanced web framework
Log | Files | Refs | README | LICENSE

commit 5b3cee342889a871f93f3bcd45d4996ba0318c2c
parent 43234cd36eaeb002648d292503ba58350aa78009
Author: Joris Vink <joris@coders.se>
Date:   Sat, 28 Jul 2018 22:28:19 +0200

Use a synchronous query to issue a ROLLBACK.

Diffstat:
Msrc/pgsql.c | 49+++++++++----------------------------------------
1 file changed, 9 insertions(+), 40 deletions(-)

diff --git a/src/pgsql.c b/src/pgsql.c @@ -52,7 +52,6 @@ static void pgsql_conn_release(struct kore_pgsql *); static void pgsql_conn_cleanup(struct pgsql_conn *); static void pgsql_read_result(struct kore_pgsql *); static void pgsql_schedule(struct kore_pgsql *); -static void pgsql_rollback_state(struct kore_pgsql *, void *); static struct pgsql_conn *pgsql_conn_create(struct kore_pgsql *, struct pgsql_db *); @@ -372,7 +371,6 @@ kore_pgsql_continue(struct kore_pgsql *pgsql) void kore_pgsql_cleanup(struct kore_pgsql *pgsql) { - kore_debug("kore_pgsql_cleanup(%p)", pgsql); pgsql_queue_remove(pgsql); if (pgsql->result != NULL) @@ -436,7 +434,7 @@ pgsql_conn_next(struct kore_pgsql *pgsql, struct pgsql_db *db) { PGTransactionStatusType state; struct pgsql_conn *conn; - struct kore_pgsql *rollback; + struct kore_pgsql rollback; rescan: conn = NULL; @@ -454,21 +452,16 @@ rescan: conn->flags &= ~PGSQL_CONN_FREE; TAILQ_REMOVE(&pgsql_conn_free, conn, list); - rollback = kore_malloc(sizeof(*rollback)); - kore_pgsql_init(rollback); - kore_pgsql_bind_callback(rollback, - pgsql_rollback_state, NULL); - rollback->flags |= KORE_PGSQL_ASYNC; + kore_pgsql_init(&rollback); + rollback.conn = conn; + rollback.flags = KORE_PGSQL_SYNC; - rollback->conn = conn; - rollback->conn->job = kore_pool_get(&pgsql_job_pool); - rollback->conn->job->pgsql = rollback; - - if (!kore_pgsql_query(rollback, "ROLLBACK")) { - kore_pgsql_logerror(rollback); - kore_pgsql_cleanup(rollback); - kore_free(rollback); + if (!kore_pgsql_query(&rollback, "ROLLBACK")) { + kore_pgsql_logerror(&rollback); + kore_pgsql_cleanup(&rollback); pgsql_conn_cleanup(conn); + } else { + kore_pgsql_cleanup(&rollback); } goto rescan; @@ -611,8 +604,6 @@ pgsql_conn_create(struct kore_pgsql *pgsql, struct pgsql_db *db) conn->name = kore_strdup(db->name); TAILQ_INSERT_TAIL(&pgsql_conn_free, conn, list); - kore_debug("pgsql_conn_create(): %p", conn); - conn->db = PQconnectdb(db->conn_string); if (conn->db == NULL || (PQstatus(conn->db) != CONNECTION_OK)) { pgsql_set_error(pgsql, PQerrorMessage(conn->db)); @@ -667,7 +658,6 @@ pgsql_conn_cleanup(struct pgsql_conn *conn) struct kore_pgsql *pgsql; struct pgsql_db *pgsqldb; - kore_debug("pgsql_conn_cleanup(): %p", conn); if (conn->flags & PGSQL_CONN_FREE) TAILQ_REMOVE(&pgsql_conn_free, conn, list); @@ -760,24 +750,3 @@ pgsql_cancel(struct kore_pgsql *pgsql) PQfreeCancel(cancel); } } - -static void -pgsql_rollback_state(struct kore_pgsql *pgsql, void *arg) -{ - struct pgsql_conn *conn; - - switch (pgsql->state) { - case KORE_PGSQL_STATE_ERROR: - conn = pgsql->conn; - kore_pgsql_logerror(pgsql); - kore_pgsql_cleanup(pgsql); - pgsql_conn_cleanup(conn); - break; - case KORE_PGSQL_STATE_COMPLETE: - kore_pgsql_cleanup(pgsql); - break; - default: - kore_pgsql_continue(pgsql); - break; - } -}