| // |
| // FMDatabaseAdditions.m |
| // fmkit |
| // |
| // Created by August Mueller on 10/30/05. |
| // Copyright 2005 Flying Meat Inc.. All rights reserved. |
| // |
| |
| #import "FMDatabase.h" |
| #import "FMDatabaseAdditions.h" |
| |
| @implementation FMDatabase (FMDatabaseAdditions) |
| |
| #define RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(type, sel) \ |
| va_list args; \ |
| va_start(args, query); \ |
| FMResultSet *resultSet = [self executeQuery:query withArgumentsInArray:0x00 orVAList:args]; \ |
| va_end(args); \ |
| if (![resultSet next]) { return (type)0; } \ |
| type ret = [resultSet sel:0]; \ |
| [resultSet close]; \ |
| [resultSet setParentDB:nil]; \ |
| return ret; |
| |
| |
| - (NSString*)stringForQuery:(NSString*)query, ... { |
| RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(NSString *, stringForColumnIndex); |
| } |
| |
| - (int)intForQuery:(NSString*)query, ... { |
| RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(int, intForColumnIndex); |
| } |
| |
| - (long)longForQuery:(NSString*)query, ... { |
| RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(long, longForColumnIndex); |
| } |
| |
| - (BOOL)boolForQuery:(NSString*)query, ... { |
| RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(BOOL, boolForColumnIndex); |
| } |
| |
| - (double)doubleForQuery:(NSString*)query, ... { |
| RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(double, doubleForColumnIndex); |
| } |
| |
| - (NSData*)dataForQuery:(NSString*)query, ... { |
| RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(NSData *, dataForColumnIndex); |
| } |
| |
| - (NSDate*)dateForQuery:(NSString*)query, ... { |
| RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(NSDate *, dateForColumnIndex); |
| } |
| |
| |
| //check if table exist in database (patch from OZLB) |
| - (BOOL)tableExists:(NSString*)tableName { |
| |
| BOOL returnBool; |
| //lower case table name |
| tableName = [tableName lowercaseString]; |
| //search in sqlite_master table if table exists |
| FMResultSet *rs = [self executeQuery:@"select [sql] from sqlite_master where [type] = 'table' and lower(name) = ?", tableName]; |
| //if at least one next exists, table exists |
| returnBool = [rs next]; |
| //close and free object |
| [rs close]; |
| |
| return returnBool; |
| } |
| |
| //get table with list of tables: result colums: type[STRING], name[STRING],tbl_name[STRING],rootpage[INTEGER],sql[STRING] |
| //check if table exist in database (patch from OZLB) |
| - (FMResultSet*)getSchema { |
| |
| //result colums: type[STRING], name[STRING],tbl_name[STRING],rootpage[INTEGER],sql[STRING] |
| FMResultSet *rs = [self executeQuery:@"SELECT type, name, tbl_name, rootpage, sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE type != 'meta' AND name NOT LIKE 'sqlite_%' ORDER BY tbl_name, type DESC, name"]; |
| |
| return rs; |
| } |
| |
| //get table schema: result colums: cid[INTEGER], name,type [STRING], notnull[INTEGER], dflt_value[],pk[INTEGER] |
| - (FMResultSet*)getTableSchema:(NSString*)tableName { |
| |
| //result colums: cid[INTEGER], name,type [STRING], notnull[INTEGER], dflt_value[],pk[INTEGER] |
| FMResultSet *rs = [self executeQuery:[NSString stringWithFormat: @"PRAGMA table_info(%@)", tableName]]; |
| |
| return rs; |
| } |
| |
| |
| //check if column exist in table |
| - (BOOL)columnExists:(NSString*)tableName columnName:(NSString*)columnName { |
| |
| BOOL returnBool = NO; |
| //lower case table name |
| tableName = [tableName lowercaseString]; |
| //lower case column name |
| columnName = [columnName lowercaseString]; |
| //get table schema |
| FMResultSet *rs = [self getTableSchema: tableName]; |
| //check if column is present in table schema |
| while ([rs next]) { |
| if ([[[rs stringForColumn:@"name"] lowercaseString] isEqualToString: columnName]) { |
| returnBool = YES; |
| break; |
| } |
| } |
| //close and free object |
| [rs close]; |
| |
| return returnBool; |
| } |
| |
| @end |