ソースを参照

Added SQLiteSequence type.
Added scheme loader for SQLite.

Damian Kołakowski 11 年 前
コミット
c9036f8af0

+ 0 - 26
Common/ActiveRecord/ActiveRecordProxy.swift

@@ -1,26 +0,0 @@
-//
-//  ActiveRecordProxy.swift
-//  Swifter
-//  Copyright (c) 2014 Damian Kołakowski. All rights reserved.
-//
-
-import Foundation
-
-enum ActiveRecordType {
-    case String, Integer
-}
-
-protocol ActiveRecordProxy {
-    func scheme() -> [String: [String: ActiveRecordType]];
-    
-    func createTable(name: String, columns: [String: ActiveRecordType], error: NSError) -> Bool;
-    func deleteTable(name: String, error: NSError) -> Bool;
-    
-    func insertColumn(table: String, column: String, error: NSError) -> Bool;
-    func deleteColumn(table: String, column: String, error: NSError) -> Bool;
-    
-    func copyColumn(table: String, from: String, to: String, error: NSError) -> Bool;
-    
-    func insertRow(table: String, value: [String: String], error: NSError) -> Int;
-    func deleteRow(table: String, id: Int, error: NSError) -> Bool;
-}

+ 0 - 67
Common/ActiveRecord/SQLiteProxy.swift

@@ -1,67 +0,0 @@
-//
-//  SQLiteProxy.swift
-//  Swifter
-//  Copyright (c) 2014 Damian Kołakowski. All rights reserved.
-//
-
-import Foundation
-
-class SQLiteActiveRecordProxy: ActiveRecordProxy {
-
-    let databaseName: String
-
-    init(name: String) {
-        databaseName = name
-    }
-    
-    func execute(statment: String, iteratorCallback: (COpaquePointer -> Void) ) -> Void {
-        var databasePointer = COpaquePointer()
-        if ( SQLITE_OK == databaseName.withCString { sqlite3_open($0, &databasePointer) } ) {
-            var statmentPointer = COpaquePointer()
-            if ( SQLITE_OK == statment.withCString { sqlite3_prepare(databasePointer, $0, Int32(strlen($0)), &statmentPointer, nil) } ) {
-                while ( sqlite3_step(statmentPointer) == SQLITE_ROW ) { iteratorCallback(statmentPointer) }
-                sqlite3_finalize(statmentPointer);
-            }
-            sqlite3_close(databasePointer);
-        }
-    }
-
-    func scheme() -> [String: [String: ActiveRecordType]] {
-        var tables = [String]()
-        execute("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;") {
-            let pointer = sqlite3_column_text($0, 0)
-            if let name = String.fromCString(UnsafePointer<CChar>(COpaquePointer(pointer))) { tables.append(name) }
-        }
-        //TODO get columns
-        var result = [String: [String: ActiveRecordType]]()
-        return result
-    }
-    
-    func createTable(name: String, columns: [String: ActiveRecordType], error: NSError) -> Bool {
-        return false
-    }
-    
-    func deleteTable(name: String, error: NSError) -> Bool {
-        return false
-    }
-    
-    func insertColumn(table: String, column: String, error: NSError) -> Bool {
-        return false
-    }
-    
-    func deleteColumn(table: String, column: String, error: NSError) -> Bool {
-        return false
-    }
-    
-    func copyColumn(table: String, from: String, to: String, error: NSError) -> Bool {
-        return false
-    }
-    
-    func insertRow(table: String, value: [String: String], error: NSError) -> Int {
-        return 0
-    }
-    
-    func deleteRow(table: String, id: Int, error: NSError) -> Bool {
-        return false
-    }
-}

+ 2 - 2
Common/ActiveRecord/ActiveRecord.swift → Common/ActiveRecord/SwifterActiveRecord.swift

