Files
better-sqlite3/src/util/query-macros.cpp
T
Joshua WiseandGitHub 8f20ead317 Refactored codebase to use node-addon-api (#1498)
* refactored codebase to use node-addon-api and publish with prebuilt binaries

* upgraded to sqlite 3.53.3

* fixed typo

* fixed test for windows

* mitigated performace regression from NAPI refactor

* mitigated performace regression from NAPI refactor

* mitigated performace regression from NAPI refactor

* mitigated performace regression from NAPI refactor

* fixed performance regression to surpass node:sqlite

* improved array optimization for large arrays

* further improved performance

* removed dead code
2026-07-20 23:15:34 -05:00

72 lines
4.1 KiB
C++

#define STATEMENT_BIND(handle) \
Binder binder(handle); \
if (!binder.Bind(info, info.Length(), stmt)) { \
sqlite3_clear_bindings(handle); \
return info.Env().Undefined(); \
} ((void)0)
#define STATEMENT_THROW_LOGIC() \
db->ThrowDatabaseError(env); \
if (!bound) { sqlite3_clear_bindings(handle); } \
return env.Undefined()
#define STATEMENT_RETURN_LOGIC(return_value) \
Napi::Value _return_value = (return_value); \
if (!bound) { sqlite3_clear_bindings(handle); } \
return _return_value
#define STATEMENT_START_LOGIC(RETURNS_DATA_CHECK, MUTATE_CHECK) \
Statement* stmt = ::Unwrap<Statement>(info.This()); \
RETURNS_DATA_CHECK(); \
sqlite3_stmt* handle = stmt->handle; \
Database* db = stmt->db; \
REQUIRE_DATABASE_OPEN(db->GetState()); \
REQUIRE_DATABASE_NOT_BUSY(db->GetState()); \
MUTATE_CHECK(); \
const bool bound = stmt->bound; \
if (!bound) { \
STATEMENT_BIND(handle); \
} else if (info.Length() > 0) { \
return ThrowTypeError(info.Env(), "This statement already has bound parameters"); \
} ((void)0)
#define STATEMENT_THROW() db->GetState()->busy = false; STATEMENT_THROW_LOGIC()
#define STATEMENT_RETURN(x) db->GetState()->busy = false; STATEMENT_RETURN_LOGIC(x)
#define STATEMENT_START(x, y) \
STATEMENT_START_LOGIC(x, y); \
db->GetState()->busy = true; \
UseIsolate; \
if (db->Log(env, handle)) { \
STATEMENT_THROW(); \
} ((void)0)
#define DOES_NOT_MUTATE() REQUIRE_STATEMENT_NOT_LOCKED(stmt)
#define DOES_MUTATE() \
REQUIRE_STATEMENT_NOT_LOCKED(stmt); \
REQUIRE_DATABASE_NO_ITERATORS_UNLESS_UNSAFE(db->GetState())
#define DOES_ADD_ITERATOR() \
DOES_NOT_MUTATE(); \
if (db->GetState()->iterators == USHRT_MAX) \
return ThrowRangeError(info.Env(), "Too many active database iterators")
#define REQUIRE_STATEMENT_RETURNS_DATA() \
if (!stmt->returns_data) \
return ThrowTypeError(info.Env(), "This statement does not return data. Use run() instead")
#define ALLOW_ANY_STATEMENT() \
((void)0)
#define _FUNCTION_START(type) \
type* self = static_cast<type*>(sqlite3_user_data(invocation)); \
Napi::Env env = self->env; \
Napi::HandleScope scope(env)
#define FUNCTION_START() \
_FUNCTION_START(CustomFunction)
#define AGGREGATE_START() \
_FUNCTION_START(CustomAggregate); \
Accumulator* acc = self->GetAccumulator(invocation); \
if (acc->value.IsEmpty()) return