2024-11-08 21:52:53 -08:00

181 lines
5.2 KiB
Objective-C
Executable File

//
// FMDatabase+QSKit.m
// RSDatabase
//
// Created by Brent Simmons on 3/3/14.
// Copyright (c) 2014 Ranchero Software, LLC. All rights reserved.
//
#import "FMDatabase+RSExtras.h"
#import "NSString+RSDatabase.h"
#define LOG_SQL 0
static void logSQL(NSString *sql) {
#if LOG_SQL
NSLog(@"sql: %@", sql);
#endif
}
@implementation FMDatabase (RSExtras)
#pragma mark - Deleting
- (BOOL)rs_deleteRowsWhereKey:(NSString *)key inValues:(NSArray *)values tableName:(NSString *)tableName {
if ([values count] < 1) {
return YES;
}
NSString *placeholders = [NSString rs_SQLValueListWithPlaceholders:values.count];
NSString *sql = [NSString stringWithFormat:@"delete from %@ where %@ in %@", tableName, key, placeholders];
logSQL(sql);
return [self executeUpdate:sql withArgumentsInArray:values];
}
- (BOOL)rs_deleteRowsWhereKey:(NSString *)key equalsValue:(id)value tableName:(NSString *)tableName {
NSString *sql = [NSString stringWithFormat:@"delete from %@ where %@ = ?", tableName, key];
logSQL(sql);
return [self executeUpdate:sql, value];
}
#pragma mark - Selecting
- (FMResultSet *)rs_selectRowsWhereKey:(NSString *)key inValues:(NSArray *)values tableName:(NSString *)tableName {
NSMutableString *sql = [NSMutableString stringWithFormat:@"select * from %@ where %@ in ", tableName, key];
NSString *placeholders = [NSString rs_SQLValueListWithPlaceholders:values.count];
[sql appendString:placeholders];
logSQL(sql);
return [self executeQuery:sql withArgumentsInArray:values];
}
- (FMResultSet *)rs_selectRowsWhereKey:(NSString *)key equalsValue:(id)value tableName:(NSString *)tableName {
NSString *sql = [NSMutableString stringWithFormat:@"select * from %@ where %@ = ?", tableName, key];
logSQL(sql);
return [self executeQuery:sql, value];
}
- (FMResultSet *)rs_selectSingleRowWhereKey:(NSString *)key equalsValue:(id)value tableName:(NSString *)tableName {
NSString *sql = [NSMutableString stringWithFormat:@"select * from %@ where %@ = ? limit 1", tableName, key];
logSQL(sql);
return [self executeQuery:sql, value];
}
- (FMResultSet *)rs_selectAllRows:(NSString *)tableName {
NSString *sql = [NSString stringWithFormat:@"select * from %@", tableName];
logSQL(sql);
return [self executeQuery:sql];
}
- (FMResultSet *)rs_selectColumnWithKey:(NSString *)key tableName:(NSString *)tableName {
NSString *sql = [NSString stringWithFormat:@"select %@ from %@", key, tableName];
logSQL(sql);
return [self executeQuery:sql];
}
- (BOOL)rs_rowExistsWithValue:(id)value forKey:(NSString *)key tableName:(NSString *)tableName {
NSString *sql = [NSString stringWithFormat:@"select 1 from %@ where %@ = ? limit 1;", tableName, key];
logSQL(sql);
FMResultSet *rs = [self executeQuery:sql, value];
return [rs next];
}
- (BOOL)rs_tableIsEmpty:(NSString *)tableName {
NSString *sql = [NSString stringWithFormat:@"select 1 from %@ limit 1;", tableName];
logSQL(sql);
FMResultSet *rs = [self executeQuery:sql];
BOOL isEmpty = YES;
while ([rs next]) {
isEmpty = NO;
}
return isEmpty;
}
#pragma mark - Updating
- (BOOL)rs_updateRowsWithDictionary:(NSDictionary *)d whereKey:(NSString *)key equalsValue:(id)value tableName:(NSString *)tableName {
return [self rs_updateRowsWithDictionary:d whereKey:key inValues:@[value] tableName:tableName];
}
- (BOOL)rs_updateRowsWithDictionary:(NSDictionary *)d whereKey:(NSString *)key inValues:(NSArray *)keyValues tableName:(NSString *)tableName {
NSMutableArray *keys = [NSMutableArray new];
NSMutableArray *values = [NSMutableArray new];
[d enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
[keys addObject:key];
[values addObject:obj];
}];
NSString *keyPlaceholders = [NSString rs_SQLKeyPlaceholderPairsWithKeys:keys];
NSString *keyValuesPlaceholder = [NSString rs_SQLValueListWithPlaceholders:keyValues.count];
NSString *sql = [NSString stringWithFormat:@"update %@ set %@ where %@ in %@", tableName, keyPlaceholders, key, keyValuesPlaceholder];
NSMutableArray *parameters = values;
[parameters addObjectsFromArray:keyValues];
logSQL(sql);
return [self executeUpdate:sql withArgumentsInArray:parameters];
}
- (BOOL)rs_updateRowsWithValue:(id)value valueKey:(NSString *)valueKey whereKey:(NSString *)key inValues:(NSArray *)keyValues tableName:(NSString *)tableName {
NSDictionary *d = @{valueKey: value};
return [self rs_updateRowsWithDictionary:d whereKey:key inValues:keyValues tableName:tableName];
}
#pragma mark - Saving
- (BOOL)rs_insertRowWithDictionary:(NSDictionary *)d insertType:(RSDatabaseInsertType)insertType tableName:(NSString *)tableName {
NSArray *keys = d.allKeys;
NSArray *values = [d objectsForKeys:keys notFoundMarker:[NSNull null]];
NSString *sqlKeysList = [NSString rs_SQLKeysListWithArray:keys];
NSString *placeholders = [NSString rs_SQLValueListWithPlaceholders:values.count];
NSString *sqlBeginning = @"insert into ";
if (insertType == RSDatabaseInsertOrReplace) {
sqlBeginning = @"insert or replace into ";
}
else if (insertType == RSDatabaseInsertOrIgnore) {
sqlBeginning = @"insert or ignore into ";
}
NSString *sql = [NSString stringWithFormat:@"%@ %@ %@ values %@", sqlBeginning, tableName, sqlKeysList, placeholders];
logSQL(sql);
return [self executeUpdate:sql withArgumentsInArray:values];
}
@end