@@ -13,10 +13,10 @@ struct SwifterActiveRecordField {
 class SwifterActiveRecord<T: NSObject> {
     
     init() {
-        let properties = scheme()
+
     }
     
-    private func scheme() -> [SwifterActiveRecordField] {
+    private func scheme(error: NSErrorPointer?) -> [SwifterActiveRecordField] {
         var results = [SwifterActiveRecordField]()
         let classInfoDump = reflect(self)
         for var index = 1; index < classInfoDump.count; ++index {

+ 26 - 0
Common/ActiveRecord/SwifterDatabaseProxy.swift

@@ -0,0 +1,26 @@
+//
+//  ActiveRecordProxy.swift
+//  Swifter
+//  Copyright (c) 2014 Damian Kołakowski. All rights reserved.
+//
+
+import Foundation
+
+enum SwifterDatabseProxyType {
+    case String, Integer, Float, Unknown
+}
+
+protocol SwifterDatabseProxy {
+    func scheme(error: NSErrorPointer?) -> [String: [(String, SwifterDatabseProxyType)]]?;
+    
+    func createTable(name: String, columns: [String: SwifterDatabseProxyType], error: NSErrorPointer?) -> Bool;
+    func deleteTable(name: String, error: NSErrorPointer?) -> Bool;
+    
+    func insertColumn(table: String, column: String, error: NSErrorPointer?) -> Bool;
+    func deleteColumn(table: String, column: String, error: NSErrorPointer?) -> Bool;
+    
+    func copyColumn(table: String, from: String, to: String, error: NSErrorPointer?) -> Bool;
+    
+    func insertRow(table: String, value: [String: String], error: NSErrorPointer?) -> Int;
+    func deleteRow(table: String, id: Int, error: NSErrorPointer?) -> Bool;
+}

+ 169 - 0
Common/ActiveRecord/SwifterSQLiteDatabaseProxy.swift

@@ -0,0 +1,169 @@
+//
+//  SQLiteProxy.swift
+//  Swifter
+//  Copyright (c) 2014 Damian Kołakowski. All rights reserved.
+//
+
+import Foundation
+
+class SQLiteSequenceElement {
+    
+    let statmentPointer: COpaquePointer
+    
+    init(pointer: COpaquePointer) {
+        self.statmentPointer = pointer
+    }
+    
+    func string(column: Int32) -> String {
+        if let value = String.fromCString(UnsafePointer<CChar>(sqlite3_column_text(statmentPointer, column))) {
+            return value
+        }
+        /// Should never happend :)
+        /// From 'String.fromCString' documentation:
+        /// Returns `nil` if the `CString` is `NULL` or if it contains ill-formed
+        /// UTF-8 code unit sequences.
+        return "????"
+    }
+    
+    func integer(column: Int32) -> Int32 {
+        return sqlite3_column_int(statmentPointer, column)
+    }
+    
+    func integer(column: Int32) -> Double {
+        return sqlite3_column_double(statmentPointer, column)
+    }
+}
+
+class SQLiteSequenceGenarator: GeneratorType {
+    
+    let statmentPointer: COpaquePointer
+    
+    init(pointer: COpaquePointer) {
+        self.statmentPointer = pointer
+    }
+    
+    func next() -> SQLiteSequenceElement? {
+        if ( sqlite3_step(statmentPointer) == SQLITE_ROW ) {
+            return SQLiteSequenceElement(pointer: statmentPointer)
+        }
+        sqlite3_finalize(statmentPointer)
+        return nil
+    }
+}
+
+class SQLiteSequence: SequenceType {
+    
+    var statmentPointer = COpaquePointer()
+    
+    init?(database: COpaquePointer, statment: String, error: NSErrorPointer? = nil) {
+        let result = statment.withCString { sqlite3_prepare(database, $0, Int32(strlen($0)), &self.statmentPointer, nil) };
+        if result != SQLITE_OK {
+            if let error = error { error.memory = err("Can't prepare statment: \(statment), Error: \(result)") }
+            return nil
+        }
+    }
+    
+    func err(reason: String) -> NSError {
+        return NSError(domain: "SQLiteSequence", code: 0, userInfo: [NSLocalizedDescriptionKey : reason])
+    }
+    
+    func generate() -> SQLiteSequenceGenarator {
+        return SQLiteSequenceGenarator(pointer: statmentPointer)
+    }
+}
+
+class SQLiteStatement: StringLiteralConvertible {
+    
+    typealias ExtendedGraphemeClusterLiteralType = StringLiteralType
+    typealias UnicodeScalarLiteralType = UnicodeScalarType
+    
+    let sqlStatment: String
+    
+    init(value: String) {
+        self.sqlStatment = value
+    }
+    
+    required init(unicodeScalarLiteral value: UnicodeScalarLiteralType) {
+        self.sqlStatment = value
+    }
+    
+    required init(extendedGraphemeClusterLiteral value: ExtendedGraphemeClusterLiteralType) {
+        self.sqlStatment = value
+    }
+    
+    required init(stringLiteral value: StringLiteralType) {
+        self.sqlStatment = value
+    }
+    
+    func execute(databse: COpaquePointer, error: NSErrorPointer? = nil) -> SQLiteSequence? {
+        return SQLiteSequence(database: databse, statment: sqlStatment, error: error)
+    }
+}
+
+class SwifterSQLiteDatabaseProxy: SwifterDatabseProxy {
+
+    let databaseName: String
+    let typesMap = [ "TEXT": SwifterDatabseProxyType.String, "INT": .Integer, "REAL": .Float]
+    
+    init(name: String) {
+        databaseName = name
+    }
+    
+    func err(reason: String) -> NSError {
+        return NSError(domain: "SwifterSQLiteDatabaseProxy", code: 0, userInfo: [NSLocalizedDescriptionKey : reason])
+    }
+    
+    func scheme(error: NSErrorPointer?) -> [String: [(String, SwifterDatabseProxyType)]]? {
+        var database = COpaquePointer()
+        if ( SQLITE_OK != databaseName.withCString { sqlite3_open($0, &database) } ) {
+            if let e = error { e.memory = err("Cant' open databse: \(databaseName)") }
+            return nil
+        }
+        var scheme = [String: [(String, SwifterDatabseProxyType)]]()
+        let tablesQuery: SQLiteStatement = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;";
+        if let tables = tablesQuery.execute(database, error: error) {
+            for table in map(tables, { $0.string(0) }) {
+                if let columns = SQLiteStatement(value: "PRAGMA table_info('\(table)');").execute(database, error: error) {
+                    scheme[table] = map(columns) {
+                        if let swifterType = self.typesMap[$0.string(2)] { return ($0.string(1), swifterType) }
+                        return ($0.string(1), SwifterDatabseProxyType.Unknown)
+                    }
+                }
+            }
+            sqlite3_close(database)
+            return scheme
+        } else {
+            sqlite3_close(database)
+            if let e = error { e.memory = err("Cant' query tables databse: \(tablesQuery)") }
+            return nil
+        }
+    }
+    
+    func createTable(name: String, columns: [String: SwifterDatabseProxyType], error: NSErrorPointer?) -> Bool {
+        return false
+    }
+    
+    func deleteTable(name: String, error: NSErrorPointer?) -> Bool {
+        return false
+    }
+    
+    func insertColumn(table: String, column: String, error: NSErrorPointer?) -> Bool {
+        return false
+    }
+    
+    func deleteColumn(table: String, column: String, error: NSErrorPointer?) -> Bool {
+        return false
+    }
+    
+    func copyColumn(table: String, from: String, to: String, error: NSErrorPointer?) -> Bool {
+        return false
+    }
+    
+    func insertRow(table: String, value: [String: String], error: NSErrorPointer?) -> Int {
+        return 0
+    }
+    
+    func deleteRow(table: String, id: Int, error: NSErrorPointer?) -> Bool {
+        return false
+    }
+}

+ 18 - 18
Swifter.xcodeproj/project.pbxproj

@@ -7,8 +7,8 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
-		7C6A510E1A149859004924B5 /* ActiveRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C6A510D1A149859004924B5 /* ActiveRecord.swift */; };
-		7C6A510F1A149859004924B5 /* ActiveRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C6A510D1A149859004924B5 /* ActiveRecord.swift */; };
+		7C6A510E1A149859004924B5 /* SwifterActiveRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C6A510D1A149859004924B5 /* SwifterActiveRecord.swift */; };
+		7C6A510F1A149859004924B5 /* SwifterActiveRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C6A510D1A149859004924B5 /* SwifterActiveRecord.swift */; };
 		7C71C5B01A1D52F800682BF0 /* login.html in CopyFiles */ = {isa = PBXBuildFile; fileRef = 98630C061A1C9A9D00478D08 /* login.html */; };
 		7C71C5B11A1EC49B00682BF0 /* logo.png in CopyFiles */ = {isa = PBXBuildFile; fileRef = 7CB102DF1A17381D00CBA3B4 /* logo.png */; };
 		7C839B7419422CFF003A6950 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C839B7319422CFF003A6950 /* AppDelegate.swift */; };
