4#ifndef _Stroika_Foundation_Database_SQL_SQLite_h_
5#define _Stroika_Foundation_Database_SQL_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"
38namespace Stroika::Foundation::Database::SQL::SQLite {
40 using Characters::String;
41 using Containers::Mapping;
42 using Containers::Sequence;
43 using DataExchange::VariantValue;
44 using IO::Network::URI;
47#if qStroika_HasComponent_sqlite
65 class CompiledOptions final {
70 bool ENABLE_NORMALIZE;
85 static const CompiledOptions kThe;
96 enum JournalModeType {
111 namespace Connection {
113 using namespace SQL::Connection;
122 struct Options final {
131 optional<filesystem::path> fDBPath;
137 bool fCreateDBPathIfDoesNotExist{
true};
145 optional<String> fTemporaryDB;
156 optional<String> fInMemoryDB;
164 enum class ThreadingMode {
196 optional<ThreadingMode> fThreadingMode;
202 static inline constexpr auto kDefault_ThreadingMode = ThreadingMode::eMultiThread;
208 optional<String> fVFS;
213 bool fReadOnly{
false};
221 bool fImmutable{
false};
237 optional<Duration> fBusyTimeout;
241 static constexpr inline chrono::seconds kBusyTimeout_Default = 10s;
246 optional<JournalModeType> fJournalMode;
268 class Ptr :
public SQL::Connection::Ptr {
270 using inherited = SQL::Connection::Ptr;
275 Ptr (
const Ptr& src);
276 Ptr (
const shared_ptr<IRep>& src =
nullptr);
284 nonvirtual Ptr& operator= (
const Ptr& src);
285 nonvirtual Ptr& operator= (Ptr&& src)
noexcept;
290 nonvirtual IRep* operator->() const noexcept;
296 nonvirtual ::sqlite3* Peek () const;
303 Common::Property<Duration> busyTimeout;
309 Common::Property<JournalModeType> journalMode;
312 friend class Statement;
318 Ptr New (const Options& options);
339 class IRep : public SQL::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;
369 [[no_unique_address]] Debug::AssertExternallySynchronizedMutex fAssertExternallySynchronizedMutex;
381 class Statement :
public SQL::Statement {
383 using inherited = SQL::Statement;
388 Statement () =
delete;
389 Statement (
const Connection::Ptr& db,
const String& query);
390 Statement (
const Statement&) =
delete;
406 class Transaction :
public SQL::Transaction {
408 using inherited = SQL::Transaction;
435 Transaction () =
delete;
436 Transaction (
const Connection::Ptr& db, Flag f = Flag::eDEFAULT);
437 Transaction (
const Transaction&) =
delete;