• R/O
  • HTTP
  • SSH
  • HTTPS

提交

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

BathyScapheのSQLiteデータベース内を覗くアプリ


Commit MetaInfo

修訂3b7c3c03b7d852dfbf6461d02903f06ed799c593 (tree)
時間2008-06-14 21:59:33
作者masakih <masakih@user...>
Commitermasakih

Log Message

initial import.

git-svn-id: svn+ssh://macmini/usr/local/svnrepos/BSDBViewer/BSDBViewer@2 477addb1-df5c-4826-a637-c2b1bdcd60d4

Change Summary

差異

--- /dev/null
+++ b/BSDBBoardSource.h
@@ -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
--- /dev/null
+++ b/BSDBBoardSource.m
@@ -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
--- /dev/null
+++ b/BSDBThreadSource.h
@@ -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
--- /dev/null
+++ b/BSDBThreadSource.m
@@ -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
--- /dev/null
+++ b/BSDBViewer.h
@@ -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
--- /dev/null
+++ b/BSDBViewer.m
@@ -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+
--- /dev/null
+++ b/BSDBViewer.xcodeproj/project.pbxproj
@@ -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+}
--- /dev/null
+++ b/BSDBViewer_Prefix.pch
@@ -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
--- /dev/null
+++ b/English.lproj/InfoPlist.strings
@@ -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>
--- /dev/null
+++ b/English.lproj/MainMenu.nib/classes.nib
@@ -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>
--- /dev/null
+++ b/English.lproj/MainMenu.nib/info.nib
@@ -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>
Binary files /dev/null and b/English.lproj/MainMenu.nib/keyedobjects.nib differ
--- /dev/null
+++ b/Info.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>
--- /dev/null
+++ b/Makefile
@@ -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+
--- /dev/null
+++ b/SQLiteDB.h
@@ -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;
--- /dev/null
+++ b/SQLiteDB.m
@@ -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
--- /dev/null
+++ b/UTILAssertion.h
@@ -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 */
--- /dev/null
+++ b/UTILDebugging.h
@@ -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 */
--- /dev/null
+++ b/UTILDescription.h
@@ -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 */
--- /dev/null
+++ b/UTILError.h
@@ -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 */
--- /dev/null
+++ b/UTILKit.h
@@ -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+
Binary files /dev/null and b/libsqlite.a differ
--- /dev/null
+++ b/main.m
@@ -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+}
--- /dev/null
+++ b/sqlite3.h
@@ -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
--- /dev/null
+++ b/svn-commit.tmp
@@ -0,0 +1,4 @@
1+initial import.
2+--This line, and those below, will be ignored--
3+
4+A .