]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
driver-pgsql: Add wait() implementation
authorSiavash Tavakoli <siavash.tavakoli@open-xchange.com>
Mon, 27 Sep 2021 10:58:21 +0000 (11:58 +0100)
committerSiavash Tavakoli <siavash.tavakoli@open-xchange.com>
Wed, 29 Sep 2021 08:46:27 +0000 (09:46 +0100)
src/lib-sql/driver-pgsql.c

index 74aa7f996f9c4fd5ed67ee15d8af6db36ee7a31c..f9f3ae45da7bc8e55c3558e5a4a62cb7a25bc940 100644 (file)
@@ -1239,6 +1239,30 @@ driver_pgsql_escape_blob(struct sql_db *_db ATTR_UNUSED,
        return str_c(str);
 }
 
+static bool driver_pgsql_have_work(struct pgsql_db *db)
+{
+       return db->next_callback != NULL || db->pending_results != NULL;
+}
+
+static void driver_pgsql_wait(struct sql_db *_db)
+{
+       struct pgsql_db *db = (struct pgsql_db *)_db;
+
+       if (!driver_pgsql_have_work(db))
+               return;
+
+       struct ioloop *prev_ioloop = current_ioloop;
+       db->ioloop = io_loop_create();
+       db->io = io_loop_move_io(&db->io);
+       while (driver_pgsql_have_work(db))
+               io_loop_run(db->ioloop);
+
+       io_loop_set_current(prev_ioloop);
+       db->io = io_loop_move_io(&db->io);
+       io_loop_set_current(db->ioloop);
+       io_loop_destroy(&db->ioloop);
+}
+
 const struct sql_db driver_pgsql_db = {
        .name = "pgsql",
        .flags = SQL_DB_FLAG_POOLED,
@@ -1252,6 +1276,7 @@ const struct sql_db driver_pgsql_db = {
                .exec = driver_pgsql_exec,
                .query = driver_pgsql_query,
                .query_s = driver_pgsql_query_s,
+               .wait = driver_pgsql_wait,
 
                .transaction_begin = driver_pgsql_transaction_begin,
                .transaction_commit = driver_pgsql_transaction_commit,