From 7c2f058c40884b7e378b24b629156b44752cd2e0 Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Sun, 15 Sep 2024 09:14:00 +0800 Subject: [PATCH] Add BindNull to SQL api Comes in handy in my downstream project --- src/engine/server/databases/connection.h | 1 + src/engine/server/databases/mysql.cpp | 17 +++++++++++++++++ src/engine/server/databases/sqlite.cpp | 8 ++++++++ 3 files changed, 26 insertions(+) diff --git a/src/engine/server/databases/connection.h b/src/engine/server/databases/connection.h index 03ac5be42..c71147474 100644 --- a/src/engine/server/databases/connection.h +++ b/src/engine/server/databases/connection.h @@ -61,6 +61,7 @@ public: virtual void BindInt(int Idx, int Value) = 0; virtual void BindInt64(int Idx, int64_t Value) = 0; virtual void BindFloat(int Idx, float Value) = 0; + virtual void BindNull(int Idx) = 0; // Print expanded sql statement virtual void Print() = 0; diff --git a/src/engine/server/databases/mysql.cpp b/src/engine/server/databases/mysql.cpp index 202fb9687..2479733f0 100644 --- a/src/engine/server/databases/mysql.cpp +++ b/src/engine/server/databases/mysql.cpp @@ -89,6 +89,7 @@ public: void BindInt(int Idx, int Value) override; void BindInt64(int Idx, int64_t Value) override; void BindFloat(int Idx, float Value) override; + void BindNull(int Idx) override; void Print() override {} bool Step(bool *pEnd, char *pError, int ErrorSize) override; @@ -421,6 +422,22 @@ void CMysqlConnection::BindFloat(int Idx, float Value) pParam->error = nullptr; } +void CMysqlConnection::BindNull(int Idx) +{ + m_NewQuery = true; + Idx -= 1; + dbg_assert(0 <= Idx && Idx < (int)m_vStmtParameters.size(), "index out of bounds"); + + MYSQL_BIND *pParam = &m_vStmtParameters[Idx]; + pParam->buffer_type = MYSQL_TYPE_NULL; + pParam->buffer = nullptr; + pParam->buffer_length = 0; + pParam->length = nullptr; + pParam->is_null = nullptr; + pParam->is_unsigned = false; + pParam->error = nullptr; +} + bool CMysqlConnection::Step(bool *pEnd, char *pError, int ErrorSize) { if(m_NewQuery) diff --git a/src/engine/server/databases/sqlite.cpp b/src/engine/server/databases/sqlite.cpp index df2925f6e..bf483dc76 100644 --- a/src/engine/server/databases/sqlite.cpp +++ b/src/engine/server/databases/sqlite.cpp @@ -37,6 +37,7 @@ public: void BindInt(int Idx, int Value) override; void BindInt64(int Idx, int64_t Value) override; void BindFloat(int Idx, float Value) override; + void BindNull(int Idx) override; void Print() override; bool Step(bool *pEnd, char *pError, int ErrorSize) override; @@ -241,6 +242,13 @@ void CSqliteConnection::BindFloat(int Idx, float Value) m_Done = false; } +void CSqliteConnection::BindNull(int Idx) +{ + int Result = sqlite3_bind_null(m_pStmt, Idx); + AssertNoError(Result); + m_Done = false; +} + // Keep support for SQLite < 3.14 on older Linux distributions. MinGW does not // support __attribute__((weak)): https://sourceware.org/bugzilla/show_bug.cgi?id=9687 #if defined(__GNUC__) && !defined(__MINGW32__)