Skip to content

Commit edb5f58

Browse files
committed
src(sqlite): sqlite3.loadExtension
1 parent fcda284 commit edb5f58

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

src/node_sqlite.cc

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ bool DatabaseSync::Open() {
109109
int flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE;
110110
int r = sqlite3_open_v2(location_.c_str(), &connection_, flags, nullptr);
111111
CHECK_ERROR_OR_THROW(env()->isolate(), connection_, r, SQLITE_OK, false);
112+
int r2 = sqlite3_enable_load_extension(connection_, 1);
113+
CHECK_ERROR_OR_THROW(env()->isolate(), connection_, r2, SQLITE_OK, false);
112114
return true;
113115
}
114116

@@ -211,6 +213,24 @@ void DatabaseSync::Exec(const FunctionCallbackInfo<Value>& args) {
211213
CHECK_ERROR_OR_THROW(env->isolate(), db->connection_, r, SQLITE_OK, void());
212214
}
213215

216+
void DatabaseSync::LoadExtension(const FunctionCallbackInfo<Value>& args) {
217+
DatabaseSync* db;
218+
ASSIGN_OR_RETURN_UNWRAP(&db, args.This());
219+
Environment* env = Environment::GetCurrent(args);
220+
THROW_AND_RETURN_ON_BAD_STATE(
221+
env, db->connection_ == nullptr, "database is not open");
222+
223+
if (!args[0]->IsString()) {
224+
node::THROW_ERR_INVALID_ARG_TYPE(env->isolate(),
225+
"The \"path\" argument must be a string.");
226+
return;
227+
}
228+
229+
auto path = node::Utf8Value(env->isolate(), args[0].As<String>());
230+
int r = sqlite3_load_extension(db->connection_, *path, nullptr, nullptr);
231+
CHECK_ERROR_OR_THROW(env->isolate(), db->connection_, r, SQLITE_OK, void());
232+
}
233+
214234
StatementSync::StatementSync(Environment* env,
215235
Local<Object> object,
216236
sqlite3* db,
@@ -658,6 +678,7 @@ static void Initialize(Local<Object> target,
658678
SetProtoMethod(isolate, db_tmpl, "close", DatabaseSync::Close);
659679
SetProtoMethod(isolate, db_tmpl, "prepare", DatabaseSync::Prepare);
660680
SetProtoMethod(isolate, db_tmpl, "exec", DatabaseSync::Exec);
681+
SetProtoMethod(isolate, db_tmpl, "load_extension", DatabaseSync::LoadExtension);
661682
SetConstructorFunction(context, target, "DatabaseSync", db_tmpl);
662683
SetConstructorFunction(context,
663684
target,

src/node_sqlite.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class DatabaseSync : public BaseObject {
2525
static void Close(const v8::FunctionCallbackInfo<v8::Value>& args);
2626
static void Prepare(const v8::FunctionCallbackInfo<v8::Value>& args);
2727
static void Exec(const v8::FunctionCallbackInfo<v8::Value>& args);
28+
static void LoadExtension(const v8::FunctionCallbackInfo<v8::Value>& args);
2829

2930
SET_MEMORY_INFO_NAME(DatabaseSync)
3031
SET_SELF_SIZE(DatabaseSync)

0 commit comments

Comments
 (0)