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};
235 optional<Duration> fBusyTimeout;
239 static constexpr inline chrono::seconds kBusyTimeout_Default = 10s;
244 optional<JournalModeType> fJournalMode;
266 class Ptr :
public Database::Document::Connection::Ptr {
268 using inherited = Database::Document::Connection::Ptr;
273 Ptr (
const Ptr& src);
274 Ptr (
const shared_ptr<IRep>& src =
nullptr);
282 nonvirtual Ptr& operator= (
const Ptr& src);
283 nonvirtual Ptr& operator= (Ptr&& src)
noexcept;
288 nonvirtual IRep* operator->() const noexcept;
294 nonvirtual ::sqlite3* Peek () const;
301 Common::Property<Duration> busyTimeout;
307 Common::Property<JournalModeType> journalMode;
312 nonvirtual
void Exec (const String& sql);
318 Ptr New (const Options& options);
339 class IRep : public Database::Document::Connection::IRep {
344 virtual ::sqlite3* Peek () = 0;
350 virtual Duration GetBusyTimeout ()
const = 0;
356 virtual void SetBusyTimeout (
const Duration& timeout) = 0;
361 virtual JournalModeType GetJournalMode ()
const = 0;
366 virtual void SetJournalMode (JournalModeType journalMode) = 0;
371 virtual void Exec (
const String& sql) = 0;
374 [[no_unique_address]] Debug::AssertExternallySynchronizedMutex fAssertExternallySynchronizedMutex;
392 class Transaction :
public Database::Document::Transaction {
394 using inherited = Database::Document::Transaction;
421 Transaction () =
delete;
422 Transaction (
const Connection::Ptr& db, Flag f = Flag::eDEFAULT);
423 Transaction (
const Transaction&) =
delete;