<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>plugins/sqlite-fmdb-jstplugin/fixnames.sh</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -4,7 +4,7 @@
 &lt;depends_on path='/System/Library/Frameworks/Foundation.framework'/&gt;
 &lt;depends_on path='/System/Library/Frameworks/AppKit.framework'/&gt;
 &lt;depends_on path='/System/Library/Frameworks/CoreFoundation.framework'/&gt;
-&lt;class name='FMDatabase'&gt;
+&lt;class name='JSTDatabase'&gt;
 &lt;method selector='beginDeferredTransaction'&gt;
 &lt;retval type='B'/&gt;
 &lt;/method&gt;
@@ -32,6 +32,9 @@
 &lt;method selector='executeUpdate:arguments:'&gt;
 &lt;retval type='B'/&gt;
 &lt;/method&gt;
+&lt;method selector='executeUpdate:withArgumentsInArray:'&gt;
+&lt;retval type='B'/&gt;
+&lt;/method&gt;
 &lt;method selector='goodConnection'&gt;
 &lt;retval type='B'/&gt;
 &lt;/method&gt;
@@ -52,6 +55,9 @@
 &lt;method selector='open'&gt;
 &lt;retval type='B'/&gt;
 &lt;/method&gt;
+&lt;method selector='openWithFlags:'&gt;
+&lt;retval type='B'/&gt;
+&lt;/method&gt;
 &lt;method selector='rekey:'&gt;
 &lt;retval type='B'/&gt;
 &lt;/method&gt;
@@ -86,17 +92,29 @@
 &lt;retval type='B'/&gt;
 &lt;/method&gt;
 &lt;method variadic='true' selector='stringForQuery:'/&gt;
+&lt;method selector='tableExists:'&gt;
+&lt;retval type='B'/&gt;
+&lt;/method&gt;
 &lt;method selector='traceExecution'&gt;
 &lt;retval type='B'/&gt;
 &lt;/method&gt;
 &lt;/class&gt;
-&lt;class name='FMResultSet'&gt;
+&lt;class name='JSTResultSet'&gt;
 &lt;method selector='boolForColumn:'&gt;
 &lt;retval type='B'/&gt;
 &lt;/method&gt;
 &lt;method selector='boolForColumnIndex:'&gt;
 &lt;retval type='B'/&gt;
 &lt;/method&gt;
+&lt;method selector='columnIndexIsNull:'&gt;
+&lt;retval type='B'/&gt;
+&lt;/method&gt;
+&lt;method selector='columnIsNull:'&gt;
+&lt;retval type='B'/&gt;
+&lt;/method&gt;
+&lt;method selector='hasAnotherRow'&gt;
+&lt;retval type='B'/&gt;
+&lt;/method&gt;
 &lt;method selector='next'&gt;
 &lt;retval type='B'/&gt;
 &lt;/method&gt;</diff>
      <filename>plugins/sqlite-fmdb-jstplugin/FMDB.bridgesupport</filename>
    </modified>
    <modified>
      <diff>@@ -2,7 +2,7 @@
 #import &quot;sqlite3.h&quot;
 #import &quot;FMResultSet.h&quot;
 
