LeechCraft  0.6.70-16373-g319c272718
Modular cross-platform feature rich live environment.
oral.h File Reference
#include <stdexcept>
#include <type_traits>
#include <memory>
#include <optional>
#include <boost/preprocessor/stringize.hpp>
#include <boost/preprocessor/tuple.hpp>
#include <QStringList>
#include <QDateTime>
#include <QPair>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QVariant>
#include <QtDebug>
#include <util/sll/ctstringutils.h>
#include <util/sll/prelude.h>
#include <util/sll/typelist.h>
#include <util/sll/typegetter.h>
#include <util/sll/detector.h>
#include <util/db/dblock.h>
#include <util/db/util.h>
#include "oraltypes.h"
#include "sqliteimpl.h"
+ Include dependency graph for oral.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

class  LC::Util::oral::QueryException
 
struct  LC::Util::oral::MemberNames< typename >
 
struct  LC::Util::oral::FieldAccess< typename >
 
struct  LC::Util::oral::FieldIndexAccess< typename >
 
struct  LC::Util::oral::Type2Name< ImplFactory, T, typename >
 
struct  LC::Util::oral::Type2Name< ImplFactory, Unique< T > >
 
struct  LC::Util::oral::Type2Name< ImplFactory, NotNull< T > >
 
struct  LC::Util::oral::Type2Name< ImplFactory, PKey< T, Tags... > >
 
struct  LC::Util::oral::Type2Name< ImplFactory, PKey< int, Tags... > >
 
struct  LC::Util::oral::Type2Name< ImplFactory, References< Ptr > >
 
struct  LC::Util::oral::ToVariant< T, typename >
 
struct  LC::Util::oral::FromVariant< T, typename >
 
struct  LC::Util::oral::detail::IsPKey< T >
 
struct  LC::Util::oral::detail::IsPKey< PKey< U, Tags... > >
 
class  LC::Util::oral::detail::AdaptInsert< Seq >
 
struct  LC::Util::oral::detail::AdaptDelete< Seq >
 
struct  LC::Util::oral::detail::WrapDirect< T >
 
class  LC::Util::oral::detail::ExprTree< Type, L, R >
 
struct  LC::Util::oral::detail::IsExprTree< T >
 
struct  LC::Util::oral::detail::IsExprTree< ExprTree< Type, L, R > >
 
class  LC::Util::oral::detail::AssignList< L, R >
 
class  LC::Util::oral::detail::ExprTree< Type, L, R >
 
class  LC::Util::oral::detail::ExprTree< ExprType::LeafData, T, void >
 
struct  LC::Util::oral::detail::MemberPtrs< Ptr >
 
class  LC::Util::oral::detail::ExprTree< ExprType::LeafStaticPlaceholder, MemberPtrs< Ptr >, void >
 
class  LC::Util::oral::detail::ExprTree< ExprType::ConstTrue, void, void >
 
struct  LC::Util::oral::detail::InfixBinary< Op >
 
struct  LC::Util::oral::detail::InfixBinaryProxy< L, Op >
 
struct  LC::Util::oral::detail::AggregateType< AggregateFunction, Ptr >
 
struct  LC::Util::oral::detail::CountAll
 
struct  LC::Util::oral::detail::OrderBy< MemberDirectionList >
 
struct  LC::Util::oral::detail::GroupBy< Ptrs >
 
struct  LC::Util::oral::detail::SelectWhole
 
struct  LC::Util::oral::detail::SelectorUnion< L, R >
 
struct  LC::Util::oral::detail::IsSelector< T >
 
struct  LC::Util::oral::detail::IsSelector< SelectWhole >
 
struct  LC::Util::oral::detail::IsSelector< AggregateType< Fun, Ptr > >
 
struct  LC::Util::oral::detail::IsSelector< MemberPtrs< Ptrs... > >
 
struct  LC::Util::oral::detail::IsSelector< SelectorUnion< L, R > >
 
struct  LC::Util::oral::sph::asc< Ptrs >
 
struct  LC::Util::oral::sph::desc< Ptrs >
 
struct  LC::Util::oral::Limit
 
struct  LC::Util::oral::Offset
 
struct  LC::Util::oral::detail::OrderNone
 
struct  LC::Util::oral::detail::GroupNone
 
struct  LC::Util::oral::detail::LimitNone
 
struct  LC::Util::oral::detail::OffsetNone
 