@@ -17,10 +17,10 @@
 		7C839B7B19422CFF003A6950 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7C839B7A19422CFF003A6950 /* Images.xcassets */; };
 		7C8B260C1A23878F00566475 /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C8B260B1A23878F00566475 /* libsqlite3.dylib */; };
 		7C8B260E1A23879500566475 /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C8B260D1A23879500566475 /* libsqlite3.dylib */; };
-		7C8B262B1A238E2F00566475 /* SQLiteProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C8B262A1A238E2F00566475 /* SQLiteProxy.swift */; };
-		7C8B262C1A238E2F00566475 /* SQLiteProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C8B262A1A238E2F00566475 /* SQLiteProxy.swift */; };
-		7C8B262E1A238E6F00566475 /* ActiveRecordProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C8B262D1A238E6F00566475 /* ActiveRecordProxy.swift */; };
-		7C8B262F1A238E6F00566475 /* ActiveRecordProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C8B262D1A238E6F00566475 /* ActiveRecordProxy.swift */; };
+		7C8B262B1A238E2F00566475 /* SwifterSQLiteDatabaseProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C8B262A1A238E2F00566475 /* SwifterSQLiteDatabaseProxy.swift */; };
+		7C8B262C1A238E2F00566475 /* SwifterSQLiteDatabaseProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C8B262A1A238E2F00566475 /* SwifterSQLiteDatabaseProxy.swift */; };
+		7C8B262E1A238E6F00566475 /* SwifterDatabaseProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C8B262D1A238E6F00566475 /* SwifterDatabaseProxy.swift */; };
+		7C8B262F1A238E6F00566475 /* SwifterDatabaseProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C8B262D1A238E6F00566475 /* SwifterDatabaseProxy.swift */; };
 		7CA4813E19A2EA8D0030B30D /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CA4813D19A2EA8D0030B30D /* main.swift */; };
 		7CA4814E19A2EED00030B30D /* HttpParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CA4814A19A2EED00030B30D /* HttpParser.swift */; };
 		7CA4814F19A2EED00030B30D /* HttpParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CA4814A19A2EED00030B30D /* HttpParser.swift */; };
