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"
39namespace Stroika::Foundation::Database::Document::SQLite {
41 using Characters::String;
42 using Containers::Mapping;
43 using Containers::Sequence;
44 using DataExchange::VariantValue;
45 using IO::Network::URI;
48#if qStroika_HasComponent_sqlite
66 class CompiledOptions final {
71 bool ENABLE_NORMALIZE;
85 static const CompiledOptions kThe;
96 enum JournalModeType {
109 namespace Connection {
111 using namespace Database::Document::Connection;
120 struct Options final {
129 optional<filesystem::path> fDBPath;
135 bool fCreateDBPathIfDoesNotExist{
true};
143 optional<String> fTemporaryDB;
154 optional<String> fInMemoryDB;
162 enum class ThreadingMode {
194 optional<ThreadingMode> fThreadingMode;
200 static inline constexpr auto kDefault_ThreadingMode = ThreadingMode::eMultiThread;
206 optional<String> fVFS;
211 bool fReadOnly{
false};
219 bool fImmutable{
false};
232 optional<Duration> fBusyTimeout;
237 optional<JournalModeType> fJournalMode;
259 class Ptr :
public Database::Document::Connection::Ptr {
261 using inherited = Database::Document::Connection::Ptr;
266 Ptr (
const Ptr& src);
267 Ptr (
const shared_ptr<IRep>& src =
nullptr);
275 nonvirtual Ptr& operator= (
const Ptr& src);
276 nonvirtual Ptr& operator= (Ptr&& src)
noexcept;
281 nonvirtual IRep* operator->() const noexcept;
287 nonvirtual ::sqlite3* Peek () const;
294 Common::Property<Duration> busyTimeout;
300 Common::Property<JournalModeType> journalMode;
305 nonvirtual
void Exec (const String& sql);
311 Ptr New (const Options& options);
332 class IRep : public Database::Document::Connection::IRep {
337 virtual ::sqlite3* Peek () = 0;
343 virtual Duration GetBusyTimeout ()
const = 0;
349 virtual void SetBusyTimeout (
const Duration& timeout) = 0;
354 virtual JournalModeType GetJournalMode ()
const = 0;
359 virtual void SetJournalMode (JournalModeType journalMode) = 0;
364 virtual void Exec (
const String& sql) = 0;
367 [[no_unique_address]] Debug::AssertExternallySynchronizedMutex fAssertExternallySynchronizedMutex;
385 class Transaction :
public Database::Document::Transaction {
387 using inherited = Database::Document::Transaction;
414 Transaction () =
delete;
415 Transaction (
const Connection::Ptr& db, Flag f = Flag::eDEFAULT);
416 Transaction (
const Transaction&) =
delete;