struct  LC::Util::oral::detail::DetectShift< Seq, T >
 
struct  LC::Util::oral::detail::DetectShift< Seq, std::tuple< Args... > >
 
struct  LC::Util::oral::detail::DetectShift< Seq, Seq >
 
struct  LC::Util::oral::detail::HandleSelectorResult< F, R >
 
class  LC::Util::oral::detail::SelectWrapperCommon
 
struct  LC::Util::oral::detail::HandleSelector< T, Selector >
 
struct  LC::Util::oral::detail::HSBaseAll
 
struct  LC::Util::oral::detail::HSBaseFirst
 
struct  LC::Util::oral::detail::HandleSelector< T, SelectWhole >
 
struct  LC::Util::oral::detail::HandleSelector< T, MemberPtrs< Ptrs... > >
 
struct  LC::Util::oral::detail::HandleSelector< T, AggregateType< AggregateFunction::Count, CountAllPtr > >
 
struct  LC::Util::oral::detail::HandleSelector< T, AggregateType< AggregateFunction::Count, Ptr > >
 
struct  LC::Util::oral::detail::HandleAggSelector< Aggregate, T, Ptr >
 
struct  LC::Util::oral::detail::HandleSelector< T, AggregateType< AggregateFunction::Min, Ptr > >
 
struct  LC::Util::oral::detail::HandleSelector< T, AggregateType< AggregateFunction::Max, Ptr > >
 
struct  LC::Util::oral::detail::HandleSelector< T, SelectorUnion< L, R > >
 
class  LC::Util::oral::detail::SelectWrapper< T, SelectBehaviour >
 
class  LC::Util::oral::detail::DeleteByFieldsWrapper< T >
 
class  LC::Util::oral::detail::AdaptUpdate< T >
 
struct  LC::Util::oral::ObjectInfo< T >
 

Namespaces

 LC::Util::oral
 
 LC::Util::oral::detail
 
 LC::Util::oral::infix
 
 LC::Util::oral::sph
 

Macros

#define ORAL_STRING_FIELD(_, index, tuple)
 
#define ORAL_GET_FIELD(_, index, tuple)
 
#define ORAL_GET_FIELD_INDEX_IMPL(index, sname, field)
 
#define ORAL_GET_FIELD_INDEX(_, index, args)   ORAL_GET_FIELD_INDEX_IMPL(index, BOOST_PP_TUPLE_ELEM(0, args), BOOST_PP_TUPLE_ELEM(index, BOOST_PP_TUPLE_ELEM(1, args)))
 
#define ORAL_ADAPT_STRUCT(sname, ...)
 

Typedefs

using LC::Util::oral::QSqlQuery_ptr = std::shared_ptr< QSqlQuery >
 
template<typename Seq , int Idx>
using LC::Util::oral::detail::ValueAtC_t = std::decay_t< decltype(Get< Idx >(std::declval< Seq >()))>
 
template<typename T >
using LC::Util::oral::detail::UnwrapIndirect_t = typename std::conditional_t< IsIndirect< T > {}, T, WrapDirect< T > >::value_type
 
template<typename L , typename R >
using LC::Util::oral::detail::EnableRelOp_t = std::enable_if_t< EitherIsExprTree< L, R >()>
 
template<typename T >
using LC::Util::oral::ObjectInfo_ptr = std::unique_ptr< ObjectInfo< T > >
 

Enumerations

enum  LC::Util::oral::detail::ExprType {
  LC::Util::oral::detail::ExprType::ConstTrue,
  LC::Util::oral::detail::ExprType::LeafStaticPlaceholder,
  LC::Util::oral::detail::ExprType::LeafData,
  LC::Util::oral::detail::ExprType::Greater,
  LC::Util::oral::detail::ExprType::Less,
  LC::Util::oral::detail::ExprType::Equal,
  LC::Util::oral::detail::ExprType::Geq,
  LC::Util::oral::detail::ExprType::Leq,
  LC::Util::oral::detail::ExprType::Neq,
  LC::Util::oral::detail::ExprType::Like,
  LC::Util::oral::detail::ExprType::And,
  LC::Util::oral::detail::ExprType::Or
}
 
enum  LC::Util::oral::detail::AggregateFunction {
  LC::Util::oral::detail::AggregateFunction::Count,
  LC::Util::oral::detail::AggregateFunction::Min,
  LC::Util::oral::detail::AggregateFunction::Max
}
 
