From 36aff45aa6b322377c3178930151efec04cae719 Mon Sep 17 00:00:00 2001 From: zhengpeng Date: Sat, 14 Sep 2024 17:44:45 +0800 Subject: [PATCH 1/3] fix storage crash --- YYCache/YYKVStorage.m | 54 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/YYCache/YYKVStorage.m b/YYCache/YYKVStorage.m index 501dfdd..f998b4c 100644 --- a/YYCache/YYKVStorage.m +++ b/YYCache/YYKVStorage.m @@ -117,6 +117,10 @@ - (BOOL)_dbOpen { } } +static void _finalizeStatement(const void *key, const void *value, void *context) { + sqlite3_finalize((sqlite3_stmt *)value); +} + - (BOOL)_dbClose { if (!_db) return YES; @@ -124,7 +128,10 @@ - (BOOL)_dbClose { BOOL retry = NO; BOOL stmtFinalized = NO; - if (_dbStmtCache) CFRelease(_dbStmtCache); + if (_dbStmtCache) { + CFDictionaryApplyFunction(_dbStmtCache, _finalizeStatement, NULL); + CFRelease(_dbStmtCache); + } _dbStmtCache = NULL; do { @@ -169,7 +176,10 @@ - (BOOL)_dbInitialize { - (void)_dbCheckpoint { if (![self _dbCheck]) return; // Cause a checkpoint to occur, merge `sqlite-wal` file to `sqlite` file. - sqlite3_wal_checkpoint(_db, NULL); + int result = sqlite3_wal_checkpoint(_db, NULL); + if (result != SQLITE_OK && _errorLogsEnabled) { + NSLog(@"%s line:%d sqlite WAL checkpoint error (%d)", __FUNCTION__, __LINE__, result); + } } - (BOOL)_dbExecute:(NSString *)sql { @@ -197,7 +207,14 @@ - (sqlite3_stmt *)_dbPrepareStmt:(NSString *)sql { } CFDictionarySetValue(_dbStmtCache, (__bridge const void *)(sql), stmt); } else { - sqlite3_reset(stmt); + if (sqlite3_stmt_busy(stmt)) { + //just in case someone will forget to sqlite3_reset cached statement + //causing WAL file lock + if (_errorLogsEnabled) { + NSLog(@"%s line:%d WARN: cached statement for query \"%@\" was not reset.", __FUNCTION__, __LINE__, sql); + } + sqlite3_reset(stmt); + } } return stmt; } @@ -239,6 +256,7 @@ - (BOOL)_dbSaveWithKey:(NSString *)key value:(NSData *)value fileName:(NSString sqlite3_bind_blob(stmt, 7, extendedData.bytes, (int)extendedData.length, 0); int result = sqlite3_step(stmt); + sqlite3_reset(stmt); if (result != SQLITE_DONE) { if (_errorLogsEnabled) NSLog(@"%s line:%d sqlite insert error (%d): %s", __FUNCTION__, __LINE__, result, sqlite3_errmsg(_db)); return NO; @@ -253,6 +271,7 @@ - (BOOL)_dbUpdateAccessTimeWithKey:(NSString *)key { sqlite3_bind_int(stmt, 1, (int)time(NULL)); sqlite3_bind_text(stmt, 2, key.UTF8String, -1, NULL); int result = sqlite3_step(stmt); + sqlite3_reset(stmt); if (result != SQLITE_DONE) { if (_errorLogsEnabled) NSLog(@"%s line:%d sqlite update error (%d): %s", __FUNCTION__, __LINE__, result, sqlite3_errmsg(_db)); return NO; @@ -289,6 +308,7 @@ - (BOOL)_dbDeleteItemWithKey:(NSString *)key { sqlite3_bind_text(stmt, 1, key.UTF8String, -1, NULL); int result = sqlite3_step(stmt); + sqlite3_reset(stmt); if (result != SQLITE_DONE) { if (_errorLogsEnabled) NSLog(@"%s line:%d db delete error (%d): %s", __FUNCTION__, __LINE__, result, sqlite3_errmsg(_db)); return NO; @@ -322,6 +342,7 @@ - (BOOL)_dbDeleteItemsWithSizeLargerThan:(int)size { if (!stmt) return NO; sqlite3_bind_int(stmt, 1, size); int result = sqlite3_step(stmt); + sqlite3_reset(stmt); if (result != SQLITE_DONE) { if (_errorLogsEnabled) NSLog(@"%s line:%d sqlite delete error (%d): %s", __FUNCTION__, __LINE__, result, sqlite3_errmsg(_db)); return NO; @@ -335,6 +356,7 @@ - (BOOL)_dbDeleteItemsWithTimeEarlierThan:(int)time { if (!stmt) return NO; sqlite3_bind_int(stmt, 1, time); int result = sqlite3_step(stmt); + sqlite3_reset(stmt); if (result != SQLITE_DONE) { if (_errorLogsEnabled) NSLog(@"%s line:%d sqlite delete error (%d): %s", __FUNCTION__, __LINE__, result, sqlite3_errmsg(_db)); return NO; @@ -380,6 +402,7 @@ - (YYKVStorageItem *)_dbGetItemWithKey:(NSString *)key excludeInlineData:(BOOL)e if (_errorLogsEnabled) NSLog(@"%s line:%d sqlite query error (%d): %s", __FUNCTION__, __LINE__, result, sqlite3_errmsg(_db)); } } + sqlite3_reset(stmt); return item; } @@ -428,12 +451,14 @@ - (NSData *)_dbGetValueWithKey:(NSString *)key { if (result == SQLITE_ROW) { const void *inline_data = sqlite3_column_blob(stmt, 0); int inline_data_bytes = sqlite3_column_bytes(stmt, 0); + sqlite3_reset(stmt); if (!inline_data || inline_data_bytes <= 0) return nil; return [NSData dataWithBytes:inline_data length:inline_data_bytes]; } else { if (result != SQLITE_DONE) { if (_errorLogsEnabled) NSLog(@"%s line:%d sqlite query error (%d): %s", __FUNCTION__, __LINE__, result, sqlite3_errmsg(_db)); } + sqlite3_reset(stmt); return nil; } } @@ -447,6 +472,7 @@ - (NSString *)_dbGetFilenameWithKey:(NSString *)key { if (result == SQLITE_ROW) { char *filename = (char *)sqlite3_column_text(stmt, 0); if (filename && *filename != 0) { + sqlite3_reset(stmt); return [NSString stringWithUTF8String:filename]; } } else { @@ -454,6 +480,7 @@ - (NSString *)_dbGetFilenameWithKey:(NSString *)key { if (_errorLogsEnabled) NSLog(@"%s line:%d sqlite query error (%d): %s", __FUNCTION__, __LINE__, result, sqlite3_errmsg(_db)); } } + sqlite3_reset(stmt); return nil; } @@ -512,6 +539,7 @@ - (NSMutableArray *)_dbGetFilenamesWithSizeLargerThan:(int)size { break; } } while (1); + sqlite3_reset(stmt); return filenames; } @@ -538,6 +566,7 @@ - (NSMutableArray *)_dbGetFilenamesWithTimeEarlierThan:(int)time { break; } } while (1); + sqlite3_reset(stmt); return filenames; } @@ -570,6 +599,7 @@ - (NSMutableArray *)_dbGetItemSizeInfoOrderByTimeAscWithLimit:(int)count { break; } } while (1); + sqlite3_reset(stmt); return items; } @@ -581,9 +611,12 @@ - (int)_dbGetItemCountWithKey:(NSString *)key { int result = sqlite3_step(stmt); if (result != SQLITE_ROW) { if (_errorLogsEnabled) NSLog(@"%s line:%d sqlite query error (%d): %s", __FUNCTION__, __LINE__, result, sqlite3_errmsg(_db)); + sqlite3_reset(stmt); return -1; } - return sqlite3_column_int(stmt, 0); + int count = sqlite3_column_int(stmt, 0); + sqlite3_reset(stmt); + return count; } - (int)_dbGetTotalItemSize { @@ -593,9 +626,12 @@ - (int)_dbGetTotalItemSize { int result = sqlite3_step(stmt); if (result != SQLITE_ROW) { if (_errorLogsEnabled) NSLog(@"%s line:%d sqlite query error (%d): %s", __FUNCTION__, __LINE__, result, sqlite3_errmsg(_db)); + sqlite3_reset(stmt); return -1; } - return sqlite3_column_int(stmt, 0); + int size = sqlite3_column_int(stmt, 0); + sqlite3_reset(stmt); + return size; } - (int)_dbGetTotalItemCount { @@ -607,7 +643,9 @@ - (int)_dbGetTotalItemCount { if (_errorLogsEnabled) NSLog(@"%s line:%d sqlite query error (%d): %s", __FUNCTION__, __LINE__, result, sqlite3_errmsg(_db)); return -1; } - return sqlite3_column_int(stmt, 0); + int count = sqlite3_column_int(stmt, 0); + sqlite3_reset(stmt); + return count; } @@ -727,10 +765,10 @@ - (instancetype)initWithPath:(NSString *)path type:(YYKVStorageType)type { } - (void)dealloc { - UIBackgroundTaskIdentifier taskID = [_YYSharedApplication() beginBackgroundTaskWithExpirationHandler:^{}]; + UIBackgroundTaskIdentifier taskID = [[UIApplication sharedExtensionApplication] beginBackgroundTaskWithExpirationHandler:^{}]; [self _dbClose]; if (taskID != UIBackgroundTaskInvalid) { - [_YYSharedApplication() endBackgroundTask:taskID]; + [[UIApplication sharedExtensionApplication] endBackgroundTask:taskID]; } } From 6ace0dd0e71892f194d981670ac995c3f8b4b37b Mon Sep 17 00:00:00 2001 From: zhengpeng Date: Sat, 14 Sep 2024 17:52:11 +0800 Subject: [PATCH 2/3] fix storage crash --- YYCache/YYKVStorage.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/YYCache/YYKVStorage.m b/YYCache/YYKVStorage.m index f998b4c..59f44eb 100644 --- a/YYCache/YYKVStorage.m +++ b/YYCache/YYKVStorage.m @@ -765,10 +765,10 @@ - (instancetype)initWithPath:(NSString *)path type:(YYKVStorageType)type { } - (void)dealloc { - UIBackgroundTaskIdentifier taskID = [[UIApplication sharedExtensionApplication] beginBackgroundTaskWithExpirationHandler:^{}]; + UIBackgroundTaskIdentifier taskID = [_YYSharedApplication() beginBackgroundTaskWithExpirationHandler:^{}]; [self _dbClose]; if (taskID != UIBackgroundTaskInvalid) { - [[UIApplication sharedExtensionApplication] endBackgroundTask:taskID]; + [_YYSharedApplication() endBackgroundTask:taskID]; } } From 63da14fdde112b5c0f9b5389377823e2f30ec24b Mon Sep 17 00:00:00 2001 From: zhengpeng Date: Sat, 14 Sep 2024 17:53:33 +0800 Subject: [PATCH 3/3] bumping the version to 1.0.5 --- YYCache.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/YYCache.podspec b/YYCache.podspec index 0eecedb..0c8e00b 100644 --- a/YYCache.podspec +++ b/YYCache.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = 'YYCache' s.summary = 'High performance cache framework for iOS.' - s.version = '1.0.4' + s.version = '1.0.5' s.license = { :type => 'MIT', :file => 'LICENSE' } s.authors = { 'ibireme' => 'ibireme@gmail.com' } s.social_media_url = 'http://blog.ibireme.com'