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

news/2024/10/21 9:55:27/

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


http://www.ppmy.cn/news/1538079.html

相关文章

Fortran 学习笔记001

1.输入输出及声明 1.1 Fortran程序的主要结构 程序通常以program描述来开头&#xff0c;后接定义的程序名&#xff08;可以省略&#xff0c;但建议使用并取有意义的名称&#xff0c;便于阅读&#xff09;&#xff0c;最后以end描述结尾&#xff0c;可以有三种方式&#xff1a…

【机器学习】逻辑回归|分类问题评估|混淆矩阵|ROC曲线|AUC指标 介绍及案例代码实现

文章目录 逻辑回归逻辑回归简介逻辑回归的数学基础逻辑回归原理概念损失函数 逻辑回归API函数和案例案例癌症分类预测 分类问题评估混淆矩阵分类评估方法 - 精确率 召回率 F1ROC曲线 AUC指标案例AUC 计算的API分类评估报告api 电信客户流失预测案例 逻辑回归 逻辑回归简介 ​…

UniApp适合哪些场景

UniApp作为一款跨平台的移动应用开发框架&#xff0c;因其高效、灵活和强大的特性&#xff0c;适用于多种应用场景。以下是一些UniApp适用的主要场景&#xff1a; 多平台应用开发&#xff1a; 对于需要同时在iOS、Android、Web以及各种小程序平台发布的应用&#xff0c;UniApp可…

基于VUE+SSM问卷调查管理系统JAVA|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

让机器人融入生活?GR-2让科幻电影场景成真

GR-2 在科幻电影中&#xff0c;我们经常能看到人类通过远程操控机器人完成各种复杂任务的场景。而今天&#xff0c;这样的科幻场景正在成为现实。随着字节跳动研究团队最新推出的第二代机器人大模型GR-2&#xff08;Generative Robot 2.0&#xff09;的问世&#xff0c;我们离梦…

【计算机网络 - 基础问题】每日 3 题(二十九)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…

T-Box联网安全定义

T-Box&#xff0c;即Telematics BOX&#xff0c;也称远程信息处理控制单元&#xff08;Telematics Control Unit&#xff0c;TCU&#xff09;&#xff0c;是车联网中的重要组成部分。它集成了GPS、外部通信接口、电子处理单元、微控制器、移动通信单元和存储器等功能模块&#…

宠物咖啡馆服务平台:SpringBoot技术深度解析

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理基于Spring Boot的宠物咖啡馆平台的设计与…