enum  LC::Util::oral::detail::SelectBehaviour {
  LC::Util::oral::detail::SelectBehaviour::Some,
  LC::Util::oral::detail::SelectBehaviour::One
}
 
enum  LC::Util::oral::detail::ResultBehaviour {
  LC::Util::oral::detail::All,
  LC::Util::oral::detail::First
}
 

Functions

template<size_t Idx, typename Seq >
decltype(auto) constexpr LC::Util::oral::detail::Get (const Seq &seq)
 
template<size_t Idx, typename Seq >
decltype(auto) constexpr LC::Util::oral::detail::Get (Seq &seq)
 
template<typename T , CtString str>
consteval auto LC::Util::oral::detail::MorphFieldName ()
 
template<typename Seq , int Idx>
consteval auto LC::Util::oral::detail::GetFieldName ()
 
template<auto Ptr>
constexpr size_t LC::Util::oral::detail::FieldIndex () noexcept
 
template<auto Ptr>
constexpr auto LC::Util::oral::detail::GetFieldNamePtr () noexcept
 
template<auto Ptr>
constexpr auto LC::Util::oral::detail::GetQualifiedFieldNamePtr () noexcept
 
template<typename T >
QVariant LC::Util::oral::detail::ToVariantF (const T &t) noexcept
 
template<size_t Ix, typename Seq >
void LC::Util::oral::detail::BindAtIndex (const Seq &seq, QSqlQuery &query, bool bindPrimaryKey)
 
template<typename Seq >
auto LC::Util::oral::detail::DoInsert (const Seq &seq, QSqlQuery &insertQuery, bool bindPrimaryKey)
 
template<typename Seq >
consteval int LC::Util::oral::detail::PKeyIndexUnsafe ()
 
template<typename Seq >
consteval int LC::Util::oral::detail::PKeyIndex ()
 
template<typename Seq >
constexpr auto LC::Util::oral::detail::HasAutogenPKey () noexcept
 
template<typename Seq >
constexpr auto LC::Util::oral::detail::ExtractConflictingFields (InsertAction::Replace::PKeyType)
 
template<typename Seq , auto... Ptrs>
constexpr auto LC::Util::oral::detail::ExtractConflictingFields (InsertAction::Replace::FieldsType< Ptrs... >)
 
template<typename T , size_t... Indices>
LC::Util::oral::detail::InitializeFromQuery (const QSqlQuery &q, std::index_sequence< Indices... >, int startIdx) noexcept
 
template<ExprType Type>
constexpr auto LC::Util::oral::detail::TypeToSql () noexcept
 
constexpr bool LC::Util::oral::detail::IsRelational (ExprType type) noexcept
 
template<ExprType Type, typename Seq , typename L , typename R >
constexpr bool LC::Util::oral::detail::Typecheck ()
 
template<typename T >
constexpr auto LC::Util::oral::detail::AsLeafData (const T &node) noexcept
 
template<ExprType Type, typename L , typename R >
auto LC::Util::oral::detail::MakeExprTree (const L &left, const R &right) noexcept
 
template<typename L , typename R >
constexpr bool LC::Util::oral::detail::EitherIsExprTree () noexcept
 
template<typename L , typename R , typename = EnableRelOp_t<L, R>>
auto LC::Util::oral::detail::operator< (const L &left, const R &right) noexcept
 
template<typename L , typename R , typename = EnableRelOp_t<L, R>>
auto LC::Util::oral::detail::operator> (const L &left, const R &right) noexcept
 
template<typename L , typename R , typename = EnableRelOp_t<L, R>>
auto LC::Util::oral::detail::operator== (const L &left, const R &right) noexcept
 
template<typename L , typename R , typename = EnableRelOp_t<L, R>>
auto LC::Util::oral::detail::operator!= (const L &left, const R &right) noexcept
 
template<typename L , ExprType Op>
auto LC::Util::oral::detail::operator| (const L &left, InfixBinary< Op >) noexcept
 
template<typename L , ExprType Op, typename R >
auto LC::Util::oral::detail::operator| (const InfixBinaryProxy< L, Op > &left, const R &right) noexcept
 
template<typename L , typename R , typename = EnableRelOp_t<L, R>>
auto LC::Util::oral::detail::operator && (const L &left, const R &right) noexcept
 
