@@ -590,10 +590,10 @@ public final class Connection {
590
590
deterministic: Bool = false ,
591
591
_ block: @escaping ( _ args: [ Binding ? ] ) -> Binding ? ) {
592
592
let argc = argumentCount. map { Int ( $0) } ?? - 1
593
- let box : Function = { context, argc, argv in
594
- set ( result: block ( getArguments ( argc: argc, argv : argv ) ) , on : context )
593
+ let box : Function = { ( context: Context , argc, argv: Argv ) in
594
+ context . set ( result: block ( argv . getBindings ( argc: argc) ) )
595
595
}
596
- func xFunc( context: OpaquePointer ? , argc: Int32 , value: UnsafeMutablePointer < OpaquePointer ? > ? ) {
596
+ func xFunc( context: Context , argc: Int32 , value: Argv ) {
597
597
unsafeBitCast ( sqlite3_user_data ( context) , to: Function . self) ( context, argc, value)
598
598
}
599
599
let flags = SQLITE_UTF8 | ( deterministic ? SQLITE_DETERMINISTIC : 0 )
@@ -619,7 +619,7 @@ public final class Connection {
619
619
functions [ functionName] ? [ argc] = value
620
620
}
621
621
622
- fileprivate typealias Function = @convention ( block) ( OpaquePointer ? , Int32 , UnsafeMutablePointer < OpaquePointer ? > ? ) -> Void
622
+ fileprivate typealias Function = @convention ( block) ( Context , Int32 , Argv ) -> Void
623
623
fileprivate var functions = [ String: [ Int: Any] ] ( )
624
624
625
625
/// Defines a new collating sequence.
@@ -723,39 +723,45 @@ extension Connection.Location: CustomStringConvertible {
723
723
724
724
}
725
725
726
- func getArguments ( argc : Int32 , argv : UnsafeMutablePointer < OpaquePointer ? > ? ) -> [ Binding ? ] {
727
- ( 0 ..< Int ( argc ) ) . map { idx in
728
- let value = argv! [ idx ]
729
- switch sqlite3_value_type ( value ) {
730
- case SQLITE_BLOB :
731
- return Blob ( bytes: sqlite3_value_blob ( value ) , length : Int ( sqlite3_value_bytes ( value ) ) )
732
- case SQLITE_FLOAT :
733
- return sqlite3_value_double ( value )
734
- case SQLITE_INTEGER :
735
- return sqlite3_value_int64 ( value )
736
- case SQLITE_NULL :
737
- return nil
738
- case SQLITE_TEXT :
739
- return String ( cString : UnsafePointer ( sqlite3_value_text ( value ) ) )
740
- case let type :
741
- fatalError ( " unsupported value type: \( type ) " )
726
+ typealias Context = OpaquePointer ?
727
+ extension Context {
728
+ func set ( result : Binding ? ) {
729
+ switch result {
730
+ case let blob as Blob :
731
+ sqlite3_result_blob ( self , blob . bytes, Int32 ( blob . bytes . count ) , nil )
732
+ case let double as Double :
733
+ sqlite3_result_double ( self , double )
734
+ case let int as Int64 :
735
+ sqlite3_result_int64 ( self , int )
736
+ case let string as String :
737
+ sqlite3_result_text ( self , string , Int32 ( string . lengthOfBytes ( using : . utf8 ) ) , SQLITE_TRANSIENT )
738
+ case . none :
739
+ sqlite3_result_null ( self )
740
+ default :
741
+ fatalError ( " unsupported result type: \( String ( describing : result ) ) " )
742
742
}
743
743
}
744
744
}
745
745
746
- func set( result: Binding ? , on context: OpaquePointer ? ) {
747
- switch result {
748
- case let blob as Blob :
749
- sqlite3_result_blob ( context, blob. bytes, Int32 ( blob. bytes. count) , nil )
750
- case let double as Double :
751
- sqlite3_result_double ( context, double)
752
- case let int as Int64 :
753
- sqlite3_result_int64 ( context, int)
754
- case let string as String :
755
- sqlite3_result_text ( context, string, Int32 ( string. lengthOfBytes ( using: . utf8) ) , SQLITE_TRANSIENT)
756
- case . none:
757
- sqlite3_result_null ( context)
758
- default :
759
- fatalError ( " unsupported result type: \( String ( describing: result) ) " )
746
+ typealias Argv = UnsafeMutablePointer < OpaquePointer ? > ?
747
+ extension Argv {
748
+ func getBindings( argc: Int32 ) -> [ Binding ? ] {
749
+ ( 0 ..< Int ( argc) ) . map { idx in
750
+ let value = self ![ idx]
751
+ switch sqlite3_value_type ( value) {
752
+ case SQLITE_BLOB:
753
+ return Blob ( bytes: sqlite3_value_blob ( value) , length: Int ( sqlite3_value_bytes ( value) ) )
754
+ case SQLITE_FLOAT:
755
+ return sqlite3_value_double ( value)
756
+ case SQLITE_INTEGER:
757
+ return sqlite3_value_int64 ( value)
758
+ case SQLITE_NULL:
759
+ return nil
760
+ case SQLITE_TEXT:
761
+ return String ( cString: UnsafePointer ( sqlite3_value_text ( value) ) )
762
+ case let type:
763
+ fatalError ( " unsupported value type: \( type) " )
764
+ }
765
+ }
760
766
}
761
767
}
0 commit comments