@@ -58,7 +58,7 @@
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
-		7C6A510D1A149859004924B5 /* ActiveRecord.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActiveRecord.swift; sourceTree = "<group>"; };
+		7C6A510D1A149859004924B5 /* SwifterActiveRecord.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwifterActiveRecord.swift; sourceTree = "<group>"; };
 		7C839B6E19422CFF003A6950 /* Swifter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Swifter.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		7C839B7219422CFF003A6950 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		7C839B7319422CFF003A6950 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
@@ -69,8 +69,8 @@
 		7C8B260D1A23879500566475 /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libsqlite3.dylib; sourceTree = DEVELOPER_DIR; };
 		7C8B26241A238D4500566475 /* Swifter-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Swifter-Bridging-Header.h"; sourceTree = "<group>"; };
 		7C8B26251A238D4500566475 /* SwifterOSX-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SwifterOSX-Bridging-Header.h"; sourceTree = "<group>"; };
-		7C8B262A1A238E2F00566475 /* SQLiteProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SQLiteProxy.swift; sourceTree = "<group>"; };
-		7C8B262D1A238E6F00566475 /* ActiveRecordProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActiveRecordProxy.swift; sourceTree = "<group>"; };
+		7C8B262A1A238E2F00566475 /* SwifterSQLiteDatabaseProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwifterSQLiteDatabaseProxy.swift; sourceTree = "<group>"; };
+		7C8B262D1A238E6F00566475 /* SwifterDatabaseProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwifterDatabaseProxy.swift; sourceTree = "<group>"; };
 		7CA4813B19A2EA8D0030B30D /* SwifterOSX */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = SwifterOSX; sourceTree = BUILT_PRODUCTS_DIR; };
 		7CA4813D19A2EA8D0030B30D /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = "<group>"; };
 		7CA4814A19A2EED00030B30D /* HttpParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HttpParser.swift; sourceTree = "<group>"; };
@@ -108,11 +108,11 @@
 		7C6A510C1A149843004924B5 /* ActiveRecord */ = {
 			isa = PBXGroup;
 			children = (
-				7C6A510D1A149859004924B5 /* ActiveRecord.swift */,
-				7C8B262D1A238E6F00566475 /* ActiveRecordProxy.swift */,
+				7C8B262A1A238E2F00566475 /* SwifterSQLiteDatabaseProxy.swift */,
+				7C8B262D1A238E6F00566475 /* SwifterDatabaseProxy.swift */,
+				7C6A510D1A149859004924B5 /* SwifterActiveRecord.swift */,
 				7C8B26241A238D4500566475 /* Swifter-Bridging-Header.h */,
 				7C8B26251A238D4500566475 /* SwifterOSX-Bridging-Header.h */,
-				7C8B262A1A238E2F00566475 /* SQLiteProxy.swift */,
 			);
 			path = ActiveRecord;
 			sourceTree = "<group>";
@@ -285,15 +285,15 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				7C6A510E1A149859004924B5 /* ActiveRecord.swift in Sources */,
+				7C6A510E1A149859004924B5 /* SwifterActiveRecord.swift in Sources */,
 				7CA4815019A2EED00030B30D /* HttpResponse.swift in Sources */,
 				7CB102DA1A1664B200CBA3B4 /* HttpHandlers.swift in Sources */,
 				7CB102DD1A167FFA00CBA3B4 /* DemoServer.swift in Sources */,
 				7C839B7619422CFF003A6950 /* ViewController.swift in Sources */,
 				7CA4815419A2EED00030B30D /* Socket.swift in Sources */,
 				7CA4815219A2EED00030B30D /* HttpServer.swift in Sources */,
-				7C8B262E1A238E6F00566475 /* ActiveRecordProxy.swift in Sources */,
-				7C8B262B1A238E2F00566475 /* SQLiteProxy.swift in Sources */,
+				7C8B262E1A238E6F00566475 /* SwifterDatabaseProxy.swift in Sources */,
+				7C8B262B1A238E2F00566475 /* SwifterSQLiteDatabaseProxy.swift in Sources */,
 				7CA4814E19A2EED00030B30D /* HttpParser.swift in Sources */,
 				7CA4815B19A2F6A60030B30D /* HttpRequest.swift in Sources */,
 				7C839B7419422CFF003A6950 /* AppDelegate.swift in Sources */,
@@ -308,12 +308,12 @@
 				7CB102DE1A1680EA00CBA3B4 /* DemoServer.swift in Sources */,
 				7CA4814F19A2EED00030B30D /* HttpParser.swift in Sources */,
 				7CA4815519A2EED00030B30D /* Socket.swift in Sources */,
-				7C8B262C1A238E2F00566475 /* SQLiteProxy.swift in Sources */,
-				7C6A510F1A149859004924B5 /* ActiveRecord.swift in Sources */,
+				7C8B262C1A238E2F00566475 /* SwifterSQLiteDatabaseProxy.swift in Sources */,
+				7C6A510F1A149859004924B5 /* SwifterActiveRecord.swift in Sources */,
 				7CA4815319A2EED00030B30D /* HttpServer.swift in Sources */,
 				7CA4813E19A2EA8D0030B30D /* main.swift in Sources */,
 				7CB102DB1A16657200CBA3B4 /* HttpHandlers.swift in Sources */,
-				7C8B262F1A238E6F00566475 /* ActiveRecordProxy.swift in Sources */,
+				7C8B262F1A238E6F00566475 /* SwifterDatabaseProxy.swift in Sources */,
 				7CA4815C19A2F6A60030B30D /* HttpRequest.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;

BIN
Swifter.xcodeproj/project.xcworkspace/xcuserdata/damiankolakowski.xcuserdatad/UserInterfaceState.xcuserstate


+ 127 - 79
Swifter.xcodeproj/xcuserdata/damiankolakowski.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -585,8 +585,8 @@
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "86"
             endingLineNumber = "86"
-            landmarkName = "HttpServer"
-            landmarkType = "3">
+            landmarkName = "writeResponse(_:response:keepAlive:)"
+            landmarkType = "5">
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
@@ -721,7 +721,7 @@
             shouldBeEnabled = "No"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
-            filePath = "Common/ActiveRecord/ActiveRecordProxy.swift"
+            filePath = "Common/ActiveRecord/SwifterDatabaseProxy.swift"
             timestampString = "438537864.654188"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
@@ -732,15 +732,15 @@
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            shouldBeEnabled = "Yes"
+            shouldBeEnabled = "No"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "SwifterOSX/main.swift"
-            timestampString = "438945000.908855"
+            timestampString = "439934407.772606"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "13"
-            endingLineNumber = "13">
+            startingLineNumber = "15"
+            endingLineNumber = "15">
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
@@ -749,13 +749,13 @@
             shouldBeEnabled = "No"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
-            filePath = "Common/ActiveRecord/SQLiteProxy.swift"
-            timestampString = "438981295.838168"
+            filePath = "Common/ActiveRecord/SwifterSQLiteDatabaseProxy.swift"
+            timestampString = "439934881.370643"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "29"
-            endingLineNumber = "29"
-            landmarkName = "scheme()"
+            startingLineNumber = "116"
+            endingLineNumber = "116"
+            landmarkName = "scheme(_:)"
             landmarkType = "5">
             <Locations>
                <Location
@@ -795,13 +795,13 @@
             shouldBeEnabled = "No"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
-            filePath = "Common/ActiveRecord/SQLiteProxy.swift"
-            timestampString = "438981295.838168"
+            filePath = "Common/ActiveRecord/SwifterSQLiteDatabaseProxy.swift"
+            timestampString = "439934881.370643"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "29"
-            endingLineNumber = "29"
-            landmarkName = "scheme()"
+            startingLineNumber = "116"
+            endingLineNumber = "116"
+            landmarkName = "scheme(_:)"
             landmarkType = "5">
             <Locations>
                <Location
@@ -855,44 +855,14 @@
             shouldBeEnabled = "No"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
-            filePath = "Common/ActiveRecord/SQLiteProxy.swift"
-            timestampString = "438981295.838168"
+            filePath = "Common/ActiveRecord/SwifterSQLiteDatabaseProxy.swift"
+            timestampString = "439934881.370643"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "31"
-            endingLineNumber = "31"
-            landmarkName = "scheme()"
+            startingLineNumber = "117"
+            endingLineNumber = "117"
+            landmarkName = "scheme(_:)"
             landmarkType = "5">
-            <Locations>
-               <Location
-                  shouldBeEnabled = "No"
-                  ignoreCount = "0"
-                  continueAfterRunningActions = "No"
-                  symbolName = "SwifterOSX.SQLiteActiveRecordProxy.scheme (SwifterOSX.SQLiteActiveRecordProxy)() -&gt; Swift.Dictionary&lt;Swift.String, Swift.Dictionary&lt;Swift.String, SwifterOSX.ActiveRecordType&gt;&gt;"
-                  moduleName = "SwifterOSX"
-                  urlString = "file:///Users/damiankolakowski/Desktop/swifter/Common/ActiveRecord/SQLiteProxy.swift"
-                  timestampString = "438979660.68089"
-                  startingColumnNumber = "9223372036854775807"
-                  endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "39"
-                  endingLineNumber = "39"
-                  offsetFromSymbolStart = "110">
-               </Location>
-               <Location
-                  shouldBeEnabled = "No"
-                  ignoreCount = "0"
-                  continueAfterRunningActions = "No"
-                  symbolName = "SwifterOSX.SQLiteActiveRecordProxy.(scheme (SwifterOSX.SQLiteActiveRecordProxy) -&gt; () -&gt; Swift.Dictionary&lt;Swift.String, Swift.Dictionary&lt;Swift.String, SwifterOSX.ActiveRecordType&gt;&gt;).(closure #1)"
-                  moduleName = "SwifterOSX"
-                  urlString = "file:///Users/damiankolakowski/Desktop/swifter/Common/ActiveRecord/SQLiteProxy.swift"
-                  timestampString = "438979660.68104"
-                  startingColumnNumber = "9223372036854775807"
-                  endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "39"
-                  endingLineNumber = "39"
-                  offsetFromSymbolStart = "8">
-               </Location>
-            </Locations>
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
@@ -901,13 +871,29 @@
             shouldBeEnabled = "No"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
-            filePath = "Common/ActiveRecord/SQLiteProxy.swift"
-            timestampString = "438979667.950649"
+            filePath = "Common/ActiveRecord/SwifterSQLiteDatabaseProxy.swift"
+            timestampString = "439934083.043208"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "18"
-            endingLineNumber = "18"
-            landmarkName = "execute(_:iteratorCallback:)"
+            startingLineNumber = "103"
+            endingLineNumber = "103"
+            landmarkName = "SwifterSQLiteDatabaseProxy"
+            landmarkType = "3">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "Common/ActiveRecord/SwifterSQLiteDatabaseProxy.swift"
+            timestampString = "439934881.370643"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "116"
+            endingLineNumber = "116"
+            landmarkName = "scheme(_:)"
             landmarkType = "5">
          </BreakpointContent>
       </BreakpointProxy>
@@ -917,13 +903,13 @@
             shouldBeEnabled = "No"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
-            filePath = "Common/ActiveRecord/SQLiteProxy.swift"
-            timestampString = "438981308.004935"
+            filePath = "Common/ActiveRecord/SwifterSQLiteDatabaseProxy.swift"
+            timestampString = "439931696.615275"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "30"
-            endingLineNumber = "30"
-            landmarkName = "scheme()"
+            startingLineNumber = "71"
+            endingLineNumber = "71"
+            landmarkName = "generate()"
             landmarkType = "5">
          </BreakpointContent>
       </BreakpointProxy>
@@ -933,45 +919,107 @@
             shouldBeEnabled = "No"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
-            filePath = "Common/ActiveRecord/SQLiteProxy.swift"
-            timestampString = "438981309.211495"
+            filePath = "Common/ActiveRecord/SwifterSQLiteDatabaseProxy.swift"
+            timestampString = "439931696.615275"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "32"
-            endingLineNumber = "32"
-            landmarkName = "scheme()"
+            startingLineNumber = "59"
+            endingLineNumber = "59"
+            landmarkName = "init(database:statment:error:)"
             landmarkType = "5">
             <Locations>
                <Location
                   shouldBeEnabled = "No"
                   ignoreCount = "0"
                   continueAfterRunningActions = "No"
-                  symbolName = "SwifterOSX.SQLiteActiveRecordProxy.(scheme (SwifterOSX.SQLiteActiveRecordProxy) -&gt; () -&gt; Swift.Dictionary&lt;Swift.String, Swift.Dictionary&lt;Swift.String, SwifterOSX.ActiveRecordType&gt;&gt;).(closure #1)"
+                  symbolName = "SwifterOSX.SQLiteSequence.init (SwifterOSX.SQLiteSequence.Type)(database : Swift.COpaquePointer, statment : Swift.String, error : Swift.Optional&lt;Swift.AutoreleasingUnsafeMutablePointer&lt;Swift.Optional&lt;ObjectiveC.NSError&gt;&gt;&gt;) -&gt; Swift.Optional&lt;SwifterOSX.SQLiteSequence&gt;"
                   moduleName = "SwifterOSX"
-                  urlString = "file:///Users/damiankolakowski/Desktop/swifter/Common/ActiveRecord/SQLiteProxy.swift"
-                  timestampString = "438981445.794237"
+                  urlString = "file:///Users/damiankolakowski/Desktop/swifter/Common/ActiveRecord/SwifterSQLiteDatabaseProxy.swift"
+                  timestampString = "439934307.229626"
                   startingColumnNumber = "9223372036854775807"
                   endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "32"
-                  endingLineNumber = "32"
-                  offsetFromSymbolStart = "19">
+                  startingLineNumber = "59"
+                  endingLineNumber = "59"
+                  offsetFromSymbolStart = "114">
                </Location>
                <Location
                   shouldBeEnabled = "No"
                   ignoreCount = "0"
                   continueAfterRunningActions = "No"
-                  symbolName = "SwifterOSX.SQLiteActiveRecordProxy.(scheme (SwifterOSX.SQLiteActiveRecordProxy) -&gt; () -&gt; Swift.Dictionary&lt;Swift.String, Swift.Dictionary&lt;Swift.String, SwifterOSX.ActiveRecordType&gt;&gt;).(closure #1)"
+                  symbolName = "SwifterOSX.SQLiteSequence.(init (SwifterOSX.SQLiteSequence.Type) -&gt; (database : Swift.COpaquePointer, statment : Swift.String, error : Swift.Optional&lt;Swift.AutoreleasingUnsafeMutablePointer&lt;Swift.Optional&lt;ObjectiveC.NSError&gt;&gt;&gt;) -&gt; Swift.Optional&lt;SwifterOSX.SQLiteSequence&gt;).(closure #1)"
                   moduleName = "SwifterOSX"
-                  urlString = "file:///Users/damiankolakowski/Desktop/swifter/Common/ActiveRecord/SQLiteProxy.swift"
-                  timestampString = "438981445.794367"
+                  urlString = "file:///Users/damiankolakowski/Desktop/swifter/Common/ActiveRecord/SwifterSQLiteDatabaseProxy.swift"
+                  timestampString = "439934307.229793"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "59"
+                  endingLineNumber = "59"
+                  offsetFromSymbolStart = "23">
+               </Location>
+               <Location
+                  shouldBeEnabled = "No"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "reabstraction thunk helper from @callee_owned (@unowned Swift.UnsafePointer&lt;Swift.Int8&gt;) -&gt; (@unowned Swift.Int32) to @callee_owned (@unowned Swift.UnsafePointer&lt;Swift.Int8&gt;) -&gt; (@out Swift.Int32)"
+                  moduleName = "SwifterOSX"
+                  urlString = "file:///Users/damiankolakowski/Desktop/swifter/Common/ActiveRecord/SwifterSQLiteDatabaseProxy.swift"
+                  timestampString = "439934307.229924"
                   startingColumnNumber = "9223372036854775807"
                   endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "32"
-                  endingLineNumber = "32"
-                  offsetFromSymbolStart = "25">
+                  startingLineNumber = "59"
+                  endingLineNumber = "59"
+                  offsetFromSymbolStart = "11">
                </Location>
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "Common/ActiveRecord/SwifterSQLiteDatabaseProxy.swift"
+            timestampString = "439931696.615275"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "46"
+            endingLineNumber = "46"
+            landmarkName = "next()"
+            landmarkType = "5">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "Common/ActiveRecord/SwifterSQLiteDatabaseProxy.swift"
+            timestampString = "439934881.370643"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "126"
+            endingLineNumber = "126"
+            landmarkName = "scheme(_:)"
+            landmarkType = "5">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "Common/ActiveRecord/SwifterSQLiteDatabaseProxy.swift"
+            timestampString = "439934313.6599"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "60"
+            endingLineNumber = "60"
+            landmarkName = "init(database:statment:error:)"
+            landmarkType = "5">
+         </BreakpointContent>
+      </BreakpointProxy>
    </Breakpoints>
 </Bucket>

+ 24 - 0
Swifter.xcodeproj/xcuserdata/damiankolakowski.xcuserdatad/xcschemes/Swifter.xcscheme

@@ -20,6 +20,20 @@
                ReferencedContainer = "container:Swifter.xcodeproj">
             </BuildableReference>
          </BuildActionEntry>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "NO"
+            buildForArchiving = "NO"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "7CE581B41A36D9E300FB840F"
+               BuildableName = "Swifter Tests.xctest"
+               BlueprintName = "Swifter Tests"
+               ReferencedContainer = "container:Swifter.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
       </BuildActionEntries>
    </BuildAction>
    <TestAction
@@ -38,6 +52,16 @@
                ReferencedContainer = "container:Swifter.xcodeproj">
             </BuildableReference>
          </TestableReference>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "7CE581B41A36D9E300FB840F"
+               BuildableName = "Swifter Tests.xctest"
+               BlueprintName = "Swifter Tests"
+               ReferencedContainer = "container:Swifter.xcodeproj">
+            </BuildableReference>
+         </TestableReference>
       </Testables>
       <MacroExpansion>
          <BuildableReference

+ 10 - 0
Swifter.xcodeproj/xcuserdata/damiankolakowski.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -4,6 +4,11 @@
 <dict>
 	<key>SchemeUserState</key>
 	<dict>
+		<key>Swifter Tests.xcscheme</key>
+		<dict>
+			<key>orderHint</key>
+			<integer>2</integer>
+		</dict>
 		<key>Swifter.xcscheme</key>
 		<dict>
 			<key>orderHint</key>
@@ -32,6 +37,11 @@
 			<key>primary</key>
 			<true/>
 		</dict>
+		<key>7CE581B41A36D9E300FB840F</key>
+		<dict>
+			<key>primary</key>
+			<true/>
+		</dict>
 	</dict>
 </dict>
 </plist>

+ 4 - 2
SwifterOSX/main.swift

@@ -6,9 +6,11 @@
 
 import Foundation
 
-let DB = SQLiteActiveRecordProxy(name: "sample.db")
+let DB = SwifterSQLiteDatabaseProxy(name: "sample.db")
 
-let scheme = DB.scheme()
+let scheme = DB.scheme(nil)
+
+println(scheme)
 
 let server = demoServer(NSBundle.mainBundle().resourcePath)