-@interface FMDatabase : NSObject 
+@interface JSTDatabase : NSObject 
 {
 	sqlite3*    db;
 	NSString*   databasePath;
@@ -22,6 +22,9 @@
 - (id)initWithPath:(NSString*)inPath;
 
 - (BOOL) open;
+#if SQLITE_VERSION_NUMBER &gt;= 3005000
+- (BOOL) openWithFlags:(int)flags;
+#endif
 - (void) close;
 - (BOOL) goodConnection;
 - (void) clearCachedStatements;</diff>
      <filename>plugins/sqlite-fmdb-jstplugin/FMDatabase.h</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,10 @@
 #import &quot;FMDatabase.h&quot;
 #import &quot;unistd.h&quot;
 
-@implementation FMDatabase
+@implementation JSTDatabase
 
 + (id)databaseWithPath:(NSString*)aPath {
-    return [[[FMDatabase alloc] initWithPath:aPath] autorelease];
+    return [[[self alloc] initWithPath:aPath] autorelease];
 }
 
 - (id)initWithPath:(NSString*)aPath {
@@ -43,7 +43,7 @@
 }
 
 - (BOOL) open {
-	int err = sqlite3_open( [databasePath fileSystemRepresentation], &amp;db );
+	int err = sqlite3_open([databasePath fileSystemRepresentation], &amp;db );
 	if(err != SQLITE_OK) {
         NSLog(@&quot;error opening!: %d&quot;, err);
 		return NO;
@@ -52,6 +52,18 @@
 	return YES;
 }
 
+#if SQLITE_VERSION_NUMBER &gt;= 3005000
+- (BOOL) openWithFlags:(int)flags {
+    int err = sqlite3_open_v2([databasePath fileSystemRepresentation], &amp;db, flags, NULL /* Name of VFS module to use */);
+	if(err != SQLITE_OK) {
+		NSLog(@&quot;error opening!: %d&quot;, err);
+		return NO;
+	}
+	return YES;
+}
+#endif
+
+
 - (void) close {
     
     [self clearCachedStatements];
@@ -148,7 +160,7 @@
         return NO;
     }
     
-    FMResultSet *rs = [self executeQuery:@&quot;select name from sqlite_master where type='table'&quot;];
+    JSTResultSet *rs = [self executeQuery:@&quot;select name from sqlite_master where type='table'&quot;];
     
     if (rs) {
         [rs close];
@@ -159,10 +171,10 @@
 }
 
 - (void) compainAboutInUse {
-    NSLog(@&quot;The FMDatabase %@ is currently in use.&quot;, self);
+    NSLog(@&quot;The JSTDatabase %@ is currently in use.&quot;, self);
     
     if (crashOnErrors) {
-        NSAssert1(false, @&quot;The FMDatabase %@ is currently in use.&quot;, self);
+        NSAssert1(false, @&quot;The JSTDatabase %@ is currently in use.&quot;, self);
     }
 }
 
@@ -171,7 +183,9 @@
 }
 
 - (BOOL) hadError {
-    return ([self lastErrorCode] != SQLITE_OK);
+    int lastErrCode = [self lastErrorCode];
+    
+    return (lastErrCode &gt; SQLITE_OK &amp;&amp; lastErrCode &lt; SQLITE_ROW);
 }
 
 - (int) lastErrorCode {
@@ -241,7 +255,7 @@
     
     [self setInUse:YES];
     
-    FMResultSet *rs = nil;
+    JSTResultSet *rs = nil;
     
     int rc                  = 0x00;;
     sqlite3_stmt *pStmt     = 0x00;;
@@ -262,7 +276,7 @@
     if (!pStmt) {
         do {
             retry   = NO;
-            rc      = sqlite3_prepare(db, [sql UTF8String], -1, &amp;pStmt, 0);
+            rc      = sqlite3_prepare_v2(db, [sql UTF8String], -1, &amp;pStmt, 0);
             
             if (SQLITE_BUSY == rc) {
                 retry = YES;
@@ -283,9 +297,9 @@
                     NSLog(@&quot;DB Error: %d \&quot;%@\&quot;&quot;, [self lastErrorCode], [self lastErrorMessage]);
                     NSLog(@&quot;DB Query: %@&quot;, sql);
                     if (crashOnErrors) {
-#ifdef __BIG_ENDIAN__
-                        asm{ trap };
-#endif
+//#if defined(__BIG_ENDIAN__) &amp;&amp; !TARGET_IPHONE_SIMULATOR
+//                        asm{ trap };
+//#endif
                         NSAssert2(false, @&quot;DB Error: %d \&quot;%@\&quot;&quot;, [self lastErrorCode], [self lastErrorMessage]);
                     }
                 }
@@ -334,7 +348,7 @@
     }
     
     // the statement gets close in rs's dealloc or [rs close];
-    rs = [FMResultSet resultSetWithStatement:statement usingParentDatabase:self];
+    rs = [JSTResultSet resultSetWithStatement:statement usingParentDatabase:self];
     [rs setQuery:sql];
     
     statement.useCount = statement.useCount + 1;
@@ -386,7 +400,7 @@
         
         do {
             retry   = NO;
-            rc      = sqlite3_prepare(db, [sql UTF8String], -1, &amp;pStmt, 0);
+            rc      = sqlite3_prepare_v2(db, [sql UTF8String], -1, &amp;pStmt, 0);
             if (SQLITE_BUSY == rc) {
                 retry = YES;
                 usleep(20);
@@ -406,9 +420,9 @@
                     NSLog(@&quot;DB Error: %d \&quot;%@\&quot;&quot;, [self lastErrorCode], [self lastErrorMessage]);
                     NSLog(@&quot;DB Query: %@&quot;, sql);
                     if (crashOnErrors) {
-#ifdef __BIG_ENDIAN__
-                        asm{ trap };
-#endif
+//#if defined(__BIG_ENDIAN__) &amp;&amp; !TARGET_IPHONE_SIMULATOR
+//                        asm{ trap };
+//#endif
                         NSAssert2(false, @&quot;DB Error: %d \&quot;%@\&quot;&quot;, [self lastErrorCode], [self lastErrorMessage]);
                     }
                 }</diff>
      <filename>plugins/sqlite-fmdb-jstplugin/FMDatabase.m</filename>
    </modified>
    <modified>
      <diff>@@ -7,7 +7,7 @@
 //
 
 #import &lt;Foundation/Foundation.h&gt;
-@interface FMDatabase (FMDatabaseAdditions)
+@interface JSTDatabase (JSTDatabaseAdditions)
 
 
 - (int) intForQuery:(NSString*)objs, ...;
@@ -21,4 +21,10 @@
 // That would be a bad idea, because we close out the result set, and then what
 // happens to the data that we just didn't copy?  Who knows, not I.
 
+- (id)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments;
+- (BOOL) executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments;
+
+- (BOOL) tableExists:(NSString*)tableName;
+- (JSTResultSet*) getDataBaseSchema:(NSString*)tableName;
+
 @end</diff>
      <filename>plugins/sqlite-fmdb-jstplugin/FMDatabaseAdditions.h</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,5 @@
 //
-//  FMDatabaseAdditions.m
+//  JSTDatabaseAdditions.m
 //  fmkit
 //
 //  Created by August Mueller on 10/30/05.
@@ -9,12 +9,12 @@
 #import &quot;FMDatabase.h&quot;
 #import &quot;FMDatabaseAdditions.h&quot;
 
-@implementation FMDatabase (FMDatabaseAdditions)
+@implementation JSTDatabase (JSTDatabaseAdditions)
 
 #define RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(type, sel)             \
 va_list args;                                                        \
 va_start(args, query);                                               \
-FMResultSet *resultSet = [self executeQuery:query arguments:args];   \
+JSTResultSet *resultSet = [self executeQuery:query arguments:args];   \
 va_end(args);                                                        \
 if (![resultSet next]) { return (type)0; }                           \
 type ret = [resultSet sel:0];                                        \
@@ -48,4 +48,96 @@ return ret;
 }
 
 
+//From Phong Long:
+//sometimes you want to be able generate queries programatically
+//with an arbitrary number of arguments, as well as be able to bind
+//them properly. this method allows you to pass in a query string with any
+//number of ?, then you pass in an appropriate number of objects in an NSArray
+//to executeQuery:arguments:
+
+//this technique is being implemented as described by Matt Gallagher at
+//http://cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html
+
+- (id)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments {
+    
+#ifdef __LP64__
+    
+    NSLog(@&quot;executeQuery:withArgumentsInArray: does not work when compiled as 64 bit&quot;);
+    // got a patch?  send it gus@flyingmeat.com
+    
+    return 0x00;
+    
+#else
+	id returnObject;
+	
+	//also need make sure that everything in arguments is an Obj-C object
+	//or else argList will be the wrong size
+	NSUInteger argumentsCount = [arguments count];
+	char *argList = (char *)malloc(sizeof(id *) * argumentsCount);
+	[arguments getObjects:(id *)argList];
+	
+	returnObject = [self executeQuery:sql arguments:argList];
+	
+	free(argList);
+	
+	return returnObject;
+#endif
+}
+
+- (BOOL) executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments {
+    
+#ifdef __LP64__
+    
+    NSLog(@&quot;executeUpdate:withArgumentsInArray: does not work when compiled as 64 bit&quot;);
+    // got a patch?  send it gus@flyingmeat.com
+    
+    return 0x00;
+    
+#else
+    
+    BOOL returnBool;
+	
+	//also need make sure that everything in arguments is an Obj-C object
+	//or else argList will be the wrong size
+	NSUInteger argumentsCount = [arguments count];
+	char *argList = (char *)malloc(sizeof(id *) * argumentsCount);
+	[arguments getObjects:(id *)argList];
+	
+	returnBool = [self executeUpdate:sql arguments:argList];
+	
+	free(argList);
+	
+	return returnBool;
+#endif
+}
+
+
+//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
+    JSTResultSet *rs = [self executeQuery:@&quot;select [sql] from sqlite_master where [type] = 'table' and lower(name) = ?&quot;, 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)
+- (JSTResultSet*) getDataBaseSchema:(NSString*)tableName {
+    
+    //lower case table name
+    tableName = [tableName lowercaseString];
+    //result colums: type[STRING], name[STRING],tbl_name[STRING],rootpage[INTEGER],sql[STRING]
+    JSTResultSet *rs = [self executeQuery:@&quot;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&quot;];
+    
+    return rs;
+}
+
 @end</diff>
      <filename>plugins/sqlite-fmdb-jstplugin/FMDatabaseAdditions.m</filename>
    </modified>
    <modified>
      <diff>@@ -1,11 +1,11 @@
 #import &lt;Foundation/Foundation.h&gt;
 #import &quot;sqlite3.h&quot;
 
-@class FMDatabase;
+@class JSTDatabase;
 @class FMStatement;
 
-@interface FMResultSet : NSObject {
-    FMDatabase *parentDB;
+@interface JSTResultSet : NSObject {
+    JSTDatabase *parentDB;
     FMStatement *statement;
     
     NSString *query;
@@ -14,7 +14,7 @@
 }
 
 
-+ (id) resultSetWithStatement:(FMStatement *)statement usingParentDatabase:(FMDatabase*)aDB;
++ (id) resultSetWithStatement:(FMStatement *)statement usingParentDatabase:(JSTDatabase*)aDB;
 
 - (void) close;
 
@@ -24,9 +24,13 @@
 - (FMStatement *)statement;
 - (void)setStatement:(FMStatement *)value;
 
-- (void)setParentDB:(FMDatabase *)newDb;
+- (void)setParentDB:(JSTDatabase *)newDb;
 
 - (BOOL) next;
+- (BOOL) hasAnotherRow;
+
+- (int) columnIndexForName:(NSString*)columnName;
+- (NSString*) columnNameForIndex:(int)index;
 
 - (int) intForColumn:(NSString*)columnName;
 - (int) intForColumnIndex:(int)columnIdx;
@@ -52,6 +56,9 @@
 - (NSData*) dataForColumn:(NSString*)columnName;
 - (NSData*) dataForColumnIndex:(int)columnIdx;
 
+- (const unsigned char *) UTF8StringForColumnIndex:(int)columnIdx;
+- (const unsigned char *) UTF8StringForColumnName:(NSString*)columnName;
+
 /*
 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:)
@@ -60,6 +67,9 @@ If you don't, you're going to be in a world of hurt when you try and use the dat
 - (NSData*) dataNoCopyForColumn:(NSString*)columnName;
 - (NSData*) dataNoCopyForColumnIndex:(int)columnIdx;
 
+- (BOOL) columnIndexIsNull:(int)columnIdx;
+- (BOOL) columnIsNull:(NSString*)columnName;
+
 - (void) kvcMagic:(id)object;
 
 @end</diff>
      <filename>plugins/sqlite-fmdb-jstplugin/FMResultSet.h</filename>
    </modified>
    <modified>
      <diff>@@ -2,16 +2,16 @@
 #import &quot;FMDatabase.h&quot;
 #import &quot;unistd.h&quot;
 
-@interface FMResultSet (Private)
+@interface JSTResultSet (Private)
 - (NSMutableDictionary *)columnNameToIndexMap;
 - (void)setColumnNameToIndexMap:(NSMutableDictionary *)value;
 @end
 
-@implementation FMResultSet
+@implementation JSTResultSet
 
-+ (id) resultSetWithStatement:(FMStatement *)statement usingParentDatabase:(FMDatabase*)aDB {
++ (id) resultSetWithStatement:(FMStatement *)statement usingParentDatabase:(JSTDatabase*)aDB {
     
-    FMResultSet *rs = [[FMResultSet alloc] init];
+    JSTResultSet *rs = [[JSTResultSet alloc] init];
     
     [rs setStatement:statement];
     [rs setParentDB:aDB];
@@ -60,13 +60,11 @@
 
 - (void) kvcMagic:(id)object {
     
-    
     int columnCount = sqlite3_column_count(statement.statement);
     
     int columnIdx = 0;
     for (columnIdx = 0; columnIdx &lt; columnCount; columnIdx++) {
         
-        
         const char *c = (const char *)sqlite3_column_text(statement.statement, columnIdx);
         
         // check for a null row
@@ -129,6 +127,10 @@
     return (rc == SQLITE_ROW);
 }
 
+- (BOOL) hasAnotherRow {
+    return sqlite3_errcode([parentDB sqliteHandle]) == SQLITE_ROW;
+}
+
 - (int) columnIndexForName:(NSString*)columnName {
     
     if (!columnNamesSetup) {
@@ -151,36 +153,15 @@
 
 
 - (int) intForColumn:(NSString*)columnName {
-    
-    if (!columnNamesSetup) {
-        [self setupColumnNames];
-    }
-    
-    int columnIdx = [self columnIndexForName:columnName];
-    
-    if (columnIdx == -1) {
-        return 0;
-    }
-    
-    return sqlite3_column_int(statement.statement, columnIdx);
+    return [self intForColumnIndex:[self columnIndexForName:columnName]];
 }
+
 - (int) intForColumnIndex:(int)columnIdx {
     return sqlite3_column_int(statement.statement, columnIdx);
 }
 
 - (long) longForColumn:(NSString*)columnName {
-    
-    if (!columnNamesSetup) {
-        [self setupColumnNames];
-    }
-    
-    int columnIdx = [self columnIndexForName:columnName];
-    
-    if (columnIdx == -1) {
-        return 0;
-    }
-    
-    return (long)sqlite3_column_int64(statement.statement, columnIdx);
+    return [self longForColumnIndex:[self columnIndexForName:columnName]];
 }
 
 - (long) longForColumnIndex:(int)columnIdx {
@@ -188,18 +169,7 @@
 }
 
 - (long long int) longLongIntForColumn:(NSString*)columnName {
-    
-    if (!columnNamesSetup) {
-        [self setupColumnNames];
-    }
-    
-    int columnIdx = [self columnIndexForName:columnName];
-    
-    if (columnIdx == -1) {
-        return 0;
-    }
-    
-    return sqlite3_column_int64(statement.statement, columnIdx);
+    return [self longLongIntForColumnIndex:[self columnIndexForName:columnName]];
 }
 
 - (long long int) longLongIntForColumnIndex:(int)columnIdx {
@@ -207,7 +177,7 @@
 }
 
 - (BOOL) boolForColumn:(NSString*)columnName {
-    return ([self intForColumn:columnName] != 0);
+    return [self boolForColumnIndex:[self columnIndexForName:columnName]];
 }
 
 - (BOOL) boolForColumnIndex:(int)columnIdx {
@@ -215,29 +185,19 @@
 }
 
 - (double) doubleForColumn:(NSString*)columnName {
-    
-    if (!columnNamesSetup) {
-        [self setupColumnNames];
-    }
-    
-    int columnIdx = [self columnIndexForName:columnName];
-    
-    if (columnIdx == -1) {
-        return 0;
-    }
-    
-    return sqlite3_column_double(statement.statement, columnIdx);
+    return [self doubleForColumnIndex:[self columnIndexForName:columnName]];
 }
 
 - (double) doubleForColumnIndex:(int)columnIdx {
     return sqlite3_column_double(statement.statement, columnIdx);
 }
 
-
-#pragma mark string functions
-
 - (NSString*) stringForColumnIndex:(int)columnIdx {
     
+    if (sqlite3_column_type(statement.statement, columnIdx) == SQLITE_NULL || (columnIdx &lt; 0)) {
+		return nil;
+	}
+    
     const char *c = (const char *)sqlite3_column_text(statement.statement, columnIdx);
     
     if (!c) {
@@ -249,61 +209,33 @@
 }
 
 - (NSString*) stringForColumn:(NSString*)columnName {
-    
-    if (!columnNamesSetup) {
-        [self setupColumnNames];
-    }
-    
-    int columnIdx = [self columnIndexForName:columnName];
-    
-    if (columnIdx == -1) {
-        return nil;
-    }
-    
-    return [self stringForColumnIndex:columnIdx];
+    return [self stringForColumnIndex:[self columnIndexForName:columnName]];
 }
 
-
-
-
 - (NSDate*) dateForColumn:(NSString*)columnName {
-    
-    if (!columnNamesSetup) {
-        [self setupColumnNames];
-    }
-    
-    int columnIdx = [self columnIndexForName:columnName];
-    
-    if (columnIdx == -1) {
-        return nil;
-    }
-    
-    return [NSDate dateWithTimeIntervalSince1970:[self doubleForColumn:columnName]];
+    return [self dateForColumnIndex:[self columnIndexForName:columnName]];
 }
 
 - (NSDate*) dateForColumnIndex:(int)columnIdx {
+    
+    if (sqlite3_column_type(statement.statement, columnIdx) == SQLITE_NULL || (columnIdx &lt; 0)) {
+		return nil;
+	}
+    
     return [NSDate dateWithTimeIntervalSince1970:[self doubleForColumnIndex:columnIdx]];
 }
 
 
 - (NSData*) dataForColumn:(NSString*)columnName {
-    
-    if (!columnNamesSetup) {
-        [self setupColumnNames];
-    }
-    
-    int columnIdx = [self columnIndexForName:columnName];
-    
-    if (columnIdx == -1) {
-        return nil;
-    }
-    
-    
-    return [self dataForColumnIndex:columnIdx];
+    return [self dataForColumnIndex:[self columnIndexForName:columnName]];
 }
 
 - (NSData*) dataForColumnIndex:(int)columnIdx {
     
+    if (sqlite3_column_type(statement.statement, columnIdx) == SQLITE_NULL || (columnIdx &lt; 0)) {
+		return nil;
+	}
+    
     int dataSize = sqlite3_column_bytes(statement.statement, columnIdx);
     
     NSMutableData *data = [NSMutableData dataWithLength:dataSize];
@@ -315,23 +247,15 @@
 
 
 - (NSData*) dataNoCopyForColumn:(NSString*)columnName {
-    
-    if (!columnNamesSetup) {
-        [self setupColumnNames];
-    }
-    
-    int columnIdx = [self columnIndexForName:columnName];
-    
-    if (columnIdx == -1) {
-        return nil;
-    }
-    
-    
-    return [self dataNoCopyForColumnIndex:columnIdx];
+    return [self dataNoCopyForColumnIndex:[self columnIndexForName:columnName]];
 }
 
 - (NSData*) dataNoCopyForColumnIndex:(int)columnIdx {
     
+    if (sqlite3_column_type(statement.statement, columnIdx) == SQLITE_NULL || (columnIdx &lt; 0)) {
+		return nil;
+	}
+    
     int dataSize = sqlite3_column_bytes(statement.statement, columnIdx);
     
     NSData *data = [NSData dataWithBytesNoCopy:(void *)sqlite3_column_blob(statement.statement, columnIdx) length:dataSize freeWhenDone:NO];
@@ -340,10 +264,34 @@
 }
 
 
+- (BOOL) columnIndexIsNull:(int)columnIdx {
+    return sqlite3_column_type(statement.statement, columnIdx) == SQLITE_NULL;
+}
+
+- (BOOL) columnIsNull:(NSString*)columnName {
+    return [self columnIndexIsNull:[self columnIndexForName:columnName]];
+}
+
+- (const unsigned char *) UTF8StringForColumnIndex:(int)columnIdx {
+    
+    if (sqlite3_column_type(statement.statement, columnIdx) == SQLITE_NULL || (columnIdx &lt; 0)) {
+		return nil;
+	}
+    
+    return sqlite3_column_text(statement.statement, columnIdx);
+}
+
+- (const unsigned char *) UTF8StringForColumnName:(NSString*)columnName {
+	return [self UTF8StringForColumnIndex:[self columnIndexForName:columnName]];
+}
 
 
+// returns autoreleased NSString containing the name of the column in the result set
+- (NSString*) columnNameForIndex:(int)index {
+	return [NSString stringWithUTF8String: sqlite3_column_name(statement.statement, index)];
+}
 
-- (void)setParentDB:(FMDatabase *)newDb {
+- (void)setParentDB:(JSTDatabase *)newDb {
     parentDB = newDb;
 }
 </diff>
      <filename>plugins/sqlite-fmdb-jstplugin/FMResultSet.m</filename>
    </modified>
    <modified>
      <diff>@@ -3,7 +3,7 @@
 
 var dbPath = &quot;/tmp/jstalk.sqlite&quot;;
 
-var db = [FMDatabase databaseWithPath:dbPath];
+var db = [JSTDatabase databaseWithPath:dbPath];
 if (![db open]) {
     print(&quot;Could not open database&quot;);
 }</diff>
      <filename>plugins/sqlite-fmdb-jstplugin/fmdb.jstalk</filename>
    </modified>
    <modified>
      <diff>@@ -276,7 +276,10 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
-				ARCHS = i386;
+				ARCHS = (
+					x86_64,
+					i386,
+				);
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
 				GCC_ENABLE_FIX_AND_CONTINUE = YES;
@@ -295,7 +298,10 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
-				ARCHS = i386;
+				ARCHS = (
+					x86_64,
+					i386,
+				);
 				DEBUG_INFORMATION_FORMAT = &quot;dwarf-with-dsym&quot;;
 				GCC_MODEL_TUNING = G5;
 				GCC_PRECOMPILE_PREFIX_HEADER = YES;
@@ -310,7 +316,10 @@
 		1DEB913F08733D840010E9CD /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = &quot;$(ARCHS_STANDARD_32_BIT)&quot;;
+				ARCHS = (
+					x86_64,
+					i386,
+				);
 				GCC_C_LANGUAGE_STANDARD = c99;
 				GCC_OPTIMIZATION_LEVEL = 0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
@@ -324,7 +333,10 @@
 		1DEB914008733D840010E9CD /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = &quot;$(ARCHS_STANDARD_32_BIT)&quot;;
+				ARCHS = (
+					x86_64,
+					i386,
+				);
 				GCC_C_LANGUAGE_STANDARD = c99;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;</diff>
      <filename>plugins/sqlite-fmdb-jstplugin/fmdbextra.xcodeproj/project.pbxproj</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,3 @@
 # this is hacky and dumb, and you need to point it to your own build of the framework.
 # but this is how we generate the bridge support.
-gen_bridge_metadata  -f /Volumes/srv/Users/gus/builds/Release/fmdbbs.framework -o FMDB.bridgesupport
\ No newline at end of file
+gen_bridge_metadata  -f /builds/Release/fmdbbs.framework -o FMDB.bridgesupport
\ No newline at end of file</diff>
      <filename>plugins/sqlite-fmdb-jstplugin/makebs.sh</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>b1cd362384876a20fc4ff4f554eaac5926fb4411</id>
    </parent>
  </parents>
  <author>
    <name>August Mueller</name>
    <email>gus@fmnorth.local</email>
  </author>
  <url>http://github.com/ccgus/jstalk/commit/4843fe1ea77931ea3a33943240598993a100d281</url>
  <id>4843fe1ea77931ea3a33943240598993a100d281</id>
  <committed-date>2009-10-14T15:27:57-07:00</committed-date>
  <authored-date>2009-10-14T15:27:57-07:00</authored-date>
  <message>Changed the FMDatabase class to &quot;JSTDatabase&quot; - since folks who were already using FMDatabase would get warnings at runtime.
Updated the example as well.</message>
  <tree>7bfd4a7f0276f31f2d60a787257383de83ed0895</tree>
  <committer>
    <name>August Mueller</name>
    <email>gus@fmnorth.local</email>
  </committer>
</commit>