template<typename L , typename R , typename = EnableRelOp_t<L, R>>
auto LC::Util::oral::detail::operator|| (const L &left, const R &right) noexcept
 
template<CtString BindPrefix, typename Seq , typename Tree >
constexpr auto LC::Util::oral::detail::ExprTreeToSql () noexcept
 
template<CtString BindPrefix, typename Seq , typename Tree >
void LC::Util::oral::detail::BindExprTree (const Tree &tree, QSqlQuery &query)
 
template<typename L , typename R , typename = std::enable_if_t<IsSelector<L> {} && IsSelector<R> {}>>
SelectorUnion< L, R > LC::Util::oral::detail::operator+ (L, R) noexcept
 
template<auto Ptr>
auto LC::Util::oral::detail::MemberFromVariant (const QVariant &var) noexcept
 
template<auto Ptr>
auto LC::Util::oral::detail::MakeIndexedQueryHandler (const QSqlQuery &q, int startIdx=0) noexcept
 
template<auto... Ptrs>
auto LC::Util::oral::detail::MakeIndexedQueryHandler (MemberPtrs< Ptrs... >, const QSqlQuery &q, int startIdx) noexcept
 
template<size_t RepIdx, size_t TupIdx, typename Tuple , typename NewType >
decltype(auto) constexpr LC::Util::oral::detail::GetReplaceTupleElem (Tuple &&tuple, NewType &&arg) noexcept
 
template<size_t RepIdx, typename NewType , typename Tuple , size_t... TupIdxs>
constexpr auto LC::Util::oral::detail::ReplaceTupleElemImpl (Tuple &&tuple, NewType &&arg, std::index_sequence< TupIdxs... >) noexcept
 
template<size_t RepIdx, typename NewType , typename... TupleArgs>
constexpr auto LC::Util::oral::detail::ReplaceTupleElem (std::tuple< TupleArgs... > &&tuple, NewType &&arg) noexcept
 
template<typename... LArgs, typename... RArgs>
auto LC::Util::oral::detail::Combine (std::tuple< LArgs... > &&left, std::tuple< RArgs... > &&right) noexcept
 
template<typename... LArgs, typename R >
auto LC::Util::oral::detail::Combine (std::tuple< LArgs... > &&left, const R &right) noexcept
 
template<typename L , typename... RArgs>
auto LC::Util::oral::detail::Combine (const L &left, std::tuple< RArgs... > &&right) noexcept
 
template<typename L , typename R >
auto LC::Util::oral::detail::Combine (const L &left, const R &right) noexcept
 
template<ResultBehaviour ResultBehaviour, typename ResList >
decltype(auto) LC::Util::oral::detail::HandleResultBehaviour (ResList &&list) noexcept
 
template<typename F , typename R >
 LC::Util::oral::detail::HandleSelectorResult (QString, F, R) -> HandleSelectorResult< F, R >
 
template<typename L , typename O >
constexpr auto LC::Util::oral::detail::LimitOffsetToString () noexcept
 
template<typename L , typename O >
void LC::Util::oral::detail::BindLimitOffset (QSqlQuery &query, L limit, O offset) noexcept
 
constexpr auto LC::Util::oral::detail::CombineBehaviour (ResultBehaviour l, ResultBehaviour r) noexcept
 
template<typename T , size_t... Fields>
constexpr auto LC::Util::oral::detail::ExtractConstraintFields (UniqueSubset< Fields... >)
 
template<typename T , size_t... Fields>
constexpr auto LC::Util::oral::detail::ExtractConstraintFields (PrimaryKey< Fields... >)
 
template<typename T >
constexpr auto LC::Util::oral::detail::GetConstraintsStrings () noexcept
 
template<typename ImplFactory , typename T , size_t... Indices>
constexpr auto LC::Util::oral::detail::GetTypes (std::index_sequence< Indices... >) noexcept
 
template<auto Name, typename ImplFactory , typename T >
constexpr auto LC::Util::oral::detail::AdaptCreateTableNamed () noexcept
 
template<typename ImplFactory , typename T >
constexpr auto LC::Util::oral::detail::AdaptCreateTable () noexcept
 
template<typename T , typename ImplFactory = detail::SQLite::ImplFactory>
ObjectInfo< T > LC::Util::oral::Adapt (const QSqlDatabase &db)
 
template<typename T , typename ImplFactory = SQLiteImplFactory>
ObjectInfo_ptr< T > LC::Util::oral::AdaptPtr (const QSqlDatabase &db)
 
