summaryrefslogtreecommitdiffstats
path: root/library/cpp/sqlite3/sqlite.h
diff options
context:
space:
mode:
authorvitalyisaev <[email protected]>2023-11-30 13:26:22 +0300
committervitalyisaev <[email protected]>2023-11-30 15:44:45 +0300
commit0a98fece5a9b54f16afeb3a94b3eb3105e9c3962 (patch)
tree291d72dbd7e9865399f668c84d11ed86fb190bbf /library/cpp/sqlite3/sqlite.h
parentcb2c8d75065e5b3c47094067cb4aa407d4813298 (diff)
YQ Connector:Use docker-compose in integrational tests
Diffstat (limited to 'library/cpp/sqlite3/sqlite.h')
-rw-r--r--library/cpp/sqlite3/sqlite.h136
1 files changed, 136 insertions, 0 deletions
diff --git a/library/cpp/sqlite3/sqlite.h b/library/cpp/sqlite3/sqlite.h
new file mode 100644
index 00000000000..8b35e2606a1
--- /dev/null
+++ b/library/cpp/sqlite3/sqlite.h
@@ -0,0 +1,136 @@
+#pragma once
+
+#include <util/generic/yexception.h>
+#include <util/generic/ptr.h>
+
+#include <contrib/libs/sqlite3/sqlite3.h>
+
+namespace NSQLite {
+ class TSQLiteError: public yexception {
+ public:
+ TSQLiteError(sqlite3* hndl);
+ TSQLiteError(int rc);
+
+ int GetErrorCode() const {
+ return ErrorCode;
+ }
+
+ private:
+ int ErrorCode;
+ };
+
+ template <class T, int (*Func)(T*)>
+ struct TCFree {
+ static void Destroy(T* t) {
+ Func(t);
+ }
+ };
+
+ class TSQLiteDB {
+ public:
+ TSQLiteDB(const TString& path, int flags);
+ TSQLiteDB(const TString& path);
+
+ sqlite3* Handle() const noexcept;
+ size_t RowsAffected() const noexcept;
+
+ private:
+ THolder<sqlite3, TCFree<sqlite3, sqlite3_close>> H_;
+ };
+
+ class ISQLiteColumnVisitor {
+ public:
+ virtual ~ISQLiteColumnVisitor() = default;
+
+ virtual void OnColumnInt64(i64 value) = 0;
+ virtual void OnColumnDouble(double value) = 0;
+ virtual void OnColumnText(TStringBuf value) = 0;
+ virtual void OnColumnBlob(TStringBuf value) = 0;
+ virtual void OnColumnNull() = 0;
+ };
+
+ class TSQLiteStatement {
+ public:
+ TSQLiteStatement(TSQLiteDB& db, const TString& s);
+
+ void Execute();
+ TSQLiteStatement& Bind(size_t idx, i64 val);
+ TSQLiteStatement& Bind(size_t idx, int val);
+ TSQLiteStatement& Bind(size_t idx);
+ TSQLiteStatement& Bind(size_t idx, double val);
+ TSQLiteStatement& Bind(size_t idx, TStringBuf str);
+ TSQLiteStatement& BindBlob(size_t idx, TStringBuf blob);
+ template <typename Value>
+ TSQLiteStatement& Bind(TStringBuf name, Value val) {
+ size_t idx = BoundNamePosition(name);
+ Y_ASSERT(idx > 0);
+ return Bind(idx, val);
+ }
+ TSQLiteStatement& BindBlob(TStringBuf name, TStringBuf blob) {
+ size_t idx = BoundNamePosition(name);
+ Y_ASSERT(idx > 0);
+ return BindBlob(idx, blob);
+ }
+ TSQLiteStatement& Bind(TStringBuf name) {
+ size_t idx = BoundNamePosition(name);
+ Y_ASSERT(idx > 0);
+ return Bind(idx);
+ }
+ size_t BoundNamePosition(TStringBuf name) const noexcept;
+ size_t BoundParameterCount() const noexcept;
+ const char* BoundParameterName(size_t idx) const noexcept;
+
+ sqlite3_stmt* Handle() const noexcept;
+ bool Step();
+ i64 ColumnInt64(size_t idx);
+ double ColumnDouble(size_t idx);
+ TStringBuf ColumnText(size_t idx);
+ TStringBuf ColumnBlob(size_t idx);
+ void ColumnAccept(size_t idx, ISQLiteColumnVisitor& visitor);
+ size_t ColumnCount() const noexcept;
+ TStringBuf ColumnName(size_t idx) const noexcept;
+ void Reset();
+ // Ignore last error on this statement
+ void ResetHard();
+ void ClearBindings() noexcept;
+
+ private:
+ typedef void (*TFreeFunc)(void*);
+ void BindText(size_t col, const char* text, size_t len, TFreeFunc func);
+
+ private:
+ TString S_;
+ THolder<sqlite3_stmt, TCFree<sqlite3_stmt, sqlite3_finalize>> H_;
+ };
+
+ /**
+ * Forces user to commit transaction explicitly, to not get exception in destructor (with all consequences of it).
+ */
+ class TSQLiteTransaction: private TNonCopyable {
+ private:
+ TSQLiteDB* Db;
+
+ public:
+ TSQLiteTransaction(TSQLiteDB& db);
+ ~TSQLiteTransaction();
+
+ void Commit();
+ void Rollback();
+
+ private:
+ void Execute(const TString& query);
+ };
+
+ class TSimpleDB: public TSQLiteDB {
+ public:
+ TSimpleDB(const TString& path);
+
+ void Execute(const TString& statement);
+ void Acquire();
+ void Release();
+
+ private:
+ TSQLiteStatement Start_;
+ TSQLiteStatement End_;
+ };
+}