From 9b81cdebba95f1b6e687191c630c1f8f6cf0df16 Mon Sep 17 00:00:00 2001
From: znone <glyc@sina.com.cn>
Date: Thu, 25 Mar 2021 12:44:30 +0000
Subject: [PATCH] PostgreSQL: Support asynchronous operation Fix bug in different versions of asio
---
include/qtl_asio.hpp | 76 +++++++++++++++++++++++++++++++++++++
1 files changed, 75 insertions(+), 1 deletions(-)
diff --git a/include/qtl_asio.hpp b/include/qtl_asio.hpp
index ee8fae2..9bfe86a 100644
--- a/include/qtl_asio.hpp
+++ b/include/qtl_asio.hpp
@@ -1,7 +1,7 @@
#ifndef _QTL_ASIO_H_
#define _QTL_ASIO_H_
-#include <qtl_async.hpp>
+#include "qtl_async.hpp"
#include <asio/version.hpp>
#define ASIO_STANDALONE
#if ASIO_VERSION < 101200
@@ -84,6 +84,7 @@
else
handler(qtl::event::ef_exception);
_busying = false;
+ _timer.cancel();
}));
_busying = true;
}
@@ -100,6 +101,7 @@
handler(qtl::event::ef_timeout);
else
handler(qtl::event::ef_exception);
+ _timer.cancel();
_busying = false;
}));
_busying = true;
@@ -197,8 +199,14 @@
inline ASIO_INITFN_RESULT_TYPE(OpenHandler, void(typename Connection::exception_type))
async_open(service& service, Connection& db, OpenHandler&& handler, Args&&... args)
{
+#if ASIO_VERSION < 101200
async_init_type<OpenHandler,
void(typename Connection::exception_type)> init(std::forward<OpenHandler>(handler));
+#else
+ async_init_type<OpenHandler,
+ void(typename Connection::exception_type)> init(handler);
+#endif
+
db.open(service, get_async_handler(init), std::forward<Args>(args)...);
return init.result.get();
}
@@ -207,8 +215,14 @@
inline ASIO_INITFN_RESULT_TYPE(CloseHandler, void())
async_close(Connection& db, CloseHandler&& handler, Args&&... args)
{
+#if ASIO_VERSION < 101200
+ async_init_type<CloseHandler,
+ void()> init(std::forward<CloseHandler>(std::forward<CloseHandler>(handler)));
+#else
async_init_type<CloseHandler,
void()> init(std::forward<CloseHandler>(handler));
+#endif
+
db.close(get_async_handler(init), std::forward<Args>(args)...);
return init.result.get();
}
@@ -217,8 +231,14 @@
inline ASIO_INITFN_RESULT_TYPE(ExecuteHandler, void(typename Connection::exception_type, uint64_t))
async_execute(Connection& db, ExecuteHandler&& handler, Args&&... args)
{
+#if ASIO_VERSION < 101200
async_init_type<ExecuteHandler,
void(typename Connection::exception_type, uint64_t)> init(std::forward<ExecuteHandler>(handler));
+#else
+ async_init_type<ExecuteHandler,
+ void(typename Connection::exception_type, uint64_t)> init(handler);
+#endif
+
db.execute(get_async_handler(init), std::forward<Args>(args)...);
return init.result.get();
}
@@ -227,8 +247,14 @@
inline ASIO_INITFN_RESULT_TYPE(ExecuteHandler, void(typename Connection::exception_type, uint64_t))
async_execute_direct(Connection& db, ExecuteHandler&& handler, Args&&... args)
{
+#if ASIO_VERSION < 101200
async_init_type<ExecuteHandler,
void(typename Connection::exception_type, uint64_t)> init(std::forward<ExecuteHandler>(handler));
+#else
+ async_init_type<ExecuteHandler,
+ void(typename Connection::exception_type, uint64_t)> init(handler);
+#endif
+
db.execute_direct(get_async_handler(init), std::forward<Args>(args)...);
return init.result.get();
}
@@ -237,8 +263,14 @@
inline ASIO_INITFN_RESULT_TYPE(ExecuteHandler, void(typename Connection::exception_type, uint64_t))
async_insert(Connection& db, ExecuteHandler&& handler, Args&&... args)
{
+#if ASIO_VERSION < 101200
async_init_type<ExecuteHandler,
void(typename Connection::exception_type, uint64_t)> init(std::forward<ExecuteHandler>(handler));
+#else
+ async_init_type<ExecuteHandler,
+ void(typename Connection::exception_type, uint64_t)> init(handler);
+#endif
+
db.insert(get_async_handler(init), std::forward<Args>(args)...);
return init.result.get();
}
@@ -247,8 +279,14 @@
inline ASIO_INITFN_RESULT_TYPE(ExecuteHandler, void(typename Connection::exception_type, uint64_t))
async_insert_direct(Connection& db, ExecuteHandler&& handler, Args&&... args)
{
+#if ASIO_VERSION < 101200
async_init_type<ExecuteHandler,
void(typename Connection::exception_type, uint64_t)> init(std::forward<ExecuteHandler>(handler));
+#else
+ async_init_type<ExecuteHandler,
+ void(typename Connection::exception_type, uint64_t)> init(handler);
+#endif
+
db.insert_direct(get_async_handler(init), std::forward<Args>(args)...);
return init.result.get();
}
@@ -257,8 +295,14 @@
inline ASIO_INITFN_RESULT_TYPE(FinishHandler, void(typename Connection::exception_type))
async_query(Connection& db, FinishHandler&& handler, Args&&... args)
{
+#if ASIO_VERSION < 101200
async_init_type<FinishHandler,
void(typename Connection::exception_type)> init(std::forward<FinishHandler>(handler));
+#else
+ async_init_type<FinishHandler,
+ void(typename Connection::exception_type)> init(handler);
+#endif
+
db.query(std::forward<Args>(args)..., get_async_handler(init));
return init.result.get();
}
@@ -267,8 +311,14 @@
inline ASIO_INITFN_RESULT_TYPE(FinishHandler, void(typename Connection::exception_type))
async_query_explicit(Connection& db, FinishHandler&& handler, Args&&... args)
{
+#if ASIO_VERSION < 101200
async_init_type<FinishHandler,
void(typename Connection::exception_type)> init(std::forward<FinishHandler>(handler));
+#else
+ async_init_type<FinishHandler,
+ void(typename Connection::exception_type)> init(handler);
+#endif
+
db.query_explicit(std::forward<Args>(args)..., get_async_handler(init));
return init.result.get();
}
@@ -277,8 +327,14 @@
inline ASIO_INITFN_RESULT_TYPE(FinishHandler, void(typename Connection::exception_type))
async_query_multi_with_params(Connection& db, A1&& a1, A2&& a2, FinishHandler&& handler, RowHandlers&&... row_handlers)
{
+#if ASIO_VERSION < 101200
async_init_type<FinishHandler,
void(typename Connection::exception_type)> init(std::forward<FinishHandler>(handler));
+#else
+ async_init_type<FinishHandler,
+ void(typename Connection::exception_type)> init(handler);
+#endif
+
db.query_multi_with_params(std::forward<A1>(a1), std::forward<A2>(a2), get_async_handler(init), std::forward<RowHandlers>(row_handlers)...);
return init.result.get();
}
@@ -287,8 +343,14 @@
inline ASIO_INITFN_RESULT_TYPE(FinishHandler, void(typename Connection::exception_type))
async_query_multi_with_params(Connection& db, A1&& a1, FinishHandler&& handler, RowHandlers&&... row_handlers)
{
+#if ASIO_VERSION < 101200
async_init_type<FinishHandler,
void(typename Connection::exception_type)> init(std::forward<FinishHandler>(handler));
+#else
+ async_init_type<FinishHandler,
+ void(typename Connection::exception_type)> init(handler);
+#endif
+
db.query_multi_with_params(std::forward<A1>(a1), get_async_handler(init), std::forward<RowHandlers>(row_handlers)...);
return init.result.get();
}
@@ -297,8 +359,14 @@
inline ASIO_INITFN_RESULT_TYPE(FinishHandler, void(typename Connection::exception_type))
async_query_multi(Connection& db, A1&& a1, A2&& a2, FinishHandler&& handler, RowHandlers&&... row_handlers)
{
+#if ASIO_VERSION < 101200
async_init_type<FinishHandler,
void(typename Connection::exception_type)> init(std::forward<FinishHandler>(handler));
+#else
+ async_init_type<FinishHandler,
+ void(typename Connection::exception_type)> init(handler);
+#endif
+
db.query_multi(std::forward<A1>(a1), std::forward<A2>(a2), get_async_handler(init), std::forward<RowHandlers>(row_handlers)...);
return init.result.get();
}
@@ -307,8 +375,14 @@
inline ASIO_INITFN_RESULT_TYPE(FinishHandler, void(typename Connection::exception_type))
async_query_multi(Connection& db, A1&& a1, FinishHandler&& handler, RowHandlers&&... row_handlers)
{
+#if ASIO_VERSION < 101200
async_init_type<FinishHandler,
void(typename Connection::exception_type)> init(std::forward<FinishHandler>(handler));
+#else
+ async_init_type<FinishHandler,
+ void(typename Connection::exception_type)> init(handler);
+#endif
+
db.query_multi(std::forward<A1>(a1), get_async_handler(init), std::forward<RowHandlers>(row_handlers)...);
return init.result.get();
}
--
Gitblit v1.9.3