Skip to content

Commit 5bc20b8

Browse files
committed
Prevent WAL locking by resetting prepared statements after use
Merge pull request ibireme#129
1 parent 12f9e52 commit 5bc20b8

File tree

1 file changed

+36
-5
lines changed

1 file changed

+36
-5
lines changed

YYCache/YYKVStorage.m

+36-5
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,10 @@ - (BOOL)_dbInitialize {
169169
- (void)_dbCheckpoint {
170170
if (![self _dbCheck]) return;
171171
// Cause a checkpoint to occur, merge `sqlite-wal` file to `sqlite` file.
172-
sqlite3_wal_checkpoint(_db, NULL);
172+
int result = sqlite3_wal_checkpoint(_db, NULL);
173+
if (result != SQLITE_OK && _errorLogsEnabled) {
174+
NSLog(@"%s line:%d sqlite WAL checkpoint error (%d)", __FUNCTION__, __LINE__, result);
175+
}
173176
}
174177

175178
- (BOOL)_dbExecute:(NSString *)sql {
@@ -197,7 +200,14 @@ - (sqlite3_stmt *)_dbPrepareStmt:(NSString *)sql {
197200
}
198201
CFDictionarySetValue(_dbStmtCache, (__bridge const void *)(sql), stmt);
199202
} else {
200-
sqlite3_reset(stmt);
203+
if (sqlite3_stmt_busy(stmt)) {
204+
//just in case someone will forget to sqlite3_reset cached statement
205+
//causing WAL file lock
206+
if (_errorLogsEnabled) {
207+
NSLog(@"%s line:%d WARN: cached statement for query \"%@\" was not reset.", __FUNCTION__, __LINE__, sql);
208+
}
209+
sqlite3_reset(stmt);
210+
}
201211
}
202212
return stmt;
203213
}
@@ -239,6 +249,7 @@ - (BOOL)_dbSaveWithKey:(NSString *)key value:(NSData *)value fileName:(NSString
239249
sqlite3_bind_blob(stmt, 7, extendedData.bytes, (int)extendedData.length, 0);
240250

241251
int result = sqlite3_step(stmt);
252+
sqlite3_reset(stmt);
242253
if (result != SQLITE_DONE) {
243254
if (_errorLogsEnabled) NSLog(@"%s line:%d sqlite insert error (%d): %s", __FUNCTION__, __LINE__, result, sqlite3_errmsg(_db));
244255
return NO;
@@ -253,6 +264,7 @@ - (BOOL)_dbUpdateAccessTimeWithKey:(NSString *)key {
253264
sqlite3_bind_int(stmt, 1, (int)time(NULL));
254265
sqlite3_bind_text(stmt, 2, key.UTF8String, -1, NULL);
255266
int result = sqlite3_step(stmt);
267+
sqlite3_reset(stmt);
256268
if (result != SQLITE_DONE) {
257269
if (_errorLogsEnabled) NSLog(@"%s line:%d sqlite update error (%d): %s", __FUNCTION__, __LINE__, result, sqlite3_errmsg(_db));
258270
return NO;
@@ -289,6 +301,7 @@ - (BOOL)_dbDeleteItemWithKey:(NSString *)key {
289301
sqlite3_bind_text(stmt, 1, key.UTF8String, -1, NULL);
290302

291303
int result = sqlite3_step(stmt);
304+
sqlite3_reset(stmt);
292305
if (result != SQLITE_DONE) {
293306
if (_errorLogsEnabled) NSLog(@"%s line:%d db delete error (%d): %s", __FUNCTION__, __LINE__, result, sqlite3_errmsg(_db));
294307
return NO;
@@ -322,6 +335,7 @@ - (BOOL)_dbDeleteItemsWithSizeLargerThan:(int)size {
322335
if (!stmt) return NO;
323336
sqlite3_bind_int(stmt, 1, size);
324337
int result = sqlite3_step(stmt);
338+
sqlite3_reset(stmt);
325339
if (result != SQLITE_DONE) {
326340
if (_errorLogsEnabled) NSLog(@"%s line:%d sqlite delete error (%d): %s", __FUNCTION__, __LINE__, result, sqlite3_errmsg(_db));
327341
return NO;
@@ -335,6 +349,7 @@ - (BOOL)_dbDeleteItemsWithTimeEarlierThan:(int)time {
335349
if (!stmt) return NO;
336350
sqlite3_bind_int(stmt, 1, time);
337351
int result = sqlite3_step(stmt);
352+
sqlite3_reset(stmt);
338353
if (result != SQLITE_DONE) {
339354
if (_errorLogsEnabled) NSLog(@"%s line:%d sqlite delete error (%d): %s", __FUNCTION__, __LINE__, result, sqlite3_errmsg(_db));
340355
return NO;
@@ -380,6 +395,7 @@ - (YYKVStorageItem *)_dbGetItemWithKey:(NSString *)key excludeInlineData:(BOOL)e
380395
if (_errorLogsEnabled) NSLog(@"%s line:%d sqlite query error (%d): %s", __FUNCTION__, __LINE__, result, sqlite3_errmsg(_db));
381396
}
382397
}
398+
sqlite3_reset(stmt);
383399
return item;
384400
}
385401

@@ -428,12 +444,14 @@ - (NSData *)_dbGetValueWithKey:(NSString *)key {
428444
if (result == SQLITE_ROW) {
429445
const void *inline_data = sqlite3_column_blob(stmt, 0);
430446
int inline_data_bytes = sqlite3_column_bytes(stmt, 0);
447+
sqlite3_reset(stmt);
431448
if (!inline_data || inline_data_bytes <= 0) return nil;
432449
return [NSData dataWithBytes:inline_data length:inline_data_bytes];
433450
} else {
434451
if (result != SQLITE_DONE) {
435452
if (_errorLogsEnabled) NSLog(@"%s line:%d sqlite query error (%d): %s", __FUNCTION__, __LINE__, result, sqlite3_errmsg(_db));
436453
}
454+
sqlite3_reset(stmt);
437455
return nil;
438456
}
439457
}
@@ -447,13 +465,15 @@ - (NSString *)_dbGetFilenameWithKey:(NSString *)key {
447465
if (result == SQLITE_ROW) {
448466
char *filename = (char *)sqlite3_column_text(stmt, 0);
449467
if (filename && *filename != 0) {
468+
sqlite3_reset(stmt);
450469
return [NSString stringWithUTF8String:filename];
451470
}
452471
} else {
453472
if (result != SQLITE_DONE) {
454473
if (_errorLogsEnabled) NSLog(@"%s line:%d sqlite query error (%d): %s", __FUNCTION__, __LINE__, result, sqlite3_errmsg(_db));
455474
}
456475
}
476+
sqlite3_reset(stmt);
457477
return nil;
458478
}
459479

@@ -512,6 +532,7 @@ - (NSMutableArray *)_dbGetFilenamesWithSizeLargerThan:(int)size {
512532
break;
513533
}
514534
} while (1);
535+
sqlite3_reset(stmt);
515536
return filenames;
516537
}
517538

@@ -538,6 +559,7 @@ - (NSMutableArray *)_dbGetFilenamesWithTimeEarlierThan:(int)time {
538559
break;
539560
}
540561
} while (1);
562+
sqlite3_reset(stmt);
541563
return filenames;
542564
}
543565

@@ -570,6 +592,7 @@ - (NSMutableArray *)_dbGetItemSizeInfoOrderByTimeAscWithLimit:(int)count {
570592
break;
571593
}
572594
} while (1);
595+
sqlite3_reset(stmt);
573596
return items;
574597
}
575598

@@ -581,9 +604,12 @@ - (int)_dbGetItemCountWithKey:(NSString *)key {
581604
int result = sqlite3_step(stmt);
582605
if (result != SQLITE_ROW) {
583606
if (_errorLogsEnabled) NSLog(@"%s line:%d sqlite query error (%d): %s", __FUNCTION__, __LINE__, result, sqlite3_errmsg(_db));
607+
sqlite3_reset(stmt);
584608
return -1;
585609
}
586-
return sqlite3_column_int(stmt, 0);
610+
int count = sqlite3_column_int(stmt, 0);
611+
sqlite3_reset(stmt);
612+
return count;
587613
}
588614

589615
- (int)_dbGetTotalItemSize {
@@ -593,9 +619,12 @@ - (int)_dbGetTotalItemSize {
593619
int result = sqlite3_step(stmt);
594620
if (result != SQLITE_ROW) {
595621
if (_errorLogsEnabled) NSLog(@"%s line:%d sqlite query error (%d): %s", __FUNCTION__, __LINE__, result, sqlite3_errmsg(_db));
622+
sqlite3_reset(stmt);
596623
return -1;
597624
}
598-
return sqlite3_column_int(stmt, 0);
625+
int size = sqlite3_column_int(stmt, 0);
626+
sqlite3_reset(stmt);
627+
return size;
599628
}
600629

601630
- (int)_dbGetTotalItemCount {
@@ -607,7 +636,9 @@ - (int)_dbGetTotalItemCount {
607636
if (_errorLogsEnabled) NSLog(@"%s line:%d sqlite query error (%d): %s", __FUNCTION__, __LINE__, result, sqlite3_errmsg(_db));
608637
return -1;
609638
}
610-
return sqlite3_column_int(stmt, 0);
639+
int count = sqlite3_column_int(stmt, 0);
640+
sqlite3_reset(stmt);
641+
return count;
611642
}
612643

613644

0 commit comments

Comments
 (0)