Prechádzať zdrojové kódy

Code cleanup, and renamed a method back to what it prevously was, since I don't want to break any existing code.

August Mueller 14 rokov pred
rodič
commit
ee222a9a15
5 zmenil súbory, kde vykonal 219 pridanie a 206 odobranie
  1. 4 4
      CHANGES_AND_TODO_LIST.txt
  2. 180 168
      src/FMDatabase.m
  3. 31 29
      src/FMDatabaseAdditions.m
  4. 2 2
      src/FMResultSet.h
  5. 2 3
      src/FMResultSet.m

+ 4 - 4
CHANGES_AND_TODO_LIST.txt

@@ -4,10 +4,10 @@ Zip, nada, zilch.  Got any ideas?
 If you would like to contribute some code- awesome!  I just ask that you make it conform to the coding conventions already set in here, and to add a couple of tests for your new code to fmdb.m.  And of course, the code should be of general use to more than just a couple of folks.  Send your patches to gus@flyingmeat.com.
 
 2011.04.09
-	Added a method to validate a SQL statement
-	Added a method to retrieve the number of columns in a result set
-	Renamed "objectForColumnName:" to "objectForColumn:"
-	Added two methods to execute queries and updates with NSString-style format specifiers
+	Added a method to validate a SQL statement.
+	Added a method to retrieve the number of columns in a result set.
+	Added two methods to execute queries and updates with NSString-style format specifiers.
+    Thanks to Dave DeLong for the patches!
 
 2011.03.12
 	Added compatibility with garbage collection.

+ 180 - 168
src/FMDatabase.m

