@@ -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+
214234StatementSync::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,
0 commit comments