Skip to content

Commit 576f122

Browse files
committed
v1.3.1
1 parent f796447 commit 576f122

11 files changed

+232
-160
lines changed

Paintinglite/Paintinglite/Paintinglite/PaintingliteAggregateFunc.m

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,20 @@ + (instancetype)sharePaintingliteAggregateFunc{
5050
- (double)Aggregate:(sqlite3 *)ppDb sql:(NSString *__nonnull)sql{
5151
//查询总个数
5252
//SELECT count(*) FROM user
53-
double number = 0;
54-
55-
if (sqlite3_prepare_v2(ppDb, [sql UTF8String], -1, &_stmt, nil) == SQLITE_OK){
56-
//查询成功
57-
while (sqlite3_step(_stmt) == SQLITE_ROW) {
58-
number = sqlite3_column_double(_stmt, 0);
53+
__block double number = 0;
54+
55+
dispatch_semaphore_t signal = dispatch_semaphore_create(0);
56+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
57+
if (sqlite3_prepare_v2(ppDb, [sql UTF8String], -1, &(self->_stmt), nil) == SQLITE_OK){
58+
//查询成功
59+
while (sqlite3_step(self->_stmt) == SQLITE_ROW) {
60+
number = sqlite3_column_double(self->_stmt, 0);
61+
}
5962
}
60-
}
63+
dispatch_semaphore_signal(signal);
64+
});
65+
66+
dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);
6167

6268
sqlite3_finalize(_stmt);
6369

@@ -84,7 +90,7 @@ - (NSString *__nonnull)aggregateSQL:(PaintingliteAggregateType)type field:(NSStr
8490
return [NSString stringWithFormat:@"SELECT AVG(%@) FROM %@ %@",field,[tableName lowercaseString],condatation];
8591
}
8692

87-
return @"";
93+
return NULL;
8894
}
8995

9096
#pragma mark - 统计个数

Paintinglite/Paintinglite/Paintinglite/PaintingliteExec.m