template<typename ImplFactory , typename... Ts>
void LC::Util::oral::AdaptPtrs (const QSqlDatabase &db, ObjectInfo_ptr< Ts > &... objects)
 

Variables

template<typename >
constexpr size_t LC::Util::oral::SeqSize = -1
 
template<typename S >
constexpr auto LC::Util::oral::detail::SeqIndices = std::make_index_sequence<SeqSize<S>> {}
 
template<typename S >
constexpr auto LC::Util::oral::detail::FieldNames
 
template<typename S >
constexpr auto LC::Util::oral::detail::BoundFieldNames
 
template<typename S >
constexpr auto LC::Util::oral::detail::QualifiedFieldNames
 
template<typename T >
concept LC::Util::oral::detail::TypeNameCustomized = requires { typename T::TypeName; }
 
template<typename T >
concept LC::Util::oral::detail::BaseTypeCustomized = requires { typename T::BaseType; }
 
template<typename Seq >
constexpr int LC::Util::oral::detail::PKeyIndex_v = PKeyIndex<Seq> ()
 
template<typename Seq >
concept LC::Util::oral::detail::HasPKey = PKeyIndexUnsafe<Seq> () >= 0
 
constexpr auto LC::Util::oral::detail::ConstTrueTree_v = ExprTree<ExprType::ConstTrue> {}
 
constexpr detail::InfixBinary< detail::ExprType::Like > LC::Util::oral::infix::like {}
 
constexpr CountAll * LC::Util::oral::detail::CountAllPtr = nullptr
 
template<auto Ptr>
constexpr detail::ExprTree< detail::ExprType::LeafStaticPlaceholder, detail::MemberPtrs< Ptr > > LC::Util::oral::sph::f {}
 
template<auto... Ptrs>
constexpr detail::MemberPtrs< Ptrs... > LC::Util::oral::sph::fields {}
 
constexpr detail::SelectWhole LC::Util::oral::sph::all {}
 
template<auto Ptr = detail::CountAllPtr>
constexpr detail::AggregateType< detail::AggregateFunction::Count, Ptr > LC::Util::oral::sph::count {}
 
template<auto Ptr>
constexpr detail::AggregateType< detail::AggregateFunction::Min, Ptr > LC::Util::oral::sph::min {}
 
template<auto Ptr>
constexpr detail::AggregateType< detail::AggregateFunction::Max, Ptr > LC::Util::oral::sph::max {}
 
template<typename... Orders>
constexpr detail::OrderBy< Orders... > LC::Util::oral::OrderBy {}
 
template<auto... Ptrs>
constexpr detail::GroupBy< Ptrs... > LC::Util::oral::GroupBy {}
 

Macro Definition Documentation

◆ ORAL_ADAPT_STRUCT

#define ORAL_ADAPT_STRUCT (   sname,
  ... 
)

Definition at line 52 of file oral.h.

◆ ORAL_GET_FIELD

#define ORAL_GET_FIELD (   _,
  index,
  tuple 
)
Value:
if constexpr (Idx == index) \
return s.BOOST_PP_TUPLE_ELEM(index, tuple);

Definition at line 41 of file oral.h.

◆ ORAL_GET_FIELD_INDEX

#define ORAL_GET_FIELD_INDEX (   _,
  index,
  args 
)    ORAL_GET_FIELD_INDEX_IMPL(index, BOOST_PP_TUPLE_ELEM(0, args), BOOST_PP_TUPLE_ELEM(index, BOOST_PP_TUPLE_ELEM(1, args)))

Definition at line 49 of file oral.h.

◆ ORAL_GET_FIELD_INDEX_IMPL

#define ORAL_GET_FIELD_INDEX_IMPL (   index,
  sname,
  field 
)
Value:
template<> \
constexpr size_t FieldIndexAccess<sname>::FieldIndex<&sname::field> () { return index; }
constexpr size_t FieldIndex() noexcept
Definition: oral.h:189

Definition at line 45 of file oral.h.

◆ ORAL_STRING_FIELD

#define ORAL_STRING_FIELD (   _,
  index,
  tuple 
)
Value:
if constexpr (Idx == index) \
return CtString { BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(index, tuple)) };
CtString(RawStr< N, Char >) -> CtString< N - 1, Char >

Definition at line 37 of file oral.h.