PageRenderTime 38ms CodeModel.GetById 14ms app.highlight 22ms RepoModel.GetById 1ms app.codeStats 0ms

/MapView/Map/FMDB/FMDatabaseAdditions.m

http://github.com/route-me/route-me
Objective C | 114 lines | 65 code | 26 blank | 23 comment | 3 complexity | 447833b3ceab8dbc60b16a78f7323c26 MD5 | raw file
  1//
  2//  FMDatabaseAdditions.m
  3//  fmkit
  4//
  5//  Created by August Mueller on 10/30/05.
  6//  Copyright 2005 Flying Meat Inc.. All rights reserved.
  7//
  8
  9#import "FMDatabase.h"
 10#import "FMDatabaseAdditions.h"
 11
 12@implementation FMDatabase (FMDatabaseAdditions)
 13
 14#define RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(type, sel)             \
 15va_list args;                                                        \
 16va_start(args, query);                                               \
 17FMResultSet *resultSet = [self executeQuery:query withArgumentsInArray:0x00 orVAList:args];   \
 18va_end(args);                                                        \
 19if (![resultSet next]) { return (type)0; }                           \
 20type ret = [resultSet sel:0];                                        \
 21[resultSet close];                                                   \
 22[resultSet setParentDB:nil];                                         \
 23return ret;
 24
 25
 26- (NSString*)stringForQuery:(NSString*)query, ...; {
 27    RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(NSString *, stringForColumnIndex);
 28}
 29
 30- (int)intForQuery:(NSString*)query, ...; {
 31    RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(int, intForColumnIndex);
 32}
 33
 34- (long)longForQuery:(NSString*)query, ...; {
 35    RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(long, longForColumnIndex);
 36}
 37
 38- (BOOL)boolForQuery:(NSString*)query, ...; {
 39    RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(BOOL, boolForColumnIndex);
 40}
 41
 42- (double)doubleForQuery:(NSString*)query, ...; {
 43    RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(double, doubleForColumnIndex);
 44}
 45
 46- (NSData*)dataForQuery:(NSString*)query, ...; {
 47    RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(NSData *, dataForColumnIndex);
 48}
 49
 50- (NSDate*)dateForQuery:(NSString*)query, ...; {
 51    RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(NSDate *, dateForColumnIndex);
 52}
 53
 54
 55//check if table exist in database (patch from OZLB)
 56- (BOOL)tableExists:(NSString*)tableName {
 57    
 58    BOOL returnBool;
 59    //lower case table name
 60    tableName = [tableName lowercaseString];
 61    //search in sqlite_master table if table exists
 62    FMResultSet *rs = [self executeQuery:@"select [sql] from sqlite_master where [type] = 'table' and lower(name) = ?", tableName];
 63    //if at least one next exists, table exists
 64    returnBool = [rs next];
 65    //close and free object
 66    [rs close];
 67    
 68    return returnBool;
 69}
 70
 71//get table with list of tables: result colums: type[STRING], name[STRING],tbl_name[STRING],rootpage[INTEGER],sql[STRING]
 72//check if table exist in database  (patch from OZLB)
 73- (FMResultSet*)getSchema {
 74    
 75    //result colums: type[STRING], name[STRING],tbl_name[STRING],rootpage[INTEGER],sql[STRING]
 76    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"];
 77    
 78    return rs;
 79}
 80
 81//get table schema: result colums: cid[INTEGER], name,type [STRING], notnull[INTEGER], dflt_value[],pk[INTEGER]
 82- (FMResultSet*)getTableSchema:(NSString*)tableName {
 83    
 84    //result colums: cid[INTEGER], name,type [STRING], notnull[INTEGER], dflt_value[],pk[INTEGER]
 85    FMResultSet *rs = [self executeQuery:[NSString stringWithFormat: @"PRAGMA table_info(%@)", tableName]];
 86    
 87    return rs;
 88}
 89
 90
 91//check if column exist in table
 92- (BOOL)columnExists:(NSString*)tableName columnName:(NSString*)columnName {
 93    
 94    BOOL returnBool = NO;
 95    //lower case table name
 96    tableName = [tableName lowercaseString];
 97    //lower case column name
 98    columnName = [columnName lowercaseString];
 99    //get table schema
100    FMResultSet *rs = [self getTableSchema: tableName];
101    //check if column is present in table schema
102    while ([rs next]) {
103        if ([[[rs stringForColumn:@"name"] lowercaseString] isEqualToString: columnName]) {
104            returnBool = YES;
105            break;
106        }
107    }
108    //close and free object
109    [rs close];
110    
111    return returnBool;
112}
113
114@end