mirror of
https://github.com/nodejs/node.git
synced 2026-11-09 15:11:11 -05:00
This commit adds statement tracking to the DatabaseSync class. When a database is closed manually or via garbage collection, it will force all associated prepared statements to be finalized. This should mitigate "zombie" connections which can introduce test flakiness in the CI on Windows. PR-URL: https://github.com/nodejs/node/pull/54014 Fixes: https://github.com/nodejs/node/issues/54006 Reviewed-By: Moshe Atlow <moshe@atlow.co.il> Reviewed-By: Tobias Nießen <tniessen@tnie.de> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: Richard Lau <rlau@redhat.com> Reviewed-By: Michaël Zasso <targos@protonmail.com>
92 lines
3.0 KiB
C++
92 lines
3.0 KiB
C++
#ifndef SRC_NODE_SQLITE_H_
|
|
#define SRC_NODE_SQLITE_H_
|
|
|
|
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
|
|
#include "base_object.h"
|
|
#include "node_mem.h"
|
|
#include "sqlite3.h"
|
|
#include "util.h"
|
|
|
|
#include <map>
|
|
#include <unordered_set>
|
|
|
|
namespace node {
|
|
namespace sqlite {
|
|
|
|
class StatementSync;
|
|
|
|
class DatabaseSync : public BaseObject {
|
|
public:
|
|
DatabaseSync(Environment* env,
|
|
v8::Local<v8::Object> object,
|
|
v8::Local<v8::String> location,
|
|
bool open);
|
|
void MemoryInfo(MemoryTracker* tracker) const override;
|
|
static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
static void Open(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
static void Close(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
static void Prepare(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
static void Exec(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
void FinalizeStatements();
|
|
void UntrackStatement(StatementSync* statement);
|
|
bool IsOpen();
|
|
sqlite3* Connection();
|
|
|
|
SET_MEMORY_INFO_NAME(DatabaseSync)
|
|
SET_SELF_SIZE(DatabaseSync)
|
|
|
|
private:
|
|
bool Open();
|
|
|
|
~DatabaseSync() override;
|
|
std::string location_;
|
|
sqlite3* connection_;
|
|
std::unordered_set<StatementSync*> statements_;
|
|
};
|
|
|
|
class StatementSync : public BaseObject {
|
|
public:
|
|
StatementSync(Environment* env,
|
|
v8::Local<v8::Object> object,
|
|
DatabaseSync* db,
|
|
sqlite3_stmt* stmt);
|
|
void MemoryInfo(MemoryTracker* tracker) const override;
|
|
static v8::Local<v8::FunctionTemplate> GetConstructorTemplate(
|
|
Environment* env);
|
|
static BaseObjectPtr<StatementSync> Create(Environment* env,
|
|
DatabaseSync* db,
|
|
sqlite3_stmt* stmt);
|
|
static void All(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
static void Get(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
static void Run(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
static void SourceSQL(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
static void ExpandedSQL(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
static void SetAllowBareNamedParameters(
|
|
const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
static void SetReadBigInts(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
void Finalize();
|
|
bool IsFinalized();
|
|
|
|
SET_MEMORY_INFO_NAME(StatementSync)
|
|
SET_SELF_SIZE(StatementSync)
|
|
|
|
private:
|
|
~StatementSync() override;
|
|
DatabaseSync* db_;
|
|
sqlite3_stmt* statement_;
|
|
bool use_big_ints_;
|
|
bool allow_bare_named_params_;
|
|
std::optional<std::map<std::string, std::string>> bare_named_params_;
|
|
bool BindParams(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
bool BindValue(const v8::Local<v8::Value>& value, const int index);
|
|
v8::Local<v8::Value> ColumnToValue(const int column);
|
|
v8::Local<v8::Value> ColumnNameToValue(const int column);
|
|
};
|
|
|
|
} // namespace sqlite
|
|
} // namespace node
|
|
|
|
#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
#endif // SRC_NODE_SQLITE_H_
|