Lines changed: 71 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -247,95 +247,103 @@ - (NSMutableArray *)sqlite3ExecQuery:(sqlite3 *)ppDb sql:(NSString *)sql{
247247

248248
NSMutableArray<NSDictionary *> *tables = [NSMutableArray array];
249249
//将结果返回,保存为字典
250-
251-
NSMutableArray *resArray = [self getObjName:sql ppDb:ppDb];
250+
__block NSMutableArray *resArray = [self getObjName:sql ppDb:ppDb];
252251

253252
//替换SELECT * FROM user 中星号
254253
//SELECT * FROM user WHERE name = '...'
255254
//SELECT user.name as paintinglite_name,user.age as paintinglite_age FROM user WHERE paintinglite_name = '...' and paintinglite_age = '...';
256255
//SELECT * FROM user WHERE age < 40 ORDER BY name DESC
257256
sql = [self replaceStar:ppDb resArray:resArray sql:sql];
258-
NSString *optAndStatusStr = [sql stringByAppendingString:@" | "];
259-
@synchronized (self) {
260-
if (sqlite3_prepare_v2(ppDb, [sql UTF8String], -1, &_stmt, nil) == SQLITE_OK){
257+
258+
dispatch_semaphore_t signal = dispatch_semaphore_create(0);
259+
260+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
261+
NSString *optAndStatusStr = [sql stringByAppendingString:@" | "];
262+
263+
if (sqlite3_prepare_v2(ppDb, [sql UTF8String], -1, &(self->_stmt), nil) == SQLITE_OK){
261264
//查询成功
262-
while (sqlite3_step(_stmt) == SQLITE_ROW) {
263-
@autoreleasepool {
264-
NSMutableDictionary<id,id> *queryDict = [NSMutableDictionary dictionary];
265-
//resArray是一个含有表字段的数据,根据resArray获得值加入
266-
for (unsigned int i = 0; i < resArray.count; i++) {
267-
//取出来的值,然后判断类型,进行类型分类
268-
/**
269-
SQLITE_INTEGER 1
270-
SQLITE_FLOAT 2
271-
SQLITE3_TEXT 3
272-
SQLITE_BLOB 4
273-
SQLITE_NULL 5
274-
*/
275-
@autoreleasepool {
276-
id value = nil;
277-
value = [self caseTheType:sqlite3_column_type(_stmt, i) index:i value:value];
278-
[queryDict setValue:value forKey:resArray[i]];
279-
}
265+
while (sqlite3_step(self->_stmt) == SQLITE_ROW) {
266+
NSMutableDictionary<id,id> *queryDict = [NSMutableDictionary dictionary];
267+
//resArray是一个含有表字段的数据,根据resArray获得值加入
268+
for (unsigned int i = 0; i < resArray.count; i++) {
269+
//取出来的值,然后判断类型,进行类型分类
270+
@autoreleasepool {
271+
id value = nil;
272+
value = [self caseTheType:sqlite3_column_type(self->_stmt, i) index:i value:value];
273+
[queryDict setValue:value forKey:resArray[i]];
280274
}
281-
[tables addObject:queryDict];
282275
}
276+
[tables addObject:queryDict];
283277
}
284278
optAndStatusStr = [optAndStatusStr stringByAppendingString:@"success"];
285279
}else{
286280
//执行失败
287281
optAndStatusStr = [optAndStatusStr stringByAppendingString:@"error"];
288282
}
289-
}
290-
291-
//写入缓存
292-
[self.cache addDatabaseOptionsCache:optAndStatusStr];
293-
283+
284+
//写入缓存
285+
[self.cache addDatabaseOptionsCache:optAndStatusStr];
286+
287+
dispatch_semaphore_signal(signal);
288+
});
289+
290+
dispatch_semaphore_wait(signal,DISPATCH_TIME_FOREVER);
291+
294292
sqlite3_finalize(_stmt);
295293

296294
return tables;
297295
}
298296

299297
#pragma mark - 替代*操作
300298
- (NSString *__nonnull)replaceStar:(sqlite3 *)ppDb resArray:(NSMutableArray *)resArray sql:(NSString *__nonnull)sql{
301-
NSString *tableInfoStr = NULL;
302-
NSString *tableName = NULL;
303-
NSString *tempSql = [sql uppercaseString];
304-
if ([tempSql containsString:@"*"]) {
305-
if ([tempSql containsString:Paintinglite_Sqlite3_WHERE]) {
306-
tableName = [[[sql componentsSeparatedByString:[NSString stringWithFormat:@" %@",Paintinglite_Sqlite3_WHERE]][0] componentsSeparatedByString:Paintinglite_Sqlite3_SPACE]lastObject];
307-
tableInfoStr = [NSString stringWithFormat:@"%@",[self getTableInfo:ppDb tableName:tableName]];
308-
}else if([tempSql containsString:Paintinglite_Sqlite3_ORDER]){
309-
tableName = [[[sql componentsSeparatedByString:[NSString stringWithFormat:@" %@",Paintinglite_Sqlite3_ORDER]][0] componentsSeparatedByString:Paintinglite_Sqlite3_SPACE]lastObject];
310-
tableInfoStr = [NSString stringWithFormat:@"%@",[self getTableInfo:ppDb tableName:tableName]];
311-
}else if([tempSql containsString:Paintinglite_Sqlite3_LIMIT]){
312-
tableName = [[[sql componentsSeparatedByString:[NSString stringWithFormat:@" %@",Paintinglite_Sqlite3_LIMIT]][0] componentsSeparatedByString:Paintinglite_Sqlite3_SPACE]lastObject];
313-
tableInfoStr = [NSString stringWithFormat:@"%@",[self getTableInfo:ppDb tableName:tableName]];
314-
}else{
315-
tableName = [[sql componentsSeparatedByString:Paintinglite_Sqlite3_SPACE]lastObject];
316-
tableInfoStr = [NSString stringWithFormat:@"%@",[self getTableInfo:ppDb tableName:tableName]];
317-
}
318-
319-
//去除换行和空格
320-
tableInfoStr = [[tableInfoStr stringByReplacingOccurrencesOfString:@"\n" withString:@""] stringByReplacingOccurrencesOfString:Paintinglite_Sqlite3_SPACE withString:@""];
321-
tableInfoStr = [tableInfoStr substringWithRange:NSMakeRange(1, tableInfoStr.length - 2)];
322-
323-
//SELECT name,age FROM user
324-
//每一个数组增加user.
325-
NSString *str = [NSString stringWithFormat:@"%@.",tableName];
326-
NSString *resStr = [NSString string];
299+
__block NSString *tableInfoStr = NULL;
300+
__block NSString *tableName = NULL;
301+
__block NSString *tempSql = [sql uppercaseString];
302+
303+
dispatch_semaphore_t signal = dispatch_semaphore_create(0);
304+
305+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
327306

328-
NSUInteger i = 0;
329-
NSArray<NSString*> *tableInfoArray = [tableInfoStr componentsSeparatedByString:@","];
330-
for (NSString *field in tableInfoArray) {
331-
resStr = (i == tableInfoArray.count - 1) ? [resStr stringByAppendingString:[NSString stringWithFormat:@"%@ as %@",[str stringByAppendingString:field],[NSString stringWithFormat:@"painting_%@",field]]] : [resStr stringByAppendingString:[NSString stringWithFormat:@"%@ as %@,",[str stringByAppendingString:field],[NSString stringWithFormat:@"painting_%@",field]]];
332-
i++;
307+
if ([tempSql containsString:@"*"]) {
308+
if ([tempSql containsString:Paintinglite_Sqlite3_WHERE]) {
309+
tableName = [[[sql componentsSeparatedByString:[NSString stringWithFormat:@" %@",Paintinglite_Sqlite3_WHERE]][0] componentsSeparatedByString:Paintinglite_Sqlite3_SPACE]lastObject];
310+
tableInfoStr = [NSString stringWithFormat:@"%@",[self getTableInfo:ppDb tableName:tableName]];
311+
}else if([tempSql containsString:Paintinglite_Sqlite3_ORDER]){
312+
tableName = [[[sql componentsSeparatedByString:[NSString stringWithFormat:@" %@",Paintinglite_Sqlite3_ORDER]][0] componentsSeparatedByString:Paintinglite_Sqlite3_SPACE]lastObject];
313+
tableInfoStr = [NSString stringWithFormat:@"%@",[self getTableInfo:ppDb tableName:tableName]];
314+
}else if([tempSql containsString:Paintinglite_Sqlite3_LIMIT]){
315+
tableName = [[[sql componentsSeparatedByString:[NSString stringWithFormat:@" %@",Paintinglite_Sqlite3_LIMIT]][0] componentsSeparatedByString:Paintinglite_Sqlite3_SPACE]lastObject];
316+
tableInfoStr = [NSString stringWithFormat:@"%@",[self getTableInfo:ppDb tableName:tableName]];
317+
}else{
318+
tableName = [[sql componentsSeparatedByString:Paintinglite_Sqlite3_SPACE]lastObject];
319+
tableInfoStr = [NSString stringWithFormat:@"%@",[self getTableInfo:ppDb tableName:tableName]];
320+
}
321+
322+
//去除换行和空格
323+
tableInfoStr = [[tableInfoStr stringByReplacingOccurrencesOfString:@"\n" withString:@""] stringByReplacingOccurrencesOfString:Paintinglite_Sqlite3_SPACE withString:@""];
324+
tableInfoStr = [tableInfoStr substringWithRange:NSMakeRange(1, tableInfoStr.length - 2)];
325+
326+
//SELECT name,age FROM user
327+
//每一个数组增加user.
328+
NSString *str = [NSString stringWithFormat:@"%@.",tableName];
329+
NSString *resStr = [NSString string];
330+
331+
NSUInteger i = 0;
332+
NSArray<NSString*> *tableInfoArray = [tableInfoStr componentsSeparatedByString:@","];
333+
for (NSString *field in tableInfoArray) {
334+
resStr = (i == tableInfoArray.count - 1) ? [resStr stringByAppendingString:[NSString stringWithFormat:@"%@ as %@",[str stringByAppendingString:field],[NSString stringWithFormat:@"painting_%@",field]]] : [resStr stringByAppendingString:[NSString stringWithFormat:@"%@ as %@,",[str stringByAppendingString:field],[NSString stringWithFormat:@"painting_%@",field]]];
335+
i++;
336+
}
337+
338+
tempSql = [sql stringByReplacingOccurrencesOfString:@"*" withString:resStr];
333339
}
334340

335-
sql = [sql stringByReplacingOccurrencesOfString:@"*" withString:resStr];
336-
}
341+
dispatch_semaphore_signal(signal);
342+
});
337343

338-
return sql;
344+
dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);
345+
346+
return (sql = tempSql);
339347
}
340348

