11import SwiftUI
22import Northwind
33import Lighter
4+ import SQLite3
45
56/// Global application state. A good place to setup the database object.
67@main
@@ -9,6 +10,78 @@ struct NorthwindApp: App {
910 let database = ( try ? Northwind . bootstrap (
1011 copying: Northwind . module. connectionHandler. url
1112 ) ) ?? . module!
13+
14+ init ( ) {
15+ lowlevelTests ( )
16+ if #available( iOS 16 , * ) {
17+ try ! regexTests ( )
18+ }
19+ }
20+
21+ @available ( iOS 16 , * )
22+ private func regexTests( ) throws {
23+ // https://unicode-org.github.io/icu/userguide/strings/regexp.html
24+ let products = try database. products. filter {
25+ $0. productName. wholeMatch ( of: /^ \w + \s + \w + $/ ) != nil
26+ }
27+ print ( " Products: " , products. map ( \. productName) )
28+ }
29+
30+ private func lowlevelTests( ) {
31+ let url = database. connectionHandler. url
32+ var db : OpaquePointer ?
33+ let rc = sqlite3_open_v2 (
34+ url. absoluteString, & db,
35+ SQLITE_OPEN_READONLY | SQLITE_OPEN_URI, nil
36+ )
37+ assert ( rc == SQLITE_OK)
38+ defer {
39+ sqlite3_close ( db)
40+ }
41+
42+ let _/* allProducts*/ = sqlite3_products_fetch ( db)
43+
44+ guard let products = sqlite3_products_fetch (
45+ db, sql:
46+ """
47+ SELECT ProductId, ProductName, QuantityPerUnit FROM Products
48+ WHERE QuantityPerUnit LIKE '%boxes%'
49+ """ ,
50+ filter: { _ in true }
51+ ) else {
52+ let error = SQLError ( db)
53+ fatalError ( " FETCH FAILED: \( error) " )
54+ }
55+ print ( " Products: # \( products. count) " )
56+ // products.first?.discontinued
57+
58+ var statement : OpaquePointer ?
59+ let rc2 = sqlite3_prepare_v2 (
60+ db,
61+ """
62+ SELECT ProductId, ProductName, QuantityPerUnit FROM Products
63+ WHERE QuantityPerUnit LIKE ?
64+ """ ,
65+ - 1 , & statement, nil
66+ )
67+ assert ( rc2 == SQLITE_OK)
68+ defer { sqlite3_finalize ( statement) }
69+
70+ let SQLITE_TRANSIENT = unsafeBitCast ( - 1 , to: sqlite3_destructor_type? . self)
71+
72+ sqlite3_bind_text ( statement, 1 , " %boxes% " , - 1 , SQLITE_TRANSIENT)
73+
74+ //let indices = Product.Schema.lookupColumnIndices(in: statement)
75+ var records = [ ( id: Int, name: String ) ] ( )
76+ while sqlite3_step ( statement) == SQLITE_ROW {
77+ let product = Product ( statement)
78+ //let product = Product(statement, indices: indices)
79+ records. append ( ( id: product. id, name: product. productName ) )
80+ }
81+ print ( " RECORDS: # \( records. count) " )
82+
83+ // Abuse it by renaming :-)
84+ }
1285
1386 var body : some Scene {
1487 WindowGroup {
0 commit comments