Botan 3.10.0
Crypto and TLS for C&
Botan::Sqlite3_Database Class Referencefinal

#include <sqlite3.h>

Inheritance diagram for Botan::Sqlite3_Database:
Botan::SQL_Database

Public Member Functions

void create_table (std::string_view table_schema) override
virtual size_t exec (std::string_view sql)
bool is_threadsafe () const override
std::shared_ptr< Statementnew_statement (std::string_view sql) const override
Sqlite3_Databaseoperator= (const Sqlite3_Database &other)=delete
Sqlite3_Databaseoperator= (Sqlite3_Database &&other)=delete
size_t row_count (std::string_view table_name) override
size_t rows_changed_by_last_statement () override
 Sqlite3_Database (const Sqlite3_Database &other)=delete
 Sqlite3_Database (Sqlite3_Database &&other)=delete
BOTAN_FUTURE_EXPLICIT Sqlite3_Database (std::string_view file, std::optional< int > sqlite_open_flags=std::nullopt)
 ~Sqlite3_Database () override

Detailed Description

Definition at line 21 of file sqlite3.h.

Constructor & Destructor Documentation

◆ Sqlite3_Database() [1/3]

Botan::Sqlite3_Database::Sqlite3_Database ( std::string_view file,
std::optional< int > sqlite_open_flags = std::nullopt )

Create a new SQLite database handle from a file.

Parameters
filepath to the database file be opened and/or created
sqlite_open_flagsflags that will be passed to sqlite3_open_v2() (default: SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX)

Definition at line 18 of file sqlite3.cpp.

18 {
19 // SQLITE_OPEN_FULLMUTEX ensures that the database object can be used
20 // concurrently from multiple threads.
21 const int open_flags =
22 sqlite_open_flags.value_or(SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX);
23 int rc = ::sqlite3_open_v2(std::string(db_filename).c_str(), &m_db, open_flags, nullptr);
24
25 if(rc != 0) [[unlikely]] {
26 const std::string err_msg = ::sqlite3_errmsg(m_db);
27 ::sqlite3_close(m_db);
28 m_db = nullptr;
29 throw SQL_DB_Error("sqlite3_open failed - " + err_msg);
30 }
31}

Referenced by operator=(), operator=(), Sqlite3_Database(), and Sqlite3_Database().

◆ ~Sqlite3_Database()

Botan::Sqlite3_Database::~Sqlite3_Database ( )
override

Definition at line 33 of file sqlite3.cpp.

33 {
34 if(m_db != nullptr) [[likely]] {
35 ::sqlite3_close(m_db);
36 }
37 m_db = nullptr;
38}

◆ Sqlite3_Database() [2/3]

Botan::Sqlite3_Database::Sqlite3_Database ( const Sqlite3_Database & other)
delete

References Sqlite3_Database().

◆ Sqlite3_Database() [3/3]

Botan::Sqlite3_Database::Sqlite3_Database ( Sqlite3_Database && other)
delete

References Sqlite3_Database().

Member Function Documentation

◆ create_table()

void Botan::Sqlite3_Database::create_table ( std::string_view table_schema)
overridevirtual

Implements Botan::SQL_Database.

Definition at line 54 of file sqlite3.cpp.

54 {
55 char* errmsg = nullptr;
56 int rc = ::sqlite3_exec(m_db, std::string(table_schema).c_str(), nullptr, nullptr, &errmsg);
57
58 if(rc != SQLITE_OK) {
59 const std::string err_msg = errmsg;
60 ::sqlite3_free(errmsg);
61 ::sqlite3_close(m_db);
62 m_db = nullptr;
63 throw SQL_DB_Error("sqlite3_exec for table failed - " + err_msg);
64 }
65}

Referenced by operator=().

◆ exec()

virtual size_t Botan::SQL_Database::exec ( std::string_view sql)
inlinevirtualinherited

Definition at line 77 of file database.h.

77{ return new_statement(sql)->spin(); }
virtual std::shared_ptr< Statement > new_statement(std::string_view base_sql) const =0

References new_statement().

◆ is_threadsafe()

bool Botan::Sqlite3_Database::is_threadsafe ( ) const
overridevirtual

Reimplemented from Botan::SQL_Database.

Definition at line 73 of file sqlite3.cpp.

73 {
74 const int flag = sqlite3_threadsafe();
75
76 // `flag` can have three values:
77 //
78 // 0 - single threaded: no locking is done inside the SQLite code
79 // 1 - serialized: all SQLite database features can be used safely
80 // from multiple threads
81 // 2 - reduced locking: application must ensure not to use a single
82 // database connection across threads
83 //
84 // https://www.sqlite.org/c3ref/threadsafe.html
85
86 // When opening the database connection we explicitly request
87 // SQLITE_OPEN_FULLMUTEX to ensure restrictive locking in SQLite.
88 return flag >= 1;
89}

Referenced by operator=().

◆ new_statement()

std::shared_ptr< SQL_Database::Statement > Botan::Sqlite3_Database::new_statement ( std::string_view sql) const
overridevirtual

Implements Botan::SQL_Database.

Definition at line 40 of file sqlite3.cpp.

40 {
41 return std::make_shared<Sqlite3_Statement>(m_db, base_sql);
42}

Referenced by operator=(), and row_count().

◆ operator=() [1/2]

Sqlite3_Database & Botan::Sqlite3_Database::operator= ( const Sqlite3_Database & other)
delete

References Sqlite3_Database().

Referenced by operator=().

◆ operator=() [2/2]

◆ row_count()

size_t Botan::Sqlite3_Database::row_count ( std::string_view table_name)
overridevirtual

Implements Botan::SQL_Database.

Definition at line 44 of file sqlite3.cpp.

44 {
45 auto stmt = new_statement(fmt("select count(*) from {}", table_name));
46
47 if(stmt->step()) {
48 return stmt->get_size_t(0);
49 } else {
50 throw SQL_DB_Error(fmt("Querying size of table '{}' failed", table_name));
51 }
52}
std::shared_ptr< Statement > new_statement(std::string_view sql) const override
Definition sqlite3.cpp:40
std::string fmt(std::string_view format, const T &... args)
Definition fmt.h:53

References Botan::fmt(), and new_statement().

Referenced by operator=().

◆ rows_changed_by_last_statement()

size_t Botan::Sqlite3_Database::rows_changed_by_last_statement ( )
overridevirtual

Implements Botan::SQL_Database.

Definition at line 67 of file sqlite3.cpp.

67 {
68 const auto result = ::sqlite3_changes64(m_db);
69 BOTAN_ASSERT_NOMSG(result >= 0);
70 return static_cast<size_t>(result);
71}
#define BOTAN_ASSERT_NOMSG(expr)
Definition assert.h:75

References BOTAN_ASSERT_NOMSG.

Referenced by operator=().


The documentation for this class was generated from the following files: