Skip to content

Commit 55461be

Browse files
anonrigtargos
authored andcommitted
src: refactor webstorage implementation
PR-URL: #53876 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
1 parent dcca9ba commit 55461be

File tree

1 file changed

+37
-32
lines changed

1 file changed

+37
-32
lines changed

src/node_webstorage.cc

+37-32
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ using v8::Maybe;
2929
using v8::MaybeLocal;
3030
using v8::Name;
3131
using v8::NamedPropertyHandlerConfiguration;
32-
using v8::Null;
3332
using v8::Object;
3433
using v8::PropertyAttribute;
3534
using v8::PropertyCallbackInfo;
@@ -40,7 +39,7 @@ using v8::Uint32;
4039
using v8::Value;
4140

4241
#define THROW_SQLITE_ERROR(env, r) \
43-
node::THROW_ERR_INVALID_STATE((env), sqlite3_errstr((r)))
42+
THROW_ERR_INVALID_STATE((env), sqlite3_errstr((r)))
4443

4544
#define CHECK_ERROR_OR_THROW(env, expr, expected, ret) \
4645
do { \
@@ -80,7 +79,7 @@ static void ThrowQuotaExceededException(Local<Context> context) {
8079
Storage::Storage(Environment* env, Local<Object> object, Local<String> location)
8180
: BaseObject(env, object) {
8281
MakeWeak();
83-
node::Utf8Value utf8_location(env->isolate(), location);
82+
Utf8Value utf8_location(env->isolate(), location);
8483
symbols_.Reset(env->isolate(), Map::New(env->isolate()));
8584
db_ = nullptr;
8685
location_ = utf8_location.ToString();
@@ -97,9 +96,9 @@ void Storage::MemoryInfo(MemoryTracker* tracker) const {
9796

9897
bool Storage::Open() {
9998
static const int kCurrentSchemaVersion = 1;
100-
static const char get_schema_version_sql[] =
99+
static constexpr std::string_view get_schema_version_sql =
101100
"SELECT schema_version FROM nodejs_webstorage_state";
102-
static const char init_sql_v0[] =
101+
static constexpr std::string_view init_sql_v0 =
103102
"PRAGMA encoding = 'UTF-16le';"
104103
"PRAGMA busy_timeout = 3000;"
105104
"PRAGMA journal_mode = WAL;"
@@ -165,13 +164,14 @@ bool Storage::Open() {
165164

166165
int r = sqlite3_open(location_.c_str(), &db);
167166
CHECK_ERROR_OR_THROW(env(), r, SQLITE_OK, false);
168-
r = sqlite3_exec(db, init_sql_v0, 0, 0, nullptr);
167+
r = sqlite3_exec(db, init_sql_v0.data(), 0, 0, nullptr);
169168
CHECK_ERROR_OR_THROW(env(), r, SQLITE_OK, false);
170169

171170
// Get the current schema version, used to determine schema migrations.
172171
sqlite3_stmt* s = nullptr;
173-
r = sqlite3_prepare_v2(db, get_schema_version_sql, -1, &s, 0);
174-
r = sqlite3_exec(db, init_sql_v0, 0, 0, nullptr);
172+
r = sqlite3_prepare_v2(
173+
db, get_schema_version_sql.data(), get_schema_version_sql.size(), &s, 0);
174+
r = sqlite3_exec(db, init_sql_v0.data(), 0, 0, nullptr);
175175
CHECK_ERROR_OR_THROW(env(), r, SQLITE_OK, false);
176176
auto stmt = stmt_unique_ptr(s);
177177
CHECK_ERROR_OR_THROW(env(), sqlite3_step(stmt.get()), SQLITE_ROW, false);
@@ -180,7 +180,7 @@ bool Storage::Open() {
180180
stmt = nullptr; // Force finalization.
181181

182182
if (schema_version > kCurrentSchemaVersion) {
183-
node::THROW_ERR_INVALID_STATE(
183+
THROW_ERR_INVALID_STATE(
184184
env(), "localStorage was created with a newer version of Node.js");
185185
return false;
186186
}
@@ -217,10 +217,13 @@ void Storage::Clear() {
217217
return;
218218
}
219219

220-
static const char sql[] = "DELETE FROM nodejs_webstorage";
220+
static constexpr std::string_view sql = "DELETE FROM nodejs_webstorage";
221221
sqlite3_stmt* s = nullptr;
222222
CHECK_ERROR_OR_THROW(
223-
env(), sqlite3_prepare_v2(db_.get(), sql, -1, &s, 0), SQLITE_OK, void());
223+
env(),
224+
sqlite3_prepare_v2(db_.get(), sql.data(), sql.size(), &s, 0),
225+
SQLITE_OK,
226+
void());
224227
auto stmt = stmt_unique_ptr(s);
225228
CHECK_ERROR_OR_THROW(env(), sqlite3_step(stmt.get()), SQLITE_DONE, void());
226229
}
@@ -230,9 +233,9 @@ Local<Array> Storage::Enumerate() {
230233
return Local<Array>();
231234
}
232235

233-
static const char sql[] = "SELECT key FROM nodejs_webstorage";
236+
static constexpr std::string_view sql = "SELECT key FROM nodejs_webstorage";
234237
sqlite3_stmt* s = nullptr;
235-
int r = sqlite3_prepare_v2(db_.get(), sql, -1, &s, 0);
238+
int r = sqlite3_prepare_v2(db_.get(), sql.data(), sql.size(), &s, 0);
236239
CHECK_ERROR_OR_THROW(env(), r, SQLITE_OK, Local<Array>());
237240
auto stmt = stmt_unique_ptr(s);
238241
std::vector<Local<Value>> values;
@@ -253,12 +256,13 @@ Local<Array> Storage::Enumerate() {
253256

254257
Local<Value> Storage::Length() {
255258
if (!Open()) {
256-
return Local<Value>();
259+
return {};
257260
}
258261

259-
static const char sql[] = "SELECT count(*) FROM nodejs_webstorage";
262+
static constexpr std::string_view sql =
263+
"SELECT count(*) FROM nodejs_webstorage";
260264
sqlite3_stmt* s = nullptr;
261-
int r = sqlite3_prepare_v2(db_.get(), sql, -1, &s, 0);
265+
int r = sqlite3_prepare_v2(db_.get(), sql.data(), sql.size(), &s, 0);
262266
CHECK_ERROR_OR_THROW(env(), r, SQLITE_OK, Local<Value>());
263267
auto stmt = stmt_unique_ptr(s);
264268
CHECK_ERROR_OR_THROW(
@@ -276,16 +280,16 @@ Local<Value> Storage::Load(Local<Name> key) {
276280
}
277281

278282
if (!Open()) {
279-
return Local<Value>();
283+
return {};
280284
}
281285

282-
static const char sql[] =
286+
static constexpr std::string_view sql =
283287
"SELECT value FROM nodejs_webstorage WHERE key = ? LIMIT 1";
284288
sqlite3_stmt* s = nullptr;
285-
int r = sqlite3_prepare_v2(db_.get(), sql, -1, &s, 0);
289+
int r = sqlite3_prepare_v2(db_.get(), sql.data(), sql.size(), &s, 0);
286290
CHECK_ERROR_OR_THROW(env(), r, SQLITE_OK, Local<Value>());
287291
auto stmt = stmt_unique_ptr(s);
288-
node::TwoByteValue utf16key(env()->isolate(), key);
292+
TwoByteValue utf16key(env()->isolate(), key);
289293
auto key_size = utf16key.length() * sizeof(uint16_t);
290294
r = sqlite3_bind_blob(stmt.get(), 1, utf16key.out(), key_size, SQLITE_STATIC);
291295
CHECK_ERROR_OR_THROW(env(), r, SQLITE_OK, Local<Value>());
@@ -312,10 +316,10 @@ Local<Value> Storage::LoadKey(const int index) {
312316
return Local<Value>();
313317
}
314318

315-
static const char sql[] =
319+
static constexpr std::string_view sql =
316320
"SELECT key FROM nodejs_webstorage LIMIT 1 OFFSET ?";
317321
sqlite3_stmt* s = nullptr;
318-
int r = sqlite3_prepare_v2(db_.get(), sql, -1, &s, 0);
322+
int r = sqlite3_prepare_v2(db_.get(), sql.data(), sql.size(), &s, 0);
319323
CHECK_ERROR_OR_THROW(env(), r, SQLITE_OK, Local<Value>());
320324
auto stmt = stmt_unique_ptr(s);
321325
r = sqlite3_bind_int(stmt.get(), 1, index);
@@ -350,12 +354,13 @@ bool Storage::Remove(Local<Name> key) {
350354
return false;
351355
}
352356

353-
static const char sql[] = "DELETE FROM nodejs_webstorage WHERE key = ?";
357+
static constexpr std::string_view sql =
358+
"DELETE FROM nodejs_webstorage WHERE key = ?";
354359
sqlite3_stmt* s = nullptr;
355-
int r = sqlite3_prepare_v2(db_.get(), sql, -1, &s, 0);
360+
int r = sqlite3_prepare_v2(db_.get(), sql.data(), sql.size(), &s, 0);
356361
CHECK_ERROR_OR_THROW(env(), r, SQLITE_OK, false);
357362
auto stmt = stmt_unique_ptr(s);
358-
node::TwoByteValue utf16key(env()->isolate(), key);
363+
TwoByteValue utf16key(env()->isolate(), key);
359364
auto key_size = utf16key.length() * sizeof(uint16_t);
360365
r = sqlite3_bind_blob(stmt.get(), 1, utf16key.out(), key_size, SQLITE_STATIC);
361366
CHECK_ERROR_OR_THROW(env(), r, SQLITE_OK, false);
@@ -379,14 +384,14 @@ bool Storage::Store(Local<Name> key, Local<Value> value) {
379384
return false;
380385
}
381386

382-
static const char sql[] =
387+
static constexpr std::string_view sql =
383388
"INSERT INTO nodejs_webstorage (key, value) VALUES (?, ?)"
384389
" ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value"
385390
" WHERE EXCLUDED.key = key";
386391
sqlite3_stmt* s = nullptr;
387-
node::TwoByteValue utf16key(env()->isolate(), key);
388-
node::TwoByteValue utf16val(env()->isolate(), val);
389-
int r = sqlite3_prepare_v2(db_.get(), sql, -1, &s, 0);
392+
TwoByteValue utf16key(env()->isolate(), key);
393+
TwoByteValue utf16val(env()->isolate(), val);
394+
int r = sqlite3_prepare_v2(db_.get(), sql.data(), sql.size(), &s, 0);
390395
CHECK_ERROR_OR_THROW(env(), r, SQLITE_OK, false);
391396
auto stmt = stmt_unique_ptr(s);
392397
auto key_size = utf16key.length() * sizeof(uint16_t);
@@ -435,7 +440,7 @@ static void GetItem(const FunctionCallbackInfo<Value>& info) {
435440

436441
Local<Value> result = storage->Load(prop);
437442
if (result.IsEmpty()) {
438-
info.GetReturnValue().Set(Null(env->isolate()));
443+
info.GetReturnValue().SetNull();
439444
} else {
440445
info.GetReturnValue().Set(result);
441446
}
@@ -457,13 +462,13 @@ static void Key(const FunctionCallbackInfo<Value>& info) {
457462
}
458463

459464
if (index < 0) {
460-
info.GetReturnValue().Set(Null(env->isolate()));
465+
info.GetReturnValue().SetNull();
461466
return;
462467
}
463468

464469
Local<Value> result = storage->LoadKey(index);
465470
if (result.IsEmpty()) {
466-
info.GetReturnValue().Set(Null(env->isolate()));
471+
info.GetReturnValue().SetNull();
467472
} else {
468473
info.GetReturnValue().Set(result);
469474
}

0 commit comments

Comments
 (0)