Add r-reference version for the SqlBinder class

This commit is contained in:
antao 2019-02-20 14:18:57 +08:00
parent 7f21f45a1b
commit 6d97ea5992
6 changed files with 87 additions and 54 deletions

View File

@ -133,6 +133,7 @@ class DbClient : public trantor::NonCopyable
/// A stream-type method for sql execution
internal::SqlBinder operator<<(const std::string &sql);
internal::SqlBinder operator<<(std::string &&sql);
/// Create a transaction object.
/**
@ -158,7 +159,7 @@ class DbClient : public trantor::NonCopyable
std::vector<int> &&format,
ResultCallback &&rcb,
std::function<void(const std::exception_ptr &)> &&exceptCallback) = 0;
protected:
ClientType _type;
std::string _connInfo;

View File

@ -195,7 +195,7 @@ inline T Mapper<T>::findByPrimaryKey(const typename Mapper<T>::TraitsPKType &key
clear();
Result r(nullptr);
{
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
outputPrimeryKeyToBinder(key, binder);
binder << Mode::Blocking;
binder >> [&r](const Result &result) {
@ -231,7 +231,7 @@ inline void Mapper<T>::findByPrimaryKey(const typename Mapper<T>::TraitsPKType &
}
sql = replaceSqlPlaceHolder(sql, "$?");
clear();
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
outputPrimeryKeyToBinder(key, binder);
binder >> [=](const Result &r) {
if (r.size() == 0)
@ -265,7 +265,7 @@ Mapper<T>::findFutureByPrimaryKey(const typename Mapper<T>::TraitsPKType &key) n
}
sql = replaceSqlPlaceHolder(sql, "$?");
clear();
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
outputPrimeryKeyToBinder(key, binder);
std::shared_ptr<std::promise<T>> prom = std::make_shared<std::promise<T>>();
@ -323,7 +323,7 @@ inline T Mapper<T>::findOne(const Criteria &criteria) noexcept(false)
clear();
Result r(nullptr);
{
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
if (criteria)
criteria.outputArgs(binder);
binder << Mode::Blocking;
@ -363,7 +363,7 @@ inline void Mapper<T>::findOne(const Criteria &criteria,
sql += " for update";
}
clear();
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
if (criteria)
criteria.outputArgs(binder);
binder >> [=](const Result &r) {
@ -400,7 +400,7 @@ inline std::future<T> Mapper<T>::findFutureOne(const Criteria &criteria) noexcep
sql += " for update";
}
clear();
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
if (criteria)
criteria.outputArgs(binder);
@ -458,7 +458,7 @@ inline std::vector<T> Mapper<T>::findBy(const Criteria &criteria) noexcept(false
clear();
Result r(nullptr);
{
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
if (criteria)
criteria.outputArgs(binder);
binder << Mode::Blocking;
@ -493,7 +493,7 @@ inline void Mapper<T>::findBy(const Criteria &criteria,
sql += " for update";
}
clear();
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
if (criteria)
criteria.outputArgs(binder);
binder >> [=](const Result &r) {
@ -523,7 +523,7 @@ inline std::future<std::vector<T>> Mapper<T>::findFutureBy(const Criteria &crite
sql += " for update";
}
clear();
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
if (criteria)
criteria.outputArgs(binder);
@ -572,7 +572,7 @@ inline size_t Mapper<T>::count(const Criteria &criteria) noexcept(false)
clear();
Result r(nullptr);
{
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
if (criteria)
criteria.outputArgs(binder);
binder << Mode::Blocking;
@ -598,7 +598,7 @@ inline void Mapper<T>::count(const Criteria &criteria,
sql = replaceSqlPlaceHolder(sql, "$?");
}
clear();
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
if (criteria)
criteria.outputArgs(binder);
binder >> [=](const Result &r) {
@ -619,7 +619,7 @@ inline std::future<size_t> Mapper<T>::countFuture(const Criteria &criteria) noex
sql = replaceSqlPlaceHolder(sql, "$?");
}
clear();
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
if (criteria)
criteria.outputArgs(binder);
@ -660,7 +660,7 @@ inline void Mapper<T>::insert(T &obj) noexcept(false)
sql = replaceSqlPlaceHolder(sql, "$?");
Result r(nullptr);
{
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
obj.outputArgs(binder);
binder << Mode::Blocking;
binder >> [&r](const Result &result) {
@ -705,7 +705,7 @@ inline void Mapper<T>::insert(const T &obj,
sql += " returning *";
}
sql = replaceSqlPlaceHolder(sql, "$?");
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
obj.outputArgs(binder);
auto client = _client;
binder >> [client, rcb, obj](const Result &r) {
@ -748,7 +748,7 @@ inline std::future<T> Mapper<T>::insertFuture(const T &obj) noexcept
sql += " returning *";
}
sql = replaceSqlPlaceHolder(sql, "$?");
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
obj.outputArgs(binder);
std::shared_ptr<std::promise<T>> prom = std::make_shared<std::promise<T>>();
@ -793,7 +793,7 @@ inline size_t Mapper<T>::update(const T &obj) noexcept(false)
sql = replaceSqlPlaceHolder(sql, "$?");
Result r(nullptr);
{
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
obj.updateArgs(binder);
outputPrimeryKeyToBinder(obj.getPrimaryKey(), binder);
binder << Mode::Blocking;
@ -824,7 +824,7 @@ inline void Mapper<T>::update(const T &obj,
makePrimaryKeyCriteria(sql);
sql = replaceSqlPlaceHolder(sql, "$?");
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
obj.updateArgs(binder);
outputPrimeryKeyToBinder(obj.getPrimaryKey(), binder);
binder >> [=](const Result &r) {
@ -850,7 +850,7 @@ inline std::future<size_t> Mapper<T>::updateFuture(const T &obj) noexcept
makePrimaryKeyCriteria(sql);
sql = replaceSqlPlaceHolder(sql, "$?");
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
obj.updateArgs(binder);
outputPrimeryKeyToBinder(obj.getPrimaryKey(), binder);
@ -880,7 +880,7 @@ inline size_t Mapper<T>::deleteOne(const T &obj) noexcept(false)
sql = replaceSqlPlaceHolder(sql, "$?");
Result r(nullptr);
{
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
outputPrimeryKeyToBinder(obj.getPrimaryKey(), binder);
binder << Mode::Blocking;
binder >> [&r](const Result &result) {
@ -904,7 +904,7 @@ inline void Mapper<T>::deleteOne(const T &obj,
makePrimaryKeyCriteria(sql);
sql = replaceSqlPlaceHolder(sql, "$?");
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
outputPrimeryKeyToBinder(obj.getPrimaryKey(), binder);
binder >> [=](const Result &r) {
rcb(r.affectedRows());
@ -923,7 +923,7 @@ inline std::future<size_t> Mapper<T>::deleteFutureOne(const T &obj) noexcept
makePrimaryKeyCriteria(sql);
sql = replaceSqlPlaceHolder(sql, "$?");
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
outputPrimeryKeyToBinder(obj.getPrimaryKey(), binder);
std::shared_ptr<std::promise<size_t>> prom = std::make_shared<std::promise<size_t>>();
@ -954,7 +954,7 @@ inline size_t Mapper<T>::deleteBy(const Criteria &criteria) noexcept(false)
Result r(nullptr);
{
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
if (criteria)
{
criteria.outputArgs(binder);
@ -984,7 +984,7 @@ inline void Mapper<T>::deleteBy(const Criteria &criteria,
sql = replaceSqlPlaceHolder(sql, "$?");
}
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
if (criteria)
{
criteria.outputArgs(binder);
@ -1007,7 +1007,7 @@ inline std::future<size_t> Mapper<T>::deleteFutureBy(const Criteria &criteria) n
sql += criteria.criteriaString();
sql = replaceSqlPlaceHolder(sql, "$?");
}
auto binder = *_client << sql;
auto binder = *_client << std::move(sql);
if (criteria)
{
criteria.outputArgs(binder);

View File

@ -227,6 +227,9 @@ class SqlBinder
SqlBinder(const std::string &sql, DbClient &client, ClientType type) : _sql(sql), _client(client), _type(type)
{
}
SqlBinder(std::string &&sql, DbClient &client, ClientType type) : _sql(std::move(sql)), _client(client), _type(type)
{
}
~SqlBinder();
template <typename CallbackType,
typename traits = FunctionTraits<CallbackType>>

View File

@ -22,6 +22,11 @@ internal::SqlBinder DbClient::operator<<(const std::string &sql)
return internal::SqlBinder(sql, *this, _type);
}
internal::SqlBinder DbClient::operator<<(std::string &&sql)
{
return internal::SqlBinder(std::move(sql), *this, _type);
}
#if USE_POSTGRESQL
std::shared_ptr<DbClient> DbClient::newPgClient(const std::string &connInfo, const size_t connNum)
{

View File

@ -175,15 +175,14 @@ void PgConnection::execSqlInLoop(std::string &&sql,
if (paraNum == 0)
{
_isRreparingStatement = false;
if (PQsendQueryParams(
_connPtr.get(),
_sql.c_str(),
paraNum,
nullptr,
parameters.data(),
length.data(),
format.data(),
0) == 0)
if (PQsendQueryParams(_connPtr.get(),
_sql.c_str(),
paraNum,
nullptr,
parameters.data(),
length.data(),
format.data(),
0) == 0)
{
LOG_ERROR << "send query error: " << PQerrorMessage(_connPtr.get());
if (_isWorking)
@ -217,14 +216,13 @@ void PgConnection::execSqlInLoop(std::string &&sql,
if (iter != _preparedStatementMap.end())
{
_isRreparingStatement = false;
if (PQsendQueryPrepared(
_connPtr.get(),
iter->second.c_str(),
paraNum,
parameters.data(),
length.data(),
format.data(),
0) == 0)
if (PQsendQueryPrepared(_connPtr.get(),
iter->second.c_str(),
paraNum,
parameters.data(),
length.data(),
format.data(),
0) == 0)
{
LOG_ERROR << "send query error: " << PQerrorMessage(_connPtr.get());
if (_isWorking)
@ -283,20 +281,24 @@ void PgConnection::execSqlInLoop(std::string &&sql,
return;
}
std::weak_ptr<PgConnection> weakPtr = shared_from_this();
_preparingCallback = [weakPtr, statementName, paraNum, parameters = std::move(parameters), length = std::move(length), format = std::move(format)]() {
_preparingCallback = [weakPtr,
statementName,
paraNum,
parameters = std::move(parameters),
length = std::move(length),
format = std::move(format)]() {
auto thisPtr = weakPtr.lock();
if (!thisPtr)
return;
thisPtr->_isRreparingStatement = false;
thisPtr->_preparedStatementMap[thisPtr->_sql] = statementName;
if (PQsendQueryPrepared(
thisPtr->_connPtr.get(),
statementName.c_str(),
paraNum,
parameters.data(),
length.data(),
format.data(),
0) == 0)
if (PQsendQueryPrepared(thisPtr->_connPtr.get(),
statementName.c_str(),
paraNum,
parameters.data(),
length.data(),
format.data(),
0) == 0)
{
LOG_ERROR << "send query error: " << PQerrorMessage(thisPtr->_connPtr.get());
if (thisPtr->_isWorking)

View File

@ -49,13 +49,35 @@ class PgConnection : public DbConnection, public std::enable_shared_from_this<Pg
{
if (_loop->isInLoopThread())
{
execSqlInLoop(std::move(sql), paraNum, std::move(parameters), std::move(length), std::move(format), std::move(rcb), std::move(exceptCallback), std::move(idleCb));
execSqlInLoop(std::move(sql),
paraNum,
std::move(parameters),
std::move(length),
std::move(format),
std::move(rcb),
std::move(exceptCallback),
std::move(idleCb));
}
else
{
auto thisPtr = shared_from_this();
_loop->queueInLoop([thisPtr, sql = std::move(sql), paraNum, parameters = std::move(parameters), length = std::move(length), format = std::move(format), rcb = std::move(rcb), exceptCallback = std::move(exceptCallback), idleCb = std::move(idleCb)]() mutable {
thisPtr->execSqlInLoop(std::move(sql), paraNum, std::move(parameters), std::move(length), std::move(format), std::move(rcb), std::move(exceptCallback), std::move(idleCb));
_loop->queueInLoop([thisPtr,
sql = std::move(sql),
paraNum,
parameters = std::move(parameters),
length = std::move(length),
format = std::move(format),
rcb = std::move(rcb),
exceptCallback = std::move(exceptCallback),
idleCb = std::move(idleCb)]() mutable {
thisPtr->execSqlInLoop(std::move(sql),
paraNum,
std::move(parameters),
std::move(length),
std::move(format),
std::move(rcb),
std::move(exceptCallback),
std::move(idleCb));
});
}
}