-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathFMDatabase+InOperator.m
More file actions
95 lines (78 loc) · 3.68 KB
/
FMDatabase+InOperator.m
File metadata and controls
95 lines (78 loc) · 3.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
//
// FMDatabase+InOperator.m
// zoziapps.ch
//
// Created by Stefan Pauwels on 06.10.15.
//
//
#import "FMDatabase+InOperator.h"
@implementation FMDatabase (InOperator)
- (BOOL)executeUpdateWithInOperator:(NSString *)sql, ... {
va_list args;
va_start(args, sql);
NSMutableArray *newArguments = [NSMutableArray array];
NSMutableString *newSql = [sql mutableCopy];
NSUInteger currentLocation = 0;
while (currentLocation != NSNotFound) {
NSRange currentRange = NSMakeRange(currentLocation, sql.length - currentLocation);
NSRange questRange = [sql rangeOfString:@"?" options:nil range:currentRange];
NSRange squBrakQuestRange = [sql rangeOfString:@"[?]" options:nil range:currentRange];
if (squBrakQuestRange.location != NSNotFound && squBrakQuestRange.location < questRange.location) {
NSArray *arg = va_arg(args, NSArray*);
if (![arg isKindOfClass:[NSArray class]]) {
NSLog(@"Error: Object bound to `[?]` is not an NSArray in the query (%@) (executeUpdateWithInOperator)", sql);
return NO;
}
currentLocation = squBrakQuestRange.location + squBrakQuestRange.length;
[newArguments addObjectsFromArray:arg];
NSMutableString *replacement = [NSMutableString stringWithString:@"?"];
for (int i = 1; i < [arg count]; i++) {
[replacement appendString:@",?"];
}
[newSql replaceCharactersInRange:squBrakQuestRange withString:replacement];
} else if (questRange.location != NSNotFound) {
id arg = va_arg(args, id);
currentLocation = questRange.location + questRange.length;
[newArguments addObject:arg];
} else {
currentLocation = NSNotFound;
}
}
va_end(args);
return [self executeUpdate:newSql withArgumentsInArray:newArguments];
}
- (FMResultSet *)executeQueryWithInOperator:(NSString *)sql, ... {
va_list args;
va_start(args, sql);
NSMutableArray *newArguments = [NSMutableArray array];
NSMutableString *newSql = [sql mutableCopy];
NSUInteger currentLocation = 0;
while (currentLocation != NSNotFound) {
NSRange currentRange = NSMakeRange(currentLocation, sql.length - currentLocation);
NSRange questRange = [sql rangeOfString:@"?" options:nil range:currentRange];
NSRange squBrakQuestRange = [sql rangeOfString:@"[?]" options:nil range:currentRange];
if (squBrakQuestRange.location != NSNotFound && squBrakQuestRange.location < questRange.location) {
NSArray *arg = va_arg(args, NSArray*);
if (![arg isKindOfClass:[NSArray class]]) {
NSLog(@"Error: Object bound to `[?]` is not an NSArray in the query (%@) (executeQueryWithInOperator)", sql);
return nil;
}
currentLocation = squBrakQuestRange.location + squBrakQuestRange.length;
[newArguments addObjectsFromArray:arg];
NSMutableString *replacement = [NSMutableString stringWithString:@"?"];
for (int i = 1; i < [arg count]; i++) {
[replacement appendString:@",?"];
}
[newSql replaceCharactersInRange:squBrakQuestRange withString:replacement];
} else if (questRange.location != NSNotFound) {
id arg = va_arg(args, id);
currentLocation = questRange.location + questRange.length;
[newArguments addObject:arg];
} else {
currentLocation = NSNotFound;
}
}
va_end(args);
return [self executeQuery:newSql withArgumentsInArray:newArguments];
}
@end