@@ -237,16 +237,19 @@ void JSValueToSQLiteResult(Isolate* isolate,
237237 }
238238}
239239
240+ inline void THROW_ERR_SQLITE_ERROR (Isolate* isolate, sqlite3* db) {
241+ Local<Object> e;
242+ if (CreateSQLiteError (isolate, db).ToLocal (&e)) {
243+ isolate->ThrowException (e);
244+ }
245+ }
240246inline void THROW_ERR_SQLITE_ERROR (Isolate* isolate, DatabaseSync* db) {
241247 if (db->ShouldIgnoreSQLiteError ()) {
242248 db->SetIgnoreNextSQLiteError (false );
243249 return ;
244250 }
245251
246- Local<Object> e;
247- if (CreateSQLiteError (isolate, db->Connection ()).ToLocal (&e)) {
248- isolate->ThrowException (e);
249- }
252+ THROW_ERR_SQLITE_ERROR (isolate, db->Connection ());
250253}
251254
252255inline void THROW_ERR_SQLITE_ERROR (Isolate* isolate, const char * message) {
@@ -281,6 +284,28 @@ inline MaybeLocal<Value> NullableSQLiteStringToValue(Isolate* isolate,
281284 .As <Value>();
282285}
283286
287+ DatabaseCommon::DatabaseCommon (Environment* env,
288+ Local<Object> object,
289+ DatabaseOpenConfiguration&& open_config,
290+ bool allow_load_extension)
291+ : BaseObject(env, object),
292+ open_config_ (std::move(open_config)),
293+ allow_load_extension_(allow_load_extension),
294+ enable_load_extension_(allow_load_extension) {
295+ MakeWeak ();
296+ }
297+
298+ namespace {
299+ void AddDatabaseCommonMethodsToTemplate (Isolate* isolate,
300+ Local<FunctionTemplate> tmpl) {
301+ SetProtoMethod (isolate, tmpl, " open" , DatabaseCommon::Open);
302+ SetSideEffectFreeGetter (isolate,
303+ tmpl,
304+ FIXED_ONE_BYTE_STRING (isolate, " isOpen" ),
305+ DatabaseCommon::IsOpenGetter);
306+ }
307+ } // namespace
308+
284309class CustomAggregate {
285310 public:
286311 explicit CustomAggregate (Environment* env,
@@ -688,11 +713,9 @@ DatabaseSync::DatabaseSync(Environment* env,
688713 DatabaseOpenConfiguration&& open_config,
689714 bool open,
690715 bool allow_load_extension)
691- : BaseObject(env, object), open_config_(std::move(open_config)) {
716+ : DatabaseCommon(
717+ env, object, std::move(open_config), allow_load_extension) {
692718 MakeWeak ();
693- connection_ = nullptr ;
694- allow_load_extension_ = allow_load_extension;
695- enable_load_extension_ = allow_load_extension;
696719 ignore_next_sqlite_error_ = false ;
697720
698721 if (open) {
@@ -744,7 +767,8 @@ v8::Local<v8::FunctionTemplate> CreateDatabaseSyncConstructorTemplate(
744767 tmpl->InstanceTemplate ()->SetInternalFieldCount (
745768 DatabaseSync::kInternalFieldCount );
746769
747- SetProtoMethod (isolate, tmpl, " open" , DatabaseSync::Open);
770+ AddDatabaseCommonMethodsToTemplate (isolate, tmpl);
771+
748772 SetProtoMethod (isolate, tmpl, " close" , DatabaseSync::Close);
749773 SetProtoDispose (isolate, tmpl, DatabaseSync::Dispose);
750774 SetProtoMethod (isolate, tmpl, " prepare" , DatabaseSync::Prepare);
@@ -761,10 +785,6 @@ v8::Local<v8::FunctionTemplate> CreateDatabaseSyncConstructorTemplate(
761785 isolate, tmpl, " enableDefensive" , DatabaseSync::EnableDefensive);
762786 SetProtoMethod (isolate, tmpl, " loadExtension" , DatabaseSync::LoadExtension);
763787 SetProtoMethod (isolate, tmpl, " setAuthorizer" , DatabaseSync::SetAuthorizer);
764- SetSideEffectFreeGetter (isolate,
765- tmpl,
766- FIXED_ONE_BYTE_STRING (isolate, " isOpen" ),
767- DatabaseSync::IsOpenGetter);
768788 SetSideEffectFreeGetter (isolate,
769789 tmpl,
770790 FIXED_ONE_BYTE_STRING (isolate, " isTransaction" ),
@@ -780,7 +800,7 @@ v8::Local<v8::FunctionTemplate> CreateDatabaseSyncConstructorTemplate(
780800}
781801} // namespace
782802
783- bool DatabaseSync ::Open () {
803+ bool DatabaseCommon ::Open () {
784804 if (IsOpen ()) {
785805 THROW_ERR_INVALID_STATE (env (), " database is already open" );
786806 return false ;
@@ -795,34 +815,34 @@ bool DatabaseSync::Open() {
795815 &connection_,
796816 flags | default_flags,
797817 nullptr );
798- CHECK_ERROR_OR_THROW (env ()->isolate (), this , r, SQLITE_OK, false );
818+ CHECK_ERROR_OR_THROW (env ()->isolate (), connection_ , r, SQLITE_OK, false );
799819
800820 r = sqlite3_db_config (connection_,
801821 SQLITE_DBCONFIG_DQS_DML,
802822 static_cast <int >(open_config_.get_enable_dqs ()),
803823 nullptr );
804- CHECK_ERROR_OR_THROW (env ()->isolate (), this , r, SQLITE_OK, false );
824+ CHECK_ERROR_OR_THROW (env ()->isolate (), connection_ , r, SQLITE_OK, false );
805825 r = sqlite3_db_config (connection_,
806826 SQLITE_DBCONFIG_DQS_DDL,
807827 static_cast <int >(open_config_.get_enable_dqs ()),
808828 nullptr );
809- CHECK_ERROR_OR_THROW (env ()->isolate (), this , r, SQLITE_OK, false );
829+ CHECK_ERROR_OR_THROW (env ()->isolate (), connection_ , r, SQLITE_OK, false );
810830
811831 int foreign_keys_enabled;
812832 r = sqlite3_db_config (
813833 connection_,
814834 SQLITE_DBCONFIG_ENABLE_FKEY,
815835 static_cast <int >(open_config_.get_enable_foreign_keys ()),
816836 &foreign_keys_enabled);
817- CHECK_ERROR_OR_THROW (env ()->isolate (), this , r, SQLITE_OK, false );
837+ CHECK_ERROR_OR_THROW (env ()->isolate (), connection_ , r, SQLITE_OK, false );
818838 CHECK_EQ (foreign_keys_enabled, open_config_.get_enable_foreign_keys ());
819839
820840 int defensive_enabled;
821841 r = sqlite3_db_config (connection_,
822842 SQLITE_DBCONFIG_DEFENSIVE,
823843 static_cast <int >(open_config_.get_enable_defensive ()),
824844 &defensive_enabled);
825- CHECK_ERROR_OR_THROW (env ()->isolate (), this , r, SQLITE_OK, false );
845+ CHECK_ERROR_OR_THROW (env ()->isolate (), connection_ , r, SQLITE_OK, false );
826846 CHECK_EQ (defensive_enabled, open_config_.get_enable_defensive ());
827847
828848 sqlite3_busy_timeout (connection_, open_config_.get_timeout ());
@@ -837,7 +857,7 @@ bool DatabaseSync::Open() {
837857 const int load_extension_ret = sqlite3_db_config (
838858 connection_, SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, 1 , nullptr );
839859 CHECK_ERROR_OR_THROW (
840- env ()->isolate (), this , load_extension_ret, SQLITE_OK, false );
860+ env ()->isolate (), connection_ , load_extension_ret, SQLITE_OK, false );
841861 }
842862
843863 return true ;
@@ -866,11 +886,11 @@ void DatabaseSync::UntrackStatement(StatementSync* statement) {
866886 }
867887}
868888
869- inline bool DatabaseSync ::IsOpen () {
889+ inline bool DatabaseCommon ::IsOpen () {
870890 return connection_ != nullptr ;
871891}
872892
873- inline sqlite3* DatabaseSync ::Connection () {
893+ inline sqlite3* DatabaseCommon ::Connection () {
874894 return connection_;
875895}
876896
@@ -1158,13 +1178,13 @@ void DatabaseSync::New(const FunctionCallbackInfo<Value>& args) {
11581178 env, args.This (), std::move (open_config), open, allow_load_extension);
11591179}
11601180
1161- void DatabaseSync ::Open (const FunctionCallbackInfo<Value>& args) {
1181+ void DatabaseCommon ::Open (const FunctionCallbackInfo<Value>& args) {
11621182 DatabaseSync* db;
11631183 ASSIGN_OR_RETURN_UNWRAP (&db, args.This ());
11641184 db->Open ();
11651185}
11661186
1167- void DatabaseSync ::IsOpenGetter (const FunctionCallbackInfo<Value>& args) {
1187+ void DatabaseCommon ::IsOpenGetter (const FunctionCallbackInfo<Value>& args) {
11681188 DatabaseSync* db;
11691189 ASSIGN_OR_RETURN_UNWRAP (&db, args.This ());
11701190 args.GetReturnValue ().Set (db->IsOpen ());
0 commit comments