Skip to content

Commit b5540df

Browse files
tniessenlouwers
authored andcommitted
sqlite: refactor open options
Move options that are only relevant for opening the database into a self-contained class. PR-URL: nodejs#55442 Reviewed-By: Benjamin Gruenbaum <[email protected]>
1 parent 865a057 commit b5540df

File tree

2 files changed

+50
-36
lines changed

2 files changed

+50
-36
lines changed

src/node_sqlite.cc

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -96,17 +96,11 @@ inline void THROW_ERR_SQLITE_ERROR(Isolate* isolate, const char* message) {
9696

9797
DatabaseSync::DatabaseSync(Environment* env,
9898
Local<Object> object,
99-
Local<String> location,
100-
bool open,
101-
bool enable_foreign_keys_on_open,
102-
bool enable_dqs_on_open)
103-
: BaseObject(env, object) {
99+
DatabaseOpenConfiguration&& open_config,
100+
bool open)
101+
: BaseObject(env, object), open_config_(std::move(open_config)) {
104102
MakeWeak();
105-
node::Utf8Value utf8_location(env->isolate(), location);
106-
location_ = utf8_location.ToString();
107103
connection_ = nullptr;
108-
enable_foreign_keys_on_open_ = enable_foreign_keys_on_open;
109-
enable_dqs_on_open_ = enable_dqs_on_open;
110104

111105
if (open) {
112106
Open();
@@ -132,7 +126,9 @@ DatabaseSync::~DatabaseSync() {
132126
}
133127

134128
void DatabaseSync::MemoryInfo(MemoryTracker* tracker) const {
135-
tracker->TrackField("location", location_);
129+
// TODO(tniessen): more accurately track the size of all fields
130+
tracker->TrackFieldWithSize(
131+
"open_config", sizeof(open_config_), "DatabaseOpenConfiguration");
136132
}
137133

138134
bool DatabaseSync::Open() {
@@ -143,27 +139,29 @@ bool DatabaseSync::Open() {
143139

144140
// TODO(cjihrig): Support additional flags.
145141
int flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE;
146-
int r = sqlite3_open_v2(location_.c_str(), &connection_, flags, nullptr);
142+
int r = sqlite3_open_v2(
143+
open_config_.location().c_str(), &connection_, flags, nullptr);
147144
CHECK_ERROR_OR_THROW(env()->isolate(), connection_, r, SQLITE_OK, false);
148145

149146
r = sqlite3_db_config(connection_,
150147
SQLITE_DBCONFIG_DQS_DML,
151-
static_cast<int>(enable_dqs_on_open_),
148+
static_cast<int>(open_config_.get_enable_dqs()),
152149
nullptr);
153150
CHECK_ERROR_OR_THROW(env()->isolate(), connection_, r, SQLITE_OK, false);
154151
r = sqlite3_db_config(connection_,
155152
SQLITE_DBCONFIG_DQS_DDL,
156-
static_cast<int>(enable_dqs_on_open_),
153+
static_cast<int>(open_config_.get_enable_dqs()),
157154
nullptr);
158155
CHECK_ERROR_OR_THROW(env()->isolate(), connection_, r, SQLITE_OK, false);
159156

160157
int foreign_keys_enabled;
161-
r = sqlite3_db_config(connection_,
162-
SQLITE_DBCONFIG_ENABLE_FKEY,
163-
static_cast<int>(enable_foreign_keys_on_open_),
164-
&foreign_keys_enabled);
158+
r = sqlite3_db_config(
159+
connection_,
160+
SQLITE_DBCONFIG_ENABLE_FKEY,
161+
static_cast<int>(open_config_.get_enable_foreign_keys()),
162+
&foreign_keys_enabled);
165163
CHECK_ERROR_OR_THROW(env()->isolate(), connection_, r, SQLITE_OK, false);
166-
CHECK_EQ(foreign_keys_enabled, enable_foreign_keys_on_open_);
164+
CHECK_EQ(foreign_keys_enabled, open_config_.get_enable_foreign_keys());
167165

168166
return true;
169167
}
@@ -205,9 +203,11 @@ void DatabaseSync::New(const FunctionCallbackInfo<Value>& args) {
205203
return;
206204
}
207205

206+
std::string location =
207+
node::Utf8Value(env->isolate(), args[0].As<String>()).ToString();
208+
DatabaseOpenConfiguration open_config(std::move(location));
209+
208210
bool open = true;
209-
bool enable_foreign_keys = true;
210-
bool enable_dqs = false;
211211

212212
if (args.Length() > 1) {
213213
if (!args[1]->IsObject()) {
@@ -246,7 +246,8 @@ void DatabaseSync::New(const FunctionCallbackInfo<Value>& args) {
246246
"boolean.");
247247
return;
248248
}
249-
enable_foreign_keys = enable_foreign_keys_v.As<Boolean>()->Value();
249+
open_config.set_enable_foreign_keys(
250+
enable_foreign_keys_v.As<Boolean>()->Value());
250251
}
251252

252253
Local<String> enable_dqs_string = FIXED_ONE_BYTE_STRING(
@@ -264,16 +265,11 @@ void DatabaseSync::New(const FunctionCallbackInfo<Value>& args) {
264265
"a boolean.");
265266
return;
266267
}
267-
enable_dqs = enable_dqs_v.As<Boolean>()->Value();
268+
open_config.set_enable_dqs(enable_dqs_v.As<Boolean>()->Value());
268269
}
269270
}
270271

271-
new DatabaseSync(env,
272-
args.This(),
273-
args[0].As<String>(),
274-
open,
275-
enable_foreign_keys,
276-
enable_dqs);
272+
new DatabaseSync(env, args.This(), std::move(open_config), open);
277273
}
278274

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

src/node_sqlite.h

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,37 @@
1616
namespace node {
1717
namespace sqlite {
1818

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

2144
class DatabaseSync : public BaseObject {
2245
public:
2346
DatabaseSync(Environment* env,
2447
v8::Local<v8::Object> object,
25-
v8::Local<v8::String> location,
26-
bool open,
27-
bool enable_foreign_keys_on_open,
28-
bool enable_dqs_on_open);
48+
DatabaseOpenConfiguration&& open_config,
49+
bool open);
2950
void MemoryInfo(MemoryTracker* tracker) const override;
3051
static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
3152
static void Open(const v8::FunctionCallbackInfo<v8::Value>& args);
@@ -47,15 +68,12 @@ class DatabaseSync : public BaseObject {
4768
void DeleteSessions();
4869

4970
~DatabaseSync() override;
50-
std::string location_;
71+
DatabaseOpenConfiguration open_config_;
5172
sqlite3* connection_;
5273

5374
std::set<sqlite3_session*> sessions_;
5475
std::unordered_set<StatementSync*> statements_;
55-
5676
friend class Session;
57-
bool enable_foreign_keys_on_open_;
58-
bool enable_dqs_on_open_;
5977
};
6078

6179
class StatementSync : public BaseObject {

0 commit comments

Comments
 (0)