39 lines
1.5 KiB
C++
39 lines
1.5 KiB
C++
#include "matador/query/table_pk_generator.hpp"
|
|
#include "matador/query/query.hpp"
|
|
#include "matador/query/criteria.hpp"
|
|
#include "matador/query/error_code.hpp"
|
|
#include "matador/query/expression/expression_operators.hpp"
|
|
|
|
#include "matador/sql/error_code.hpp"
|
|
|
|
namespace matador::query {
|
|
table_pk_generator::table_pk_generator(const std::string& table_name, const std::string &sequence_name)
|
|
: abstract_pk_generator(utils::generator_type::Table)
|
|
, next_id_query_(query::update(table_name)
|
|
.set("next_id"_col, "next_id"_col + 1)
|
|
.where("name"_col == sequence_name)
|
|
.returning(("next_id"_col - 1).as("id")))
|
|
, current_id_query_(query::select({"next_id"_col})
|
|
.from(table_name)
|
|
.where("name"_col == sequence_name)
|
|
) {}
|
|
|
|
utils::result<int64_t, utils::error> table_pk_generator::next_id(const sql::executor &exec) {
|
|
return next_id_query_.fetch_value<int64_t>(exec).and_then([](const std::optional<int64_t> id) -> utils::result<int64_t, utils::error> {
|
|
if (!id) {
|
|
return utils::failure(utils::error(sql::error_code::RETRIEVE_DATA_FAILED, "Sequence returned no value"));
|
|
}
|
|
return utils::ok(*id);
|
|
});
|
|
}
|
|
|
|
utils::result<int64_t, utils::error> table_pk_generator::current_id(const sql::executor& exec) {
|
|
return current_id_query_.fetch_value<int64_t>(exec).and_then([](const std::optional<int64_t> id) -> utils::result<int64_t, utils::error> {
|
|
if (!id) {
|
|
return utils::failure(utils::error(sql::error_code::RETRIEVE_DATA_FAILED, "Sequence returned no value"));
|
|
}
|
|
return utils::ok(*id);
|
|
});
|
|
}
|
|
}
|