Skip to content

Commit 8c35ad1

Browse files
tniessenruyadorno
authored andcommitted
sqlite: refactor open options
Move options that are only relevant for opening the database into a self-contained class. PR-URL: #55442 Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
1 parent 2194eb4 commit 8c35ad1

File tree

2 files changed

+50
-35
lines changed

2 files changed

+50
-35
lines changed

src/node_sqlite.cc

+24-28
Original file line numberDiff line numberDiff line change
@@ -94,17 +94,11 @@ inline void THROW_ERR_SQLITE_ERROR(Isolate* isolate, const char* message) {
9494

9595
DatabaseSync::DatabaseSync(Environment* env,
9696
Local<Object> object,
97-
Local<String> location,
98-
bool open,
99-
bool enable_foreign_keys_on_open,
100-
bool enable_dqs_on_open)
101-
: BaseObject(env, object) {
97+
DatabaseOpenConfiguration&& open_config,
98+
bool open)
99+
: BaseObject(env, object), open_config_(std::move(open_config)) {
102100
MakeWeak();
103-
node::Utf8Value utf8_location(env->isolate(), location);
104-
location_ = utf8_location.ToString();
105101
connection_ = nullptr;
106-
enable_foreign_keys_on_open_ = enable_foreign_keys_on_open;
107-
enable_dqs_on_open_ = enable_dqs_on_open;
108102

109103
if (open) {
110104
Open();
@@ -120,7 +114,9 @@ DatabaseSync::~DatabaseSync() {
120114
}
121115

122116
void DatabaseSync::MemoryInfo(MemoryTracker* tracker) const {
123-
tracker->TrackField("location", location_);
117+
// TODO(tniessen): more accurately track the size of all fields
118+
tracker->TrackFieldWithSize(
119+
"open_config", sizeof(open_config_), "DatabaseOpenConfiguration");
124120
}
125121

126122
bool DatabaseSync::Open() {
@@ -131,27 +127,29 @@ bool DatabaseSync::Open() {
131127

132128
// TODO(cjihrig): Support additional flags.
133129
int flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE;
134-
int r = sqlite3_open_v2(location_.c_str(), &connection_, flags, nullptr);
130+
int r = sqlite3_open_v2(
131+
open_config_.location().c_str(), &connection_, flags, nullptr);
135132
CHECK_ERROR_OR_THROW(env()->isolate(), connection_, r, SQLITE_OK, false);
136133

137134
r = sqlite3_db_config(connection_,
138135
SQLITE_DBCONFIG_DQS_DML,
139-
static_cast<int>(enable_dqs_on_open_),
136+
static_cast<int>(open_config_.get_enable_dqs()),
140137
nullptr);
141138
CHECK_ERROR_OR_THROW(env()->isolate(), connection_, r, SQLITE_OK, false);
142139
r = sqlite3_db_config(connection_,
143140
SQLITE_DBCONFIG_DQS_DDL,
144-
static_cast<int>(enable_dqs_on_open_),
141+
static_cast<int>(open_config_.get_enable_dqs()),
145142
nullptr);
146143
CHECK_ERROR_OR_THROW(env()->isolate(), connection_, r, SQLITE_OK, false);
147144

148145
int foreign_keys_enabled;
149-
r = sqlite3_db_config(connection_,
150-
SQLITE_DBCONFIG_ENABLE_FKEY,
151-
static_cast<int>(enable_foreign_keys_on_open_),
152-
&foreign_keys_enabled);
146+
r = sqlite3_db_config(
147+
connection_,
148+
SQLITE_DBCONFIG_ENABLE_FKEY,
149+
static_cast<int>(open_config_.get_enable_foreign_keys()),
150+
&foreign_keys_enabled);
153151
CHECK_ERROR_OR_THROW(env()->isolate(), connection_, r, SQLITE_OK, false);
154-
CHECK_EQ(foreign_keys_enabled, enable_foreign_keys_on_open_);
152+
CHECK_EQ(foreign_keys_enabled, open_config_.get_enable_foreign_keys());
155153

156154
return true;
157155
}
@@ -193,9 +191,11 @@ void DatabaseSync::New(const FunctionCallbackInfo<Value>& args) {
193191
return;
194192
}
195193

194+
std::string location =
195+
node::Utf8Value(env->isolate(), args[0].As<String>()).ToString();
196+
DatabaseOpenConfiguration open_config(std::move(location));
197+
196198
bool open = true;
197-
bool enable_foreign_keys = true;
198-
bool enable_dqs = false;
199199

200200
if (args.Length() > 1) {
201201
if (!args[1]->IsObject()) {
@@ -234,7 +234,8 @@ void DatabaseSync::New(const FunctionCallbackInfo<Value>& args) {
234234
"boolean.");
235235
return;
236236
}
237-
enable_foreign_keys = enable_foreign_keys_v.As<Boolean>()->Value();
237+
open_config.set_enable_foreign_keys(
238+
enable_foreign_keys_v.As<Boolean>()->Value());
238239
}
239240

240241
Local<String> enable_dqs_string = FIXED_ONE_BYTE_STRING(
@@ -252,16 +253,11 @@ void DatabaseSync::New(const FunctionCallbackInfo<Value>& args) {
252253
"a boolean.");
253254
return;
254255
}
255-
enable_dqs = enable_dqs_v.As<Boolean>()->Value();
256+
open_config.set_enable_dqs(enable_dqs_v.As<Boolean>()->Value());
256257
}
257258
}
258259

259-
new DatabaseSync(env,
260-
args.This(),
261-
args[0].As<String>(),
262-
open,
263-
enable_foreign_keys,
264-
enable_dqs);
260+
new DatabaseSync(env, args.This(), std::move(open_config), open);
265261
}
266262

267263
void DatabaseSync::Open(const FunctionCallbackInfo<Value>& args) {

src/node_sqlite.h

+26-7
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,37 @@
1414
namespace node {
1515
namespace sqlite {
1616

17+
class DatabaseOpenConfiguration {
18+
public:
19+
explicit DatabaseOpenConfiguration(std::string&& location)
20+
: location_(std::move(location)) {}
21+
22+
inline const std::string& location() const { return location_; }
23+
24+
inline bool get_enable_foreign_keys() const { return enable_foreign_keys_; }
25+
26+
inline void set_enable_foreign_keys(bool flag) {
27+
enable_foreign_keys_ = flag;
28+
}
29+
30+
inline bool get_enable_dqs() const { return enable_dqs_; }
31+
32+
inline void set_enable_dqs(bool flag) { enable_dqs_ = flag; }
33+
34+
private:
35+
std::string location_;
36+
bool enable_foreign_keys_ = true;
37+
bool enable_dqs_ = false;
38+
};
39+
1740
class StatementSync;
1841

1942
class DatabaseSync : public BaseObject {
2043
public:
2144
DatabaseSync(Environment* env,
2245
v8::Local<v8::Object> object,
23-
v8::Local<v8::String> location,
24-
bool open,
25-
bool enable_foreign_keys_on_open,
26-
bool enable_dqs_on_open);
46+
DatabaseOpenConfiguration&& open_config,
47+
bool open);
2748
void MemoryInfo(MemoryTracker* tracker) const override;
2849
static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
2950
static void Open(const v8::FunctionCallbackInfo<v8::Value>& args);
@@ -42,11 +63,9 @@ class DatabaseSync : public BaseObject {
4263
bool Open();
4364

4465
~DatabaseSync() override;
45-
std::string location_;
66+
DatabaseOpenConfiguration open_config_;
4667
sqlite3* connection_;
4768
std::unordered_set<StatementSync*> statements_;
48-
bool enable_foreign_keys_on_open_;
49-
bool enable_dqs_on_open_;
5069
};
5170

5271
class StatementSync : public BaseObject {

0 commit comments

Comments
 (0)