#include "Pgsql_Params.h" #include using namespace Pgsql; Params::Params() {} Params::Params(const Params& rhs) : m_paramTypes(rhs.m_paramTypes) , m_paramLengths(rhs.m_paramLengths) , m_paramFormats(rhs.m_paramFormats) { appendValues(rhs); } Params& Params::operator=(const Params& rhs) { if (&rhs != this) { Params tmp(rhs); *this = std::move(tmp); } return *this; } Params::Params(Params&& rhs) : m_paramTypes(std::move(rhs.m_paramTypes)) , m_paramData(std::move(rhs.m_paramData)) , m_paramValues(std::move(rhs.m_paramValues)) , m_paramLengths(std::move(rhs.m_paramLengths)) , m_paramFormats(std::move(rhs.m_paramFormats)) { rhs.clear(); } Params& Params::operator=(Params&& rhs) { if (&rhs != this) { m_paramTypes = std::move(rhs.m_paramTypes); m_paramData = std::move(rhs.m_paramData); // releases the buffers this object held before m_paramValues = std::move(rhs.m_paramValues); m_paramLengths = std::move(rhs.m_paramLengths); m_paramFormats = std::move(rhs.m_paramFormats); rhs.clear(); } return *this; } Params::~Params() = default; Param Params::addText(std::unique_ptr data, Oid oid) { m_paramTypes.push_back(oid); m_paramLengths.push_back(data ? static_cast(std::strlen(data.get())) + 1 : 0); m_paramFormats.push_back(0); pushValue(std::move(data)); return Param(*this, static_cast(m_paramValues.size()) - 1); } Param Params::add(const QString &s, Oid oid) { auto ba = s.toUtf8(); const int len = ba.size(); auto p = std::make_unique(len + 1); std::memcpy(p.get(), ba.data(), len); p[len] = 0; return addText(std::move(p), oid); } Param Params::add(const char *data, Oid oid) { std::unique_ptr p; if (data) { const size_t len = std::strlen(data); p = std::make_unique(len + 1); std::memcpy(p.get(), data, len); p[len] = 0; } return addText(std::move(p), oid); } Param Params::add(int v, Oid oid) { std::string s = std::format("{:d}", v); return add(s.c_str(), oid); } template void concatContainers(T &d, const U& s) { d.insert(d.end(), s.begin(), s.end()); } void Params::addParams(const Params ¶ms) { concatContainers(m_paramTypes, params.m_paramTypes); concatContainers(m_paramLengths, params.m_paramLengths); concatContainers(m_paramFormats, params.m_paramFormats); appendValues(params); } void Params::clear() { m_paramTypes.clear(); m_paramData.clear(); m_paramValues.clear(); m_paramLengths.clear(); m_paramFormats.clear(); } void Params::pushValue(std::unique_ptr data) { m_paramValues.push_back(data.get()); m_paramData.push_back(std::move(data)); } void Params::appendValues(const Params &src) { for (const auto &e : src.m_paramData) { if (e) { const size_t len = std::strlen(e.get()); auto p = std::make_unique(len + 1); std::memcpy(p.get(), e.get(), len + 1); pushValue(std::move(p)); } else { pushValue(nullptr); } } }