little fixes, new tests
[fmdb.git] / src / fmdb.m
blob32c2185043229041503090ef646fcfb535711743
1 #import <Foundation/Foundation.h>
2 #import "FMDatabase.h"
3 #import "FMDatabaseAdditions.h"
5 int main (int argc, const char * argv[]) {
6     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
7     
8     // delete the old db.
9     NSFileManager *fileManager = [NSFileManager defaultManager];
10     [fileManager removeFileAtPath:@"/tmp/tmp.db" handler:nil];
11     
12     FMDatabase* db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
13     if (![db open]) {
14         NSLog(@"Could not open db.");
15         return 0;
16     }
17     
18     // create a bad statement, just to test the error code.
19     [db executeUpdate:@"blah blah blah"];
20     if ([db hadError]) {
21         NSLog(@"Err %d: %@", [db lastErrorCode], [db lastErrorMessage]);
22     }
23     
24     // but of course, I don't bother checking the error codes below.
25     // Bad programmer, no cookie.
26     
27     [db executeUpdate:@"create table test (a text, b text, c integer, d double, e double)"];
28     
29     
30     [db beginTransaction];
31     int i = 0;
32     while (i++ < 20) {
33         [db executeUpdate:@"insert into test (a, b, c, d, e) values (?, ?, ?, ?, ?)" ,
34             @"hi'", // look!  I put in a ', and I'm not escaping it!
35             [NSString stringWithFormat:@"number %d", i],
36             [NSNumber numberWithInt:i],
37             [NSDate date],
38             [NSNumber numberWithFloat:2.2f]];
39     }
40     [db commit];
41     
42     
43     FMResultSet *rs = [db executeQuery:@"select rowid,* from test where a = ?", @"hi'"];
44     while ([rs next]) {
45         // just print out what we've got in a number of formats.
46         NSLog(@"%d %@ %@ %@ %@ %f %f",
47               [rs intForColumn:@"c"],
48               [rs stringForColumn:@"b"],
49               [rs stringForColumn:@"a"],
50               [rs stringForColumn:@"rowid"],
51               [rs dateForColumn:@"d"],
52               [rs doubleForColumn:@"d"],
53               [rs doubleForColumn:@"e"]);
54     }
55     // close the result set.
56     // it'll also close when it's dealloc'd, but we're closing the database before
57     // the autorelease pool closes, so sqlite will complain about it.
58     [rs close];  
59     
60     // ----------------------------------------------------------------------------------------
61     // blob support.
62     [db executeUpdate:@"create table blobTable (a text, b blob)"];
63     
64     // let's read in an image from safari's app bundle.
65     NSData *d = [NSData dataWithContentsOfFile:@"/Applications/Safari.app/Contents/Resources/compass.icns"];
66     if (d) {
67         [db executeUpdate:@"insert into blobTable (a, b) values (?,?)", @"safari's compass", d];
68         
69         rs = [db executeQuery:@"select b from blobTable where a = ?", @"safari's compass"];
70         if ([rs next]) {
71             d = [rs dataForColumn:@"b"];
72             [d writeToFile:@"/tmp/compass.icns" atomically:NO];
73             
74             // let's look at our fancy image that we just wrote out..
75             system("/usr/bin/open /tmp/compass.icns");
76         }
77         else {
78             NSLog(@"Could not select image.");
79         }
80         
81         [rs close];
82         
83     }
84     else {
85         NSLog(@"Can't find compass image..");
86     }
87     
88     
89     // test out the convenience methods in +Additions
90     [db executeUpdate:@"create table t1 (a integer)"];
91     [db executeUpdate:@"insert into t1 values (5)"];
92     int a = [db intForQuery:@"select a from t1 where a = ?", [NSNumber numberWithInt:5]];
93     if (a != 5) {
94         NSLog(@"intForQuery didn't work (a != 5)");
95     }
96     
97     
98     // test the busy rety timeout schtuff.
99     
100     [db setBusyRetryTimeout:50000];
101     
102     FMDatabase *newDb = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
103     [newDb open];
104     
105     rs = [newDb executeQuery:@"select rowid,* from test where a = ?", @"hi'"];
106     [rs next]; // just grab one... which will keep the db locked.
107     
108     NSLog(@"Testing the busy timeout");
109     
110     BOOL success = [db executeUpdate:@"insert into t1 values (5)"];
111     
112     if (success) {
113         NSLog(@"Whoa- the database didn't stay locked!");
114         return 7;
115     }
116     else {
117         NSLog(@"Hurray, our timeout worked");
118     }
119     
120     [rs close];
121     [newDb close];
122     
123     success = [db executeUpdate:@"insert into t1 values (5)"];
124     if (!success) {
125         NSLog(@"Whoa- the database shouldn't be locked!");
126         return 8;
127     }
128     else {
129         NSLog(@"Hurray, we can insert again!");
130     }
131     
132     [db close];
133     
134     [pool release];
135     return 0;