4#ifndef _Stroika_Foundation_Database_Document_SQLite_h_
5#define _Stroika_Foundation_Database_Document_SQLite_h_ 1
7#include "Stroika/Foundation/StroikaPreComp.h"
12#if qStroika_HasComponent_sqlite
13#include <sqlite/sqlite3.h>
17#include "Stroika/Foundation/Common/Property.h"
18#include "Stroika/Foundation/Containers/Mapping.h"
19#include "Stroika/Foundation/Containers/Sequence.h"
40namespace Stroika::Foundation::Database::Document::SQLite {
42 using Characters::String;
43 using Containers::Mapping;
44 using Containers::Sequence;
45 using DataExchange::VariantValue;
46 using IO::Network::URI;
49#if qStroika_HasComponent_sqlite
67 class CompiledOptions final {
72 bool ENABLE_NORMALIZE;
86 static const CompiledOptions kThe;
97 enum JournalModeType {
110 namespace Connection {
112 using namespace Database::Document::Connection;
121 struct Options final : Database::Document::Connection::Options {
131 Execution::InternallySynchronized fInternallySynchronizedLetter{Execution::eNotKnownInternallySynchronized};
141 optional<filesystem::path> fDBPath;
147 bool fCreateDBPathIfDoesNotExist{
true};
155 optional<String> fTemporaryDB;
166 optional<String> fInMemoryDB;
174 enum class ThreadingMode {
206 optional<ThreadingMode> fThreadingMode;
212 static inline constexpr auto kDefault_ThreadingMode = ThreadingMode::eMultiThread;
218 optional<String> fVFS;
223 bool fReadOnly{
false};
231 bool fImmutable{
false};
247 optional<Duration> fBusyTimeout;
251 static constexpr inline chrono::seconds kBusyTimeout_Default = 10s;
256 optional<JournalModeType> fJournalMode;
278 class Ptr :
public Database::Document::Connection::Ptr {
280 using inherited = Database::Document::Connection::Ptr;
285 Ptr (
const Ptr& src);
286 Ptr (
const shared_ptr<IRep>& src);
295 nonvirtual Ptr& operator= (
const Ptr& src);
296 nonvirtual Ptr& operator= (Ptr&& src)
noexcept;
301 nonvirtual IRep* operator->() const noexcept;
308 Common::Property<Duration> busyTimeout;
314 Common::Property<JournalModeType> journalMode;
319 nonvirtual
void Exec (const String& sql);
325 Ptr New (const Options& options);
346 class IRep : public Database::Document::Connection::IRep {
351 virtual Duration GetBusyTimeout ()
const = 0;
357 virtual void SetBusyTimeout (
const Duration& timeout) = 0;
362 virtual JournalModeType GetJournalMode ()
const = 0;
367 virtual void SetJournalMode (JournalModeType journalMode) = 0;
372 virtual void Exec (
const String& sql) = 0;
393 class Transaction :
public Database::Document::Transaction {
395 using inherited = Database::Document::Transaction;
422 Transaction () =
delete;
423 Transaction (
const Connection::Ptr& db, Flag f = Flag::eDEFAULT);
424 Transaction (
const Transaction&) =
delete;
#define qStroika_ATTRIBUTE_NO_UNIQUE_ADDRESS_VCFORCE
[[msvc::no_unique_address]] isn't always broken in MSVC. Annotate with this on things where its not b...