Skip to content

Commit 01ee4c0

Browse files
committed
sqlite: clean up backups when database object is destroyed
1 parent 2aee11d commit 01ee4c0

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

src/node_sqlite.cc

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,6 @@ class BackupJob : public ThreadPoolWork {
287287
}
288288
}
289289

290-
private:
291290
void Cleanup() {
292291
if (pBackup_) {
293292
sqlite3_backup_finish(pBackup_);
@@ -299,7 +298,7 @@ class BackupJob : public ThreadPoolWork {
299298
}
300299
}
301300

302-
// https://github.com/nodejs/node/blob/649da3b8377e030ea7b9a1bc0308451e26e28740/src/crypto/crypto_keygen.h#L126
301+
private:
303302
int backup_status_;
304303
Environment* env() const { return env_; }
305304
sqlite3* pDest_;
@@ -459,6 +458,7 @@ void DatabaseSync::DeleteSessions() {
459458
DatabaseSync::~DatabaseSync() {
460459
if (IsOpen()) {
461460
FinalizeStatements();
461+
FinalizeBackups();
462462
DeleteSessions();
463463
sqlite3_close_v2(connection_);
464464
connection_ = nullptr;
@@ -521,6 +521,14 @@ bool DatabaseSync::Open() {
521521
return true;
522522
}
523523

524+
void DatabaseSync::FinalizeBackups() {
525+
for (auto backup : backups_) {
526+
backup->Cleanup();
527+
}
528+
529+
backups_.clear();
530+
}
531+
524532
void DatabaseSync::FinalizeStatements() {
525533
for (auto stmt : statements_) {
526534
stmt->Finalize();
@@ -825,6 +833,7 @@ void DatabaseSync::Backup(const FunctionCallbackInfo<Value>& args) {
825833

826834
BackupJob* job = new BackupJob(
827835
env, db, resolver, source_db, *destFilename, dest_db, rate, progressFunc);
836+
db->backups_.insert(job);
828837
job->ScheduleBackup();
829838
}
830839

src/node_sqlite.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class DatabaseOpenConfiguration {
4343
};
4444

4545
class StatementSync;
46+
class BackupJob;
4647

4748
class DatabaseSync : public BaseObject {
4849
public:
@@ -65,6 +66,7 @@ class DatabaseSync : public BaseObject {
6566
const v8::FunctionCallbackInfo<v8::Value>& args);
6667
static void LoadExtension(const v8::FunctionCallbackInfo<v8::Value>& args);
6768
void FinalizeStatements();
69+
void FinalizeBackups();
6870
void UntrackStatement(StatementSync* statement);
6971
bool IsOpen();
7072
sqlite3* Connection();
@@ -82,7 +84,7 @@ class DatabaseSync : public BaseObject {
8284
bool enable_load_extension_;
8385
sqlite3* connection_;
8486

85-
std::set<sqlite3_backup*> backups_;
87+
std::set<BackupJob*> backups_;
8688
std::set<sqlite3_session*> sessions_;
8789
std::unordered_set<StatementSync*> statements_;
8890

0 commit comments

Comments
 (0)