fixed backend tests
This commit is contained in:
@@ -137,9 +137,8 @@ bool attribute_definition::is_null() const {
|
||||
return value_.is_null();
|
||||
}
|
||||
|
||||
void attribute_definition::type(utils::basic_type /*type*/) {
|
||||
// type_ = type;
|
||||
// utils::initialize_by_utils::basic_type(type, value_);
|
||||
void attribute_definition::type(const utils::basic_type type) {
|
||||
value_.type(type);
|
||||
}
|
||||
|
||||
std::string attribute_definition::str() const {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
namespace matador::utils {
|
||||
namespace detail {
|
||||
|
||||
void initialize_by_basic_type(basic_type type, database_type &val);
|
||||
|
||||
size_t determine_size(const std::string &val)
|
||||
{
|
||||
return val.size();
|
||||
@@ -56,11 +58,15 @@ size_t value::size() const
|
||||
return size_;
|
||||
}
|
||||
|
||||
basic_type value::type() const
|
||||
{
|
||||
basic_type value::type() const {
|
||||
return type_;
|
||||
}
|
||||
|
||||
void value::type(const basic_type t) {
|
||||
type_ = t;
|
||||
detail::initialize_by_basic_type(type_, value_);
|
||||
}
|
||||
|
||||
bool value::is_integer() const
|
||||
{
|
||||
return type_ >= basic_type::type_int8 && type_ <= basic_type::type_uint64;
|
||||
@@ -106,4 +112,59 @@ bool value::is_null() const
|
||||
return type_ == basic_type::type_null;
|
||||
}
|
||||
|
||||
namespace detail {
|
||||
void initialize_by_basic_type(const basic_type type, database_type &val) {
|
||||
switch (type) {
|
||||
case basic_type::type_int8:
|
||||
val.emplace<int8_t>();
|
||||
break;
|
||||
case basic_type::type_int16:
|
||||
val.emplace<int16_t>();
|
||||
break;
|
||||
case basic_type::type_int32:
|
||||
val.emplace<int32_t>();
|
||||
break;
|
||||
case basic_type::type_int64:
|
||||
val.emplace<int64_t>();
|
||||
break;
|
||||
case basic_type::type_uint8:
|
||||
val.emplace<uint8_t>();
|
||||
break;
|
||||
case basic_type::type_uint16:
|
||||
val.emplace<uint16_t>();
|
||||
break;
|
||||
case basic_type::type_uint32:
|
||||
val.emplace<uint32_t>();
|
||||
break;
|
||||
case basic_type::type_uint64:
|
||||
val.emplace<uint64_t>();
|
||||
break;
|
||||
case basic_type::type_bool:
|
||||
val.emplace<bool>();
|
||||
break;
|
||||
case basic_type::type_float:
|
||||
val.emplace<float>();
|
||||
break;
|
||||
case basic_type::type_double:
|
||||
val.emplace<double>();
|
||||
break;
|
||||
case basic_type::type_varchar:
|
||||
case basic_type::type_text:
|
||||
val.emplace<std::string>();
|
||||
break;
|
||||
// case basic_type::type_date:
|
||||
// val.emplace<date>();
|
||||
// break;
|
||||
// case basic_type::type_time:
|
||||
// val.emplace<time>();
|
||||
// break;
|
||||
case basic_type::type_blob:
|
||||
val.emplace<utils::blob>();
|
||||
break;
|
||||
default:
|
||||
val.emplace<nullptr_t>();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,18 +9,21 @@ namespace matador::query {
|
||||
utils::result<size_t, utils::error> executable_query::execute(const sql::executor &exec) const
|
||||
{
|
||||
query_compiler compiler;
|
||||
context_->mode = query_mode::Direct;
|
||||
return exec.execute(compiler.compile(*context_, exec.dialect(), std::nullopt));
|
||||
}
|
||||
|
||||
utils::result<sql::statement, utils::error> executable_query::prepare(const sql::executor &exec) const
|
||||
{
|
||||
query_compiler compiler;
|
||||
context_->mode = query_mode::Prepared;
|
||||
return exec.prepare(compiler.compile(*context_, exec.dialect(), std::nullopt));
|
||||
}
|
||||
|
||||
std::string executable_query::str(const sql::executor &exec) const
|
||||
{
|
||||
query_compiler compiler;
|
||||
context_->mode = query_mode::Direct;
|
||||
return exec.str(compiler.compile(*context_, exec.dialect(), std::nullopt));
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ namespace matador::query {
|
||||
utils::result<sql::query_result<sql::record>, utils::error> fetchable_query::fetch_all(const sql::executor &exec) const
|
||||
{
|
||||
query_compiler compiler;
|
||||
context_->mode = query_mode::Direct;
|
||||
return exec.fetch(compiler.compile(*context_, exec.dialect(), std::nullopt))
|
||||
.and_then([](auto &&res) {
|
||||
return utils::ok(sql::query_result<sql::record>(std::forward<decltype(res)>(res)));
|
||||
@@ -22,6 +23,7 @@ utils::result<sql::query_result<sql::record>, utils::error> fetchable_query::fet
|
||||
utils::result<std::optional<sql::record>, utils::error> fetchable_query::fetch_one(const sql::executor &exec) const
|
||||
{
|
||||
query_compiler compiler;
|
||||
context_->mode = query_mode::Direct;
|
||||
auto result = exec.fetch(compiler.compile(*context_, exec.dialect(), std::nullopt));
|
||||
if (!result.is_ok()) {
|
||||
return utils::failure(result.err());
|
||||
@@ -39,18 +41,21 @@ utils::result<std::optional<sql::record>, utils::error> fetchable_query::fetch_o
|
||||
std::string fetchable_query::str(const sql::executor &exec) const
|
||||
{
|
||||
query_compiler compiler;
|
||||
context_->mode = query_mode::Direct;
|
||||
return exec.str(compiler.compile(*context_, exec.dialect(), std::nullopt));
|
||||
}
|
||||
|
||||
utils::result<std::unique_ptr<sql::query_result_impl>, utils::error> fetchable_query::fetch(const sql::executor &exec) const
|
||||
{
|
||||
query_compiler compiler;
|
||||
context_->mode = query_mode::Direct;
|
||||
return exec.fetch(compiler.compile(*context_, exec.dialect(), std::nullopt));
|
||||
}
|
||||
|
||||
utils::result<sql::statement, utils::error> fetchable_query::prepare(const sql::executor &exec) const
|
||||
{
|
||||
query_compiler compiler;
|
||||
context_->mode = query_mode::Prepared;
|
||||
return exec.prepare(compiler.compile(*context_, exec.dialect(), std::nullopt));
|
||||
}
|
||||
|
||||
|
||||
@@ -15,10 +15,12 @@ executable_query query_into_intermediate::values(std::vector<std::variant<utils:
|
||||
}
|
||||
|
||||
executable_query query_into_intermediate::values( std::vector<utils::database_type>&& values ) {
|
||||
std::vector<std::variant<utils::placeholder, utils::database_type>> transformed_values;
|
||||
for (auto&& val : values) {
|
||||
transformed_values.emplace_back(val);
|
||||
}
|
||||
return this->values(std::move(transformed_values));
|
||||
std::vector<std::variant<utils::placeholder, utils::database_type>> transformed_values;
|
||||
transformed_values.reserve(values.size());
|
||||
for (auto&& val : values) {
|
||||
transformed_values.emplace_back(val);
|
||||
}
|
||||
return this->values(std::move(transformed_values));
|
||||
}
|
||||
|
||||
} // namespace matador::query
|
||||
|
||||
@@ -174,8 +174,16 @@ struct value_visitor {
|
||||
internal::basic_type_to_string_visitor value_to_string_visitor;
|
||||
};
|
||||
|
||||
void query_compiler::visit(internal::query_values_part &values_part)
|
||||
{
|
||||
std::string query_compiler::determine_value(value_visitor &visitor, const std::variant<utils::placeholder, utils::database_type> &val) {
|
||||
if (data_->mode == query_mode::Direct) {
|
||||
std::visit(visitor, val);
|
||||
return visitor.value_to_string_visitor.result;
|
||||
}
|
||||
|
||||
query_.bind_vars.emplace_back(std::string("value_") + std::to_string(query_.bind_vars.size() + 1));
|
||||
return dialect_->next_placeholder(query_.bind_vars);
|
||||
}
|
||||
void query_compiler::visit(internal::query_values_part &values_part) {
|
||||
query_.sql += " " + dialect_->token_at(sql::dialect_token::VALUES);
|
||||
|
||||
attribute_string_writer writer(*dialect_, connection_);
|
||||
@@ -184,19 +192,16 @@ void query_compiler::visit(internal::query_values_part &values_part)
|
||||
std::string result{"("};
|
||||
if (values_part.values().size() < 2) {
|
||||
for (const auto& val: values_part.values()) {
|
||||
std::visit(visitor, val);
|
||||
result.append(visitor.value_to_string_visitor.result);
|
||||
result.append(determine_value(visitor, val));
|
||||
}
|
||||
} else {
|
||||
auto it = values_part.values().begin();
|
||||
auto val = *it++;
|
||||
std::visit(visitor, val);
|
||||
result.append(visitor.value_to_string_visitor.result);
|
||||
result.append(determine_value(visitor, val));
|
||||
for (; it != values_part.values().end(); ++it) {
|
||||
result.append(", ");
|
||||
val = *it;
|
||||
std::visit(visitor, val);
|
||||
result.append(visitor.value_to_string_visitor.result);
|
||||
result.append(determine_value(visitor, val));
|
||||
}
|
||||
}
|
||||
result += (")");
|
||||
@@ -267,11 +272,11 @@ void query_compiler::visit(internal::query_create_table_part &create_table_part)
|
||||
if (!context.primary_keys.empty()) {
|
||||
result.append(", CONSTRAINT PK_" + create_table_part.table().name + " PRIMARY KEY (" + utils::join(context.primary_keys, ", ") + ")");
|
||||
}
|
||||
for (const auto &fk: context.foreign_contexts) {
|
||||
for (const auto &[column, reference_column]: context.foreign_contexts) {
|
||||
result += ", CONSTRAINT FK_" + create_table_part.table().name;
|
||||
result += "_" + fk.column;
|
||||
result += " FOREIGN KEY (" + fk.column + ")";
|
||||
result += " REFERENCES " + fk.reference_column->table_name() + "(" + fk.reference_column->name() + ")";
|
||||
result += "_" + column;
|
||||
result += " FOREIGN KEY (" + column + ")";
|
||||
result += " REFERENCES " + reference_column->table_name() + "(" + reference_column->name() + ")";
|
||||
}
|
||||
|
||||
result += ")";
|
||||
|
||||
@@ -73,7 +73,7 @@ utils::result<void, utils::error> connection::open() const
|
||||
if (res.is_error()) {
|
||||
return utils::failure(res.err());
|
||||
}
|
||||
if (*res) {
|
||||
if (!*res) {
|
||||
logger_->on_connect();
|
||||
return connection_->open();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user