89 lines
2.5 KiB
C++
89 lines
2.5 KiB
C++
#ifndef FETCHABLE_QUERY_HPP
|
|
#define FETCHABLE_QUERY_HPP
|
|
|
|
#include "query_intermediate.hpp"
|
|
|
|
#include "../query_compiler.hpp"
|
|
|
|
#include "../../sql/query_result.hpp"
|
|
#include "../../sql/record.hpp"
|
|
|
|
#include "../../utils/error.hpp"
|
|
#include "../../utils/result.hpp"
|
|
|
|
namespace matador::sql {
|
|
class executor;
|
|
class statement;
|
|
}
|
|
|
|
namespace matador::query {
|
|
|
|
class fetchable_query : public query_intermediate
|
|
{
|
|
protected:
|
|
using query_intermediate::query_intermediate;
|
|
|
|
public:
|
|
template < class Type >
|
|
utils::result<sql::query_result<Type>, utils::error> fetch_all(sql::executor &exec) {
|
|
auto result = fetch(exec);
|
|
if (!result.is_ok()) {
|
|
return utils::failure(result.err());
|
|
}
|
|
|
|
const auto prototype = result.value()->prototype();
|
|
return utils::ok(sql::query_result<Type>(result.release(), [prototype] {
|
|
return sql::detail::create_prototype<Type>(prototype);
|
|
}));
|
|
}
|
|
[[nodiscard]] utils::result<sql::query_result<sql::record>, utils::error> fetch_all(const sql::executor &exec) const;
|
|
|
|
template < class Type >
|
|
utils::result<std::unique_ptr<Type>, utils::error> fetch_one(const sql::executor &exec)
|
|
{
|
|
auto result = fetch(exec);
|
|
if (!result.is_ok()) {
|
|
return utils::failure(result.err());
|
|
}
|
|
|
|
const auto prototype = result.value()->prototype();
|
|
auto objects = sql::query_result<Type>(result.release(), [prototype] {
|
|
return sql::detail::create_prototype<Type>(prototype);
|
|
});
|
|
auto first = objects.begin();
|
|
if (first == objects.end()) {
|
|
return utils::ok(std::unique_ptr<Type>{nullptr});
|
|
}
|
|
|
|
return utils::ok(std::unique_ptr<Type>{first.release()});
|
|
}
|
|
|
|
[[nodiscard]] utils::result<std::optional<sql::record>, utils::error> fetch_one(const sql::executor &exec) const;
|
|
|
|
template<typename Type>
|
|
utils::result<std::optional<Type>, utils::error> fetch_value(const sql::executor &exec)
|
|
{
|
|
const auto result = fetch_one(exec);
|
|
if (!result.is_ok()) {
|
|
return utils::failure(result.err());
|
|
}
|
|
|
|
if (result->has_value()) {
|
|
return utils::ok(std::optional<Type>{result->value().at(0).as<Type>().value()});
|
|
}
|
|
return utils::ok(std::optional<Type>{std::nullopt});
|
|
}
|
|
|
|
[[nodiscard]] utils::result<sql::statement, utils::error> prepare(sql::executor &exec) const;
|
|
|
|
[[nodiscard]] std::string str(const sql::executor &exec) const;
|
|
[[nodiscard]] sql::query_context compile(const sql::dialect &d) const;
|
|
|
|
private:
|
|
[[nodiscard]] utils::result<std::unique_ptr<sql::query_result_impl>, utils::error> fetch(const sql::executor &exec) const;
|
|
};
|
|
|
|
}
|
|
|
|
#endif //FETCHABLE_QUERY_HPP
|