diff options
| author | vitalyisaev <[email protected]> | 2023-11-30 13:26:22 +0300 |
|---|---|---|
| committer | vitalyisaev <[email protected]> | 2023-11-30 15:44:45 +0300 |
| commit | 0a98fece5a9b54f16afeb3a94b3eb3105e9c3962 (patch) | |
| tree | 291d72dbd7e9865399f668c84d11ed86fb190bbf /library/cpp/sqlite3/sqlite.h | |
| parent | cb2c8d75065e5b3c47094067cb4aa407d4813298 (diff) | |
YQ Connector:Use docker-compose in integrational tests
Diffstat (limited to 'library/cpp/sqlite3/sqlite.h')
| -rw-r--r-- | library/cpp/sqlite3/sqlite.h | 136 |
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_; + }; +} |