341349
#pragma mark - 类名执行

Paintinglite/Paintinglite/Paintinglite/PaintingliteObjRuntimeProperty.m

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ + (NSMutableDictionary *)getObjPropertyName:(id)obj{
3535
//属性名称需要处理_
3636
ivarName = [ivarName substringFromIndex:1];
3737

38-
if ([ivarType isEqualToString:@"q"] || [ivarType isEqualToString:@"Q"]) {
38+
if ([ivarType isEqualToString:@"q"] || [ivarType isEqualToString:@"Q"] || [ivarType isEqualToString:[NSString stringWithFormat:@"@\"NSNumber\""]] ) {
3939
ivarType = @"INTEGER";
4040
}else if ([ivarType isEqualToString:[NSString stringWithFormat:@"@\"NSString\""]] || [ivarType isEqualToString:[NSString stringWithFormat:@"@"]]) {
4141
ivarType = @"TEXT";
@@ -81,28 +81,35 @@ + (NSMutableDictionary *)getObjPropertyType:(id)obj{
8181
}
8282

8383
#pragma mark - 属性方法动态赋值
84+
/**
85+
* value: 包含表的结构
86+
*/
8487
+ (id)setObjPropertyValue:(id)obj value:(NSMutableDictionary *)value{
8588
unsigned int count = 0;
8689
obj = [[[obj class] alloc] init];
90+
91+
/* obj属性Ivar */
8792
Ivar *propertyIvar = class_copyIvarList([obj class], &count);
8893

89-
for (unsigned int i = 0; i < count; i++) {
90-
//给ivar赋值value
91-
Ivar ivar = propertyIvar[i];
92-
93-
if (count != [value allKeys].count) {
94-
if (i == [value allKeys].count) {
95-
break;
96-
}
97-
94+
for (unsigned int i = 0; i < [value allKeys].count; i++) {
95+
@autoreleasepool {
96+
//给ivar赋值value
9897
Ivar ivar = propertyIvar[i];
99-
//说明数据库返回的个数和ivar的个数不相同
100-
//寻找匹配的字段,进行赋值,没有的字段采用默认值
101-
if([[[NSString stringWithUTF8String:ivar_getName(ivar)] substringFromIndex:1] isEqualToString:[value allKeys][i]]){
102-
object_setIvar(obj, ivar, [value allValues][i]);
98+
99+
if (count != [value allKeys].count) {
100+
if (i == count) {
101+
break;
102+
}
103+
104+
Ivar ivar = propertyIvar[i];
105+
//说明数据库返回的个数和ivar的个数不相同
106+
//寻找匹配的字段,进行赋值,没有的字段采用默认值
107+
if ([[value allKeys] containsObject:[[NSString stringWithUTF8String:ivar_getName(ivar)] substringFromIndex:1]]) {
108+
object_setIvar(obj, ivar, [value allValues][[[value allKeys] indexOfObject:[[NSString stringWithUTF8String:ivar_getName(ivar)] substringFromIndex:1]]]);
109+
}
110+
}else{
111+
object_setIvar(obj, ivar, [value allValues][[[value allKeys] indexOfObject:[[NSString stringWithUTF8String:ivar_getName(ivar)] substringFromIndex:1]]]);
103112
}
104-
}else{
105-
object_setIvar(obj, ivar, [value allValues][i]);
106113
}
107114
}
108115

Paintinglite/Paintinglite/Paintinglite/PaintingliteSecurity.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,6 @@ NS_ASSUME_NONNULL_BEGIN
2020
+ (NSData *)SecurityDecodeBase64:(NSData *)data;
2121
+ (NSString *)StringWithDecodeSecurityBase64:(NSString *)baseStr;
2222

23-
/* 拆分NSData */
24-
//+ (void)dataSplite:(NSString *__nonnull)filePath;
25-
2623
@end
2724

2825
NS_ASSUME_NONNULL_END

0 commit comments

Comments
 (0)