@@ -9,31 +9,31 @@ + (id)databaseWithPath:(NSString*)aPath {
 
 - (id)initWithPath:(NSString*)aPath {
     self = [super init];
-	
+    
     if (self) {
         databasePath        = [aPath copy];
-		openResultSets      = [[NSMutableSet alloc] init];
+        openResultSets      = [[NSMutableSet alloc] init];
         db                  = 0x00;
         logsErrors          = 0x00;
         crashOnErrors       = 0x00;
         busyRetryTimeout    = 0x00;
     }
-	
-	return self;
+    
+    return self;
 }
 
 - (void)finalize {
-	[self close];
-	[super finalize];
+    [self close];
+    [super finalize];
 }
 
 - (void)dealloc {
-	[self close];
+    [self close];
     
-	[openResultSets release];
+    [openResultSets release];
     [cachedStatements release];
     [databasePath release];
-	
+    
     [super dealloc];
 }
 
@@ -50,27 +50,27 @@ - (sqlite3*)sqliteHandle {
 }
 
 - (BOOL)open {
-	if (db) {
-		return YES;
-	}
-	
-	int err = sqlite3_open((databasePath ? [databasePath fileSystemRepresentation] : ":memory:"), &db );
-	if(err != SQLITE_OK) {
+    if (db) {
+        return YES;
+    }
+    
+    int err = sqlite3_open((databasePath ? [databasePath fileSystemRepresentation] : ":memory:"), &db );
+    if(err != SQLITE_OK) {
         NSLog(@"error opening!: %d", err);
-		return NO;
-	}
-	
-	return YES;
+        return NO;
+    }
+    
+    return YES;
 }
 
 #if SQLITE_VERSION_NUMBER >= 3005000
 - (BOOL)openWithFlags:(int)flags {
     int err = sqlite3_open_v2((databasePath ? [databasePath fileSystemRepresentation] : ":memory:"), &db, flags, NULL /* Name of VFS module to use */);
-	if(err != SQLITE_OK) {
-		NSLog(@"error opening!: %d", err);
-		return NO;
-	}
-	return YES;
+    if(err != SQLITE_OK) {
+        NSLog(@"error opening!: %d", err);
+        return NO;
+    }
+    return YES;
 }
 #endif
 
@@ -78,9 +78,9 @@ - (BOOL)openWithFlags:(int)flags {
 - (BOOL)close {
     
     [self clearCachedStatements];
-	[self closeOpenResultSets];
+    [self closeOpenResultSets];
     
-	if (!db) {
+    if (!db) {
         return YES;
     }
     
@@ -105,7 +105,7 @@ - (BOOL)close {
     }
     while (retry);
     
-	db = nil;
+    db = nil;
     return YES;
 }
 
@@ -115,30 +115,30 @@ - (void)clearCachedStatements {
     FMStatement *cachedStmt;
 
     while ((cachedStmt = [e nextObject])) {
-    	[cachedStmt close];
+        [cachedStmt close];
     }
     
     [cachedStatements removeAllObjects];
 }
 
 - (void)closeOpenResultSets {
-	//Copy the set so we don't get mutation errors
-	NSSet *resultSets = [[openResultSets copy] autorelease];
-	
-	NSEnumerator *e = [resultSets objectEnumerator];
-	NSValue *returnedResultSet = nil;
-	
-	while((returnedResultSet = [e nextObject])) {
-		FMResultSet *rs = (FMResultSet *)[returnedResultSet pointerValue];
-		if ([rs respondsToSelector:@selector(close)]) {
-			[rs close];
-		}
-	}
+    //Copy the set so we don't get mutation errors
+    NSSet *resultSets = [[openResultSets copy] autorelease];
+    
+    NSEnumerator *e = [resultSets objectEnumerator];
+    NSValue *returnedResultSet = nil;
+    
+    while((returnedResultSet = [e nextObject])) {
+        FMResultSet *rs = (FMResultSet *)[returnedResultSet pointerValue];
+        if ([rs respondsToSelector:@selector(close)]) {
+            [rs close];
+        }
+    }
 }
 
 - (void)resultSetDidClose:(FMResultSet *)resultSet {
-	NSValue *setValue = [NSValue valueWithNonretainedObject:resultSet];
-	[openResultSets removeObject:setValue];
+    NSValue *setValue = [NSValue valueWithNonretainedObject:resultSet];
+    [openResultSets removeObject:setValue];
 }
 
 - (FMStatement*)cachedStatementForQuery:(NSString*)query {
@@ -243,11 +243,11 @@ - (sqlite_int64)lastInsertRowId {
 }
 
 - (int)changes {
-	if (inUse) {
+    if (inUse) {
         [self compainAboutInUse];
         return 0;
     }
-	
+    
     [self setInUse:YES];
     int ret = sqlite3_changes(db);
     [self setInUse:NO];
@@ -298,97 +298,109 @@ - (void)bindObject:(id)obj toColumn:(int)idx inStatement:(sqlite3_stmt*)pStmt {
 }
 
 - (void)_extractSQL:(NSString *)sql argumentsList:(va_list)args intoString:(NSMutableString *)cleanedSQL arguments:(NSMutableArray *)arguments {
-	NSUInteger length = [sql length];
-	unichar last = '\0';
-	for (NSUInteger i = 0; i < length; ++i) {
-		id arg = nil;
-		unichar current = [sql characterAtIndex:i];
-		unichar add = current;
-		if (last == '%') {
-			switch (current) {
-				case '@':
-					arg = va_arg(args, id); break;
-				case 'c':
-					arg = [NSNumber numberWithChar:va_arg(args, char)]; break;
-				case 's':
-					arg = [NSString stringWithUTF8String:va_arg(args, char*)]; break;
-				case 'd':
-				case 'D':
-				case 'i':
-					arg = [NSNumber numberWithInt:va_arg(args, int)]; break;
-				case 'u':
-				case 'U':
-					arg = [NSNumber numberWithUnsignedInt:va_arg(args, unsigned int)]; break;
-				case 'h':
-					i++;
-					if (i < length && [sql characterAtIndex:i] == 'i') {
-						arg = [NSNumber numberWithShort:va_arg(args, short)];
-					} else if (i < length && [sql characterAtIndex:i] == 'u') {
-						arg = [NSNumber numberWithUnsignedShort:va_arg(args, unsigned short)];
-					} else {
-						i--;
-					}
-					break;
-				case 'q':
-					i++;
-					if (i < length && [sql characterAtIndex:i] == 'i') {
-						arg = [NSNumber numberWithLongLong:va_arg(args, long long)];
-					} else if (i < length && [sql characterAtIndex:i] == 'u') {
-						arg = [NSNumber numberWithUnsignedLongLong:va_arg(args, unsigned long long)];
-					} else {
-						i--;
-					}
-					break;
-				case 'f':
-					arg = [NSNumber numberWithDouble:va_arg(args, double)]; break;
-				case 'g':
-					arg = [NSNumber numberWithFloat:va_arg(args, float)]; break;
-				case 'l':
-					i++;
-					if (i < length) {
-						unichar next = [sql characterAtIndex:i];
-						if (next == 'l') {
-							i++;
-							if (i < length && [sql characterAtIndex:i] == 'd') {
-								//%lld
-								arg = [NSNumber numberWithLongLong:va_arg(args, long long)];
-							} else if (i < length && [sql characterAtIndex:i] == 'u') {
-								//%llu
-								arg = [NSNumber numberWithUnsignedLongLong:va_arg(args, unsigned long long)];
-							} else {
-								i--;
-							}
-						} else if (next == 'd') {
-							//%ld
-							arg = [NSNumber numberWithLong:va_arg(args, long)];
-						} else if (next == 'u') {
-							//%lu
-							arg = [NSNumber numberWithUnsignedLong:va_arg(args, unsigned long)];
-						} else {
-							i--;
-						}
-					} else {
-						i--;
-					}
-					break;
-				default:
-					// something else that we can't interpret. just pass it on through like normal
-					break;
-			}
-		} else if (current == '%') {
-			// percent sign; skip this character
-			add = '\0';
-		}
-		
-		if (arg != nil) {
-			[cleanedSQL appendString:@"?"];
-			[arguments addObject:arg];
-		} else if (add != '\0') {
-			[cleanedSQL appendFormat:@"%C", add];
-		}
-		last = current;
-	}
-	
+    NSUInteger length = [sql length];
+    unichar last = '\0';
+    for (NSUInteger i = 0; i < length; ++i) {
+        id arg = nil;
+        unichar current = [sql characterAtIndex:i];
+        unichar add = current;
+        if (last == '%') {
+            switch (current) {
+                case '@':
+                    arg = va_arg(args, id); break;
+                case 'c':
+                    arg = [NSNumber numberWithChar:va_arg(args, char)]; break;
+                case 's':
+                    arg = [NSString stringWithUTF8String:va_arg(args, char*)]; break;
+                case 'd':
+                case 'D':
+                case 'i':
+                    arg = [NSNumber numberWithInt:va_arg(args, int)]; break;
+                case 'u':
+                case 'U':
+                    arg = [NSNumber numberWithUnsignedInt:va_arg(args, unsigned int)]; break;
+                case 'h':
+                    i++;
+                    if (i < length && [sql characterAtIndex:i] == 'i') {
+                        arg = [NSNumber numberWithShort:va_arg(args, short)];
+                    }
+                    else if (i < length && [sql characterAtIndex:i] == 'u') {
+                        arg = [NSNumber numberWithUnsignedShort:va_arg(args, unsigned short)];
+                    }
+                    else {
+                        i--;
+                    }
+                    break;
+                case 'q':
+                    i++;
+                    if (i < length && [sql characterAtIndex:i] == 'i') {
+                        arg = [NSNumber numberWithLongLong:va_arg(args, long long)];
+                    }
+                    else if (i < length && [sql characterAtIndex:i] == 'u') {
+                        arg = [NSNumber numberWithUnsignedLongLong:va_arg(args, unsigned long long)];
+                    }
+                    else {
+                        i--;
+                    }
+                    break;
+                case 'f':
+                    arg = [NSNumber numberWithDouble:va_arg(args, double)]; break;
+                case 'g':
+                    arg = [NSNumber numberWithFloat:va_arg(args, float)]; break;
+                case 'l':
+                    i++;
+                    if (i < length) {
+                        unichar next = [sql characterAtIndex:i];
+                        if (next == 'l') {
+                            i++;
+                            if (i < length && [sql characterAtIndex:i] == 'd') {
+                                //%lld
+                                arg = [NSNumber numberWithLongLong:va_arg(args, long long)];
+                            }
+                            else if (i < length && [sql characterAtIndex:i] == 'u') {
+                                //%llu
+                                arg = [NSNumber numberWithUnsignedLongLong:va_arg(args, unsigned long long)];
+                            }
+                            else {
+                                i--;
+                            }
+                        }
+                        else if (next == 'd') {
+                            //%ld
+                            arg = [NSNumber numberWithLong:va_arg(args, long)];
+                        }
+                        else if (next == 'u') {
+                            //%lu
+                            arg = [NSNumber numberWithUnsignedLong:va_arg(args, unsigned long)];
+                        }
+                        else {
+                            i--;
+                        }
+                    }
+                    else {
+                        i--;
+                    }
+                    break;
+                default:
+                    // something else that we can't interpret. just pass it on through like normal
+                    break;
+            }
+        }
+        else if (current == '%') {
+            // percent sign; skip this character
+            add = '\0';
+        }
+        
+        if (arg != nil) {
+            [cleanedSQL appendString:@"?"];
+            [arguments addObject:arg];
+        }
+        else if (add != '\0') {
+            [cleanedSQL appendFormat:@"%C", add];
+        }
+        last = current;
+    }
+    
 }
 
 - (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray*)arrayArgs orVAList:(va_list)args {
@@ -500,8 +512,8 @@ - (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray*)arr
     // the statement gets closed in rs's dealloc or [rs close];
     rs = [FMResultSet resultSetWithStatement:statement usingParentDatabase:self];
     [rs setQuery:sql];
-	NSValue *openResultSet = [NSValue valueWithNonretainedObject:rs];
-	[openResultSets addObject:openResultSet];
+    NSValue *openResultSet = [NSValue valueWithNonretainedObject:rs];
+    [openResultSets addObject:openResultSet];
     
     statement.useCount = statement.useCount + 1;
     
@@ -523,16 +535,16 @@ - (FMResultSet *)executeQuery:(NSString*)sql, ... {
 }
 
 - (FMResultSet *)executeQueryWithFormat:(NSString*)format, ... {
-	va_list args;
-	va_start(args, format);
-	
-	NSMutableString *sql = [NSMutableString stringWithCapacity:[format length]];
-	NSMutableArray *arguments = [NSMutableArray array];
-	[self _extractSQL:format argumentsList:args intoString:sql arguments:arguments];	
-	
-	va_end(args);
-	
-	return [self executeQuery:sql withArgumentsInArray:arguments];
+    va_list args;
+    va_start(args, format);
+    
+    NSMutableString *sql = [NSMutableString stringWithCapacity:[format length]];
+    NSMutableArray *arguments = [NSMutableArray array];
+    [self _extractSQL:format argumentsList:args intoString:sql arguments:arguments];    
+    
+    va_end(args);
+    
+    return [self executeQuery:sql withArgumentsInArray:arguments];
 }
 
 - (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments {
@@ -540,7 +552,7 @@ - (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)ar
 }
 
 - (BOOL)executeUpdate:(NSString*)sql error:(NSError**)outErr withArgumentsInArray:(NSArray*)arrayArgs orVAList:(va_list)args {
-	
+    
     if (inUse) {
         [self compainAboutInUse];
         return NO;
@@ -650,12 +662,12 @@ - (BOOL)executeUpdate:(NSString*)sql error:(NSError**)outErr withArgumentsInArra
             // this will happen if the db is locked, like if we are doing an update or insert.
             // in that case, retry the step... and maybe wait just 10 milliseconds.
             retry = YES;
-			if (SQLITE_LOCKED == rc) {
-				rc = sqlite3_reset(pStmt);
-				if (rc != SQLITE_LOCKED) {
-					NSLog(@"Unexpected result from sqlite3_reset (%d) eu", rc);
-				}
-			}
+            if (SQLITE_LOCKED == rc) {
+                rc = sqlite3_reset(pStmt);
+                if (rc != SQLITE_LOCKED) {
+                    NSLog(@"Unexpected result from sqlite3_reset (%d) eu", rc);
+                }
+            }
             usleep(20);
             
             if (busyRetryTimeout && (numberOfRetries++ > busyRetryTimeout)) {
@@ -731,16 +743,16 @@ - (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments {
 }
 
 - (BOOL)executeUpdateWithFormat:(NSString*)format, ... {
-	va_list args;
-	va_start(args, format);
-	
-	NSMutableString *sql = [NSMutableString stringWithCapacity:[format length]];
-	NSMutableArray *arguments = [NSMutableArray array];
-	[self _extractSQL:format argumentsList:args intoString:sql arguments:arguments];	
-	
-	va_end(args);
-	
-	return [self executeUpdate:sql withArgumentsInArray:arguments];
+    va_list args;
+    va_start(args, format);
+    
+    NSMutableString *sql = [NSMutableString stringWithCapacity:[format length]];
+    NSMutableArray *arguments = [NSMutableArray array];
+    [self _extractSQL:format argumentsList:args intoString:sql arguments:arguments];    
+    
+    va_end(args);
+    
+    return [self executeUpdate:sql withArgumentsInArray:arguments];
 }
 
 - (BOOL)update:(NSString*)sql error:(NSError**)outErr bind:(id)bindArgs, ... {
@@ -873,14 +885,14 @@ - (void)setCachedStatements:(NSMutableDictionary *)value {
 @implementation FMStatement
 
 - (void)finalize {
-	[self close];
-	[super finalize];
+    [self close];
+    [super finalize];
 }
 
 - (void)dealloc {
-	[self close];
+    [self close];
     [query release];
-	[super dealloc];
+    [super dealloc];
 }
 
 

+ 31 - 29
src/FMDatabaseAdditions.m

@@ -112,37 +112,39 @@ - (BOOL)columnExists:(NSString*)tableName columnName:(NSString*)columnName {
 }
 
 - (BOOL)validateSQL:(NSString*)sql error:(NSError**)error {
-	sqlite3_stmt *pStmt = NULL;
-	BOOL validationSucceeded = YES;
-	BOOL keepTrying = YES;
+    sqlite3_stmt *pStmt = NULL;
+    BOOL validationSucceeded = YES;
+    BOOL keepTrying = YES;
     int numberOfRetries = 0;
-	
+    
     [self setInUse:YES];
-	while (keepTrying == YES) {
-		keepTrying = NO;
-		int rc = sqlite3_prepare_v2(db, [sql UTF8String], -1, &pStmt, 0);
-		if (rc == SQLITE_BUSY || rc == SQLITE_LOCKED) {
-			keepTrying = YES;
-			usleep(20);
-			
-			if (busyRetryTimeout && (numberOfRetries++ > busyRetryTimeout)) {
-				NSLog(@"%s:%d Database busy (%@)", __FUNCTION__, __LINE__, [self databasePath]);
-				NSLog(@"Database busy");
-			}			
-		} else if (rc != SQLITE_OK) {
-			validationSucceeded = NO;
-			if (error) {
-				*error = [NSError errorWithDomain:NSCocoaErrorDomain 
-											 code:[self lastErrorCode]
-										 userInfo:[NSDictionary dictionaryWithObject:[self lastErrorMessage] 
-																			  forKey:NSLocalizedDescriptionKey]];
-			}
-		}
-	}
-	[self setInUse:NO];
-	sqlite3_finalize(pStmt);
-	
-	return validationSucceeded;
+    while (keepTrying == YES) {
+        keepTrying = NO;
+        int rc = sqlite3_prepare_v2(db, [sql UTF8String], -1, &pStmt, 0);
+        if (rc == SQLITE_BUSY || rc == SQLITE_LOCKED) {
+            keepTrying = YES;
+            usleep(20);
+            
+            if (busyRetryTimeout && (numberOfRetries++ > busyRetryTimeout)) {
+                NSLog(@"%s:%d Database busy (%@)", __FUNCTION__, __LINE__, [self databasePath]);
+                NSLog(@"Database busy");
+            }          
+        } 
+        else if (rc != SQLITE_OK) {
+            validationSucceeded = NO;
+            if (error) {
+                *error = [NSError errorWithDomain:NSCocoaErrorDomain 
+                                             code:[self lastErrorCode]
+                                         userInfo:[NSDictionary dictionaryWithObject:[self lastErrorMessage] 
+                                                                              forKey:NSLocalizedDescriptionKey]];
+            }
+        }
+    }
+    
+    [self setInUse:NO];
+    sqlite3_finalize(pStmt);
+    
+    return validationSucceeded;
 }
 
 @end

+ 2 - 2
src/FMResultSet.h

@@ -41,7 +41,7 @@
 - (BOOL)next;
 - (BOOL)hasAnotherRow;
 
-- (int)numberOfColumns;
+- (int)columnCount;
 
 - (int)columnIndexForName:(NSString*)columnName;
 - (NSString*)columnNameForIndex:(int)columnIdx;
@@ -74,7 +74,7 @@
 - (const unsigned char *)UTF8StringForColumnName:(NSString*)columnName;
 
 // returns one of NSNumber, NSString, NSData, or NSNull
-- (id)objectForColumn:(NSString*)columnName;
+- (id)objectForColumnName:(NSString*)columnName;
 - (id)objectForColumnIndex:(int)columnIdx;
 
 /*

+ 2 - 3
src/FMResultSet.m

@@ -52,7 +52,7 @@ - (void)close {
     parentDB = nil;
 }
 
-- (int)numberOfColumns {
+- (int)columnCount {
 	return sqlite3_column_count(statement.statement);
 }
 
@@ -358,11 +358,10 @@ - (id)objectForColumnIndex:(int)columnIdx {
     return returnValue;
 }
 
-- (id)objectForColumn:(NSString*)columnName {
+- (id)objectForColumnName:(NSString*)columnName {
     return [self objectForColumnIndex:[self columnIndexForName:columnName]];
 }
 
-
 // returns autoreleased NSString containing the name of the column in the result set
 - (NSString*)columnNameForIndex:(int)columnIdx {
     return [NSString stringWithUTF8String: sqlite3_column_name(statement.statement, columnIdx)];