TODO: 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.06.22 Changed some methods to properties. Hello 2011. Added a warning when you try and use a database that wasn't opened. Hacked together based on patches from Drarok Ithaqua. Fixed a problem under GC where leaked statments were keeping a database from closing. Patch from Chris Dolan. Added + (BOOL)isThreadSafe to FMDatabase. It'll let you know if the version of SQLite you are running is compiled with it's thread safe options. THIS DOES NOT MEAN FMDATABASE IS THREAD SAFE. I haven't done a review of it for this case, so I'm just saying. 2011.04.09 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. When an FMDatabase is closed, all open FMResultSets pertaining to that database are also closed. Added: - (id) objectForColumnIndex:(int)columnIdx; - (id) objectForColumnName:(NSString*)columnName; Changes by Dave DeLong. 2011.02.05 The -(int)changes; method on FMDatabase is a bit more robust now, and there's a new static library target. And if a database path is nil, we now open up a :memory: database. Patch from Pascal Pfiffner! 2011.01.13 Happy New Year! Now checking for SQLITE_LOCKED along with SQLITE_BUSY when trying to perform a query. Patch from Jeff Meininger! 2010.12.28 Fixed some compiler warnings (thanks to Casey Fleser!) 2010.11.30 Added and updated some new methods to take NSError** params. Only execute the assertion macros if NS_BLOCK_ASSERTIONS is not set. Patch from David E. Wheeler! 2010.09.19 The signature for FMDatabase's executeQuery* methods now return FMResultSet instead if id. Patch from Augie Fackler! 2010.08.24: Added resultDict to FMResultSet, which returns a dictionary of column values. Thanks to Pascal Pfiffner for the patch! Cleaned up some formatting. 2010.06.21: Changed up FMDatabase's close method to return a boolean, and fixed a compiler warning when compiling in 64bit land. Thanks to Jens Alfke for the patches! 2010.04.04: Added: dateForQuery which works like the other fooForQuery methods. Thanks to Matt Stevens for the patch! 2009.10.18: Added: FMDB now checks for longLongValue in NSNumbers passed for selects or updates, and binds that value to an sqlite int64 Thanks for the patch from Brian Stern! Changed: renamed getDataBaseSchema: to getSchema. It didn't actually use the param. whooops. 2009.10.14: Reworked: - (id)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments; - (BOOL) executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments; These two methods now point to: - (id) executeQuery:(NSString*)sql withArgumentsInArray:(NSArray*)arrayArgs orVAList:(va_list)args; - (BOOL) executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray*)arrayArgs orVAList:(va_list)args; because the vargs were causing headaches in 64bit land, and on the iphone, and it's fragile n' stuff. Added: - (FMResultSet*) getTableSchema:(NSString*)tableName; - (BOOL) columnExists:(NSString*)tableName columnName:(NSString*)columnName; to FMDatabaseAdditions. Patch from OZLB 2009.09.22 Disabled the following FMDatabaseAdditions when compiled as 64 bit: - (id)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments; and - (BOOL) executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments; Since they crash, I just print out a warning now. Got a patch to fix it? Send it to gus@flyingmeat.com Added: - (BOOL) tableExists:(NSString*)tableName; - (FMResultSet*) getDataBaseSchema:(NSString*)tableName; to FMDatabaseAdditions. Patch from OZLB 2009.09.1 Added: - (BOOL) openWithFlags:(int)flags; To FMDatabase, which allows you to open up the database with certain flags for sqlite 3.5+ Thanks to Dan Wright for the addition. 2009.07.17 Added: - (const unsigned char *) UTF8StringForColumnIndex:(int)columnIdx; - (const unsigned char *) UTF8StringForColumnName:(NSString*)columnName; to FMResultSet, patch from Nathan Stitt. 2009.05.23 Added: - (id)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments; - (BOOL) executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments; thanks to code from Phong Long. Fix to FMResultSet's - (BOOL) hadError, as it was returning true for SQLITE_ROW & SQLITE_DONE, which aren't actually errors. Added: - (BOOL) hasAnotherRow; which lets you know if there is another row waiting in the result set. Thanks to code from Dave DeLong. 2009.05.10 replaced sqlite3_prepare calls with sqlite3_prepare_v2, since it's shiny and new. Now making sure not to call any assembly if on the iphone (asm{ trap }). Tested on 10.6. It works. Not that I didn't expect it not to- but you never know… 2009.05.05 stringForColumnIndex, stringForColumn, dataForColumnIndex, dataForColumn, dataNoCopyForColumnIndex, and dataNoCopyForColumn now return nil if a null value was inserted into its table row. dateForColumnIndex already did this. Also added the following methods to test if a column is null or not: - (BOOL) columnIndexIsNull:(int)columnIdx - (BOOL) columnIsNull:(NSString*)columnName And finally, just general code cleanup + refactoring. Happy Cinco de Mayo! 2009.04.27 added columnNameForIndex: to FMResultSet which returns the column name for the given index. 2009.04.12 dateForColumnIndex: now returns null, if a null value was inserted into its table row. Patch by Robbie Hanson. 2009.03.11 Now importing unistd.h, which the absence of was causing some problems on the iPhone. Reported by multiple people, but Hal Mueller actually got me to make the change. 2009.03.03 Added (int)changes; to FMDatabase. From the sqlite docs: "This function returns the number of database rows that were changed (or inserted or deleted) by the most recent SQL statement." Patch contributed by Tracy Harton 2009.01.02 HAPPY NEW YEAR WOOOO! Added dataNoCopyForColumn: and dataNoCopyForColumnIndex: to FMResultSet. If you are going to use this data after you iterate over the next row, or after you close the result set, make sure to make a copy of the data first (or just use dataForColumn/dataForColumnIndex) If you don't, you're going to be in a world of hurt when you try and use the data. 2008.12.29 Some changes to make Clang's static analysis happy (http://clang.llvm.org/StaticAnalysis.html). (patch provided by Matt Comi) 2008.12.14 Added longLongIntForColumn: and longLongIntForColumnIndex: to FMResultSet. (patch provided by Will Cosgrove) 2008.11.20 Added a check for NSNull in bindObject, which works just like passing nil does (patch provided by Robert Tolar Haining) 2008.11.02 Removed the block keeping you from performing updates or selects while going through a result set. 2008.10.30 Some bug fixes + warning fixes from Brian Stern (thanks again Brian!) 2008.10.03 Fixed a crasher in FMResultSet's close where if the parent DB was already released, the result set would be talking to a bad address and fmdb went boom. (thanks to Brian Stern for the patch) 2008.06.06 Thanks to Zach Wily for the return of FMDatabaseAdditions! 2008.06.03: Removed all exceptions, now you should use [db hadError] to check for an error. I hate (ns)exceptions, I'm not sure why I put them in. Moved to google code. Various little cleanup thingies. 2008.07.03 Thanks to Kris Markel for some extra trace outputs, and a fix where the database would be locked if it was too busy. 2008.07.10 Thanks to Daniel Pasco and Bil Moorehead for catching a problem where the column names lookup table was created on every row iteration. Doh! 2008.07.18 FMDatabase will now cache statements if you turn it on using shouldCacheStatements:YES. In theory, this should speed things up. Test it out, let me know if it makes things good for ya. Note: This is pretty new code, so it hasn't gone through a lot of testing... you've been warned. (seems to work though!) 2008.00.01 Fixed a problemo that kept it from compiling for the iPhone (Thanks to Sam Steele for the patch) questions? comments? patches? Send them to gus@flyingmeat.com