OpenMS
Loading...
Searching...
No Matches
SqliteConnector.h
Go to the documentation of this file.
1// Copyright (c) 2002-present, OpenMS Inc. -- EKU Tuebingen, ETH Zurich, and FU Berlin
2// SPDX-License-Identifier: BSD-3-Clause
3//
4// --------------------------------------------------------------------------
5// $Maintainer: Hannes Roest $
6// $Authors: Hannes Roest $
7// --------------------------------------------------------------------------
8
9#pragma once
10
14
15#include <type_traits> // for is_same
16
17// forward declarations
18struct sqlite3;
19struct sqlite3_stmt;
20
21namespace OpenMS
22{
30 class OPENMS_DLLAPI SqliteConnector
31 {
32 public:
33
35 enum class SqlOpenMode
36 {
37 READONLY,
38 READWRITE,
39 READWRITE_OR_CREATE
40 };
41
43 SqliteConnector() = delete;
44
47 explicit SqliteConnector(const String& filename, const SqlOpenMode mode = SqlOpenMode::READWRITE_OR_CREATE);
48
51
61 sqlite3* getDB()
62 {
63 return db_;
64 }
65
73 bool tableExists(const String& tablename)
74 {
75 return tableExists(db_, tablename);
76 }
77
80 Size countTableRows(const String& table_name);
81
90 bool columnExists(const String& tablename, const String& colname)
91 {
92 return columnExists(db_, tablename, colname);
93 }
94
104 void executeStatement(const String& statement)
105 {
106 executeStatement(db_, statement);
107 }
108
125 void executeBindStatement(const String& prepare_statement, const std::vector<String>& data)
126 {
127 executeBindStatement(db_, prepare_statement, data);
128 }
129
141 void prepareStatement(sqlite3_stmt** stmt, const String& prepare_statement)
142 {
143 prepareStatement(db_, stmt, prepare_statement);
144 }
145
154 static bool tableExists(sqlite3* db, const String& tablename);
155
165 static bool columnExists(sqlite3* db, const String& tablename, const String& colname);
166
177 static void executeStatement(sqlite3* db, const std::stringstream& statement);
178
189 static void executeStatement(sqlite3* db, const String& statement);
190
210 static void prepareStatement(sqlite3* db, sqlite3_stmt** stmt, const String& prepare_statement);
211
212
230 static void executeBindStatement(sqlite3* db, const String& prepare_statement, const std::vector<String>& data);
231
232 protected:
233
242 void openDatabase_(const String& filename, const SqlOpenMode mode);
243
244 protected:
245 sqlite3* db_ = nullptr;
246
247 };
248
249 namespace Internal
250 {
251 namespace SqliteHelper
252 {
256 template <typename T>
257 UInt64 clearSignBit(T /*value*/)
258 {
259 static_assert(std::is_same<T, std::false_type>::value, "Wrong input type to clearSignBit(). Please pass unsigned 64bit ints!");
260 return 0;
261 };
263 template <>
264 inline UInt64 clearSignBit(UInt64 value) {
265 return value & ~(1ULL << 63);
266 }
267
268
269 enum class SqlState
270 {
271 SQL_ROW,
272 SQL_DONE,
273 SQL_ERROR
274 };
275
289 SqlState nextRow(sqlite3_stmt* stmt, SqlState current = SqlState::SQL_ROW);
290
291
314 template <typename ValueType>
315 bool extractValue(ValueType* /* dst */, sqlite3_stmt* /* stmt */, int /* pos */)
316 {
317 throw Exception::IllegalArgument(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION,
318 "Not implemented");
319 }
320
321 template <> bool extractValue<double>(double* dst, sqlite3_stmt* stmt, int pos); //explicit specialization
322
323 template <> bool extractValue<int>(int* dst, sqlite3_stmt* stmt, int pos); //explicit specialization
324 template <> bool extractValue<Int64>(Int64* dst, sqlite3_stmt* stmt, int pos); //explicit specialization
325
326 template <> bool extractValue<String>(String* dst, sqlite3_stmt* stmt, int pos); //explicit specialization
327
328 template <> bool extractValue<std::string>(std::string* dst, sqlite3_stmt* stmt, int pos); //explicit specialization
329
331 bool extractValueIntStr(String* dst, sqlite3_stmt* stmt, int pos);
332
338 double extractDouble(sqlite3_stmt* stmt, int pos);
339 float extractFloat(sqlite3_stmt* stmt, int pos);
340 int extractInt(sqlite3_stmt* stmt, int pos);
341 Int64 extractInt64(sqlite3_stmt* stmt, int pos);
342 String extractString(sqlite3_stmt* stmt, int pos);
343 char extractChar(sqlite3_stmt* stmt, int pos);
344 bool extractBool(sqlite3_stmt* stmt, int pos);
// end of sqlThrowingGetters
346 }
347 }
348
349
350} // namespace OpenMS
A method or algorithm argument contains illegal values.
Definition Exception.h:630
File adapter for Sqlite files.
Definition SqliteConnector.h:31
bool tableExists(const String &tablename)
Checks whether the given table exists.
Definition SqliteConnector.h:73
~SqliteConnector()
Destructor.
Size countTableRows(const String &table_name)
static bool columnExists(sqlite3 *db, const String &tablename, const String &colname)
Checks whether the given table contains a certain column.
void executeBindStatement(const String &prepare_statement, const std::vector< String > &data)
Executes raw data SQL statements (insert statements)
Definition SqliteConnector.h:125
SqlOpenMode
how an sqlite db should be opened
Definition SqliteConnector.h:36
SqliteConnector()=delete
Default constructor.
static bool tableExists(sqlite3 *db, const String &tablename)
Checks whether the given table exists.
SqliteConnector(const String &filename, const SqlOpenMode mode=SqlOpenMode::READWRITE_OR_CREATE)
void openDatabase_(const String &filename, const SqlOpenMode mode)
Opens a new SQLite database.
static void executeBindStatement(sqlite3 *db, const String &prepare_statement, const std::vector< String > &data)
Executes raw data SQL statements (insert statements)
static void prepareStatement(sqlite3 *db, sqlite3_stmt **stmt, const String &prepare_statement)
Converts an SQL statement into a prepared statement.
void prepareStatement(sqlite3_stmt **stmt, const String &prepare_statement)
Prepares a SQL statement.
Definition SqliteConnector.h:141
bool columnExists(const String &tablename, const String &colname)
Checks whether the given table contains a certain column.
Definition SqliteConnector.h:90
void executeStatement(const String &statement)
Executes a given SQL statement (insert statement)
Definition SqliteConnector.h:104
sqlite3 * getDB()
Returns the raw pointer to the database.
Definition SqliteConnector.h:61
static void executeStatement(sqlite3 *db, const std::stringstream &statement)
Executes a given SQL statement (insert statement)
static void executeStatement(sqlite3 *db, const String &statement)
Executes a given SQL statement (insert statement)
A more convenient string class.
Definition String.h:34
int64_t Int64
Signed integer type (64bit)
Definition Types.h:40
uint64_t UInt64
Unsigned integer type (64bit)
Definition Types.h:47
size_t Size
Size type e.g. used as variable which can hold result of size()
Definition Types.h:97
bool extractBool(sqlite3_stmt *stmt, int pos)
char extractChar(sqlite3_stmt *stmt, int pos)
String extractString(sqlite3_stmt *stmt, int pos)
double extractDouble(sqlite3_stmt *stmt, int pos)
float extractFloat(sqlite3_stmt *stmt, int pos)
convenience function; note: in SQL there is no float, just double. So this might be narrowing.
int extractInt(sqlite3_stmt *stmt, int pos)
Int64 extractInt64(sqlite3_stmt *stmt, int pos)
bool extractValueIntStr(String *dst, sqlite3_stmt *stmt, int pos)
Special case where an integer should be stored in a String field.
SqlState nextRow(sqlite3_stmt *stmt, SqlState current=SqlState::SQL_ROW)
retrieves the next row from a prepared statement
SqlState
Definition SqliteConnector.h:270
@ SQL_ERROR
includes SQLITE_BUSY, SQLITE_ERROR, SQLITE_MISUSE
bool extractValue< int >(int *dst, sqlite3_stmt *stmt, int pos)
bool extractValue< std::string >(std::string *dst, sqlite3_stmt *stmt, int pos)
bool extractValue< Int64 >(Int64 *dst, sqlite3_stmt *stmt, int pos)
UInt64 clearSignBit(T)
Definition SqliteConnector.h:257
bool extractValue< double >(double *dst, sqlite3_stmt *stmt, int pos)
bool extractValue< String >(String *dst, sqlite3_stmt *stmt, int pos)
bool extractValue(ValueType *, sqlite3_stmt *, int)
Extracts a specific value from an SQL column.
Definition SqliteConnector.h:315
Main OpenMS namespace.
Definition openswathalgo/include/OpenMS/OPENSWATHALGO/DATAACCESS/ISpectrumAccess.h:19