欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > iOS18 第三库YYCache中sqlite3_finalize(stmt)调用报错修复

iOS18 第三库YYCache中sqlite3_finalize(stmt)调用报错修复

2024/10/26 9:19:08 来源:https://blog.csdn.net/saw471/article/details/142780413  浏览:    关键词:iOS18 第三库YYCache中sqlite3_finalize(stmt)调用报错修复

YYCache的YYKVStorage类中的有sqlite3_finalize(stmt)调用时报错一劳永逸无损修复

.h

#import "YYKVStorage.h"NS_ASSUME_NONNULL_BEGIN
@interface YYKVStorage (Fix)
@property (nonatomic, readonly) NSString *path;        ///< The path of this storage.
@property (nonatomic, readonly) YYKVStorageType type;  ///< The type of this storage.
@property (nonatomic) BOOL errorLogsEnabled;           ///< Set `YES` to enable error logs for debug.
@endNS_ASSUME_NONNULL_END

.m

#import "YYKVStorage+Fix.h"
#import <UIKit/UIKit.h>
#import <time.h>#if __has_include(<sqlite3.h>)
#import <sqlite3.h>
#else
#import "sqlite3.h"
#endif
@interface YYKVStorage ()
{dispatch_queue_t _trashQueue;NSString *_path;NSString *_dbPath;NSString *_dataPath;NSString *_trashPath;sqlite3 *_db;CFMutableDictionaryRef _dbStmtCache;NSTimeInterval _dbLastOpenErrorTime;NSUInteger _dbOpenErrorCount;
}
@end@implementation YYKVStorage (Fix)#pragma mark - db- (BOOL)_dbOpen {if (_db) return YES;int result = sqlite3_open(_dbPath.UTF8String, &_db);if (result == SQLITE_OK) {CFDictionaryKeyCallBacks keyCallbacks = kCFCopyStringDictionaryKeyCallBacks;CFDictionaryValueCallBacks valueCallbacks = {0};_dbStmtCache = CFDictionaryCreateMutable(CFAllocatorGetDefault(), 0, &keyCallbacks, &valueCallbacks);_dbLastOpenErrorTime = 0;_dbOpenErrorCount = 0;return YES;} else {_db = NULL;if (_dbStmtCache) {CFIndex size = CFDictionaryGetCount(_dbStmtCache);CFTypeRef *valuesRef = (CFTypeRef *)malloc(size * sizeof(CFTypeRef));CFDictionaryGetKeysAndValues(_dbStmtCache, NULL, (const void **)valuesRef);const sqlite3_stmt **stmts = (const sqlite3_stmt **)valuesRef;for (CFIndex i = 0; i < size; i ++) {sqlite3_stmt *stmt = stmts[i];sqlite3_finalize(stmt);}free(valuesRef);CFRelease(_dbStmtCache);}_dbStmtCache = NULL;_dbLastOpenErrorTime = CACurrentMediaTime();_dbOpenErrorCount++;//        if (_errorLogsEnabled) {
//            NSLog(@"%s line:%d sqlite open failed (%d).", __FUNCTION__, __LINE__, result);
//        }return NO;}
}- (BOOL)_dbClose {if (!_db) return YES;int  result = 0;BOOL retry = NO;BOOL stmtFinalized = NO;if (_dbStmtCache) {CFIndex size = CFDictionaryGetCount(_dbStmtCache);CFTypeRef *valuesRef = (CFTypeRef *)malloc(size * sizeof(CFTypeRef));CFDictionaryGetKeysAndValues(_dbStmtCache, NULL, (const void **)valuesRef);const sqlite3_stmt **stmts = (const sqlite3_stmt **)valuesRef;for (CFIndex i = 0; i < size; i ++) {sqlite3_stmt *stmt = stmts[i];sqlite3_finalize(stmt);}free(valuesRef);CFRelease(_dbStmtCache);}_dbStmtCache = NULL;do {retry = NO;result = sqlite3_close(_db);if (result == SQLITE_BUSY || result == SQLITE_LOCKED) {if (!stmtFinalized) {stmtFinalized = YES;sqlite3_stmt *stmt;while ((stmt = sqlite3_next_stmt(_db, nil)) != 0) {sqlite3_finalize(stmt);retry = YES;}}} else if (result != SQLITE_OK) {
//            if (_errorLogsEnabled) {
//                NSLog(@"%s line:%d sqlite close failed (%d).", __FUNCTION__, __LINE__, result);
//            }}} while (retry);_db = NULL;return YES;
}@end

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com