added data binding traits
This commit is contained in:
+2
-1
@@ -77,7 +77,8 @@ set(UTILS_HEADER
|
||||
../include/matador/utils/access.hpp
|
||||
../include/matador/utils/identifier.hpp
|
||||
../include/matador/utils/cascade_type.hpp
|
||||
../include/matador/utils/logger.hpp)
|
||||
../include/matador/utils/logger.hpp
|
||||
../include/matador/utils/enum_mapper.hpp)
|
||||
|
||||
set(UTILS_SOURCES
|
||||
utils/field_attributes.cpp
|
||||
|
||||
@@ -3,22 +3,35 @@
|
||||
|
||||
namespace matador::sql {
|
||||
|
||||
object_binder::object_binder(parameter_binder &binder)
|
||||
namespace detail {
|
||||
|
||||
fk_binder::fk_binder(parameter_binder &binder)
|
||||
: binder_(binder) {}
|
||||
|
||||
void fk_binder::on_primary_key(const char *id, std::string &value, size_t size)
|
||||
{
|
||||
data_type_traits<std::string>::bind_value(binder_, index_++, value);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
object_binder::object_binder(parameter_binder &binder)
|
||||
: binder_(binder)
|
||||
, fk_binder_(binder) {}
|
||||
|
||||
void object_binder::reset()
|
||||
{
|
||||
index_ = 0;
|
||||
}
|
||||
|
||||
void object_binder::on_primary_key(const char *id, std::string &val, size_t)
|
||||
void object_binder::on_primary_key(const char *id, std::string &val, size_t size)
|
||||
{
|
||||
binder_.bind(index_++, val);
|
||||
data_type_traits<std::string>::bind_value(binder_, index_++, val, size);
|
||||
}
|
||||
|
||||
void object_binder::on_revision(const char *id, unsigned long long int &rev)
|
||||
{
|
||||
binder_.bind(index_++, rev);
|
||||
data_type_traits<unsigned long long>::bind_value(binder_, index_++, rev);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -6,8 +6,9 @@ namespace matador::sql {
|
||||
detail::pk_reader::pk_reader(query_result_reader &reader)
|
||||
: reader_(reader) {}
|
||||
|
||||
void detail::pk_reader::on_primary_key(const char *id, std::string &value, size_t size) {
|
||||
reader_.read_value(id, column_index_, value, size);
|
||||
void detail::pk_reader::on_primary_key(const char *id, std::string &value, size_t size)
|
||||
{
|
||||
data_type_traits<std::string>::read_value(reader_, id, column_index_++, value, size);
|
||||
}
|
||||
|
||||
query_result_impl::query_result_impl(std::unique_ptr<query_result_reader> &&reader, record prototype)
|
||||
|
||||
@@ -8,6 +8,12 @@ statement::statement(std::unique_ptr<statement_impl> impl, const utils::logger &
|
||||
, object_binder_(statement_->binder())
|
||||
{}
|
||||
|
||||
statement &statement::bind(size_t pos, const char *value)
|
||||
{
|
||||
statement_->bind(pos, value, 0);
|
||||
return *this;
|
||||
}
|
||||
|
||||
statement &statement::bind(size_t pos, std::string &val, size_t size)
|
||||
{
|
||||
statement_->bind(pos, val, size);
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
#include "matador/sql/connection.hpp"
|
||||
#include "matador/sql/statement_cache.hpp"
|
||||
|
||||
namespace matador::sql {
|
||||
statement &statement_cache::acquire(const std::string &stmt, const connection &conn) {
|
||||
statement &statement_cache::acquire(query_context &&context, const connection &conn) {
|
||||
std::lock_guard<std::mutex> guard(mutex_);
|
||||
auto key = hash_(stmt);
|
||||
auto key = hash_(context.sql);
|
||||
auto it = statement_map_.find(key);
|
||||
if (it == statement_map_.end()) {
|
||||
|
||||
cache_info info {conn.prepare(std::move(context)), 1};
|
||||
// it = statement_map_.emplace(key, {conn.prepare(std::move(context))});
|
||||
}
|
||||
return *it->second.statement_;
|
||||
return it->second.statement_;
|
||||
}
|
||||
|
||||
void statement_cache::release(const statement &stmt) {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#include "matador/sql/types.hpp"
|
||||
|
||||
#include "matador/sql/parameter_binder.hpp"
|
||||
#include "matador/sql/query_result_reader.hpp"
|
||||
|
||||
namespace matador::sql {
|
||||
@@ -9,77 +10,159 @@ void data_type_traits<char>::read_value(query_result_reader &reader, const char
|
||||
reader.read_value(id, index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<char>::bind_value(parameter_binder &binder, size_t index, char &value)
|
||||
{
|
||||
binder.bind(index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<short>::read_value(query_result_reader &reader, const char *id, size_t index, short &value)
|
||||
{
|
||||
reader.read_value(id, index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<short>::bind_value(parameter_binder &binder, size_t index, short &value)
|
||||
{
|
||||
binder.bind(index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<int>::read_value(query_result_reader &reader, const char *id, size_t index, int &value)
|
||||
{
|
||||
reader.read_value(id, index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<int>::bind_value(parameter_binder &binder, size_t index, int &value)
|
||||
{
|
||||
binder.bind(index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<long>::read_value(query_result_reader &reader, const char *id, size_t index, long &value)
|
||||
{
|
||||
reader.read_value(id, index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<long>::bind_value(parameter_binder &binder, size_t index, long &value)
|
||||
{
|
||||
binder.bind(index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<long long>::read_value(query_result_reader &reader, const char *id, size_t index, long long &value)
|
||||
{
|
||||
reader.read_value(id, index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<long long int>::bind_value(parameter_binder &binder, size_t index, long long int &value)
|
||||
{
|
||||
binder.bind(index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<unsigned char>::read_value(query_result_reader &reader, const char *id, size_t index, unsigned char &value)
|
||||
{
|
||||
reader.read_value(id, index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<unsigned char>::bind_value(parameter_binder &binder, size_t index, unsigned char &value)
|
||||
{
|
||||
binder.bind(index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<unsigned short>::read_value(query_result_reader &reader, const char *id, size_t index, unsigned short &value)
|
||||
{
|
||||
reader.read_value(id, index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<unsigned short>::bind_value(parameter_binder &binder, size_t index, unsigned short &value)
|
||||
{
|
||||
binder.bind(index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<unsigned int>::read_value(query_result_reader &reader, const char *id, size_t index, unsigned int &value)
|
||||
{
|
||||
reader.read_value(id, index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<unsigned int>::bind_value(parameter_binder &binder, size_t index, unsigned int &value)
|
||||
{
|
||||
binder.bind(index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<unsigned long>::read_value(query_result_reader &reader, const char *id, size_t index, unsigned long &value)
|
||||
{
|
||||
reader.read_value(id, index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<unsigned long>::bind_value(parameter_binder &binder, size_t index, unsigned long &value)
|
||||
{
|
||||
binder.bind(index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<unsigned long long>::read_value(query_result_reader &reader, const char *id, size_t index, unsigned long long &value)
|
||||
{
|
||||
reader.read_value(id, index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<unsigned long long int>::bind_value(parameter_binder &binder, size_t index, unsigned long long int &value)
|
||||
{
|
||||
binder.bind(index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<bool>::read_value(query_result_reader &reader, const char *id, size_t index, bool &value)
|
||||
{
|
||||
reader.read_value(id, index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<bool>::bind_value(parameter_binder &binder, size_t index, bool &value)
|
||||
{
|
||||
binder.bind(index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<float>::read_value(query_result_reader &reader, const char *id, size_t index, float &value)
|
||||
{
|
||||
reader.read_value(id, index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<float>::bind_value(parameter_binder &binder, size_t index, float &value)
|
||||
{
|
||||
binder.bind(index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<double>::read_value(query_result_reader &reader, const char *id, size_t index, double &value)
|
||||
{
|
||||
reader.read_value(id, index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<double>::bind_value(parameter_binder &binder, size_t index, double &value)
|
||||
{
|
||||
binder.bind(index, value);
|
||||
}
|
||||
|
||||
void data_type_traits<const char*>::read_value(query_result_reader &reader, const char *id, size_t index, const char* value, size_t size)
|
||||
{
|
||||
reader.read_value(id, index, const_cast<char*>(value), size);
|
||||
}
|
||||
|
||||
void data_type_traits<const char *>::bind_value(parameter_binder &binder, size_t index, const char *value, size_t size)
|
||||
{
|
||||
binder.bind(index, value, size);
|
||||
}
|
||||
|
||||
void data_type_traits<char*>::read_value(query_result_reader &reader, const char *id, size_t index, char* value, size_t size)
|
||||
{
|
||||
reader.read_value(id, index, value, size);
|
||||
}
|
||||
|
||||
void data_type_traits<char *>::bind_value(parameter_binder &binder, size_t index, char *value, size_t size)
|
||||
{
|
||||
binder.bind(index, value, size);
|
||||
}
|
||||
|
||||
void data_type_traits<std::string>::read_value(query_result_reader &reader, const char *id, size_t index, std::string &value, size_t size)
|
||||
{
|
||||
reader.read_value(id, index, value, size);
|
||||
}
|
||||
|
||||
void data_type_traits<std::string>::bind_value(parameter_binder &binder, size_t index, std::string &value, size_t size)
|
||||
{
|
||||
binder.bind(index, value, size);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user