BathyScapheのSQLiteデータベース内を覗くアプリ
修訂 | 3b7c3c03b7d852dfbf6461d02903f06ed799c593 (tree) |
---|---|
時間 | 2008-06-14 21:59:33 |
作者 | masakih <masakih@user...> |
Commiter | masakih |
initial import.
git-svn-id: svn+ssh://macmini/usr/local/svnrepos/BSDBViewer/BSDBViewer@2 477addb1-df5c-4826-a637-c2b1bdcd60d4
@@ -0,0 +1,22 @@ | ||
1 | +#import <Cocoa/Cocoa.h> | |
2 | + | |
3 | +@interface BSDBBoardSource : NSObject | |
4 | +{ | |
5 | + IBOutlet id delegate; | |
6 | + | |
7 | + BOOL excludeNotHasReadThread; | |
8 | + | |
9 | + NSArray *boards; | |
10 | +} | |
11 | + | |
12 | +- (id)boardIDAtRow:(unsigned int)row; | |
13 | +- (NSArray *)boardIDsInSet:(NSIndexSet *)set; | |
14 | + | |
15 | +- (IBAction)update:(id)sender; | |
16 | + | |
17 | +@end | |
18 | + | |
19 | +@interface NSObject (BSDBBoardSourceDelegate) | |
20 | +- (void)beginUpdateBoardData:(id)dataSource; | |
21 | +- (void)finishUpdateBoardData:(id)dataSource; | |
22 | +@end |
@@ -0,0 +1,109 @@ | ||
1 | +#import "BSDBBoardSource.h" | |
2 | + | |
3 | +#import "BSDBViewer.h" | |
4 | + | |
5 | +@implementation BSDBBoardSource | |
6 | + | |
7 | +- (void)setDelegate:(id)newDelegate | |
8 | +{ | |
9 | + if(delegate == newDelegate) return; | |
10 | + | |
11 | + if(![newDelegate respondsToSelector:@selector(beginUpdateBoardData:)]) { | |
12 | + NSLog(@"(%@) delegate MUST response selector beginUpdateBoardData:", | |
13 | + NSStringFromClass([self class])); | |
14 | + return; | |
15 | + } | |
16 | + if(![newDelegate respondsToSelector:@selector(finishUpdateBoardData:)]) { | |
17 | + NSLog(@"(%@) delegate MUST response selector finishUpdateBoardData:", | |
18 | + NSStringFromClass([self class])); | |
19 | + return; | |
20 | + } | |
21 | + | |
22 | + delegate = newDelegate; // not retain. | |
23 | +} | |
24 | +- (id)delegate | |
25 | +{ | |
26 | + return delegate; | |
27 | +} | |
28 | + | |
29 | +- (void)setBoards:(NSArray *)array | |
30 | +{ | |
31 | + @synchronized(self) { | |
32 | + [boards autorelease]; | |
33 | + boards = [array retain]; | |
34 | + } | |
35 | +} | |
36 | +- (NSArray *)boards | |
37 | +{ | |
38 | + id result = nil; | |
39 | + @synchronized(self) { | |
40 | + result = [boards retain]; | |
41 | + } | |
42 | + return [result autorelease]; | |
43 | +} | |
44 | + | |
45 | +- (id)boardIDAtRow:(unsigned int)row | |
46 | +{ | |
47 | + id result = nil; | |
48 | + @synchronized(self) { | |
49 | + id dict = [boards objectAtIndex:row]; | |
50 | + result = [[dict objectForKey:@"boardid"] retain]; | |
51 | + } | |
52 | + return [result autorelease]; | |
53 | +} | |
54 | +- (NSArray *)boardIDsInSet:(NSIndexSet *)set | |
55 | +{ | |
56 | + NSMutableArray *result = [NSMutableArray array]; | |
57 | + @synchronized(self) { | |
58 | + id rows = [boards objectsAtIndexes:set]; | |
59 | + NSEnumerator *enume = [rows objectEnumerator]; | |
60 | + id row; | |
61 | + while(row = [enume nextObject]) { | |
62 | + [result addObject:[row objectForKey:@"boardid"]]; | |
63 | + } | |
64 | + } | |
65 | + return result; | |
66 | +} | |
67 | + | |
68 | + | |
69 | +- (IBAction)update:(id)sender | |
70 | +{ | |
71 | + SQLiteDB *db = [BSDBViewer sqliteDB]; | |
72 | + | |
73 | + if(!db) return; | |
74 | + | |
75 | + if([self delegate]) { | |
76 | + [delegate beginUpdateBoardData:self]; | |
77 | + } | |
78 | + | |
79 | + NSString *query; | |
80 | + if(excludeNotHasReadThread) { | |
81 | + query = [NSString stringWithFormat: | |
82 | + @"SELECT boardname, boardid FROM %@ WHERE boardid != 0 " | |
83 | + @"AND boardid IN " | |
84 | + @"(SELECT DISTINCT boardid FROM %@)" | |
85 | + , | |
86 | + @"boardinfo", | |
87 | + @"ThreadInfo"]; | |
88 | + } else { | |
89 | + query = [NSString stringWithFormat: | |
90 | + @"SELECT boardname, boardid FROM %@ WHERE boardid != 0", | |
91 | + @"boardinfo"]; | |
92 | + } | |
93 | + | |
94 | + | |
95 | + id cursor = [db cursorForSQL:query]; | |
96 | + if([db lastErrorID] != 0) { | |
97 | + NSLog(@"Fail Sending Query: %@", query); | |
98 | + NSLog(@"SQLite Error: %@", [db lastError]); | |
99 | + return; | |
100 | + } | |
101 | + | |
102 | + [self setBoards:[cursor arrayForTableView]]; | |
103 | + | |
104 | + if([self delegate]) { | |
105 | + [delegate finishUpdateBoardData:self]; | |
106 | + } | |
107 | +} | |
108 | + | |
109 | +@end |
@@ -0,0 +1,24 @@ | ||
1 | +#import <Cocoa/Cocoa.h> | |
2 | + | |
3 | +@interface BSDBThreadSource : NSObject | |
4 | +{ | |
5 | + IBOutlet id delegate; | |
6 | + | |
7 | + NSArray *threads; | |
8 | + NSNumber *boardID; | |
9 | +} | |
10 | + | |
11 | +- (id)threadIDAtRow:(unsigned int)row; | |
12 | +- (NSArray *)threadIDsInSet:(NSIndexSet *)set; | |
13 | + | |
14 | +- (IBAction)update:(id)sender; | |
15 | + | |
16 | +- (void)setBoardID:(NSNumber *)boardID; | |
17 | +- (NSNumber *)boardID; | |
18 | + | |
19 | +@end | |
20 | + | |
21 | +@interface NSObject (BSDBThreadSourceDelegate) | |
22 | +- (void)beginUpdateThreadData:(id)dataSource; | |
23 | +- (void)finishUpdateThreadData:(id)dataSource; | |
24 | +@end |
@@ -0,0 +1,122 @@ | ||
1 | +#import "BSDBThreadSource.h" | |
2 | + | |
3 | +#import "BSDBViewer.h" | |
4 | + | |
5 | +@implementation BSDBThreadSource | |
6 | + | |
7 | +- (void)setDelegate:(id)newDelegate | |
8 | +{ | |
9 | + if(delegate == newDelegate) return; | |
10 | + | |
11 | + if(![newDelegate respondsToSelector:@selector(beginUpdateThreadData:)]) { | |
12 | + NSLog(@"(%@) delegate MUST response selector beginUpdateThreadData:", | |
13 | + NSStringFromClass([self class])); | |
14 | + return; | |
15 | + } | |
16 | + if(![newDelegate respondsToSelector:@selector(finishUpdateThreadData:)]) { | |
17 | + NSLog(@"(%@) delegate MUST response selector finishUpdateThreadData:", | |
18 | + NSStringFromClass([self class])); | |
19 | + return; | |
20 | + } | |
21 | + | |
22 | + delegate = newDelegate; // not retain. | |
23 | +} | |
24 | +- (id)delegate | |
25 | +{ | |
26 | + return delegate; | |
27 | +} | |
28 | + | |
29 | +- (void)setThreads:(NSArray *)array | |
30 | +{ | |
31 | + @synchronized(self) { | |
32 | + [threads autorelease]; | |
33 | + threads = [array retain]; | |
34 | + } | |
35 | +} | |
36 | +- (NSArray *)threads | |
37 | +{ | |
38 | + id result = nil; | |
39 | + @synchronized(self) { | |
40 | + result = [threads retain]; | |
41 | + } | |
42 | + return [result autorelease]; | |
43 | +} | |
44 | +- (void)setBoardID:(NSNumber *)newBoardID | |
45 | +{ | |
46 | + if([boardID isEqual:newBoardID]) return; | |
47 | + | |
48 | + [boardID autorelease]; | |
49 | + boardID = [newBoardID retain]; | |
50 | + | |
51 | + [self update:self]; | |
52 | +} | |
53 | +- (NSNumber *)boardID | |
54 | +{ | |
55 | + return boardID; | |
56 | +} | |
57 | + | |
58 | +- (id)threadIDAtRow:(unsigned int)row | |
59 | +{ | |
60 | + id result = nil; | |
61 | + @synchronized(self) { | |
62 | + result = [[threads objectAtIndex:row] retain]; | |
63 | + } | |
64 | + return [result autorelease]; | |
65 | +} | |
66 | +- (NSArray *)threadIDsInSet:(NSIndexSet *)set | |
67 | +{ | |
68 | + NSArray *result = nil; | |
69 | + @synchronized(self) { | |
70 | + result = [threads objectsAtIndexes:set]; | |
71 | + } | |
72 | + return result; | |
73 | +} | |
74 | + | |
75 | +/* | |
76 | + CREATE TABLE ThreadInfo (boardID INTEGER NOT NULL, | |
77 | + threadID INTEGER NOT NULL, | |
78 | + threadName TEXT NOT NULL, | |
79 | + numberOfAll NUMERIC, | |
80 | + numberOfRead NUMERIC, | |
81 | + modifiedDate NUMERIC, | |
82 | + lastWrittenDate NUMERIC, | |
83 | + threadStatus NUMERIC, | |
84 | + threadAboneType NUMERIC, | |
85 | + threadLabel NUMERIC, | |
86 | + isDatOchi INTEGER NOT NULL DEFAULT 0 CHECK(isDatOchi IN (0,1)), | |
87 | + IsFavorite INTEGER NOT NULL DEFAULT 0 CHECK(IsFavorite IN (0,1))) | |
88 | +*/ | |
89 | +- (IBAction)update:(id)sender | |
90 | +{ | |
91 | + if(!boardID) return; | |
92 | + | |
93 | + SQLiteDB *db = [BSDBViewer sqliteDB]; | |
94 | + | |
95 | + if(!db) return; | |
96 | + | |
97 | + if([self delegate]) { | |
98 | + [delegate beginUpdateThreadData:self]; | |
99 | + } | |
100 | + | |
101 | + NSString *query = [NSString stringWithFormat: | |
102 | + @"SELECT threadname, threadid, numberOfAll, numberOfRead," | |
103 | + @"modifiedDate, lastWrittenDate," | |
104 | + @"isDatOchi,IsFavorite " | |
105 | + @"FROM %@ WHERE boardid = %@", | |
106 | + @"ThreadInfo",[self boardID]]; | |
107 | + | |
108 | + id cursor = [db cursorForSQL:query]; | |
109 | + if([db lastErrorID] != 0) { | |
110 | + NSLog(@"Fail Sending Query: %@", query); | |
111 | + NSLog(@"SQLite Error: %@", [db lastError]); | |
112 | + return; | |
113 | + } | |
114 | + | |
115 | + [self setThreads:[cursor arrayForTableView]]; | |
116 | + | |
117 | + if([self delegate]) { | |
118 | + [delegate finishUpdateThreadData:self]; | |
119 | + } | |
120 | +} | |
121 | + | |
122 | +@end |
@@ -0,0 +1,29 @@ | ||
1 | +#import <Cocoa/Cocoa.h> | |
2 | + | |
3 | +#import "SQLiteDB.h" | |
4 | + | |
5 | +@interface BSDBViewer : NSObject | |
6 | +{ | |
7 | + IBOutlet id window; | |
8 | + IBOutlet id boardArrayController; | |
9 | + IBOutlet id boardSource; | |
10 | + IBOutlet id boardView; | |
11 | + IBOutlet id threadArrayController; | |
12 | + IBOutlet id threadSource; | |
13 | + IBOutlet id threadView; | |
14 | + | |
15 | + int progressStack; | |
16 | +} | |
17 | + | |
18 | ++ (SQLiteDB *)sqliteDB; | |
19 | + | |
20 | +- (IBAction)openInBathyScaphe:(id)sender; | |
21 | +- (IBAction)deleteThreadInfo:(id)sender; | |
22 | +- (IBAction)showThreadInfo:(id)sender; | |
23 | + | |
24 | +@end | |
25 | + | |
26 | +@interface BSDBDateTransformer : NSValueTransformer | |
27 | +@end | |
28 | +@interface BSDBNumberTransformer : NSValueTransformer | |
29 | +@end |
@@ -0,0 +1,328 @@ | ||
1 | +#import "BSDBViewer.h" | |
2 | + | |
3 | +#import "BSDBBoardSource.h" | |
4 | +#import "BSDBThreadSource.h" | |
5 | + | |
6 | + | |
7 | +@implementation BSDBViewer | |
8 | + | |
9 | +static NSString *const BSDBViewerSQLiteDBKey = @"BSDBViewerSQLiteDBKey"; | |
10 | + | |
11 | +static NSString *const InProgressKey = @"inProgress"; | |
12 | + | |
13 | +NSString *resolveAlias(NSString *path) | |
14 | +{ | |
15 | + NSString *newPath = nil; | |
16 | + | |
17 | + FSRef ref; | |
18 | + char *newPathCString; | |
19 | + Boolean isDir, wasAliased; | |
20 | + OSStatus err; | |
21 | + | |
22 | + err = FSPathMakeRef( (UInt8 *)[path fileSystemRepresentation], &ref, NULL ); | |
23 | + if( err == dirNFErr ) { | |
24 | + NSString *lastPath = [path lastPathComponent]; | |
25 | + NSString *parent = [path stringByDeletingLastPathComponent]; | |
26 | + NSString *f; | |
27 | + | |
28 | + if( [@"/" isEqualTo:parent] ) return nil; | |
29 | + | |
30 | + parent = resolveAlias( parent ); | |
31 | + if( !parent ) return nil; | |
32 | + | |
33 | + f = [parent stringByAppendingPathComponent:lastPath]; | |
34 | + | |
35 | + err = FSPathMakeRef( (UInt8 *)[f fileSystemRepresentation], &ref, NULL ); | |
36 | + } | |
37 | + if( err != noErr ) { | |
38 | + return nil; | |
39 | + } | |
40 | + | |
41 | + err = FSResolveAliasFile( &ref, TRUE, &isDir, &wasAliased ); | |
42 | + if( err != noErr ) { | |
43 | + return nil; | |
44 | + } | |
45 | + | |
46 | + newPathCString = (char *)malloc( sizeof(unichar) * 1024 ); | |
47 | + if( !newPathCString ) { | |
48 | + return nil; | |
49 | + } | |
50 | + | |
51 | + err = FSRefMakePath( &ref, (UInt8 *)newPathCString, sizeof(unichar) * 1024 ); | |
52 | + if( err != noErr ) { | |
53 | + goto final; | |
54 | + } | |
55 | + | |
56 | + newPath = [NSString stringWithUTF8String:newPathCString]; | |
57 | + | |
58 | +final: | |
59 | + free( (char *)newPathCString ); | |
60 | + | |
61 | + return newPath; | |
62 | +} | |
63 | ++ (NSString *)appSupportFolder | |
64 | +{ | |
65 | + OSErr err; | |
66 | + FSRef ref; | |
67 | + UInt8 path[PATH_MAX]; | |
68 | + | |
69 | + err = FSFindFolder(kUserDomain, kApplicationSupportFolderType, YES, &ref); | |
70 | + if( noErr != err) return nil; | |
71 | + | |
72 | + err = FSRefMakePath(&ref, path, PATH_MAX); | |
73 | + if(noErr != err) return nil; | |
74 | + | |
75 | + return [[NSFileManager defaultManager] stringWithFileSystemRepresentation:(char *)path | |
76 | + length:strlen((char *)path)]; | |
77 | +} | |
78 | + | |
79 | ++ (NSString *)BSSupportFolder | |
80 | +{ | |
81 | + id res = [self appSupportFolder]; | |
82 | + | |
83 | + res = [res stringByAppendingPathComponent:@"BathyScaphe"]; | |
84 | + | |
85 | + return resolveAlias(res); | |
86 | +} | |
87 | + | |
88 | ++ (NSString *)databasePath | |
89 | +{ | |
90 | + id res = [self BSSupportFolder]; | |
91 | + | |
92 | + res = [res stringByAppendingPathComponent:@"BathyScaphe.db"]; | |
93 | + | |
94 | + return resolveAlias(res); | |
95 | +} | |
96 | + | |
97 | + | |
98 | ++ (SQLiteDB *)sqliteDB | |
99 | +{ | |
100 | + SQLiteDB *result = nil; | |
101 | + NSThread *thread = [NSThread currentThread]; | |
102 | + id info = [thread threadDictionary]; | |
103 | + result = [info objectForKey:BSDBViewerSQLiteDBKey]; | |
104 | + if(!result) { | |
105 | + result = [[[SQLiteDB alloc] initWithDatabasePath:[self databasePath]] autorelease]; | |
106 | + if(!result) { | |
107 | + NSLog(@"Can not allocate SQLiteDB."); | |
108 | + return nil; | |
109 | + } | |
110 | + [info setObject:result forKey:BSDBViewerSQLiteDBKey]; | |
111 | + [result open]; | |
112 | + } | |
113 | + | |
114 | + return result; | |
115 | +} | |
116 | +- (SQLiteDB *)sqliteDB | |
117 | +{ | |
118 | + return [[self class] sqliteDB]; | |
119 | +} | |
120 | + | |
121 | +#pragma mark- | |
122 | +- (void)setInProgress:(BOOL)new | |
123 | +{ | |
124 | + // | |
125 | +} | |
126 | +- (BOOL)inProgress | |
127 | +{ | |
128 | + return progressStack != 0; | |
129 | +} | |
130 | +- (void)incrementProgressStack | |
131 | +{ | |
132 | + [self willChangeValueForKey:InProgressKey]; | |
133 | + progressStack++; | |
134 | + [self didChangeValueForKey:InProgressKey]; | |
135 | +} | |
136 | +- (void)decrementProgressStack | |
137 | +{ | |
138 | + [self willChangeValueForKey:InProgressKey]; | |
139 | + progressStack--; | |
140 | + [self didChangeValueForKey:InProgressKey]; | |
141 | +} | |
142 | +#pragma mark- | |
143 | +- (void)deleteThreadInformations:(NSArray *)infos | |
144 | +{ | |
145 | + NSString *query = | |
146 | + @"DELETE FROM ThreadInfo " | |
147 | + @"WHERE " | |
148 | + @"boardid = ? " | |
149 | + @"AND " | |
150 | + @"threadid = ?"; | |
151 | + | |
152 | + SQLiteDB *db = [self sqliteDB]; | |
153 | + SQLiteReservedQuery *deleQ = [db reservedQuery:query]; | |
154 | + | |
155 | + id enume = [infos objectEnumerator]; | |
156 | + id obj; | |
157 | + id targetBoardID = [threadSource boardID]; | |
158 | + | |
159 | + [self incrementProgressStack]; | |
160 | + [db beginTransaction]; | |
161 | + while(obj = [enume nextObject]) { | |
162 | + id info = [obj objectForKey:@"threadid"]; | |
163 | + if(!info) continue; | |
164 | + NSArray *values = [NSArray arrayWithObjects:targetBoardID, info, nil]; | |
165 | + [deleQ cursorForBindValues:values]; | |
166 | + if([db lastErrorID] != 0) { | |
167 | + NSLog(@"Fail DELETE thread info: %@", obj); | |
168 | + NSLog(@"Fail Sending Query: %@", query); | |
169 | + NSLog(@"SQLite Error: %@", [db lastError]); | |
170 | + } | |
171 | + } | |
172 | + [db commitTransaction]; | |
173 | + | |
174 | + [threadSource update:self]; | |
175 | + [self decrementProgressStack]; | |
176 | +} | |
177 | + | |
178 | +- (NSArray *)targetObjectsInTableView:(id)view arrayController:(NSArrayController *)ac | |
179 | +{ | |
180 | + NSArray *result; | |
181 | + | |
182 | + NSEvent *event = [NSApp currentEvent]; | |
183 | + NSPoint mouse = [event locationInWindow]; | |
184 | + mouse = [view convertPoint:mouse fromView:nil]; | |
185 | + unsigned rowAtMouse = [view rowAtPoint:mouse]; | |
186 | + NSIndexSet *selected = [view selectedRowIndexes]; | |
187 | + | |
188 | + if([selected containsIndex:rowAtMouse]) { | |
189 | + result = [ac selectedObjects]; | |
190 | + } else { | |
191 | + result = [NSArray arrayWithObject:[[ac arrangedObjects] objectAtIndex:rowAtMouse]]; | |
192 | + } | |
193 | + | |
194 | + return result; | |
195 | +} | |
196 | +- (IBAction)deleteThreadInfo:(id)sender | |
197 | +{ | |
198 | + NSArray *infos = [self targetObjectsInTableView:threadView arrayController:threadArrayController]; | |
199 | + | |
200 | + [self performSelector:@selector(deleteThreadInformations:) | |
201 | + withObject:infos | |
202 | + afterDelay:0.0]; | |
203 | +} | |
204 | + | |
205 | +- (IBAction)showThreadInfo:(id)sender | |
206 | +{ | |
207 | + | |
208 | +} | |
209 | +- (IBAction)openInBathyScaphe:(id)sender | |
210 | +{ | |
211 | + | |
212 | +} | |
213 | + | |
214 | +#pragma mark- | |
215 | +- (void)beginUpdateBoardData:(id)dataSource | |
216 | +{ | |
217 | + [self incrementProgressStack]; | |
218 | +} | |
219 | +- (void)finishUpdateBoardData:(id)dataSource | |
220 | +{ | |
221 | + [self decrementProgressStack]; | |
222 | +} | |
223 | +- (void)beginUpdateThreadData:(id)dataSource | |
224 | +{ | |
225 | + [self incrementProgressStack]; | |
226 | +} | |
227 | +- (void)finishUpdateThreadData:(id)dataSource | |
228 | +{ | |
229 | + [self decrementProgressStack]; | |
230 | +} | |
231 | + | |
232 | +- (void)awakeFromNib | |
233 | +{ | |
234 | + [boardSource update:self]; | |
235 | + [window setExcludedFromWindowsMenu:YES]; | |
236 | +} | |
237 | + | |
238 | +@end | |
239 | + | |
240 | + | |
241 | +@implementation BSDBViewer(NSMenuValidation) | |
242 | +- (BOOL)validateMenuItem:(NSMenuItem *)menuItem | |
243 | +{ | |
244 | + if(@selector(showThreadInfo:) == [menuItem action]) return NO; | |
245 | + if(@selector(openInBathyScaphe:) == [menuItem action]) return NO; | |
246 | + | |
247 | + return YES; | |
248 | +} | |
249 | +@end | |
250 | + | |
251 | +@implementation BSDBViewer(NSApplicationDelegate) | |
252 | +- (void)applicationDidFinishLaunching:(NSNotification *)notification | |
253 | +{ | |
254 | + [NSValueTransformer setValueTransformer:[[[BSDBDateTransformer alloc] init] autorelease] | |
255 | + forName:@"BSDBDateTransformer"]; | |
256 | + [NSValueTransformer setValueTransformer:[[[BSDBNumberTransformer alloc] init] autorelease] | |
257 | + forName:@"BSDBNumberTransformer"]; | |
258 | +} | |
259 | + | |
260 | +- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender | |
261 | +{ | |
262 | + return YES; | |
263 | +} | |
264 | +@end | |
265 | + | |
266 | +@implementation BSDBViewer(NSTableViewDelegate) | |
267 | +- (void)boardListSelectionDidChange | |
268 | +{ | |
269 | + NSIndexSet *selectedIndexes = [boardArrayController selectionIndexes]; | |
270 | + if([selectedIndexes count] != 1) return; | |
271 | + | |
272 | + id selection = [boardArrayController valueForKeyPath:@"selection.boardid"]; | |
273 | + [threadSource setBoardID:selection]; | |
274 | +} | |
275 | +- (void)tableViewSelectionDidChange:(NSNotification *)notification | |
276 | +{ | |
277 | + id obj = [notification object]; | |
278 | + | |
279 | + if([obj isEqual:boardView]) { | |
280 | + [self boardListSelectionDidChange]; | |
281 | + return; | |
282 | + } | |
283 | + | |
284 | +} | |
285 | + | |
286 | +@end | |
287 | + | |
288 | +#pragma mark- | |
289 | +@implementation BSDBDateTransformer | |
290 | +- (id)transformedValue:(id)value | |
291 | +{ | |
292 | + if(!value) return nil; | |
293 | + | |
294 | + return [NSDate dateWithTimeIntervalSince1970:[value doubleValue]]; | |
295 | +} | |
296 | +- (id)reverseTransformedValue:(id)value | |
297 | +{ | |
298 | + if(!value) return nil; | |
299 | + | |
300 | + return [NSString stringWithFormat:@"%.0f",[value timeIntervalSince1970]]; | |
301 | +} | |
302 | +@end | |
303 | + | |
304 | +@implementation BSDBNumberTransformer | |
305 | +- (id)transformedValue:(id)value | |
306 | +{ | |
307 | + if(!value) return nil; | |
308 | + | |
309 | + return [NSNumber numberWithInt:[value intValue]]; | |
310 | +} | |
311 | +- (id)reverseTransformedValue:(id)value | |
312 | +{ | |
313 | + if(!value) return nil; | |
314 | + | |
315 | + return [NSString stringWithFormat:@"%d",[value intValue]]; | |
316 | +} | |
317 | +@end | |
318 | + | |
319 | +#pragma mark- | |
320 | +@implementation NSString(BSDBViewerOrdering) | |
321 | +- (NSComparisonResult)numericCompare:(id)obj | |
322 | +{ | |
323 | + if(!obj) return NSOrderedDescending; | |
324 | + | |
325 | + return [self compare:obj options:NSNumericSearch]; | |
326 | +} | |
327 | +@end | |
328 | + |
@@ -0,0 +1,342 @@ | ||
1 | +// !$*UTF8*$! | |
2 | +{ | |
3 | + archiveVersion = 1; | |
4 | + classes = { | |
5 | + }; | |
6 | + objectVersion = 44; | |
7 | + objects = { | |
8 | + | |
9 | +/* Begin PBXBuildFile section */ | |
10 | + 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97318FDCFA39411CA2CEA /* MainMenu.nib */; }; | |
11 | + 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; | |
12 | + 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; | |
13 | + 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; | |
14 | + F46C0E800DFC1AC100C1CDCC /* BSDBBoardSource.m in Sources */ = {isa = PBXBuildFile; fileRef = F46C0E7B0DFC1AC100C1CDCC /* BSDBBoardSource.m */; }; | |
15 | + F46C0E810DFC1AC100C1CDCC /* BSDBThreadSource.m in Sources */ = {isa = PBXBuildFile; fileRef = F46C0E7D0DFC1AC100C1CDCC /* BSDBThreadSource.m */; }; | |
16 | + F46C0E820DFC1AC100C1CDCC /* BSDBViewer.m in Sources */ = {isa = PBXBuildFile; fileRef = F46C0E7F0DFC1AC100C1CDCC /* BSDBViewer.m */; }; | |
17 | + F46C0E910DFD72C600C1CDCC /* SQLiteDB.m in Sources */ = {isa = PBXBuildFile; fileRef = F46C0E8E0DFD72C600C1CDCC /* SQLiteDB.m */; }; | |
18 | + F46C0E940DFD72EB00C1CDCC /* libsqlite.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F46C0E930DFD72EB00C1CDCC /* libsqlite.a */; }; | |
19 | +/* End PBXBuildFile section */ | |
20 | + | |
21 | +/* Begin PBXFileReference section */ | |
22 | + 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; }; | |
23 | + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; }; | |
24 | + 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; }; | |
25 | + 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; }; | |
26 | + 29B97319FDCFA39411CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = "<group>"; }; | |
27 | + 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; }; | |
28 | + 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; }; | |
29 | + 32CA4F630368D1EE00C91783 /* BSDBViewer_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BSDBViewer_Prefix.pch; sourceTree = "<group>"; }; | |
30 | + 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; | |
31 | + 8D1107320486CEB800E47090 /* BSDBViewer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BSDBViewer.app; sourceTree = BUILT_PRODUCTS_DIR; }; | |
32 | + F46C0E7A0DFC1AC100C1CDCC /* BSDBBoardSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BSDBBoardSource.h; sourceTree = "<group>"; }; | |
33 | + F46C0E7B0DFC1AC100C1CDCC /* BSDBBoardSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BSDBBoardSource.m; sourceTree = "<group>"; }; | |
34 | + F46C0E7C0DFC1AC100C1CDCC /* BSDBThreadSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BSDBThreadSource.h; sourceTree = "<group>"; }; | |
35 | + F46C0E7D0DFC1AC100C1CDCC /* BSDBThreadSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BSDBThreadSource.m; sourceTree = "<group>"; }; | |
36 | + F46C0E7E0DFC1AC100C1CDCC /* BSDBViewer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BSDBViewer.h; sourceTree = "<group>"; }; | |
37 | + F46C0E7F0DFC1AC100C1CDCC /* BSDBViewer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BSDBViewer.m; sourceTree = "<group>"; }; | |
38 | + F46C0E8E0DFD72C600C1CDCC /* SQLiteDB.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SQLiteDB.m; sourceTree = "<group>"; }; | |
39 | + F46C0E8F0DFD72C600C1CDCC /* SQLiteDB.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SQLiteDB.h; sourceTree = "<group>"; }; | |
40 | + F46C0E900DFD72C600C1CDCC /* sqlite3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sqlite3.h; sourceTree = "<group>"; }; | |
41 | + F46C0E930DFD72EB00C1CDCC /* libsqlite.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libsqlite.a; sourceTree = "<group>"; }; | |
42 | + F46C0F030DFFFF3000C1CDCC /* UTILAssertion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UTILAssertion.h; sourceTree = "<group>"; }; | |
43 | + F46C0F040DFFFF3000C1CDCC /* UTILDescription.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UTILDescription.h; sourceTree = "<group>"; }; | |
44 | + F46C0F050DFFFF3000C1CDCC /* UTILError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UTILError.h; sourceTree = "<group>"; }; | |
45 | + F46C0F060DFFFF3000C1CDCC /* UTILKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UTILKit.h; sourceTree = "<group>"; }; | |
46 | +/* End PBXFileReference section */ | |
47 | + | |
48 | +/* Begin PBXFrameworksBuildPhase section */ | |
49 | + 8D11072E0486CEB800E47090 /* Frameworks */ = { | |
50 | + isa = PBXFrameworksBuildPhase; | |
51 | + buildActionMask = 2147483647; | |
52 | + files = ( | |
53 | + 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, | |
54 | + F46C0E940DFD72EB00C1CDCC /* libsqlite.a in Frameworks */, | |
55 | + ); | |
56 | + runOnlyForDeploymentPostprocessing = 0; | |
57 | + }; | |
58 | +/* End PBXFrameworksBuildPhase section */ | |
59 | + | |
60 | +/* Begin PBXGroup section */ | |
61 | + 080E96DDFE201D6D7F000001 /* Classes */ = { | |
62 | + isa = PBXGroup; | |
63 | + children = ( | |
64 | + F46C0E7A0DFC1AC100C1CDCC /* BSDBBoardSource.h */, | |
65 | + F46C0E7B0DFC1AC100C1CDCC /* BSDBBoardSource.m */, | |
66 | + F46C0E7C0DFC1AC100C1CDCC /* BSDBThreadSource.h */, | |
67 | + F46C0E7D0DFC1AC100C1CDCC /* BSDBThreadSource.m */, | |
68 | + F46C0E7E0DFC1AC100C1CDCC /* BSDBViewer.h */, | |
69 | + F46C0E7F0DFC1AC100C1CDCC /* BSDBViewer.m */, | |
70 | + ); | |
71 | + name = Classes; | |
72 | + sourceTree = "<group>"; | |
73 | + }; | |
74 | + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { | |
75 | + isa = PBXGroup; | |
76 | + children = ( | |
77 | + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, | |
78 | + ); | |
79 | + name = "Linked Frameworks"; | |
80 | + sourceTree = "<group>"; | |
81 | + }; | |
82 | + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { | |
83 | + isa = PBXGroup; | |
84 | + children = ( | |
85 | + 29B97324FDCFA39411CA2CEA /* AppKit.framework */, | |
86 | + 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, | |
87 | + 29B97325FDCFA39411CA2CEA /* Foundation.framework */, | |
88 | + ); | |
89 | + name = "Other Frameworks"; | |
90 | + sourceTree = "<group>"; | |
91 | + }; | |
92 | + 19C28FACFE9D520D11CA2CBB /* Products */ = { | |
93 | + isa = PBXGroup; | |
94 | + children = ( | |
95 | + 8D1107320486CEB800E47090 /* BSDBViewer.app */, | |
96 | + ); | |
97 | + name = Products; | |
98 | + sourceTree = "<group>"; | |
99 | + }; | |
100 | + 29B97314FDCFA39411CA2CEA /* BSDBViewer */ = { | |
101 | + isa = PBXGroup; | |
102 | + children = ( | |
103 | + F46C0E920DFD72DC00C1CDCC /* Libraries */, | |
104 | + F46C0E8D0DFD72AC00C1CDCC /* External Sources */, | |
105 | + 080E96DDFE201D6D7F000001 /* Classes */, | |
106 | + 29B97315FDCFA39411CA2CEA /* Other Sources */, | |
107 | + 29B97317FDCFA39411CA2CEA /* Resources */, | |
108 | + 29B97323FDCFA39411CA2CEA /* Frameworks */, | |
109 | + 19C28FACFE9D520D11CA2CBB /* Products */, | |
110 | + ); | |
111 | + name = BSDBViewer; | |
112 | + sourceTree = "<group>"; | |
113 | + }; | |
114 | + 29B97315FDCFA39411CA2CEA /* Other Sources */ = { | |
115 | + isa = PBXGroup; | |
116 | + children = ( | |
117 | + 32CA4F630368D1EE00C91783 /* BSDBViewer_Prefix.pch */, | |
118 | + 29B97316FDCFA39411CA2CEA /* main.m */, | |
119 | + ); | |
120 | + name = "Other Sources"; | |
121 | + sourceTree = "<group>"; | |
122 | + }; | |
123 | + 29B97317FDCFA39411CA2CEA /* Resources */ = { | |
124 | + isa = PBXGroup; | |
125 | + children = ( | |
126 | + 8D1107310486CEB800E47090 /* Info.plist */, | |
127 | + 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, | |
128 | + 29B97318FDCFA39411CA2CEA /* MainMenu.nib */, | |
129 | + ); | |
130 | + name = Resources; | |
131 | + sourceTree = "<group>"; | |
132 | + }; | |
133 | + 29B97323FDCFA39411CA2CEA /* Frameworks */ = { | |
134 | + isa = PBXGroup; | |
135 | + children = ( | |
136 | + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, | |
137 | + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, | |
138 | + ); | |
139 | + name = Frameworks; | |
140 | + sourceTree = "<group>"; | |
141 | + }; | |
142 | + F46C0E8D0DFD72AC00C1CDCC /* External Sources */ = { | |
143 | + isa = PBXGroup; | |
144 | + children = ( | |
145 | + F46C0F030DFFFF3000C1CDCC /* UTILAssertion.h */, | |
146 | + F46C0F040DFFFF3000C1CDCC /* UTILDescription.h */, | |
147 | + F46C0F050DFFFF3000C1CDCC /* UTILError.h */, | |
148 | + F46C0F060DFFFF3000C1CDCC /* UTILKit.h */, | |
149 | + F46C0E8E0DFD72C600C1CDCC /* SQLiteDB.m */, | |
150 | + F46C0E8F0DFD72C600C1CDCC /* SQLiteDB.h */, | |
151 | + F46C0E900DFD72C600C1CDCC /* sqlite3.h */, | |
152 | + ); | |
153 | + name = "External Sources"; | |
154 | + sourceTree = "<group>"; | |
155 | + }; | |
156 | + F46C0E920DFD72DC00C1CDCC /* Libraries */ = { | |
157 | + isa = PBXGroup; | |
158 | + children = ( | |
159 | + F46C0E930DFD72EB00C1CDCC /* libsqlite.a */, | |
160 | + ); | |
161 | + name = Libraries; | |
162 | + sourceTree = "<group>"; | |
163 | + }; | |
164 | +/* End PBXGroup section */ | |
165 | + | |
166 | +/* Begin PBXNativeTarget section */ | |
167 | + 8D1107260486CEB800E47090 /* BSDBViewer */ = { | |
168 | + isa = PBXNativeTarget; | |
169 | + buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "BSDBViewer" */; | |
170 | + buildPhases = ( | |
171 | + 8D1107290486CEB800E47090 /* Resources */, | |
172 | + 8D11072C0486CEB800E47090 /* Sources */, | |
173 | + 8D11072E0486CEB800E47090 /* Frameworks */, | |
174 | + ); | |
175 | + buildRules = ( | |
176 | + ); | |
177 | + dependencies = ( | |
178 | + ); | |
179 | + name = BSDBViewer; | |
180 | + productInstallPath = "$(HOME)/Applications"; | |
181 | + productName = BSDBViewer; | |
182 | + productReference = 8D1107320486CEB800E47090 /* BSDBViewer.app */; | |
183 | + productType = "com.apple.product-type.application"; | |
184 | + }; | |
185 | +/* End PBXNativeTarget section */ | |
186 | + | |
187 | +/* Begin PBXProject section */ | |
188 | + 29B97313FDCFA39411CA2CEA /* Project object */ = { | |
189 | + isa = PBXProject; | |
190 | + buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "BSDBViewer" */; | |
191 | + compatibilityVersion = "Xcode 3.0"; | |
192 | + hasScannedForEncodings = 1; | |
193 | + mainGroup = 29B97314FDCFA39411CA2CEA /* BSDBViewer */; | |
194 | + projectDirPath = ""; | |
195 | + projectRoot = ""; | |
196 | + targets = ( | |
197 | + 8D1107260486CEB800E47090 /* BSDBViewer */, | |
198 | + ); | |
199 | + }; | |
200 | +/* End PBXProject section */ | |
201 | + | |
202 | +/* Begin PBXResourcesBuildPhase section */ | |
203 | + 8D1107290486CEB800E47090 /* Resources */ = { | |
204 | + isa = PBXResourcesBuildPhase; | |
205 | + buildActionMask = 2147483647; | |
206 | + files = ( | |
207 | + 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */, | |
208 | + 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, | |
209 | + ); | |
210 | + runOnlyForDeploymentPostprocessing = 0; | |
211 | + }; | |
212 | +/* End PBXResourcesBuildPhase section */ | |
213 | + | |
214 | +/* Begin PBXSourcesBuildPhase section */ | |
215 | + 8D11072C0486CEB800E47090 /* Sources */ = { | |
216 | + isa = PBXSourcesBuildPhase; | |
217 | + buildActionMask = 2147483647; | |
218 | + files = ( | |
219 | + 8D11072D0486CEB800E47090 /* main.m in Sources */, | |
220 | + F46C0E800DFC1AC100C1CDCC /* BSDBBoardSource.m in Sources */, | |
221 | + F46C0E810DFC1AC100C1CDCC /* BSDBThreadSource.m in Sources */, | |
222 | + F46C0E820DFC1AC100C1CDCC /* BSDBViewer.m in Sources */, | |
223 | + F46C0E910DFD72C600C1CDCC /* SQLiteDB.m in Sources */, | |
224 | + ); | |
225 | + runOnlyForDeploymentPostprocessing = 0; | |
226 | + }; | |
227 | +/* End PBXSourcesBuildPhase section */ | |
228 | + | |
229 | +/* Begin PBXVariantGroup section */ | |
230 | + 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { | |
231 | + isa = PBXVariantGroup; | |
232 | + children = ( | |
233 | + 089C165DFE840E0CC02AAC07 /* English */, | |
234 | + ); | |
235 | + name = InfoPlist.strings; | |
236 | + sourceTree = "<group>"; | |
237 | + }; | |
238 | + 29B97318FDCFA39411CA2CEA /* MainMenu.nib */ = { | |
239 | + isa = PBXVariantGroup; | |
240 | + children = ( | |
241 | + 29B97319FDCFA39411CA2CEA /* English */, | |
242 | + ); | |
243 | + name = MainMenu.nib; | |
244 | + sourceTree = "<group>"; | |
245 | + }; | |
246 | +/* End PBXVariantGroup section */ | |
247 | + | |
248 | +/* Begin XCBuildConfiguration section */ | |
249 | + C01FCF4B08A954540054247B /* Debug */ = { | |
250 | + isa = XCBuildConfiguration; | |
251 | + buildSettings = { | |
252 | + COPY_PHASE_STRIP = NO; | |
253 | + GCC_DYNAMIC_NO_PIC = NO; | |
254 | + GCC_ENABLE_FIX_AND_CONTINUE = YES; | |
255 | + GCC_MODEL_TUNING = ""; | |
256 | + GCC_OPTIMIZATION_LEVEL = 0; | |
257 | + GCC_PRECOMPILE_PREFIX_HEADER = YES; | |
258 | + GCC_PREFIX_HEADER = BSDBViewer_Prefix.pch; | |
259 | + INFOPLIST_FILE = Info.plist; | |
260 | + INSTALL_PATH = "$(HOME)/Applications"; | |
261 | + LIBRARY_SEARCH_PATHS = ( | |
262 | + "$(inherited)", | |
263 | + "\"$(SRCROOT)\"", | |
264 | + ); | |
265 | + MACOSX_DEPLOYMENT_TARGET = 10.4; | |
266 | + PRODUCT_NAME = BSDBViewer; | |
267 | + WRAPPER_EXTENSION = app; | |
268 | + ZERO_LINK = NO; | |
269 | + }; | |
270 | + name = Debug; | |
271 | + }; | |
272 | + C01FCF4C08A954540054247B /* Release */ = { | |
273 | + isa = XCBuildConfiguration; | |
274 | + buildSettings = { | |
275 | + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; | |
276 | + GCC_MODEL_TUNING = ""; | |
277 | + GCC_PRECOMPILE_PREFIX_HEADER = YES; | |
278 | + GCC_PREFIX_HEADER = BSDBViewer_Prefix.pch; | |
279 | + GCC_PREPROCESSOR_DEFINITIONS = UTIL_BLOCK_DEBUG_WRITE; | |
280 | + INFOPLIST_FILE = Info.plist; | |
281 | + INSTALL_PATH = "$(HOME)/Applications"; | |
282 | + LIBRARY_SEARCH_PATHS = ( | |
283 | + "$(inherited)", | |
284 | + "\"$(SRCROOT)\"", | |
285 | + ); | |
286 | + MACOSX_DEPLOYMENT_TARGET = 10.4; | |
287 | + PRODUCT_NAME = BSDBViewer; | |
288 | + WRAPPER_EXTENSION = app; | |
289 | + ZERO_LINK = NO; | |
290 | + }; | |
291 | + name = Release; | |
292 | + }; | |
293 | + C01FCF4F08A954540054247B /* Debug */ = { | |
294 | + isa = XCBuildConfiguration; | |
295 | + buildSettings = { | |
296 | + GCC_WARN_ABOUT_RETURN_TYPE = YES; | |
297 | + GCC_WARN_UNUSED_VARIABLE = YES; | |
298 | + PREBINDING = NO; | |
299 | + SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk"; | |
300 | + }; | |
301 | + name = Debug; | |
302 | + }; | |
303 | + C01FCF5008A954540054247B /* Release */ = { | |
304 | + isa = XCBuildConfiguration; | |
305 | + buildSettings = { | |
306 | + ARCHS = ( | |
307 | + ppc, | |
308 | + i386, | |
309 | + ); | |
310 | + GCC_PREPROCESSOR_DEFINITIONS = ""; | |
311 | + GCC_WARN_ABOUT_RETURN_TYPE = YES; | |
312 | + GCC_WARN_UNUSED_VARIABLE = YES; | |
313 | + PREBINDING = NO; | |
314 | + SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk"; | |
315 | + }; | |
316 | + name = Release; | |
317 | + }; | |
318 | +/* End XCBuildConfiguration section */ | |
319 | + | |
320 | +/* Begin XCConfigurationList section */ | |
321 | + C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "BSDBViewer" */ = { | |
322 | + isa = XCConfigurationList; | |
323 | + buildConfigurations = ( | |
324 | + C01FCF4B08A954540054247B /* Debug */, | |
325 | + C01FCF4C08A954540054247B /* Release */, | |
326 | + ); | |
327 | + defaultConfigurationIsVisible = 0; | |
328 | + defaultConfigurationName = Release; | |
329 | + }; | |
330 | + C01FCF4E08A954540054247B /* Build configuration list for PBXProject "BSDBViewer" */ = { | |
331 | + isa = XCConfigurationList; | |
332 | + buildConfigurations = ( | |
333 | + C01FCF4F08A954540054247B /* Debug */, | |
334 | + C01FCF5008A954540054247B /* Release */, | |
335 | + ); | |
336 | + defaultConfigurationIsVisible = 0; | |
337 | + defaultConfigurationName = Release; | |
338 | + }; | |
339 | +/* End XCConfigurationList section */ | |
340 | + }; | |
341 | + rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; | |
342 | +} |
@@ -0,0 +1,9 @@ | ||
1 | +// | |
2 | +// Prefix header for all source files of the 'BSDBViewer' target in the 'BSDBViewer' project | |
3 | +// | |
4 | + | |
5 | +#ifdef __OBJC__ | |
6 | + #import <Cocoa/Cocoa.h> | |
7 | +#endif | |
8 | + | |
9 | +#import "UTILKit.h" | |
\ No newline at end of file |
@@ -0,0 +1,8 @@ | ||
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |
3 | +<plist version="1.0"> | |
4 | +<dict> | |
5 | + <key>NSHumanReadableCopyright</key> | |
6 | + <string>© masakih, 2008</string> | |
7 | +</dict> | |
8 | +</plist> |
@@ -0,0 +1,87 @@ | ||
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |
3 | +<plist version="1.0"> | |
4 | +<dict> | |
5 | + <key>IBClasses</key> | |
6 | + <array> | |
7 | + <dict> | |
8 | + <key>ACTIONS</key> | |
9 | + <dict> | |
10 | + <key>update</key> | |
11 | + <string>id</string> | |
12 | + </dict> | |
13 | + <key>CLASS</key> | |
14 | + <string>BSDBThreadSource</string> | |
15 | + <key>LANGUAGE</key> | |
16 | + <string>ObjC</string> | |
17 | + <key>OUTLETS</key> | |
18 | + <dict> | |
19 | + <key>delegate</key> | |
20 | + <string>id</string> | |
21 | + </dict> | |
22 | + <key>SUPERCLASS</key> | |
23 | + <string>NSObject</string> | |
24 | + </dict> | |
25 | + <dict> | |
26 | + <key>ACTIONS</key> | |
27 | + <dict> | |
28 | + <key>update</key> | |
29 | + <string>id</string> | |
30 | + </dict> | |
31 | + <key>CLASS</key> | |
32 | + <string>BSDBBoardSource</string> | |
33 | + <key>LANGUAGE</key> | |
34 | + <string>ObjC</string> | |
35 | + <key>OUTLETS</key> | |
36 | + <dict> | |
37 | + <key>delegate</key> | |
38 | + <string>id</string> | |
39 | + </dict> | |
40 | + <key>SUPERCLASS</key> | |
41 | + <string>NSObject</string> | |
42 | + </dict> | |
43 | + <dict> | |
44 | + <key>ACTIONS</key> | |
45 | + <dict> | |
46 | + <key>deleteThreadInfo</key> | |
47 | + <string>id</string> | |
48 | + <key>openInBathyScaphe</key> | |
49 | + <string>id</string> | |
50 | + <key>showThreadInfo</key> | |
51 | + <string>id</string> | |
52 | + </dict> | |
53 | + <key>CLASS</key> | |
54 | + <string>BSDBViewer</string> | |
55 | + <key>LANGUAGE</key> | |
56 | + <string>ObjC</string> | |
57 | + <key>OUTLETS</key> | |
58 | + <dict> | |
59 | + <key>boardArrayController</key> | |
60 | + <string>id</string> | |
61 | + <key>boardSource</key> | |
62 | + <string>id</string> | |
63 | + <key>boardView</key> | |
64 | + <string>id</string> | |
65 | + <key>threadArrayController</key> | |
66 | + <string>id</string> | |
67 | + <key>threadSource</key> | |
68 | + <string>id</string> | |
69 | + <key>threadView</key> | |
70 | + <string>id</string> | |
71 | + <key>window</key> | |
72 | + <string>id</string> | |
73 | + </dict> | |
74 | + <key>SUPERCLASS</key> | |
75 | + <string>NSObject</string> | |
76 | + </dict> | |
77 | + <dict> | |
78 | + <key>CLASS</key> | |
79 | + <string>NSObject</string> | |
80 | + <key>LANGUAGE</key> | |
81 | + <string>ObjC</string> | |
82 | + </dict> | |
83 | + </array> | |
84 | + <key>IBVersion</key> | |
85 | + <string>1</string> | |
86 | +</dict> | |
87 | +</plist> |
@@ -0,0 +1,23 @@ | ||
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |
3 | +<plist version="1.0"> | |
4 | +<dict> | |
5 | + <key>IBFramework Version</key> | |
6 | + <string>629</string> | |
7 | + <key>IBLastKnownRelativeProjectPath</key> | |
8 | + <string>../../BSDBViewer.xcodeproj</string> | |
9 | + <key>IBOldestOS</key> | |
10 | + <integer>4</integer> | |
11 | + <key>IBOpenObjects</key> | |
12 | + <array> | |
13 | + <integer>371</integer> | |
14 | + <integer>24</integer> | |
15 | + <integer>530</integer> | |
16 | + <integer>544</integer> | |
17 | + </array> | |
18 | + <key>IBSystem Version</key> | |
19 | + <string>9D34</string> | |
20 | + <key>targetFramework</key> | |
21 | + <string>IBCocoaFramework</string> | |
22 | +</dict> | |
23 | +</plist> |
@@ -0,0 +1,30 @@ | ||
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |
3 | +<plist version="1.0"> | |
4 | +<dict> | |
5 | + <key>CFBundleDevelopmentRegion</key> | |
6 | + <string>English</string> | |
7 | + <key>CFBundleExecutable</key> | |
8 | + <string>${EXECUTABLE_NAME}</string> | |
9 | + <key>CFBundleIconFile</key> | |
10 | + <string></string> | |
11 | + <key>CFBundleIdentifier</key> | |
12 | + <string>com.masakih.BSDBViewer</string> | |
13 | + <key>CFBundleInfoDictionaryVersion</key> | |
14 | + <string>6.0</string> | |
15 | + <key>CFBundleName</key> | |
16 | + <string>${PRODUCT_NAME}</string> | |
17 | + <key>CFBundlePackageType</key> | |
18 | + <string>APPL</string> | |
19 | + <key>CFBundleShortVersionString</key> | |
20 | + <string>1.0</string> | |
21 | + <key>CFBundleSignature</key> | |
22 | + <string>????</string> | |
23 | + <key>CFBundleVersion</key> | |
24 | + <string>%%%%REVISION%%%%</string> | |
25 | + <key>NSMainNibFile</key> | |
26 | + <string>MainMenu</string> | |
27 | + <key>NSPrincipalClass</key> | |
28 | + <string>NSApplication</string> | |
29 | +</dict> | |
30 | +</plist> |
@@ -0,0 +1,59 @@ | ||
1 | + | |
2 | +PRODUCT_NAME=BSDBViewer | |
3 | +PRODUCT_EXTENSION=app | |
4 | +BUILD_PATH=./build | |
5 | +DEPLOYMENT=Release | |
6 | +APP_BUNDLE=$(PRODUCT_NAME).$(PRODUCT_EXTENSION) | |
7 | +APP=$(BUILD_PATH)/$(DEPLOYMENT)/$(APP_BUNDLE) | |
8 | +APP_NAME=$(BUILD_PATH)/$(DEPLOYMENT)/$(PRODUCT_NAME) | |
9 | +INFO_PLIST=Info.plist | |
10 | + | |
11 | +URL_BSDBViewer = svn+ssh://macmini/usr/local/svnrepos/BSDBViewer | |
12 | +HEAD = $(URL_BSDBViewer)/BSDBViewer | |
13 | +TAGS_DIR = $(URL_BSDBViewer)/tags | |
14 | + | |
15 | +VER_CMD=grep -A1 'CFBundleShortVersionString' $(INFO_PLIST) | tail -1 | tr -d "'\t</string>" | |
16 | +VERSION=$(shell $(VER_CMD)) | |
17 | + | |
18 | +all: | |
19 | + @echo do nothig. | |
20 | + @echo use target tagging | |
21 | + | |
22 | +tagging: | |
23 | + @echo "Tagging the $(VERSION) (x) release of BSDBViewer project." | |
24 | + export LC_ALL=C; \ | |
25 | + REV=`svn info | awk '/Last Changed Rev/ {print $$4}'` ; \ | |
26 | + echo svn copy $(HEAD) $(TAGS_DIR)/release-$(VERSION).$${REV} | |
27 | + | |
28 | +Localizable: BSTRADocument.m | |
29 | + genstrings -o English.lproj $< | |
30 | + (cd English.lproj; ${MAKE} $@;) | |
31 | + genstrings -o Japanese.lproj $< | |
32 | + (cd Japanese.lproj; ${MAKE} $@;) | |
33 | + | |
34 | +checkLocalizable: | |
35 | + (cd English.lproj; ${MAKE} $@;) | |
36 | + (cd Japanese.lproj; ${MAKE} $@;) | |
37 | + | |
38 | +release: updateRevision | |
39 | + xcodebuild -configuration $(DEPLOYMENT) | |
40 | + $(MAKE) restorInfoPlist | |
41 | + | |
42 | +package: release | |
43 | + export LC_ALL=C; \ | |
44 | + REV=`svn info | awk '/Last Changed Rev/ {print $$4}'`; \ | |
45 | + ditto -ck -rsrc --keepParent $(APP) $(APP_NAME)-$(VERSION)-$${REV}.zip | |
46 | + | |
47 | +updateRevision: update_svn | |
48 | + if [ ! -f $(INFO_PLIST).bak ] ; then cp $(INFO_PLIST) $(INFO_PLIST).bak ; fi ; \ | |
49 | + export LC_ALL=C; \ | |
50 | + REV=`svn info | awk '/Last Changed Rev/ {print $$4}'` ; \ | |
51 | + sed -e "s/%%%%REVISION%%%%/$${REV}/" $(INFO_PLIST) > $(INFO_PLIST).r ; \ | |
52 | + mv -f $(INFO_PLIST).r $(INFO_PLIST) ; \ | |
53 | + | |
54 | +restorInfoPlist: | |
55 | + if [ -f $(INFO_PLIST).bak ] ; then cp -f $(INFO_PLIST).bak $(INFO_PLIST) ; fi | |
56 | + | |
57 | +update_svn: | |
58 | + svn up | |
59 | + |
@@ -0,0 +1,128 @@ | ||
1 | +// | |
2 | +// SQLiteDB.h | |
3 | +// BathyScaphe | |
4 | +// | |
5 | +// Created by Hori,Masaki on 05/12/12. | |
6 | +// Copyright 2005 BathyScaphe Project. All rights reserved. | |
7 | +// | |
8 | + | |
9 | +#import <Cocoa/Cocoa.h> | |
10 | + | |
11 | +#import "sqlite3.h" | |
12 | + | |
13 | +@protocol SQLiteRow <NSObject> | |
14 | +- (unsigned) columnCount; | |
15 | +- (NSArray *) columnNames; | |
16 | +- (id) valueForColumn : (NSString *) column; | |
17 | +@end | |
18 | + | |
19 | +@protocol SQLiteCursor <NSObject> | |
20 | +- (unsigned) columnCount; | |
21 | +- (NSArray *) columnNames; | |
22 | + | |
23 | +- (unsigned) rowCount; | |
24 | +- (id) valueForColumn : (NSString *) column atRow : (unsigned) row; | |
25 | +- (NSArray *) valuesForColumn : (NSString *) column; | |
26 | +- (id <SQLiteRow>) rowAtIndex : (unsigned) row; | |
27 | +- (NSArray *) arrayForTableView; | |
28 | +@end | |
29 | + | |
30 | +@protocol SQLiteMutableCursor <SQLiteCursor> | |
31 | +- (BOOL) appendRow : (id <SQLiteRow>) row; | |
32 | +- (BOOL) appendCursor : (id <SQLiteCursor>) cursor; | |
33 | +@end | |
34 | + | |
35 | +@class SQLiteReservedQuery; | |
36 | + | |
37 | +@interface SQLiteDB : NSObject | |
38 | +{ | |
39 | + NSString *mPath; | |
40 | + sqlite3 *mDatabase; | |
41 | + | |
42 | + BOOL _isOpen; | |
43 | + BOOL _transaction; | |
44 | +} | |
45 | + | |
46 | +- (id) initWithDatabasePath : (NSString *) path; | |
47 | + | |
48 | ++ (NSString *) prepareStringForQuery : (NSString *) inString; | |
49 | + | |
50 | +- (void) setDatabaseFile : (NSString *) path; | |
51 | +- (NSString *) databasePath; | |
52 | + | |
53 | +- (sqlite3 *) rowDatabase; | |
54 | + | |
55 | +- (BOOL) open; | |
56 | +- (int) close; | |
57 | +- (BOOL) isDatabaseOpen; | |
58 | + | |
59 | +- (NSString *) lastError; | |
60 | +- (int) lastErrorID; | |
61 | + | |
62 | +- (id <SQLiteMutableCursor>) cursorForSQL : (NSString *) sqlString; | |
63 | +- (id <SQLiteMutableCursor>) performQuery : (NSString *) sqlString; // alias cursorForSQL. for compatible QuickLite. | |
64 | + | |
65 | +- (SQLiteReservedQuery *) reservedQuery : (NSString *) sqlString; | |
66 | + | |
67 | +@end | |
68 | + | |
69 | +@interface SQLiteDB (DatabaseAccessor) | |
70 | + | |
71 | +- (NSArray *) tables; | |
72 | + | |
73 | +- (BOOL) beginTransaction; | |
74 | +- (BOOL) commitTransaction; | |
75 | +- (BOOL) rollbackTransaction; | |
76 | + | |
77 | +- (BOOL) save; // do nothing. for compatible QuickLite. | |
78 | + | |
79 | +- (BOOL) createTable : (NSString *) table withColumns : (NSArray *) columns andDatatypes : (NSArray *) datatypes; | |
80 | +- (BOOL) createTable : (NSString *) table | |
81 | + columns : (NSArray *) columns | |
82 | + datatypes : (NSArray *) datatypes | |
83 | + defaultValues : (NSArray *)defaultValues | |
84 | + checkConstrains : (NSArray *)checkConstrains; | |
85 | +- (BOOL) createTemporaryTable : (NSString *) table withColumns : (NSArray *) columns andDatatypes : (NSArray *) datatypes; | |
86 | +- (BOOL) createTemporaryTable : (NSString *) table | |
87 | + columns : (NSArray *) columns | |
88 | + datatypes : (NSArray *) datatypes | |
89 | + defaultValues : (NSArray *)defaultValues | |
90 | + checkConstrains : (NSArray *)checkConstrains; | |
91 | + | |
92 | + | |
93 | +- (BOOL) createIndexForColumn : (NSString *) column inTable : (NSString *) table isUnique : (BOOL) isUnique; | |
94 | + | |
95 | + | |
96 | +- (BOOL) deleteIndexForColumn:(NSString *)column inTable:(NSString *)table; | |
97 | + | |
98 | +@end | |
99 | + | |
100 | +@interface SQLiteReservedQuery : NSObject | |
101 | +{ | |
102 | + sqlite3_stmt *m_stmt; | |
103 | +} | |
104 | ++ (id) sqliteReservedQueryWithQuery : (NSString *) sqlString usingSQLiteDB : (SQLiteDB *) db; | |
105 | +- (id) initWithQuery : (NSString *) sqlString usingSQLiteDB : (SQLiteDB *) db; | |
106 | + | |
107 | +- (id <SQLiteMutableCursor>) cursorForBindValues : (NSArray *) values; | |
108 | + | |
109 | +@end | |
110 | + | |
111 | + | |
112 | +extern NSString *QLString; // alias TEXT. for compatible QuickLite. | |
113 | +extern NSString *QLNumber; // alias NUMERIC. for compatible QuickLite. | |
114 | +extern NSString *QLDateTime; // alias TEXT. for compatible QuickLite. NOTE : | |
115 | + | |
116 | +extern NSString *INTERGER_PRIMARY_KEY; | |
117 | +extern NSString *TEXT_NOTNULL; | |
118 | +extern NSString *TEXT_UNIQUE; | |
119 | +extern NSString *TEXT_NOTNULL_UNIQUE; | |
120 | +extern NSString *INTEGER_NOTNULL; | |
121 | +extern NSString *INTERGER_UNIQUE; | |
122 | +extern NSString *INTERGER_NOTNULL_UNIQUE; | |
123 | +extern NSString *NUMERIC_NOTNULL; | |
124 | +extern NSString *NUMERIC_UNIQUE; | |
125 | +extern NSString *NUMERIC_NOTNULL_UNIQUE; | |
126 | +extern NSString *NONE_NOTNULL; | |
127 | +extern NSString *NONE_UNIQUE; | |
128 | +extern NSString *NONE_NOTNULL_UNIQUE; |
@@ -0,0 +1,785 @@ | ||
1 | +// | |
2 | +// SQLiteDB.m | |
3 | +// BathyScaphe | |
4 | +// | |
5 | +// Created by Hori,Masaki on 05/12/12. | |
6 | +// Copyright 2005 BathyScaphe Project. All rights reserved. | |
7 | +// | |
8 | + | |
9 | +#import "SQLiteDB.h" | |
10 | + | |
11 | +#import "sqlite3.h" | |
12 | + | |
13 | +#import <sys/time.h> | |
14 | + | |
15 | +@interface NSDictionary (SQLiteRow) <SQLiteRow> | |
16 | +@end | |
17 | +@interface NSMutableDictionary (SQLiteMutableCursor) <SQLiteMutableCursor> | |
18 | +@end | |
19 | + | |
20 | +@implementation SQLiteDB | |
21 | + | |
22 | + | |
23 | +static NSString *TestColumnNames = @"ColumnNames"; | |
24 | +static NSString *TestValues = @"Values"; | |
25 | + | |
26 | + | |
27 | +NSString *QLString = @"TEXT"; | |
28 | +NSString *QLNumber = @"NUMERIC"; | |
29 | +NSString *QLDateTime = @"TEXT"; | |
30 | + | |
31 | +NSString *INTERGER_PRIMARY_KEY =@"INTEGER PRIMARY KEY"; | |
32 | + | |
33 | +NSString *TEXT_NOTNULL = @"TEXT NOT NULL"; | |
34 | +NSString *TEXT_UNIQUE = @"TEXT UNIQUE"; | |
35 | +NSString *TEXT_NOTNULL_UNIQUE = @"TEXT UNIQUE NOT NULL"; | |
36 | +NSString *INTEGER_NOTNULL = @"INTEGER NOT NULL"; | |
37 | +NSString *INTEGER_UNIQUE = @"INTEGER UNIQUE"; | |
38 | +NSString *INTEGER_NOTNULL_UNIQUE = @"INTEGER UNIQUE NOT NULL"; | |
39 | +NSString *NUMERIC_NOTNULL = @"NUMERIC NOT NULL"; | |
40 | +NSString *NUMERIC_UNIQUE = @"NUMERIC UNIQUE"; | |
41 | +NSString *NUMERIC_NOTNULL_UNIQUE = @"NUMERIC UNIQUE NOT NULL"; | |
42 | +NSString *NONE_NOTNULL = @"NOT NULL"; | |
43 | +NSString *NONE_UNIQUE = @"UNIQUE"; | |
44 | +NSString *NONE_NOTNULL_UNIQUE = @"UNIQUE NOT NULL"; | |
45 | + | |
46 | +double debug_clock() | |
47 | +{ | |
48 | + double t; | |
49 | + struct timeval tv; | |
50 | + gettimeofday(&tv, NULL); | |
51 | + t = tv.tv_sec + (double)tv.tv_usec*1e-6; | |
52 | + return t; | |
53 | +} | |
54 | +void debug_log(const char *p,...) | |
55 | +{ | |
56 | + NSUserDefaults *d = [NSUserDefaults standardUserDefaults]; | |
57 | + | |
58 | + if([d boolForKey:@"SQLITE_DEBUG_LOG"]) { | |
59 | + va_list args; | |
60 | + va_start(args, p); | |
61 | + vfprintf(stderr, p, args); | |
62 | + } | |
63 | +} | |
64 | +void debug_log_time(double t1, double t2) | |
65 | +{ | |
66 | + debug_log( "total time : \t%02.4lf\n",(t2) - (t1)); | |
67 | +} | |
68 | + | |
69 | +int progressHandler(void *obj) | |
70 | +{ | |
71 | + // NSLog(@"Enter progressHandler ->%@", obj); | |
72 | + | |
73 | + return SQLITE_OK; | |
74 | +} | |
75 | + | |
76 | ++ (NSString *) prepareStringForQuery : (NSString *) inString | |
77 | +{ | |
78 | + NSString *str; | |
79 | + const char *p; | |
80 | + char *q; | |
81 | + | |
82 | + p = [inString UTF8String]; | |
83 | + q = sqlite3_mprintf("%q", p); | |
84 | + str = [NSString stringWithUTF8String : q]; | |
85 | + sqlite3_free(q); | |
86 | + | |
87 | + return str; | |
88 | +} | |
89 | + | |
90 | +- (id) initWithDatabasePath : (NSString *) path | |
91 | +{ | |
92 | + if (self = [super init]) { | |
93 | + [self setDatabaseFile : path]; | |
94 | + _isOpen = NO; | |
95 | + } | |
96 | + | |
97 | + return self; | |
98 | +} | |
99 | + | |
100 | +- (void) dealloc | |
101 | +{ | |
102 | + [self close]; | |
103 | + [mPath release]; | |
104 | + | |
105 | + [super dealloc]; | |
106 | +} | |
107 | + | |
108 | +- (NSString *) lastError | |
109 | +{ | |
110 | + if (!mDatabase) return nil; | |
111 | + | |
112 | + return [NSString stringWithUTF8String : sqlite3_errmsg(mDatabase)]; | |
113 | +} | |
114 | +- (int) lastErrorID | |
115 | +{ | |
116 | + if (!mDatabase) return SQLITE_ERROR; | |
117 | + | |
118 | + return sqlite3_errcode(mDatabase); | |
119 | +} | |
120 | + | |
121 | +- (void) setDatabaseFile : (NSString *) path | |
122 | +{ | |
123 | + id temp = mPath; | |
124 | + mPath = [path copy]; | |
125 | + [temp release]; | |
126 | + | |
127 | + [self open]; | |
128 | +} | |
129 | +- (NSString *) databasePath | |
130 | +{ | |
131 | + return [NSString stringWithString : mPath]; | |
132 | +} | |
133 | + | |
134 | +- (sqlite3 *) rowDatabase | |
135 | +{ | |
136 | + return mDatabase; | |
137 | +} | |
138 | + | |
139 | +- (BOOL) open | |
140 | +{ | |
141 | + const char *filepath = [mPath fileSystemRepresentation]; | |
142 | + int result; | |
143 | + | |
144 | + if ([self isDatabaseOpen]) { | |
145 | + [self close]; | |
146 | + } | |
147 | + | |
148 | + UTILDebugWrite(@"Start Open database."); | |
149 | + result = sqlite3_open(filepath, &mDatabase); | |
150 | + if(result != SQLITE_OK) { | |
151 | + NSLog(@"Can not open database. \nFile -> %@.\nError Code : %d", mPath, result); | |
152 | + [mPath release]; | |
153 | + mPath = nil; | |
154 | + mDatabase = NULL; | |
155 | + | |
156 | + return NO; | |
157 | + }/* else { | |
158 | + sqlite3_progress_handler(mDatabase, 1, progressHandler, self); | |
159 | + }*/ | |
160 | + | |
161 | + _isOpen = YES; | |
162 | + | |
163 | + return YES; | |
164 | +} | |
165 | +- (int) close | |
166 | +{ | |
167 | + int result = NO; | |
168 | + | |
169 | + if (mDatabase) { | |
170 | + UTILDebugWrite(@"Start Closing database."); | |
171 | + do { | |
172 | + result = sqlite3_close(mDatabase); | |
173 | + } while (result == SQLITE_BUSY); | |
174 | + mDatabase = NULL; | |
175 | + | |
176 | + UTILDebugWrite(@"End Closing database."); | |
177 | + } | |
178 | + | |
179 | + _isOpen = NO; | |
180 | + | |
181 | + return result; | |
182 | +} | |
183 | +- (BOOL) isDatabaseOpen | |
184 | +{ | |
185 | + return _isOpen; | |
186 | +} | |
187 | + | |
188 | +id <SQLiteRow> makeRowFromSTMT(sqlite3_stmt *stmt, NSArray *columns) | |
189 | +{ | |
190 | + NSNull *nsNull = [NSNull null]; | |
191 | + | |
192 | + CFMutableDictionaryRef result; | |
193 | + int i, columnCount = sqlite3_column_count(stmt); | |
194 | + | |
195 | + result = CFDictionaryCreateMutable(kCFAllocatorDefault, | |
196 | + columnCount, | |
197 | + &kCFTypeDictionaryKeyCallBacks, | |
198 | + &kCFTypeDictionaryValueCallBacks); | |
199 | + if(!result) return nil; | |
200 | + | |
201 | + for (i = 0; i < columnCount; i++) { | |
202 | + // const char *columnName = sqlite3_column_name(stmt, i); | |
203 | + const unsigned char *value = sqlite3_column_text(stmt, i); | |
204 | + id v = nil; | |
205 | + | |
206 | + if (value) { | |
207 | + v = (id)CFStringCreateWithCString(kCFAllocatorDefault, | |
208 | + (const char*)value, | |
209 | + kCFStringEncodingUTF8); | |
210 | + } | |
211 | + if (v) { | |
212 | + CFDictionaryAddValue(result, CFArrayGetValueAtIndex((CFArrayRef)columns, i), v); | |
213 | + } | |
214 | + | |
215 | + | |
216 | + if(v && v != nsNull) { | |
217 | + CFRelease(v); | |
218 | + } | |
219 | + } | |
220 | + | |
221 | + return [(id)result autorelease]; | |
222 | +} | |
223 | + | |
224 | +NSArray *columnsFromSTMT(sqlite3_stmt *stmt) | |
225 | +{ | |
226 | + CFMutableArrayRef result; | |
227 | + int i, columnCount = sqlite3_column_count(stmt); | |
228 | + | |
229 | + result = CFArrayCreateMutable(kCFAllocatorDefault, | |
230 | + columnCount, | |
231 | + &kCFTypeArrayCallBacks); | |
232 | + if(!result) return nil; | |
233 | + | |
234 | + for (i = 0; i < columnCount; i++) { | |
235 | + const char *columnName = sqlite3_column_name(stmt, i); | |
236 | + CFStringRef colStr; | |
237 | + CFMutableStringRef lowerColStr; | |
238 | + | |
239 | + colStr = CFStringCreateWithCString(kCFAllocatorDefault, | |
240 | + columnName, | |
241 | + kCFStringEncodingUTF8); | |
242 | + lowerColStr = CFStringCreateMutableCopy(kCFAllocatorDefault, | |
243 | + CFStringGetLength(colStr), | |
244 | + colStr); | |
245 | + CFStringLowercase(lowerColStr, CFLocaleGetSystem()); | |
246 | + CFArrayAppendValue(result, lowerColStr); | |
247 | + CFRelease(colStr); | |
248 | + CFRelease(lowerColStr); | |
249 | + } | |
250 | + | |
251 | + return [(id)result autorelease]; | |
252 | +} | |
253 | + | |
254 | +NSArray *valuesForSTMT(sqlite3_stmt *stmt, NSArray *culumns) | |
255 | +{ | |
256 | + int result; | |
257 | + BOOL finishFetch = NO; | |
258 | + id <SQLiteRow> dict; | |
259 | + CFMutableArrayRef values; | |
260 | + | |
261 | + values = CFArrayCreateMutable(kCFAllocatorDefault, | |
262 | + 0, | |
263 | + &kCFTypeArrayCallBacks); | |
264 | + if(!values) return nil; | |
265 | + | |
266 | + do { | |
267 | + BOOL updateCursor = NO; | |
268 | + | |
269 | + result = sqlite3_step(stmt); | |
270 | + | |
271 | + switch (result) { | |
272 | + case SQLITE_BUSY : | |
273 | + break; | |
274 | + case SQLITE_OK : | |
275 | + case SQLITE_DONE : | |
276 | + finishFetch = YES; | |
277 | + break; | |
278 | + case SQLITE_ROW : | |
279 | + updateCursor = YES; | |
280 | + break; | |
281 | + case SQLITE_SCHEMA: | |
282 | + continue; | |
283 | + default : | |
284 | + // sqlite3_finalize(stmt); | |
285 | + return nil; | |
286 | + break; | |
287 | + } | |
288 | + | |
289 | + if (updateCursor) { | |
290 | + dict = makeRowFromSTMT(stmt, culumns); | |
291 | + if (dict) { | |
292 | + CFArrayAppendValue(values, dict); | |
293 | + } | |
294 | + } | |
295 | + | |
296 | + } while (!finishFetch); | |
297 | + | |
298 | + return [(id)values autorelease]; | |
299 | +} | |
300 | + | |
301 | +id<SQLiteMutableCursor> cursorFromSTMT(sqlite3_stmt *stmt) | |
302 | +{ | |
303 | + id columns, values; | |
304 | + id<SQLiteMutableCursor> cursor; | |
305 | + | |
306 | + double time00, time01; | |
307 | + | |
308 | + time00 = debug_clock(); | |
309 | + columns = columnsFromSTMT(stmt); | |
310 | + values = valuesForSTMT(stmt, columns); | |
311 | + time01 = debug_clock(); | |
312 | + debug_log_time(time00, time01); | |
313 | + | |
314 | + if(!columns || !values) { | |
315 | + return nil; | |
316 | + } | |
317 | + cursor = [NSDictionary dictionaryWithObjectsAndKeys : columns, TestColumnNames, | |
318 | + values, TestValues, nil]; | |
319 | + | |
320 | + return cursor; | |
321 | +} | |
322 | + | |
323 | +- (id <SQLiteMutableCursor>) cursorForSQL : (NSString *) sqlString | |
324 | +{ | |
325 | + const char *sql; | |
326 | + sqlite3_stmt *stmt; | |
327 | + int result; | |
328 | + id <SQLiteMutableCursor> cursor; | |
329 | + | |
330 | + if (!mDatabase) { | |
331 | + return nil; | |
332 | + } | |
333 | + if (!sqlString) { | |
334 | + return nil; | |
335 | + } | |
336 | + | |
337 | + sql = [sqlString UTF8String]; | |
338 | + | |
339 | + result = sqlite3_prepare(mDatabase, sql, strlen(sql) , &stmt, &sql); | |
340 | + if(result != SQLITE_OK) return nil; | |
341 | + | |
342 | + debug_log("send query %s\n", [sqlString UTF8String]); | |
343 | + | |
344 | + cursor = cursorFromSTMT(stmt); | |
345 | + sqlite3_finalize(stmt); | |
346 | + | |
347 | + return cursor; | |
348 | +} | |
349 | + | |
350 | +- (id <SQLiteMutableCursor>) performQuery : (NSString *) sqlString | |
351 | +{ | |
352 | + return [self cursorForSQL : sqlString]; | |
353 | +} | |
354 | + | |
355 | +- (SQLiteReservedQuery *) reservedQuery : (NSString *) sqlString | |
356 | +{ | |
357 | + return [SQLiteReservedQuery sqliteReservedQueryWithQuery : sqlString usingSQLiteDB : self]; | |
358 | +} | |
359 | +@end | |
360 | + | |
361 | +@implementation SQLiteDB (DatabaseAccessor) | |
362 | + | |
363 | +- (NSArray *) tables | |
364 | +{ | |
365 | + id cursor; | |
366 | + id sql = [NSString stringWithFormat : @"%s", | |
367 | + "SELECT name FROM sqlite_master WHERE type = 'table' OR type = 'view' \ | |
368 | + UNION \ | |
369 | + SELECT name FROM sqlite_temp_master \ | |
370 | + WHERE type = 'table' OR type = 'view'"]; | |
371 | + | |
372 | + cursor = [self cursorForSQL : sql]; | |
373 | + | |
374 | + return [cursor valuesForColumn : @"Name"]; | |
375 | +} | |
376 | +- (BOOL) beginTransaction | |
377 | +{ | |
378 | + if (_transaction) { | |
379 | + NSLog(@"Already begin transaction."); | |
380 | + | |
381 | + return NO; | |
382 | + } | |
383 | + | |
384 | + _transaction = YES; | |
385 | + | |
386 | + [self performQuery : @"BEGIN"]; | |
387 | + | |
388 | + return [self lastErrorID] == 0; | |
389 | +} | |
390 | +- (BOOL) commitTransaction | |
391 | +{ | |
392 | + if (!_transaction) { | |
393 | + NSLog(@"Not begin transaction."); | |
394 | + | |
395 | + return NO; | |
396 | + } | |
397 | + | |
398 | + _transaction = NO; | |
399 | + | |
400 | + [self performQuery : @"COMMIT"]; | |
401 | + | |
402 | + return [self lastErrorID] == 0; | |
403 | +} | |
404 | +- (BOOL) rollbackTransaction | |
405 | +{ | |
406 | + if (!_transaction) { | |
407 | + NSLog(@"Not begin transaction."); | |
408 | + | |
409 | + return NO; | |
410 | + } | |
411 | + | |
412 | + _transaction = NO; | |
413 | + | |
414 | + [self performQuery : @"ROLLBACK"]; | |
415 | + | |
416 | + return [self lastErrorID] == 0; | |
417 | +} | |
418 | + | |
419 | +// do nothing. for compatible QuickLite. | |
420 | +- (BOOL) save { return YES; } | |
421 | + | |
422 | +- (NSString *) defaultValue : (id) inValue forDatatype : (NSString *) datatype | |
423 | +{ | |
424 | + NSString *defaultValue = nil; | |
425 | + | |
426 | + if(!inValue || inValue == [NSNull null]) { | |
427 | + return nil; | |
428 | + } | |
429 | + | |
430 | + if(!datatype || (id)datatype == [NSNull null]) { | |
431 | + defaultValue = [[self class] prepareStringForQuery : [inValue stringValue]]; | |
432 | + } | |
433 | + | |
434 | + NSRange range; | |
435 | + NSString *lower = [datatype lowercaseString]; | |
436 | + | |
437 | + range = [lower rangeOfString : @"text"]; | |
438 | + if(range.length != 0) { | |
439 | + defaultValue = [NSString stringWithFormat : @"'%@'", [[self class] prepareStringForQuery : [inValue stringValue]]]; | |
440 | + } | |
441 | + | |
442 | + range = [lower rangeOfString : @"integer"]; | |
443 | + if(range.length != 0) { | |
444 | + defaultValue = [NSString stringWithFormat : @"%d", [inValue intValue]]; | |
445 | + } | |
446 | + | |
447 | + range = [lower rangeOfString : @"numelic"]; | |
448 | + if(range.length != 0) { | |
449 | + defaultValue = [NSString stringWithFormat : @"%0.0f", [inValue floatValue]]; | |
450 | + } | |
451 | + | |
452 | + if(defaultValue) { | |
453 | + return [NSString stringWithFormat : @"DEFAULT %@", defaultValue]; | |
454 | + } | |
455 | + | |
456 | + return nil; | |
457 | +} | |
458 | + | |
459 | +- (NSString *) checkConstraint : (id) checkConstraint | |
460 | +{ | |
461 | + if(!checkConstraint || checkConstraint == [NSNull null]) { | |
462 | + return nil; | |
463 | + } | |
464 | + | |
465 | + return [NSString stringWithFormat : @"CHECK(%@)", checkConstraint];; | |
466 | +} | |
467 | + | |
468 | +- (BOOL) createTemporaryTable : (NSString *) table | |
469 | + columns : (NSArray *) columns | |
470 | + datatypes : (NSArray *) datatypes | |
471 | + defaultValues : (NSArray *) defaultValues | |
472 | + checkConstrains : (NSArray *) checkConstrains | |
473 | + isTemporary : (BOOL) isTemporary | |
474 | +{ | |
475 | + unsigned i; | |
476 | + unsigned columnCount = [columns count]; | |
477 | + NSMutableString *sql; | |
478 | + BOOL useDefaultValues = NO; | |
479 | + BOOL useCheck = NO; | |
480 | + | |
481 | + if (columnCount != [datatypes count]) return NO; | |
482 | + if (columnCount == 0) return NO; | |
483 | + | |
484 | + useDefaultValues = defaultValues ? YES :NO; | |
485 | + if(useDefaultValues && columnCount != [defaultValues count]) return NO; | |
486 | + useCheck = checkConstrains ? YES :NO; | |
487 | + if(useDefaultValues && columnCount != [checkConstrains count]) return NO; | |
488 | + | |
489 | + sql = [NSMutableString stringWithFormat : @"CREATE %@ TABLE %@ (", | |
490 | + isTemporary ? @"TEMPORARY" : @"", table]; | |
491 | + | |
492 | + for (i = 0; i < columnCount; i++) { | |
493 | + [sql appendFormat : @"%@ %@", [columns objectAtIndex : i], [datatypes objectAtIndex : i]]; | |
494 | + if(useDefaultValues) { | |
495 | + NSString *d = [self defaultValue: [defaultValues objectAtIndex : i ] | |
496 | + forDatatype : [datatypes objectAtIndex : i]]; | |
497 | + if(d) { | |
498 | + [sql appendFormat : @" %@", d]; | |
499 | + } | |
500 | + } | |
501 | + if(useCheck) { | |
502 | + NSString *c = [self checkConstraint : [checkConstrains objectAtIndex : i ]]; | |
503 | + if(c && (id)c != [NSNull null]) { | |
504 | + [sql appendFormat : @" %@", c]; | |
505 | + } | |
506 | + } | |
507 | + | |
508 | + if (i != columnCount - 1) { | |
509 | + [sql appendString : @","]; | |
510 | + } | |
511 | + } | |
512 | + [sql appendString : @") "]; | |
513 | + | |
514 | + [self performQuery : sql]; | |
515 | + | |
516 | + return [self lastErrorID] == 0; | |
517 | +} | |
518 | + | |
519 | + | |
520 | +- (BOOL) createTable : (NSString *) table | |
521 | + withColumns : (NSArray *) columns | |
522 | + andDatatypes : (NSArray *) datatypes | |
523 | + isTemporary : (BOOL) isTemporary | |
524 | +{ | |
525 | + return [self createTemporaryTable : table | |
526 | + columns : columns | |
527 | + datatypes : datatypes | |
528 | + defaultValues : nil | |
529 | + checkConstrains : nil | |
530 | + isTemporary : NO]; | |
531 | +} | |
532 | +- (BOOL) createTable : (NSString *) table withColumns : (NSArray *) columns andDatatypes : (NSArray *) datatypes | |
533 | +{ | |
534 | + return [self createTable : table | |
535 | + withColumns : columns | |
536 | + andDatatypes : datatypes | |
537 | + isTemporary : NO]; | |
538 | +} | |
539 | +- (BOOL) createTable : (NSString *) table | |
540 | + columns : (NSArray *) columns | |
541 | + datatypes : (NSArray *) datatypes | |
542 | + defaultValues : (NSArray *)defaultValues | |
543 | + checkConstrains : (NSArray *)checkConstrains | |
544 | +{ | |
545 | + return [self createTemporaryTable : table | |
546 | + columns : columns | |
547 | + datatypes : datatypes | |
548 | + defaultValues : defaultValues | |
549 | + checkConstrains : checkConstrains | |
550 | + isTemporary : NO]; | |
551 | +} | |
552 | +- (BOOL) createTemporaryTable : (NSString *) table | |
553 | + withColumns : (NSArray *) columns | |
554 | + andDatatypes : (NSArray *) datatypes | |
555 | +{ | |
556 | + return [self createTable : table | |
557 | + withColumns : columns | |
558 | + andDatatypes : datatypes | |
559 | + isTemporary : YES]; | |
560 | +} | |
561 | +- (BOOL) createTemporaryTable : (NSString *) table | |
562 | + columns : (NSArray *) columns | |
563 | + datatypes : (NSArray *) datatypes | |
564 | + defaultValues : (NSArray *)defaultValues | |
565 | + checkConstrains : (NSArray *)checkConstrains | |
566 | +{ | |
567 | + return [self createTemporaryTable : table | |
568 | + columns : columns | |
569 | + datatypes : datatypes | |
570 | + defaultValues : defaultValues | |
571 | + checkConstrains : checkConstrains | |
572 | + isTemporary : YES]; | |
573 | +} | |
574 | + | |
575 | +- (NSString *)indexNameForColumn:(NSString *)column inTable:(NSString *)table | |
576 | +{ | |
577 | + return [NSString stringWithFormat:@"%@_%@_INDEX", table, column]; | |
578 | +} | |
579 | +- (BOOL) createIndexForColumn : (NSString *) column inTable : (NSString *) table isUnique : (BOOL) isUnique | |
580 | +{ | |
581 | + NSString *sql; | |
582 | + | |
583 | + sql = [NSString stringWithFormat : @"CREATE %@ INDEX %@ ON %@ ( %@ ) ", | |
584 | + isUnique ? @"UNIQUE" : @"", | |
585 | + [self indexNameForColumn:column inTable:table], | |
586 | + table, column]; | |
587 | + | |
588 | + [self performQuery : sql]; | |
589 | + | |
590 | + return [self lastErrorID] == 0; | |
591 | +} | |
592 | + | |
593 | +- (BOOL) deleteIndexForColumn:(NSString *)column inTable:(NSString *)table | |
594 | +{ | |
595 | + NSString *sql; | |
596 | + | |
597 | + sql = [NSString stringWithFormat : @"DROP INDEX %@", | |
598 | + [self indexNameForColumn:column inTable:table]]; | |
599 | + | |
600 | + [self performQuery : sql]; | |
601 | + | |
602 | + return [self lastErrorID] == 0; | |
603 | +} | |
604 | + | |
605 | +@end | |
606 | + | |
607 | +@implementation SQLiteReservedQuery | |
608 | + | |
609 | ++ (id) sqliteReservedQueryWithQuery : (NSString *) sqlString usingSQLiteDB : (SQLiteDB *) db | |
610 | +{ | |
611 | + return [[[self alloc] initWithQuery : sqlString usingSQLiteDB : db] autorelease]; | |
612 | +} | |
613 | + | |
614 | +- (id) initWithQuery : (NSString *) sqlString usingSQLiteDB : (SQLiteDB *) db | |
615 | +{ | |
616 | + self = [super init]; | |
617 | + | |
618 | + if (self) { | |
619 | + const char *sql = [sqlString UTF8String]; | |
620 | + int result; | |
621 | + | |
622 | + result = sqlite3_prepare([db rowDatabase], sql, strlen(sql) , &m_stmt, &sql); | |
623 | + if (result != SQLITE_OK) goto fail; | |
624 | + | |
625 | + debug_log("create statment %s\n", [sqlString UTF8String]); | |
626 | + } | |
627 | + | |
628 | + return self; | |
629 | + | |
630 | +fail : | |
631 | + [self release]; | |
632 | + return nil; | |
633 | +} | |
634 | + | |
635 | +- (void) dealloc | |
636 | +{ | |
637 | + sqlite3_finalize(m_stmt); | |
638 | + | |
639 | + [super dealloc]; | |
640 | +} | |
641 | + | |
642 | +void objectDeallocator(void *obj) | |
643 | +{ | |
644 | + // NSLog(@"??? DEALLOC ???"); | |
645 | +} | |
646 | +- (id <SQLiteMutableCursor>) cursorForBindValues : (NSArray *) bindValues | |
647 | +{ | |
648 | + int error; | |
649 | + int paramCount; | |
650 | + unsigned i, valuesCount; | |
651 | + id value; | |
652 | + | |
653 | + id <SQLiteMutableCursor> cursor; | |
654 | + | |
655 | + error = sqlite3_reset(m_stmt); | |
656 | + if (SQLITE_OK != error) return nil; | |
657 | + error = sqlite3_clear_bindings(m_stmt); | |
658 | + if (SQLITE_OK != error) return nil; | |
659 | + | |
660 | + valuesCount = [bindValues count]; | |
661 | + paramCount = sqlite3_bind_parameter_count(m_stmt); | |
662 | + if (valuesCount != paramCount) { | |
663 | + NSLog(@"Missmatch bindValues count!!"); | |
664 | + return nil; | |
665 | + } | |
666 | + for (i = 0; i < valuesCount; i++) { | |
667 | + value = [bindValues objectAtIndex : i]; | |
668 | + | |
669 | + if ([value isKindOfClass : [NSNumber class]]) { | |
670 | + int intValue = [value intValue]; | |
671 | + error = sqlite3_bind_int(m_stmt, i+1, intValue); | |
672 | + if (SQLITE_OK != error) return nil; | |
673 | + } else if ([value isKindOfClass : [NSString class]]) { | |
674 | + const char *str = [value UTF8String]; | |
675 | + error = sqlite3_bind_text(m_stmt, i+1, str, strlen(str) , objectDeallocator); | |
676 | + if (SQLITE_OK != error) return nil; | |
677 | + } else if (value == [NSNull null]) { | |
678 | + error = sqlite3_bind_null(m_stmt, i+1); | |
679 | + if (SQLITE_OK != error) return nil; | |
680 | + } else { | |
681 | + NSLog(@"cursorForBindValues : NOT supported type."); | |
682 | + return nil; | |
683 | + } | |
684 | + } | |
685 | + | |
686 | + cursor = cursorFromSTMT(m_stmt); | |
687 | + | |
688 | + error = sqlite3_reset(m_stmt); | |
689 | + | |
690 | + return cursor; | |
691 | +} | |
692 | + | |
693 | +@end | |
694 | + | |
695 | +@implementation NSDictionary (SQLiteRow) | |
696 | +- (unsigned) columnCount | |
697 | +{ | |
698 | + return [self count]; | |
699 | +} | |
700 | +- (NSArray *) columnNames | |
701 | +{ | |
702 | + return [self allKeys]; | |
703 | +} | |
704 | +- (id) valueForColumn : (NSString *) column | |
705 | +{ | |
706 | + NSString *lower = [column lowercaseString]; | |
707 | + id result = [self objectForKey : lower]; | |
708 | + return result ? result : [NSNull null]; | |
709 | +} | |
710 | +@end | |
711 | + | |
712 | +@implementation NSMutableDictionary (SQLiteCursor) | |
713 | + | |
714 | +- (unsigned) columnCount | |
715 | +{ | |
716 | + return [[self objectForKey : TestColumnNames] count]; | |
717 | +} | |
718 | +- (NSArray *) columnNames | |
719 | +{ | |
720 | + return [self objectForKey : TestColumnNames]; | |
721 | +} | |
722 | + | |
723 | +- (unsigned) rowCount | |
724 | +{ | |
725 | + return [[self objectForKey : TestValues] count]; | |
726 | +} | |
727 | +- (id) valueForColumn : (NSString *) column atRow : (unsigned) row | |
728 | +{ | |
729 | + id lower = [column lowercaseString]; | |
730 | + return [[self rowAtIndex : row] valueForColumn : lower]; | |
731 | +} | |
732 | +- (NSArray *) valuesForColumn : (NSString *) column; | |
733 | +{ | |
734 | + id lower = [column lowercaseString]; | |
735 | + NSMutableArray *result; | |
736 | + unsigned i, rowCount = [self rowCount]; | |
737 | + | |
738 | + if (rowCount == 0 || [self columnCount] == 0) return nil; | |
739 | + | |
740 | + result = [NSMutableArray arrayWithCapacity : rowCount]; | |
741 | + for (i = 0; i < rowCount; i++) { | |
742 | + id value = [self valueForColumn : lower atRow : i]; | |
743 | + if (value) { | |
744 | + [result addObject : value]; | |
745 | + } | |
746 | + } | |
747 | + | |
748 | + return result; | |
749 | +} | |
750 | +- (id <SQLiteRow>) rowAtIndex : (unsigned) row | |
751 | +{ | |
752 | + return [[self arrayForTableView] objectAtIndex : row]; | |
753 | +} | |
754 | +- (NSArray *) arrayForTableView | |
755 | +{ | |
756 | + id result = [self objectForKey : TestValues]; | |
757 | + | |
758 | + if (!result) { | |
759 | + result = [NSMutableArray array]; | |
760 | + [self setObject : result forKey : TestValues]; | |
761 | + } | |
762 | + | |
763 | + return result; | |
764 | +} | |
765 | + | |
766 | +- (BOOL) appendRow : (id <SQLiteRow>) row | |
767 | +{ | |
768 | + if ([row columnCount] != [self columnCount]) return NO; | |
769 | + if (![[row columnNames] isEqual : [self columnNames]]) return NO; | |
770 | + | |
771 | + [(NSMutableArray *)[self arrayForTableView] addObject : row]; | |
772 | + | |
773 | + return YES; | |
774 | +} | |
775 | +- (BOOL) appendCursor : (id <SQLiteCursor>) cursor | |
776 | +{ | |
777 | + if ([cursor columnCount] != [self columnCount]) return NO; | |
778 | + if (![[cursor columnNames] isEqual : [self columnNames]]) return NO; | |
779 | + | |
780 | + [(NSMutableArray *)[self arrayForTableView] addObjectsFromArray : [cursor arrayForTableView]]; | |
781 | + | |
782 | + return YES; | |
783 | +} | |
784 | + | |
785 | +@end |
@@ -0,0 +1,171 @@ | ||
1 | +/** | |
2 | + * $Id: UTILAssertion.h,v 1.1.1.1 2005/05/11 17:51:55 tsawada2 Exp $ | |
3 | + * | |
4 | + * UTILAssertion.h | |
5 | + * | |
6 | + * Copyright (c) 2004 Takanori Ishikawa, All rights reserved. | |
7 | + * See the file LICENSE for copying permission. | |
8 | + */ | |
9 | +#ifndef UTILASSERTION_H_INCLUDED | |
10 | +#define UTILASSERTION_H_INCLUDED | |
11 | + | |
12 | +#ifdef __cplusplus | |
13 | +extern "C" { | |
14 | +#endif | |
15 | + | |
16 | + | |
17 | + | |
18 | +// Description | |
19 | +#define UTIL_HANDLE_FAILURE_IN_METHOD [NSString stringWithFormat : @"%@<%@> in %@:%d", NSStringFromSelector(_cmd), NSStringFromClass([self class]), [NSString stringWithCString:__FILE__], __LINE__] | |
20 | +#define UTIL_HANDLE_FAILURE_IN_FUNCTION [NSString stringWithFormat : @"%@ in %@:%d", [NSString stringWithCString : __PRETTY_FUNCTION__], [NSString stringWithCString:__FILE__], __LINE__] | |
21 | + | |
22 | + | |
23 | +// | |
24 | +// Assertion | |
25 | +// | |
26 | +#ifndef UTIL_BLOCK_ASSERTIONS | |
27 | + #define UTILAssertNotNil(v) NSAssert1((v) != nil, @"FAIL:%s must be not nil.", #v) | |
28 | + #define UTILAssertKindOfClass(v, klass) \ | |
29 | + NSAssert3((v) != nil && [(v) isKindOfClass : [klass class]],\ | |
30 | + @"%s was expected instanceof <%@>, but was instanceof <%@>.",\ | |
31 | + #v, NSStringFromClass([klass class]),\ | |
32 | + ((v) != nil) ? NSStringFromClass([(v) class]) : @"nil") | |
33 | + #define UTILAssertRespondsTo(object, selector) \ | |
34 | + NSAssert2((object) != nil && [(object) respondsToSelector : (selector)],\ | |
35 | + @"<%@> must respondsTo %@",\ | |
36 | + (object != Nil) ? NSStringFromClass([object class]) : @"Nil",\ | |
37 | + NSStringFromSelector((selector))) | |
38 | + #define UTILAssertConformsTo(object, protocol) \ | |
39 | + NSAssert2(object != nil && [object conformsToProtocol : protocol],\ | |
40 | + @"FAIL: <%@> expected conformsToProtocol <%@>",\ | |
41 | + (object != Nil) ? NSStringFromClass([object class]) : @"Nil",\ | |
42 | + UTILStringFromProtocol(protocol)) | |
43 | + | |
44 | + #define UTILCAssertNotNil(v) NSCAssert1((v) != nil, @"FAIL:%s must be not nil.", #v) | |
45 | + #define UTILCAssertKindOfClass(v, klass) \ | |
46 | + NSCAssert3((v) != nil && [(v) isKindOfClass : [klass class]],\ | |
47 | + @"%s was expected instanceof <%@>, but was instanceof <%@>.",\ | |
48 | + #v, NSStringFromClass([klass class]),\ | |
49 | + ((v) != nil) ? NSStringFromClass([(v) class]) : @"nil") | |
50 | + #define UTILCAssertRespondsTo(object, selector) \ | |
51 | + NSCAssert2((object) != nil && [(object) respondsToSelector : (selector)],\ | |
52 | + @"<%@> must respondsTo %@",\ | |
53 | + (object != Nil) ? NSStringFromClass([object class]) : @"Nil",\ | |
54 | + NSStringFromSelector((selector))) | |
55 | + #define UTILCAssertConformsTo(object, protocol) \ | |
56 | + NSCAssert2(object != nil && [object conformsToProtocol : protocol],\ | |
57 | + @"FAIL: <%@> expected conformsToProtocol <%@>",\ | |
58 | + (object != Nil) ? NSStringFromClass([object class]) : @"Nil",\ | |
59 | + UTILStringFromProtocol(protocol)) | |
60 | +#else | |
61 | + #define UTILAssertNotNil(v) | |
62 | + #define UTILAssertKindOfClass(v, klass) | |
63 | + #define UTILAssertRespondsTo(object, selector) | |
64 | + #define UTILAssertConformsTo(object, protocol) | |
65 | + | |
66 | + #define UTILCAssertNotNil(v) | |
67 | + #define UTILCAssertKindOfClass(v, klass) | |
68 | + #define UTILCAssertRespondsTo(object, selector) | |
69 | + #define UTILCAssertConformsTo(object, protocol) | |
70 | +#endif | |
71 | + | |
72 | + | |
73 | + | |
74 | +// Exception | |
75 | +#define UTILAssertNotNilArgument(souldNotNilValue, souldNotNilStatus) \ | |
76 | + do{ \ | |
77 | + if(nil == souldNotNilValue){\ | |
78 | + [NSException raise : NSInvalidArgumentException\ | |
79 | + format : @"F:%@ must be not nil.\n\t%@",\ | |
80 | + souldNotNilStatus,\ | |
81 | + UTIL_HANDLE_FAILURE_IN_METHOD];\ | |
82 | + }\ | |
83 | + }while(0) | |
84 | + | |
85 | +// Notification | |
86 | +#define UTILAssertNotificationName(aNotification, expectedName) \ | |
87 | +NSAssert2([aNotification name] != nil && [[aNotification name] isEqualToString : expectedName],\ | |
88 | + @"Expected Notification <%@> but was <%@>",\ | |
89 | + expectedName,\ | |
90 | + [aNotification name]) | |
91 | +#define UTILAssertNotificationObject(aNotification, expectedObject) \ | |
92 | +NSAssert2([aNotification object] != nil && [[aNotification object] isEqual : expectedObject],\ | |
93 | + @"Expected Notification <%@> but was <%@>",\ | |
94 | + expectedObject,\ | |
95 | + [aNotification object]) | |
96 | + | |
97 | + | |
98 | +/* Implementation of asserts (ignore) */ | |
99 | +#if !defined(UTILExceptionRaiseBody) | |
100 | +#define UTILExceptionRaiseBody(condition, exceptionName, desc, arg1, arg2, arg3, arg4, arg5) \ | |
101 | + do{ \ | |
102 | + if(!(condition)){ \ | |
103 | + [NSException raise : (exceptionName) \ | |
104 | + format : [NSString stringWithFormat : @"%@ -%@",(desc), \ | |
105 | + UTIL_HANDLE_FAILURE_IN_METHOD], \ | |
106 | + (arg1), (arg2), (arg3), (arg4), (arg5)]; \ | |
107 | + } \ | |
108 | + }while(0) | |
109 | +#endif | |
110 | +#if !defined(UTILCExceptionRaiseBody) | |
111 | +#define UTILCExceptionRaiseBody(condition, exceptionName, desc, arg1, arg2, arg3, arg4, arg5) \ | |
112 | + do{ \ | |
113 | + if(!(condition)){ \ | |
114 | + [NSException raise : (exceptionName) \ | |
115 | + format : [NSString stringWithFormat : @"%@ -%@",(desc), \ | |
116 | + UTIL_HANDLE_FAILURE_IN_FUNCTION], \ | |
117 | + (arg1), (arg2), (arg3), (arg4), (arg5)]; \ | |
118 | + } \ | |
119 | + }while(0) | |
120 | +#endif | |
121 | + | |
122 | + | |
123 | + | |
124 | +/* | |
125 | + * Asserts to use in Objective-C method bodies | |
126 | + */ | |
127 | + | |
128 | +#define UTILExceptionRaise5(condition, exceptionName, desc, arg1, arg2, arg3, arg4, arg5) \ | |
129 | + UTILExceptionRaiseBody((condition), (exceptionName), (desc), (arg1), (arg2), (arg3), (arg4), (arg5)) | |
130 | + | |
131 | +#define UTILExceptionRaise4(condition, exceptionName, desc, arg1, arg2, arg3, arg4) \ | |
132 | + UTILExceptionRaiseBody((condition), (exceptionName), (desc), (arg1), (arg2), (arg3), (arg4), 0) | |
133 | + | |
134 | +#define UTILExceptionRaise3(condition, exceptionName, desc, arg1, arg2, arg3) \ | |
135 | + UTILExceptionRaiseBody((condition), (exceptionName), (desc), (arg1), (arg2), (arg3), 0, 0) | |
136 | + | |
137 | +#define UTILExceptionRaise2(condition, exceptionName, desc, arg1, arg2) \ | |
138 | + UTILExceptionRaiseBody((condition), (exceptionName), (desc), (arg1), (arg2), 0, 0, 0) | |
139 | + | |
140 | +#define UTILExceptionRaise1(condition, exceptionName, desc, arg1) \ | |
141 | + UTILExceptionRaiseBody((condition), (exceptionName), (desc), (arg1), 0, 0, 0, 0) | |
142 | + | |
143 | +#define UTILExceptionRaise(condition, exceptionName, desc) \ | |
144 | + UTILExceptionRaiseBody((condition), (exceptionName), (desc), 0, 0, 0, 0, 0) | |
145 | + | |
146 | + | |
147 | +#define UTILCExceptionRaise5(condition, exceptionName, desc, arg1, arg2, arg3, arg4, arg5) \ | |
148 | + UTILCExceptionRaiseBody((condition), (exceptionName), (desc), (arg1), (arg2), (arg3), (arg4), (arg5)) | |
149 | + | |
150 | +#define UTILCExceptionRaise4(condition, exceptionName, desc, arg1, arg2, arg3, arg4) \ | |
151 | + UTILCExceptionRaiseBody((condition), (exceptionName), (desc), (arg1), (arg2), (arg3), (arg4), 0) | |
152 | + | |
153 | +#define UTILCExceptionRaise3(condition, exceptionName, desc, arg1, arg2, arg3) \ | |
154 | + UTILCExceptionRaiseBody((condition), (exceptionName), (desc), (arg1), (arg2), (arg3), 0, 0) | |
155 | + | |
156 | +#define UTILCExceptionRaise2(condition, exceptionName, desc, arg1, arg2) \ | |
157 | + UTILCExceptionRaiseBody((condition), (exceptionName), (desc), (arg1), (arg2), 0, 0, 0) | |
158 | + | |
159 | +#define UTILCExceptionRaise1(condition, exceptionName, desc, arg1) \ | |
160 | + UTILCExceptionRaiseBody((condition), (exceptionName), (desc), (arg1), 0, 0, 0, 0) | |
161 | + | |
162 | +#define UTILCExceptionRaise(condition, exceptionName, desc) \ | |
163 | + UTILCExceptionRaiseBody((condition), (exceptionName), (desc), 0, 0, 0, 0, 0) | |
164 | + | |
165 | + | |
166 | + | |
167 | +#ifdef __cplusplus | |
168 | +} /* End of the 'extern "C"' block */ | |
169 | +#endif | |
170 | + | |
171 | +#endif /* UTILASSERTION_H_INCLUDED */ |
@@ -0,0 +1,58 @@ | ||
1 | +/** | |
2 | + * $Id: UTILDebugging.h,v 1.1.1.1 2005/05/11 17:51:55 tsawada2 Exp $ | |
3 | + * | |
4 | + * UTILDebugging.h | |
5 | + * | |
6 | + * Copyright (c) 2003-2004 Takanori Ishikawa, All rights reserved. | |
7 | + * See the file LICENSE for copying permission. | |
8 | + */ | |
9 | +#ifndef UTILDEBUGGING_H_INCLUDED | |
10 | +#define UTILDEBUGGING_H_INCLUDED | |
11 | + | |
12 | +#ifdef __cplusplus | |
13 | +extern "C" { | |
14 | +#endif | |
15 | + | |
16 | +/* | |
17 | + must be included in implementation file | |
18 | + | |
19 | + | |
20 | +// for debugging only | |
21 | +#define UTIL_DEBUGGING 1 | |
22 | +#import "UTILDebugging.h" | |
23 | + | |
24 | +*/ | |
25 | + | |
26 | +#if UTIL_DEBUGGING | |
27 | +#define UTIL_DEBUG_WRITE(fmt) UTILDebugWrite((fmt)) | |
28 | +#define UTIL_DEBUG_WRITE1(fmt, arg1) UTILDebugWrite1((fmt), (arg1)) | |
29 | +#define UTIL_DEBUG_WRITE2(fmt, arg1, arg2) UTILDebugWrite2((fmt), (arg1), (arg2)) | |
30 | +#define UTIL_DEBUG_WRITE3(fmt, arg1, arg2, arg3) UTILDebugWrite3((fmt), (arg1), (arg2), (arg3)) | |
31 | +#define UTIL_DEBUG_WRITE4(fmt, arg1, arg2, arg3, arg4) UTILDebugWrite4((fmt), (arg1), (arg2), (arg3), (arg4)) | |
32 | +#define UTIL_DEBUG_WRITE5(fmt, arg1, arg2, arg3, arg4, arg5) UTILDebugWrite5((fmt), (arg1), (arg2), (arg3), (arg4), (arg5)) | |
33 | + | |
34 | +/* print function name */ | |
35 | +#define UTIL_DEBUG_FUNCTION UTILCFunctionLog | |
36 | +#define UTIL_DEBUG_METHOD UTILMethodLog | |
37 | +/* execute debugging code */ | |
38 | +#define UTIL_DEBUG_DO(code) do { code } while(0) | |
39 | + | |
40 | +#else | |
41 | +#define UTIL_DEBUG_WRITE(fmt) | |
42 | +#define UTIL_DEBUG_WRITE1(fmt, arg1) | |
43 | +#define UTIL_DEBUG_WRITE2(fmt, arg1, arg2) | |
44 | +#define UTIL_DEBUG_WRITE3(fmt, arg1, arg2, arg3) | |
45 | +#define UTIL_DEBUG_WRITE4(fmt, arg1, arg2, arg3, arg4) | |
46 | +#define UTIL_DEBUG_WRITE5(fmt, arg1, arg2, arg3, arg4, arg5) | |
47 | + | |
48 | +#define UTIL_DEBUG_FUNCTION | |
49 | +#define UTIL_DEBUG_METHOD | |
50 | +#define UTIL_DEBUG_DO(code) | |
51 | +#endif | |
52 | + | |
53 | + | |
54 | + | |
55 | +#ifdef __cplusplus | |
56 | +} /* End of the 'extern "C"' block */ | |
57 | +#endif | |
58 | +#endif /* UTILDEBUGGING_H_INCLUDED */ |
@@ -0,0 +1,109 @@ | ||
1 | +//: UTILDescription.h | |
2 | +/** | |
3 | + * $Id: UTILDescription.h,v 1.1.1.1 2005/05/11 17:51:55 tsawada2 Exp $ | |
4 | + * | |
5 | + * Copyright (c) 2001-2003, Takanori Ishikawa. All rights reserved. | |
6 | + * See the file LICENSE for copying permission. | |
7 | + */ | |
8 | + | |
9 | +/*! | |
10 | + * @header UTILDescription | |
11 | + * @discussion The debug write macros. | |
12 | + * to eliminates UTILWriteBody_ macro, | |
13 | + * | |
14 | + * #define UTIL_BLOCK_DEBUG_WRITE | |
15 | + * | |
16 | + * or setup "Other C Flags" | |
17 | + * | |
18 | + * -DUTIL_BLOCK_DEBUG_WRITE | |
19 | + */ | |
20 | + | |
21 | +#ifndef UTILDESCRIPTION_H_INCLUDED | |
22 | +#define UTILDESCRIPTION_H_INCLUDED | |
23 | + | |
24 | + | |
25 | + | |
26 | +#ifdef __cplusplus | |
27 | +extern "C" { | |
28 | +#endif | |
29 | + | |
30 | + | |
31 | + | |
32 | +/* Implementation of print */ | |
33 | +#ifndef UTILWriteBody_ | |
34 | + #ifndef UTIL_BLOCK_DEBUG_WRITE | |
35 | + #define UTILWriteBody_(desc, arg1, arg2, arg3, arg4, arg5) NSLog((desc), (arg1), (arg2), (arg3), (arg4), (arg5)) | |
36 | + #else | |
37 | + #define UTILWriteBody_(desc, arg1, arg2, arg3, arg4, arg5) | |
38 | + #endif /* !UTIL_BLOCK_DEBUG_WRITE */ | |
39 | +#endif /* !UTILWriteBody_ */ | |
40 | + | |
41 | + | |
42 | + | |
43 | +/* | |
44 | + * Debug write for Objective-C | |
45 | + */ | |
46 | +#define UTILDebugWrite5(desc, arg1, arg2, arg3, arg4, arg5) \ | |
47 | + UTILWriteBody_((desc), (arg1), (arg2), (arg3), (arg4), (arg5)) | |
48 | +#define UTILDebugWrite4(desc, arg1, arg2, arg3, arg4) \ | |
49 | + UTILWriteBody_((desc), (arg1), (arg2), (arg3), (arg4), 0) | |
50 | +#define UTILDebugWrite3(desc, arg1, arg2, arg3) \ | |
51 | + UTILWriteBody_((desc), (arg1), (arg2), (arg3), 0, 0) | |
52 | +#define UTILDebugWrite2(desc, arg1, arg2) \ | |
53 | + UTILWriteBody_((desc), (arg1), (arg2), 0, 0, 0) | |
54 | +#define UTILDebugWrite1(desc, arg1) \ | |
55 | + UTILWriteBody_((desc), (arg1), 0, 0, 0, 0) | |
56 | +#define UTILDebugWrite(desc) \ | |
57 | + UTILWriteBody_((desc), 0, 0, 0, 0, 0) | |
58 | + | |
59 | + | |
60 | + | |
61 | +/* | |
62 | + * Some useful macros | |
63 | + */ | |
64 | +#define UTILBOOLString(x) x?@"YES":@"NO" | |
65 | +#define UTILStringFromProtocol(protocol) [NSString stringWithUTF8String:(const char*)[(id)(protocol) name]] | |
66 | +#define UTILComparisonResultString(x) (NSOrderedAscending == x) ? @"NSOrderedAscending" : ((NSOrderedDescending == x) ? @"NSOrderedDescending" : ((NSOrderedSame == x) ? @"NSOrderedSame" : @"None")) | |
67 | + | |
68 | +#define UTILDescSizeof(obj) UTILDebugWrite2(@"%s:%u.", #obj, sizeof(obj)) | |
69 | +#define UTILDescription(x) UTILDebugWrite3(@"(%@)%s = %@", NSStringFromClass([x class]), #x, [x description]) | |
70 | +#define UTILDescRect(x) UTILDebugWrite2(@"(NSRect)%s = %@", #x, NSStringFromRect(x)) | |
71 | +#define UTILDescRange(x) UTILDebugWrite2(@"(NSRange)%s = %@", #x, NSStringFromRange(x)) | |
72 | +#define UTILDescPoint(x) UTILDebugWrite2(@"(NSPoint)%s = %@", #x, NSStringFromPoint(x)) | |
73 | +#define UTILDescSize(x) UTILDebugWrite2(@"(NSSize)%s = %@", #x, NSStringFromSize(x)) | |
74 | +#define UTILDescBoolean(x) UTILDebugWrite2(@"(BOOL)%s = %@", #x, UTILBOOLString(x)) | |
75 | +#define UTILDescRetainCount(x) UTILDebugWrite2(@"(RetainCount)%s = %u", #x, [x retainCount]) | |
76 | +#define UTILDescIsNil(x) UTILDebugWrite2(@"(Nil?)%s = %@", #x, UTILBOOLString(x==nil)) | |
77 | +#define UTILDescClass(x) UTILDebugWrite2(@"(class)%s = %@", #x, NSStringFromClass(x)) | |
78 | +#define UTILDescSelector(x) UTILDebugWrite2(@"(SEL)%s = %@", #x, NSStringFromSelector(x)) | |
79 | +#define UTILDescString(x) UTILDebugWrite2(@"(NSString)%s = %@", #x, x) | |
80 | +#define UTILDescInt(x) UTILDebugWrite2(@"(Integer)%s = %d", #x, x) | |
81 | +#define UTILDescUnsignedInt(x) UTILDebugWrite2(@"(Integer)%s = %u", #x, x) | |
82 | +#define UTILDescFloat(x) UTILDebugWrite2(@"(float)%s = %.2f", #x, x) | |
83 | +#define UTILDescComparisonResult(x) UTILDebugWrite1(@"(ComparisonResult)%s = %@", #x, UTILComparisonResultString(x)) | |
84 | + | |
85 | + | |
86 | + | |
87 | +#define UTILMethodPtrLog UTILDebugWrite3(@"%@::%@(%p)",\ | |
88 | + NSStringFromClass([self class]),\ | |
89 | + NSStringFromSelector(_cmd),\ | |
90 | + self) | |
91 | +#define UTILMethodLog UTILDebugWrite4(@"%@::%@ in %@:%d",\ | |
92 | + NSStringFromClass([self class]),\ | |
93 | + NSStringFromSelector(_cmd),\ | |
94 | + [NSString stringWithCString:__FILE__],\ | |
95 | + __LINE__) | |
96 | +#define UTILCFunctionLog UTILDebugWrite3(@"%@ in %@:%d",\ | |
97 | + [NSString stringWithCString : __PRETTY_FUNCTION__],\ | |
98 | + [NSString stringWithCString:__FILE__],\ | |
99 | + __LINE__) | |
100 | + | |
101 | +#define UTILWriteObject(x, file) [x writeToFile : [NSHomeDirectory() stringByAppendingPathComponent : file] atomically : NO] | |
102 | + | |
103 | + | |
104 | + | |
105 | +#ifdef __cplusplus | |
106 | +} /* End of the 'extern "C"' block */ | |
107 | +#endif | |
108 | + | |
109 | +#endif /* UTILDESCRIPTION_H_INCLUDED */ |
@@ -0,0 +1,46 @@ | ||
1 | +/** | |
2 | + * $Id: UTILError.h,v 1.1.1.1 2005/05/11 17:51:55 tsawada2 Exp $ | |
3 | + * | |
4 | + * UTILError.h | |
5 | + * | |
6 | + * Copyright (c) 2004 Takanori Ishikawa, All rights reserved. | |
7 | + * See the file LICENSE for copying permission. | |
8 | + */ | |
9 | + | |
10 | +#ifndef UTILERROR_H_INCLUDED | |
11 | +#define UTILERROR_H_INCLUDED | |
12 | + | |
13 | +#ifdef __cplusplus | |
14 | +extern "C" { | |
15 | +#endif | |
16 | + | |
17 | + | |
18 | + | |
19 | +#define UTILDebugRequireBody_(condition, label, desc, arg1, arg2, arg3, arg4, arg5) do { if (!(condition)) { UTILDebugWrite1(@"*** WARNING *** at %@", UTIL_HANDLE_FAILURE_IN_FUNCTION); UTILDebugWrite5((desc), (arg1), (arg2), (arg3), (arg4), (arg5)); goto label; } } while (0) | |
20 | + | |
21 | + | |
22 | + | |
23 | +/* error handling: goto label if condition was FALSE. */ | |
24 | +#define UTILRequireCondition(condition, label) do { if(!(condition)) goto label; } while (0) | |
25 | +#define UTILRequireNoErr(err, label) UTILRequireCondition((noErr == (err)), label) | |
26 | + | |
27 | + | |
28 | + | |
29 | +/* | |
30 | + error handling: | |
31 | + debug write description, and goto label if condition was FALSE. | |
32 | +*/ | |
33 | +#define UTILDebugRequire(condition, label, desc) UTILDebugRequireBody_(condition, label, desc, 0, 0, 0, 0, 0) | |
34 | +#define UTILDebugRequire1(condition, label, desc, arg1) UTILDebugRequireBody_(condition, label, desc, arg1, 0, 0, 0, 0) | |
35 | +#define UTILDebugRequire2(condition, label, desc, arg1, arg2) UTILDebugRequireBody_(condition, label, desc, arg1, arg2, 0, 0, 0) | |
36 | +#define UTILDebugRequire3(condition, label, desc, arg1, arg2, arg3) UTILDebugRequireBody_(condition, label, desc, arg1, arg2, arg3, 0, 0) | |
37 | +#define UTILDebugRequire4(condition, label, desc, arg1, arg2, arg3, arg4) UTILDebugRequireBody_(condition, label, desc, arg1, arg2, arg3, arg4, 0) | |
38 | +#define UTILDebugRequire5(condition, label, desc, arg1, arg2, arg3, arg4, arg5) UTILDebugRequireBody_(condition, label, desc, arg1, arg2, arg3, arg4, arg5) | |
39 | + | |
40 | + | |
41 | + | |
42 | +#ifdef __cplusplus | |
43 | +} /* End of the 'extern "C"' block */ | |
44 | +#endif | |
45 | + | |
46 | +#endif /* UTILERROR_H_INCLUDED */ |
@@ -0,0 +1,83 @@ | ||
1 | +//: UTILKit.h | |
2 | +/** | |
3 | + * $Id: UTILKit.h,v 1.1.1.1 2005/05/11 17:51:55 tsawada2 Exp $ | |
4 | + * | |
5 | + * Copyright (c) 2001-2003, Takanori Ishikawa. All rights reserved. | |
6 | + * See the file LICENSE for copying permission. | |
7 | + */ | |
8 | +#ifndef UTILKIT_H_INCLUDED | |
9 | +#define UTILKIT_H_INCLUDED | |
10 | + | |
11 | +#import "UTILAssertion.h" | |
12 | +#import "UTILDescription.h" | |
13 | +#import "UTILError.h" | |
14 | + | |
15 | +#ifdef __cplusplus | |
16 | +extern "C" { | |
17 | +#endif | |
18 | + | |
19 | + | |
20 | + | |
21 | +#define UTILNumberOfCArray(carray) (sizeof(carray)/sizeof(carray[0])) | |
22 | + | |
23 | + | |
24 | + | |
25 | +// abstract method / not yet implement | |
26 | +#define UTILAbstractMethodInvoked \ | |
27 | + [NSException raise : @"Abstract method invoked." \ | |
28 | + format : @"[%@ %@] is an abstract method.", \ | |
29 | + NSStringFromClass([self class]),\ | |
30 | + NSStringFromSelector(_cmd)] | |
31 | + | |
32 | + | |
33 | +// Exception Handling | |
34 | +#define UTILCatchException(x) if([(x) isEqualToString :[localException name]]) | |
35 | + | |
36 | +// notification | |
37 | +#define UTILNotifyName(name) [[NSNotificationCenter defaultCenter] postNotificationName:name object:self] | |
38 | +#define UTILNotifyInfo(name, info) [[NSNotificationCenter defaultCenter] postNotificationName:name object:self userInfo:info] | |
39 | +#define UTILNotifyInfo3(name, info, key) \ | |
40 | + [[NSNotificationCenter defaultCenter]\ | |
41 | + postNotificationName : name\ | |
42 | + object : self\ | |
43 | + userInfo : ((info && key) \ | |
44 | + ? [NSDictionary dictionaryWithObject:info forKey:key]\ | |
45 | + : nil)] | |
46 | + | |
47 | + | |
48 | +// object is nil or NSNull | |
49 | +#define UTILObjectIsNull(obj) (nil == (obj) || [NSNull null] == (id)(obj)) | |
50 | + | |
51 | + | |
52 | + | |
53 | +// switch | |
54 | +#define UTILUnknownSwitchCase(x) \ | |
55 | + [NSException raise : NSGenericException\ | |
56 | + format : @"Unsupported Switch Case (%d).\n\t%@",\ | |
57 | + x,\ | |
58 | + UTIL_HANDLE_FAILURE_IN_METHOD] | |
59 | +#define UTILUnknownCSwitchCase(x) \ | |
60 | + [NSException raise : NSGenericException\ | |
61 | + format : @"Unsupported Switch Case (%d).\n\t%@",\ | |
62 | + x,\ | |
63 | + UTIL_HANDLE_FAILURE_IN_FUNCTION] | |
64 | + | |
65 | + | |
66 | +// 比較 | |
67 | +#define UTILComparisionResultPrimitives(x, y) \ | |
68 | +(x == y) ? NSOrderedSame : ((x > y) ? NSOrderedDescending : NSOrderedAscending) | |
69 | + | |
70 | +#define UTILComparisionResultObjects(receiver, other) ((nil == receiver) ? ((nil == other) ? NSOrderedSame : NSOrderedAscending) : [receiver compare : other]) | |
71 | + | |
72 | + | |
73 | +#define UTILComparisionResultReversed(x) \ | |
74 | +(NSOrderedAscending == x ? NSOrderedDescending : (NSOrderedDescending == x ? NSOrderedAscending : NSOrderedSame)) | |
75 | + | |
76 | + | |
77 | + | |
78 | +#ifdef __cplusplus | |
79 | +} /* End of the 'extern "C"' block */ | |
80 | +#endif | |
81 | + | |
82 | +#endif /* UTILKIT_H_INCLUDED */ | |
83 | + |
@@ -0,0 +1,14 @@ | ||
1 | +// | |
2 | +// main.m | |
3 | +// BSDBViewer | |
4 | +// | |
5 | +// Created by Hori,Masaki on 08/05/30. | |
6 | +// Copyright Hori,Masaki 2008. All rights reserved. | |
7 | +// | |
8 | + | |
9 | +#import <Cocoa/Cocoa.h> | |
10 | + | |
11 | +int main(int argc, char *argv[]) | |
12 | +{ | |
13 | + return NSApplicationMain(argc, (const char **) argv); | |
14 | +} |
@@ -0,0 +1,2702 @@ | ||
1 | +/* | |
2 | +** 2001 September 15 | |
3 | +** | |
4 | +** The author disclaims copyright to this source code. In place of | |
5 | +** a legal notice, here is a blessing: | |
6 | +** | |
7 | +** May you do good and not evil. | |
8 | +** May you find forgiveness for yourself and forgive others. | |
9 | +** May you share freely, never taking more than you give. | |
10 | +** | |
11 | +************************************************************************* | |
12 | +** This header file defines the interface that the SQLite library | |
13 | +** presents to client programs. If a C-function, structure, datatype, | |
14 | +** or constant definition does not appear in this file, then it is | |
15 | +** not a published API of SQLite, is subject to change without | |
16 | +** notice, and should not be referenced by programs that use SQLite. | |
17 | +** | |
18 | +** Some of the definitions that are in this file are marked as | |
19 | +** "experimental". Experimental interfaces are normally new | |
20 | +** features recently added to SQLite. We do not anticipate changes | |
21 | +** to experimental interfaces but reserve to make minor changes if | |
22 | +** experience from use "in the wild" suggest such changes are prudent. | |
23 | +** | |
24 | +** The official C-language API documentation for SQLite is derived | |
25 | +** from comments in this file. This file is the authoritative source | |
26 | +** on how SQLite interfaces are suppose to operate. | |
27 | +** | |
28 | +** The name of this file under configuration management is "sqlite.h.in". | |
29 | +** The makefile makes some minor changes to this file (such as inserting | |
30 | +** the version number) and changes its name to "sqlite3.h" as | |
31 | +** part of the build process. | |
32 | +** | |
33 | +** @(#) $Id: sqlite3.h,v 1.4 2007/08/13 17:49:46 masakih Exp $ | |
34 | +*/ | |
35 | +#ifndef _SQLITE3_H_ | |
36 | +#define _SQLITE3_H_ | |
37 | +#include <stdarg.h> /* Needed for the definition of va_list */ | |
38 | + | |
39 | +/* | |
40 | +** Make sure we can call this stuff from C++. | |
41 | +*/ | |
42 | +#ifdef __cplusplus | |
43 | +extern "C" { | |
44 | +#endif | |
45 | + | |
46 | +/* | |
47 | +** Make sure these symbols where not defined by some previous header | |
48 | +** file. | |
49 | +*/ | |
50 | +#ifdef SQLITE_VERSION | |
51 | +# undef SQLITE_VERSION | |
52 | +#endif | |
53 | +#ifdef SQLITE_VERSION_NUMBER | |
54 | +# undef SQLITE_VERSION_NUMBER | |
55 | +#endif | |
56 | + | |
57 | +/* | |
58 | +** CAPI3REF: Compile-Time Library Version Numbers | |
59 | +** | |
60 | +** The version of the SQLite library is contained in the sqlite3.h | |
61 | +** header file in a #define named SQLITE_VERSION. The SQLITE_VERSION | |
62 | +** macro resolves to a string constant. | |
63 | +** | |
64 | +** The format of the version string is "X.Y.Z", where | |
65 | +** X is the major version number, Y is the minor version number and Z | |
66 | +** is the release number. The X.Y.Z might be followed by "alpha" or "beta". | |
67 | +** For example "3.1.1beta". | |
68 | +** | |
69 | +** The X value is always 3 in SQLite. The X value only changes when | |
70 | +** backwards compatibility is broken and we intend to never break | |
71 | +** backwards compatibility. The Y value only changes when | |
72 | +** there are major feature enhancements that are forwards compatible | |
73 | +** but not backwards compatible. The Z value is incremented with | |
74 | +** each release but resets back to 0 when Y is incremented. | |
75 | +** | |
76 | +** The SQLITE_VERSION_NUMBER is an integer with the value | |
77 | +** (X*1000000 + Y*1000 + Z). For example, for version "3.1.1beta", | |
78 | +** SQLITE_VERSION_NUMBER is set to 3001001. To detect if they are using | |
79 | +** version 3.1.1 or greater at compile time, programs may use the test | |
80 | +** (SQLITE_VERSION_NUMBER>=3001001). | |
81 | +** | |
82 | +** See also: [sqlite3_libversion()] and [sqlite3_libversion_number()]. | |
83 | +*/ | |
84 | +#define SQLITE_VERSION "3.4.1" | |
85 | +#define SQLITE_VERSION_NUMBER 3004001 | |
86 | + | |
87 | +/* | |
88 | +** CAPI3REF: Run-Time Library Version Numbers | |
89 | +** | |
90 | +** These routines return values equivalent to the header constants | |
91 | +** [SQLITE_VERSION] and [SQLITE_VERSION_NUMBER]. The values returned | |
92 | +** by this routines should only be different from the header values | |
93 | +** if you compile your program using an sqlite3.h header from a | |
94 | +** different version of SQLite that the version of the library you | |
95 | +** link against. | |
96 | +** | |
97 | +** The sqlite3_version[] string constant contains the text of the | |
98 | +** [SQLITE_VERSION] string. The sqlite3_libversion() function returns | |
99 | +** a poiner to the sqlite3_version[] string constant. The function | |
100 | +** is provided for DLL users who can only access functions and not | |
101 | +** constants within the DLL. | |
102 | +*/ | |
103 | +extern const char sqlite3_version[]; | |
104 | +const char *sqlite3_libversion(void); | |
105 | +int sqlite3_libversion_number(void); | |
106 | + | |
107 | +/* | |
108 | +** CAPI3REF: Database Connection Handle | |
109 | +** | |
110 | +** Each open SQLite database is represented by pointer to an instance of the | |
111 | +** opaque structure named "sqlite3". It is useful to think of an sqlite3 | |
112 | +** pointer as an object. The [sqlite3_open] interface is its constructor | |
113 | +** and [sqlite3_close] is its destructor. There are many other interfaces | |
114 | +** (such as [sqlite3_prepare_v2], [sqlite3_create_function], and | |
115 | +** [sqlite3_busy_timeout] to name but three) that are methods on this | |
116 | +** object. | |
117 | +*/ | |
118 | +typedef struct sqlite3 sqlite3; | |
119 | + | |
120 | + | |
121 | +/* | |
122 | +** CAPI3REF: 64-Bit Integer Types | |
123 | +** | |
124 | +** Some compilers do not support the "long long" datatype. So we have | |
125 | +** to do compiler-specific typedefs for 64-bit signed and unsigned integers. | |
126 | +** | |
127 | +** Many SQLite interface functions require a 64-bit integer arguments. | |
128 | +** Those interfaces are declared using this typedef. | |
129 | +*/ | |
130 | +#ifdef SQLITE_INT64_TYPE | |
131 | + typedef SQLITE_INT64_TYPE sqlite_int64; | |
132 | + typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; | |
133 | +#elif defined(_MSC_VER) || defined(__BORLANDC__) | |
134 | + typedef __int64 sqlite_int64; | |
135 | + typedef unsigned __int64 sqlite_uint64; | |
136 | +#else | |
137 | + typedef long long int sqlite_int64; | |
138 | + typedef unsigned long long int sqlite_uint64; | |
139 | +#endif | |
140 | + | |
141 | +/* | |
142 | +** If compiling for a processor that lacks floating point support, | |
143 | +** substitute integer for floating-point | |
144 | +*/ | |
145 | +#ifdef SQLITE_OMIT_FLOATING_POINT | |
146 | +# define double sqlite_int64 | |
147 | +#endif | |
148 | + | |
149 | +/* | |
150 | +** CAPI3REF: Closing A Database Connection | |
151 | +** | |
152 | +** Call this function with a pointer to a structure that was previously | |
153 | +** returned from [sqlite3_open()] and the corresponding database will by | |
154 | +** closed. | |
155 | +** | |
156 | +** All SQL statements prepared using [sqlite3_prepare_v2()] or | |
157 | +** [sqlite3_prepare16_v2()] must be destroyed using [sqlite3_finalize()] | |
158 | +** before this routine is called. Otherwise, SQLITE_BUSY is returned and the | |
159 | +** database connection remains open. | |
160 | +*/ | |
161 | +int sqlite3_close(sqlite3 *); | |
162 | + | |
163 | +/* | |
164 | +** The type for a callback function. | |
165 | +** This is legacy and deprecated. It is included for historical | |
166 | +** compatibility and is not documented. | |
167 | +*/ | |
168 | +typedef int (*sqlite3_callback)(void*,int,char**, char**); | |
169 | + | |
170 | +/* | |
171 | +** CAPI3REF: One-Step Query Execution Interface | |
172 | +** | |
173 | +** This interface is used to do a one-time evaluatation of zero | |
174 | +** or more SQL statements. UTF-8 text of the SQL statements to | |
175 | +** be evaluted is passed in as the second parameter. The statements | |
176 | +** are prepared one by one using [sqlite3_prepare()], evaluated | |
177 | +** using [sqlite3_step()], then destroyed using [sqlite3_finalize()]. | |
178 | +** | |
179 | +** If one or more of the SQL statements are queries, then | |
180 | +** the callback function specified by the 3rd parameter is | |
181 | +** invoked once for each row of the query result. This callback | |
182 | +** should normally return 0. If the callback returns a non-zero | |
183 | +** value then the query is aborted, all subsequent SQL statements | |
184 | +** are skipped and the sqlite3_exec() function returns the SQLITE_ABORT. | |
185 | +** | |
186 | +** The 4th parameter to this interface is an arbitrary pointer that is | |
187 | +** passed through to the callback function as its first parameter. | |
188 | +** | |
189 | +** The 2nd parameter to the callback function is the number of | |
190 | +** columns in the query result. The 3rd parameter to the callback | |
191 | +** is an array of strings holding the values for each column | |
192 | +** as extracted using [sqlite3_column_text()]. | |
193 | +** The 4th parameter to the callback is an array of strings | |
194 | +** obtained using [sqlite3_column_name()] and holding | |
195 | +** the names of each column. | |
196 | +** | |
197 | +** The callback function may be NULL, even for queries. A NULL | |
198 | +** callback is not an error. It just means that no callback | |
199 | +** will be invoked. | |
200 | +** | |
201 | +** If an error occurs while parsing or evaluating the SQL (but | |
202 | +** not while executing the callback) then an appropriate error | |
203 | +** message is written into memory obtained from [sqlite3_malloc()] and | |
204 | +** *errmsg is made to point to that message. The calling function | |
205 | +** is responsible for freeing the memory that holds the error | |
206 | +** message. Use [sqlite3_free()] for this. If errmsg==NULL, | |
207 | +** then no error message is ever written. | |
208 | +** | |
209 | +** The return value is is SQLITE_OK if there are no errors and | |
210 | +** some other [SQLITE_OK | return code] if there is an error. | |
211 | +** The particular return value depends on the type of error. | |
212 | +** | |
213 | +*/ | |
214 | +int sqlite3_exec( | |
215 | + sqlite3*, /* An open database */ | |
216 | + const char *sql, /* SQL to be evaluted */ | |
217 | + int (*callback)(void*,int,char**,char**), /* Callback function */ | |
218 | + void *, /* 1st argument to callback */ | |
219 | + char **errmsg /* Error msg written here */ | |
220 | +); | |
221 | + | |
222 | +/* | |
223 | +** CAPI3REF: Result Codes | |
224 | +** KEYWORDS: SQLITE_OK | |
225 | +** | |
226 | +** Many SQLite functions return an integer result code from the set shown | |
227 | +** above in order to indicates success or failure. | |
228 | +** | |
229 | +** The result codes above are the only ones returned by SQLite in its | |
230 | +** default configuration. However, the [sqlite3_extended_result_codes()] | |
231 | +** API can be used to set a database connectoin to return more detailed | |
232 | +** result codes. | |
233 | +** | |
234 | +** See also: [SQLITE_IOERR_READ | extended result codes] | |
235 | +** | |
236 | +*/ | |
237 | +#define SQLITE_OK 0 /* Successful result */ | |
238 | +/* beginning-of-error-codes */ | |
239 | +#define SQLITE_ERROR 1 /* SQL error or missing database */ | |
240 | +#define SQLITE_INTERNAL 2 /* NOT USED. Internal logic error in SQLite */ | |
241 | +#define SQLITE_PERM 3 /* Access permission denied */ | |
242 | +#define SQLITE_ABORT 4 /* Callback routine requested an abort */ | |
243 | +#define SQLITE_BUSY 5 /* The database file is locked */ | |
244 | +#define SQLITE_LOCKED 6 /* A table in the database is locked */ | |
245 | +#define SQLITE_NOMEM 7 /* A malloc() failed */ | |
246 | +#define SQLITE_READONLY 8 /* Attempt to write a readonly database */ | |
247 | +#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/ | |
248 | +#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */ | |
249 | +#define SQLITE_CORRUPT 11 /* The database disk image is malformed */ | |
250 | +#define SQLITE_NOTFOUND 12 /* NOT USED. Table or record not found */ | |
251 | +#define SQLITE_FULL 13 /* Insertion failed because database is full */ | |
252 | +#define SQLITE_CANTOPEN 14 /* Unable to open the database file */ | |
253 | +#define SQLITE_PROTOCOL 15 /* NOT USED. Database lock protocol error */ | |
254 | +#define SQLITE_EMPTY 16 /* Database is empty */ | |
255 | +#define SQLITE_SCHEMA 17 /* The database schema changed */ | |
256 | +#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */ | |
257 | +#define SQLITE_CONSTRAINT 19 /* Abort due to contraint violation */ | |
258 | +#define SQLITE_MISMATCH 20 /* Data type mismatch */ | |
259 | +#define SQLITE_MISUSE 21 /* Library used incorrectly */ | |
260 | +#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */ | |
261 | +#define SQLITE_AUTH 23 /* Authorization denied */ | |
262 | +#define SQLITE_FORMAT 24 /* Auxiliary database format error */ | |
263 | +#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */ | |
264 | +#define SQLITE_NOTADB 26 /* File opened that is not a database file */ | |
265 | +#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */ | |
266 | +#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */ | |
267 | +/* end-of-error-codes */ | |
268 | + | |
269 | +/* | |
270 | +** CAPI3REF: Extended Result Codes | |
271 | +** | |
272 | +** In its default configuration, SQLite API routines return one of 26 integer | |
273 | +** result codes described at result-codes. However, experience has shown that | |
274 | +** many of these result codes are too course-grained. They do not provide as | |
275 | +** much information about problems as users might like. In an effort to | |
276 | +** address this, newer versions of SQLite (version 3.3.8 and later) include | |
277 | +** support for additional result codes that provide more detailed information | |
278 | +** about errors. The extended result codes are enabled (or disabled) for | |
279 | +** each database | |
280 | +** connection using the [sqlite3_extended_result_codes()] API. | |
281 | +** | |
282 | +** Some of the available extended result codes are listed above. | |
283 | +** We expect the number of extended result codes will be expand | |
284 | +** over time. Software that uses extended result codes should expect | |
285 | +** to see new result codes in future releases of SQLite. | |
286 | +** | |
287 | +** The symbolic name for an extended result code always contains a related | |
288 | +** primary result code as a prefix. Primary result codes contain a single | |
289 | +** "_" character. Extended result codes contain two or more "_" characters. | |
290 | +** The numeric value of an extended result code can be converted to its | |
291 | +** corresponding primary result code by masking off the lower 8 bytes. | |
292 | +** | |
293 | +** The SQLITE_OK result code will never be extended. It will always | |
294 | +** be exactly zero. | |
295 | +*/ | |
296 | +#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8)) | |
297 | +#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8)) | |
298 | +#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8)) | |
299 | +#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8)) | |
300 | +#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8)) | |
301 | +#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8)) | |
302 | +#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8)) | |
303 | +#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8)) | |
304 | +#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8)) | |
305 | +#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8)) | |
306 | +#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8)) | |
307 | + | |
308 | +/* | |
309 | +** CAPI3REF: Enable Or Disable Extended Result Codes | |
310 | +** | |
311 | +** This routine enables or disables the | |
312 | +** [SQLITE_IOERR_READ | extended result codes] feature. | |
313 | +** By default, SQLite API routines return one of only 26 integer | |
314 | +** [SQLITE_OK | result codes]. When extended result codes | |
315 | +** are enabled by this routine, the repetoire of result codes can be | |
316 | +** much larger and can (hopefully) provide more detailed information | |
317 | +** about the cause of an error. | |
318 | +** | |
319 | +** The second argument is a boolean value that turns extended result | |
320 | +** codes on and off. Extended result codes are off by default for | |
321 | +** backwards compatibility with older versions of SQLite. | |
322 | +*/ | |
323 | +int sqlite3_extended_result_codes(sqlite3*, int onoff); | |
324 | + | |
325 | +/* | |
326 | +** CAPI3REF: Last Insert Rowid | |
327 | +** | |
328 | +** Each entry in an SQLite table has a unique 64-bit signed integer key | |
329 | +** called the "rowid". The rowid is always available as an undeclared | |
330 | +** column named ROWID, OID, or _ROWID_. If the table has a column of | |
331 | +** type INTEGER PRIMARY KEY then that column is another an alias for the | |
332 | +** rowid. | |
333 | +** | |
334 | +** This routine returns the rowid of the most recent INSERT into | |
335 | +** the database from the database connection given in the first | |
336 | +** argument. If no inserts have ever occurred on this database | |
337 | +** connection, zero is returned. | |
338 | +** | |
339 | +** If an INSERT occurs within a trigger, then the rowid of the | |
340 | +** inserted row is returned by this routine as long as the trigger | |
341 | +** is running. But once the trigger terminates, the value returned | |
342 | +** by this routine reverts to the last value inserted before the | |
343 | +** trigger fired. | |
344 | +*/ | |
345 | +sqlite_int64 sqlite3_last_insert_rowid(sqlite3*); | |
346 | + | |
347 | +/* | |
348 | +** CAPI3REF: Count The Number Of Rows Modified | |
349 | +** | |
350 | +** This function returns the number of database rows that were changed | |
351 | +** (or inserted or deleted) by the most recent SQL statement. Only | |
352 | +** changes that are directly specified by the INSERT, UPDATE, or | |
353 | +** DELETE statement are counted. Auxiliary changes caused by | |
354 | +** triggers are not counted. Use the [sqlite3_total_changes()] function | |
355 | +** to find the total number of changes including changes caused by triggers. | |
356 | +** | |
357 | +** Within the body of a trigger, the sqlite3_changes() interface can be | |
358 | +** called to find the number of | |
359 | +** changes in the most recently completed INSERT, UPDATE, or DELETE | |
360 | +** statement within the body of the trigger. | |
361 | +** | |
362 | +** All changes are counted, even if they were later undone by a | |
363 | +** ROLLBACK or ABORT. Except, changes associated with creating and | |
364 | +** dropping tables are not counted. | |
365 | +** | |
366 | +** If a callback invokes [sqlite3_exec()] or [sqlite3_step()] recursively, | |
367 | +** then the changes in the inner, recursive call are counted together | |
368 | +** with the changes in the outer call. | |
369 | +** | |
370 | +** SQLite implements the command "DELETE FROM table" without a WHERE clause | |
371 | +** by dropping and recreating the table. (This is much faster than going | |
372 | +** through and deleting individual elements from the table.) Because of | |
373 | +** this optimization, the change count for "DELETE FROM table" will be | |
374 | +** zero regardless of the number of elements that were originally in the | |
375 | +** table. To get an accurate count of the number of rows deleted, use | |
376 | +** "DELETE FROM table WHERE 1" instead. | |
377 | +*/ | |
378 | +int sqlite3_changes(sqlite3*); | |
379 | + | |
380 | +/* | |
381 | +** CAPI3REF: Total Number Of Rows Modified | |
382 | +*** | |
383 | +** This function returns the number of database rows that have been | |
384 | +** modified by INSERT, UPDATE or DELETE statements since the database handle | |
385 | +** was opened. This includes UPDATE, INSERT and DELETE statements executed | |
386 | +** as part of trigger programs. All changes are counted as soon as the | |
387 | +** statement that makes them is completed (when the statement handle is | |
388 | +** passed to [sqlite3_reset()] or [sqlite_finalise()]). | |
389 | +** | |
390 | +** See also the [sqlite3_change()] interface. | |
391 | +** | |
392 | +** SQLite implements the command "DELETE FROM table" without a WHERE clause | |
393 | +** by dropping and recreating the table. (This is much faster than going | |
394 | +** through and deleting individual elements form the table.) Because of | |
395 | +** this optimization, the change count for "DELETE FROM table" will be | |
396 | +** zero regardless of the number of elements that were originally in the | |
397 | +** table. To get an accurate count of the number of rows deleted, use | |
398 | +** "DELETE FROM table WHERE 1" instead. | |
399 | +*/ | |
400 | +int sqlite3_total_changes(sqlite3*); | |
401 | + | |
402 | +/* | |
403 | +** CAPI3REF: Interrupt A Long-Running Query | |
404 | +** | |
405 | +** This function causes any pending database operation to abort and | |
406 | +** return at its earliest opportunity. This routine is typically | |
407 | +** called in response to a user action such as pressing "Cancel" | |
408 | +** or Ctrl-C where the user wants a long query operation to halt | |
409 | +** immediately. | |
410 | +** | |
411 | +** It is safe to call this routine from a thread different from the | |
412 | +** thread that is currently running the database operation. | |
413 | +** | |
414 | +** The SQL operation that is interrupted will return [SQLITE_INTERRUPT]. | |
415 | +** If an interrupted operation was an update that is inside an | |
416 | +** explicit transaction, then the entire transaction will be rolled | |
417 | +** back automatically. | |
418 | +*/ | |
419 | +void sqlite3_interrupt(sqlite3*); | |
420 | + | |
421 | +/* | |
422 | +** CAPI3REF: Determine If An SQL Statement Is Complete | |
423 | +** | |
424 | +** These functions return true if the given input string comprises | |
425 | +** one or more complete SQL statements. For the sqlite3_complete() call, | |
426 | +** the parameter must be a nul-terminated UTF-8 string. For | |
427 | +** sqlite3_complete16(), a nul-terminated machine byte order UTF-16 string | |
428 | +** is required. | |
429 | +** | |
430 | +** These routines are useful for command-line input to determine if the | |
431 | +** currently entered text forms one or more complete SQL statements or | |
432 | +** if additional input is needed before sending the statements into | |
433 | +** SQLite for parsing. The algorithm is simple. If the | |
434 | +** last token other than spaces and comments is a semicolon, then return | |
435 | +** true. Actually, the algorithm is a little more complicated than that | |
436 | +** in order to deal with triggers, but the basic idea is the same: the | |
437 | +** statement is not complete unless it ends in a semicolon. | |
438 | +*/ | |
439 | +int sqlite3_complete(const char *sql); | |
440 | +int sqlite3_complete16(const void *sql); | |
441 | + | |
442 | +/* | |
443 | +** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors | |
444 | +** | |
445 | +** This routine identifies a callback function that might be invoked | |
446 | +** whenever an attempt is made to open a database table | |
447 | +** that another thread or process has locked. | |
448 | +** If the busy callback is NULL, then [SQLITE_BUSY] | |
449 | +** (or sometimes [SQLITE_IOERR_BLOCKED]) | |
450 | +** is returned immediately upon encountering the lock. | |
451 | +** If the busy callback is not NULL, then the | |
452 | +** callback will be invoked with two arguments. The | |
453 | +** first argument to the handler is a copy of the void* pointer which | |
454 | +** is the third argument to this routine. The second argument to | |
455 | +** the handler is the number of times that the busy handler has | |
456 | +** been invoked for this locking event. If the | |
457 | +** busy callback returns 0, then no additional attempts are made to | |
458 | +** access the database and [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] is returned. | |
459 | +** If the callback returns non-zero, then another attempt is made to open the | |
460 | +** database for reading and the cycle repeats. | |
461 | +** | |
462 | +** The presence of a busy handler does not guarantee that | |
463 | +** it will be invoked when there is lock contention. | |
464 | +** If SQLite determines that invoking the busy handler could result in | |
465 | +** a deadlock, it will return [SQLITE_BUSY] instead. | |
466 | +** Consider a scenario where one process is holding a read lock that | |
467 | +** it is trying to promote to a reserved lock and | |
468 | +** a second process is holding a reserved lock that it is trying | |
469 | +** to promote to an exclusive lock. The first process cannot proceed | |
470 | +** because it is blocked by the second and the second process cannot | |
471 | +** proceed because it is blocked by the first. If both processes | |
472 | +** invoke the busy handlers, neither will make any progress. Therefore, | |
473 | +** SQLite returns [SQLITE_BUSY] for the first process, hoping that this | |
474 | +** will induce the first process to release its read lock and allow | |
475 | +** the second process to proceed. | |
476 | +** | |
477 | +** The default busy callback is NULL. | |
478 | +** | |
479 | +** The [SQLITE_BUSY] error is converted to [SQLITE_IOERR_BLOCKED] when | |
480 | +** SQLite is in the middle of a large transaction where all the | |
481 | +** changes will not fit into the in-memory cache. SQLite will | |
482 | +** already hold a RESERVED lock on the database file, but it needs | |
483 | +** to promote this lock to EXCLUSIVE so that it can spill cache | |
484 | +** pages into the database file without harm to concurrent | |
485 | +** readers. If it is unable to promote the lock, then the in-memory | |
486 | +** cache will be left in an inconsistent state and so the error | |
487 | +** code is promoted from the relatively benign [SQLITE_BUSY] to | |
488 | +** the more severe [SQLITE_IOERR_BLOCKED]. This error code promotion | |
489 | +** forces an automatic rollback of the changes. See the | |
490 | +** <a href="http://www.sqlite.org/cvstrac/wiki?p=CorruptionFollowingBusyError"> | |
491 | +** CorruptionFollowingBusyError</a> wiki page for a discussion of why | |
492 | +** this is important. | |
493 | +** | |
494 | +** Sqlite is re-entrant, so the busy handler may start a new query. | |
495 | +** (It is not clear why anyone would every want to do this, but it | |
496 | +** is allowed, in theory.) But the busy handler may not close the | |
497 | +** database. Closing the database from a busy handler will delete | |
498 | +** data structures out from under the executing query and will | |
499 | +** probably result in a segmentation fault or other runtime error. | |
500 | +** | |
501 | +** There can only be a single busy handler defined for each database | |
502 | +** connection. Setting a new busy handler clears any previous one. | |
503 | +** Note that calling [sqlite3_busy_timeout()] will also set or clear | |
504 | +** the busy handler. | |
505 | +*/ | |
506 | +int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*); | |
507 | + | |
508 | +/* | |
509 | +** CAPI3REF: Set A Busy Timeout | |
510 | +** | |
511 | +** This routine sets a busy handler that sleeps for a while when a | |
512 | +** table is locked. The handler will sleep multiple times until | |
513 | +** at least "ms" milliseconds of sleeping have been done. After | |
514 | +** "ms" milliseconds of sleeping, the handler returns 0 which | |
515 | +** causes [sqlite3_step()] to return [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED]. | |
516 | +** | |
517 | +** Calling this routine with an argument less than or equal to zero | |
518 | +** turns off all busy handlers. | |
519 | +** | |
520 | +** There can only be a single busy handler for a particular database | |
521 | +** connection. If another busy handler was defined | |
522 | +** (using [sqlite3_busy_handler()]) prior to calling | |
523 | +** this routine, that other busy handler is cleared. | |
524 | +*/ | |
525 | +int sqlite3_busy_timeout(sqlite3*, int ms); | |
526 | + | |
527 | +/* | |
528 | +** CAPI3REF: Convenience Routines For Running Queries | |
529 | +** | |
530 | +** This next routine is a convenience wrapper around [sqlite3_exec()]. | |
531 | +** Instead of invoking a user-supplied callback for each row of the | |
532 | +** result, this routine remembers each row of the result in memory | |
533 | +** obtained from [sqlite3_malloc()], then returns all of the result after the | |
534 | +** query has finished. | |
535 | +** | |
536 | +** As an example, suppose the query result where this table: | |
537 | +** | |
538 | +** <pre> | |
539 | +** Name | Age | |
540 | +** ----------------------- | |
541 | +** Alice | 43 | |
542 | +** Bob | 28 | |
543 | +** Cindy | 21 | |
544 | +** </pre> | |
545 | +** | |
546 | +** If the 3rd argument were &azResult then after the function returns | |
547 | +** azResult will contain the following data: | |
548 | +** | |
549 | +** <pre> | |
550 | +** azResult[0] = "Name"; | |
551 | +** azResult[1] = "Age"; | |
552 | +** azResult[2] = "Alice"; | |
553 | +** azResult[3] = "43"; | |
554 | +** azResult[4] = "Bob"; | |
555 | +** azResult[5] = "28"; | |
556 | +** azResult[6] = "Cindy"; | |
557 | +** azResult[7] = "21"; | |
558 | +** </pre> | |
559 | +** | |
560 | +** Notice that there is an extra row of data containing the column | |
561 | +** headers. But the *nrow return value is still 3. *ncolumn is | |
562 | +** set to 2. In general, the number of values inserted into azResult | |
563 | +** will be ((*nrow) + 1)*(*ncolumn). | |
564 | +** | |
565 | +** After the calling function has finished using the result, it should | |
566 | +** pass the result data pointer to sqlite3_free_table() in order to | |
567 | +** release the memory that was malloc-ed. Because of the way the | |
568 | +** [sqlite3_malloc()] happens, the calling function must not try to call | |
569 | +** [sqlite3_free()] directly. Only [sqlite3_free_table()] is able to release | |
570 | +** the memory properly and safely. | |
571 | +** | |
572 | +** The return value of this routine is the same as from [sqlite3_exec()]. | |
573 | +*/ | |
574 | +int sqlite3_get_table( | |
575 | + sqlite3*, /* An open database */ | |
576 | + const char *sql, /* SQL to be executed */ | |
577 | + char ***resultp, /* Result written to a char *[] that this points to */ | |
578 | + int *nrow, /* Number of result rows written here */ | |
579 | + int *ncolumn, /* Number of result columns written here */ | |
580 | + char **errmsg /* Error msg written here */ | |
581 | +); | |
582 | +void sqlite3_free_table(char **result); | |
583 | + | |
584 | +/* | |
585 | +** CAPI3REF: Formatted String Printing Functions | |
586 | +** | |
587 | +** These routines are workalikes of the "printf()" family of functions | |
588 | +** from the standard C library. | |
589 | +** | |
590 | +** The sqlite3_mprintf() and sqlite3_vmprintf() routines write their | |
591 | +** results into memory obtained from [sqlite_malloc()]. | |
592 | +** The strings returned by these two routines should be | |
593 | +** released by [sqlite3_free()]. Both routines return a | |
594 | +** NULL pointer if [sqlite3_malloc()] is unable to allocate enough | |
595 | +** memory to hold the resulting string. | |
596 | +** | |
597 | +** In sqlite3_snprintf() routine is similar to "snprintf()" from | |
598 | +** the standard C library. The result is written into the | |
599 | +** buffer supplied as the second parameter whose size is given by | |
600 | +** the first parameter. Note that the order of the | |
601 | +** first two parameters is reversed from snprintf(). This is an | |
602 | +** historical accident that cannot be fixed without breaking | |
603 | +** backwards compatibility. Note also that sqlite3_snprintf() | |
604 | +** returns a pointer to its buffer instead of the number of | |
605 | +** characters actually written into the buffer. We admit that | |
606 | +** the number of characters written would be a more useful return | |
607 | +** value but we cannot change the implementation of sqlite3_snprintf() | |
608 | +** now without breaking compatibility. | |
609 | +** | |
610 | +** As long as the buffer size is greater than zero, sqlite3_snprintf() | |
611 | +** guarantees that the buffer is always zero-terminated. The first | |
612 | +** parameter "n" is the total size of the buffer, including space for | |
613 | +** the zero terminator. So the longest string that can be completely | |
614 | +** written will be n-1 characters. | |
615 | +** | |
616 | +** These routines all implement some additional formatting | |
617 | +** options that are useful for constructing SQL statements. | |
618 | +** All of the usual printf formatting options apply. In addition, there | |
619 | +** is are "%q" and "%Q" options. | |
620 | +** | |
621 | +** The %q option works like %s in that it substitutes a null-terminated | |
622 | +** string from the argument list. But %q also doubles every '\'' character. | |
623 | +** %q is designed for use inside a string literal. By doubling each '\'' | |
624 | +** character it escapes that character and allows it to be inserted into | |
625 | +** the string. | |
626 | +** | |
627 | +** For example, so some string variable contains text as follows: | |
628 | +** | |
629 | +** <blockquote><pre> | |
630 | +** char *zText = "It's a happy day!"; | |
631 | +** </pre></blockquote> | |
632 | +** | |
633 | +** One can use this text in an SQL statement as follows: | |
634 | +** | |
635 | +** <blockquote><pre> | |
636 | +** char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText); | |
637 | +** sqlite3_exec(db, zSQL, 0, 0, 0); | |
638 | +** sqlite3_free(zSQL); | |
639 | +** </pre></blockquote> | |
640 | +** | |
641 | +** Because the %q format string is used, the '\'' character in zText | |
642 | +** is escaped and the SQL generated is as follows: | |
643 | +** | |
644 | +** <blockquote><pre> | |
645 | +** INSERT INTO table1 VALUES('It''s a happy day!') | |
646 | +** </pre></blockquote> | |
647 | +** | |
648 | +** This is correct. Had we used %s instead of %q, the generated SQL | |
649 | +** would have looked like this: | |
650 | +** | |
651 | +** <blockquote><pre> | |
652 | +** INSERT INTO table1 VALUES('It's a happy day!'); | |
653 | +** </pre></blockquote> | |
654 | +** | |
655 | +** This second example is an SQL syntax error. As a general rule you | |
656 | +** should always use %q instead of %s when inserting text into a string | |
657 | +** literal. | |
658 | +** | |
659 | +** The %Q option works like %q except it also adds single quotes around | |
660 | +** the outside of the total string. Or if the parameter in the argument | |
661 | +** list is a NULL pointer, %Q substitutes the text "NULL" (without single | |
662 | +** quotes) in place of the %Q option. So, for example, one could say: | |
663 | +** | |
664 | +** <blockquote><pre> | |
665 | +** char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText); | |
666 | +** sqlite3_exec(db, zSQL, 0, 0, 0); | |
667 | +** sqlite3_free(zSQL); | |
668 | +** </pre></blockquote> | |
669 | +** | |
670 | +** The code above will render a correct SQL statement in the zSQL | |
671 | +** variable even if the zText variable is a NULL pointer. | |
672 | +*/ | |
673 | +char *sqlite3_mprintf(const char*,...); | |
674 | +char *sqlite3_vmprintf(const char*, va_list); | |
675 | +char *sqlite3_snprintf(int,char*,const char*, ...); | |
676 | + | |
677 | +/* | |
678 | +** CAPI3REF: Memory Allocation Functions | |
679 | +** | |
680 | +** SQLite uses its own memory allocator. On some installations, this | |
681 | +** memory allocator is identical to the standard malloc()/realloc()/free() | |
682 | +** and can be used interchangable. On others, the implementations are | |
683 | +** different. For maximum portability, it is best not to mix calls | |
684 | +** to the standard malloc/realloc/free with the sqlite versions. | |
685 | +*/ | |
686 | +void *sqlite3_malloc(int); | |
687 | +void *sqlite3_realloc(void*, int); | |
688 | +void sqlite3_free(void*); | |
689 | + | |
690 | +/* | |
691 | +** CAPI3REF: Compile-Time Authorization Callbacks | |
692 | +*** | |
693 | +** This routine registers a authorizer callback with the SQLite library. | |
694 | +** The authorizer callback is invoked as SQL statements are being compiled | |
695 | +** by [sqlite3_prepare()] or its variants [sqlite3_prepare_v2()], | |
696 | +** [sqlite3_prepare16()] and [sqlite3_prepare16_v2()]. At various | |
697 | +** points during the compilation process, as logic is being created | |
698 | +** to perform various actions, the authorizer callback is invoked to | |
699 | +** see if those actions are allowed. The authorizer callback should | |
700 | +** return SQLITE_OK to allow the action, [SQLITE_IGNORE] to disallow the | |
701 | +** specific action but allow the SQL statement to continue to be | |
702 | +** compiled, or [SQLITE_DENY] to cause the entire SQL statement to be | |
703 | +** rejected with an error. | |
704 | +** | |
705 | +** Depending on the action, the [SQLITE_IGNORE] and [SQLITE_DENY] return | |
706 | +** codes might mean something different or they might mean the same | |
707 | +** thing. If the action is, for example, to perform a delete opertion, | |
708 | +** then [SQLITE_IGNORE] and [SQLITE_DENY] both cause the statement compilation | |
709 | +** to fail with an error. But if the action is to read a specific column | |
710 | +** from a specific table, then [SQLITE_DENY] will cause the entire | |
711 | +** statement to fail but [SQLITE_IGNORE] will cause a NULL value to be | |
712 | +** read instead of the actual column value. | |
713 | +** | |
714 | +** The first parameter to the authorizer callback is a copy of | |
715 | +** the third parameter to the sqlite3_set_authorizer() interface. | |
716 | +** The second parameter to the callback is an integer | |
717 | +** [SQLITE_COPY | action code] that specifies the particular action | |
718 | +** to be authorized. The available action codes are | |
719 | +** [SQLITE_COPY | documented separately]. The third through sixth | |
720 | +** parameters to the callback are strings that contain additional | |
721 | +** details about the action to be authorized. | |
722 | +** | |
723 | +** An authorizer is used when preparing SQL statements from an untrusted | |
724 | +** source, to ensure that the SQL statements do not try to access data | |
725 | +** that they are not allowed to see, or that they do not try to | |
726 | +** execute malicious statements that damage the database. For | |
727 | +** example, an application may allow a user to enter arbitrary | |
728 | +** SQL queries for evaluation by a database. But the application does | |
729 | +** not want the user to be able to make arbitrary changes to the | |
730 | +** database. An authorizer could then be put in place while the | |
731 | +** user-entered SQL is being prepared that disallows everything | |
732 | +** except SELECT statements. | |
733 | +** | |
734 | +** Only a single authorizer can be in place on a database connection | |
735 | +** at a time. Each call to sqlite3_set_authorizer overrides the | |
736 | +** previous call. A NULL authorizer means that no authorization | |
737 | +** callback is invoked. The default authorizer is NULL. | |
738 | +** | |
739 | +** Note that the authorizer callback is invoked only during | |
740 | +** [sqlite3_prepare()] or its variants. Authorization is not | |
741 | +** performed during statement evaluation in [sqlite3_step()]. | |
742 | +*/ | |
743 | +int sqlite3_set_authorizer( | |
744 | + sqlite3*, | |
745 | + int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), | |
746 | + void *pUserData | |
747 | +); | |
748 | + | |
749 | +/* | |
750 | +** CAPI3REF: Authorizer Return Codes | |
751 | +** | |
752 | +** The [sqlite3_set_authorizer | authorizer callback function] must | |
753 | +** return either [SQLITE_OK] or one of these two constants in order | |
754 | +** to signal SQLite whether or not the action is permitted. See the | |
755 | +** [sqlite3_set_authorizer | authorizer documentation] for additional | |
756 | +** information. | |
757 | +*/ | |
758 | +#define SQLITE_DENY 1 /* Abort the SQL statement with an error */ | |
759 | +#define SQLITE_IGNORE 2 /* Don't allow access, but don't generate an error */ | |
760 | + | |
761 | +/* | |
762 | +** CAPI3REF: Authorizer Action Codes | |
763 | +** | |
764 | +** The [sqlite3_set_authorizer()] interface registers a callback function | |
765 | +** that is invoked to authorizer certain SQL statement actions. The | |
766 | +** second parameter to the callback is an integer code that specifies | |
767 | +** what action is being authorized. These are the integer action codes that | |
768 | +** the authorizer callback may be passed. | |
769 | +** | |
770 | +** These action code values signify what kind of operation is to be | |
771 | +** authorized. The 3rd and 4th parameters to the authorization callback | |
772 | +** function will be parameters or NULL depending on which of these | |
773 | +** codes is used as the second parameter. The 5th parameter to the | |
774 | +** authorizer callback is the name of the database ("main", "temp", | |
775 | +** etc.) if applicable. The 6th parameter to the authorizer callback | |
776 | +** is the name of the inner-most trigger or view that is responsible for | |
777 | +** the access attempt or NULL if this access attempt is directly from | |
778 | +** top-level SQL code. | |
779 | +*/ | |
780 | +/******************************************* 3rd ************ 4th ***********/ | |
781 | +#define SQLITE_CREATE_INDEX 1 /* Index Name Table Name */ | |
782 | +#define SQLITE_CREATE_TABLE 2 /* Table Name NULL */ | |
783 | +#define SQLITE_CREATE_TEMP_INDEX 3 /* Index Name Table Name */ | |
784 | +#define SQLITE_CREATE_TEMP_TABLE 4 /* Table Name NULL */ | |
785 | +#define SQLITE_CREATE_TEMP_TRIGGER 5 /* Trigger Name Table Name */ | |
786 | +#define SQLITE_CREATE_TEMP_VIEW 6 /* View Name NULL */ | |
787 | +#define SQLITE_CREATE_TRIGGER 7 /* Trigger Name Table Name */ | |
788 | +#define SQLITE_CREATE_VIEW 8 /* View Name NULL */ | |
789 | +#define SQLITE_DELETE 9 /* Table Name NULL */ | |
790 | +#define SQLITE_DROP_INDEX 10 /* Index Name Table Name */ | |
791 | +#define SQLITE_DROP_TABLE 11 /* Table Name NULL */ | |
792 | +#define SQLITE_DROP_TEMP_INDEX 12 /* Index Name Table Name */ | |
793 | +#define SQLITE_DROP_TEMP_TABLE 13 /* Table Name NULL */ | |
794 | +#define SQLITE_DROP_TEMP_TRIGGER 14 /* Trigger Name Table Name */ | |
795 | +#define SQLITE_DROP_TEMP_VIEW 15 /* View Name NULL */ | |
796 | +#define SQLITE_DROP_TRIGGER 16 /* Trigger Name Table Name */ | |
797 | +#define SQLITE_DROP_VIEW 17 /* View Name NULL */ | |
798 | +#define SQLITE_INSERT 18 /* Table Name NULL */ | |
799 | +#define SQLITE_PRAGMA 19 /* Pragma Name 1st arg or NULL */ | |
800 | +#define SQLITE_READ 20 /* Table Name Column Name */ | |
801 | +#define SQLITE_SELECT 21 /* NULL NULL */ | |
802 | +#define SQLITE_TRANSACTION 22 /* NULL NULL */ | |
803 | +#define SQLITE_UPDATE 23 /* Table Name Column Name */ | |
804 | +#define SQLITE_ATTACH 24 /* Filename NULL */ | |
805 | +#define SQLITE_DETACH 25 /* Database Name NULL */ | |
806 | +#define SQLITE_ALTER_TABLE 26 /* Database Name Table Name */ | |
807 | +#define SQLITE_REINDEX 27 /* Index Name NULL */ | |
808 | +#define SQLITE_ANALYZE 28 /* Table Name NULL */ | |
809 | +#define SQLITE_CREATE_VTABLE 29 /* Table Name Module Name */ | |
810 | +#define SQLITE_DROP_VTABLE 30 /* Table Name Module Name */ | |
811 | +#define SQLITE_FUNCTION 31 /* Function Name NULL */ | |
812 | +#define SQLITE_COPY 0 /* No longer used */ | |
813 | + | |
814 | +/* | |
815 | +** CAPI3REF: Tracing And Profiling Functions | |
816 | +** | |
817 | +** These routines register callback functions that can be used for | |
818 | +** tracing and profiling the execution of SQL statements. | |
819 | +** The callback function registered by sqlite3_trace() is invoked | |
820 | +** at the first [sqlite3_step()] for the evaluation of an SQL statement. | |
821 | +** The callback function registered by sqlite3_profile() is invoked | |
822 | +** as each SQL statement finishes and includes | |
823 | +** information on how long that statement ran. | |
824 | +** | |
825 | +** The sqlite3_profile() API is currently considered experimental and | |
826 | +** is subject to change. | |
827 | +*/ | |
828 | +void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*); | |
829 | +void *sqlite3_profile(sqlite3*, | |
830 | + void(*xProfile)(void*,const char*,sqlite_uint64), void*); | |
831 | + | |
832 | +/* | |
833 | +** CAPI3REF: Query Progress Callbacks | |
834 | +** | |
835 | +** This routine configures a callback function - the progress callback - that | |
836 | +** is invoked periodically during long running calls to [sqlite3_exec()], | |
837 | +** [sqlite3_step()] and [sqlite3_get_table()]. An example use for this | |
838 | +** interface is to keep a GUI updated during a large query. | |
839 | +** | |
840 | +** The progress callback is invoked once for every N virtual machine opcodes, | |
841 | +** where N is the second argument to this function. The progress callback | |
842 | +** itself is identified by the third argument to this function. The fourth | |
843 | +** argument to this function is a void pointer passed to the progress callback | |
844 | +** function each time it is invoked. | |
845 | +** | |
846 | +** If a call to [sqlite3_exec()], [sqlite3_step()], or [sqlite3_get_table()] | |
847 | +** results in fewer than N opcodes being executed, then the progress | |
848 | +** callback is never invoked. | |
849 | +** | |
850 | +** Only a single progress callback function may be registered for each | |
851 | +** open database connection. Every call to sqlite3_progress_handler() | |
852 | +** overwrites the results of the previous call. | |
853 | +** To remove the progress callback altogether, pass NULL as the third | |
854 | +** argument to this function. | |
855 | +** | |
856 | +** If the progress callback returns a result other than 0, then the current | |
857 | +** query is immediately terminated and any database changes rolled back. | |
858 | +** The containing [sqlite3_exec()], [sqlite3_step()], or | |
859 | +** [sqlite3_get_table()] call returns SQLITE_INTERRUPT. This feature | |
860 | +** can be used, for example, to implement the "Cancel" button on a | |
861 | +** progress dialog box in a GUI. | |
862 | +*/ | |
863 | +void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); | |
864 | + | |
865 | +/* | |
866 | +** CAPI3REF: Opening A New Database Connection | |
867 | +** | |
868 | +** Open the sqlite database file "filename". The "filename" is UTF-8 | |
869 | +** encoded for sqlite3_open() and UTF-16 encoded in the native byte order | |
870 | +** for sqlite3_open16(). An [sqlite3*] handle is returned in *ppDb, even | |
871 | +** if an error occurs. If the database is opened (or created) successfully, | |
872 | +** then SQLITE_OK is returned. Otherwise an error code is returned. The | |
873 | +** sqlite3_errmsg() or sqlite3_errmsg16() routines can be used to obtain | |
874 | +** an English language description of the error. | |
875 | +** | |
876 | +** If the database file does not exist, then a new database will be created | |
877 | +** as needed. The default encoding for the database will be UTF-8 if | |
878 | +** sqlite3_open() is called and UTF-16 if sqlite3_open16 is used. | |
879 | +** | |
880 | +** Whether or not an error occurs when it is opened, resources associated | |
881 | +** with the [sqlite3*] handle should be released by passing it to | |
882 | +** sqlite3_close() when it is no longer required. | |
883 | +** | |
884 | +** Note to windows users: The encoding used for the filename argument | |
885 | +** of sqlite3_open() must be UTF-8, not whatever codepage is currently | |
886 | +** defined. Filenames containing international characters must be converted | |
887 | +** to UTF-8 prior to passing them into sqlite3_open(). | |
888 | +*/ | |
889 | +int sqlite3_open( | |
890 | + const char *filename, /* Database filename (UTF-8) */ | |
891 | + sqlite3 **ppDb /* OUT: SQLite db handle */ | |
892 | +); | |
893 | +int sqlite3_open16( | |
894 | + const void *filename, /* Database filename (UTF-16) */ | |
895 | + sqlite3 **ppDb /* OUT: SQLite db handle */ | |
896 | +); | |
897 | + | |
898 | +/* | |
899 | +** CAPI3REF: Error Codes And Messages | |
900 | +** | |
901 | +** The sqlite3_errcode() interface returns the numeric | |
902 | +** [SQLITE_OK | result code] or [SQLITE_IOERR_READ | extended result code] | |
903 | +** for the most recent failed sqlite3_* API call associated | |
904 | +** with [sqlite3] handle 'db'. If a prior API call failed but the | |
905 | +** most recent API call succeeded, the return value from sqlite3_errcode() | |
906 | +** is undefined. | |
907 | +** | |
908 | +** The sqlite3_errmsg() and sqlite3_errmsg16() return English-langauge | |
909 | +** text that describes the error, as either UTF8 or UTF16 respectively. | |
910 | +** Memory to hold the error message string is managed internally. The | |
911 | +** string may be overwritten or deallocated by subsequent calls to SQLite | |
912 | +** interface functions. | |
913 | +** | |
914 | +** Calls to many sqlite3_* functions set the error code and string returned | |
915 | +** by [sqlite3_errcode()], [sqlite3_errmsg()], and [sqlite3_errmsg16()] | |
916 | +** (overwriting the previous values). Note that calls to [sqlite3_errcode()], | |
917 | +** [sqlite3_errmsg()], and [sqlite3_errmsg16()] themselves do not affect the | |
918 | +** results of future invocations. Calls to API routines that do not return | |
919 | +** an error code (examples: [sqlite3_data_count()] or [sqlite3_mprintf()]) do | |
920 | +** not change the error code returned by this routine. | |
921 | +** | |
922 | +** Assuming no other intervening sqlite3_* API calls are made, the error | |
923 | +** code returned by this function is associated with the same error as | |
924 | +** the strings returned by [sqlite3_errmsg()] and [sqlite3_errmsg16()]. | |
925 | +*/ | |
926 | +int sqlite3_errcode(sqlite3 *db); | |
927 | +const char *sqlite3_errmsg(sqlite3*); | |
928 | +const void *sqlite3_errmsg16(sqlite3*); | |
929 | + | |
930 | +/* | |
931 | +** CAPI3REF: SQL Statement Object | |
932 | +** | |
933 | +** Instance of this object represent single SQL statements. This | |
934 | +** is variously known as a "prepared statement" or a | |
935 | +** "compiled SQL statement" or simply as a "statement". | |
936 | +** | |
937 | +** The life of a statement object goes something like this: | |
938 | +** | |
939 | +** <ol> | |
940 | +** <li> Create the object using [sqlite3_prepare_v2()] or a related | |
941 | +** function. | |
942 | +** <li> Bind values to host parameters using | |
943 | +** [sqlite3_bind_blob | sqlite3_bind_* interfaces]. | |
944 | +** <li> Run the SQL by calling [sqlite3_step()] one or more times. | |
945 | +** <li> Reset the statement using [sqlite3_reset()] then go back | |
946 | +** to step 2. Do this zero or more times. | |
947 | +** <li> Destroy the object using [sqlite3_finalize()]. | |
948 | +** </ol> | |
949 | +** | |
950 | +** Refer to documentation on individual methods above for additional | |
951 | +** information. | |
952 | +*/ | |
953 | +typedef struct sqlite3_stmt sqlite3_stmt; | |
954 | + | |
955 | +/* | |
956 | +** CAPI3REF: Compiling An SQL Statement | |
957 | +** | |
958 | +** To execute an SQL query, it must first be compiled into a byte-code | |
959 | +** program using one of these routines. | |
960 | +** | |
961 | +** The first argument "db" is an [sqlite3 | SQLite database handle] | |
962 | +** obtained from a prior call to [sqlite3_open()] or [sqlite3_open16()]. | |
963 | +** The second argument "zSql" is the statement to be compiled, encoded | |
964 | +** as either UTF-8 or UTF-16. The sqlite3_prepare() and sqlite3_prepare_v2() | |
965 | +** interfaces uses UTF-8 and sqlite3_prepare16() and sqlite3_prepare16_v2() | |
966 | +** use UTF-16. | |
967 | +** | |
968 | +** If the nByte argument is less | |
969 | +** than zero, then zSql is read up to the first zero terminator. If | |
970 | +** nByte is non-negative, then it is the maximum number of | |
971 | +** bytes read from zSql. When nByte is non-negative, the | |
972 | +** zSql string ends at either the first '\000' character or | |
973 | +** until the nByte-th byte, whichever comes first. | |
974 | +** | |
975 | +** *pzTail is made to point to the first byte past the end of the first | |
976 | +** SQL statement in zSql. This routine only compiles the first statement | |
977 | +** in zSql, so *pzTail is left pointing to what remains uncompiled. | |
978 | +** | |
979 | +** *ppStmt is left pointing to a compiled | |
980 | +** [sqlite3_stmt | SQL statement structure] that can be | |
981 | +** executed using [sqlite3_step()]. Or if there is an error, *ppStmt may be | |
982 | +** set to NULL. If the input text contained no SQL (if the input is and | |
983 | +** empty string or a comment) then *ppStmt is set to NULL. The calling | |
984 | +** procedure is responsible for deleting the compiled SQL statement | |
985 | +** using [sqlite3_finalize()] after it has finished with it. | |
986 | +** | |
987 | +** On success, [SQLITE_OK] is returned. Otherwise an | |
988 | +** [SQLITE_ERROR | error code] is returned. | |
989 | +** | |
990 | +** The sqlite3_prepare_v2() and sqlite3_prepare16_v2() interfaces are | |
991 | +** recommended for all new programs. The two older interfaces are retained | |
992 | +** for backwards compatibility, but their use is discouraged. | |
993 | +** In the "v2" interfaces, the prepared statement | |
994 | +** that is returned (the [sqlite3_stmt] object) contains a copy of the | |
995 | +** original SQL text. This causes the [sqlite3_step()] interface to | |
996 | +** behave a differently in two ways: | |
997 | +** | |
998 | +** <ol> | |
999 | +** <li> | |
1000 | +** If the database schema changes, instead of returning [SQLITE_SCHEMA] as it | |
1001 | +** always used to do, [sqlite3_step()] will automatically recompile the SQL | |
1002 | +** statement and try to run it again. If the schema has changed in a way | |
1003 | +** that makes the statement no longer valid, [sqlite3_step()] will still | |
1004 | +** return [SQLITE_SCHEMA]. But unlike the legacy behavior, [SQLITE_SCHEMA] is | |
1005 | +** now a fatal error. Calling [sqlite3_prepare_v2()] again will not make the | |
1006 | +** error go away. Note: use [sqlite3_errmsg()] to find the text of the parsing | |
1007 | +** error that results in an [SQLITE_SCHEMA] return. | |
1008 | +** </li> | |
1009 | +** | |
1010 | +** <li> | |
1011 | +** When an error occurs, | |
1012 | +** [sqlite3_step()] will return one of the detailed | |
1013 | +** [SQLITE_ERROR | result codes] or | |
1014 | +** [SQLITE_IOERR_READ | extended result codes] such as directly. | |
1015 | +** The legacy behavior was that [sqlite3_step()] would only return a generic | |
1016 | +** [SQLITE_ERROR] result code and you would have to make a second call to | |
1017 | +** [sqlite3_reset()] in order to find the underlying cause of the problem. | |
1018 | +** With the "v2" prepare interfaces, the underlying reason for the error is | |
1019 | +** returned immediately. | |
1020 | +** </li> | |
1021 | +** </ol> | |
1022 | +*/ | |
1023 | +int sqlite3_prepare( | |
1024 | + sqlite3 *db, /* Database handle */ | |
1025 | + const char *zSql, /* SQL statement, UTF-8 encoded */ | |
1026 | + int nByte, /* Maximum length of zSql in bytes. */ | |
1027 | + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ | |
1028 | + const char **pzTail /* OUT: Pointer to unused portion of zSql */ | |
1029 | +); | |
1030 | +int sqlite3_prepare_v2( | |
1031 | + sqlite3 *db, /* Database handle */ | |
1032 | + const char *zSql, /* SQL statement, UTF-8 encoded */ | |
1033 | + int nByte, /* Maximum length of zSql in bytes. */ | |
1034 | + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ | |
1035 | + const char **pzTail /* OUT: Pointer to unused portion of zSql */ | |
1036 | +); | |
1037 | +int sqlite3_prepare16( | |
1038 | + sqlite3 *db, /* Database handle */ | |
1039 | + const void *zSql, /* SQL statement, UTF-16 encoded */ | |
1040 | + int nByte, /* Maximum length of zSql in bytes. */ | |
1041 | + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ | |
1042 | + const void **pzTail /* OUT: Pointer to unused portion of zSql */ | |
1043 | +); | |
1044 | +int sqlite3_prepare16_v2( | |
1045 | + sqlite3 *db, /* Database handle */ | |
1046 | + const void *zSql, /* SQL statement, UTF-16 encoded */ | |
1047 | + int nByte, /* Maximum length of zSql in bytes. */ | |
1048 | + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ | |
1049 | + const void **pzTail /* OUT: Pointer to unused portion of zSql */ | |
1050 | +); | |
1051 | + | |
1052 | +/* | |
1053 | +** CAPI3REF: Dynamically Typed Value Object | |
1054 | +** | |
1055 | +** SQLite uses dynamic typing for the values it stores. Values can | |
1056 | +** be integers, floating point values, strings, BLOBs, or NULL. When | |
1057 | +** passing around values internally, each value is represented as | |
1058 | +** an instance of the sqlite3_value object. | |
1059 | +*/ | |
1060 | +typedef struct Mem sqlite3_value; | |
1061 | + | |
1062 | +/* | |
1063 | +** CAPI3REF: SQL Function Context Object | |
1064 | +** | |
1065 | +** The context in which an SQL function executes is stored in an | |
1066 | +** sqlite3_context object. A pointer to such an object is the | |
1067 | +** first parameter to user-defined SQL functions. | |
1068 | +*/ | |
1069 | +typedef struct sqlite3_context sqlite3_context; | |
1070 | + | |
1071 | +/* | |
1072 | +** CAPI3REF: Binding Values To Prepared Statements | |
1073 | +** | |
1074 | +** In the SQL strings input to [sqlite3_prepare_v2()] and its variants, | |
1075 | +** one or more literals can be replace by a parameter in one of these | |
1076 | +** forms: | |
1077 | +** | |
1078 | +** <ul> | |
1079 | +** <li> ? | |
1080 | +** <li> ?NNN | |
1081 | +** <li> :AAA | |
1082 | +** <li> @AAA | |
1083 | +** <li> $VVV | |
1084 | +** </ul> | |
1085 | +** | |
1086 | +** In the parameter forms shown above NNN is an integer literal, | |
1087 | +** AAA is an alphanumeric identifier and VVV is a variable name according | |
1088 | +** to the syntax rules of the TCL programming language. | |
1089 | +** The values of these parameters (also called "host parameter names") | |
1090 | +** can be set using the sqlite3_bind_*() routines defined here. | |
1091 | +** | |
1092 | +** The first argument to the sqlite3_bind_*() routines always is a pointer | |
1093 | +** to the [sqlite3_stmt] object returned from [sqlite3_prepare_v2()] or | |
1094 | +** its variants. The second | |
1095 | +** argument is the index of the parameter to be set. The first parameter has | |
1096 | +** an index of 1. When the same named parameter is used more than once, second | |
1097 | +** and subsequent | |
1098 | +** occurrences have the same index as the first occurrence. The index for | |
1099 | +** named parameters can be looked up using the | |
1100 | +** [sqlite3_bind_parameter_name()] API if desired. The index for "?NNN" | |
1101 | +** parametes is the value of NNN. | |
1102 | +** The NNN value must be between 1 and the compile-time | |
1103 | +** parameter SQLITE_MAX_VARIABLE_NUMBER (default value: 999). | |
1104 | +** See <a href="limits.html">limits.html</a> for additional information. | |
1105 | +** | |
1106 | +** The third argument is the value to bind to the parameter. | |
1107 | +** | |
1108 | +** In those | |
1109 | +** routines that have a fourth argument, its value is the number of bytes | |
1110 | +** in the parameter. To be clear: the value is the number of bytes in the | |
1111 | +** string, not the number of characters. The number | |
1112 | +** of bytes does not include the zero-terminator at the end of strings. | |
1113 | +** If the fourth parameter is negative, the length of the string is | |
1114 | +** number of bytes up to the first zero terminator. | |
1115 | +** | |
1116 | +** The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and | |
1117 | +** sqlite3_bind_text16() is a destructor used to dispose of the BLOB or | |
1118 | +** text after SQLite has finished with it. If the fifth argument is the | |
1119 | +** special value [SQLITE_STATIC], then the library assumes that the information | |
1120 | +** is in static, unmanaged space and does not need to be freed. If the | |
1121 | +** fifth argument has the value [SQLITE_TRANSIENT], then SQLite makes its | |
1122 | +** own private copy of the data immediately, before the sqlite3_bind_*() | |
1123 | +** routine returns. | |
1124 | +** | |
1125 | +** The sqlite3_bind_zeroblob() routine binds a BLOB of length n that | |
1126 | +** is filled with zeros. A zeroblob uses a fixed amount of memory | |
1127 | +** (just an integer to hold it size) while it is being processed. | |
1128 | +** Zeroblobs are intended to serve as place-holders for BLOBs whose | |
1129 | +** content is later written using | |
1130 | +** [sqlite3_blob_open | increment BLOB I/O] routines. | |
1131 | +** | |
1132 | +** The sqlite3_bind_*() routines must be called after | |
1133 | +** [sqlite3_prepare_v2()] (and its variants) or [sqlite3_reset()] and | |
1134 | +** before [sqlite3_step()]. | |
1135 | +** Bindings are not cleared by the [sqlite3_reset()] routine. | |
1136 | +** Unbound parameters are interpreted as NULL. | |
1137 | +** | |
1138 | +** These routines return [SQLITE_OK] on success or an error code if | |
1139 | +** anything goes wrong. [SQLITE_RANGE] is returned if the parameter | |
1140 | +** index is out of range. [SQLITE_NOMEM] is returned if malloc fails. | |
1141 | +** [SQLITE_MISUSE] is returned if these routines are called on a virtual | |
1142 | +** machine that is the wrong state or which has already been finalized. | |
1143 | +*/ | |
1144 | +int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*)); | |
1145 | +int sqlite3_bind_double(sqlite3_stmt*, int, double); | |
1146 | +int sqlite3_bind_int(sqlite3_stmt*, int, int); | |
1147 | +int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite_int64); | |
1148 | +int sqlite3_bind_null(sqlite3_stmt*, int); | |
1149 | +int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*)); | |
1150 | +int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*)); | |
1151 | +int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); | |
1152 | +int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); | |
1153 | + | |
1154 | +/* | |
1155 | +** CAPI3REF: Number Of Host Parameters | |
1156 | +** | |
1157 | +** Return the largest host parameter index in the precompiled statement given | |
1158 | +** as the argument. When the host parameters are of the forms like ":AAA" | |
1159 | +** or "?", then they are assigned sequential increasing numbers beginning | |
1160 | +** with one, so the value returned is the number of parameters. However | |
1161 | +** if the same host parameter name is used multiple times, each occurrance | |
1162 | +** is given the same number, so the value returned in that case is the number | |
1163 | +** of unique host parameter names. If host parameters of the form "?NNN" | |
1164 | +** are used (where NNN is an integer) then there might be gaps in the | |
1165 | +** numbering and the value returned by this interface is the index of the | |
1166 | +** host parameter with the largest index value. | |
1167 | +*/ | |
1168 | +int sqlite3_bind_parameter_count(sqlite3_stmt*); | |
1169 | + | |
1170 | +/* | |
1171 | +** CAPI3REF: Name Of A Host Parameter | |
1172 | +** | |
1173 | +** This routine returns a pointer to the name of the n-th parameter in a | |
1174 | +** [sqlite3_stmt | prepared statement]. | |
1175 | +** Host parameters of the form ":AAA" or "@AAA" or "$VVV" have a name | |
1176 | +** which is the string ":AAA" or "@AAA" or "$VVV". | |
1177 | +** In other words, the initial ":" or "$" or "@" | |
1178 | +** is included as part of the name. | |
1179 | +** Parameters of the form "?" or "?NNN" have no name. | |
1180 | +** | |
1181 | +** The first bound parameter has an index of 1, not 0. | |
1182 | +** | |
1183 | +** If the value n is out of range or if the n-th parameter is nameless, | |
1184 | +** then NULL is returned. The returned string is always in the | |
1185 | +** UTF-8 encoding even if the named parameter was originally specified | |
1186 | +** as UTF-16 in [sqlite3_prepare16()] or [sqlite3_prepare16_v2()]. | |
1187 | +*/ | |
1188 | +const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); | |
1189 | + | |
1190 | +/* | |
1191 | +** CAPI3REF: Index Of A Parameter With A Given Name | |
1192 | +** | |
1193 | +** This routine returns the index of a host parameter with the given name. | |
1194 | +** The name must match exactly. If no parameter with the given name is | |
1195 | +** found, return 0. Parameter names must be UTF8. | |
1196 | +*/ | |
1197 | +int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); | |
1198 | + | |
1199 | +/* | |
1200 | +** CAPI3REF: Reset All Bindings On A Prepared Statement | |
1201 | +** | |
1202 | +** Contrary to the intuition of many, [sqlite3_reset()] does not | |
1203 | +** reset the [sqlite3_bind_blob | bindings] on a | |
1204 | +** [sqlite3_stmt | prepared statement]. Use this routine to | |
1205 | +** reset all host parameters to NULL. | |
1206 | +*/ | |
1207 | +int sqlite3_clear_bindings(sqlite3_stmt*); | |
1208 | + | |
1209 | +/* | |
1210 | +** CAPI3REF: Number Of Columns In A Result Set | |
1211 | +** | |
1212 | +** Return the number of columns in the result set returned by the | |
1213 | +** [sqlite3_stmt | compiled SQL statement]. This routine returns 0 | |
1214 | +** if pStmt is an SQL statement that does not return data (for | |
1215 | +** example an UPDATE). | |
1216 | +*/ | |
1217 | +int sqlite3_column_count(sqlite3_stmt *pStmt); | |
1218 | + | |
1219 | +/* | |
1220 | +** CAPI3REF: Column Names In A Result Set | |
1221 | +** | |
1222 | +** These routines return the name assigned to a particular column | |
1223 | +** in the result set of a SELECT statement. The sqlite3_column_name() | |
1224 | +** interface returns a pointer to a UTF8 string and sqlite3_column_name16() | |
1225 | +** returns a pointer to a UTF16 string. The first parameter is the | |
1226 | +** [sqlite_stmt | prepared statement] that implements the SELECT statement. | |
1227 | +** The second parameter is the column number. The left-most column is | |
1228 | +** number 0. | |
1229 | +** | |
1230 | +** The returned string pointer is valid until either the | |
1231 | +** [sqlite_stmt | prepared statement] is destroyed by [sqlite3_finalize()] | |
1232 | +** or until the next call sqlite3_column_name() or sqlite3_column_name16() | |
1233 | +** on the same column. | |
1234 | +*/ | |
1235 | +const char *sqlite3_column_name(sqlite3_stmt*, int N); | |
1236 | +const void *sqlite3_column_name16(sqlite3_stmt*, int N); | |
1237 | + | |
1238 | +/* | |
1239 | +** CAPI3REF: Source Of Data In A Query Result | |
1240 | +** | |
1241 | +** These routines provide a means to determine what column of what | |
1242 | +** table in which database a result of a SELECT statement comes from. | |
1243 | +** The name of the database or table or column can be returned as | |
1244 | +** either a UTF8 or UTF16 string. The _database_ routines return | |
1245 | +** the database name, the _table_ routines return the table name, and | |
1246 | +** the origin_ routines return the column name. | |
1247 | +** The returned string is valid until | |
1248 | +** the [sqlite3_stmt | prepared statement] is destroyed using | |
1249 | +** [sqlite3_finalize()] or until the same information is requested | |
1250 | +** again in a different encoding. | |
1251 | +** | |
1252 | +** The names returned are the original un-aliased names of the | |
1253 | +** database, table, and column. | |
1254 | +** | |
1255 | +** The first argument to the following calls is a | |
1256 | +** [sqlite3_stmt | compiled SQL statement]. | |
1257 | +** These functions return information about the Nth column returned by | |
1258 | +** the statement, where N is the second function argument. | |
1259 | +** | |
1260 | +** If the Nth column returned by the statement is an expression | |
1261 | +** or subquery and is not a column value, then all of these functions | |
1262 | +** return NULL. Otherwise, they return the | |
1263 | +** name of the attached database, table and column that query result | |
1264 | +** column was extracted from. | |
1265 | +** | |
1266 | +** As with all other SQLite APIs, those postfixed with "16" return UTF-16 | |
1267 | +** encoded strings, the other functions return UTF-8. | |
1268 | +** | |
1269 | +** These APIs are only available if the library was compiled with the | |
1270 | +** SQLITE_ENABLE_COLUMN_METADATA preprocessor symbol defined. | |
1271 | +*/ | |
1272 | +const char *sqlite3_column_database_name(sqlite3_stmt*,int); | |
1273 | +const void *sqlite3_column_database_name16(sqlite3_stmt*,int); | |
1274 | +const char *sqlite3_column_table_name(sqlite3_stmt*,int); | |
1275 | +const void *sqlite3_column_table_name16(sqlite3_stmt*,int); | |
1276 | +const char *sqlite3_column_origin_name(sqlite3_stmt*,int); | |
1277 | +const void *sqlite3_column_origin_name16(sqlite3_stmt*,int); | |
1278 | + | |
1279 | +/* | |
1280 | +** CAPI3REF: Declared Datatype Of A Query Result | |
1281 | +** | |
1282 | +** The first parameter is a [sqlite3_stmt | compiled SQL statement]. | |
1283 | +** If this statement is a SELECT statement and the Nth column of the | |
1284 | +** returned result set of that SELECT is a table column (not an | |
1285 | +** expression or subquery) then the declared type of the table | |
1286 | +** column is returned. If the Nth column of the result set is an | |
1287 | +** expression or subquery, then a NULL pointer is returned. | |
1288 | +** The returned string is always UTF-8 encoded. For example, in | |
1289 | +** the database schema: | |
1290 | +** | |
1291 | +** CREATE TABLE t1(c1 VARIANT); | |
1292 | +** | |
1293 | +** And the following statement compiled: | |
1294 | +** | |
1295 | +** SELECT c1 + 1, c1 FROM t1; | |
1296 | +** | |
1297 | +** Then this routine would return the string "VARIANT" for the second | |
1298 | +** result column (i==1), and a NULL pointer for the first result column | |
1299 | +** (i==0). | |
1300 | +** | |
1301 | +** SQLite uses dynamic run-time typing. So just because a column | |
1302 | +** is declared to contain a particular type does not mean that the | |
1303 | +** data stored in that column is of the declared type. SQLite is | |
1304 | +** strongly typed, but the typing is dynamic not static. Type | |
1305 | +** is associated with individual values, not with the containers | |
1306 | +** used to hold those values. | |
1307 | +*/ | |
1308 | +const char *sqlite3_column_decltype(sqlite3_stmt *, int i); | |
1309 | +const void *sqlite3_column_decltype16(sqlite3_stmt*,int); | |
1310 | + | |
1311 | +/* | |
1312 | +** CAPI3REF: Evaluate An SQL Statement | |
1313 | +** | |
1314 | +** After an [sqlite3_stmt | SQL statement] has been prepared with a call | |
1315 | +** to either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] or to one of | |
1316 | +** the legacy interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], | |
1317 | +** then this function must be called one or more times to evaluate the | |
1318 | +** statement. | |
1319 | +** | |
1320 | +** The details of the behavior of this sqlite3_step() interface depend | |
1321 | +** on whether the statement was prepared using the newer "v2" interface | |
1322 | +** [sqlite3_prepare_v2()] and [sqlite3_prepare16_v2()] or the older legacy | |
1323 | +** interface [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the | |
1324 | +** new "v2" interface is recommended for new applications but the legacy | |
1325 | +** interface will continue to be supported. | |
1326 | +** | |
1327 | +** In the lagacy interface, the return value will be either [SQLITE_BUSY], | |
1328 | +** [SQLITE_DONE], [SQLITE_ROW], [SQLITE_ERROR], or [SQLITE_MISUSE]. | |
1329 | +** With the "v2" interface, any of the other [SQLITE_OK | result code] | |
1330 | +** or [SQLITE_IOERR_READ | extended result code] might be returned as | |
1331 | +** well. | |
1332 | +** | |
1333 | +** [SQLITE_BUSY] means that the database engine was unable to acquire the | |
1334 | +** database locks it needs to do its job. If the statement is a COMMIT | |
1335 | +** or occurs outside of an explicit transaction, then you can retry the | |
1336 | +** statement. If the statement is not a COMMIT and occurs within a | |
1337 | +** explicit transaction then you should rollback the transaction before | |
1338 | +** continuing. | |
1339 | +** | |
1340 | +** [SQLITE_DONE] means that the statement has finished executing | |
1341 | +** successfully. sqlite3_step() should not be called again on this virtual | |
1342 | +** machine without first calling [sqlite3_reset()] to reset the virtual | |
1343 | +** machine back to its initial state. | |
1344 | +** | |
1345 | +** If the SQL statement being executed returns any data, then | |
1346 | +** [SQLITE_ROW] is returned each time a new row of data is ready | |
1347 | +** for processing by the caller. The values may be accessed using | |
1348 | +** the [sqlite3_column_int | column access functions]. | |
1349 | +** sqlite3_step() is called again to retrieve the next row of data. | |
1350 | +** | |
1351 | +** [SQLITE_ERROR] means that a run-time error (such as a constraint | |
1352 | +** violation) has occurred. sqlite3_step() should not be called again on | |
1353 | +** the VM. More information may be found by calling [sqlite3_errmsg()]. | |
1354 | +** With the legacy interface, a more specific error code (example: | |
1355 | +** [SQLITE_INTERRUPT], [SQLITE_SCHEMA], [SQLITE_CORRUPT], and so forth) | |
1356 | +** can be obtained by calling [sqlite3_reset()] on the | |
1357 | +** [sqlite_stmt | prepared statement]. In the "v2" interface, | |
1358 | +** the more specific error code is returned directly by sqlite3_step(). | |
1359 | +** | |
1360 | +** [SQLITE_MISUSE] means that the this routine was called inappropriately. | |
1361 | +** Perhaps it was called on a [sqlite_stmt | prepared statement] that has | |
1362 | +** already been [sqlite3_finalize | finalized] or on one that had | |
1363 | +** previously returned [SQLITE_ERROR] or [SQLITE_DONE]. Or it could | |
1364 | +** be the case that the same database connection is being used by two or | |
1365 | +** more threads at the same moment in time. | |
1366 | +** | |
1367 | +** <b>Goofy Interface Alert:</b> | |
1368 | +** In the legacy interface, | |
1369 | +** the sqlite3_step() API always returns a generic error code, | |
1370 | +** [SQLITE_ERROR], following any error other than [SQLITE_BUSY] | |
1371 | +** and [SQLITE_MISUSE]. You must call [sqlite3_reset()] or | |
1372 | +** [sqlite3_finalize()] in order to find one of the specific | |
1373 | +** [SQLITE_ERROR | result codes] that better describes the error. | |
1374 | +** We admit that this is a goofy design. The problem has been fixed | |
1375 | +** with the "v2" interface. If you prepare all of your SQL statements | |
1376 | +** using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] instead | |
1377 | +** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()], then the | |
1378 | +** more specific [SQLITE_ERROR | result codes] are returned directly | |
1379 | +** by sqlite3_step(). The use of the "v2" interface is recommended. | |
1380 | +*/ | |
1381 | +int sqlite3_step(sqlite3_stmt*); | |
1382 | + | |
1383 | +/* | |
1384 | +** CAPI3REF: | |
1385 | +** | |
1386 | +** Return the number of values in the current row of the result set. | |
1387 | +** | |
1388 | +** After a call to [sqlite3_step()] that returns [SQLITE_ROW], this routine | |
1389 | +** will return the same value as the [sqlite3_column_count()] function. | |
1390 | +** After [sqlite3_step()] has returned an [SQLITE_DONE], [SQLITE_BUSY], or | |
1391 | +** a [SQLITE_ERROR | error code], or before [sqlite3_step()] has been | |
1392 | +** called on the [sqlite_stmt | prepared statement] for the first time, | |
1393 | +** this routine returns zero. | |
1394 | +*/ | |
1395 | +int sqlite3_data_count(sqlite3_stmt *pStmt); | |
1396 | + | |
1397 | +/* | |
1398 | +** CAPI3REF: Fundamental Datatypes | |
1399 | +** | |
1400 | +** Every value in SQLite has one of five fundamental datatypes: | |
1401 | +** | |
1402 | +** <ul> | |
1403 | +** <li> 64-bit signed integer | |
1404 | +** <li> 64-bit IEEE floating point number | |
1405 | +** <li> string | |
1406 | +** <li> BLOB | |
1407 | +** <li> NULL | |
1408 | +** </ul> | |
1409 | +** | |
1410 | +** These constants are codes for each of those types. | |
1411 | +** | |
1412 | +** Note that the SQLITE_TEXT constant was also used in SQLite version 2 | |
1413 | +** for a completely different meaning. Software that links against both | |
1414 | +** SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT not | |
1415 | +** SQLITE_TEXT. | |
1416 | +*/ | |
1417 | +#define SQLITE_INTEGER 1 | |
1418 | +#define SQLITE_FLOAT 2 | |
1419 | +#define SQLITE_BLOB 4 | |
1420 | +#define SQLITE_NULL 5 | |
1421 | +#ifdef SQLITE_TEXT | |
1422 | +# undef SQLITE_TEXT | |
1423 | +#else | |
1424 | +# define SQLITE_TEXT 3 | |
1425 | +#endif | |
1426 | +#define SQLITE3_TEXT 3 | |
1427 | + | |
1428 | +/* | |
1429 | +** CAPI3REF: Results Values From A Query | |
1430 | +** | |
1431 | +** These routines return information about the information | |
1432 | +** in a single column of the current result row of a query. In every | |
1433 | +** case the first argument is a pointer to the | |
1434 | +** [sqlite3_stmt | SQL statement] that is being | |
1435 | +** evaluate (the [sqlite_stmt*] that was returned from | |
1436 | +** [sqlite3_prepare_v2()] or one of its variants) and | |
1437 | +** the second argument is the index of the column for which information | |
1438 | +** should be returned. The left-most column has an index of 0. | |
1439 | +** | |
1440 | +** If the SQL statement is not currently point to a valid row, or if the | |
1441 | +** the column index is out of range, the result is undefined. | |
1442 | +** | |
1443 | +** The sqlite3_column_type() routine returns | |
1444 | +** [SQLITE_INTEGER | datatype code] for the initial data type | |
1445 | +** of the result column. The returned value is one of [SQLITE_INTEGER], | |
1446 | +** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. The value | |
1447 | +** returned by sqlite3_column_type() is only meaningful if no type | |
1448 | +** conversions have occurred as described below. After a type conversion, | |
1449 | +** the value returned by sqlite3_column_type() is undefined. Future | |
1450 | +** versions of SQLite may change the behavior of sqlite3_column_type() | |
1451 | +** following a type conversion. | |
1452 | +** | |
1453 | +** If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes() | |
1454 | +** routine returns the number of bytes in that BLOB or string. | |
1455 | +** If the result is a UTF-16 string, then sqlite3_column_bytes() converts | |
1456 | +** the string to UTF-8 and then returns the number of bytes. | |
1457 | +** If the result is a numeric value then sqlite3_column_bytes() uses | |
1458 | +** [sqlite3_snprintf()] to convert that value to a UTF-8 string and returns | |
1459 | +** the number of bytes in that string. | |
1460 | +** The value returned does not include the zero terminator at the end | |
1461 | +** of the string. For clarity: the value returned is the number of | |
1462 | +** bytes in the string, not the number of characters. | |
1463 | +** | |
1464 | +** The sqlite3_column_bytes16() routine is similar to sqlite3_column_bytes() | |
1465 | +** but leaves the result in UTF-16 instead of UTF-8. | |
1466 | +** The zero terminator is not included in this count. | |
1467 | +** | |
1468 | +** These routines attempt to convert the value where appropriate. For | |
1469 | +** example, if the internal representation is FLOAT and a text result | |
1470 | +** is requested, [sqlite3_snprintf()] is used internally to do the conversion | |
1471 | +** automatically. The following table details the conversions that | |
1472 | +** are applied: | |
1473 | +** | |
1474 | +** <blockquote> | |
1475 | +** <table border="1"> | |
1476 | +** <tr><th> Internal <th> Requested <th> | |
1477 | +** <tr><th> Type <th> Type <th> Conversion | |
1478 | +** | |
1479 | +** <tr><td> NULL <td> INTEGER <td> Result is 0 | |
1480 | +** <tr><td> NULL <td> FLOAT <td> Result is 0.0 | |
1481 | +** <tr><td> NULL <td> TEXT <td> Result is NULL pointer | |
1482 | +** <tr><td> NULL <td> BLOB <td> Result is NULL pointer | |
1483 | +** <tr><td> INTEGER <td> FLOAT <td> Convert from integer to float | |
1484 | +** <tr><td> INTEGER <td> TEXT <td> ASCII rendering of the integer | |
1485 | +** <tr><td> INTEGER <td> BLOB <td> Same as for INTEGER->TEXT | |
1486 | +** <tr><td> FLOAT <td> INTEGER <td> Convert from float to integer | |
1487 | +** <tr><td> FLOAT <td> TEXT <td> ASCII rendering of the float | |
1488 | +** <tr><td> FLOAT <td> BLOB <td> Same as FLOAT->TEXT | |
1489 | +** <tr><td> TEXT <td> INTEGER <td> Use atoi() | |
1490 | +** <tr><td> TEXT <td> FLOAT <td> Use atof() | |
1491 | +** <tr><td> TEXT <td> BLOB <td> No change | |
1492 | +** <tr><td> BLOB <td> INTEGER <td> Convert to TEXT then use atoi() | |
1493 | +** <tr><td> BLOB <td> FLOAT <td> Convert to TEXT then use atof() | |
1494 | +** <tr><td> BLOB <td> TEXT <td> Add a zero terminator if needed | |
1495 | +** </table> | |
1496 | +** </blockquote> | |
1497 | +** | |
1498 | +** The table above makes reference to standard C library functions atoi() | |
1499 | +** and atof(). SQLite does not really use these functions. It has its | |
1500 | +** on equavalent internal routines. The atoi() and atof() names are | |
1501 | +** used in the table for brevity and because they are familiar to most | |
1502 | +** C programmers. | |
1503 | +** | |
1504 | +** Note that when type conversions occur, pointers returned by prior | |
1505 | +** calls to sqlite3_column_blob(), sqlite3_column_text(), and/or | |
1506 | +** sqlite3_column_text16() may be invalidated. | |
1507 | +** Type conversions and pointer invalidations might occur | |
1508 | +** in the following cases: | |
1509 | +** | |
1510 | +** <ul> | |
1511 | +** <li><p> The initial content is a BLOB and sqlite3_column_text() | |
1512 | +** or sqlite3_column_text16() is called. A zero-terminator might | |
1513 | +** need to be added to the string.</p></li> | |
1514 | +** | |
1515 | +** <li><p> The initial content is UTF-8 text and sqlite3_column_bytes16() or | |
1516 | +** sqlite3_column_text16() is called. The content must be converted | |
1517 | +** to UTF-16.</p></li> | |
1518 | +** | |
1519 | +** <li><p> The initial content is UTF-16 text and sqlite3_column_bytes() or | |
1520 | +** sqlite3_column_text() is called. The content must be converted | |
1521 | +** to UTF-8.</p></li> | |
1522 | +** </ul> | |
1523 | +** | |
1524 | +** Conversions between UTF-16be and UTF-16le are always done in place and do | |
1525 | +** not invalidate a prior pointer, though of course the content of the buffer | |
1526 | +** that the prior pointer points to will have been modified. Other kinds | |
1527 | +** of conversion are done in place when it is possible, but sometime it is | |
1528 | +** not possible and in those cases prior pointers are invalidated. | |
1529 | +** | |
1530 | +** The safest and easiest to remember policy is to invoke these routines | |
1531 | +** in one of the following ways: | |
1532 | +** | |
1533 | +** <ul> | |
1534 | +** <li>sqlite3_column_text() followed by sqlite3_column_bytes()</li> | |
1535 | +** <li>sqlite3_column_blob() followed by sqlite3_column_bytes()</li> | |
1536 | +** <li>sqlite3_column_text16() followed by sqlite3_column_bytes16()</li> | |
1537 | +** </ul> | |
1538 | +** | |
1539 | +** In other words, you should call sqlite3_column_text(), sqlite3_column_blob(), | |
1540 | +** or sqlite3_column_text16() first to force the result into the desired | |
1541 | +** format, then invoke sqlite3_column_bytes() or sqlite3_column_bytes16() to | |
1542 | +** find the size of the result. Do not mix call to sqlite3_column_text() or | |
1543 | +** sqlite3_column_blob() with calls to sqlite3_column_bytes16(). And do not | |
1544 | +** mix calls to sqlite3_column_text16() with calls to sqlite3_column_bytes(). | |
1545 | +*/ | |
1546 | +const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); | |
1547 | +int sqlite3_column_bytes(sqlite3_stmt*, int iCol); | |
1548 | +int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); | |
1549 | +double sqlite3_column_double(sqlite3_stmt*, int iCol); | |
1550 | +int sqlite3_column_int(sqlite3_stmt*, int iCol); | |
1551 | +sqlite_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); | |
1552 | +const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); | |
1553 | +const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); | |
1554 | +int sqlite3_column_type(sqlite3_stmt*, int iCol); | |
1555 | +sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol); | |
1556 | + | |
1557 | +/* | |
1558 | +** CAPI3REF: Destroy A Prepared Statement Object | |
1559 | +** | |
1560 | +** The sqlite3_finalize() function is called to delete a | |
1561 | +** [sqlite3_stmt | compiled SQL statement]. If the statement was | |
1562 | +** executed successfully, or not executed at all, then SQLITE_OK is returned. | |
1563 | +** If execution of the statement failed then an | |
1564 | +** [SQLITE_ERROR | error code] or [SQLITE_IOERR_READ | extended error code] | |
1565 | +** is returned. | |
1566 | +** | |
1567 | +** This routine can be called at any point during the execution of the | |
1568 | +** [sqlite3_stmt | virtual machine]. If the virtual machine has not | |
1569 | +** completed execution when this routine is called, that is like | |
1570 | +** encountering an error or an interrupt. (See [sqlite3_interrupt()].) | |
1571 | +** Incomplete updates may be rolled back and transactions cancelled, | |
1572 | +** depending on the circumstances, and the | |
1573 | +** [SQLITE_ERROR | result code] returned will be [SQLITE_ABORT]. | |
1574 | +*/ | |
1575 | +int sqlite3_finalize(sqlite3_stmt *pStmt); | |
1576 | + | |
1577 | +/* | |
1578 | +** CAPI3REF: Reset A Prepared Statement Object | |
1579 | +** | |
1580 | +** The sqlite3_reset() function is called to reset a | |
1581 | +** [sqlite_stmt | compiled SQL statement] object. | |
1582 | +** back to it's initial state, ready to be re-executed. | |
1583 | +** Any SQL statement variables that had values bound to them using | |
1584 | +** the [sqlite3_bind_blob | sqlite3_bind_*() API] retain their values. | |
1585 | +** Use [sqlite3_clear_bindings()] to reset the bindings. | |
1586 | +*/ | |
1587 | +int sqlite3_reset(sqlite3_stmt *pStmt); | |
1588 | + | |
1589 | +/* | |
1590 | +** CAPI3REF: Create Or Redefine SQL Functions | |
1591 | +** | |
1592 | +** The following two functions are used to add SQL functions or aggregates | |
1593 | +** or to redefine the behavior of existing SQL functions or aggregates. The | |
1594 | +** difference only between the two is that the second parameter, the | |
1595 | +** name of the (scalar) function or aggregate, is encoded in UTF-8 for | |
1596 | +** sqlite3_create_function() and UTF-16 for sqlite3_create_function16(). | |
1597 | +** | |
1598 | +** The first argument is the [sqlite3 | database handle] that holds the | |
1599 | +** SQL function or aggregate is to be added or redefined. If a single | |
1600 | +** program uses more than one database handle internally, then SQL | |
1601 | +** functions or aggregates must be added individually to each database | |
1602 | +** handle with which they will be used. | |
1603 | +** | |
1604 | +** The second parameter is the name of the SQL function to be created | |
1605 | +** or redefined. | |
1606 | +** The length of the name is limited to 255 bytes, exclusive of the | |
1607 | +** zero-terminator. Note that the name length limit is in bytes, not | |
1608 | +** characters. Any attempt to create a function with a longer name | |
1609 | +** will result in an SQLITE_ERROR error. | |
1610 | +** | |
1611 | +** The third parameter is the number of arguments that the SQL function or | |
1612 | +** aggregate takes. If this parameter is negative, then the SQL function or | |
1613 | +** aggregate may take any number of arguments. | |
1614 | +** | |
1615 | +** The fourth parameter, eTextRep, specifies what | |
1616 | +** [SQLITE_UTF8 | text encoding] this SQL function prefers for | |
1617 | +** its parameters. Any SQL function implementation should be able to work | |
1618 | +** work with UTF-8, UTF-16le, or UTF-16be. But some implementations may be | |
1619 | +** more efficient with one encoding than another. It is allowed to | |
1620 | +** invoke sqlite_create_function() or sqlite3_create_function16() multiple | |
1621 | +** times with the same function but with different values of eTextRep. | |
1622 | +** When multiple implementations of the same function are available, SQLite | |
1623 | +** will pick the one that involves the least amount of data conversion. | |
1624 | +** If there is only a single implementation which does not care what | |
1625 | +** text encoding is used, then the fourth argument should be | |
1626 | +** [SQLITE_ANY]. | |
1627 | +** | |
1628 | +** The fifth parameter is an arbitrary pointer. The implementation | |
1629 | +** of the function can gain access to this pointer using | |
1630 | +** [sqlite_user_data()]. | |
1631 | +** | |
1632 | +** The seventh, eighth and ninth parameters, xFunc, xStep and xFinal, are | |
1633 | +** pointers to C-language functions that implement the SQL | |
1634 | +** function or aggregate. A scalar SQL function requires an implementation of | |
1635 | +** the xFunc callback only, NULL pointers should be passed as the xStep | |
1636 | +** and xFinal parameters. An aggregate SQL function requires an implementation | |
1637 | +** of xStep and xFinal and NULL should be passed for xFunc. To delete an | |
1638 | +** existing SQL function or aggregate, pass NULL for all three function | |
1639 | +** callback. | |
1640 | +** | |
1641 | +** It is permitted to register multiple implementations of the same | |
1642 | +** functions with the same name but with either differing numbers of | |
1643 | +** arguments or differing perferred text encodings. SQLite will use | |
1644 | +** the implementation most closely matches the way in which the | |
1645 | +** SQL function is used. | |
1646 | +*/ | |
1647 | +int sqlite3_create_function( | |
1648 | + sqlite3 *, | |
1649 | + const char *zFunctionName, | |
1650 | + int nArg, | |
1651 | + int eTextRep, | |
1652 | + void*, | |
1653 | + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), | |
1654 | + void (*xStep)(sqlite3_context*,int,sqlite3_value**), | |
1655 | + void (*xFinal)(sqlite3_context*) | |
1656 | +); | |
1657 | +int sqlite3_create_function16( | |
1658 | + sqlite3*, | |
1659 | + const void *zFunctionName, | |
1660 | + int nArg, | |
1661 | + int eTextRep, | |
1662 | + void*, | |
1663 | + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), | |
1664 | + void (*xStep)(sqlite3_context*,int,sqlite3_value**), | |
1665 | + void (*xFinal)(sqlite3_context*) | |
1666 | +); | |
1667 | + | |
1668 | +/* | |
1669 | +** CAPI3REF: Text Encodings | |
1670 | +** | |
1671 | +** These constant define integer codes that represent the various | |
1672 | +** text encodings supported by SQLite. | |
1673 | +*/ | |
1674 | +#define SQLITE_UTF8 1 | |
1675 | +#define SQLITE_UTF16LE 2 | |
1676 | +#define SQLITE_UTF16BE 3 | |
1677 | +#define SQLITE_UTF16 4 /* Use native byte order */ | |
1678 | +#define SQLITE_ANY 5 /* sqlite3_create_function only */ | |
1679 | +#define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */ | |
1680 | + | |
1681 | +/* | |
1682 | +** CAPI3REF: Obsolete Functions | |
1683 | +** | |
1684 | +** These functions are all now obsolete. In order to maintain | |
1685 | +** backwards compatibility with older code, we continue to support | |
1686 | +** these functions. However, new development projects should avoid | |
1687 | +** the use of these functions. To help encourage people to avoid | |
1688 | +** using these functions, we are not going to tell you want they do. | |
1689 | +*/ | |
1690 | +int sqlite3_aggregate_count(sqlite3_context*); | |
1691 | +int sqlite3_expired(sqlite3_stmt*); | |
1692 | +int sqlite3_transfer_bindings(sqlite3_stmt*, sqlite3_stmt*); | |
1693 | +int sqlite3_global_recover(void); | |
1694 | + | |
1695 | + | |
1696 | +/* | |
1697 | +** CAPI3REF: Obtaining SQL Function Parameter Values | |
1698 | +** | |
1699 | +** The C-language implementation of SQL functions and aggregates uses | |
1700 | +** this set of interface routines to access the parameter values on | |
1701 | +** the function or aggregate. | |
1702 | +** | |
1703 | +** The xFunc (for scalar functions) or xStep (for aggregates) parameters | |
1704 | +** to [sqlite3_create_function()] and [sqlite3_create_function16()] | |
1705 | +** define callbacks that implement the SQL functions and aggregates. | |
1706 | +** The 4th parameter to these callbacks is an array of pointers to | |
1707 | +** [sqlite3_value] objects. There is one [sqlite3_value] object for | |
1708 | +** each parameter to the SQL function. These routines are used to | |
1709 | +** extract values from the [sqlite3_value] objects. | |
1710 | +** | |
1711 | +** These routines work just like the corresponding | |
1712 | +** [sqlite3_column_blob | sqlite3_column_* routines] except that | |
1713 | +** these routines take a single [sqlite3_value*] pointer instead | |
1714 | +** of an [sqlite3_stmt*] pointer and an integer column number. | |
1715 | +** | |
1716 | +** The sqlite3_value_text16() interface extracts a UTF16 string | |
1717 | +** in the native byte-order of the host machine. The | |
1718 | +** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces | |
1719 | +** extract UTF16 strings as big-endian and little-endian respectively. | |
1720 | +** | |
1721 | +** The sqlite3_value_numeric_type() interface attempts to apply | |
1722 | +** numeric affinity to the value. This means that an attempt is | |
1723 | +** made to convert the value to an integer or floating point. If | |
1724 | +** such a conversion is possible without loss of information (in order | |
1725 | +** words if the value is original a string that looks like a number) | |
1726 | +** then it is done. Otherwise no conversion occurs. The | |
1727 | +** [SQLITE_INTEGER | datatype] after conversion is returned. | |
1728 | +** | |
1729 | +** Please pay particular attention to the fact that the pointer that | |
1730 | +** is returned from [sqlite3_value_blob()], [sqlite3_value_text()], or | |
1731 | +** [sqlite3_value_text16()] can be invalidated by a subsequent call to | |
1732 | +** [sqlite3_value_bytes()], [sqlite3_value_bytes16()], [sqlite_value_text()], | |
1733 | +** or [sqlite3_value_text16()]. | |
1734 | +*/ | |
1735 | +const void *sqlite3_value_blob(sqlite3_value*); | |
1736 | +int sqlite3_value_bytes(sqlite3_value*); | |
1737 | +int sqlite3_value_bytes16(sqlite3_value*); | |
1738 | +double sqlite3_value_double(sqlite3_value*); | |
1739 | +int sqlite3_value_int(sqlite3_value*); | |
1740 | +sqlite_int64 sqlite3_value_int64(sqlite3_value*); | |
1741 | +const unsigned char *sqlite3_value_text(sqlite3_value*); | |
1742 | +const void *sqlite3_value_text16(sqlite3_value*); | |
1743 | +const void *sqlite3_value_text16le(sqlite3_value*); | |
1744 | +const void *sqlite3_value_text16be(sqlite3_value*); | |
1745 | +int sqlite3_value_type(sqlite3_value*); | |
1746 | +int sqlite3_value_numeric_type(sqlite3_value*); | |
1747 | + | |
1748 | +/* | |
1749 | +** CAPI3REF: Obtain Aggregate Function Context | |
1750 | +** | |
1751 | +** The implementation of aggregate SQL functions use this routine to allocate | |
1752 | +** a structure for storing their state. The first time this routine | |
1753 | +** is called for a particular aggregate, a new structure of size nBytes | |
1754 | +** is allocated, zeroed, and returned. On subsequent calls (for the | |
1755 | +** same aggregate instance) the same buffer is returned. The implementation | |
1756 | +** of the aggregate can use the returned buffer to accumulate data. | |
1757 | +** | |
1758 | +** The buffer allocated is freed automatically by SQLite whan the aggregate | |
1759 | +** query concludes. | |
1760 | +** | |
1761 | +** The first parameter should be a copy of the | |
1762 | +** [sqlite3_context | SQL function context] that is the first | |
1763 | +** parameter to the callback routine that implements the aggregate | |
1764 | +** function. | |
1765 | +*/ | |
1766 | +void *sqlite3_aggregate_context(sqlite3_context*, int nBytes); | |
1767 | + | |
1768 | +/* | |
1769 | +** CAPI3REF: User Data For Functions | |
1770 | +** | |
1771 | +** The pUserData parameter to the [sqlite3_create_function()] | |
1772 | +** and [sqlite3_create_function16()] routines | |
1773 | +** used to register user functions is available to | |
1774 | +** the implementation of the function using this call. | |
1775 | +*/ | |
1776 | +void *sqlite3_user_data(sqlite3_context*); | |
1777 | + | |
1778 | +/* | |
1779 | +** CAPI3REF: Function Auxiliary Data | |
1780 | +** | |
1781 | +** The following two functions may be used by scalar SQL functions to | |
1782 | +** associate meta-data with argument values. If the same value is passed to | |
1783 | +** multiple invocations of the same SQL function during query execution, under | |
1784 | +** some circumstances the associated meta-data may be preserved. This may | |
1785 | +** be used, for example, to add a regular-expression matching scalar | |
1786 | +** function. The compiled version of the regular expression is stored as | |
1787 | +** meta-data associated with the SQL value passed as the regular expression | |
1788 | +** pattern. The compiled regular expression can be reused on multiple | |
1789 | +** invocations of the same function so that the original pattern string | |
1790 | +** does not need to be recompiled on each invocation. | |
1791 | +** | |
1792 | +** The sqlite3_get_auxdata() interface returns a pointer to the meta-data | |
1793 | +** associated with the Nth argument value to the current SQL function | |
1794 | +** call, where N is the second parameter. If no meta-data has been set for | |
1795 | +** that value, then a NULL pointer is returned. | |
1796 | +** | |
1797 | +** The sqlite3_set_auxdata() is used to associate meta-data with an SQL | |
1798 | +** function argument. The third parameter is a pointer to the meta-data | |
1799 | +** to be associated with the Nth user function argument value. The fourth | |
1800 | +** parameter specifies a destructor that will be called on the meta- | |
1801 | +** data pointer to release it when it is no longer required. If the | |
1802 | +** destructor is NULL, it is not invoked. | |
1803 | +** | |
1804 | +** In practice, meta-data is preserved between function calls for | |
1805 | +** expressions that are constant at compile time. This includes literal | |
1806 | +** values and SQL variables. | |
1807 | +*/ | |
1808 | +void *sqlite3_get_auxdata(sqlite3_context*, int); | |
1809 | +void sqlite3_set_auxdata(sqlite3_context*, int, void*, void (*)(void*)); | |
1810 | + | |
1811 | + | |
1812 | +/* | |
1813 | +** CAPI3REF: Constants Defining Special Destructor Behavior | |
1814 | +** | |
1815 | +** These are special value for the destructor that is passed in as the | |
1816 | +** final argument to routines like [sqlite3_result_blob()]. If the destructor | |
1817 | +** argument is SQLITE_STATIC, it means that the content pointer is constant | |
1818 | +** and will never change. It does not need to be destroyed. The | |
1819 | +** SQLITE_TRANSIENT value means that the content will likely change in | |
1820 | +** the near future and that SQLite should make its own private copy of | |
1821 | +** the content before returning. | |
1822 | +** | |
1823 | +** The typedef is necessary to work around problems in certain | |
1824 | +** C++ compilers. See ticket #2191. | |
1825 | +*/ | |
1826 | +typedef void (*sqlite3_destructor_type)(void*); | |
1827 | +#define SQLITE_STATIC ((sqlite3_destructor_type)0) | |
1828 | +#define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1) | |
1829 | + | |
1830 | +/* | |
1831 | +** CAPI3REF: Setting The Result Of An SQL Function | |
1832 | +** | |
1833 | +** These routines are used by the xFunc or xFinal callbacks that | |
1834 | +** implement SQL functions and aggregates. See | |
1835 | +** [sqlite3_create_function()] and [sqlite3_create_function16()] | |
1836 | +** for additional information. | |
1837 | +** | |
1838 | +** These functions work very much like the | |
1839 | +** [sqlite3_bind_blob | sqlite3_bind_*] family of functions used | |
1840 | +** to bind values to host parameters in prepared statements. | |
1841 | +** Refer to the | |
1842 | +** [sqlite3_bind_blob | sqlite3_bind_* documentation] for | |
1843 | +** additional information. | |
1844 | +** | |
1845 | +** The sqlite3_result_error() and sqlite3_result_error16() functions | |
1846 | +** cause the implemented SQL function to throw an exception. The | |
1847 | +** parameter to sqlite3_result_error() or sqlite3_result_error16() | |
1848 | +** is the text of an error message. | |
1849 | +** | |
1850 | +** The sqlite3_result_toobig() cause the function implementation | |
1851 | +** to throw and error indicating that a string or BLOB is to long | |
1852 | +** to represent. | |
1853 | +*/ | |
1854 | +void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*)); | |
1855 | +void sqlite3_result_double(sqlite3_context*, double); | |
1856 | +void sqlite3_result_error(sqlite3_context*, const char*, int); | |
1857 | +void sqlite3_result_error16(sqlite3_context*, const void*, int); | |
1858 | +void sqlite3_result_error_toobig(sqlite3_context*); | |
1859 | +void sqlite3_result_int(sqlite3_context*, int); | |
1860 | +void sqlite3_result_int64(sqlite3_context*, sqlite_int64); | |
1861 | +void sqlite3_result_null(sqlite3_context*); | |
1862 | +void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*)); | |
1863 | +void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*)); | |
1864 | +void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*)); | |
1865 | +void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*)); | |
1866 | +void sqlite3_result_value(sqlite3_context*, sqlite3_value*); | |
1867 | +void sqlite3_result_zeroblob(sqlite3_context*, int n); | |
1868 | + | |
1869 | +/* | |
1870 | +** CAPI3REF: Define New Collating Sequences | |
1871 | +** | |
1872 | +** These functions are used to add new collation sequences to the | |
1873 | +** [sqlite3*] handle specified as the first argument. | |
1874 | +** | |
1875 | +** The name of the new collation sequence is specified as a UTF-8 string | |
1876 | +** for sqlite3_create_collation() and sqlite3_create_collation_v2() | |
1877 | +** and a UTF-16 string for sqlite3_create_collation16(). In all cases | |
1878 | +** the name is passed as the second function argument. | |
1879 | +** | |
1880 | +** The third argument must be one of the constants [SQLITE_UTF8], | |
1881 | +** [SQLITE_UTF16LE] or [SQLITE_UTF16BE], indicating that the user-supplied | |
1882 | +** routine expects to be passed pointers to strings encoded using UTF-8, | |
1883 | +** UTF-16 little-endian or UTF-16 big-endian respectively. | |
1884 | +** | |
1885 | +** A pointer to the user supplied routine must be passed as the fifth | |
1886 | +** argument. If it is NULL, this is the same as deleting the collation | |
1887 | +** sequence (so that SQLite cannot call it anymore). Each time the user | |
1888 | +** supplied function is invoked, it is passed a copy of the void* passed as | |
1889 | +** the fourth argument to sqlite3_create_collation() or | |
1890 | +** sqlite3_create_collation16() as its first parameter. | |
1891 | +** | |
1892 | +** The remaining arguments to the user-supplied routine are two strings, | |
1893 | +** each represented by a [length, data] pair and encoded in the encoding | |
1894 | +** that was passed as the third argument when the collation sequence was | |
1895 | +** registered. The user routine should return negative, zero or positive if | |
1896 | +** the first string is less than, equal to, or greater than the second | |
1897 | +** string. i.e. (STRING1 - STRING2). | |
1898 | +** | |
1899 | +** The sqlite3_create_collation_v2() works like sqlite3_create_collation() | |
1900 | +** excapt that it takes an extra argument which is a destructor for | |
1901 | +** the collation. The destructor is called when the collation is | |
1902 | +** destroyed and is passed a copy of the fourth parameter void* pointer | |
1903 | +** of the sqlite3_create_collation_v2(). Collations are destroyed when | |
1904 | +** they are overridden by later calls to the collation creation functions | |
1905 | +** or when the [sqlite3*] database handle is closed using [sqlite3_close()]. | |
1906 | +** | |
1907 | +** The sqlite3_create_collation_v2() interface is experimental and | |
1908 | +** subject to change in future releases. The other collation creation | |
1909 | +** functions are stable. | |
1910 | +*/ | |
1911 | +int sqlite3_create_collation( | |
1912 | + sqlite3*, | |
1913 | + const char *zName, | |
1914 | + int eTextRep, | |
1915 | + void*, | |
1916 | + int(*xCompare)(void*,int,const void*,int,const void*) | |
1917 | +); | |
1918 | +int sqlite3_create_collation_v2( | |
1919 | + sqlite3*, | |
1920 | + const char *zName, | |
1921 | + int eTextRep, | |
1922 | + void*, | |
1923 | + int(*xCompare)(void*,int,const void*,int,const void*), | |
1924 | + void(*xDestroy)(void*) | |
1925 | +); | |
1926 | +int sqlite3_create_collation16( | |
1927 | + sqlite3*, | |
1928 | + const char *zName, | |
1929 | + int eTextRep, | |
1930 | + void*, | |
1931 | + int(*xCompare)(void*,int,const void*,int,const void*) | |
1932 | +); | |
1933 | + | |
1934 | +/* | |
1935 | +** CAPI3REF: Collation Needed Callbacks | |
1936 | +** | |
1937 | +** To avoid having to register all collation sequences before a database | |
1938 | +** can be used, a single callback function may be registered with the | |
1939 | +** database handle to be called whenever an undefined collation sequence is | |
1940 | +** required. | |
1941 | +** | |
1942 | +** If the function is registered using the sqlite3_collation_needed() API, | |
1943 | +** then it is passed the names of undefined collation sequences as strings | |
1944 | +** encoded in UTF-8. If sqlite3_collation_needed16() is used, the names | |
1945 | +** are passed as UTF-16 in machine native byte order. A call to either | |
1946 | +** function replaces any existing callback. | |
1947 | +** | |
1948 | +** When the callback is invoked, the first argument passed is a copy | |
1949 | +** of the second argument to sqlite3_collation_needed() or | |
1950 | +** sqlite3_collation_needed16(). The second argument is the database | |
1951 | +** handle. The third argument is one of [SQLITE_UTF8], [SQLITE_UTF16BE], or | |
1952 | +** [SQLITE_UTF16LE], indicating the most desirable form of the collation | |
1953 | +** sequence function required. The fourth parameter is the name of the | |
1954 | +** required collation sequence. | |
1955 | +** | |
1956 | +** The callback function should register the desired collation using | |
1957 | +** [sqlite3_create_collation()], [sqlite3_create_collation16()], or | |
1958 | +** [sqlite3_create_collation_v2()]. | |
1959 | +*/ | |
1960 | +int sqlite3_collation_needed( | |
1961 | + sqlite3*, | |
1962 | + void*, | |
1963 | + void(*)(void*,sqlite3*,int eTextRep,const char*) | |
1964 | +); | |
1965 | +int sqlite3_collation_needed16( | |
1966 | + sqlite3*, | |
1967 | + void*, | |
1968 | + void(*)(void*,sqlite3*,int eTextRep,const void*) | |
1969 | +); | |
1970 | + | |
1971 | +/* | |
1972 | +** Specify the key for an encrypted database. This routine should be | |
1973 | +** called right after sqlite3_open(). | |
1974 | +** | |
1975 | +** The code to implement this API is not available in the public release | |
1976 | +** of SQLite. | |
1977 | +*/ | |
1978 | +int sqlite3_key( | |
1979 | + sqlite3 *db, /* Database to be rekeyed */ | |
1980 | + const void *pKey, int nKey /* The key */ | |
1981 | +); | |
1982 | + | |
1983 | +/* | |
1984 | +** Change the key on an open database. If the current database is not | |
1985 | +** encrypted, this routine will encrypt it. If pNew==0 or nNew==0, the | |
1986 | +** database is decrypted. | |
1987 | +** | |
1988 | +** The code to implement this API is not available in the public release | |
1989 | +** of SQLite. | |
1990 | +*/ | |
1991 | +int sqlite3_rekey( | |
1992 | + sqlite3 *db, /* Database to be rekeyed */ | |
1993 | + const void *pKey, int nKey /* The new key */ | |
1994 | +); | |
1995 | + | |
1996 | +/* | |
1997 | +** CAPI3REF: Suspend Execution For A Short Time | |
1998 | +** | |
1999 | +** This function causes the current thread to suspend execution | |
2000 | +** a number of milliseconds specified in its parameter. | |
2001 | +** | |
2002 | +** If the operating system does not support sleep requests with | |
2003 | +** millisecond time resolution, then the time will be rounded up to | |
2004 | +** the nearest second. The number of milliseconds of sleep actually | |
2005 | +** requested from the operating system is returned. | |
2006 | +*/ | |
2007 | +int sqlite3_sleep(int); | |
2008 | + | |
2009 | +/* | |
2010 | +** CAPI3REF: Name Of The Folder Holding Temporary Files | |
2011 | +** | |
2012 | +** If this global variable is made to point to a string which is | |
2013 | +** the name of a folder (a.ka. directory), then all temporary files | |
2014 | +** created by SQLite will be placed in that directory. If this variable | |
2015 | +** is NULL pointer, then SQLite does a search for an appropriate temporary | |
2016 | +** file directory. | |
2017 | +** | |
2018 | +** Once [sqlite3_open()] has been called, changing this variable will | |
2019 | +** invalidate the current temporary database, if any. Generally speaking, | |
2020 | +** it is not safe to invoke this routine after [sqlite3_open()] has | |
2021 | +** been called. | |
2022 | +*/ | |
2023 | +extern char *sqlite3_temp_directory; | |
2024 | + | |
2025 | +/* | |
2026 | +** CAPI3REF: Test To See If The Databse Is In Auto-Commit Mode | |
2027 | +** | |
2028 | +** Test to see whether or not the database connection is in autocommit | |
2029 | +** mode. Return TRUE if it is and FALSE if not. Autocommit mode is on | |
2030 | +** by default. Autocommit is disabled by a BEGIN statement and reenabled | |
2031 | +** by the next COMMIT or ROLLBACK. | |
2032 | +*/ | |
2033 | +int sqlite3_get_autocommit(sqlite3*); | |
2034 | + | |
2035 | +/* | |
2036 | +** CAPI3REF: Find The Database Handle Associated With A Prepared Statement | |
2037 | +** | |
2038 | +** Return the [sqlite3*] database handle to which a | |
2039 | +** [sqlite3_stmt | prepared statement] belongs. | |
2040 | +** This is the same database handle that was | |
2041 | +** the first argument to the [sqlite3_prepare_v2()] or its variants | |
2042 | +** that was used to create the statement in the first place. | |
2043 | +*/ | |
2044 | +sqlite3 *sqlite3_db_handle(sqlite3_stmt*); | |
2045 | + | |
2046 | + | |
2047 | +/* | |
2048 | +** CAPI3REF: Commit And Rollback Notification Callbacks | |
2049 | +** | |
2050 | +** These routines | |
2051 | +** register callback functions to be invoked whenever a transaction | |
2052 | +** is committed or rolled back. The pArg argument is passed through | |
2053 | +** to the callback. If the callback on a commit hook function | |
2054 | +** returns non-zero, then the commit is converted into a rollback. | |
2055 | +** | |
2056 | +** If another function was previously registered, its pArg value is returned. | |
2057 | +** Otherwise NULL is returned. | |
2058 | +** | |
2059 | +** Registering a NULL function disables the callback. | |
2060 | +** | |
2061 | +** For the purposes of this API, a transaction is said to have been | |
2062 | +** rolled back if an explicit "ROLLBACK" statement is executed, or | |
2063 | +** an error or constraint causes an implicit rollback to occur. The | |
2064 | +** callback is not invoked if a transaction is automatically rolled | |
2065 | +** back because the database connection is closed. | |
2066 | +** | |
2067 | +** These are experimental interfaces and are subject to change. | |
2068 | +*/ | |
2069 | +void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*); | |
2070 | +void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); | |
2071 | + | |
2072 | +/* | |
2073 | +** CAPI3REF: Data Change Notification Callbacks | |
2074 | +** | |
2075 | +** Register a callback function with the database connection identified by the | |
2076 | +** first argument to be invoked whenever a row is updated, inserted or deleted. | |
2077 | +** Any callback set by a previous call to this function for the same | |
2078 | +** database connection is overridden. | |
2079 | +** | |
2080 | +** The second argument is a pointer to the function to invoke when a | |
2081 | +** row is updated, inserted or deleted. The first argument to the callback is | |
2082 | +** a copy of the third argument to sqlite3_update_hook(). The second callback | |
2083 | +** argument is one of SQLITE_INSERT, SQLITE_DELETE or SQLITE_UPDATE, depending | |
2084 | +** on the operation that caused the callback to be invoked. The third and | |
2085 | +** fourth arguments to the callback contain pointers to the database and | |
2086 | +** table name containing the affected row. The final callback parameter is | |
2087 | +** the rowid of the row. In the case of an update, this is the rowid after | |
2088 | +** the update takes place. | |
2089 | +** | |
2090 | +** The update hook is not invoked when internal system tables are | |
2091 | +** modified (i.e. sqlite_master and sqlite_sequence). | |
2092 | +** | |
2093 | +** If another function was previously registered, its pArg value is returned. | |
2094 | +** Otherwise NULL is returned. | |
2095 | +*/ | |
2096 | +void *sqlite3_update_hook( | |
2097 | + sqlite3*, | |
2098 | + void(*)(void *,int ,char const *,char const *,sqlite_int64), | |
2099 | + void* | |
2100 | +); | |
2101 | + | |
2102 | +/* | |
2103 | +** CAPI3REF: Enable Or Disable Shared Pager Cache | |
2104 | +** | |
2105 | +** This routine enables or disables the sharing of the database cache | |
2106 | +** and schema data structures between connections to the same database. | |
2107 | +** Sharing is enabled if the argument is true and disabled if the argument | |
2108 | +** is false. | |
2109 | +** | |
2110 | +** Cache sharing is enabled and disabled on a thread-by-thread basis. | |
2111 | +** Each call to this routine enables or disables cache sharing only for | |
2112 | +** connections created in the same thread in which this routine is called. | |
2113 | +** There is no mechanism for sharing cache between database connections | |
2114 | +** running in different threads. | |
2115 | +** | |
2116 | +** Sharing must be disabled prior to shutting down a thread or else | |
2117 | +** the thread will leak memory. Call this routine with an argument of | |
2118 | +** 0 to turn off sharing. Or use the sqlite3_thread_cleanup() API. | |
2119 | +** | |
2120 | +** This routine must not be called when any database connections | |
2121 | +** are active in the current thread. Enabling or disabling shared | |
2122 | +** cache while there are active database connections will result | |
2123 | +** in memory corruption. | |
2124 | +** | |
2125 | +** When the shared cache is enabled, the | |
2126 | +** following routines must always be called from the same thread: | |
2127 | +** [sqlite3_open()], [sqlite3_prepare_v2()], [sqlite3_step()], | |
2128 | +** [sqlite3_reset()], [sqlite3_finalize()], and [sqlite3_close()]. | |
2129 | +** This is due to the fact that the shared cache makes use of | |
2130 | +** thread-specific storage so that it will be available for sharing | |
2131 | +** with other connections. | |
2132 | +** | |
2133 | +** Virtual tables cannot be used with a shared cache. When shared | |
2134 | +** cache is enabled, the sqlite3_create_module() API used to register | |
2135 | +** virtual tables will always return an error. | |
2136 | +** | |
2137 | +** This routine returns [SQLITE_OK] if shared cache was | |
2138 | +** enabled or disabled successfully. An [SQLITE_ERROR | error code] | |
2139 | +** is returned otherwise. | |
2140 | +** | |
2141 | +** Shared cache is disabled by default for backward compatibility. | |
2142 | +*/ | |
2143 | +int sqlite3_enable_shared_cache(int); | |
2144 | + | |
2145 | +/* | |
2146 | +** CAPI3REF: Attempt To Free Heap Memory | |
2147 | +** | |
2148 | +** Attempt to free N bytes of heap memory by deallocating non-essential | |
2149 | +** memory allocations held by the database library (example: memory | |
2150 | +** used to cache database pages to improve performance). | |
2151 | +** | |
2152 | +** This function is not a part of standard builds. It is only created | |
2153 | +** if SQLite is compiled with the SQLITE_ENABLE_MEMORY_MANAGEMENT macro. | |
2154 | +*/ | |
2155 | +int sqlite3_release_memory(int); | |
2156 | + | |
2157 | +/* | |
2158 | +** CAPI3REF: Impose A Limit On Heap Size | |
2159 | +** | |
2160 | +** Place a "soft" limit on the amount of heap memory that may be allocated by | |
2161 | +** SQLite within the current thread. If an internal allocation is requested | |
2162 | +** that would exceed the specified limit, [sqlite3_release_memory()] is invoked | |
2163 | +** one or more times to free up some space before the allocation is made. | |
2164 | +** | |
2165 | +** The limit is called "soft", because if [sqlite3_release_memory()] cannot free | |
2166 | +** sufficient memory to prevent the limit from being exceeded, the memory is | |
2167 | +** allocated anyway and the current operation proceeds. | |
2168 | +** | |
2169 | +** Prior to shutting down a thread sqlite3_soft_heap_limit() must be set to | |
2170 | +** zero (the default) or else the thread will leak memory. Alternatively, use | |
2171 | +** the [sqlite3_thread_cleanup()] API. | |
2172 | +** | |
2173 | +** A negative or zero value for N means that there is no soft heap limit and | |
2174 | +** [sqlite3_release_memory()] will only be called when memory is exhaused. | |
2175 | +** The default value for the soft heap limit is zero. | |
2176 | +** | |
2177 | +** SQLite makes a best effort to honor the soft heap limit. But if it | |
2178 | +** is unable to reduce memory usage below the soft limit, execution will | |
2179 | +** continue without error or notification. This is why the limit is | |
2180 | +** called a "soft" limit. It is advisory only. | |
2181 | +** | |
2182 | +** This function is only available if the library was compiled with the | |
2183 | +** SQLITE_ENABLE_MEMORY_MANAGEMENT option set. | |
2184 | +** memory-management has been enabled. | |
2185 | +*/ | |
2186 | +void sqlite3_soft_heap_limit(int); | |
2187 | + | |
2188 | +/* | |
2189 | +** CAPI3REF: Clean Up Thread Local Storage | |
2190 | +** | |
2191 | +** This routine makes sure that all thread-local storage has been | |
2192 | +** deallocated for the current thread. | |
2193 | +** | |
2194 | +** This routine is not technically necessary. All thread-local storage | |
2195 | +** will be automatically deallocated once memory-management and | |
2196 | +** shared-cache are disabled and the soft heap limit has been set | |
2197 | +** to zero. This routine is provided as a convenience for users who | |
2198 | +** want to make absolutely sure they have not forgotten something | |
2199 | +** prior to killing off a thread. | |
2200 | +*/ | |
2201 | +void sqlite3_thread_cleanup(void); | |
2202 | + | |
2203 | +/* | |
2204 | +** CAPI3REF: Extract Metadata About A Column Of A Table | |
2205 | +** | |
2206 | +** This routine | |
2207 | +** returns meta-data about a specific column of a specific database | |
2208 | +** table accessible using the connection handle passed as the first function | |
2209 | +** argument. | |
2210 | +** | |
2211 | +** The column is identified by the second, third and fourth parameters to | |
2212 | +** this function. The second parameter is either the name of the database | |
2213 | +** (i.e. "main", "temp" or an attached database) containing the specified | |
2214 | +** table or NULL. If it is NULL, then all attached databases are searched | |
2215 | +** for the table using the same algorithm as the database engine uses to | |
2216 | +** resolve unqualified table references. | |
2217 | +** | |
2218 | +** The third and fourth parameters to this function are the table and column | |
2219 | +** name of the desired column, respectively. Neither of these parameters | |
2220 | +** may be NULL. | |
2221 | +** | |
2222 | +** Meta information is returned by writing to the memory locations passed as | |
2223 | +** the 5th and subsequent parameters to this function. Any of these | |
2224 | +** arguments may be NULL, in which case the corresponding element of meta | |
2225 | +** information is ommitted. | |
2226 | +** | |
2227 | +** <pre> | |
2228 | +** Parameter Output Type Description | |
2229 | +** ----------------------------------- | |
2230 | +** | |
2231 | +** 5th const char* Data type | |
2232 | +** 6th const char* Name of the default collation sequence | |
2233 | +** 7th int True if the column has a NOT NULL constraint | |
2234 | +** 8th int True if the column is part of the PRIMARY KEY | |
2235 | +** 9th int True if the column is AUTOINCREMENT | |
2236 | +** </pre> | |
2237 | +** | |
2238 | +** | |
2239 | +** The memory pointed to by the character pointers returned for the | |
2240 | +** declaration type and collation sequence is valid only until the next | |
2241 | +** call to any sqlite API function. | |
2242 | +** | |
2243 | +** If the specified table is actually a view, then an error is returned. | |
2244 | +** | |
2245 | +** If the specified column is "rowid", "oid" or "_rowid_" and an | |
2246 | +** INTEGER PRIMARY KEY column has been explicitly declared, then the output | |
2247 | +** parameters are set for the explicitly declared column. If there is no | |
2248 | +** explicitly declared IPK column, then the output parameters are set as | |
2249 | +** follows: | |
2250 | +** | |
2251 | +** <pre> | |
2252 | +** data type: "INTEGER" | |
2253 | +** collation sequence: "BINARY" | |
2254 | +** not null: 0 | |
2255 | +** primary key: 1 | |
2256 | +** auto increment: 0 | |
2257 | +** </pre> | |
2258 | +** | |
2259 | +** This function may load one or more schemas from database files. If an | |
2260 | +** error occurs during this process, or if the requested table or column | |
2261 | +** cannot be found, an SQLITE error code is returned and an error message | |
2262 | +** left in the database handle (to be retrieved using sqlite3_errmsg()). | |
2263 | +** | |
2264 | +** This API is only available if the library was compiled with the | |
2265 | +** SQLITE_ENABLE_COLUMN_METADATA preprocessor symbol defined. | |
2266 | +*/ | |
2267 | +int sqlite3_table_column_metadata( | |
2268 | + sqlite3 *db, /* Connection handle */ | |
2269 | + const char *zDbName, /* Database name or NULL */ | |
2270 | + const char *zTableName, /* Table name */ | |
2271 | + const char *zColumnName, /* Column name */ | |
2272 | + char const **pzDataType, /* OUTPUT: Declared data type */ | |
2273 | + char const **pzCollSeq, /* OUTPUT: Collation sequence name */ | |
2274 | + int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ | |
2275 | + int *pPrimaryKey, /* OUTPUT: True if column part of PK */ | |
2276 | + int *pAutoinc /* OUTPUT: True if colums is auto-increment */ | |
2277 | +); | |
2278 | + | |
2279 | +/* | |
2280 | +** CAPI3REF: Load An Extension | |
2281 | +** | |
2282 | +** Attempt to load an SQLite extension library contained in the file | |
2283 | +** zFile. The entry point is zProc. zProc may be 0 in which case the | |
2284 | +** name of the entry point defaults to "sqlite3_extension_init". | |
2285 | +** | |
2286 | +** Return [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong. | |
2287 | +** | |
2288 | +** If an error occurs and pzErrMsg is not 0, then fill *pzErrMsg with | |
2289 | +** error message text. The calling function should free this memory | |
2290 | +** by calling [sqlite3_free()]. | |
2291 | +** | |
2292 | +** Extension loading must be enabled using [sqlite3_enable_load_extension()] | |
2293 | +** prior to calling this API or an error will be returned. | |
2294 | +*/ | |
2295 | +int sqlite3_load_extension( | |
2296 | + sqlite3 *db, /* Load the extension into this database connection */ | |
2297 | + const char *zFile, /* Name of the shared library containing extension */ | |
2298 | + const char *zProc, /* Entry point. Derived from zFile if 0 */ | |
2299 | + char **pzErrMsg /* Put error message here if not 0 */ | |
2300 | +); | |
2301 | + | |
2302 | +/* | |
2303 | +** CAPI3REF: Enable Or Disable Extension Loading | |
2304 | +** | |
2305 | +** So as not to open security holes in older applications that are | |
2306 | +** unprepared to deal with extension loading, and as a means of disabling | |
2307 | +** extension loading while evaluating user-entered SQL, the following | |
2308 | +** API is provided to turn the [sqlite3_load_extension()] mechanism on and | |
2309 | +** off. It is off by default. See ticket #1863. | |
2310 | +** | |
2311 | +** Call this routine with onoff==1 to turn extension loading on | |
2312 | +** and call it with onoff==0 to turn it back off again. | |
2313 | +*/ | |
2314 | +int sqlite3_enable_load_extension(sqlite3 *db, int onoff); | |
2315 | + | |
2316 | +/* | |
2317 | +** CAPI3REF: Make Arrangements To Automatically Load An Extension | |
2318 | +** | |
2319 | +** Register an extension entry point that is automatically invoked | |
2320 | +** whenever a new database connection is opened using | |
2321 | +** [sqlite3_open()] or [sqlite3_open16()]. | |
2322 | +** | |
2323 | +** This API can be invoked at program startup in order to register | |
2324 | +** one or more statically linked extensions that will be available | |
2325 | +** to all new database connections. | |
2326 | +** | |
2327 | +** Duplicate extensions are detected so calling this routine multiple | |
2328 | +** times with the same extension is harmless. | |
2329 | +** | |
2330 | +** This routine stores a pointer to the extension in an array | |
2331 | +** that is obtained from malloc(). If you run a memory leak | |
2332 | +** checker on your program and it reports a leak because of this | |
2333 | +** array, then invoke [sqlite3_automatic_extension_reset()] prior | |
2334 | +** to shutdown to free the memory. | |
2335 | +** | |
2336 | +** Automatic extensions apply across all threads. | |
2337 | +** | |
2338 | +** This interface is experimental and is subject to change or | |
2339 | +** removal in future releases of SQLite. | |
2340 | +*/ | |
2341 | +int sqlite3_auto_extension(void *xEntryPoint); | |
2342 | + | |
2343 | + | |
2344 | +/* | |
2345 | +** CAPI3REF: Reset Automatic Extension Loading | |
2346 | +** | |
2347 | +** Disable all previously registered automatic extensions. This | |
2348 | +** routine undoes the effect of all prior [sqlite3_automatic_extension()] | |
2349 | +** calls. | |
2350 | +** | |
2351 | +** This call disabled automatic extensions in all threads. | |
2352 | +** | |
2353 | +** This interface is experimental and is subject to change or | |
2354 | +** removal in future releases of SQLite. | |
2355 | +*/ | |
2356 | +void sqlite3_reset_auto_extension(void); | |
2357 | + | |
2358 | + | |
2359 | +/* | |
2360 | +****** EXPERIMENTAL - subject to change without notice ************** | |
2361 | +** | |
2362 | +** The interface to the virtual-table mechanism is currently considered | |
2363 | +** to be experimental. The interface might change in incompatible ways. | |
2364 | +** If this is a problem for you, do not use the interface at this time. | |
2365 | +** | |
2366 | +** When the virtual-table mechanism stablizes, we will declare the | |
2367 | +** interface fixed, support it indefinitely, and remove this comment. | |
2368 | +*/ | |
2369 | + | |
2370 | +/* | |
2371 | +** Structures used by the virtual table interface | |
2372 | +*/ | |
2373 | +typedef struct sqlite3_vtab sqlite3_vtab; | |
2374 | +typedef struct sqlite3_index_info sqlite3_index_info; | |
2375 | +typedef struct sqlite3_vtab_cursor sqlite3_vtab_cursor; | |
2376 | +typedef struct sqlite3_module sqlite3_module; | |
2377 | + | |
2378 | +/* | |
2379 | +** A module is a class of virtual tables. Each module is defined | |
2380 | +** by an instance of the following structure. This structure consists | |
2381 | +** mostly of methods for the module. | |
2382 | +*/ | |
2383 | +struct sqlite3_module { | |
2384 | + int iVersion; | |
2385 | + int (*xCreate)(sqlite3*, void *pAux, | |
2386 | + int argc, const char *const*argv, | |
2387 | + sqlite3_vtab **ppVTab, char**); | |
2388 | + int (*xConnect)(sqlite3*, void *pAux, | |
2389 | + int argc, const char *const*argv, | |
2390 | + sqlite3_vtab **ppVTab, char**); | |
2391 | + int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*); | |
2392 | + int (*xDisconnect)(sqlite3_vtab *pVTab); | |
2393 | + int (*xDestroy)(sqlite3_vtab *pVTab); | |
2394 | + int (*xOpen)(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor); | |
2395 | + int (*xClose)(sqlite3_vtab_cursor*); | |
2396 | + int (*xFilter)(sqlite3_vtab_cursor*, int idxNum, const char *idxStr, | |
2397 | + int argc, sqlite3_value **argv); | |
2398 | + int (*xNext)(sqlite3_vtab_cursor*); | |
2399 | + int (*xEof)(sqlite3_vtab_cursor*); | |
2400 | + int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int); | |
2401 | + int (*xRowid)(sqlite3_vtab_cursor*, sqlite_int64 *pRowid); | |
2402 | + int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite_int64 *); | |
2403 | + int (*xBegin)(sqlite3_vtab *pVTab); | |
2404 | + int (*xSync)(sqlite3_vtab *pVTab); | |
2405 | + int (*xCommit)(sqlite3_vtab *pVTab); | |
2406 | + int (*xRollback)(sqlite3_vtab *pVTab); | |
2407 | + int (*xFindFunction)(sqlite3_vtab *pVtab, int nArg, const char *zName, | |
2408 | + void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), | |
2409 | + void **ppArg); | |
2410 | + | |
2411 | + int (*xRename)(sqlite3_vtab *pVtab, const char *zNew); | |
2412 | +}; | |
2413 | + | |
2414 | +/* | |
2415 | +** The sqlite3_index_info structure and its substructures is used to | |
2416 | +** pass information into and receive the reply from the xBestIndex | |
2417 | +** method of an sqlite3_module. The fields under **Inputs** are the | |
2418 | +** inputs to xBestIndex and are read-only. xBestIndex inserts its | |
2419 | +** results into the **Outputs** fields. | |
2420 | +** | |
2421 | +** The aConstraint[] array records WHERE clause constraints of the | |
2422 | +** form: | |
2423 | +** | |
2424 | +** column OP expr | |
2425 | +** | |
2426 | +** Where OP is =, <, <=, >, or >=. The particular operator is stored | |
2427 | +** in aConstraint[].op. The index of the column is stored in | |
2428 | +** aConstraint[].iColumn. aConstraint[].usable is TRUE if the | |
2429 | +** expr on the right-hand side can be evaluated (and thus the constraint | |
2430 | +** is usable) and false if it cannot. | |
2431 | +** | |
2432 | +** The optimizer automatically inverts terms of the form "expr OP column" | |
2433 | +** and makes other simplificatinos to the WHERE clause in an attempt to | |
2434 | +** get as many WHERE clause terms into the form shown above as possible. | |
2435 | +** The aConstraint[] array only reports WHERE clause terms in the correct | |
2436 | +** form that refer to the particular virtual table being queried. | |
2437 | +** | |
2438 | +** Information about the ORDER BY clause is stored in aOrderBy[]. | |
2439 | +** Each term of aOrderBy records a column of the ORDER BY clause. | |
2440 | +** | |
2441 | +** The xBestIndex method must fill aConstraintUsage[] with information | |
2442 | +** about what parameters to pass to xFilter. If argvIndex>0 then | |
2443 | +** the right-hand side of the corresponding aConstraint[] is evaluated | |
2444 | +** and becomes the argvIndex-th entry in argv. If aConstraintUsage[].omit | |
2445 | +** is true, then the constraint is assumed to be fully handled by the | |
2446 | +** virtual table and is not checked again by SQLite. | |
2447 | +** | |
2448 | +** The idxNum and idxPtr values are recorded and passed into xFilter. | |
2449 | +** sqlite3_free() is used to free idxPtr if needToFreeIdxPtr is true. | |
2450 | +** | |
2451 | +** The orderByConsumed means that output from xFilter will occur in | |
2452 | +** the correct order to satisfy the ORDER BY clause so that no separate | |
2453 | +** sorting step is required. | |
2454 | +** | |
2455 | +** The estimatedCost value is an estimate of the cost of doing the | |
2456 | +** particular lookup. A full scan of a table with N entries should have | |
2457 | +** a cost of N. A binary search of a table of N entries should have a | |
2458 | +** cost of approximately log(N). | |
2459 | +*/ | |
2460 | +struct sqlite3_index_info { | |
2461 | + /* Inputs */ | |
2462 | + const int nConstraint; /* Number of entries in aConstraint */ | |
2463 | + const struct sqlite3_index_constraint { | |
2464 | + int iColumn; /* Column on left-hand side of constraint */ | |
2465 | + unsigned char op; /* Constraint operator */ | |
2466 | + unsigned char usable; /* True if this constraint is usable */ | |
2467 | + int iTermOffset; /* Used internally - xBestIndex should ignore */ | |
2468 | + } *const aConstraint; /* Table of WHERE clause constraints */ | |
2469 | + const int nOrderBy; /* Number of terms in the ORDER BY clause */ | |
2470 | + const struct sqlite3_index_orderby { | |
2471 | + int iColumn; /* Column number */ | |
2472 | + unsigned char desc; /* True for DESC. False for ASC. */ | |
2473 | + } *const aOrderBy; /* The ORDER BY clause */ | |
2474 | + | |
2475 | + /* Outputs */ | |
2476 | + struct sqlite3_index_constraint_usage { | |
2477 | + int argvIndex; /* if >0, constraint is part of argv to xFilter */ | |
2478 | + unsigned char omit; /* Do not code a test for this constraint */ | |
2479 | + } *const aConstraintUsage; | |
2480 | + int idxNum; /* Number used to identify the index */ | |
2481 | + char *idxStr; /* String, possibly obtained from sqlite3_malloc */ | |
2482 | + int needToFreeIdxStr; /* Free idxStr using sqlite3_free() if true */ | |
2483 | + int orderByConsumed; /* True if output is already ordered */ | |
2484 | + double estimatedCost; /* Estimated cost of using this index */ | |
2485 | +}; | |
2486 | +#define SQLITE_INDEX_CONSTRAINT_EQ 2 | |
2487 | +#define SQLITE_INDEX_CONSTRAINT_GT 4 | |
2488 | +#define SQLITE_INDEX_CONSTRAINT_LE 8 | |
2489 | +#define SQLITE_INDEX_CONSTRAINT_LT 16 | |
2490 | +#define SQLITE_INDEX_CONSTRAINT_GE 32 | |
2491 | +#define SQLITE_INDEX_CONSTRAINT_MATCH 64 | |
2492 | + | |
2493 | +/* | |
2494 | +** This routine is used to register a new module name with an SQLite | |
2495 | +** connection. Module names must be registered before creating new | |
2496 | +** virtual tables on the module, or before using preexisting virtual | |
2497 | +** tables of the module. | |
2498 | +*/ | |
2499 | +int sqlite3_create_module( | |
2500 | + sqlite3 *db, /* SQLite connection to register module with */ | |
2501 | + const char *zName, /* Name of the module */ | |
2502 | + const sqlite3_module *, /* Methods for the module */ | |
2503 | + void * /* Client data for xCreate/xConnect */ | |
2504 | +); | |
2505 | + | |
2506 | +/* | |
2507 | +** This routine is identical to the sqlite3_create_module() method above, | |
2508 | +** except that it allows a destructor function to be specified. It is | |
2509 | +** even more experimental than the rest of the virtual tables API. | |
2510 | +*/ | |
2511 | +int sqlite3_create_module_v2( | |
2512 | + sqlite3 *db, /* SQLite connection to register module with */ | |
2513 | + const char *zName, /* Name of the module */ | |
2514 | + const sqlite3_module *, /* Methods for the module */ | |
2515 | + void *, /* Client data for xCreate/xConnect */ | |
2516 | + void(*xDestroy)(void*) /* Module destructor function */ | |
2517 | +); | |
2518 | + | |
2519 | +/* | |
2520 | +** Every module implementation uses a subclass of the following structure | |
2521 | +** to describe a particular instance of the module. Each subclass will | |
2522 | +** be taylored to the specific needs of the module implementation. The | |
2523 | +** purpose of this superclass is to define certain fields that are common | |
2524 | +** to all module implementations. | |
2525 | +** | |
2526 | +** Virtual tables methods can set an error message by assigning a | |
2527 | +** string obtained from sqlite3_mprintf() to zErrMsg. The method should | |
2528 | +** take care that any prior string is freed by a call to sqlite3_free() | |
2529 | +** prior to assigning a new string to zErrMsg. After the error message | |
2530 | +** is delivered up to the client application, the string will be automatically | |
2531 | +** freed by sqlite3_free() and the zErrMsg field will be zeroed. Note | |
2532 | +** that sqlite3_mprintf() and sqlite3_free() are used on the zErrMsg field | |
2533 | +** since virtual tables are commonly implemented in loadable extensions which | |
2534 | +** do not have access to sqlite3MPrintf() or sqlite3Free(). | |
2535 | +*/ | |
2536 | +struct sqlite3_vtab { | |
2537 | + const sqlite3_module *pModule; /* The module for this virtual table */ | |
2538 | + int nRef; /* Used internally */ | |
2539 | + char *zErrMsg; /* Error message from sqlite3_mprintf() */ | |
2540 | + /* Virtual table implementations will typically add additional fields */ | |
2541 | +}; | |
2542 | + | |
2543 | +/* Every module implementation uses a subclass of the following structure | |
2544 | +** to describe cursors that point into the virtual table and are used | |
2545 | +** to loop through the virtual table. Cursors are created using the | |
2546 | +** xOpen method of the module. Each module implementation will define | |
2547 | +** the content of a cursor structure to suit its own needs. | |
2548 | +** | |
2549 | +** This superclass exists in order to define fields of the cursor that | |
2550 | +** are common to all implementations. | |
2551 | +*/ | |
2552 | +struct sqlite3_vtab_cursor { | |
2553 | + sqlite3_vtab *pVtab; /* Virtual table of this cursor */ | |
2554 | + /* Virtual table implementations will typically add additional fields */ | |
2555 | +}; | |
2556 | + | |
2557 | +/* | |
2558 | +** The xCreate and xConnect methods of a module use the following API | |
2559 | +** to declare the format (the names and datatypes of the columns) of | |
2560 | +** the virtual tables they implement. | |
2561 | +*/ | |
2562 | +int sqlite3_declare_vtab(sqlite3*, const char *zCreateTable); | |
2563 | + | |
2564 | +/* | |
2565 | +** Virtual tables can provide alternative implementations of functions | |
2566 | +** using the xFindFunction method. But global versions of those functions | |
2567 | +** must exist in order to be overloaded. | |
2568 | +** | |
2569 | +** This API makes sure a global version of a function with a particular | |
2570 | +** name and number of parameters exists. If no such function exists | |
2571 | +** before this API is called, a new function is created. The implementation | |
2572 | +** of the new function always causes an exception to be thrown. So | |
2573 | +** the new function is not good for anything by itself. Its only | |
2574 | +** purpose is to be a place-holder function that can be overloaded | |
2575 | +** by virtual tables. | |
2576 | +** | |
2577 | +** This API should be considered part of the virtual table interface, | |
2578 | +** which is experimental and subject to change. | |
2579 | +*/ | |
2580 | +int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg); | |
2581 | + | |
2582 | +/* | |
2583 | +** The interface to the virtual-table mechanism defined above (back up | |
2584 | +** to a comment remarkably similar to this one) is currently considered | |
2585 | +** to be experimental. The interface might change in incompatible ways. | |
2586 | +** If this is a problem for you, do not use the interface at this time. | |
2587 | +** | |
2588 | +** When the virtual-table mechanism stablizes, we will declare the | |
2589 | +** interface fixed, support it indefinitely, and remove this comment. | |
2590 | +** | |
2591 | +****** EXPERIMENTAL - subject to change without notice ************** | |
2592 | +*/ | |
2593 | + | |
2594 | +/* | |
2595 | +** CAPI3REF: A Handle To An Open BLOB | |
2596 | +** | |
2597 | +** An instance of the following opaque structure is used to | |
2598 | +** represent an blob-handle. A blob-handle is created by | |
2599 | +** [sqlite3_blob_open()] and destroyed by [sqlite3_blob_close()]. | |
2600 | +** The [sqlite3_blob_read()] and [sqlite3_blob_write()] interfaces | |
2601 | +** can be used to read or write small subsections of the blob. | |
2602 | +** The [sqltie3_blob_size()] interface returns the size of the | |
2603 | +** blob in bytes. | |
2604 | +*/ | |
2605 | +typedef struct sqlite3_blob sqlite3_blob; | |
2606 | + | |
2607 | +/* | |
2608 | +** CAPI3REF: Open A BLOB For Incremental I/O | |
2609 | +** | |
2610 | +** Open a handle to the blob located in row iRow,, column zColumn, | |
2611 | +** table zTable in database zDb. i.e. the same blob that would | |
2612 | +** be selected by: | |
2613 | +** | |
2614 | +** <pre> | |
2615 | +** SELECT zColumn FROM zDb.zTable WHERE rowid = iRow; | |
2616 | +** </pre> | |
2617 | +** | |
2618 | +** If the flags parameter is non-zero, the blob is opened for | |
2619 | +** read and write access. If it is zero, the blob is opened for read | |
2620 | +** access. | |
2621 | +** | |
2622 | +** On success, [SQLITE_OK] is returned and the new | |
2623 | +** [sqlite3_blob | blob handle] is written to *ppBlob. | |
2624 | +** Otherwise an error code is returned and | |
2625 | +** any value written to *ppBlob should not be used by the caller. | |
2626 | +** This function sets the database-handle error code and message | |
2627 | +** accessible via [sqlite3_errcode()] and [sqlite3_errmsg()]. | |
2628 | +*/ | |
2629 | +int sqlite3_blob_open( | |
2630 | + sqlite3*, | |
2631 | + const char *zDb, | |
2632 | + const char *zTable, | |
2633 | + const char *zColumn, | |
2634 | + sqlite_int64 iRow, | |
2635 | + int flags, | |
2636 | + sqlite3_blob **ppBlob | |
2637 | +); | |
2638 | + | |
2639 | +/* | |
2640 | +** CAPI3REF: Close A BLOB Handle | |
2641 | +** | |
2642 | +** Close an open [sqlite3_blob | blob handle]. | |
2643 | +*/ | |
2644 | +int sqlite3_blob_close(sqlite3_blob *); | |
2645 | + | |
2646 | +/* | |
2647 | +** CAPI3REF: Return The Size Of An Open BLOB | |
2648 | +** | |
2649 | +** Return the size in bytes of the blob accessible via the open | |
2650 | +** [sqlite3_blob | blob-handle] passed as an argument. | |
2651 | +*/ | |
2652 | +int sqlite3_blob_bytes(sqlite3_blob *); | |
2653 | + | |
2654 | +/* | |
2655 | +** CAPI3REF: Read Data From A BLOB Incrementally | |
2656 | +** | |
2657 | +** This function is used to read data from an open | |
2658 | +** [sqlite3_blob | blob-handle] into a caller supplied buffer. | |
2659 | +** n bytes of data are copied into buffer | |
2660 | +** z from the open blob, starting at offset iOffset. | |
2661 | +** | |
2662 | +** On success, SQLITE_OK is returned. Otherwise, an | |
2663 | +** [SQLITE_ERROR | SQLite error code] or an | |
2664 | +** [SQLITE_IOERR_READ | extended error code] is returned. | |
2665 | +*/ | |
2666 | +int sqlite3_blob_read(sqlite3_blob *, void *z, int n, int iOffset); | |
2667 | + | |
2668 | +/* | |
2669 | +** CAPI3REF: Write Data Into A BLOB Incrementally | |
2670 | +** | |
2671 | +** This function is used to write data into an open | |
2672 | +** [sqlite3_blob | blob-handle] from a user supplied buffer. | |
2673 | +** n bytes of data are copied from the buffer | |
2674 | +** pointed to by z into the open blob, starting at offset iOffset. | |
2675 | +** | |
2676 | +** If the [sqlite3_blob | blob-handle] passed as the first argument | |
2677 | +** was not opened for writing (the flags parameter to [sqlite3_blob_open()] | |
2678 | +*** was zero), this function returns [SQLITE_READONLY]. | |
2679 | +** | |
2680 | +** This function may only modify the contents of the blob, it is | |
2681 | +** not possible to increase the size of a blob using this API. If | |
2682 | +** offset iOffset is less than n bytes from the end of the blob, | |
2683 | +** [SQLITE_ERROR] is returned and no data is written. | |
2684 | +** | |
2685 | +** On success, SQLITE_OK is returned. Otherwise, an | |
2686 | +** [SQLITE_ERROR | SQLite error code] or an | |
2687 | +** [SQLITE_IOERR_READ | extended error code] is returned. | |
2688 | +*/ | |
2689 | +int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset); | |
2690 | + | |
2691 | +/* | |
2692 | +** Undo the hack that converts floating point types to integer for | |
2693 | +** builds on processors without floating point support. | |
2694 | +*/ | |
2695 | +#ifdef SQLITE_OMIT_FLOATING_POINT | |
2696 | +# undef double | |
2697 | +#endif | |
2698 | + | |
2699 | +#ifdef __cplusplus | |
2700 | +} /* End of the 'extern "C"' block */ | |
2701 | +#endif | |
2702 | +#endif |
@@ -0,0 +1,4 @@ | ||
1 | +initial import. | |
2 | +--This line, and those below, will be ignored-- | |
3 | + | |
4 | +A . |