added returning token for insert query
This commit is contained in:
@@ -2,24 +2,32 @@
|
||||
#define QUERY_INTO_INTERMEDIATE_HPP
|
||||
|
||||
#include "matador/query/intermediates/executable_query.hpp"
|
||||
#include "matador/query/intermediates/fetchable_query.hpp"
|
||||
|
||||
#include "matador/query/value_extractor.hpp"
|
||||
|
||||
#include "matador/utils/placeholder.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
class table_column;
|
||||
|
||||
class query_into_intermediate : public query_intermediate
|
||||
{
|
||||
class query_values_intermediate : public executable_query {
|
||||
public:
|
||||
using executable_query::executable_query;
|
||||
|
||||
fetchable_query returning(const table_column &col);
|
||||
};
|
||||
|
||||
class query_into_intermediate : public query_intermediate {
|
||||
public:
|
||||
using query_intermediate::query_intermediate;
|
||||
|
||||
executable_query values(std::initializer_list<std::variant<utils::placeholder, utils::database_type>> values);
|
||||
executable_query values(std::vector<std::variant<utils::placeholder, utils::database_type>> &&values);
|
||||
executable_query values(std::vector<utils::placeholder> &&values);
|
||||
executable_query values(std::vector<utils::database_type> &&values);
|
||||
query_values_intermediate values(std::initializer_list<std::variant<utils::placeholder, utils::database_type>> values);
|
||||
query_values_intermediate values(std::vector<std::variant<utils::placeholder, utils::database_type>> &&values);
|
||||
query_values_intermediate values(std::vector<utils::placeholder> &&values);
|
||||
query_values_intermediate values(std::vector<utils::database_type> &&values);
|
||||
template<class Type>
|
||||
executable_query values(const Type &obj) {
|
||||
query_values_intermediate values(const Type &obj) {
|
||||
return values(value_extractor::extract(obj));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -317,8 +317,7 @@ private:
|
||||
/**
|
||||
* Represents the SQL VALUES part
|
||||
*/
|
||||
class query_values_part final : public query_part
|
||||
{
|
||||
class query_values_part final : public query_part {
|
||||
public:
|
||||
explicit query_values_part(std::vector<std::variant<utils::placeholder, utils::database_type>> &&values);
|
||||
|
||||
@@ -331,6 +330,19 @@ private:
|
||||
std::vector<std::variant<utils::placeholder, utils::database_type>> values_;
|
||||
};
|
||||
|
||||
class query_returning_part final : public query_part {
|
||||
public:
|
||||
explicit query_returning_part(std::vector<table_column> columns);
|
||||
|
||||
[[nodiscard]] const std::vector<table_column>& columns() const;
|
||||
|
||||
private:
|
||||
void accept(query_part_visitor &visitor) override;
|
||||
|
||||
private:
|
||||
std::vector<table_column> columns_;
|
||||
};
|
||||
|
||||
class query_update_part final : public query_part
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -44,7 +44,6 @@ protected:
|
||||
void visit(internal::query_drop_key_constraint_part_by_name &part) override;
|
||||
void visit(internal::query_drop_key_constraint_part_by_constraint &part) override;
|
||||
|
||||
protected:
|
||||
void visit(internal::query_select_part &part) override;
|
||||
void visit(internal::query_from_part &part) override;
|
||||
void visit(internal::query_join_table_part &part) override;
|
||||
@@ -57,9 +56,11 @@ protected:
|
||||
void visit(internal::query_order_by_desc_part &part) override;
|
||||
void visit(internal::query_offset_part &part) override;
|
||||
void visit(internal::query_limit_part &part) override;
|
||||
|
||||
void visit(internal::query_insert_part &part) override;
|
||||
void visit(internal::query_into_part &part) override;
|
||||
void visit(internal::query_values_part &part) override;
|
||||
void visit(internal::query_returning_part &part) override;
|
||||
|
||||
void visit(internal::query_update_part &part) override;
|
||||
void visit(internal::query_set_part &part) override;
|
||||
|
||||
@@ -4,7 +4,9 @@
|
||||
namespace matador::query {
|
||||
|
||||
namespace internal {
|
||||
// Alter common
|
||||
class query_alter_part;
|
||||
// Alter table
|
||||
class query_alter_table_part;
|
||||
class query_add_key_constraint_part;
|
||||
class query_drop_key_constraint_part_by_name;
|
||||
@@ -13,6 +15,7 @@ class query_add_foreign_key_constraint_part;
|
||||
class query_add_constraint_part_by_constraint;
|
||||
class query_add_foreign_key_reference_part;
|
||||
class query_add_primary_key_constraint_part;
|
||||
// Select
|
||||
class query_select_part;
|
||||
class query_from_part;
|
||||
class query_join_table_part;
|
||||
@@ -25,20 +28,30 @@ class query_order_by_asc_part;
|
||||
class query_order_by_desc_part;
|
||||
class query_offset_part;
|
||||
class query_limit_part;
|
||||
// Insert
|
||||
class query_insert_part;
|
||||
class query_into_part;
|
||||
class query_values_part;
|
||||
class query_returning_part;
|
||||
// Update
|
||||
class query_update_part;
|
||||
class query_set_part;
|
||||
// Delete
|
||||
class query_delete_part;
|
||||
class query_delete_from_part;
|
||||
// Create common
|
||||
class query_create_part;
|
||||
// Create table
|
||||
class query_create_table_part;
|
||||
class query_create_table_columns_part;
|
||||
class query_create_table_constraints_part;
|
||||
// Create schema
|
||||
class query_create_schema_part;
|
||||
// Drop common
|
||||
class query_drop_part;
|
||||
// Drop table
|
||||
class query_drop_table_part;
|
||||
// Drop schema
|
||||
class query_drop_schema_part;
|
||||
}
|
||||
|
||||
@@ -72,6 +85,7 @@ public:
|
||||
virtual void visit(internal::query_insert_part &part) = 0;
|
||||
virtual void visit(internal::query_into_part &part) = 0;
|
||||
virtual void visit(internal::query_values_part &part) = 0;
|
||||
virtual void visit(internal::query_returning_part &part) = 0;
|
||||
|
||||
virtual void visit(internal::query_update_part &part) = 0;
|
||||
virtual void visit(internal::query_set_part &part) = 0;
|
||||
|
||||
@@ -12,6 +12,7 @@ class dialect;
|
||||
namespace matador::query {
|
||||
class table_column;
|
||||
|
||||
void prepare_column(std::string &out, const sql::dialect& d, const table_column &col);
|
||||
[[nodiscard]] std::string prepare_identifier(const sql::dialect& d, const table_column &col);
|
||||
[[nodiscard]] std::string prepare_criteria(const sql::dialect& d, const table_column &col);
|
||||
}
|
||||
|
||||
@@ -166,6 +166,7 @@ public:
|
||||
[[nodiscard]] const std::string& primary_key() const;
|
||||
[[nodiscard]] const std::string& references() const;
|
||||
[[nodiscard]] const std::string& remove() const;
|
||||
[[nodiscard]] const std::string& returning() const;
|
||||
[[nodiscard]] const std::string& rollback() const;
|
||||
[[nodiscard]] const std::string& schema() const;
|
||||
[[nodiscard]] const std::string& select() const;
|
||||
@@ -236,6 +237,7 @@ private:
|
||||
{dialect_token::PrimaryKey, "PRIMARY KEY"},
|
||||
{dialect_token::References, "REFERENCES"},
|
||||
{dialect_token::Remove, "DELETE"},
|
||||
{dialect_token::Returning, "RETURNING"},
|
||||
{dialect_token::Rollback, "ROLLBACK TRANSACTION"},
|
||||
{dialect_token::Schema, "SCHEMA"},
|
||||
{dialect_token::Select, "SELECT"},
|
||||
|
||||
@@ -51,6 +51,7 @@ enum class dialect_token : uint8_t {
|
||||
PrimaryKey,
|
||||
References,
|
||||
Remove,
|
||||
Returning,
|
||||
Rollback,
|
||||
Schema,
|
||||
Select,
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
#ifndef MATADOR_EXECUTE_RESULT_HPP
|
||||
#define MATADOR_EXECUTE_RESULT_HPP
|
||||
|
||||
#include "matador/utils/identifier.hpp"
|
||||
|
||||
#include <vector>
|
||||
|
||||
namespace matador::sql {
|
||||
struct execute_result {
|
||||
size_t affected_rows{};
|
||||
std::vector<long long> insert_ids{};
|
||||
std::vector<utils::identifier> generated_ids{};
|
||||
};
|
||||
}
|
||||
#endif // MATADOR_EXECUTE_RESULT_HPP
|
||||
|
||||
@@ -27,9 +27,10 @@ enum class sql_command {
|
||||
AlterSchema
|
||||
};
|
||||
|
||||
struct sql_command_info {
|
||||
std::string sql;
|
||||
sql_command command{};
|
||||
enum class return_mode {
|
||||
None,
|
||||
GeneratedKeys,
|
||||
Rows
|
||||
};
|
||||
|
||||
struct query_context {
|
||||
@@ -44,6 +45,14 @@ struct query_context {
|
||||
// Data for resolving query result
|
||||
std::shared_ptr<resolver_service> resolver{};
|
||||
std::type_index result_type = typeid(void);
|
||||
return_mode mode = return_mode::None;
|
||||
|
||||
[[nodiscard]] bool is_ddl() const { return command == sql_command::Create || command == sql_command::Alter; }
|
||||
[[nodiscard]] bool is_dml() const { return command == sql_command::Insert || command == sql_command::Update || command == sql_command::Delete; }
|
||||
[[nodiscard]] bool is_query() const { return command == sql_command::Select; }
|
||||
|
||||
[[nodiscard]] bool expects_rows() const { return mode == return_mode::Rows; }
|
||||
[[nodiscard]] bool expects_generated_keys() const { return mode == return_mode::GeneratedKeys; }
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user