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;
154 optional<String> fInMemoryDB;
162 enum class ThreadingMode {
194 optional<ThreadingMode> fThreadingMode;
200 optional<String> fVFS;
205 bool fReadOnly{
false};
213 bool fImmutable{
false};
219 optional<Duration> fBusyTimeout;
224 optional<JournalModeType> fJournalMode;
246 class Ptr :
public SQL::Connection::Ptr {
248 using inherited = SQL::Connection::Ptr;
253 Ptr (
const Ptr& src);
254 Ptr (
const shared_ptr<IRep>& src =
nullptr);
262 nonvirtual Ptr& operator= (
const Ptr& src);
263 nonvirtual Ptr& operator= (Ptr&& src)
noexcept;
268 nonvirtual IRep* operator->() const noexcept;
274 nonvirtual ::sqlite3* Peek () const;
281 Common::Property<Duration> busyTimeout;
287 Common::Property<JournalModeType> journalMode;
290 friend class Statement;
296 Ptr New (const Options& options);
317 class IRep : public SQL::Connection::IRep {
322 virtual ::sqlite3* Peek () = 0;
328 virtual Duration GetBusyTimeout ()
const = 0;
334 virtual void SetBusyTimeout (
const Duration& timeout) = 0;
339 virtual JournalModeType GetJournalMode ()
const = 0;
344 virtual void SetJournalMode (JournalModeType journalMode) = 0;
347 [[no_unique_address]] Debug::AssertExternallySynchronizedMutex fAssertExternallySynchronizedMutex;
359 class Statement :
public SQL::Statement {
361 using inherited = SQL::Statement;
366 Statement () =
delete;
367 Statement (
const Connection::Ptr& db,
const String& query);
368 Statement (
const Statement&) =
delete;
384 class Transaction :
public SQL::Transaction {
386 using inherited = SQL::Transaction;
413 Transaction () =
delete;
414 Transaction (
const Connection::Ptr& db, Flag f = Flag::eDEFAULT);
415 Transaction (
const Transaction&) =
delete;