("electronic_mail")
+
+let newRowid = try db.run(users.insert(
+ electronicMail <- "carol@mac.com",
+ age <- 33
+))
diff --git a/SQLite.playground/Documentation/fragment-0.html b/SQLite.playground/Documentation/fragment-0.html
deleted file mode 100644
index ef4c0d87..00000000
--- a/SQLite.playground/Documentation/fragment-0.html
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
- Note
-
- This playground must be running inside the Xcode project to run. Build the iOS framework prior to use.
-
-
- SQLite.swift
-
- This playground contains sample code to explore SQLite.swift , a Swift wrapper for SQLite3 .
-
-
- Let’s get started by importing the framework and opening a new in-memory database connection using the Database class.
-
-
diff --git a/SQLite.playground/Documentation/fragment-1.html b/SQLite.playground/Documentation/fragment-1.html
deleted file mode 100644
index 2d7b55c7..00000000
--- a/SQLite.playground/Documentation/fragment-1.html
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
- This implicitly opens a database in ":memory:". To open a database at a specific location, pass the path as a parameter during instantiation, e.g. , Database("path/to/database.sqlite3"). Pass nil or an empty string ("") to open a temporary, disk-backed database, instead.
-
-
- Once we instantiate a database connection, we can execute SQL statements directly against it. Let’s create a table.
-
-
diff --git a/SQLite.playground/Documentation/fragment-10.html b/SQLite.playground/Documentation/fragment-10.html
deleted file mode 100644
index 1370f6ee..00000000
--- a/SQLite.playground/Documentation/fragment-10.html
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
- From here, we can build a variety of queries. For example, we can build and run an INSERT statement by passing a dictionary of values to the query’s insert function. Let’s add a few new rows this way.
-
-
diff --git a/SQLite.playground/Documentation/fragment-11.html b/SQLite.playground/Documentation/fragment-11.html
deleted file mode 100644
index 7d2267ab..00000000
--- a/SQLite.playground/Documentation/fragment-11.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
- Barely any room for syntax errors!
-
-
- The insert function can return an ID (which will be nil in the case of failure) and the just-run statement. It can also return a Statement object directly, making it easy to run in a transaction.
-
-
diff --git a/SQLite.playground/Documentation/fragment-12.html b/SQLite.playground/Documentation/fragment-12.html
deleted file mode 100644
index 0341e633..00000000
--- a/SQLite.playground/Documentation/fragment-12.html
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
- Query objects can also build SELECT statements. A freshly-subscripted query will select every row (and every column) from a table. Iteration lazily executes the statement.
-
-
diff --git a/SQLite.playground/Documentation/fragment-13.html b/SQLite.playground/Documentation/fragment-13.html
deleted file mode 100644
index 1cbf1f92..00000000
--- a/SQLite.playground/Documentation/fragment-13.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
- You may notice that iteration works a little differently here. Rather than arrays of rows, we are given dictionaries of column names to row values. This gives us a little more powerful of a mapping to work with and pass around.
-
-
- Queries can be used and reused, and can quickly return rows, counts and other aggregate values.
-
-
diff --git a/SQLite.playground/Documentation/fragment-14.html b/SQLite.playground/Documentation/fragment-14.html
deleted file mode 100644
index 75e5e396..00000000
--- a/SQLite.playground/Documentation/fragment-14.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
- Experiment
-
- In addition to first, you can also try plucking the last row from the result set in an optimized fashion.
-
-
- The example above uses the computed variable count, but Query has a count function, as well. (The computed variable is actually a convenience wrapper around count("*").) Try counting the distinct ages in our group of users.
-
-
- Try calling the sum and total functions. Note the differences!
-
-
-
- Queries can be refined using a collection of chainable helper functions. Let’s filter our query to the administrator subset.
-
-
diff --git a/SQLite.playground/Documentation/fragment-15.html b/SQLite.playground/Documentation/fragment-15.html
deleted file mode 100644
index b19d01d4..00000000
--- a/SQLite.playground/Documentation/fragment-15.html
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
- Filtered queries will in turn filter their aggregate functions.
-
-
diff --git a/SQLite.playground/Documentation/fragment-16.html b/SQLite.playground/Documentation/fragment-16.html
deleted file mode 100644
index 177081a3..00000000
--- a/SQLite.playground/Documentation/fragment-16.html
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
- Alongside filter, we can use the select, join, group, order, and limit functions to compose rich queries with relative safety and ease. Let’s say we want to order our results by email, then age, and return no more than three rows.
-
-
diff --git a/SQLite.playground/Documentation/fragment-17.html b/SQLite.playground/Documentation/fragment-17.html
deleted file mode 100644
index 2ba198d7..00000000
--- a/SQLite.playground/Documentation/fragment-17.html
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
- Experiment
-
- Try using the select function to specify which columns are returned.
-
-
- Try using the group function to group users by a column.
-
-
- Try using an alternative order function to return results by a column in descending order.
-
-
- Try using an alternative limit function to add an OFFSET clause to the query.
-
-
-
- We can further filter by chaining additional conditions onto the query. Let’s find administrators that haven’t (yet) provided their ages.
-
-
diff --git a/SQLite.playground/Documentation/fragment-18.html b/SQLite.playground/Documentation/fragment-18.html
deleted file mode 100644
index c6724957..00000000
--- a/SQLite.playground/Documentation/fragment-18.html
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
- Unfortunately, the HR department has ruled that age disclosure is required for administrator responsibilities. We can use our query’s update interface to (temporarily) revoke their privileges while we wait for them to update their profiles.
-
-
diff --git a/SQLite.playground/Documentation/fragment-19.html b/SQLite.playground/Documentation/fragment-19.html
deleted file mode 100644
index c3150e7b..00000000
--- a/SQLite.playground/Documentation/fragment-19.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
- If we ever need to remove rows from our database, we can use the delete function, which will be scoped to a query’s filters. Be careful! You may just want to archive the records, instead.
-
-
- We don’t archive user data at Acme Inc. (we respect privacy, after all), and unfortunately, Alice has decided to move on. We can carefully, carefully scope a query to match her and delete her record.
-
-
diff --git a/SQLite.playground/Documentation/fragment-2.html b/SQLite.playground/Documentation/fragment-2.html
deleted file mode 100644
index acf1bb08..00000000
--- a/SQLite.playground/Documentation/fragment-2.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
- The execute function can run multiple SQL statements at once as a convenience and will throw an assertion failure if an error occurs during execution. This is useful for seeding and migrating databases with well-tested statements that are guaranteed to succeed (or where failure can be graceful and silent).
-
-
- It’s generally safer to prepare SQL statements individually. Let’s instantiate a Statement object and insert a couple rows.
-
-
diff --git a/SQLite.playground/Documentation/fragment-20.html b/SQLite.playground/Documentation/fragment-20.html
deleted file mode 100644
index bea27da9..00000000
--- a/SQLite.playground/Documentation/fragment-20.html
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
- And that’s that.
-
- & More…
-
- We’ve only explored the surface to SQLite.swift. Dive into the code to discover more!
-
-
diff --git a/SQLite.playground/Documentation/fragment-3.html b/SQLite.playground/Documentation/fragment-3.html
deleted file mode 100644
index 8fff27e2..00000000
--- a/SQLite.playground/Documentation/fragment-3.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
- Prepared statements can bind and escape input values safely. In this case, email and admin columns are bound with different values over two executions.
-
-
- The Database class exposes information about recently run queries via several properties: totalChanges returns the total number of changes (inserts, updates, and deletes) since the connection was opened; lastChanges returns the number of changes from the last statement that modified the database; lastID returns the row ID of the last insert.
-
-
diff --git a/SQLite.playground/Documentation/fragment-4.html b/SQLite.playground/Documentation/fragment-4.html
deleted file mode 100644
index 988c0027..00000000
--- a/SQLite.playground/Documentation/fragment-4.html
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
- Querying
-
- Statement objects act as both sequences and generators. We can iterate over a select statement’s rows directly using a for–in loop.
-
-
diff --git a/SQLite.playground/Documentation/fragment-5.html b/SQLite.playground/Documentation/fragment-5.html
deleted file mode 100644
index a66a3352..00000000
--- a/SQLite.playground/Documentation/fragment-5.html
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
- Single, scalar values can be plucked directly from a statement.
-
-
diff --git a/SQLite.playground/Documentation/fragment-6.html b/SQLite.playground/Documentation/fragment-6.html
deleted file mode 100644
index 496e7aad..00000000
--- a/SQLite.playground/Documentation/fragment-6.html
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
- Experiment
-
- Try plucking a single row by taking advantage of the fact that Statement conforms to the GeneratorType protocol.
-
-
- Also try using the Array initializer to return an array of all rows at once.
-
-
- Transactions & Savepoints
-
- Using the transaction and savepoint functions, we can run a series of statements, commiting the changes to the database if they all succeed. If a single statement fails, we bail out early and roll back. In the following example we prepare two statements: one to insert a manager into the database, and one—given a manager’s row ID—to insert a managed user into the database.
-
-
diff --git a/SQLite.playground/Documentation/fragment-7.html b/SQLite.playground/Documentation/fragment-7.html
deleted file mode 100644
index 740dbb2b..00000000
--- a/SQLite.playground/Documentation/fragment-7.html
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
- Arguments sent to transaction are auto-closures and therefore have access to Database information at the time of execution. In this case, we insert Dolly, a supervisor, and immediately reference her row ID when we insert her assistant, Emery.
-
-
diff --git a/SQLite.playground/Documentation/fragment-8.html b/SQLite.playground/Documentation/fragment-8.html
deleted file mode 100644
index a5e1c9b2..00000000
--- a/SQLite.playground/Documentation/fragment-8.html
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
- Our database has a uniqueness constraint on email address, so let’s see what happens when we insert Fiona, who also claims to be managing Emery.
-
-
diff --git a/SQLite.playground/Documentation/fragment-9.html b/SQLite.playground/Documentation/fragment-9.html
deleted file mode 100644
index 56a46575..00000000
--- a/SQLite.playground/Documentation/fragment-9.html
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
- This time, our transaction fails because Emery has already been added to the database. The addition of Fiona has been rolled back, and we’ll need to get to the bottom of this discrepancy (or make some schematic changes to our database to allow for multiple managers per user).
-
-
- Experiment
-
- Transactions can’t be nested, but savepoints can! Try calling the savepoint function instead, which shares semantics with transaction, but can successfully run in layers.
-
-
- Query Building
-
- In order to both minimize the risk of SQL syntax errors and maximize our ability to quickly access data, SQLite.swift exposes a query-building interface via the Query struct. We can access this interface by subscripting our database connection with a table name.
-
-
diff --git a/SQLite.playground/Documentation/style-1.1.15.css b/SQLite.playground/Documentation/style-1.1.15.css
deleted file mode 100644
index 12485e1d..00000000
--- a/SQLite.playground/Documentation/style-1.1.15.css
+++ /dev/null
@@ -1,65 +0,0 @@
-html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,
-abbr,acronym,address,big,cite,code,del,dfn,em,figure,font,img,ins,kbd,q,s,
-samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,
-fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td {
- border: 0;
- font-size: 100%;
- margin: 0;
- outline: 0;
- padding: 0;
- vertical-align: baseline
-}
-body {
- background-color: rgba(255,255,255,0.65);
- color: rgba(0,0,0,1);
- font-family: Helvetica,sans-serif;
- font-size: 62.5%;
- margin-left: 15px;
-}
-section {
- padding: 20px 25px 20px 35px
-}
-h3 {
- color: rgba(128,128,128,1);
- display: block;
- font-size: 2.2em;
- font-weight: 100;
- margin-bottom: 15px;
- margin-top: 20px;
-}
-p {
- color: rgba(65,65,65,1);
- font-size: 1.4em;
- line-height: 145%;
- margin-bottom: 5px;
-}
-a {
- color: rgba(0,136,204,1);
- text-decoration: none
-}
-code {
- color: rgba(128,128,128,1);
- font-family: Menlo,monospace;
- font-size: .9em;
- word-wrap: break-word
-}
-h4 {
- color: rgba(128,128,128,1);
- font-size: .6em;
- font-weight: normal;
- letter-spacing: 2px;
- margin-bottom: 8px;
- text-transform: uppercase
-}
-aside {
- background-color: rgba(249,249,249,1);
- border-left: 5px solid rgba(238,238,238,1);
- font-size: 1.2em;
- margin: 25px 45px 35px 35px;
- padding: 15px 15px 7px;
-
-}
-aside p {
- font-size: 1em;
- margin-bottom: 8px
-}
diff --git a/SQLite.playground/contents.xcplayground b/SQLite.playground/contents.xcplayground
index 22659c1e..441c60ef 100644
--- a/SQLite.playground/contents.xcplayground
+++ b/SQLite.playground/contents.xcplayground
@@ -1,47 +1,4 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/SQLite.playground/playground.xcworkspace/contents.xcworkspacedata b/SQLite.playground/playground.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..919434a6
--- /dev/null
+++ b/SQLite.playground/playground.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/SQLite.playground/section-10.swift b/SQLite.playground/section-10.swift
deleted file mode 100644
index 316672a1..00000000
--- a/SQLite.playground/section-10.swift
+++ /dev/null
@@ -1,3 +0,0 @@
-for row in db.prepare("SELECT id, email FROM users") {
- println("id: \(row[0]), email: \(row[1])")
-}
diff --git a/SQLite.playground/section-12.swift b/SQLite.playground/section-12.swift
deleted file mode 100644
index 1f20c4a6..00000000
--- a/SQLite.playground/section-12.swift
+++ /dev/null
@@ -1,4 +0,0 @@
-let count = db.prepare("SELECT count(*) FROM users")
-count.scalar()
-
-db.scalar("SELECT email FROM users WHERE ID = ?", 1)
diff --git a/SQLite.playground/section-14.swift b/SQLite.playground/section-14.swift
deleted file mode 100644
index 2d93a99e..00000000
--- a/SQLite.playground/section-14.swift
+++ /dev/null
@@ -1,2 +0,0 @@
-let sr = db.prepare("INSERT INTO users (email, admin) VALUES (?, 1)")
-let jr = db.prepare("INSERT INTO users (email, admin, manager_id) VALUES (?, 0, ?)")
diff --git a/SQLite.playground/section-16.swift b/SQLite.playground/section-16.swift
deleted file mode 100644
index 5dea58c8..00000000
--- a/SQLite.playground/section-16.swift
+++ /dev/null
@@ -1,5 +0,0 @@
-db.transaction(
- sr.run("dolly@acme.com"),
- jr.run("emery@acme.com", db.lastID)
-)
-count.scalar()
diff --git a/SQLite.playground/section-18.swift b/SQLite.playground/section-18.swift
deleted file mode 100644
index e361ea74..00000000
--- a/SQLite.playground/section-18.swift
+++ /dev/null
@@ -1,8 +0,0 @@
-let txn = db.transaction(
- sr.run("fiona@acme.com"),
- jr.run("emery@acme.com", db.lastID)
-)
-count.scalar()
-
-txn.failed
-txn.reason
diff --git a/SQLite.playground/section-2.swift b/SQLite.playground/section-2.swift
deleted file mode 100644
index e033f90b..00000000
--- a/SQLite.playground/section-2.swift
+++ /dev/null
@@ -1,3 +0,0 @@
-import SQLite
-
-let db = Database()
diff --git a/SQLite.playground/section-20.swift b/SQLite.playground/section-20.swift
deleted file mode 100644
index 624a7098..00000000
--- a/SQLite.playground/section-20.swift
+++ /dev/null
@@ -1 +0,0 @@
-let users = db["users"]
diff --git a/SQLite.playground/section-22.swift b/SQLite.playground/section-22.swift
deleted file mode 100644
index 08b03fa3..00000000
--- a/SQLite.playground/section-22.swift
+++ /dev/null
@@ -1,3 +0,0 @@
-users.insert(["email": "giles@acme.com", "age": 42, "admin": true]).ID
-users.insert(["email": "haley@acme.com", "age": 30, "admin": true]).ID
-users.insert(["email": "inigo@acme.com", "age": 24, "admin": false]).ID
diff --git a/SQLite.playground/section-24.swift b/SQLite.playground/section-24.swift
deleted file mode 100644
index e5be28c9..00000000
--- a/SQLite.playground/section-24.swift
+++ /dev/null
@@ -1,4 +0,0 @@
-db.transaction(
- users.insert(["email": "julie@acme.com"]),
- users.insert(["email": "kelly@acme.com", "manager_id": db.lastID])
-)
diff --git a/SQLite.playground/section-26.swift b/SQLite.playground/section-26.swift
deleted file mode 100644
index 104bdcb3..00000000
--- a/SQLite.playground/section-26.swift
+++ /dev/null
@@ -1,4 +0,0 @@
-// SELECT * FROM users
-for user in users {
- println(user["email"])
-}
diff --git a/SQLite.playground/section-28.swift b/SQLite.playground/section-28.swift
deleted file mode 100644
index 273a695d..00000000
--- a/SQLite.playground/section-28.swift
+++ /dev/null
@@ -1,9 +0,0 @@
-// SELECT * FROM users LIMIT 1
-users.first
-
-// SELECT count(*) FROM users
-users.count
-
-users.min("age")
-users.max("age")
-users.average("age")
diff --git a/SQLite.playground/section-30.swift b/SQLite.playground/section-30.swift
deleted file mode 100644
index 113d778a..00000000
--- a/SQLite.playground/section-30.swift
+++ /dev/null
@@ -1 +0,0 @@
-let admins = users.filter(["admin": true])
diff --git a/SQLite.playground/section-32.swift b/SQLite.playground/section-32.swift
deleted file mode 100644
index 86b2bf20..00000000
--- a/SQLite.playground/section-32.swift
+++ /dev/null
@@ -1,2 +0,0 @@
-// SELECT count(*) FROM users WHERE admin = 1
-admins.count
diff --git a/SQLite.playground/section-34.swift b/SQLite.playground/section-34.swift
deleted file mode 100644
index 9f4c2743..00000000
--- a/SQLite.playground/section-34.swift
+++ /dev/null
@@ -1,6 +0,0 @@
-let ordered = admins.order("email", "age").limit(3)
-
-// SELECT * FROM users WHERE admin = 1 ORDER BY email ASC, age ASC LIMIT 3
-for admin in ordered {
- println(admin)
-}
diff --git a/SQLite.playground/section-36.swift b/SQLite.playground/section-36.swift
deleted file mode 100644
index 469e6ce6..00000000
--- a/SQLite.playground/section-36.swift
+++ /dev/null
@@ -1,4 +0,0 @@
-let agelessAdmins = admins.filter(["age": nil])
-
-// SELECT count(*) FROM users WHERE admin = 1 AND age IS NULL
-agelessAdmins.count
diff --git a/SQLite.playground/section-38.swift b/SQLite.playground/section-38.swift
deleted file mode 100644
index fafcc454..00000000
--- a/SQLite.playground/section-38.swift
+++ /dev/null
@@ -1,2 +0,0 @@
-// UPDATE users SET admin = 0 WHERE admin = 1 AND age IS NULL
-agelessAdmins.update(["admin": false]).changes
diff --git a/SQLite.playground/section-4.swift b/SQLite.playground/section-4.swift
deleted file mode 100644
index f8807857..00000000
--- a/SQLite.playground/section-4.swift
+++ /dev/null
@@ -1,10 +0,0 @@
-db.execute(
- "CREATE TABLE users (" +
- "id INTEGER PRIMARY KEY, " +
- "email TEXT NOT NULL UNIQUE, " +
- "age INTEGER, " +
- "admin BOOLEAN NOT NULL DEFAULT 0 CHECK (admin IN (0, 1)), " +
- "manager_id INTEGER, " +
- "FOREIGN KEY(manager_id) REFERENCES users(id)" +
- ")"
-)
diff --git a/SQLite.playground/section-40.swift b/SQLite.playground/section-40.swift
deleted file mode 100644
index 24b77750..00000000
--- a/SQLite.playground/section-40.swift
+++ /dev/null
@@ -1 +0,0 @@
-users.filter(["email": "alice@acme.com"]).delete().changes
diff --git a/SQLite.playground/section-6.swift b/SQLite.playground/section-6.swift
deleted file mode 100644
index b3fd3a1f..00000000
--- a/SQLite.playground/section-6.swift
+++ /dev/null
@@ -1,4 +0,0 @@
-let stmt = db.prepare("INSERT INTO users (email, admin) VALUES (?, ?)")
-for (email, admin) in ["alice@acme.com": true, "betsy@acme.com": false] {
- stmt.run(email, admin)
-}
diff --git a/SQLite.playground/section-8.swift b/SQLite.playground/section-8.swift
deleted file mode 100644
index e2330502..00000000
--- a/SQLite.playground/section-8.swift
+++ /dev/null
@@ -1,3 +0,0 @@
-db.totalChanges
-db.lastChanges
-db.lastID
diff --git a/SQLite.swift.podspec b/SQLite.swift.podspec
new file mode 100644
index 00000000..73c6f705
--- /dev/null
+++ b/SQLite.swift.podspec
@@ -0,0 +1,78 @@
+Pod::Spec.new do |s|
+ s.name = "SQLite.swift"
+ s.version = "0.15.4"
+ s.summary = "A type-safe, Swift-language layer over SQLite3."
+
+ s.description = <<-DESC
+ SQLite.swift provides compile-time confidence in SQL statement syntax and
+ intent.
+ DESC
+
+ s.homepage = "https://github.com/stephencelis/SQLite.swift"
+ s.license = 'MIT'
+ s.author = { "Stephen Celis" => "stephen@stephencelis.com" }
+ s.source = { :git => "https://github.com/stephencelis/SQLite.swift.git", :tag => s.version.to_s }
+ s.social_media_url = 'https://twitter.com/stephencelis'
+
+ s.module_name = 'SQLite'
+ s.default_subspec = 'standard'
+ s.swift_versions = ['5']
+
+ s.ios.deployment_target = '12.0'
+ s.tvos.deployment_target = '12.0'
+ s.osx.deployment_target = '10.13'
+ s.watchos.deployment_target = '4.0'
+ s.visionos.deployment_target = '1.0'
+
+ s.subspec 'standard' do |ss|
+ ss.source_files = 'Sources/SQLite/**/*.{c,h,m,swift}'
+ ss.exclude_files = 'Sources/**/Cipher.swift'
+ ss.library = 'sqlite3'
+ ss.resource_bundle = { 'SQLite.swift' => 'Sources/SQLite/PrivacyInfo.xcprivacy' }
+
+ ss.test_spec 'tests' do |test_spec|
+ test_spec.resources = 'Tests/SQLiteTests/Resources/*'
+ test_spec.source_files = 'Tests/SQLiteTests/*.swift'
+ end
+ end
+
+ s.subspec 'standalone' do |ss|
+ ss.source_files = 'Sources/SQLite/**/*.{c,h,m,swift}'
+ ss.exclude_files = 'Sources/**/Cipher.swift'
+ ss.resource_bundle = { 'SQLite.swift' => 'Sources/SQLite/PrivacyInfo.xcprivacy' }
+
+ ss.xcconfig = {
+ 'OTHER_SWIFT_FLAGS' => '$(inherited) -DSQLITE_SWIFT_STANDALONE',
+ 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) SQLITE_SWIFT_STANDALONE=1'
+ }
+ ss.dependency 'sqlite3'
+
+ ss.test_spec 'tests' do |test_spec|
+ test_spec.resources = 'Tests/SQLiteTests/Resources/*'
+ test_spec.source_files = 'Tests/SQLiteTests/*.swift'
+ end
+ end
+
+ s.subspec 'SQLCipher' do |ss|
+ # Disable unsupported visionOS
+ # https://github.com/sqlcipher/sqlcipher/issues/483
+ ss.ios.deployment_target = s.deployment_target(:ios)
+ ss.tvos.deployment_target = s.deployment_target(:tvos)
+ ss.osx.deployment_target = s.deployment_target(:osx)
+ ss.watchos.deployment_target = s.deployment_target(:watchos)
+
+ ss.source_files = 'Sources/SQLite/**/*.{c,h,m,swift}'
+ ss.resource_bundle = { 'SQLite.swift' => 'Sources/SQLite/PrivacyInfo.xcprivacy' }
+
+ ss.xcconfig = {
+ 'OTHER_SWIFT_FLAGS' => '$(inherited) -DSQLITE_SWIFT_SQLCIPHER',
+ 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) SQLITE_HAS_CODEC=1 SQLITE_SWIFT_SQLCIPHER=1'
+ }
+ ss.dependency 'SQLCipher', '>= 4.0.0'
+
+ ss.test_spec 'tests' do |test_spec|
+ test_spec.resources = 'Tests/SQLiteTests/Resources/*'
+ test_spec.source_files = 'Tests/SQLiteTests/*.swift'
+ end
+ end
+end
diff --git a/SQLite.xcodeproj/project.pbxproj b/SQLite.xcodeproj/project.pbxproj
index d75fa8eb..ec0423e9 100644
--- a/SQLite.xcodeproj/project.pbxproj
+++ b/SQLite.xcodeproj/project.pbxproj
@@ -7,787 +7,2093 @@
objects = {
/* Begin PBXBuildFile section */
- DC0FA83219D87CA3009F3A35 /* SQLite-Bridging-Header.h in Headers */ = {isa = PBXBuildFile; fileRef = DC0FA83119D87CA3009F3A35 /* SQLite-Bridging-Header.h */; settings = {ATTRIBUTES = (Private, ); }; };
- DC0FA83319D87CA3009F3A35 /* SQLite-Bridging-Header.h in Headers */ = {isa = PBXBuildFile; fileRef = DC0FA83119D87CA3009F3A35 /* SQLite-Bridging-Header.h */; settings = {ATTRIBUTES = (Private, ); }; };
- DC0FA83719D87E0C009F3A35 /* SQLite-Bridging.c in Sources */ = {isa = PBXBuildFile; fileRef = DC0FA83519D87E0C009F3A35 /* SQLite-Bridging.c */; };
- DC0FA83819D87E0C009F3A35 /* SQLite-Bridging.c in Sources */ = {isa = PBXBuildFile; fileRef = DC0FA83519D87E0C009F3A35 /* SQLite-Bridging.c */; };
- DC0FA83919D87E0C009F3A35 /* SQLite-Bridging.h in Headers */ = {isa = PBXBuildFile; fileRef = DC0FA83619D87E0C009F3A35 /* SQLite-Bridging.h */; settings = {ATTRIBUTES = (Private, ); }; };
- DC0FA83A19D87E0C009F3A35 /* SQLite-Bridging.h in Headers */ = {isa = PBXBuildFile; fileRef = DC0FA83619D87E0C009F3A35 /* SQLite-Bridging.h */; settings = {ATTRIBUTES = (Private, ); }; };
- DC3773F919C8CBB3004FCF85 /* SQLite iOS.h in Headers */ = {isa = PBXBuildFile; fileRef = DC3773F819C8CBB3004FCF85 /* SQLite iOS.h */; settings = {ATTRIBUTES = (Public, ); }; };
- DC3773FF19C8CBB3004FCF85 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC3773F319C8CBB3004FCF85 /* SQLite.framework */; };
- DC37741919C8CC2F004FCF85 /* SQLite Mac.h in Headers */ = {isa = PBXBuildFile; fileRef = DC37741819C8CC2F004FCF85 /* SQLite Mac.h */; settings = {ATTRIBUTES = (Public, ); }; };
- DC37741F19C8CC2F004FCF85 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC37741419C8CC2F004FCF85 /* SQLite.framework */; };
- DC37743519C8D626004FCF85 /* Database.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC37743419C8D626004FCF85 /* Database.swift */; };
- DC37743619C8D626004FCF85 /* Database.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC37743419C8D626004FCF85 /* Database.swift */; };
- DC37743819C8D693004FCF85 /* Datatype.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC37743719C8D693004FCF85 /* Datatype.swift */; };
- DC37743919C8D693004FCF85 /* Datatype.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC37743719C8D693004FCF85 /* Datatype.swift */; };
- DC37743B19C8D6C0004FCF85 /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC37743A19C8D6C0004FCF85 /* Statement.swift */; };
- DC37743C19C8D6C0004FCF85 /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC37743A19C8D6C0004FCF85 /* Statement.swift */; };
- DC37744319C8DC91004FCF85 /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = DC37744219C8DC91004FCF85 /* libsqlite3.dylib */; };
- DC37744519C8DCA1004FCF85 /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = DC37744419C8DCA1004FCF85 /* libsqlite3.dylib */; };
- DCAD429719E2E0F1004A51DF /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCAD429619E2E0F1004A51DF /* Query.swift */; };
- DCAD429819E2E0F1004A51DF /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCAD429619E2E0F1004A51DF /* Query.swift */; };
- DCAD429A19E2EE50004A51DF /* QueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCAD429919E2EE50004A51DF /* QueryTests.swift */; };
- DCAD429B19E2EE50004A51DF /* QueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCAD429919E2EE50004A51DF /* QueryTests.swift */; };
- DCF37F8219DDAC2D001534AA /* DatabaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCF37F8119DDAC2D001534AA /* DatabaseTests.swift */; };
- DCF37F8319DDAC2D001534AA /* DatabaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCF37F8119DDAC2D001534AA /* DatabaseTests.swift */; };
- DCF37F8519DDAF3F001534AA /* StatementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCF37F8419DDAF3F001534AA /* StatementTests.swift */; };
- DCF37F8619DDAF3F001534AA /* StatementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCF37F8419DDAF3F001534AA /* StatementTests.swift */; };
- DCF37F8819DDAF79001534AA /* TestHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCF37F8719DDAF79001534AA /* TestHelper.swift */; };
- DCF37F8919DDAF79001534AA /* TestHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCF37F8719DDAF79001534AA /* TestHelper.swift */; };
+ 02A43A9822738CF100FEC494 /* Backup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02A43A9722738CF100FEC494 /* Backup.swift */; };
+ 02A43A9922738CF100FEC494 /* Backup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02A43A9722738CF100FEC494 /* Backup.swift */; };
+ 02A43A9A22738CF100FEC494 /* Backup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02A43A9722738CF100FEC494 /* Backup.swift */; };
+ 02A43A9B22738CF100FEC494 /* Backup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02A43A9722738CF100FEC494 /* Backup.swift */; };
+ 03A65E641C6BB0F60062603F /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03A65E5A1C6BB0F50062603F /* SQLite.framework */; };
+ 03A65E721C6BB2D30062603F /* SQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AD61C3F04ED00AE3E12 /* SQLite.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 03A65E731C6BB2D80062603F /* Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF71C3F06E900AE3E12 /* Foundation.swift */; };
+ 03A65E741C6BB2DA0062603F /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF81C3F06E900AE3E12 /* Helpers.swift */; };
+ 03A65E761C6BB2E60062603F /* Blob.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEE1C3F06E900AE3E12 /* Blob.swift */; };
+ 03A65E771C6BB2E60062603F /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEF1C3F06E900AE3E12 /* Connection.swift */; };
+ 03A65E7A1C6BB2F70062603F /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF21C3F06E900AE3E12 /* Statement.swift */; };
+ 03A65E7B1C6BB2F70062603F /* Value.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF31C3F06E900AE3E12 /* Value.swift */; };
+ 03A65E7C1C6BB2F70062603F /* FTS4.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF51C3F06E900AE3E12 /* FTS4.swift */; };
+ 03A65E7D1C6BB2F70062603F /* RTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF61C3F06E900AE3E12 /* RTree.swift */; };
+ 03A65E7E1C6BB2FB0062603F /* AggregateFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFA1C3F06E900AE3E12 /* AggregateFunctions.swift */; };
+ 03A65E7F1C6BB2FB0062603F /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFB1C3F06E900AE3E12 /* Collation.swift */; };
+ 03A65E801C6BB2FB0062603F /* CoreFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFC1C3F06E900AE3E12 /* CoreFunctions.swift */; };
+ 03A65E811C6BB2FB0062603F /* CustomFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFD1C3F06E900AE3E12 /* CustomFunctions.swift */; };
+ 03A65E821C6BB2FB0062603F /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFE1C3F06E900AE3E12 /* Expression.swift */; };
+ 03A65E831C6BB2FB0062603F /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFF1C3F06E900AE3E12 /* Operators.swift */; };
+ 03A65E841C6BB2FB0062603F /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B001C3F06E900AE3E12 /* Query.swift */; };
+ 03A65E851C6BB2FB0062603F /* Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B011C3F06E900AE3E12 /* Schema.swift */; };
+ 03A65E861C6BB2FB0062603F /* Setter.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B021C3F06E900AE3E12 /* Setter.swift */; };
+ 03A65E951C6BB3030062603F /* TestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B161C3F127200AE3E12 /* TestHelpers.swift */; };
+ 03A65E971C6BB3210062603F /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 03A65E961C6BB3210062603F /* libsqlite3.tbd */; };
+ 19A17018F250343BD0F9F4B0 /* Connection+Pragmas.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17F285B767BFACD96714B /* Connection+Pragmas.swift */; };
+ 19A17021286A4D8D6C2EF12D /* ConnectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17855BD524FF888265B3C /* ConnectionTests.swift */; };
+ 19A17026DCDCDA405B09A229 /* Connection+AttachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A170C08525D3D27CB5F83C /* Connection+AttachTests.swift */; };
+ 19A17073552293CA063BEA66 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17E723300E5ED3771DCB5 /* Result.swift */; };
+ 19A1708D3D58D7BC1168E55F /* CipherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1787E16C8562C09C076F5 /* CipherTests.swift */; };
+ 19A1709C3E7A406E62293B2A /* Fixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17B93B48B5560E6E51791 /* Fixtures.swift */; };
+ 19A170ACC97B19730FB7BA4D /* Connection+Aggregation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A175A9CB446640AE6F2200 /* Connection+Aggregation.swift */; };
+ 19A170AEBAA56DC3355A73B3 /* DateAndTimeFunctionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A178AEF32ABC8BF2993FB5 /* DateAndTimeFunctionTests.swift */; };
+ 19A170C56745F9D722A73D77 /* AggregateFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17613F00A3F4D4A257A04 /* AggregateFunctionsTests.swift */; };
+ 19A170D938343E30119EDFB3 /* RowTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A174FE5B47A97937A27276 /* RowTests.swift */; };
+ 19A1714F7CF964D568AB14E0 /* BlobTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A171A2ED4E2640F197F48C /* BlobTests.swift */; };
+ 19A17152E32A9585831E3FE0 /* DateAndTimeFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17BA55DABB480F9020C8A /* DateAndTimeFunctions.swift */; };
+ 19A1716BF8E15F91A6B5CB7A /* CustomFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17F2B5959B212A33C383F /* CustomFunctionsTests.swift */; };
+ 19A1717B10CC941ACB5533D6 /* FTS5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1730E4390C775C25677D1 /* FTS5.swift */; };
+ 19A17188B4D96636F9C0C209 /* Connection+SchemaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17CA1DF7D0F7C9A94C51C /* Connection+SchemaTests.swift */; };
+ 19A171F12AB8B07F2FD7201A /* Cipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A178A39ACA9667A62663CC /* Cipher.swift */; };
+ 19A171F243A589C5EBC47937 /* OperatorsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17475DCA068453F787613 /* OperatorsTests.swift */; };
+ 19A1725658E480B9B378F28B /* Connection+SchemaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17CA1DF7D0F7C9A94C51C /* Connection+SchemaTests.swift */; };
+ 19A1726002D24C14F876C8FE /* ValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17AE284BB1DF31D1B753E /* ValueTests.swift */; };
+ 19A172F71EFD65342072D8D2 /* SchemaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A171A7714C6524093255C5 /* SchemaTests.swift */; };
+ 19A173088B85A7E18E8582A7 /* FTSIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17BE1CC4AD4036BAB8EE0 /* FTSIntegrationTests.swift */; };
+ 19A173389E53CB24DFA8CEDD /* QueryIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17CAE60446607E99C22A6 /* QueryIntegrationTests.swift */; };
+ 19A173465F23C64DF3DF469B /* ConnectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17855BD524FF888265B3C /* ConnectionTests.swift */; };
+ 19A173668D948AD4DF1F5352 /* DateAndTimeFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17BA55DABB480F9020C8A /* DateAndTimeFunctions.swift */; };
+ 19A1737286A74F3CF7412906 /* DateAndTimeFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17BA55DABB480F9020C8A /* DateAndTimeFunctions.swift */; };
+ 19A173EFEF0B3BD0B3ED406C /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17E723300E5ED3771DCB5 /* Result.swift */; };
+ 19A173F25449876761347072 /* Connection+AttachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A170C08525D3D27CB5F83C /* Connection+AttachTests.swift */; };
+ 19A173F429D7E46289EB2167 /* ResultTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1745BE8623D8C6808DB3C /* ResultTests.swift */; };
+ 19A17408007B182F884E3A53 /* Fixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17B93B48B5560E6E51791 /* Fixtures.swift */; };
+ 19A1740EACD47904AA24B8DC /* SchemaDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17268AE67B746B96AC125 /* SchemaDefinitions.swift */; };
+ 19A17411403D60640467209E /* ExpressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A170F141BF21946D159083 /* ExpressionTests.swift */; };
+ 19A174118D11B93DA5DAAF79 /* DateAndTimeFunctionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A178AEF32ABC8BF2993FB5 /* DateAndTimeFunctionTests.swift */; };
+ 19A17437659BD7FD787D94A6 /* CustomAggregationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A177EF5E2D91BA86DA4480 /* CustomAggregationTests.swift */; };
+ 19A17444861E1443143DEB44 /* FTS4Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1715904F7B6851FCB5EF6 /* FTS4Tests.swift */; };
+ 19A174506543905D71BF0518 /* Connection+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A170A97B51DC5EE365F3C5 /* Connection+Schema.swift */; };
+ 19A17457B0461F484AF6BE40 /* CustomFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17F2B5959B212A33C383F /* CustomFunctionsTests.swift */; };
+ 19A17482E6FC5E563F3E6A47 /* OperatorsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17475DCA068453F787613 /* OperatorsTests.swift */; };
+ 19A17490543609FCED53CACC /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1710E73A46D5AC721CDA9 /* Errors.swift */; };
+ 19A1750CEE9B05267995CF3D /* FTS5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1730E4390C775C25677D1 /* FTS5.swift */; };
+ 19A1750EF4A5F92954A451FF /* Connection+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A170A97B51DC5EE365F3C5 /* Connection+Schema.swift */; };
+ 19A1755C49154C87304C9146 /* FTSIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17BE1CC4AD4036BAB8EE0 /* FTSIntegrationTests.swift */; };
+ 19A1760CE25615CA015E2E5F /* Connection+Pragmas.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17F285B767BFACD96714B /* Connection+Pragmas.swift */; };
+ 19A176376CB6A94759F7980A /* Connection+Aggregation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A175A9CB446640AE6F2200 /* Connection+Aggregation.swift */; };
+ 19A1766135CE9786B1878603 /* ValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17AE284BB1DF31D1B753E /* ValueTests.swift */; };
+ 19A1766AC10D13C4EFF349AD /* SchemaChangerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17FDB0B0CFB8987906FD0 /* SchemaChangerTests.swift */; };
+ 19A176B3316281F004F92276 /* RowTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A174FE5B47A97937A27276 /* RowTests.swift */; };
+ 19A177290558991BCC60E4E3 /* SchemaChanger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A171B262DDE8718513CFDA /* SchemaChanger.swift */; };
+ 19A1772EBE65173EDFB1AFCA /* CustomAggregationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A177EF5E2D91BA86DA4480 /* CustomAggregationTests.swift */; };
+ 19A1773155AC2BF2CA86A473 /* SetterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1709D5BDD2691BA160012 /* SetterTests.swift */; };
+ 19A1773A335CAB9D0AE14E8E /* SchemaChanger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A171B262DDE8718513CFDA /* SchemaChanger.swift */; };
+ 19A17746150A815944A6820B /* SelectTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17EC0C43015063945D32E /* SelectTests.swift */; };
+ 19A1776BD5127DFDF847FF1F /* FTS5Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17B96EBD42C878E609CDC /* FTS5Tests.swift */; };
+ 19A177909023B7B940C5805E /* FTSIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17BE1CC4AD4036BAB8EE0 /* FTSIntegrationTests.swift */; };
+ 19A177AA5922527BBDC77CF9 /* QueryIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17CAE60446607E99C22A6 /* QueryIntegrationTests.swift */; };
+ 19A177C25834473FAB32CF3B /* SchemaChangerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17FDB0B0CFB8987906FD0 /* SchemaChangerTests.swift */; };
+ 19A177D5C6542E2D572162E5 /* QueryIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17CAE60446607E99C22A6 /* QueryIntegrationTests.swift */; };
+ 19A178072B371489E6A1E839 /* FoundationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1794CC4D7827E997E32A7 /* FoundationTests.swift */; };
+ 19A1781CBA8968ABD3E00877 /* ExpressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A170F141BF21946D159083 /* ExpressionTests.swift */; };
+ 19A1782444437C7FC6B75CBC /* BlobTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A171A2ED4E2640F197F48C /* BlobTests.swift */; };
+ 19A17835FD5886FDC5A3228F /* Cipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A178A39ACA9667A62663CC /* Cipher.swift */; };
+ 19A178767223229E61C5066F /* FTS4Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1715904F7B6851FCB5EF6 /* FTS4Tests.swift */; };
+ 19A17885B646CB0201BE4BD5 /* QueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A171ED017645C8B04DF9F2 /* QueryTests.swift */; };
+ 19A178A8B2A34FB6B565DEDA /* Connection+Pragmas.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17F285B767BFACD96714B /* Connection+Pragmas.swift */; };
+ 19A178C041DDCF80B533AD13 /* BlobTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A171A2ED4E2640F197F48C /* BlobTests.swift */; };
+ 19A178DA2BB5970778CCAF13 /* FTS5Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17B96EBD42C878E609CDC /* FTS5Tests.swift */; };
+ 19A178DF5A96CFEFF1E271F6 /* AggregateFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17613F00A3F4D4A257A04 /* AggregateFunctionsTests.swift */; };
+ 19A178F9008614B8A8425635 /* Connection+PragmaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17C60D3464461057E4D63 /* Connection+PragmaTests.swift */; };
+ 19A17900387FDCF578B31E3E /* OperatorsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17475DCA068453F787613 /* OperatorsTests.swift */; };
+ 19A17912DB9D3AC8FECF948B /* ResultTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1745BE8623D8C6808DB3C /* ResultTests.swift */; };
+ 19A17923494236793893BF72 /* StatementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1756EB81E9F7F45B12A78 /* StatementTests.swift */; };
+ 19A1792C0520D4E83C2EB075 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1710E73A46D5AC721CDA9 /* Errors.swift */; };
+ 19A1793972BDDDB027C113BB /* CustomAggregationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A177EF5E2D91BA86DA4480 /* CustomAggregationTests.swift */; };
+ 19A179786A6826D58A70F8BC /* AggregateFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17613F00A3F4D4A257A04 /* AggregateFunctionsTests.swift */; };
+ 19A17986405D9A875698408F /* Connection+Pragmas.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17F285B767BFACD96714B /* Connection+Pragmas.swift */; };
+ 19A1799AF6643CF5081BFA15 /* DateAndTimeFunctionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A178AEF32ABC8BF2993FB5 /* DateAndTimeFunctionTests.swift */; };
+ 19A179B59450FE7C4811AB8A /* Connection+Aggregation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A175A9CB446640AE6F2200 /* Connection+Aggregation.swift */; };
+ 19A179BB9A6665B2B99DA546 /* CoreFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17B55F2409B7031443495 /* CoreFunctionsTests.swift */; };
+ 19A179BCD483DEA21661FD37 /* Connection+AttachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A170C08525D3D27CB5F83C /* Connection+AttachTests.swift */; };
+ 19A179CCF9671E345E5A9811 /* Cipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A178A39ACA9667A62663CC /* Cipher.swift */; };
+ 19A179E76EA6207669B60C1B /* Cipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A178A39ACA9667A62663CC /* Cipher.swift */; };
+ 19A17A33EA026C2E2CEBAF36 /* Connection+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A170A97B51DC5EE365F3C5 /* Connection+Schema.swift */; };
+ 19A17A391BF056E3D729E70A /* SchemaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A171A7714C6524093255C5 /* SchemaTests.swift */; };
+ 19A17A52BF29D27C9AA229E7 /* QueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A171ED017645C8B04DF9F2 /* QueryTests.swift */; };
+ 19A17A7B3E3B7E76364A2AEE /* CipherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1787E16C8562C09C076F5 /* CipherTests.swift */; };
+ 19A17A7DF99B0379FD3396B1 /* CustomFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17F2B5959B212A33C383F /* CustomFunctionsTests.swift */; };
+ 19A17A9520802ACF45907970 /* RTreeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17162C9861E5C4900455D /* RTreeTests.swift */; };
+ 19A17ABCF0EB4808BDC5B5FF /* RowTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A174FE5B47A97937A27276 /* RowTests.swift */; };
+ 19A17B0DF1DDB6BBC9C95D64 /* SchemaDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17268AE67B746B96AC125 /* SchemaDefinitions.swift */; };
+ 19A17B1D9B5CEBE9CE09280C /* RTreeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17162C9861E5C4900455D /* RTreeTests.swift */; };
+ 19A17B36ABC6006AB80F693C /* Connection+SchemaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17CA1DF7D0F7C9A94C51C /* Connection+SchemaTests.swift */; };
+ 19A17B62A4125AF4F6014CF5 /* SchemaDefinitionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A176174862D0F0139B3987 /* SchemaDefinitionsTests.swift */; };
+ 19A17BA13FD35F058787B7D3 /* SchemaDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17268AE67B746B96AC125 /* SchemaDefinitions.swift */; };
+ 19A17BACF4C032513DE1F879 /* Connection+PragmaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17C60D3464461057E4D63 /* Connection+PragmaTests.swift */; };
+ 19A17C74233AFC2EDAFA23DC /* ResultTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1745BE8623D8C6808DB3C /* ResultTests.swift */; };
+ 19A17CA4D7B63D845428A9C5 /* StatementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1756EB81E9F7F45B12A78 /* StatementTests.swift */; };
+ 19A17CA6ADB78A2E545BF836 /* CipherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1787E16C8562C09C076F5 /* CipherTests.swift */; };
+ 19A17CF65C0196E03BC64519 /* ConnectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17855BD524FF888265B3C /* ConnectionTests.swift */; };
+ 19A17D1BEABA610ABF003D67 /* SchemaDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17268AE67B746B96AC125 /* SchemaDefinitions.swift */; };
+ 19A17D6EC40BC35A5DC81BA8 /* StatementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1756EB81E9F7F45B12A78 /* StatementTests.swift */; };
+ 19A17D993398B8215B73E1EA /* CoreFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17B55F2409B7031443495 /* CoreFunctionsTests.swift */; };
+ 19A17DAD5975D9367EAA46E2 /* RTreeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17162C9861E5C4900455D /* RTreeTests.swift */; };
+ 19A17DC282E36C4F41AA440B /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1710E73A46D5AC721CDA9 /* Errors.swift */; };
+ 19A17DD33C2E43DD6EE05A60 /* ExpressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A170F141BF21946D159083 /* ExpressionTests.swift */; };
+ 19A17DE1FCDB5695702AD24D /* SelectTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17EC0C43015063945D32E /* SelectTests.swift */; };
+ 19A17DE34C477232592A8F6B /* CoreFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17B55F2409B7031443495 /* CoreFunctionsTests.swift */; };
+ 19A17DF8D4F13A20F5D2269E /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17E723300E5ED3771DCB5 /* Result.swift */; };
+ 19A17DFE05ED8B1F7C45F7EE /* SchemaChanger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A171B262DDE8718513CFDA /* SchemaChanger.swift */; };
+ 19A17E04C4C0956715C5676A /* FoundationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1794CC4D7827E997E32A7 /* FoundationTests.swift */; };
+ 19A17E0ABA6C415F014CD51C /* SetterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1709D5BDD2691BA160012 /* SetterTests.swift */; };
+ 19A17E1DD976D5CE80018749 /* FTS4Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1715904F7B6851FCB5EF6 /* FTS4Tests.swift */; };
+ 19A17E29278A12BC4F542506 /* DateAndTimeFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17BA55DABB480F9020C8A /* DateAndTimeFunctions.swift */; };
+ 19A17E3F47DA087E2B76D087 /* QueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A171ED017645C8B04DF9F2 /* QueryTests.swift */; };
+ 19A17E80F736EEE8EE2AA4CE /* SchemaDefinitionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A176174862D0F0139B3987 /* SchemaDefinitionsTests.swift */; };
+ 19A17EC0D68BA8C03288ADF7 /* FTS5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1730E4390C775C25677D1 /* FTS5.swift */; };
+ 19A17F0BF02896E1664F4090 /* Connection+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A170A97B51DC5EE365F3C5 /* Connection+Schema.swift */; };
+ 19A17F1B3F0A3C96B5ED6D64 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17E723300E5ED3771DCB5 /* Result.swift */; };
+ 19A17F2096E83A3181E03317 /* SchemaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A171A7714C6524093255C5 /* SchemaTests.swift */; };
+ 19A17F60B685636D1F83C2DD /* Fixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17B93B48B5560E6E51791 /* Fixtures.swift */; };
+ 19A17F7977364EC8CD33C3C3 /* SelectTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17EC0C43015063945D32E /* SelectTests.swift */; };
+ 19A17F907258E524B3CA2FAE /* SetterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1709D5BDD2691BA160012 /* SetterTests.swift */; };
+ 19A17FACE8E4D54A50BA934E /* FTS5Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17B96EBD42C878E609CDC /* FTS5Tests.swift */; };
+ 19A17FB80B94E882050AA908 /* FoundationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1794CC4D7827E997E32A7 /* FoundationTests.swift */; };
+ 19A17FBAA26953EB854E790D /* Connection+PragmaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17C60D3464461057E4D63 /* Connection+PragmaTests.swift */; };
+ 19A17FC04708C6ED637DDFD4 /* SchemaChangerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17FDB0B0CFB8987906FD0 /* SchemaChangerTests.swift */; };
+ 19A17FC07731779C1B8506FA /* SchemaChanger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A171B262DDE8718513CFDA /* SchemaChanger.swift */; };
+ 19A17FD22EF43DF428DD93BA /* ValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17AE284BB1DF31D1B753E /* ValueTests.swift */; };
+ 19A17FE78A39E86F330420EC /* SchemaDefinitionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A176174862D0F0139B3987 /* SchemaDefinitionsTests.swift */; };
+ 19A17FF4A10B44D3937C8CAC /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1710E73A46D5AC721CDA9 /* Errors.swift */; };
+ 3D67B3E61DB2469200A4F4C6 /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D67B3E51DB2469200A4F4C6 /* libsqlite3.tbd */; };
+ 3D67B3E71DB246BA00A4F4C6 /* Blob.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEE1C3F06E900AE3E12 /* Blob.swift */; };
+ 3D67B3E81DB246BA00A4F4C6 /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEF1C3F06E900AE3E12 /* Connection.swift */; };
+ 3D67B3E91DB246D100A4F4C6 /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF21C3F06E900AE3E12 /* Statement.swift */; };
+ 3D67B3EA1DB246D100A4F4C6 /* Value.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF31C3F06E900AE3E12 /* Value.swift */; };
+ 3D67B3EB1DB246D100A4F4C6 /* FTS4.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF51C3F06E900AE3E12 /* FTS4.swift */; };
+ 3D67B3EC1DB246D100A4F4C6 /* RTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF61C3F06E900AE3E12 /* RTree.swift */; };
+ 3D67B3ED1DB246D100A4F4C6 /* FTS5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1730E4390C775C25677D1 /* FTS5.swift */; };
+ 3D67B3EE1DB246D100A4F4C6 /* AggregateFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFA1C3F06E900AE3E12 /* AggregateFunctions.swift */; };
+ 3D67B3EF1DB246D100A4F4C6 /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFB1C3F06E900AE3E12 /* Collation.swift */; };
+ 3D67B3F01DB246D100A4F4C6 /* CoreFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFC1C3F06E900AE3E12 /* CoreFunctions.swift */; };
+ 3D67B3F11DB246D100A4F4C6 /* CustomFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFD1C3F06E900AE3E12 /* CustomFunctions.swift */; };
+ 3D67B3F21DB246D100A4F4C6 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFE1C3F06E900AE3E12 /* Expression.swift */; };
+ 3D67B3F31DB246D100A4F4C6 /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFF1C3F06E900AE3E12 /* Operators.swift */; };
+ 3D67B3F41DB246D100A4F4C6 /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B001C3F06E900AE3E12 /* Query.swift */; };
+ 3D67B3F51DB246D100A4F4C6 /* Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B011C3F06E900AE3E12 /* Schema.swift */; };
+ 3D67B3F61DB246D100A4F4C6 /* Setter.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B021C3F06E900AE3E12 /* Setter.swift */; };
+ 3D67B3F71DB246D700A4F4C6 /* Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF71C3F06E900AE3E12 /* Foundation.swift */; };
+ 3D67B3F81DB246D700A4F4C6 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF81C3F06E900AE3E12 /* Helpers.swift */; };
+ 3D67B3FC1DB2471B00A4F4C6 /* SQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AD61C3F04ED00AE3E12 /* SQLite.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 3DF7B78828842972005DD8CA /* Connection+Attach.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DF7B78728842972005DD8CA /* Connection+Attach.swift */; };
+ 3DF7B78928842972005DD8CA /* Connection+Attach.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DF7B78728842972005DD8CA /* Connection+Attach.swift */; };
+ 3DF7B78A28842972005DD8CA /* Connection+Attach.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DF7B78728842972005DD8CA /* Connection+Attach.swift */; };
+ 3DF7B78B28842972005DD8CA /* Connection+Attach.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DF7B78728842972005DD8CA /* Connection+Attach.swift */; };
+ 3DF7B791288449BA005DD8CA /* URIQueryParameter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DF7B790288449BA005DD8CA /* URIQueryParameter.swift */; };
+ 3DF7B792288449BA005DD8CA /* URIQueryParameter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DF7B790288449BA005DD8CA /* URIQueryParameter.swift */; };
+ 3DF7B793288449BA005DD8CA /* URIQueryParameter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DF7B790288449BA005DD8CA /* URIQueryParameter.swift */; };
+ 3DF7B794288449BA005DD8CA /* URIQueryParameter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DF7B790288449BA005DD8CA /* URIQueryParameter.swift */; };
+ 3DF7B79628846FCC005DD8CA /* Resources in Resources */ = {isa = PBXBuildFile; fileRef = 3DF7B79528846FCC005DD8CA /* Resources */; };
+ 3DF7B79828846FED005DD8CA /* Resources in Resources */ = {isa = PBXBuildFile; fileRef = 3DF7B79528846FCC005DD8CA /* Resources */; };
+ 3DF7B79928847055005DD8CA /* Resources in Resources */ = {isa = PBXBuildFile; fileRef = 3DF7B79528846FCC005DD8CA /* Resources */; };
+ 49EB68C41F7B3CB400D89D40 /* Coding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49EB68C31F7B3CB400D89D40 /* Coding.swift */; };
+ 49EB68C51F7B3CB400D89D40 /* Coding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49EB68C31F7B3CB400D89D40 /* Coding.swift */; };
+ 49EB68C61F7B3CB400D89D40 /* Coding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49EB68C31F7B3CB400D89D40 /* Coding.swift */; };
+ 49EB68C71F7B3CB400D89D40 /* Coding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49EB68C31F7B3CB400D89D40 /* Coding.swift */; };
+ 64A8EE432B095FBB00F583F7 /* WindowFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A8EE422B095FBB00F583F7 /* WindowFunctions.swift */; };
+ 64A8EE442B095FBB00F583F7 /* WindowFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A8EE422B095FBB00F583F7 /* WindowFunctions.swift */; };
+ 64A8EE452B095FBB00F583F7 /* WindowFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A8EE422B095FBB00F583F7 /* WindowFunctions.swift */; };
+ 64A8EE462B095FBB00F583F7 /* WindowFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A8EE422B095FBB00F583F7 /* WindowFunctions.swift */; };
+ 64B8E1702B09748000545AFB /* WindowFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64B8E16F2B09748000545AFB /* WindowFunctionsTests.swift */; };
+ 64B8E1712B09748000545AFB /* WindowFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64B8E16F2B09748000545AFB /* WindowFunctionsTests.swift */; };
+ 64B8E1722B09748000545AFB /* WindowFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64B8E16F2B09748000545AFB /* WindowFunctionsTests.swift */; };
+ 997DF2AE287FC06D00F8DF95 /* Query+with.swift in Sources */ = {isa = PBXBuildFile; fileRef = 997DF2AD287FC06D00F8DF95 /* Query+with.swift */; };
+ 997DF2AF287FC06D00F8DF95 /* Query+with.swift in Sources */ = {isa = PBXBuildFile; fileRef = 997DF2AD287FC06D00F8DF95 /* Query+with.swift */; };
+ 997DF2B0287FC06D00F8DF95 /* Query+with.swift in Sources */ = {isa = PBXBuildFile; fileRef = 997DF2AD287FC06D00F8DF95 /* Query+with.swift */; };
+ 997DF2B1287FC06D00F8DF95 /* Query+with.swift in Sources */ = {isa = PBXBuildFile; fileRef = 997DF2AD287FC06D00F8DF95 /* Query+with.swift */; };
+ DB58B21128FB864300F8EEA4 /* SchemaReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB58B21028FB864300F8EEA4 /* SchemaReader.swift */; };
+ DB58B21228FB864300F8EEA4 /* SchemaReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB58B21028FB864300F8EEA4 /* SchemaReader.swift */; };
+ DB58B21328FB864300F8EEA4 /* SchemaReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB58B21028FB864300F8EEA4 /* SchemaReader.swift */; };
+ DB58B21428FB864300F8EEA4 /* SchemaReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB58B21028FB864300F8EEA4 /* SchemaReader.swift */; };
+ DB58B21628FC7C4600F8EEA4 /* SQLiteFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB58B21528FC7C4600F8EEA4 /* SQLiteFeature.swift */; };
+ DB58B21728FC7C4600F8EEA4 /* SQLiteFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB58B21528FC7C4600F8EEA4 /* SQLiteFeature.swift */; };
+ DB58B21828FC7C4600F8EEA4 /* SQLiteFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB58B21528FC7C4600F8EEA4 /* SQLiteFeature.swift */; };
+ DB58B21928FC7C4600F8EEA4 /* SQLiteFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB58B21528FC7C4600F8EEA4 /* SQLiteFeature.swift */; };
+ DB7C5DA628D7C9B6006395CF /* SQLiteVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB7C5DA528D7C9B6006395CF /* SQLiteVersion.swift */; };
+ DB7C5DA728D7C9B6006395CF /* SQLiteVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB7C5DA528D7C9B6006395CF /* SQLiteVersion.swift */; };
+ DB7C5DA828D7C9B6006395CF /* SQLiteVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB7C5DA528D7C9B6006395CF /* SQLiteVersion.swift */; };
+ DB7C5DA928D7C9B6006395CF /* SQLiteVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB7C5DA528D7C9B6006395CF /* SQLiteVersion.swift */; };
+ DBB93D5A2A22A373009BB96E /* SchemaReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBB93D592A22A373009BB96E /* SchemaReaderTests.swift */; };
+ DBB93D5B2A22A373009BB96E /* SchemaReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBB93D592A22A373009BB96E /* SchemaReaderTests.swift */; };
+ DBB93D5C2A22A373009BB96E /* SchemaReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBB93D592A22A373009BB96E /* SchemaReaderTests.swift */; };
+ DEB306BA2B61CEF500F9D46B /* SQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AD61C3F04ED00AE3E12 /* SQLite.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ DEB306BC2B61CEF500F9D46B /* CoreFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFC1C3F06E900AE3E12 /* CoreFunctions.swift */; };
+ DEB306BD2B61CEF500F9D46B /* Coding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49EB68C31F7B3CB400D89D40 /* Coding.swift */; };
+ DEB306BE2B61CEF500F9D46B /* RTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF61C3F06E900AE3E12 /* RTree.swift */; };
+ DEB306BF2B61CEF500F9D46B /* Blob.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEE1C3F06E900AE3E12 /* Blob.swift */; };
+ DEB306C02B61CEF500F9D46B /* URIQueryParameter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DF7B790288449BA005DD8CA /* URIQueryParameter.swift */; };
+ DEB306C12B61CEF500F9D46B /* Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF71C3F06E900AE3E12 /* Foundation.swift */; };
+ DEB306C22B61CEF500F9D46B /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEF1C3F06E900AE3E12 /* Connection.swift */; };
+ DEB306C32B61CEF500F9D46B /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFE1C3F06E900AE3E12 /* Expression.swift */; };
+ DEB306C42B61CEF500F9D46B /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF81C3F06E900AE3E12 /* Helpers.swift */; };
+ DEB306C52B61CEF500F9D46B /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFB1C3F06E900AE3E12 /* Collation.swift */; };
+ DEB306C62B61CEF500F9D46B /* Setter.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B021C3F06E900AE3E12 /* Setter.swift */; };
+ DEB306C72B61CEF500F9D46B /* Connection+Attach.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DF7B78728842972005DD8CA /* Connection+Attach.swift */; };
+ DEB306C82B61CEF500F9D46B /* CustomFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFD1C3F06E900AE3E12 /* CustomFunctions.swift */; };
+ DEB306C92B61CEF500F9D46B /* FTS4.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF51C3F06E900AE3E12 /* FTS4.swift */; };
+ DEB306CA2B61CEF500F9D46B /* Value.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF31C3F06E900AE3E12 /* Value.swift */; };
+ DEB306CB2B61CEF500F9D46B /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFF1C3F06E900AE3E12 /* Operators.swift */; };
+ DEB306CC2B61CEF500F9D46B /* Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B011C3F06E900AE3E12 /* Schema.swift */; };
+ DEB306CD2B61CEF500F9D46B /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B001C3F06E900AE3E12 /* Query.swift */; };
+ DEB306CE2B61CEF500F9D46B /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF21C3F06E900AE3E12 /* Statement.swift */; };
+ DEB306CF2B61CEF500F9D46B /* AggregateFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFA1C3F06E900AE3E12 /* AggregateFunctions.swift */; };
+ DEB306D02B61CEF500F9D46B /* FTS5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1730E4390C775C25677D1 /* FTS5.swift */; };
+ DEB306D12B61CEF500F9D46B /* Cipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A178A39ACA9667A62663CC /* Cipher.swift */; };
+ DEB306D22B61CEF500F9D46B /* Backup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02A43A9722738CF100FEC494 /* Backup.swift */; };
+ DEB306D32B61CEF500F9D46B /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1710E73A46D5AC721CDA9 /* Errors.swift */; };
+ DEB306D42B61CEF500F9D46B /* DateAndTimeFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17BA55DABB480F9020C8A /* DateAndTimeFunctions.swift */; };
+ DEB306D52B61CEF500F9D46B /* SQLiteVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB7C5DA528D7C9B6006395CF /* SQLiteVersion.swift */; };
+ DEB306D62B61CEF500F9D46B /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17E723300E5ED3771DCB5 /* Result.swift */; };
+ DEB306D72B61CEF500F9D46B /* Query+with.swift in Sources */ = {isa = PBXBuildFile; fileRef = 997DF2AD287FC06D00F8DF95 /* Query+with.swift */; };
+ DEB306D82B61CEF500F9D46B /* Connection+Aggregation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A175A9CB446640AE6F2200 /* Connection+Aggregation.swift */; };
+ DEB306D92B61CEF500F9D46B /* SQLiteFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB58B21528FC7C4600F8EEA4 /* SQLiteFeature.swift */; };
+ DEB306DA2B61CEF500F9D46B /* SchemaChanger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A171B262DDE8718513CFDA /* SchemaChanger.swift */; };
+ DEB306DB2B61CEF500F9D46B /* SchemaDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17268AE67B746B96AC125 /* SchemaDefinitions.swift */; };
+ DEB306DC2B61CEF500F9D46B /* Connection+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A170A97B51DC5EE365F3C5 /* Connection+Schema.swift */; };
+ DEB306DD2B61CEF500F9D46B /* Connection+Pragmas.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17F285B767BFACD96714B /* Connection+Pragmas.swift */; };
+ DEB306DE2B61CEF500F9D46B /* SchemaReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB58B21028FB864300F8EEA4 /* SchemaReader.swift */; };
+ DEB306E02B61CEF500F9D46B /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = EE9180931C46EA210038162A /* libsqlite3.tbd */; };
+ DEB306EB2B61CF9500F9D46B /* TestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B161C3F127200AE3E12 /* TestHelpers.swift */; };
+ DEB306EC2B61CF9500F9D46B /* FoundationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1794CC4D7827E997E32A7 /* FoundationTests.swift */; };
+ DEB306ED2B61CF9500F9D46B /* Fixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17B93B48B5560E6E51791 /* Fixtures.swift */; };
+ DEB306EE2B61CF9500F9D46B /* SchemaDefinitionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A176174862D0F0139B3987 /* SchemaDefinitionsTests.swift */; };
+ DEB306EF2B61CF9500F9D46B /* SchemaChangerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17FDB0B0CFB8987906FD0 /* SchemaChangerTests.swift */; };
+ DEB306F02B61CF9500F9D46B /* Connection+SchemaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17CA1DF7D0F7C9A94C51C /* Connection+SchemaTests.swift */; };
+ DEB306F12B61CF9500F9D46B /* FTS5Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17B96EBD42C878E609CDC /* FTS5Tests.swift */; };
+ DEB306F22B61CF9500F9D46B /* FTSIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17BE1CC4AD4036BAB8EE0 /* FTSIntegrationTests.swift */; };
+ DEB306F32B61CF9500F9D46B /* FTS4Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1715904F7B6851FCB5EF6 /* FTS4Tests.swift */; };
+ DEB306F42B61CF9500F9D46B /* ExpressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A170F141BF21946D159083 /* ExpressionTests.swift */; };
+ DEB306F52B61CF9500F9D46B /* StatementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1756EB81E9F7F45B12A78 /* StatementTests.swift */; };
+ DEB306F62B61CF9500F9D46B /* QueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A171ED017645C8B04DF9F2 /* QueryTests.swift */; };
+ DEB306F72B61CF9500F9D46B /* CipherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1787E16C8562C09C076F5 /* CipherTests.swift */; };
+ DEB306F82B61CF9500F9D46B /* BlobTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A171A2ED4E2640F197F48C /* BlobTests.swift */; };
+ DEB306F92B61CF9500F9D46B /* ConnectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17855BD524FF888265B3C /* ConnectionTests.swift */; };
+ DEB306FA2B61CF9500F9D46B /* CoreFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17B55F2409B7031443495 /* CoreFunctionsTests.swift */; };
+ DEB306FB2B61CF9500F9D46B /* DateAndTimeFunctionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A178AEF32ABC8BF2993FB5 /* DateAndTimeFunctionTests.swift */; };
+ DEB306FC2B61CF9500F9D46B /* CustomFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17F2B5959B212A33C383F /* CustomFunctionsTests.swift */; };
+ DEB306FD2B61CF9500F9D46B /* OperatorsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17475DCA068453F787613 /* OperatorsTests.swift */; };
+ DEB306FE2B61CF9500F9D46B /* ResultTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1745BE8623D8C6808DB3C /* ResultTests.swift */; };
+ DEB306FF2B61CF9500F9D46B /* RTreeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17162C9861E5C4900455D /* RTreeTests.swift */; };
+ DEB307002B61CF9500F9D46B /* SchemaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A171A7714C6524093255C5 /* SchemaTests.swift */; };
+ DEB307012B61CF9500F9D46B /* SelectTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17EC0C43015063945D32E /* SelectTests.swift */; };
+ DEB307022B61CF9500F9D46B /* ValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17AE284BB1DF31D1B753E /* ValueTests.swift */; };
+ DEB307032B61CF9500F9D46B /* QueryIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17CAE60446607E99C22A6 /* QueryIntegrationTests.swift */; };
+ DEB307042B61CF9500F9D46B /* AggregateFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17613F00A3F4D4A257A04 /* AggregateFunctionsTests.swift */; };
+ DEB307052B61CF9500F9D46B /* CustomAggregationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A177EF5E2D91BA86DA4480 /* CustomAggregationTests.swift */; };
+ DEB307062B61CF9500F9D46B /* SetterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1709D5BDD2691BA160012 /* SetterTests.swift */; };
+ DEB307072B61CF9500F9D46B /* RowTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A174FE5B47A97937A27276 /* RowTests.swift */; };
+ DEB307082B61CF9500F9D46B /* Connection+PragmaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17C60D3464461057E4D63 /* Connection+PragmaTests.swift */; };
+ DEB307092B61CF9500F9D46B /* Connection+AttachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A170C08525D3D27CB5F83C /* Connection+AttachTests.swift */; };
+ DEB3070B2B61CF9500F9D46B /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03A65E5A1C6BB0F50062603F /* SQLite.framework */; };
+ DEB3070D2B61CF9500F9D46B /* Resources in Resources */ = {isa = PBXBuildFile; fileRef = 3DF7B79528846FCC005DD8CA /* Resources */; };
+ EAE5A0372B893C43007C7EA4 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = EAE5A0362B893C43007C7EA4 /* PrivacyInfo.xcprivacy */; };
+ EAE5A0382B893C43007C7EA4 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = EAE5A0362B893C43007C7EA4 /* PrivacyInfo.xcprivacy */; };
+ EAE5A0392B893C43007C7EA4 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = EAE5A0362B893C43007C7EA4 /* PrivacyInfo.xcprivacy */; };
+ EAE5A03A2B893C43007C7EA4 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = EAE5A0362B893C43007C7EA4 /* PrivacyInfo.xcprivacy */; };
+ EE247AD71C3F04ED00AE3E12 /* SQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AD61C3F04ED00AE3E12 /* SQLite.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ EE247ADE1C3F04ED00AE3E12 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE247AD31C3F04ED00AE3E12 /* SQLite.framework */; };
+ EE247B031C3F06E900AE3E12 /* Blob.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEE1C3F06E900AE3E12 /* Blob.swift */; };
+ EE247B041C3F06E900AE3E12 /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEF1C3F06E900AE3E12 /* Connection.swift */; };
+ EE247B071C3F06E900AE3E12 /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF21C3F06E900AE3E12 /* Statement.swift */; };
+ EE247B081C3F06E900AE3E12 /* Value.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF31C3F06E900AE3E12 /* Value.swift */; };
+ EE247B091C3F06E900AE3E12 /* FTS4.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF51C3F06E900AE3E12 /* FTS4.swift */; };
+ EE247B0A1C3F06E900AE3E12 /* RTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF61C3F06E900AE3E12 /* RTree.swift */; };
+ EE247B0B1C3F06E900AE3E12 /* Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF71C3F06E900AE3E12 /* Foundation.swift */; };
+ EE247B0C1C3F06E900AE3E12 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF81C3F06E900AE3E12 /* Helpers.swift */; };
+ EE247B0D1C3F06E900AE3E12 /* AggregateFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFA1C3F06E900AE3E12 /* AggregateFunctions.swift */; };
+ EE247B0E1C3F06E900AE3E12 /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFB1C3F06E900AE3E12 /* Collation.swift */; };
+ EE247B0F1C3F06E900AE3E12 /* CoreFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFC1C3F06E900AE3E12 /* CoreFunctions.swift */; };
+ EE247B101C3F06E900AE3E12 /* CustomFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFD1C3F06E900AE3E12 /* CustomFunctions.swift */; };
+ EE247B111C3F06E900AE3E12 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFE1C3F06E900AE3E12 /* Expression.swift */; };
+ EE247B121C3F06E900AE3E12 /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFF1C3F06E900AE3E12 /* Operators.swift */; };
+ EE247B131C3F06E900AE3E12 /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B001C3F06E900AE3E12 /* Query.swift */; };
+ EE247B141C3F06E900AE3E12 /* Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B011C3F06E900AE3E12 /* Schema.swift */; };
+ EE247B151C3F06E900AE3E12 /* Setter.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B021C3F06E900AE3E12 /* Setter.swift */; };
+ EE247B171C3F127200AE3E12 /* TestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B161C3F127200AE3E12 /* TestHelpers.swift */; };
+ EE247B461C3F3ED000AE3E12 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE247B3C1C3F3ED000AE3E12 /* SQLite.framework */; };
+ EE247B611C3F3FC700AE3E12 /* TestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B161C3F127200AE3E12 /* TestHelpers.swift */; };
+ EE247B621C3F3FDB00AE3E12 /* SQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AD61C3F04ED00AE3E12 /* SQLite.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ EE247B631C3F3FDB00AE3E12 /* Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF71C3F06E900AE3E12 /* Foundation.swift */; };
+ EE247B641C3F3FDB00AE3E12 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF81C3F06E900AE3E12 /* Helpers.swift */; };
+ EE247B651C3F3FEC00AE3E12 /* Blob.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEE1C3F06E900AE3E12 /* Blob.swift */; };
+ EE247B661C3F3FEC00AE3E12 /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEF1C3F06E900AE3E12 /* Connection.swift */; };
+ EE247B691C3F3FEC00AE3E12 /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF21C3F06E900AE3E12 /* Statement.swift */; };
+ EE247B6A1C3F3FEC00AE3E12 /* Value.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF31C3F06E900AE3E12 /* Value.swift */; };
+ EE247B6B1C3F3FEC00AE3E12 /* FTS4.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF51C3F06E900AE3E12 /* FTS4.swift */; };
+ EE247B6C1C3F3FEC00AE3E12 /* RTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF61C3F06E900AE3E12 /* RTree.swift */; };
+ EE247B6D1C3F3FEC00AE3E12 /* AggregateFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFA1C3F06E900AE3E12 /* AggregateFunctions.swift */; };
+ EE247B6E1C3F3FEC00AE3E12 /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFB1C3F06E900AE3E12 /* Collation.swift */; };
+ EE247B6F1C3F3FEC00AE3E12 /* CoreFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFC1C3F06E900AE3E12 /* CoreFunctions.swift */; };
+ EE247B701C3F3FEC00AE3E12 /* CustomFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFD1C3F06E900AE3E12 /* CustomFunctions.swift */; };
+ EE247B711C3F3FEC00AE3E12 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFE1C3F06E900AE3E12 /* Expression.swift */; };
+ EE247B721C3F3FEC00AE3E12 /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFF1C3F06E900AE3E12 /* Operators.swift */; };
+ EE247B731C3F3FEC00AE3E12 /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B001C3F06E900AE3E12 /* Query.swift */; };
+ EE247B741C3F3FEC00AE3E12 /* Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B011C3F06E900AE3E12 /* Schema.swift */; };
+ EE247B751C3F3FEC00AE3E12 /* Setter.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B021C3F06E900AE3E12 /* Setter.swift */; };
+ EE9180941C46EA210038162A /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = EE9180931C46EA210038162A /* libsqlite3.tbd */; };
+ EE9180951C46EBCC0038162A /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = EE9180911C46E9D30038162A /* libsqlite3.tbd */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
- DC37740019C8CBB3004FCF85 /* PBXContainerItemProxy */ = {
+ 03A65E651C6BB0F60062603F /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
- containerPortal = DC3773EA19C8CBB3004FCF85 /* Project object */;
+ containerPortal = EE247ACA1C3F04ED00AE3E12 /* Project object */;
proxyType = 1;
- remoteGlobalIDString = DC3773F219C8CBB3004FCF85;
- remoteInfo = "SQLite iOS";
+ remoteGlobalIDString = 03A65E591C6BB0F50062603F;
+ remoteInfo = "SQLite tvOS";
};
- DC37742019C8CC2F004FCF85 /* PBXContainerItemProxy */ = {
+ DEB307142B61D07F00F9D46B /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
- containerPortal = DC3773EA19C8CBB3004FCF85 /* Project object */;
+ containerPortal = EE247ACA1C3F04ED00AE3E12 /* Project object */;
proxyType = 1;
- remoteGlobalIDString = DC37741319C8CC2F004FCF85;
- remoteInfo = "SQLite Mac";
+ remoteGlobalIDString = DEB306B82B61CEF500F9D46B;
+ remoteInfo = "SQLite visionOS";
+ };
+ EE247ADF1C3F04ED00AE3E12 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = EE247ACA1C3F04ED00AE3E12 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = EE247AD21C3F04ED00AE3E12;
+ remoteInfo = SQLite;
+ };
+ EE247B471C3F3ED000AE3E12 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = EE247ACA1C3F04ED00AE3E12 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = EE247B3B1C3F3ED000AE3E12;
+ remoteInfo = SQLite;
};
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
- DC0FA83119D87CA3009F3A35 /* SQLite-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SQLite-Bridging-Header.h"; sourceTree = ""; };
- DC0FA83519D87E0C009F3A35 /* SQLite-Bridging.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "SQLite-Bridging.c"; sourceTree = ""; };
- DC0FA83619D87E0C009F3A35 /* SQLite-Bridging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SQLite-Bridging.h"; sourceTree = ""; };
- DC3773F319C8CBB3004FCF85 /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- DC3773F719C8CBB3004FCF85 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
- DC3773F819C8CBB3004FCF85 /* SQLite iOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SQLite iOS.h"; sourceTree = ""; };
- DC3773FE19C8CBB3004FCF85 /* SQLite iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SQLite iOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
- DC37740419C8CBB3004FCF85 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
- DC37741419C8CC2F004FCF85 /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- DC37741719C8CC2F004FCF85 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
- DC37741819C8CC2F004FCF85 /* SQLite Mac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SQLite Mac.h"; sourceTree = ""; };
- DC37741E19C8CC2F004FCF85 /* SQLite Mac Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SQLite Mac Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
- DC37742419C8CC2F004FCF85 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
- DC37742E19C8CE67004FCF85 /* SQLite Common.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "SQLite Common.xcconfig"; sourceTree = ""; };
- DC37743419C8D626004FCF85 /* Database.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Database.swift; sourceTree = ""; };
- DC37743719C8D693004FCF85 /* Datatype.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Datatype.swift; sourceTree = ""; };
- DC37743A19C8D6C0004FCF85 /* Statement.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Statement.swift; sourceTree = ""; };
- DC37744219C8DC91004FCF85 /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; };
- DC37744419C8DCA1004FCF85 /* 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; };
- DC37744719C8F50B004FCF85 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; };
- DCAAE66D19D8A71B00158FEF /* SQLite.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = SQLite.playground; sourceTree = ""; };
- DCAD429619E2E0F1004A51DF /* Query.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Query.swift; sourceTree = ""; };
- DCAD429919E2EE50004A51DF /* QueryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QueryTests.swift; sourceTree = ""; };
- DCF37F8119DDAC2D001534AA /* DatabaseTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DatabaseTests.swift; sourceTree = ""; };
- DCF37F8419DDAF3F001534AA /* StatementTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatementTests.swift; sourceTree = ""; };
- DCF37F8719DDAF79001534AA /* TestHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestHelper.swift; sourceTree = ""; };
+ 02A43A9722738CF100FEC494 /* Backup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Backup.swift; sourceTree = ""; };
+ 03A65E5A1C6BB0F50062603F /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 03A65E631C6BB0F60062603F /* SQLiteTests tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SQLiteTests tvOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 03A65E961C6BB3210062603F /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/usr/lib/libsqlite3.tbd; sourceTree = DEVELOPER_DIR; };
+ 19A1709D5BDD2691BA160012 /* SetterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetterTests.swift; sourceTree = ""; };
+ 19A170A97B51DC5EE365F3C5 /* Connection+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Connection+Schema.swift"; sourceTree = ""; };
+ 19A170C08525D3D27CB5F83C /* Connection+AttachTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Connection+AttachTests.swift"; sourceTree = ""; };
+ 19A170F141BF21946D159083 /* ExpressionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExpressionTests.swift; sourceTree = ""; };
+ 19A1710E73A46D5AC721CDA9 /* Errors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Errors.swift; sourceTree = ""; };
+ 19A1715904F7B6851FCB5EF6 /* FTS4Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FTS4Tests.swift; sourceTree = ""; };
+ 19A17162C9861E5C4900455D /* RTreeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RTreeTests.swift; sourceTree = ""; };
+ 19A171A2ED4E2640F197F48C /* BlobTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BlobTests.swift; sourceTree = ""; };
+ 19A171A7714C6524093255C5 /* SchemaTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SchemaTests.swift; sourceTree = ""; };
+ 19A171B262DDE8718513CFDA /* SchemaChanger.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SchemaChanger.swift; sourceTree = ""; };
+ 19A171ED017645C8B04DF9F2 /* QueryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QueryTests.swift; sourceTree = ""; };
+ 19A17268AE67B746B96AC125 /* SchemaDefinitions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SchemaDefinitions.swift; sourceTree = ""; };
+ 19A1730E4390C775C25677D1 /* FTS5.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FTS5.swift; sourceTree = ""; };
+ 19A1745BE8623D8C6808DB3C /* ResultTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ResultTests.swift; sourceTree = ""; };
+ 19A17475DCA068453F787613 /* OperatorsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OperatorsTests.swift; sourceTree = ""; };
+ 19A174FE5B47A97937A27276 /* RowTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RowTests.swift; sourceTree = ""; };
+ 19A1756EB81E9F7F45B12A78 /* StatementTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatementTests.swift; sourceTree = ""; };
+ 19A175A9CB446640AE6F2200 /* Connection+Aggregation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Connection+Aggregation.swift"; sourceTree = ""; };
+ 19A17613F00A3F4D4A257A04 /* AggregateFunctionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AggregateFunctionsTests.swift; sourceTree = ""; };
+ 19A176174862D0F0139B3987 /* SchemaDefinitionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SchemaDefinitionsTests.swift; sourceTree = ""; };
+ 19A177EF5E2D91BA86DA4480 /* CustomAggregationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomAggregationTests.swift; sourceTree = ""; };
+ 19A17855BD524FF888265B3C /* ConnectionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnectionTests.swift; sourceTree = ""; };
+ 19A1787E16C8562C09C076F5 /* CipherTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CipherTests.swift; sourceTree = ""; };
+ 19A178A39ACA9667A62663CC /* Cipher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Cipher.swift; sourceTree = ""; };
+ 19A178AEF32ABC8BF2993FB5 /* DateAndTimeFunctionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DateAndTimeFunctionTests.swift; sourceTree = ""; };
+ 19A1794B7972D14330A65BBD /* Linux.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = Linux.md; sourceTree = ""; };
+ 19A1794CC4D7827E997E32A7 /* FoundationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FoundationTests.swift; sourceTree = ""; };
+ 19A17AE284BB1DF31D1B753E /* ValueTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValueTests.swift; sourceTree = ""; };
+ 19A17B55F2409B7031443495 /* CoreFunctionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreFunctionsTests.swift; sourceTree = ""; };
+ 19A17B93B48B5560E6E51791 /* Fixtures.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Fixtures.swift; sourceTree = ""; };
+ 19A17B96EBD42C878E609CDC /* FTS5Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FTS5Tests.swift; sourceTree = ""; };
+ 19A17BA55DABB480F9020C8A /* DateAndTimeFunctions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DateAndTimeFunctions.swift; sourceTree = ""; };
+ 19A17BE1CC4AD4036BAB8EE0 /* FTSIntegrationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FTSIntegrationTests.swift; sourceTree = ""; };
+ 19A17C60D3464461057E4D63 /* Connection+PragmaTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Connection+PragmaTests.swift"; sourceTree = ""; };
+ 19A17CA1DF7D0F7C9A94C51C /* Connection+SchemaTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Connection+SchemaTests.swift"; sourceTree = ""; };
+ 19A17CAE60446607E99C22A6 /* QueryIntegrationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QueryIntegrationTests.swift; sourceTree = ""; };
+ 19A17E723300E5ED3771DCB5 /* Result.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = ""; };
+ 19A17EA3A313F129011B3FA0 /* Release.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = Release.md; sourceTree = ""; };
+ 19A17EC0C43015063945D32E /* SelectTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SelectTests.swift; sourceTree = ""; };
+ 19A17F285B767BFACD96714B /* Connection+Pragmas.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Connection+Pragmas.swift"; sourceTree = ""; };
+ 19A17F2B5959B212A33C383F /* CustomFunctionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomFunctionsTests.swift; sourceTree = ""; };
+ 19A17FDB0B0CFB8987906FD0 /* SchemaChangerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SchemaChangerTests.swift; sourceTree = ""; };
+ 3D3C3CCB26E5568800759140 /* SQLite.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = SQLite.playground; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
+ 3D67B3E51DB2469200A4F4C6 /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS3.0.sdk/usr/lib/libsqlite3.tbd; sourceTree = DEVELOPER_DIR; };
+ 3DF7B78728842972005DD8CA /* Connection+Attach.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Connection+Attach.swift"; sourceTree = ""; };
+ 3DF7B790288449BA005DD8CA /* URIQueryParameter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URIQueryParameter.swift; sourceTree = ""; };
+ 3DF7B79528846FCC005DD8CA /* Resources */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Resources; sourceTree = ""; };
+ 3DF7B79A2884C353005DD8CA /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CHANGELOG.md; sourceTree = ""; };
+ 3DF7B79B2884C901005DD8CA /* Planning.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = Planning.md; sourceTree = ""; };
+ 3DFC0B862886C239001C8FC9 /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; };
+ 49EB68C31F7B3CB400D89D40 /* Coding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Coding.swift; sourceTree = ""; };
+ 64A8EE422B095FBB00F583F7 /* WindowFunctions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowFunctions.swift; sourceTree = ""; };
+ 64B8E16F2B09748000545AFB /* WindowFunctionsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowFunctionsTests.swift; sourceTree = ""; };
+ 997DF2AD287FC06D00F8DF95 /* Query+with.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Query+with.swift"; sourceTree = ""; };
+ A121AC451CA35C79005A31D1 /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ DB58B21028FB864300F8EEA4 /* SchemaReader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SchemaReader.swift; sourceTree = ""; };
+ DB58B21528FC7C4600F8EEA4 /* SQLiteFeature.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SQLiteFeature.swift; sourceTree = ""; };
+ DB7C5DA528D7C9B6006395CF /* SQLiteVersion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SQLiteVersion.swift; sourceTree = ""; };
+ DBB93D592A22A373009BB96E /* SchemaReaderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SchemaReaderTests.swift; sourceTree = ""; };
+ DEB306E52B61CEF500F9D46B /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ DEB307112B61CF9500F9D46B /* SQLiteTests visionOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SQLiteTests visionOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
+ DEB307132B61D04500F9D46B /* SQLite visionOS.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; name = "SQLite visionOS.xctestplan"; path = "Tests/SQLite visionOS.xctestplan"; sourceTree = ""; };
+ EAE5A0362B893C43007C7EA4 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; };
+ EE247AD31C3F04ED00AE3E12 /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ EE247AD61C3F04ED00AE3E12 /* SQLite.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SQLite.h; sourceTree = ""; };
+ EE247AD81C3F04ED00AE3E12 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ EE247ADD1C3F04ED00AE3E12 /* SQLiteTests iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SQLiteTests iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
+ EE247AE41C3F04ED00AE3E12 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ EE247AEE1C3F06E900AE3E12 /* Blob.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Blob.swift; sourceTree = ""; };
+ EE247AEF1C3F06E900AE3E12 /* Connection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Connection.swift; sourceTree = ""; };
+ EE247AF21C3F06E900AE3E12 /* Statement.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Statement.swift; sourceTree = ""; };
+ EE247AF31C3F06E900AE3E12 /* Value.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Value.swift; sourceTree = ""; };
+ EE247AF51C3F06E900AE3E12 /* FTS4.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FTS4.swift; sourceTree = ""; };
+ EE247AF61C3F06E900AE3E12 /* RTree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RTree.swift; sourceTree = ""; };
+ EE247AF71C3F06E900AE3E12 /* Foundation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Foundation.swift; sourceTree = ""; };
+ EE247AF81C3F06E900AE3E12 /* Helpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Helpers.swift; sourceTree = ""; };
+ EE247AFA1C3F06E900AE3E12 /* AggregateFunctions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AggregateFunctions.swift; sourceTree = ""; };
+ EE247AFB1C3F06E900AE3E12 /* Collation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Collation.swift; sourceTree = ""; };
+ EE247AFC1C3F06E900AE3E12 /* CoreFunctions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreFunctions.swift; sourceTree = ""; };
+ EE247AFD1C3F06E900AE3E12 /* CustomFunctions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomFunctions.swift; sourceTree = ""; };
+ EE247AFE1C3F06E900AE3E12 /* Expression.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Expression.swift; sourceTree = ""; };
+ EE247AFF1C3F06E900AE3E12 /* Operators.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Operators.swift; sourceTree = ""; };
+ EE247B001C3F06E900AE3E12 /* Query.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Query.swift; sourceTree = ""; };
+ EE247B011C3F06E900AE3E12 /* Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Schema.swift; sourceTree = ""; };
+ EE247B021C3F06E900AE3E12 /* Setter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Setter.swift; sourceTree = ""; };
+ EE247B161C3F127200AE3E12 /* TestHelpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestHelpers.swift; sourceTree = ""; };
+ EE247B3C1C3F3ED000AE3E12 /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ EE247B451C3F3ED000AE3E12 /* SQLiteTests Mac.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SQLiteTests Mac.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
+ EE247B771C3F40D700AE3E12 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; };
+ EE247B8B1C3F820300AE3E12 /* CONTRIBUTING.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CONTRIBUTING.md; sourceTree = ""; };
+ EE247B8D1C3F821200AE3E12 /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = ""; };
+ EE247B8F1C3F822500AE3E12 /* Index.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = Index.md; sourceTree = ""; };
+ EE247B911C3F822500AE3E12 /* installation@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "installation@2x.png"; sourceTree = ""; };
+ EE247B921C3F822600AE3E12 /* playground@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "playground@2x.png"; sourceTree = ""; };
+ EE247B931C3F826100AE3E12 /* SQLite.swift.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; path = SQLite.swift.podspec; sourceTree = ""; };
+ EE9180911C46E9D30038162A /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib/libsqlite3.tbd; sourceTree = DEVELOPER_DIR; };
+ EE9180931C46EA210038162A /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
- DC3773EF19C8CBB3004FCF85 /* Frameworks */ = {
+ 03A65E561C6BB0F50062603F /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 03A65E971C6BB3210062603F /* libsqlite3.tbd in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 03A65E601C6BB0F60062603F /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 03A65E641C6BB0F60062603F /* SQLite.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ A121AC411CA35C79005A31D1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 3D67B3E61DB2469200A4F4C6 /* libsqlite3.tbd in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ DEB306DF2B61CEF500F9D46B /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- DC37744319C8DC91004FCF85 /* libsqlite3.dylib in Frameworks */,
+ DEB306E02B61CEF500F9D46B /* libsqlite3.tbd in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
- DC3773FB19C8CBB3004FCF85 /* Frameworks */ = {
+ DEB3070A2B61CF9500F9D46B /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- DC3773FF19C8CBB3004FCF85 /* SQLite.framework in Frameworks */,
+ DEB3070B2B61CF9500F9D46B /* SQLite.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
- DC37741019C8CC2F004FCF85 /* Frameworks */ = {
+ EE247ACF1C3F04ED00AE3E12 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- DC37744519C8DCA1004FCF85 /* libsqlite3.dylib in Frameworks */,
+ EE9180941C46EA210038162A /* libsqlite3.tbd in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
- DC37741B19C8CC2F004FCF85 /* Frameworks */ = {
+ EE247ADA1C3F04ED00AE3E12 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- DC37741F19C8CC2F004FCF85 /* SQLite.framework in Frameworks */,
+ EE247ADE1C3F04ED00AE3E12 /* SQLite.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ EE247B381C3F3ED000AE3E12 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ EE9180951C46EBCC0038162A /* libsqlite3.tbd in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ EE247B421C3F3ED000AE3E12 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ EE247B461C3F3ED000AE3E12 /* SQLite.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
- DC0FA83419D87DE3009F3A35 /* Bridging */ = {
+ 19A1792D261C689FC988A90A /* Schema */ = {
isa = PBXGroup;
children = (
- DC0FA83119D87CA3009F3A35 /* SQLite-Bridging-Header.h */,
- DC0FA83619D87E0C009F3A35 /* SQLite-Bridging.h */,
- DC0FA83519D87E0C009F3A35 /* SQLite-Bridging.c */,
+ DB58B21028FB864300F8EEA4 /* SchemaReader.swift */,
+ 19A171B262DDE8718513CFDA /* SchemaChanger.swift */,
+ 19A17268AE67B746B96AC125 /* SchemaDefinitions.swift */,
+ 19A170A97B51DC5EE365F3C5 /* Connection+Schema.swift */,
);
- name = Bridging;
+ path = Schema;
sourceTree = "";
};
- DC10500F19C904DD00D8CA30 /* SQLite Tests */ = {
+ 19A1798E3459573BEE50FA34 /* Core */ = {
isa = PBXGroup;
children = (
- DCF37F8719DDAF79001534AA /* TestHelper.swift */,
- DCF37F8119DDAC2D001534AA /* DatabaseTests.swift */,
- DCF37F8419DDAF3F001534AA /* StatementTests.swift */,
- DCAD429919E2EE50004A51DF /* QueryTests.swift */,
+ 19A1756EB81E9F7F45B12A78 /* StatementTests.swift */,
+ 19A171A2ED4E2640F197F48C /* BlobTests.swift */,
+ 19A17855BD524FF888265B3C /* ConnectionTests.swift */,
+ 19A17B55F2409B7031443495 /* CoreFunctionsTests.swift */,
+ 19A1745BE8623D8C6808DB3C /* ResultTests.swift */,
+ 19A17AE284BB1DF31D1B753E /* ValueTests.swift */,
+ 19A17C60D3464461057E4D63 /* Connection+PragmaTests.swift */,
+ 19A170C08525D3D27CB5F83C /* Connection+AttachTests.swift */,
);
- name = "SQLite Tests";
- path = "SQLite Common Tests";
+ path = Core;
sourceTree = "";
};
- DC10501319C906AD00D8CA30 /* Targets */ = {
+ 19A17AECBF878B1DAE0AE3DD /* Typed */ = {
isa = PBXGroup;
children = (
- DC3773F519C8CBB3004FCF85 /* SQLite iOS */,
- DC37741519C8CC2F004FCF85 /* SQLite Mac */,
+ 19A170F141BF21946D159083 /* ExpressionTests.swift */,
+ 19A171ED017645C8B04DF9F2 /* QueryTests.swift */,
+ 19A178AEF32ABC8BF2993FB5 /* DateAndTimeFunctionTests.swift */,
+ 19A17F2B5959B212A33C383F /* CustomFunctionsTests.swift */,
+ 19A17475DCA068453F787613 /* OperatorsTests.swift */,
+ 19A17EC0C43015063945D32E /* SelectTests.swift */,
+ 19A17CAE60446607E99C22A6 /* QueryIntegrationTests.swift */,
+ 19A17613F00A3F4D4A257A04 /* AggregateFunctionsTests.swift */,
+ 19A177EF5E2D91BA86DA4480 /* CustomAggregationTests.swift */,
+ 19A1709D5BDD2691BA160012 /* SetterTests.swift */,
+ 19A174FE5B47A97937A27276 /* RowTests.swift */,
+ 64B8E16F2B09748000545AFB /* WindowFunctionsTests.swift */,
);
- name = Targets;
+ path = Typed;
sourceTree = "";
};
- DC3773E919C8CBB3004FCF85 = {
+ 19A17B56FBA20E7245BC8AC0 /* Schema */ = {
isa = PBXGroup;
children = (
- DC37744719C8F50B004FCF85 /* README.md */,
- DCAAE66D19D8A71B00158FEF /* SQLite.playground */,
- DC37742D19C8CC90004FCF85 /* SQLite */,
- DC10500F19C904DD00D8CA30 /* SQLite Tests */,
- DC10501319C906AD00D8CA30 /* Targets */,
- DC3773F419C8CBB3004FCF85 /* Products */,
+ DBB93D592A22A373009BB96E /* SchemaReaderTests.swift */,
+ 19A176174862D0F0139B3987 /* SchemaDefinitionsTests.swift */,
+ 19A17FDB0B0CFB8987906FD0 /* SchemaChangerTests.swift */,
+ 19A17CA1DF7D0F7C9A94C51C /* Connection+SchemaTests.swift */,
+ 19A171A7714C6524093255C5 /* SchemaTests.swift */,
);
+ path = Schema;
sourceTree = "";
};
- DC3773F419C8CBB3004FCF85 /* Products */ = {
+ 19A17E470E4492D287C0D12F /* Extensions */ = {
isa = PBXGroup;
children = (
- DC3773F319C8CBB3004FCF85 /* SQLite.framework */,
- DC3773FE19C8CBB3004FCF85 /* SQLite iOS Tests.xctest */,
- DC37741419C8CC2F004FCF85 /* SQLite.framework */,
- DC37741E19C8CC2F004FCF85 /* SQLite Mac Tests.xctest */,
+ 19A17B96EBD42C878E609CDC /* FTS5Tests.swift */,
+ 19A17BE1CC4AD4036BAB8EE0 /* FTSIntegrationTests.swift */,
+ 19A1715904F7B6851FCB5EF6 /* FTS4Tests.swift */,
+ 19A1787E16C8562C09C076F5 /* CipherTests.swift */,
+ 19A17162C9861E5C4900455D /* RTreeTests.swift */,
);
- name = Products;
+ path = Extensions;
sourceTree = "";
};
- DC3773F519C8CBB3004FCF85 /* SQLite iOS */ = {
+ 3D67B3E41DB2469200A4F4C6 /* Frameworks */ = {
isa = PBXGroup;
children = (
- DC3773F819C8CBB3004FCF85 /* SQLite iOS.h */,
- DC3773F619C8CBB3004FCF85 /* Supporting Files */,
- DC37744219C8DC91004FCF85 /* libsqlite3.dylib */,
- DC37740219C8CBB3004FCF85 /* SQLite iOS Tests */,
+ 3D67B3E51DB2469200A4F4C6 /* libsqlite3.tbd */,
);
- path = "SQLite iOS";
+ name = Frameworks;
sourceTree = "";
};
- DC3773F619C8CBB3004FCF85 /* Supporting Files */ = {
+ EE247AC91C3F04ED00AE3E12 = {
isa = PBXGroup;
children = (
- DC3773F719C8CBB3004FCF85 /* Info.plist */,
+ 3D3C3CCB26E5568800759140 /* SQLite.playground */,
+ EE247AD51C3F04ED00AE3E12 /* SQLite */,
+ EE247AE11C3F04ED00AE3E12 /* SQLiteTests */,
+ DEB307132B61D04500F9D46B /* SQLite visionOS.xctestplan */,
+ EE247B8A1C3F81D000AE3E12 /* Metadata */,
+ EE247AD41C3F04ED00AE3E12 /* Products */,
+ 3D67B3E41DB2469200A4F4C6 /* Frameworks */,
);
- name = "Supporting Files";
+ indentWidth = 4;
sourceTree = "";
+ tabWidth = 4;
};
- DC37740219C8CBB3004FCF85 /* SQLite iOS Tests */ = {
+ EE247AD41C3F04ED00AE3E12 /* Products */ = {
isa = PBXGroup;
children = (
- DC37740319C8CBB3004FCF85 /* Supporting Files */,
+ EE247AD31C3F04ED00AE3E12 /* SQLite.framework */,
+ EE247ADD1C3F04ED00AE3E12 /* SQLiteTests iOS.xctest */,
+ EE247B3C1C3F3ED000AE3E12 /* SQLite.framework */,
+ EE247B451C3F3ED000AE3E12 /* SQLiteTests Mac.xctest */,
+ 03A65E5A1C6BB0F50062603F /* SQLite.framework */,
+ 03A65E631C6BB0F60062603F /* SQLiteTests tvOS.xctest */,
+ A121AC451CA35C79005A31D1 /* SQLite.framework */,
+ DEB306E52B61CEF500F9D46B /* SQLite.framework */,
+ DEB307112B61CF9500F9D46B /* SQLiteTests visionOS.xctest */,
);
- path = "SQLite iOS Tests";
- sourceTree = SOURCE_ROOT;
+ name = Products;
+ sourceTree = "";
};
- DC37740319C8CBB3004FCF85 /* Supporting Files */ = {
+ EE247AD51C3F04ED00AE3E12 /* SQLite */ = {
isa = PBXGroup;
children = (
- DC37740419C8CBB3004FCF85 /* Info.plist */,
+ EE247AD61C3F04ED00AE3E12 /* SQLite.h */,
+ EE247AF71C3F06E900AE3E12 /* Foundation.swift */,
+ EE247AF81C3F06E900AE3E12 /* Helpers.swift */,
+ EAE5A0362B893C43007C7EA4 /* PrivacyInfo.xcprivacy */,
+ EE247AD81C3F04ED00AE3E12 /* Info.plist */,
+ EE247AED1C3F06E900AE3E12 /* Core */,
+ EE247AF41C3F06E900AE3E12 /* Extensions */,
+ EE247AF91C3F06E900AE3E12 /* Typed */,
+ 19A1792D261C689FC988A90A /* Schema */,
);
- name = "Supporting Files";
+ name = SQLite;
+ path = Sources/SQLite;
sourceTree = "";
};
- DC37741519C8CC2F004FCF85 /* SQLite Mac */ = {
+ EE247AE11C3F04ED00AE3E12 /* SQLiteTests */ = {
isa = PBXGroup;
children = (
- DC37741819C8CC2F004FCF85 /* SQLite Mac.h */,
- DC37741619C8CC2F004FCF85 /* Supporting Files */,
- DC37744419C8DCA1004FCF85 /* libsqlite3.dylib */,
- DC37742219C8CC2F004FCF85 /* SQLite Mac Tests */,
+ 3DF7B79528846FCC005DD8CA /* Resources */,
+ EE247B161C3F127200AE3E12 /* TestHelpers.swift */,
+ EE247AE41C3F04ED00AE3E12 /* Info.plist */,
+ 19A1794CC4D7827E997E32A7 /* FoundationTests.swift */,
+ 19A17B93B48B5560E6E51791 /* Fixtures.swift */,
+ 19A17B56FBA20E7245BC8AC0 /* Schema */,
+ 19A17E470E4492D287C0D12F /* Extensions */,
+ 19A1798E3459573BEE50FA34 /* Core */,
+ 19A17AECBF878B1DAE0AE3DD /* Typed */,
);
- path = "SQLite Mac";
+ name = SQLiteTests;
+ path = Tests/SQLiteTests;
sourceTree = "";
};
- DC37741619C8CC2F004FCF85 /* Supporting Files */ = {
+ EE247AED1C3F06E900AE3E12 /* Core */ = {
isa = PBXGroup;
children = (
- DC37741719C8CC2F004FCF85 /* Info.plist */,
+ EE247AEE1C3F06E900AE3E12 /* Blob.swift */,
+ EE247AEF1C3F06E900AE3E12 /* Connection.swift */,
+ EE247AF21C3F06E900AE3E12 /* Statement.swift */,
+ EE247AF31C3F06E900AE3E12 /* Value.swift */,
+ 19A1710E73A46D5AC721CDA9 /* Errors.swift */,
+ 02A43A9722738CF100FEC494 /* Backup.swift */,
+ 19A17E723300E5ED3771DCB5 /* Result.swift */,
+ 19A175A9CB446640AE6F2200 /* Connection+Aggregation.swift */,
+ 3DF7B78728842972005DD8CA /* Connection+Attach.swift */,
+ 3DF7B790288449BA005DD8CA /* URIQueryParameter.swift */,
+ DB58B21528FC7C4600F8EEA4 /* SQLiteFeature.swift */,
+ DB7C5DA528D7C9B6006395CF /* SQLiteVersion.swift */,
+ 19A17F285B767BFACD96714B /* Connection+Pragmas.swift */,
);
- name = "Supporting Files";
+ path = Core;
sourceTree = "";
};
- DC37742219C8CC2F004FCF85 /* SQLite Mac Tests */ = {
+ EE247AF41C3F06E900AE3E12 /* Extensions */ = {
isa = PBXGroup;
children = (
- DC37742319C8CC2F004FCF85 /* Supporting Files */,
+ 19A178A39ACA9667A62663CC /* Cipher.swift */,
+ EE247AF51C3F06E900AE3E12 /* FTS4.swift */,
+ 19A1730E4390C775C25677D1 /* FTS5.swift */,
+ EE247AF61C3F06E900AE3E12 /* RTree.swift */,
);
- path = "SQLite Mac Tests";
- sourceTree = SOURCE_ROOT;
+ path = Extensions;
+ sourceTree = "";
};
- DC37742319C8CC2F004FCF85 /* Supporting Files */ = {
+ EE247AF91C3F06E900AE3E12 /* Typed */ = {
isa = PBXGroup;
children = (
- DC37742419C8CC2F004FCF85 /* Info.plist */,
+ EE247AFA1C3F06E900AE3E12 /* AggregateFunctions.swift */,
+ 64A8EE422B095FBB00F583F7 /* WindowFunctions.swift */,
+ EE247AFB1C3F06E900AE3E12 /* Collation.swift */,
+ EE247AFC1C3F06E900AE3E12 /* CoreFunctions.swift */,
+ EE247AFD1C3F06E900AE3E12 /* CustomFunctions.swift */,
+ EE247AFE1C3F06E900AE3E12 /* Expression.swift */,
+ EE247AFF1C3F06E900AE3E12 /* Operators.swift */,
+ EE247B001C3F06E900AE3E12 /* Query.swift */,
+ 997DF2AD287FC06D00F8DF95 /* Query+with.swift */,
+ EE247B011C3F06E900AE3E12 /* Schema.swift */,
+ EE247B021C3F06E900AE3E12 /* Setter.swift */,
+ 49EB68C31F7B3CB400D89D40 /* Coding.swift */,
+ 19A17BA55DABB480F9020C8A /* DateAndTimeFunctions.swift */,
);
- name = "Supporting Files";
+ path = Typed;
sourceTree = "";
};
- DC37742D19C8CC90004FCF85 /* SQLite */ = {
+ EE247B8A1C3F81D000AE3E12 /* Metadata */ = {
isa = PBXGroup;
children = (
- DC37743419C8D626004FCF85 /* Database.swift */,
- DC37743719C8D693004FCF85 /* Datatype.swift */,
- DCAD429619E2E0F1004A51DF /* Query.swift */,
- DC37743A19C8D6C0004FCF85 /* Statement.swift */,
- DC0FA83419D87DE3009F3A35 /* Bridging */,
- DC37743319C8CFCE004FCF85 /* Supporting Files */,
+ EE247B771C3F40D700AE3E12 /* README.md */,
+ 3DF7B79A2884C353005DD8CA /* CHANGELOG.md */,
+ EE247B8B1C3F820300AE3E12 /* CONTRIBUTING.md */,
+ EE247B931C3F826100AE3E12 /* SQLite.swift.podspec */,
+ 3DFC0B862886C239001C8FC9 /* Package.swift */,
+ EE247B8D1C3F821200AE3E12 /* Makefile */,
+ EE9180931C46EA210038162A /* libsqlite3.tbd */,
+ EE9180911C46E9D30038162A /* libsqlite3.tbd */,
+ 03A65E961C6BB3210062603F /* libsqlite3.tbd */,
+ EE247B8E1C3F822500AE3E12 /* Documentation */,
);
- name = SQLite;
- path = "SQLite Common";
+ name = Metadata;
sourceTree = "";
};
- DC37743319C8CFCE004FCF85 /* Supporting Files */ = {
+ EE247B8E1C3F822500AE3E12 /* Documentation */ = {
isa = PBXGroup;
children = (
- DC37742E19C8CE67004FCF85 /* SQLite Common.xcconfig */,
+ EE247B8F1C3F822500AE3E12 /* Index.md */,
+ 3DF7B79B2884C901005DD8CA /* Planning.md */,
+ EE247B901C3F822500AE3E12 /* Resources */,
+ 19A17EA3A313F129011B3FA0 /* Release.md */,
+ 19A1794B7972D14330A65BBD /* Linux.md */,
);
- name = "Supporting Files";
+ path = Documentation;
+ sourceTree = "";
+ };
+ EE247B901C3F822500AE3E12 /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ EE247B911C3F822500AE3E12 /* installation@2x.png */,
+ EE247B921C3F822600AE3E12 /* playground@2x.png */,
+ );
+ path = Resources;
sourceTree = "";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
- DC3773F019C8CBB3004FCF85 /* Headers */ = {
+ 03A65E571C6BB0F50062603F /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 03A65E721C6BB2D30062603F /* SQLite.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ A121AC421CA35C79005A31D1 /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 3D67B3FC1DB2471B00A4F4C6 /* SQLite.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ DEB306B92B61CEF500F9D46B /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DEB306BA2B61CEF500F9D46B /* SQLite.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ EE247AD01C3F04ED00AE3E12 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
- DC3773F919C8CBB3004FCF85 /* SQLite iOS.h in Headers */,
- DC0FA83219D87CA3009F3A35 /* SQLite-Bridging-Header.h in Headers */,
- DC0FA83919D87E0C009F3A35 /* SQLite-Bridging.h in Headers */,
+ EE247AD71C3F04ED00AE3E12 /* SQLite.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
- DC37741119C8CC2F004FCF85 /* Headers */ = {
+ EE247B391C3F3ED000AE3E12 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
- DC37741919C8CC2F004FCF85 /* SQLite Mac.h in Headers */,
- DC0FA83319D87CA3009F3A35 /* SQLite-Bridging-Header.h in Headers */,
- DC0FA83A19D87E0C009F3A35 /* SQLite-Bridging.h in Headers */,
+ EE247B621C3F3FDB00AE3E12 /* SQLite.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
- DC3773F219C8CBB3004FCF85 /* SQLite iOS */ = {
+ 03A65E591C6BB0F50062603F /* SQLite tvOS */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 03A65E6F1C6BB0F60062603F /* Build configuration list for PBXNativeTarget "SQLite tvOS" */;
+ buildPhases = (
+ 03A65E571C6BB0F50062603F /* Headers */,
+ 03A65E551C6BB0F50062603F /* Sources */,
+ 03A65E561C6BB0F50062603F /* Frameworks */,
+ 03A65E581C6BB0F50062603F /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "SQLite tvOS";
+ productName = "SQLite tvOS";
+ productReference = 03A65E5A1C6BB0F50062603F /* SQLite.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+ 03A65E621C6BB0F60062603F /* SQLiteTests tvOS */ = {
isa = PBXNativeTarget;
- buildConfigurationList = DC37740919C8CBB3004FCF85 /* Build configuration list for PBXNativeTarget "SQLite iOS" */;
+ buildConfigurationList = 03A65E701C6BB0F60062603F /* Build configuration list for PBXNativeTarget "SQLiteTests tvOS" */;
buildPhases = (
- DC3773EE19C8CBB3004FCF85 /* Sources */,
- DC3773EF19C8CBB3004FCF85 /* Frameworks */,
- DC3773F019C8CBB3004FCF85 /* Headers */,
- DC3773F119C8CBB3004FCF85 /* Resources */,
+ 03A65E5F1C6BB0F60062603F /* Sources */,
+ 03A65E601C6BB0F60062603F /* Frameworks */,
+ 03A65E611C6BB0F60062603F /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 03A65E661C6BB0F60062603F /* PBXTargetDependency */,
+ );
+ name = "SQLiteTests tvOS";
+ productName = "SQLite tvOSTests";
+ productReference = 03A65E631C6BB0F60062603F /* SQLiteTests tvOS.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ A121AC441CA35C79005A31D1 /* SQLite watchOS */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = A121AC4C1CA35C79005A31D1 /* Build configuration list for PBXNativeTarget "SQLite watchOS" */;
+ buildPhases = (
+ A121AC421CA35C79005A31D1 /* Headers */,
+ A121AC401CA35C79005A31D1 /* Sources */,
+ A121AC411CA35C79005A31D1 /* Frameworks */,
+ A121AC431CA35C79005A31D1 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "SQLite watchOS";
+ productName = "SQLite watchOS";
+ productReference = A121AC451CA35C79005A31D1 /* SQLite.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+ DEB306B82B61CEF500F9D46B /* SQLite visionOS */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = DEB306E22B61CEF500F9D46B /* Build configuration list for PBXNativeTarget "SQLite visionOS" */;
+ buildPhases = (
+ DEB306B92B61CEF500F9D46B /* Headers */,
+ DEB306BB2B61CEF500F9D46B /* Sources */,
+ DEB306DF2B61CEF500F9D46B /* Frameworks */,
+ DEB306E12B61CEF500F9D46B /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "SQLite visionOS";
+ productName = SQLite;
+ productReference = DEB306E52B61CEF500F9D46B /* SQLite.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+ DEB306E72B61CF9500F9D46B /* SQLiteTests visionOS */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = DEB3070E2B61CF9500F9D46B /* Build configuration list for PBXNativeTarget "SQLiteTests visionOS" */;
+ buildPhases = (
+ DEB306EA2B61CF9500F9D46B /* Sources */,
+ DEB3070A2B61CF9500F9D46B /* Frameworks */,
+ DEB3070C2B61CF9500F9D46B /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ DEB307152B61D07F00F9D46B /* PBXTargetDependency */,
+ );
+ name = "SQLiteTests visionOS";
+ productName = "SQLite tvOSTests";
+ productReference = DEB307112B61CF9500F9D46B /* SQLiteTests visionOS.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ EE247AD21C3F04ED00AE3E12 /* SQLite iOS */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = EE247AE71C3F04ED00AE3E12 /* Build configuration list for PBXNativeTarget "SQLite iOS" */;
+ buildPhases = (
+ EE247AD01C3F04ED00AE3E12 /* Headers */,
+ EE247ACE1C3F04ED00AE3E12 /* Sources */,
+ EE247ACF1C3F04ED00AE3E12 /* Frameworks */,
+ EE247AD11C3F04ED00AE3E12 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = "SQLite iOS";
- productName = "SQLite iOS";
- productReference = DC3773F319C8CBB3004FCF85 /* SQLite.framework */;
+ productName = SQLite;
+ productReference = EE247AD31C3F04ED00AE3E12 /* SQLite.framework */;
productType = "com.apple.product-type.framework";
};
- DC3773FD19C8CBB3004FCF85 /* SQLite iOS Tests */ = {
+ EE247ADC1C3F04ED00AE3E12 /* SQLiteTests iOS */ = {
isa = PBXNativeTarget;
- buildConfigurationList = DC37740C19C8CBB3004FCF85 /* Build configuration list for PBXNativeTarget "SQLite iOS Tests" */;
+ buildConfigurationList = EE247AEA1C3F04ED00AE3E12 /* Build configuration list for PBXNativeTarget "SQLiteTests iOS" */;
buildPhases = (
- DC3773FA19C8CBB3004FCF85 /* Sources */,
- DC3773FB19C8CBB3004FCF85 /* Frameworks */,
- DC3773FC19C8CBB3004FCF85 /* Resources */,
+ EE247AD91C3F04ED00AE3E12 /* Sources */,
+ EE247ADA1C3F04ED00AE3E12 /* Frameworks */,
+ EE247ADB1C3F04ED00AE3E12 /* Resources */,
);
buildRules = (
);
dependencies = (
- DC37740119C8CBB3004FCF85 /* PBXTargetDependency */,
+ EE247AE01C3F04ED00AE3E12 /* PBXTargetDependency */,
);
- name = "SQLite iOS Tests";
- productName = "SQLite iOSTests";
- productReference = DC3773FE19C8CBB3004FCF85 /* SQLite iOS Tests.xctest */;
+ name = "SQLiteTests iOS";
+ productName = SQLiteTests;
+ productReference = EE247ADD1C3F04ED00AE3E12 /* SQLiteTests iOS.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
- DC37741319C8CC2F004FCF85 /* SQLite Mac */ = {
+ EE247B3B1C3F3ED000AE3E12 /* SQLite Mac */ = {
isa = PBXNativeTarget;
- buildConfigurationList = DC37742719C8CC2F004FCF85 /* Build configuration list for PBXNativeTarget "SQLite Mac" */;
+ buildConfigurationList = EE247B511C3F3ED000AE3E12 /* Build configuration list for PBXNativeTarget "SQLite Mac" */;
buildPhases = (
- DC37740F19C8CC2F004FCF85 /* Sources */,
- DC37741019C8CC2F004FCF85 /* Frameworks */,
- DC37741119C8CC2F004FCF85 /* Headers */,
- DC37741219C8CC2F004FCF85 /* Resources */,
+ EE247B391C3F3ED000AE3E12 /* Headers */,
+ EE247B371C3F3ED000AE3E12 /* Sources */,
+ EE247B381C3F3ED000AE3E12 /* Frameworks */,
+ EE247B3A1C3F3ED000AE3E12 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = "SQLite Mac";
- productName = "SQLite Mac";
- productReference = DC37741419C8CC2F004FCF85 /* SQLite.framework */;
+ productName = SQLite;
+ productReference = EE247B3C1C3F3ED000AE3E12 /* SQLite.framework */;
productType = "com.apple.product-type.framework";
};
- DC37741D19C8CC2F004FCF85 /* SQLite Mac Tests */ = {
+ EE247B441C3F3ED000AE3E12 /* SQLiteTests Mac */ = {
isa = PBXNativeTarget;
- buildConfigurationList = DC37742A19C8CC2F004FCF85 /* Build configuration list for PBXNativeTarget "SQLite Mac Tests" */;
+ buildConfigurationList = EE247B521C3F3ED000AE3E12 /* Build configuration list for PBXNativeTarget "SQLiteTests Mac" */;
buildPhases = (
- DC37741A19C8CC2F004FCF85 /* Sources */,
- DC37741B19C8CC2F004FCF85 /* Frameworks */,
- DC37741C19C8CC2F004FCF85 /* Resources */,
+ EE247B411C3F3ED000AE3E12 /* Sources */,
+ EE247B421C3F3ED000AE3E12 /* Frameworks */,
+ EE247B431C3F3ED000AE3E12 /* Resources */,
);
buildRules = (
);
dependencies = (
- DC37742119C8CC2F004FCF85 /* PBXTargetDependency */,
+ EE247B481C3F3ED000AE3E12 /* PBXTargetDependency */,
);
- name = "SQLite Mac Tests";
- productName = "SQLite MacTests";
- productReference = DC37741E19C8CC2F004FCF85 /* SQLite Mac Tests.xctest */;
+ name = "SQLiteTests Mac";
+ productName = SQLiteTests;
+ productReference = EE247B451C3F3ED000AE3E12 /* SQLiteTests Mac.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
- DC3773EA19C8CBB3004FCF85 /* Project object */ = {
+ EE247ACA1C3F04ED00AE3E12 /* Project object */ = {
isa = PBXProject;
attributes = {
- LastUpgradeCheck = 0610;
- ORGANIZATIONNAME = "Stephen Celis";
+ LastSwiftUpdateCheck = 0720;
+ LastUpgradeCheck = 1250;
TargetAttributes = {
- DC3773F219C8CBB3004FCF85 = {
- CreatedOnToolsVersion = 6.1;
+ 03A65E591C6BB0F50062603F = {
+ CreatedOnToolsVersion = 7.2;
+ LastSwiftMigration = 0900;
+ };
+ 03A65E621C6BB0F60062603F = {
+ CreatedOnToolsVersion = 7.2;
+ LastSwiftMigration = 0900;
};
- DC3773FD19C8CBB3004FCF85 = {
- CreatedOnToolsVersion = 6.1;
+ A121AC441CA35C79005A31D1 = {
+ CreatedOnToolsVersion = 7.3;
+ LastSwiftMigration = 0900;
};
- DC37741319C8CC2F004FCF85 = {
- CreatedOnToolsVersion = 6.1;
+ EE247AD21C3F04ED00AE3E12 = {
+ CreatedOnToolsVersion = 7.2;
+ LastSwiftMigration = 0900;
};
- DC37741D19C8CC2F004FCF85 = {
- CreatedOnToolsVersion = 6.1;
+ EE247ADC1C3F04ED00AE3E12 = {
+ CreatedOnToolsVersion = 7.2;
+ LastSwiftMigration = 1020;
+ };
+ EE247B3B1C3F3ED000AE3E12 = {
+ CreatedOnToolsVersion = 7.2;
+ LastSwiftMigration = 0900;
+ };
+ EE247B441C3F3ED000AE3E12 = {
+ CreatedOnToolsVersion = 7.2;
+ LastSwiftMigration = 0900;
};
};
};
- buildConfigurationList = DC3773ED19C8CBB3004FCF85 /* Build configuration list for PBXProject "SQLite" */;
+ buildConfigurationList = EE247ACD1C3F04ED00AE3E12 /* Build configuration list for PBXProject "SQLite" */;
compatibilityVersion = "Xcode 3.2";
- developmentRegion = English;
+ developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
+ Base,
);
- mainGroup = DC3773E919C8CBB3004FCF85;
- productRefGroup = DC3773F419C8CBB3004FCF85 /* Products */;
+ mainGroup = EE247AC91C3F04ED00AE3E12;
+ productRefGroup = EE247AD41C3F04ED00AE3E12 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
- DC3773F219C8CBB3004FCF85 /* SQLite iOS */,
- DC3773FD19C8CBB3004FCF85 /* SQLite iOS Tests */,
- DC37741319C8CC2F004FCF85 /* SQLite Mac */,
- DC37741D19C8CC2F004FCF85 /* SQLite Mac Tests */,
+ EE247AD21C3F04ED00AE3E12 /* SQLite iOS */,
+ EE247ADC1C3F04ED00AE3E12 /* SQLiteTests iOS */,
+ EE247B3B1C3F3ED000AE3E12 /* SQLite Mac */,
+ EE247B441C3F3ED000AE3E12 /* SQLiteTests Mac */,
+ 03A65E591C6BB0F50062603F /* SQLite tvOS */,
+ 03A65E621C6BB0F60062603F /* SQLiteTests tvOS */,
+ A121AC441CA35C79005A31D1 /* SQLite watchOS */,
+ DEB306B82B61CEF500F9D46B /* SQLite visionOS */,
+ DEB306E72B61CF9500F9D46B /* SQLiteTests visionOS */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
- DC3773F119C8CBB3004FCF85 /* Resources */ = {
+ 03A65E581C6BB0F50062603F /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ EAE5A0392B893C43007C7EA4 /* PrivacyInfo.xcprivacy in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
- DC3773FC19C8CBB3004FCF85 /* Resources */ = {
+ 03A65E611C6BB0F60062603F /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 3DF7B79828846FED005DD8CA /* Resources in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
- DC37741219C8CC2F004FCF85 /* Resources */ = {
+ A121AC431CA35C79005A31D1 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ EAE5A03A2B893C43007C7EA4 /* PrivacyInfo.xcprivacy in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
- DC37741C19C8CC2F004FCF85 /* Resources */ = {
+ DEB306E12B61CEF500F9D46B /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
+ DEB3070C2B61CF9500F9D46B /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DEB3070D2B61CF9500F9D46B /* Resources in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ EE247AD11C3F04ED00AE3E12 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ EAE5A0372B893C43007C7EA4 /* PrivacyInfo.xcprivacy in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ EE247ADB1C3F04ED00AE3E12 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 3DF7B79628846FCC005DD8CA /* Resources in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ EE247B3A1C3F3ED000AE3E12 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ EAE5A0382B893C43007C7EA4 /* PrivacyInfo.xcprivacy in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ EE247B431C3F3ED000AE3E12 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 3DF7B79928847055005DD8CA /* Resources in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
- DC3773EE19C8CBB3004FCF85 /* Sources */ = {
+ 03A65E551C6BB0F50062603F /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 03A65E801C6BB2FB0062603F /* CoreFunctions.swift in Sources */,
+ 49EB68C61F7B3CB400D89D40 /* Coding.swift in Sources */,
+ 03A65E761C6BB2E60062603F /* Blob.swift in Sources */,
+ 03A65E7D1C6BB2F70062603F /* RTree.swift in Sources */,
+ 3DF7B793288449BA005DD8CA /* URIQueryParameter.swift in Sources */,
+ 03A65E7B1C6BB2F70062603F /* Value.swift in Sources */,
+ 03A65E821C6BB2FB0062603F /* Expression.swift in Sources */,
+ 03A65E731C6BB2D80062603F /* Foundation.swift in Sources */,
+ 03A65E7F1C6BB2FB0062603F /* Collation.swift in Sources */,
+ 03A65E861C6BB2FB0062603F /* Setter.swift in Sources */,
+ 3DF7B78A28842972005DD8CA /* Connection+Attach.swift in Sources */,
+ 03A65E811C6BB2FB0062603F /* CustomFunctions.swift in Sources */,
+ 03A65E7A1C6BB2F70062603F /* Statement.swift in Sources */,
+ 64A8EE452B095FBB00F583F7 /* WindowFunctions.swift in Sources */,
+ 03A65E741C6BB2DA0062603F /* Helpers.swift in Sources */,
+ 03A65E831C6BB2FB0062603F /* Operators.swift in Sources */,
+ 03A65E851C6BB2FB0062603F /* Schema.swift in Sources */,
+ 03A65E841C6BB2FB0062603F /* Query.swift in Sources */,
+ 03A65E7C1C6BB2F70062603F /* FTS4.swift in Sources */,
+ 03A65E771C6BB2E60062603F /* Connection.swift in Sources */,
+ 03A65E7E1C6BB2FB0062603F /* AggregateFunctions.swift in Sources */,
+ 19A17EC0D68BA8C03288ADF7 /* FTS5.swift in Sources */,
+ 19A179E76EA6207669B60C1B /* Cipher.swift in Sources */,
+ 02A43A9A22738CF100FEC494 /* Backup.swift in Sources */,
+ 19A17FF4A10B44D3937C8CAC /* Errors.swift in Sources */,
+ 19A1737286A74F3CF7412906 /* DateAndTimeFunctions.swift in Sources */,
+ DB7C5DA828D7C9B6006395CF /* SQLiteVersion.swift in Sources */,
+ 19A17073552293CA063BEA66 /* Result.swift in Sources */,
+ 997DF2B0287FC06D00F8DF95 /* Query+with.swift in Sources */,
+ 19A179B59450FE7C4811AB8A /* Connection+Aggregation.swift in Sources */,
+ DB58B21828FC7C4600F8EEA4 /* SQLiteFeature.swift in Sources */,
+ 19A17FC07731779C1B8506FA /* SchemaChanger.swift in Sources */,
+ 19A1740EACD47904AA24B8DC /* SchemaDefinitions.swift in Sources */,
+ 19A1750EF4A5F92954A451FF /* Connection+Schema.swift in Sources */,
+ 19A17986405D9A875698408F /* Connection+Pragmas.swift in Sources */,
+ DB58B21328FB864300F8EEA4 /* SchemaReader.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 03A65E5F1C6BB0F60062603F /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 03A65E951C6BB3030062603F /* TestHelpers.swift in Sources */,
+ 19A17E04C4C0956715C5676A /* FoundationTests.swift in Sources */,
+ 19A17F60B685636D1F83C2DD /* Fixtures.swift in Sources */,
+ 19A17B62A4125AF4F6014CF5 /* SchemaDefinitionsTests.swift in Sources */,
+ 19A17FC04708C6ED637DDFD4 /* SchemaChangerTests.swift in Sources */,
+ 19A17188B4D96636F9C0C209 /* Connection+SchemaTests.swift in Sources */,
+ 19A17FACE8E4D54A50BA934E /* FTS5Tests.swift in Sources */,
+ 19A177909023B7B940C5805E /* FTSIntegrationTests.swift in Sources */,
+ 19A17E1DD976D5CE80018749 /* FTS4Tests.swift in Sources */,
+ DBB93D5C2A22A373009BB96E /* SchemaReaderTests.swift in Sources */,
+ 19A17411403D60640467209E /* ExpressionTests.swift in Sources */,
+ 19A17CA4D7B63D845428A9C5 /* StatementTests.swift in Sources */,
+ 19A17885B646CB0201BE4BD5 /* QueryTests.swift in Sources */,
+ 19A1708D3D58D7BC1168E55F /* CipherTests.swift in Sources */,
+ 19A178C041DDCF80B533AD13 /* BlobTests.swift in Sources */,
+ 19A17021286A4D8D6C2EF12D /* ConnectionTests.swift in Sources */,
+ 19A17DE34C477232592A8F6B /* CoreFunctionsTests.swift in Sources */,
+ 19A1799AF6643CF5081BFA15 /* DateAndTimeFunctionTests.swift in Sources */,
+ 19A17457B0461F484AF6BE40 /* CustomFunctionsTests.swift in Sources */,
+ 19A17900387FDCF578B31E3E /* OperatorsTests.swift in Sources */,
+ 19A17C74233AFC2EDAFA23DC /* ResultTests.swift in Sources */,
+ 19A17A9520802ACF45907970 /* RTreeTests.swift in Sources */,
+ 19A17A391BF056E3D729E70A /* SchemaTests.swift in Sources */,
+ 19A17746150A815944A6820B /* SelectTests.swift in Sources */,
+ 19A1766135CE9786B1878603 /* ValueTests.swift in Sources */,
+ 19A177D5C6542E2D572162E5 /* QueryIntegrationTests.swift in Sources */,
+ 64B8E1722B09748000545AFB /* WindowFunctionsTests.swift in Sources */,
+ 19A178DF5A96CFEFF1E271F6 /* AggregateFunctionsTests.swift in Sources */,
+ 19A17437659BD7FD787D94A6 /* CustomAggregationTests.swift in Sources */,
+ 19A17F907258E524B3CA2FAE /* SetterTests.swift in Sources */,
+ 19A17ABCF0EB4808BDC5B5FF /* RowTests.swift in Sources */,
+ 19A17BACF4C032513DE1F879 /* Connection+PragmaTests.swift in Sources */,
+ 19A173F25449876761347072 /* Connection+AttachTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ A121AC401CA35C79005A31D1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 3DF7B78B28842972005DD8CA /* Connection+Attach.swift in Sources */,
+ 49EB68C71F7B3CB400D89D40 /* Coding.swift in Sources */,
+ 997DF2B1287FC06D00F8DF95 /* Query+with.swift in Sources */,
+ 3D67B3F71DB246D700A4F4C6 /* Foundation.swift in Sources */,
+ 3D67B3F81DB246D700A4F4C6 /* Helpers.swift in Sources */,
+ DB58B21428FB864300F8EEA4 /* SchemaReader.swift in Sources */,
+ 3D67B3E91DB246D100A4F4C6 /* Statement.swift in Sources */,
+ DB7C5DA928D7C9B6006395CF /* SQLiteVersion.swift in Sources */,
+ 3D67B3EA1DB246D100A4F4C6 /* Value.swift in Sources */,
+ 3D67B3EB1DB246D100A4F4C6 /* FTS4.swift in Sources */,
+ DB58B21928FC7C4600F8EEA4 /* SQLiteFeature.swift in Sources */,
+ 3D67B3EC1DB246D100A4F4C6 /* RTree.swift in Sources */,
+ 3D67B3ED1DB246D100A4F4C6 /* FTS5.swift in Sources */,
+ 3D67B3EE1DB246D100A4F4C6 /* AggregateFunctions.swift in Sources */,
+ 3D67B3EF1DB246D100A4F4C6 /* Collation.swift in Sources */,
+ 3D67B3F01DB246D100A4F4C6 /* CoreFunctions.swift in Sources */,
+ 3D67B3F11DB246D100A4F4C6 /* CustomFunctions.swift in Sources */,
+ 3D67B3F21DB246D100A4F4C6 /* Expression.swift in Sources */,
+ 3D67B3F31DB246D100A4F4C6 /* Operators.swift in Sources */,
+ 3DF7B794288449BA005DD8CA /* URIQueryParameter.swift in Sources */,
+ 3D67B3F41DB246D100A4F4C6 /* Query.swift in Sources */,
+ 3D67B3F51DB246D100A4F4C6 /* Schema.swift in Sources */,
+ 3D67B3F61DB246D100A4F4C6 /* Setter.swift in Sources */,
+ 3D67B3E71DB246BA00A4F4C6 /* Blob.swift in Sources */,
+ 3D67B3E81DB246BA00A4F4C6 /* Connection.swift in Sources */,
+ 19A179CCF9671E345E5A9811 /* Cipher.swift in Sources */,
+ 02A43A9B22738CF100FEC494 /* Backup.swift in Sources */,
+ 19A17DC282E36C4F41AA440B /* Errors.swift in Sources */,
+ 19A173668D948AD4DF1F5352 /* DateAndTimeFunctions.swift in Sources */,
+ 19A17DF8D4F13A20F5D2269E /* Result.swift in Sources */,
+ 64A8EE462B095FBB00F583F7 /* WindowFunctions.swift in Sources */,
+ 19A17DFE05ED8B1F7C45F7EE /* SchemaChanger.swift in Sources */,
+ 19A17D1BEABA610ABF003D67 /* SchemaDefinitions.swift in Sources */,
+ 19A17A33EA026C2E2CEBAF36 /* Connection+Schema.swift in Sources */,
+ 19A178A8B2A34FB6B565DEDA /* Connection+Pragmas.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ DEB306BB2B61CEF500F9D46B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DEB306BC2B61CEF500F9D46B /* CoreFunctions.swift in Sources */,
+ DEB306BD2B61CEF500F9D46B /* Coding.swift in Sources */,
+ DEB306BE2B61CEF500F9D46B /* RTree.swift in Sources */,
+ DEB306BF2B61CEF500F9D46B /* Blob.swift in Sources */,
+ DEB306C02B61CEF500F9D46B /* URIQueryParameter.swift in Sources */,
+ DEB306C12B61CEF500F9D46B /* Foundation.swift in Sources */,
+ DEB306C22B61CEF500F9D46B /* Connection.swift in Sources */,
+ DEB306C32B61CEF500F9D46B /* Expression.swift in Sources */,
+ DEB306C42B61CEF500F9D46B /* Helpers.swift in Sources */,
+ DEB306C52B61CEF500F9D46B /* Collation.swift in Sources */,
+ DEB306C62B61CEF500F9D46B /* Setter.swift in Sources */,
+ DEB306C72B61CEF500F9D46B /* Connection+Attach.swift in Sources */,
+ DEB306C82B61CEF500F9D46B /* CustomFunctions.swift in Sources */,
+ DEB306C92B61CEF500F9D46B /* FTS4.swift in Sources */,
+ DEB306CA2B61CEF500F9D46B /* Value.swift in Sources */,
+ DEB306CB2B61CEF500F9D46B /* Operators.swift in Sources */,
+ DEB306CC2B61CEF500F9D46B /* Schema.swift in Sources */,
+ DEB306CD2B61CEF500F9D46B /* Query.swift in Sources */,
+ DEB306CE2B61CEF500F9D46B /* Statement.swift in Sources */,
+ DEB306CF2B61CEF500F9D46B /* AggregateFunctions.swift in Sources */,
+ DEB306D02B61CEF500F9D46B /* FTS5.swift in Sources */,
+ DEB306D12B61CEF500F9D46B /* Cipher.swift in Sources */,
+ DEB306D22B61CEF500F9D46B /* Backup.swift in Sources */,
+ DEB306D32B61CEF500F9D46B /* Errors.swift in Sources */,
+ DEB306D42B61CEF500F9D46B /* DateAndTimeFunctions.swift in Sources */,
+ DEB306D52B61CEF500F9D46B /* SQLiteVersion.swift in Sources */,
+ DEB306D62B61CEF500F9D46B /* Result.swift in Sources */,
+ DEB306D72B61CEF500F9D46B /* Query+with.swift in Sources */,
+ DEB306D82B61CEF500F9D46B /* Connection+Aggregation.swift in Sources */,
+ DEB306D92B61CEF500F9D46B /* SQLiteFeature.swift in Sources */,
+ DEB306DA2B61CEF500F9D46B /* SchemaChanger.swift in Sources */,
+ DEB306DB2B61CEF500F9D46B /* SchemaDefinitions.swift in Sources */,
+ DEB306DC2B61CEF500F9D46B /* Connection+Schema.swift in Sources */,
+ DEB306DD2B61CEF500F9D46B /* Connection+Pragmas.swift in Sources */,
+ DEB306DE2B61CEF500F9D46B /* SchemaReader.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ DEB306EA2B61CF9500F9D46B /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- DCAD429719E2E0F1004A51DF /* Query.swift in Sources */,
- DC37743B19C8D6C0004FCF85 /* Statement.swift in Sources */,
- DC37743519C8D626004FCF85 /* Database.swift in Sources */,
- DC37743819C8D693004FCF85 /* Datatype.swift in Sources */,
- DC0FA83719D87E0C009F3A35 /* SQLite-Bridging.c in Sources */,
+ DEB306EB2B61CF9500F9D46B /* TestHelpers.swift in Sources */,
+ DEB306EC2B61CF9500F9D46B /* FoundationTests.swift in Sources */,
+ DEB306ED2B61CF9500F9D46B /* Fixtures.swift in Sources */,
+ DEB306EE2B61CF9500F9D46B /* SchemaDefinitionsTests.swift in Sources */,
+ DEB306EF2B61CF9500F9D46B /* SchemaChangerTests.swift in Sources */,
+ DEB306F02B61CF9500F9D46B /* Connection+SchemaTests.swift in Sources */,
+ DEB306F12B61CF9500F9D46B /* FTS5Tests.swift in Sources */,
+ DEB306F22B61CF9500F9D46B /* FTSIntegrationTests.swift in Sources */,
+ DEB306F32B61CF9500F9D46B /* FTS4Tests.swift in Sources */,
+ DEB306F42B61CF9500F9D46B /* ExpressionTests.swift in Sources */,
+ DEB306F52B61CF9500F9D46B /* StatementTests.swift in Sources */,
+ DEB306F62B61CF9500F9D46B /* QueryTests.swift in Sources */,
+ DEB306F72B61CF9500F9D46B /* CipherTests.swift in Sources */,
+ DEB306F82B61CF9500F9D46B /* BlobTests.swift in Sources */,
+ DEB306F92B61CF9500F9D46B /* ConnectionTests.swift in Sources */,
+ DEB306FA2B61CF9500F9D46B /* CoreFunctionsTests.swift in Sources */,
+ DEB306FB2B61CF9500F9D46B /* DateAndTimeFunctionTests.swift in Sources */,
+ DEB306FC2B61CF9500F9D46B /* CustomFunctionsTests.swift in Sources */,
+ DEB306FD2B61CF9500F9D46B /* OperatorsTests.swift in Sources */,
+ DEB306FE2B61CF9500F9D46B /* ResultTests.swift in Sources */,
+ DEB306FF2B61CF9500F9D46B /* RTreeTests.swift in Sources */,
+ DEB307002B61CF9500F9D46B /* SchemaTests.swift in Sources */,
+ DEB307012B61CF9500F9D46B /* SelectTests.swift in Sources */,
+ DEB307022B61CF9500F9D46B /* ValueTests.swift in Sources */,
+ DEB307032B61CF9500F9D46B /* QueryIntegrationTests.swift in Sources */,
+ DEB307042B61CF9500F9D46B /* AggregateFunctionsTests.swift in Sources */,
+ DEB307052B61CF9500F9D46B /* CustomAggregationTests.swift in Sources */,
+ DEB307062B61CF9500F9D46B /* SetterTests.swift in Sources */,
+ DEB307072B61CF9500F9D46B /* RowTests.swift in Sources */,
+ DEB307082B61CF9500F9D46B /* Connection+PragmaTests.swift in Sources */,
+ DEB307092B61CF9500F9D46B /* Connection+AttachTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
- DC3773FA19C8CBB3004FCF85 /* Sources */ = {
+ EE247ACE1C3F04ED00AE3E12 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- DCAD429A19E2EE50004A51DF /* QueryTests.swift in Sources */,
- DCF37F8219DDAC2D001534AA /* DatabaseTests.swift in Sources */,
- DCF37F8519DDAF3F001534AA /* StatementTests.swift in Sources */,
- DCF37F8819DDAF79001534AA /* TestHelper.swift in Sources */,
+ EE247B0F1C3F06E900AE3E12 /* CoreFunctions.swift in Sources */,
+ 49EB68C41F7B3CB400D89D40 /* Coding.swift in Sources */,
+ EE247B0A1C3F06E900AE3E12 /* RTree.swift in Sources */,
+ EE247B031C3F06E900AE3E12 /* Blob.swift in Sources */,
+ 3DF7B791288449BA005DD8CA /* URIQueryParameter.swift in Sources */,
+ EE247B0B1C3F06E900AE3E12 /* Foundation.swift in Sources */,
+ EE247B041C3F06E900AE3E12 /* Connection.swift in Sources */,
+ EE247B111C3F06E900AE3E12 /* Expression.swift in Sources */,
+ EE247B0C1C3F06E900AE3E12 /* Helpers.swift in Sources */,
+ EE247B0E1C3F06E900AE3E12 /* Collation.swift in Sources */,
+ EE247B151C3F06E900AE3E12 /* Setter.swift in Sources */,
+ 3DF7B78828842972005DD8CA /* Connection+Attach.swift in Sources */,
+ EE247B101C3F06E900AE3E12 /* CustomFunctions.swift in Sources */,
+ 64A8EE432B095FBB00F583F7 /* WindowFunctions.swift in Sources */,
+ EE247B091C3F06E900AE3E12 /* FTS4.swift in Sources */,
+ EE247B081C3F06E900AE3E12 /* Value.swift in Sources */,
+ EE247B121C3F06E900AE3E12 /* Operators.swift in Sources */,
+ EE247B141C3F06E900AE3E12 /* Schema.swift in Sources */,
+ EE247B131C3F06E900AE3E12 /* Query.swift in Sources */,
+ EE247B071C3F06E900AE3E12 /* Statement.swift in Sources */,
+ EE247B0D1C3F06E900AE3E12 /* AggregateFunctions.swift in Sources */,
+ 19A1717B10CC941ACB5533D6 /* FTS5.swift in Sources */,
+ 19A171F12AB8B07F2FD7201A /* Cipher.swift in Sources */,
+ 02A43A9822738CF100FEC494 /* Backup.swift in Sources */,
+ 19A1792C0520D4E83C2EB075 /* Errors.swift in Sources */,
+ 19A17E29278A12BC4F542506 /* DateAndTimeFunctions.swift in Sources */,
+ DB7C5DA628D7C9B6006395CF /* SQLiteVersion.swift in Sources */,
+ 19A173EFEF0B3BD0B3ED406C /* Result.swift in Sources */,
+ 997DF2AE287FC06D00F8DF95 /* Query+with.swift in Sources */,
+ 19A176376CB6A94759F7980A /* Connection+Aggregation.swift in Sources */,
+ DB58B21628FC7C4600F8EEA4 /* SQLiteFeature.swift in Sources */,
+ 19A1773A335CAB9D0AE14E8E /* SchemaChanger.swift in Sources */,
+ 19A17BA13FD35F058787B7D3 /* SchemaDefinitions.swift in Sources */,
+ 19A174506543905D71BF0518 /* Connection+Schema.swift in Sources */,
+ 19A17018F250343BD0F9F4B0 /* Connection+Pragmas.swift in Sources */,
+ DB58B21128FB864300F8EEA4 /* SchemaReader.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
- DC37740F19C8CC2F004FCF85 /* Sources */ = {
+ EE247AD91C3F04ED00AE3E12 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- DCAD429819E2E0F1004A51DF /* Query.swift in Sources */,
- DC37743C19C8D6C0004FCF85 /* Statement.swift in Sources */,
- DC37743619C8D626004FCF85 /* Database.swift in Sources */,
- DC37743919C8D693004FCF85 /* Datatype.swift in Sources */,
- DC0FA83819D87E0C009F3A35 /* SQLite-Bridging.c in Sources */,
+ EE247B171C3F127200AE3E12 /* TestHelpers.swift in Sources */,
+ 19A17FB80B94E882050AA908 /* FoundationTests.swift in Sources */,
+ 19A17408007B182F884E3A53 /* Fixtures.swift in Sources */,
+ 19A17FE78A39E86F330420EC /* SchemaDefinitionsTests.swift in Sources */,
+ 19A177C25834473FAB32CF3B /* SchemaChangerTests.swift in Sources */,
+ 19A1725658E480B9B378F28B /* Connection+SchemaTests.swift in Sources */,
+ 19A178DA2BB5970778CCAF13 /* FTS5Tests.swift in Sources */,
+ 19A1755C49154C87304C9146 /* FTSIntegrationTests.swift in Sources */,
+ 19A17444861E1443143DEB44 /* FTS4Tests.swift in Sources */,
+ DBB93D5A2A22A373009BB96E /* SchemaReaderTests.swift in Sources */,
+ 19A17DD33C2E43DD6EE05A60 /* ExpressionTests.swift in Sources */,
+ 19A17D6EC40BC35A5DC81BA8 /* StatementTests.swift in Sources */,
+ 19A17E3F47DA087E2B76D087 /* QueryTests.swift in Sources */,
+ 19A17A7B3E3B7E76364A2AEE /* CipherTests.swift in Sources */,
+ 19A1782444437C7FC6B75CBC /* BlobTests.swift in Sources */,
+ 19A17CF65C0196E03BC64519 /* ConnectionTests.swift in Sources */,
+ 19A179BB9A6665B2B99DA546 /* CoreFunctionsTests.swift in Sources */,
+ 19A174118D11B93DA5DAAF79 /* DateAndTimeFunctionTests.swift in Sources */,
+ 19A17A7DF99B0379FD3396B1 /* CustomFunctionsTests.swift in Sources */,
+ 19A171F243A589C5EBC47937 /* OperatorsTests.swift in Sources */,
+ 19A173F429D7E46289EB2167 /* ResultTests.swift in Sources */,
+ 19A17B1D9B5CEBE9CE09280C /* RTreeTests.swift in Sources */,
+ 19A172F71EFD65342072D8D2 /* SchemaTests.swift in Sources */,
+ 19A17F7977364EC8CD33C3C3 /* SelectTests.swift in Sources */,
+ 19A17FD22EF43DF428DD93BA /* ValueTests.swift in Sources */,
+ 19A177AA5922527BBDC77CF9 /* QueryIntegrationTests.swift in Sources */,
+ 64B8E1702B09748000545AFB /* WindowFunctionsTests.swift in Sources */,
+ 19A179786A6826D58A70F8BC /* AggregateFunctionsTests.swift in Sources */,
+ 19A1793972BDDDB027C113BB /* CustomAggregationTests.swift in Sources */,
+ 19A1773155AC2BF2CA86A473 /* SetterTests.swift in Sources */,
+ 19A176B3316281F004F92276 /* RowTests.swift in Sources */,
+ 19A17FBAA26953EB854E790D /* Connection+PragmaTests.swift in Sources */,
+ 19A17026DCDCDA405B09A229 /* Connection+AttachTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
- DC37741A19C8CC2F004FCF85 /* Sources */ = {
+ EE247B371C3F3ED000AE3E12 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- DCAD429B19E2EE50004A51DF /* QueryTests.swift in Sources */,
- DCF37F8319DDAC2D001534AA /* DatabaseTests.swift in Sources */,
- DCF37F8619DDAF3F001534AA /* StatementTests.swift in Sources */,
- DCF37F8919DDAF79001534AA /* TestHelper.swift in Sources */,
+ EE247B6F1C3F3FEC00AE3E12 /* CoreFunctions.swift in Sources */,
+ 49EB68C51F7B3CB400D89D40 /* Coding.swift in Sources */,
+ EE247B651C3F3FEC00AE3E12 /* Blob.swift in Sources */,
+ EE247B6C1C3F3FEC00AE3E12 /* RTree.swift in Sources */,
+ 3DF7B792288449BA005DD8CA /* URIQueryParameter.swift in Sources */,
+ EE247B6A1C3F3FEC00AE3E12 /* Value.swift in Sources */,
+ EE247B711C3F3FEC00AE3E12 /* Expression.swift in Sources */,
+ EE247B631C3F3FDB00AE3E12 /* Foundation.swift in Sources */,
+ EE247B6E1C3F3FEC00AE3E12 /* Collation.swift in Sources */,
+ EE247B751C3F3FEC00AE3E12 /* Setter.swift in Sources */,
+ 3DF7B78928842972005DD8CA /* Connection+Attach.swift in Sources */,
+ EE247B701C3F3FEC00AE3E12 /* CustomFunctions.swift in Sources */,
+ EE247B691C3F3FEC00AE3E12 /* Statement.swift in Sources */,
+ 64A8EE442B095FBB00F583F7 /* WindowFunctions.swift in Sources */,
+ EE247B641C3F3FDB00AE3E12 /* Helpers.swift in Sources */,
+ EE247B721C3F3FEC00AE3E12 /* Operators.swift in Sources */,
+ EE247B741C3F3FEC00AE3E12 /* Schema.swift in Sources */,
+ EE247B731C3F3FEC00AE3E12 /* Query.swift in Sources */,
+ EE247B6B1C3F3FEC00AE3E12 /* FTS4.swift in Sources */,
+ EE247B661C3F3FEC00AE3E12 /* Connection.swift in Sources */,
+ EE247B6D1C3F3FEC00AE3E12 /* AggregateFunctions.swift in Sources */,
+ 19A1750CEE9B05267995CF3D /* FTS5.swift in Sources */,
+ 19A17835FD5886FDC5A3228F /* Cipher.swift in Sources */,
+ 02A43A9922738CF100FEC494 /* Backup.swift in Sources */,
+ 19A17490543609FCED53CACC /* Errors.swift in Sources */,
+ 19A17152E32A9585831E3FE0 /* DateAndTimeFunctions.swift in Sources */,
+ DB7C5DA728D7C9B6006395CF /* SQLiteVersion.swift in Sources */,
+ 19A17F1B3F0A3C96B5ED6D64 /* Result.swift in Sources */,
+ 997DF2AF287FC06D00F8DF95 /* Query+with.swift in Sources */,
+ 19A170ACC97B19730FB7BA4D /* Connection+Aggregation.swift in Sources */,
+ DB58B21728FC7C4600F8EEA4 /* SQLiteFeature.swift in Sources */,
+ 19A177290558991BCC60E4E3 /* SchemaChanger.swift in Sources */,
+ 19A17B0DF1DDB6BBC9C95D64 /* SchemaDefinitions.swift in Sources */,
+ 19A17F0BF02896E1664F4090 /* Connection+Schema.swift in Sources */,
+ 19A1760CE25615CA015E2E5F /* Connection+Pragmas.swift in Sources */,
+ DB58B21228FB864300F8EEA4 /* SchemaReader.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ EE247B411C3F3ED000AE3E12 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ EE247B611C3F3FC700AE3E12 /* TestHelpers.swift in Sources */,
+ 19A178072B371489E6A1E839 /* FoundationTests.swift in Sources */,
+ 19A1709C3E7A406E62293B2A /* Fixtures.swift in Sources */,
+ 19A17E80F736EEE8EE2AA4CE /* SchemaDefinitionsTests.swift in Sources */,
+ 19A1766AC10D13C4EFF349AD /* SchemaChangerTests.swift in Sources */,
+ 19A17B36ABC6006AB80F693C /* Connection+SchemaTests.swift in Sources */,
+ 19A1776BD5127DFDF847FF1F /* FTS5Tests.swift in Sources */,
+ 19A173088B85A7E18E8582A7 /* FTSIntegrationTests.swift in Sources */,
+ 19A178767223229E61C5066F /* FTS4Tests.swift in Sources */,
+ DBB93D5B2A22A373009BB96E /* SchemaReaderTests.swift in Sources */,
+ 19A1781CBA8968ABD3E00877 /* ExpressionTests.swift in Sources */,
+ 19A17923494236793893BF72 /* StatementTests.swift in Sources */,
+ 19A17A52BF29D27C9AA229E7 /* QueryTests.swift in Sources */,
+ 19A17CA6ADB78A2E545BF836 /* CipherTests.swift in Sources */,
+ 19A1714F7CF964D568AB14E0 /* BlobTests.swift in Sources */,
+ 19A173465F23C64DF3DF469B /* ConnectionTests.swift in Sources */,
+ 19A17D993398B8215B73E1EA /* CoreFunctionsTests.swift in Sources */,
+ 19A170AEBAA56DC3355A73B3 /* DateAndTimeFunctionTests.swift in Sources */,
+ 19A1716BF8E15F91A6B5CB7A /* CustomFunctionsTests.swift in Sources */,
+ 19A17482E6FC5E563F3E6A47 /* OperatorsTests.swift in Sources */,
+ 19A17912DB9D3AC8FECF948B /* ResultTests.swift in Sources */,
+ 19A17DAD5975D9367EAA46E2 /* RTreeTests.swift in Sources */,
+ 19A17F2096E83A3181E03317 /* SchemaTests.swift in Sources */,
+ 19A17DE1FCDB5695702AD24D /* SelectTests.swift in Sources */,
+ 19A1726002D24C14F876C8FE /* ValueTests.swift in Sources */,
+ 19A173389E53CB24DFA8CEDD /* QueryIntegrationTests.swift in Sources */,
+ 64B8E1712B09748000545AFB /* WindowFunctionsTests.swift in Sources */,
+ 19A170C56745F9D722A73D77 /* AggregateFunctionsTests.swift in Sources */,
+ 19A1772EBE65173EDFB1AFCA /* CustomAggregationTests.swift in Sources */,
+ 19A17E0ABA6C415F014CD51C /* SetterTests.swift in Sources */,
+ 19A170D938343E30119EDFB3 /* RowTests.swift in Sources */,
+ 19A178F9008614B8A8425635 /* Connection+PragmaTests.swift in Sources */,
+ 19A179BCD483DEA21661FD37 /* Connection+AttachTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
- DC37740119C8CBB3004FCF85 /* PBXTargetDependency */ = {
+ 03A65E661C6BB0F60062603F /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
- target = DC3773F219C8CBB3004FCF85 /* SQLite iOS */;
- targetProxy = DC37740019C8CBB3004FCF85 /* PBXContainerItemProxy */;
+ target = 03A65E591C6BB0F50062603F /* SQLite tvOS */;
+ targetProxy = 03A65E651C6BB0F60062603F /* PBXContainerItemProxy */;
};
- DC37742119C8CC2F004FCF85 /* PBXTargetDependency */ = {
+ DEB307152B61D07F00F9D46B /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
- target = DC37741319C8CC2F004FCF85 /* SQLite Mac */;
- targetProxy = DC37742019C8CC2F004FCF85 /* PBXContainerItemProxy */;
+ target = DEB306B82B61CEF500F9D46B /* SQLite visionOS */;
+ targetProxy = DEB307142B61D07F00F9D46B /* PBXContainerItemProxy */;
+ };
+ EE247AE01C3F04ED00AE3E12 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = EE247AD21C3F04ED00AE3E12 /* SQLite iOS */;
+ targetProxy = EE247ADF1C3F04ED00AE3E12 /* PBXContainerItemProxy */;
+ };
+ EE247B481C3F3ED000AE3E12 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = EE247B3B1C3F3ED000AE3E12 /* SQLite Mac */;
+ targetProxy = EE247B471C3F3ED000AE3E12 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
- DC37740719C8CBB3004FCF85 /* Debug */ = {
+ 03A65E6B1C6BB0F60062603F /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ APPLICATION_EXTENSION_API_ONLY = YES;
+ "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+ DEFINES_MODULE = YES;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+ INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite;
+ PRODUCT_NAME = SQLite;
+ SDKROOT = appletvos;
+ SKIP_INSTALL = YES;
+ SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;
+ TVOS_DEPLOYMENT_TARGET = 12.0;
+ };
+ name = Debug;
+ };
+ 03A65E6C1C6BB0F60062603F /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ APPLICATION_EXTENSION_API_ONLY = YES;
+ "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+ DEFINES_MODULE = YES;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+ INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite;
+ PRODUCT_NAME = SQLite;
+ SDKROOT = appletvos;
+ SKIP_INSTALL = YES;
+ SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;
+ TVOS_DEPLOYMENT_TARGET = 12.0;
+ };
+ name = Release;
+ };
+ 03A65E6D1C6BB0F60062603F /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+ INFOPLIST_FILE = Tests/SQLiteTests/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLiteTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = appletvos;
+ SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;
+ TVOS_DEPLOYMENT_TARGET = 12.0;
+ };
+ name = Debug;
+ };
+ 03A65E6E1C6BB0F60062603F /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+ INFOPLIST_FILE = Tests/SQLiteTests/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLiteTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = appletvos;
+ SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;
+ TVOS_DEPLOYMENT_TARGET = 12.0;
+ };
+ name = Release;
+ };
+ A121AC4A1CA35C79005A31D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ APPLICATION_EXTENSION_API_ONLY = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+ DEFINES_MODULE = YES;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+ INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite;
+ PRODUCT_NAME = SQLite;
+ SDKROOT = watchos;
+ SKIP_INSTALL = YES;
+ SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;
+ TARGETED_DEVICE_FAMILY = 4;
+ WATCHOS_DEPLOYMENT_TARGET = 4.0;
+ };
+ name = Debug;
+ };
+ A121AC4B1CA35C79005A31D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ APPLICATION_EXTENSION_API_ONLY = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+ DEFINES_MODULE = YES;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+ INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite;
+ PRODUCT_NAME = SQLite;
+ SDKROOT = watchos;
+ SKIP_INSTALL = YES;
+ SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;
+ TARGETED_DEVICE_FAMILY = 4;
+ WATCHOS_DEPLOYMENT_TARGET = 4.0;
+ };
+ name = Release;
+ };
+ DEB306E32B61CEF500F9D46B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ APPLICATION_EXTENSION_API_ONLY = YES;
+ CLANG_ENABLE_MODULES = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+ DEFINES_MODULE = YES;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+ INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite;
+ PRODUCT_NAME = SQLite;
+ SDKROOT = xros;
+ SKIP_INSTALL = YES;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;
+ TARGETED_DEVICE_FAMILY = 7;
+ };
+ name = Debug;
+ };
+ DEB306E42B61CEF500F9D46B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ APPLICATION_EXTENSION_API_ONLY = YES;
+ CLANG_ENABLE_MODULES = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+ DEFINES_MODULE = YES;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+ INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite;
+ PRODUCT_NAME = SQLite;
+ SDKROOT = xros;
+ SKIP_INSTALL = YES;
+ SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;
+ TARGETED_DEVICE_FAMILY = 7;
+ };
+ name = Release;
+ };
+ DEB3070F2B61CF9500F9D46B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+ INFOPLIST_FILE = Tests/SQLiteTests/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLiteTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = xros;
+ SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;
+ TARGETED_DEVICE_FAMILY = 7;
+ };
+ name = Debug;
+ };
+ DEB307102B61CF9500F9D46B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+ INFOPLIST_FILE = Tests/SQLiteTests/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLiteTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = xros;
+ SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;
+ TARGETED_DEVICE_FAMILY = 7;
+ };
+ name = Release;
+ };
+ EE247AE51C3F04ED00AE3E12 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
- GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ MACOSX_DEPLOYMENT_TARGET = 10.13;
+ MARKETING_VERSION = 0.15.4;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_NAME = "";
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
- TARGETED_DEVICE_FAMILY = "1,2";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2,3";
+ TVOS_DEPLOYMENT_TARGET = 12.0;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
+ WATCHOS_DEPLOYMENT_TARGET = 4.0;
};
name = Debug;
};
- DC37740819C8CBB3004FCF85 /* Release */ = {
+ EE247AE61C3F04ED00AE3E12 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
- COPY_PHASE_STRIP = YES;
+ COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ MACOSX_DEPLOYMENT_TARGET = 10.13;
+ MARKETING_VERSION = 0.15.4;
MTL_ENABLE_DEBUG_INFO = NO;
PRODUCT_NAME = "";
SDKROOT = iphoneos;
- TARGETED_DEVICE_FAMILY = "1,2";
+ SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2,3";
+ TVOS_DEPLOYMENT_TARGET = 12.0;
VALIDATE_PRODUCT = YES;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
+ WATCHOS_DEPLOYMENT_TARGET = 4.0;
};
name = Release;
};
- DC37740A19C8CBB3004FCF85 /* Debug */ = {
+ EE247AE81C3F04ED00AE3E12 /* Debug */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = DC37742E19C8CE67004FCF85 /* SQLite Common.xcconfig */;
buildSettings = {
+ APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ENABLE_MODULES = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
- INFOPLIST_FILE = "SQLite iOS/Info.plist";
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+ INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
- PRODUCT_NAME = "$(PRODUCT_NAME)";
+ PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite;
+ PRODUCT_NAME = SQLite;
SKIP_INSTALL = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;
};
name = Debug;
};
- DC37740B19C8CBB3004FCF85 /* Release */ = {
+ EE247AE91C3F04ED00AE3E12 /* Release */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = DC37742E19C8CE67004FCF85 /* SQLite Common.xcconfig */;
buildSettings = {
+ APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ENABLE_MODULES = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
- INFOPLIST_FILE = "SQLite iOS/Info.plist";
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+ INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
- PRODUCT_NAME = "$(PRODUCT_NAME)";
+ PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite;
+ PRODUCT_NAME = SQLite;
SKIP_INSTALL = YES;
+ SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;
};
name = Release;
};
- DC37740D19C8CBB3004FCF85 /* Debug */ = {
+ EE247AEB1C3F04ED00AE3E12 /* Debug */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = DC37742E19C8CE67004FCF85 /* SQLite Common.xcconfig */;
buildSettings = {
- FRAMEWORK_SEARCH_PATHS = (
- "$(SDKROOT)/Developer/Library/Frameworks",
- "$(inherited)",
- );
- GCC_PREPROCESSOR_DEFINITIONS = (
- "DEBUG=1",
- "$(inherited)",
- );
- INFOPLIST_FILE = "SQLite iOS Tests/Info.plist";
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+ INFOPLIST_FILE = Tests/SQLiteTests/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
- PRODUCT_NAME = "SQLite iOS Tests";
+ PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLiteTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;
};
name = Debug;
};
- DC37740E19C8CBB3004FCF85 /* Release */ = {
+ EE247AEC1C3F04ED00AE3E12 /* Release */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = DC37742E19C8CE67004FCF85 /* SQLite Common.xcconfig */;
buildSettings = {
- FRAMEWORK_SEARCH_PATHS = (
- "$(SDKROOT)/Developer/Library/Frameworks",
- "$(inherited)",
- );
- INFOPLIST_FILE = "SQLite iOS Tests/Info.plist";
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+ INFOPLIST_FILE = Tests/SQLiteTests/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
- PRODUCT_NAME = "SQLite iOS Tests";
+ PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLiteTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;
};
name = Release;
};
- DC37742819C8CC2F004FCF85 /* Debug */ = {
+ EE247B4D1C3F3ED000AE3E12 /* Debug */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = DC37742E19C8CE67004FCF85 /* SQLite Common.xcconfig */;
buildSettings = {
- CLANG_ENABLE_MODULES = YES;
+ APPLICATION_EXTENSION_API_ONLY = YES;
+ CODE_SIGN_IDENTITY = "";
COMBINE_HIDPI_IMAGES = YES;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
FRAMEWORK_VERSION = A;
- GCC_PREPROCESSOR_DEFINITIONS = (
- "DEBUG=1",
- "$(inherited)",
- );
- INFOPLIST_FILE = "SQLite Mac/Info.plist";
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+ INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
- MACOSX_DEPLOYMENT_TARGET = 10.9;
- PRODUCT_NAME = "$(PRODUCT_NAME)";
+ MACOSX_DEPLOYMENT_TARGET = 10.13;
+ PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite;
+ PRODUCT_NAME = SQLite;
SDKROOT = macosx;
SKIP_INSTALL = YES;
- SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_INCLUDE_PATHS = "";
+ SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;
};
name = Debug;
};
- DC37742919C8CC2F004FCF85 /* Release */ = {
+ EE247B4E1C3F3ED000AE3E12 /* Release */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = DC37742E19C8CE67004FCF85 /* SQLite Common.xcconfig */;
buildSettings = {
- CLANG_ENABLE_MODULES = YES;
+ APPLICATION_EXTENSION_API_ONLY = YES;
+ CODE_SIGN_IDENTITY = "";
COMBINE_HIDPI_IMAGES = YES;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
FRAMEWORK_VERSION = A;
- INFOPLIST_FILE = "SQLite Mac/Info.plist";
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+ INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
- MACOSX_DEPLOYMENT_TARGET = 10.9;
- PRODUCT_NAME = "$(PRODUCT_NAME)";
+ MACOSX_DEPLOYMENT_TARGET = 10.13;
+ PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite;
+ PRODUCT_NAME = SQLite;
SDKROOT = macosx;
SKIP_INSTALL = YES;
+ SWIFT_INCLUDE_PATHS = "";
+ SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;
};
name = Release;
};
- DC37742B19C8CC2F004FCF85 /* Debug */ = {
+ EE247B4F1C3F3ED000AE3E12 /* Debug */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = DC37742E19C8CE67004FCF85 /* SQLite Common.xcconfig */;
buildSettings = {
+ CODE_SIGN_IDENTITY = "-";
COMBINE_HIDPI_IMAGES = YES;
- FRAMEWORK_SEARCH_PATHS = (
- "$(DEVELOPER_FRAMEWORKS_DIR)",
- "$(inherited)",
- );
- GCC_PREPROCESSOR_DEFINITIONS = (
- "DEBUG=1",
- "$(inherited)",
- );
- INFOPLIST_FILE = "SQLite Mac Tests/Info.plist";
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+ INFOPLIST_FILE = Tests/SQLiteTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
- MACOSX_DEPLOYMENT_TARGET = 10.9;
- PRODUCT_NAME = "SQLite Mac Tests";
+ MACOSX_DEPLOYMENT_TARGET = 10.13;
+ PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLiteTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx;
+ SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;
};
name = Debug;
};
- DC37742C19C8CC2F004FCF85 /* Release */ = {
+ EE247B501C3F3ED000AE3E12 /* Release */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = DC37742E19C8CE67004FCF85 /* SQLite Common.xcconfig */;
buildSettings = {
+ CODE_SIGN_IDENTITY = "-";
COMBINE_HIDPI_IMAGES = YES;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- FRAMEWORK_SEARCH_PATHS = (
- "$(DEVELOPER_FRAMEWORKS_DIR)",
- "$(inherited)",
- );
- INFOPLIST_FILE = "SQLite Mac Tests/Info.plist";
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+ INFOPLIST_FILE = Tests/SQLiteTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
- MACOSX_DEPLOYMENT_TARGET = 10.9;
- PRODUCT_NAME = "SQLite Mac Tests";
+ MACOSX_DEPLOYMENT_TARGET = 10.13;
+ PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLiteTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx;
+ SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
- DC3773ED19C8CBB3004FCF85 /* Build configuration list for PBXProject "SQLite" */ = {
+ 03A65E6F1C6BB0F60062603F /* Build configuration list for PBXNativeTarget "SQLite tvOS" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 03A65E6B1C6BB0F60062603F /* Debug */,
+ 03A65E6C1C6BB0F60062603F /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 03A65E701C6BB0F60062603F /* Build configuration list for PBXNativeTarget "SQLiteTests tvOS" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 03A65E6D1C6BB0F60062603F /* Debug */,
+ 03A65E6E1C6BB0F60062603F /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ A121AC4C1CA35C79005A31D1 /* Build configuration list for PBXNativeTarget "SQLite watchOS" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ A121AC4A1CA35C79005A31D1 /* Debug */,
+ A121AC4B1CA35C79005A31D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ DEB306E22B61CEF500F9D46B /* Build configuration list for PBXNativeTarget "SQLite visionOS" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DEB306E32B61CEF500F9D46B /* Debug */,
+ DEB306E42B61CEF500F9D46B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ DEB3070E2B61CF9500F9D46B /* Build configuration list for PBXNativeTarget "SQLiteTests visionOS" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DEB3070F2B61CF9500F9D46B /* Debug */,
+ DEB307102B61CF9500F9D46B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ EE247ACD1C3F04ED00AE3E12 /* Build configuration list for PBXProject "SQLite" */ = {
isa = XCConfigurationList;
buildConfigurations = (
- DC37740719C8CBB3004FCF85 /* Debug */,
- DC37740819C8CBB3004FCF85 /* Release */,
+ EE247AE51C3F04ED00AE3E12 /* Debug */,
+ EE247AE61C3F04ED00AE3E12 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
- DC37740919C8CBB3004FCF85 /* Build configuration list for PBXNativeTarget "SQLite iOS" */ = {
+ EE247AE71C3F04ED00AE3E12 /* Build configuration list for PBXNativeTarget "SQLite iOS" */ = {
isa = XCConfigurationList;
buildConfigurations = (
- DC37740A19C8CBB3004FCF85 /* Debug */,
- DC37740B19C8CBB3004FCF85 /* Release */,
+ EE247AE81C3F04ED00AE3E12 /* Debug */,
+ EE247AE91C3F04ED00AE3E12 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
- DC37740C19C8CBB3004FCF85 /* Build configuration list for PBXNativeTarget "SQLite iOS Tests" */ = {
+ EE247AEA1C3F04ED00AE3E12 /* Build configuration list for PBXNativeTarget "SQLiteTests iOS" */ = {
isa = XCConfigurationList;
buildConfigurations = (
- DC37740D19C8CBB3004FCF85 /* Debug */,
- DC37740E19C8CBB3004FCF85 /* Release */,
+ EE247AEB1C3F04ED00AE3E12 /* Debug */,
+ EE247AEC1C3F04ED00AE3E12 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
- DC37742719C8CC2F004FCF85 /* Build configuration list for PBXNativeTarget "SQLite Mac" */ = {
+ EE247B511C3F3ED000AE3E12 /* Build configuration list for PBXNativeTarget "SQLite Mac" */ = {
isa = XCConfigurationList;
buildConfigurations = (
- DC37742819C8CC2F004FCF85 /* Debug */,
- DC37742919C8CC2F004FCF85 /* Release */,
+ EE247B4D1C3F3ED000AE3E12 /* Debug */,
+ EE247B4E1C3F3ED000AE3E12 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
- DC37742A19C8CC2F004FCF85 /* Build configuration list for PBXNativeTarget "SQLite Mac Tests" */ = {
+ EE247B521C3F3ED000AE3E12 /* Build configuration list for PBXNativeTarget "SQLiteTests Mac" */ = {
isa = XCConfigurationList;
buildConfigurations = (
- DC37742B19C8CC2F004FCF85 /* Debug */,
- DC37742C19C8CC2F004FCF85 /* Release */,
+ EE247B4F1C3F3ED000AE3E12 /* Debug */,
+ EE247B501C3F3ED000AE3E12 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
- rootObject = DC3773EA19C8CBB3004FCF85 /* Project object */;
+ rootObject = EE247ACA1C3F04ED00AE3E12 /* Project object */;
}
diff --git a/SQLite.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/SQLite.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/SQLite.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite Mac.xcscheme b/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite Mac.xcscheme
new file mode 100644
index 00000000..a0db21a2
--- /dev/null
+++ b/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite Mac.xcscheme
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite iOS.xcscheme b/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite iOS.xcscheme
new file mode 100644
index 00000000..6cadc289
--- /dev/null
+++ b/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite iOS.xcscheme
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite tvOS.xcscheme b/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite tvOS.xcscheme
new file mode 100644
index 00000000..01966aa1
--- /dev/null
+++ b/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite tvOS.xcscheme
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite visionOS.xcscheme b/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite visionOS.xcscheme
new file mode 100644
index 00000000..c1536b66
--- /dev/null
+++ b/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite visionOS.xcscheme
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite watchOS.xcscheme b/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite watchOS.xcscheme
new file mode 100644
index 00000000..be1ef0ee
--- /dev/null
+++ b/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite watchOS.xcscheme
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Sources/SQLite/Core/Backup.swift b/Sources/SQLite/Core/Backup.swift
new file mode 100644
index 00000000..023acc08
--- /dev/null
+++ b/Sources/SQLite/Core/Backup.swift
@@ -0,0 +1,173 @@
+//
+// SQLite.swift
+// https://github.com/stephencelis/SQLite.swift
+// Copyright © 2014-2015 Stephen Celis.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+import Foundation
+import Dispatch
+#if SQLITE_SWIFT_STANDALONE
+import sqlite3
+#elseif SQLITE_SWIFT_SQLCIPHER
+import SQLCipher
+#elseif canImport(SwiftToolchainCSQLite)
+import SwiftToolchainCSQLite
+#else
+import SQLite3
+#endif
+
+/// An object representing database backup.
+///
+/// See:
+public final class Backup {
+
+ /// The name of the database to backup
+ public enum DatabaseName {
+
+ /// The main database
+ case main
+
+ /// The temporary database
+ case temp
+
+ /// A database added to the connection with ATTACH statement
+ case attached(name: String)
+
+ var name: String {
+ switch self {
+ case .main:
+ return "main"
+ case .temp:
+ return "temp"
+ case .attached(let name):
+ return name
+ }
+ }
+ }
+
+ /// Number of pages to copy while performing a backup step
+ public enum Pages {
+
+ /// Indicates all remaining pages should be copied
+ case all
+
+ /// Indicates the maximal number of pages to be copied in single step
+ case limited(number: Int32)
+
+ var number: Int32 {
+ switch self {
+ case .all:
+ return -1
+ case .limited(let number):
+ return number
+ }
+ }
+ }
+
+ /// Total number of pages to copy
+ ///
+ /// See:
+ public var pageCount: Int32 {
+ return handle.map { sqlite3_backup_pagecount($0) } ?? 0
+ }
+
+ /// Number of remaining pages to copy.
+ ///
+ /// See:
+ public var remainingPages: Int32 {
+ return handle.map { sqlite3_backup_remaining($0) } ?? 0
+ }
+
+ private let targetConnection: Connection
+ private let sourceConnection: Connection
+
+ private var handle: OpaquePointer?
+
+ /// Initializes a new SQLite backup.
+ ///
+ /// - Parameters:
+ ///
+ /// - sourceConnection: The connection to the database to backup.
+ /// - sourceName: The name of the database to backup.
+ /// Default: `.main`.
+ ///
+ /// - targetConnection: The connection to the database to save backup into.
+ /// - targetName: The name of the database to save backup into.
+ /// Default: `.main`.
+ ///
+ /// - Returns: A new database backup.
+ ///
+ /// See:
+ public init(sourceConnection: Connection,
+ sourceName: DatabaseName = .main,
+ targetConnection: Connection,
+ targetName: DatabaseName = .main) throws {
+
+ self.targetConnection = targetConnection
+ self.sourceConnection = sourceConnection
+
+ self.handle = sqlite3_backup_init(targetConnection.handle,
+ targetName.name,
+ sourceConnection.handle,
+ sourceName.name)
+
+ if handle == nil, let error = Result(errorCode: sqlite3_errcode(targetConnection.handle),
+ connection: targetConnection) {
+ throw error
+ }
+ }
+
+ /// Performs a backup step.
+ ///
+ /// - Parameter pagesToCopy: The maximal number of pages to copy in one step
+ ///
+ /// - Throws: `Result.Error` if step fails.
+ ///
+ /// See:
+ public func step(pagesToCopy pages: Pages = .all) throws {
+ let status = sqlite3_backup_step(handle, pages.number)
+
+ guard status != SQLITE_DONE else {
+ finish()
+ return
+ }
+
+ if let error = Result(errorCode: status, connection: targetConnection) {
+ throw error
+ }
+ }
+
+ /// Finalizes backup.
+ ///
+ /// See:
+ public func finish() {
+ guard let handle = self.handle else {
+ return
+ }
+
+ sqlite3_backup_finish(handle)
+ self.handle = nil
+ }
+
+ deinit {
+ finish()
+ }
+}
diff --git a/SQLite Common/SQLite-Bridging.c b/Sources/SQLite/Core/Blob.swift
similarity index 57%
rename from SQLite Common/SQLite-Bridging.c
rename to Sources/SQLite/Core/Blob.swift
index eb34b9d2..a709fb42 100644
--- a/SQLite Common/SQLite-Bridging.c
+++ b/Sources/SQLite/Core/Blob.swift
@@ -1,6 +1,7 @@
//
-// SQLite-Bridging.c
-// Copyright (c) 2014 Stephen Celis.
+// SQLite.swift
+// https://github.com/stephencelis/SQLite.swift
+// Copyright © 2014-2015 Stephen Celis.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
@@ -21,30 +22,35 @@
// THE SOFTWARE.
//
-#include "SQLite-Bridging.h"
+public struct Blob {
-#include
+ public let bytes: [UInt8]
-int _SQLiteBusyHandler(void * context, int tries) {
- return ((SQLiteBusyHandlerCallback)context)(tries);
+ public init(bytes: [UInt8]) {
+ self.bytes = bytes
+ }
+
+ public init(bytes: UnsafeRawPointer, length: Int) {
+ let i8bufptr = UnsafeBufferPointer(start: bytes.assumingMemoryBound(to: UInt8.self), count: length)
+ self.init(bytes: [UInt8](i8bufptr))
+ }
+
+ public func toHex() -> String {
+ bytes.map {
+ ($0 < 16 ? "0" : "") + String($0, radix: 16, uppercase: false)
+ }.joined(separator: "")
+ }
}
-void SQLiteBusyHandler(sqlite3 * handle, SQLiteBusyHandlerCallback callback) {
- if (callback) {
- sqlite3_busy_handler(handle, _SQLiteBusyHandler, Block_copy(callback)); // FIXME: leak
- } else {
- sqlite3_busy_handler(handle, 0, 0);
+extension Blob: CustomStringConvertible {
+ public var description: String {
+ "x'\(toHex())'"
}
}
-void _SQLiteTrace(void * context, const char * SQL) {
- ((SQLiteTraceCallback)context)(SQL);
+extension Blob: Equatable {
}
-void SQLiteTrace(sqlite3 * handle, SQLiteTraceCallback callback) {
- if (callback) {
- sqlite3_trace(handle, _SQLiteTrace, Block_copy(callback)); // FIXME: leak
- } else {
- sqlite3_trace(handle, 0, 0);
- }
+public func ==(lhs: Blob, rhs: Blob) -> Bool {
+ lhs.bytes == rhs.bytes
}
diff --git a/Sources/SQLite/Core/Connection+Aggregation.swift b/Sources/SQLite/Core/Connection+Aggregation.swift
new file mode 100644
index 00000000..a1abb74a
--- /dev/null
+++ b/Sources/SQLite/Core/Connection+Aggregation.swift
@@ -0,0 +1,155 @@
+import Foundation
+#if SQLITE_SWIFT_STANDALONE
+import sqlite3
+#elseif SQLITE_SWIFT_SQLCIPHER
+import SQLCipher
+#elseif canImport(SwiftToolchainCSQLite)
+import SwiftToolchainCSQLite
+#else
+import SQLite3
+#endif
+
+extension Connection {
+ private typealias Aggregate = @convention(block) (Int, Context, Int32, Argv) -> Void
+
+ /// Creates or redefines a custom SQL aggregate.
+ ///
+ /// - Parameters:
+ ///
+ /// - aggregate: The name of the aggregate to create or redefine.
+ ///
+ /// - argumentCount: The number of arguments that the aggregate takes. If
+ /// `nil`, the aggregate may take any number of arguments.
+ ///
+ /// Default: `nil`
+ ///
+ /// - deterministic: Whether or not the aggregate is deterministic (_i.e._
+ /// the aggregate always returns the same result for a given input).
+ ///
+ /// Default: `false`
+ ///
+ /// - step: A block of code to run for each row of an aggregation group.
+ /// The block is called with an array of raw SQL values mapped to the
+ /// aggregate’s parameters, and an UnsafeMutablePointer to a state
+ /// variable.
+ ///
+ /// - final: A block of code to run after each row of an aggregation group
+ /// is processed. The block is called with an UnsafeMutablePointer to a
+ /// state variable, and should return a raw SQL value (or nil).
+ ///
+ /// - state: A block of code to run to produce a fresh state variable for
+ /// each aggregation group. The block should return an
+ /// UnsafeMutablePointer to the fresh state variable.
+ public func createAggregation(
+ _ functionName: String,
+ argumentCount: UInt? = nil,
+ deterministic: Bool = false,
+ step: @escaping ([Binding?], UnsafeMutablePointer) -> Void,
+ final: @escaping (UnsafeMutablePointer) -> Binding?,
+ state: @escaping () -> UnsafeMutablePointer) {
+
+ let argc = argumentCount.map { Int($0) } ?? -1
+ let box: Aggregate = { (stepFlag: Int, context: Context, argc: Int32, argv: Argv) in
+ let nBytes = Int32(MemoryLayout>.size)
+ guard let aggregateContext = sqlite3_aggregate_context(context, nBytes) else {
+ fatalError("Could not get aggregate context")
+ }
+ let mutablePointer = aggregateContext.assumingMemoryBound(to: UnsafeMutableRawPointer.self)
+ if stepFlag > 0 {
+ let arguments = argv.getBindings(argc: argc)
+ if aggregateContext.assumingMemoryBound(to: Int64.self).pointee == 0 {
+ mutablePointer.pointee = UnsafeMutableRawPointer(mutating: state())
+ }
+ step(arguments, mutablePointer.pointee.assumingMemoryBound(to: T.self))
+ } else {
+ let result = final(mutablePointer.pointee.assumingMemoryBound(to: T.self))
+ context.set(result: result)
+ }
+ }
+
+ func xStep(context: Context, argc: Int32, value: Argv) {
+ unsafeBitCast(sqlite3_user_data(context), to: Aggregate.self)(1, context, argc, value)
+ }
+
+ func xFinal(context: Context) {
+ unsafeBitCast(sqlite3_user_data(context), to: Aggregate.self)(0, context, 0, nil)
+ }
+
+ let flags = SQLITE_UTF8 | (deterministic ? SQLITE_DETERMINISTIC : 0)
+ let resultCode = sqlite3_create_function_v2(
+ handle,
+ functionName,
+ Int32(argc),
+ flags,
+ /* pApp */ unsafeBitCast(box, to: UnsafeMutableRawPointer.self),
+ /* xFunc */ nil, xStep, xFinal, /* xDestroy */ nil
+ )
+ if let result = Result(errorCode: resultCode, connection: self) {
+ fatalError("Error creating function: \(result)")
+ }
+ register(functionName, argc: argc, value: box)
+ }
+
+ public func createAggregation(
+ _ aggregate: String,
+ argumentCount: UInt? = nil,
+ deterministic: Bool = false,
+ initialValue: T,
+ reduce: @escaping (T, [Binding?]) -> T,
+ result: @escaping (T) -> Binding?
+ ) {
+ let step: ([Binding?], UnsafeMutablePointer) -> Void = { (bindings, ptr) in
+ let pointer = ptr.pointee.assumingMemoryBound(to: T.self)
+ let current = Unmanaged.fromOpaque(pointer).takeRetainedValue()
+ let next = reduce(current, bindings)
+ ptr.pointee = Unmanaged.passRetained(next).toOpaque()
+ }
+
+ let final: (UnsafeMutablePointer) -> Binding? = { ptr in
+ let pointer = ptr.pointee.assumingMemoryBound(to: T.self)
+ let obj = Unmanaged.fromOpaque(pointer).takeRetainedValue()
+ let value = result(obj)
+ ptr.deallocate()
+ return value
+ }
+
+ let state: () -> UnsafeMutablePointer = {
+ let pointer = UnsafeMutablePointer.allocate(capacity: 1)
+ pointer.pointee = Unmanaged.passRetained(initialValue).toOpaque()
+ return pointer
+ }
+
+ createAggregation(aggregate, step: step, final: final, state: state)
+ }
+
+ public func createAggregation(
+ _ aggregate: String,
+ argumentCount: UInt? = nil,
+ deterministic: Bool = false,
+ initialValue: T,
+ reduce: @escaping (T, [Binding?]) -> T,
+ result: @escaping (T) -> Binding?
+ ) {
+
+ let step: ([Binding?], UnsafeMutablePointer) -> Void = { (bindings, pointer) in
+ let current = pointer.pointee
+ let next = reduce(current, bindings)
+ pointer.pointee = next
+ }
+
+ let final: (UnsafeMutablePointer) -> Binding? = { pointer in
+ let value = result(pointer.pointee)
+ pointer.deallocate()
+ return value
+ }
+
+ let state: () -> UnsafeMutablePointer = {
+ let pointer = UnsafeMutablePointer.allocate(capacity: 1)
+ pointer.initialize(to: initialValue)
+ return pointer
+ }
+
+ createAggregation(aggregate, step: step, final: final, state: state)
+ }
+
+}
diff --git a/Sources/SQLite/Core/Connection+Attach.swift b/Sources/SQLite/Core/Connection+Attach.swift
new file mode 100644
index 00000000..0c674ee6
--- /dev/null
+++ b/Sources/SQLite/Core/Connection+Attach.swift
@@ -0,0 +1,33 @@
+import Foundation
+#if SQLITE_SWIFT_STANDALONE
+import sqlite3
+#elseif SQLITE_SWIFT_SQLCIPHER
+import SQLCipher
+#elseif canImport(SwiftToolchainCSQLite)
+import SwiftToolchainCSQLite
+#else
+import SQLite3
+#endif
+
+extension Connection {
+ #if SQLITE_SWIFT_SQLCIPHER
+ /// See https://www.zetetic.net/sqlcipher/sqlcipher-api/#attach
+ public func attach(_ location: Location, as schemaName: String, key: String? = nil) throws {
+ if let key {
+ try run("ATTACH DATABASE ? AS ? KEY ?", location.description, schemaName, key)
+ } else {
+ try run("ATTACH DATABASE ? AS ?", location.description, schemaName)
+ }
+ }
+ #else
+ /// See https://www3.sqlite.org/lang_attach.html
+ public func attach(_ location: Location, as schemaName: String) throws {
+ try run("ATTACH DATABASE ? AS ?", location.description, schemaName)
+ }
+ #endif
+
+ /// See https://www3.sqlite.org/lang_detach.html
+ public func detach(_ schemaName: String) throws {
+ try run("DETACH DATABASE ?", schemaName)
+ }
+}
diff --git a/Sources/SQLite/Core/Connection+Pragmas.swift b/Sources/SQLite/Core/Connection+Pragmas.swift
new file mode 100644
index 00000000..2c4f0efb
--- /dev/null
+++ b/Sources/SQLite/Core/Connection+Pragmas.swift
@@ -0,0 +1,51 @@
+import Foundation
+
+public typealias UserVersion = Int32
+
+public extension Connection {
+ /// The user version of the database.
+ /// See SQLite [PRAGMA user_version](https://sqlite.org/pragma.html#pragma_user_version)
+ var userVersion: UserVersion? {
+ get {
+ (try? scalar("PRAGMA user_version") as? Int64)?.map(Int32.init)
+ }
+ set {
+ _ = try? run("PRAGMA user_version = \(newValue ?? 0)")
+ }
+ }
+
+ /// The version of SQLite.
+ /// See SQLite [sqlite_version()](https://sqlite.org/lang_corefunc.html#sqlite_version)
+ var sqliteVersion: SQLiteVersion {
+ guard let version = (try? scalar("SELECT sqlite_version()")) as? String,
+ let splits = .some(version.split(separator: ".", maxSplits: 3)), splits.count == 3,
+ let major = Int(splits[0]), let minor = Int(splits[1]), let point = Int(splits[2]) else {
+ return .zero
+ }
+ return .init(major: major, minor: minor, point: point)
+ }
+
+ // Changing the foreign_keys setting affects the execution of all statements prepared using the database
+ // connection, including those prepared before the setting was changed.
+ //
+ // https://sqlite.org/pragma.html#pragma_foreign_keys
+ var foreignKeys: Bool {
+ get { getBoolPragma("foreign_keys") }
+ set { setBoolPragma("foreign_keys", newValue) }
+ }
+
+ var deferForeignKeys: Bool {
+ get { getBoolPragma("defer_foreign_keys") }
+ set { setBoolPragma("defer_foreign_keys", newValue) }
+ }
+
+ private func getBoolPragma(_ key: String) -> Bool {
+ guard let binding = try? scalar("PRAGMA \(key)"),
+ let intBinding = binding as? Int64 else { return false }
+ return intBinding == 1
+ }
+
+ private func setBoolPragma(_ key: String, _ newValue: Bool) {
+ _ = try? run("PRAGMA \(key) = \(newValue ? "1" : "0")")
+ }
+}
diff --git a/Sources/SQLite/Core/Connection.swift b/Sources/SQLite/Core/Connection.swift
new file mode 100644
index 00000000..57521f83
--- /dev/null
+++ b/Sources/SQLite/Core/Connection.swift
@@ -0,0 +1,787 @@
+//
+// SQLite.swift
+// https://github.com/stephencelis/SQLite.swift
+// Copyright © 2014-2015 Stephen Celis.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+import Foundation
+import Dispatch
+#if SQLITE_SWIFT_STANDALONE
+import sqlite3
+#elseif SQLITE_SWIFT_SQLCIPHER
+import SQLCipher
+#elseif canImport(SwiftToolchainCSQLite)
+import SwiftToolchainCSQLite
+#else
+import SQLite3
+#endif
+
+/// A connection to SQLite.
+public final class Connection {
+
+ /// The location of a SQLite database.
+ public enum Location {
+
+ /// An in-memory database (equivalent to `.uri(":memory:")`).
+ ///
+ /// See:
+ case inMemory
+
+ /// A temporary, file-backed database (equivalent to `.uri("")`).
+ ///
+ /// See:
+ case temporary
+
+ /// A database located at the given URI filename (or path).
+ ///
+ /// See:
+ ///
+ /// - Parameter filename: A URI filename
+ /// - Parameter parameters: optional query parameters
+ case uri(String, parameters: [URIQueryParameter] = [])
+ }
+
+ /// An SQL operation passed to update callbacks.
+ public enum Operation {
+
+ /// An INSERT operation.
+ case insert
+
+ /// An UPDATE operation.
+ case update
+
+ /// A DELETE operation.
+ case delete
+
+ fileprivate init(rawValue: Int32) {
+ switch rawValue {
+ case SQLITE_INSERT:
+ self = .insert
+ case SQLITE_UPDATE:
+ self = .update
+ case SQLITE_DELETE:
+ self = .delete
+ default:
+ fatalError("unhandled operation code: \(rawValue)")
+ }
+ }
+ }
+
+ public var handle: OpaquePointer { _handle! }
+
+ fileprivate var _handle: OpaquePointer?
+
+ /// Initializes a new SQLite connection.
+ ///
+ /// - Parameters:
+ ///
+ /// - location: The location of the database. Creates a new database if it
+ /// doesn’t already exist (unless in read-only mode).
+ ///
+ /// Default: `.inMemory`.
+ ///
+ /// - readonly: Whether or not to open the database in a read-only state.
+ ///
+ /// Default: `false`.
+ ///
+ /// - Returns: A new database connection.
+ public init(_ location: Location = .inMemory, readonly: Bool = false) throws {
+ let flags = readonly ? SQLITE_OPEN_READONLY : (SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE)
+ try check(sqlite3_open_v2(location.description,
+ &_handle,
+ flags | SQLITE_OPEN_FULLMUTEX | SQLITE_OPEN_URI,
+ nil))
+ queue.setSpecific(key: Connection.queueKey, value: queueContext)
+ }
+
+ /// Initializes a new connection to a database.
+ ///
+ /// - Parameters:
+ ///
+ /// - filename: The location of the database. Creates a new database if
+ /// it doesn’t already exist (unless in read-only mode).
+ ///
+ /// - readonly: Whether or not to open the database in a read-only state.
+ ///
+ /// Default: `false`.
+ ///
+ /// - Throws: `Result.Error` iff a connection cannot be established.
+ ///
+ /// - Returns: A new database connection.
+ public convenience init(_ filename: String, readonly: Bool = false) throws {
+ try self.init(.uri(filename), readonly: readonly)
+ }
+
+ deinit {
+ sqlite3_close(handle)
+ }
+
+ // MARK: -
+
+ /// Whether or not the database was opened in a read-only state.
+ public var readonly: Bool { sqlite3_db_readonly(handle, nil) == 1 }
+
+ /// The last rowid inserted into the database via this connection.
+ public var lastInsertRowid: Int64 {
+ sqlite3_last_insert_rowid(handle)
+ }
+
+ /// The last number of changes (inserts, updates, or deletes) made to the
+ /// database via this connection.
+ public var changes: Int {
+ Int(sqlite3_changes(handle))
+ }
+
+ /// The total number of changes (inserts, updates, or deletes) made to the
+ /// database via this connection.
+ public var totalChanges: Int {
+ Int(sqlite3_total_changes(handle))
+ }
+
+ /// Whether or not the database will return extended error codes when errors are handled.
+ public var usesExtendedErrorCodes: Bool = false {
+ didSet {
+ sqlite3_extended_result_codes(handle, usesExtendedErrorCodes ? 1 : 0)
+ }
+ }
+
+ // MARK: - Execute
+
+ /// Executes a batch of SQL statements.
+ ///
+ /// - Parameter SQL: A batch of zero or more semicolon-separated SQL
+ /// statements.
+ ///
+ /// - Throws: `Result.Error` if query execution fails.
+ public func execute(_ SQL: String) throws {
+ _ = try sync { try check(sqlite3_exec(handle, SQL, nil, nil, nil)) }
+ }
+
+ // MARK: - Prepare
+
+ /// Prepares a single SQL statement (with optional parameter bindings).
+ ///
+ /// - Parameters:
+ ///
+ /// - statement: A single SQL statement.
+ ///
+ /// - bindings: A list of parameters to bind to the statement.
+ ///
+ /// - Returns: A prepared statement.
+ public func prepare(_ statement: String, _ bindings: Binding?...) throws -> Statement {
+ if !bindings.isEmpty { return try prepare(statement, bindings) }
+ return try Statement(self, statement)
+ }
+
+ /// Prepares a single SQL statement and binds parameters to it.
+ ///
+ /// - Parameters:
+ ///
+ /// - statement: A single SQL statement.
+ ///
+ /// - bindings: A list of parameters to bind to the statement.
+ ///
+ /// - Returns: A prepared statement.
+ public func prepare(_ statement: String, _ bindings: [Binding?]) throws -> Statement {
+ try prepare(statement).bind(bindings)
+ }
+
+ /// Prepares a single SQL statement and binds parameters to it.
+ ///
+ /// - Parameters:
+ ///
+ /// - statement: A single SQL statement.
+ ///
+ /// - bindings: A dictionary of named parameters to bind to the statement.
+ ///
+ /// - Returns: A prepared statement.
+ public func prepare(_ statement: String, _ bindings: [String: Binding?]) throws -> Statement {
+ try prepare(statement).bind(bindings)
+ }
+
+ // MARK: - Run
+
+ /// Runs a single SQL statement (with optional parameter bindings).
+ ///
+ /// - Parameters:
+ ///
+ /// - statement: A single SQL statement.
+ ///
+ /// - bindings: A list of parameters to bind to the statement.
+ ///
+ /// - Throws: `Result.Error` if query execution fails.
+ ///
+ /// - Returns: The statement.
+ @discardableResult public func run(_ statement: String, _ bindings: Binding?...) throws -> Statement {
+ try run(statement, bindings)
+ }
+
+ /// Prepares, binds, and runs a single SQL statement.
+ ///
+ /// - Parameters:
+ ///
+ /// - statement: A single SQL statement.
+ ///
+ /// - bindings: A list of parameters to bind to the statement.
+ ///
+ /// - Throws: `Result.Error` if query execution fails.
+ ///
+ /// - Returns: The statement.
+ @discardableResult public func run(_ statement: String, _ bindings: [Binding?]) throws -> Statement {
+ try prepare(statement).run(bindings)
+ }
+
+ /// Prepares, binds, and runs a single SQL statement.
+ ///
+ /// - Parameters:
+ ///
+ /// - statement: A single SQL statement.
+ ///
+ /// - bindings: A dictionary of named parameters to bind to the statement.
+ ///
+ /// - Throws: `Result.Error` if query execution fails.
+ ///
+ /// - Returns: The statement.
+ @discardableResult public func run(_ statement: String, _ bindings: [String: Binding?]) throws -> Statement {
+ try prepare(statement).run(bindings)
+ }
+
+ // MARK: - VACUUM
+
+ /// Run a vacuum on the database
+ ///
+ /// - Throws: `Result.Error` if query execution fails.
+ ///
+ /// - Returns: The statement.
+ @discardableResult public func vacuum() throws -> Statement {
+ try run("VACUUM")
+ }
+
+ // MARK: - Scalar
+
+ /// Runs a single SQL statement (with optional parameter bindings),
+ /// returning the first value of the first row.
+ ///
+ /// - Parameters:
+ ///
+ /// - statement: A single SQL statement.
+ ///
+ /// - bindings: A list of parameters to bind to the statement.
+ ///
+ /// - Returns: The first value of the first row returned.
+ public func scalar(_ statement: String, _ bindings: Binding?...) throws -> Binding? {
+ try scalar(statement, bindings)
+ }
+
+ /// Runs a single SQL statement (with optional parameter bindings),
+ /// returning the first value of the first row.
+ ///
+ /// - Parameters:
+ ///
+ /// - statement: A single SQL statement.
+ ///
+ /// - bindings: A list of parameters to bind to the statement.
+ ///
+ /// - Returns: The first value of the first row returned.
+ public func scalar(_ statement: String, _ bindings: [Binding?]) throws -> Binding? {
+ try prepare(statement).scalar(bindings)
+ }
+
+ /// Runs a single SQL statement (with optional parameter bindings),
+ /// returning the first value of the first row.
+ ///
+ /// - Parameters:
+ ///
+ /// - statement: A single SQL statement.
+ ///
+ /// - bindings: A dictionary of named parameters to bind to the statement.
+ ///
+ /// - Returns: The first value of the first row returned.
+ public func scalar(_ statement: String, _ bindings: [String: Binding?]) throws -> Binding? {
+ try prepare(statement).scalar(bindings)
+ }
+
+ // MARK: - Transactions
+
+ /// The mode in which a transaction acquires a lock.
+ public enum TransactionMode: String {
+
+ /// Defers locking the database till the first read/write executes.
+ case deferred = "DEFERRED"
+
+ /// Immediately acquires a reserved lock on the database.
+ case immediate = "IMMEDIATE"
+
+ /// Immediately acquires an exclusive lock on all databases.
+ case exclusive = "EXCLUSIVE"
+
+ }
+
+ // TODO: Consider not requiring a throw to roll back?
+ /// Runs a transaction with the given mode.
+ ///
+ /// - Note: Transactions cannot be nested. To nest transactions, see
+ /// `savepoint()`, instead.
+ ///
+ /// - Parameters:
+ ///
+ /// - mode: The mode in which a transaction acquires a lock.
+ ///
+ /// Default: `.deferred`
+ ///
+ /// - block: A closure to run SQL statements within the transaction.
+ /// The transaction will be committed when the block returns. The block
+ /// must throw to roll the transaction back.
+ ///
+ /// - Throws: `Result.Error`, and rethrows.
+ public func transaction(_ mode: TransactionMode = .deferred, block: () throws -> Void) throws {
+ try transaction("BEGIN \(mode.rawValue) TRANSACTION", block, "COMMIT TRANSACTION", or: "ROLLBACK TRANSACTION")
+ }
+
+ // TODO: Consider not requiring a throw to roll back?
+ // TODO: Consider removing ability to set a name?
+ /// Runs a transaction with the given savepoint name (if omitted, it will
+ /// generate a UUID).
+ ///
+ /// - SeeAlso: `transaction()`.
+ ///
+ /// - Parameters:
+ ///
+ /// - savepointName: A unique identifier for the savepoint (optional).
+ ///
+ /// - block: A closure to run SQL statements within the transaction.
+ /// The savepoint will be released (committed) when the block returns.
+ /// The block must throw to roll the savepoint back.
+ ///
+ /// - Throws: `SQLite.Result.Error`, and rethrows.
+ public func savepoint(_ name: String = UUID().uuidString, block: () throws -> Void) throws {
+ let name = name.quote("'")
+ let savepoint = "SAVEPOINT \(name)"
+
+ try transaction(savepoint, block, "RELEASE \(savepoint)", or: "ROLLBACK TO \(savepoint)")
+ }
+
+ fileprivate func transaction(_ begin: String, _ block: () throws -> Void, _ commit: String, or rollback: String) throws {
+ return try sync {
+ try self.run(begin)
+ do {
+ try block()
+ try self.run(commit)
+ } catch {
+ try self.run(rollback)
+ throw error
+ }
+ }
+ }
+
+ /// Interrupts any long-running queries.
+ public func interrupt() {
+ sqlite3_interrupt(handle)
+ }
+
+ // MARK: - Handlers
+
+ /// The number of seconds a connection will attempt to retry a statement
+ /// after encountering a busy signal (lock).
+ public var busyTimeout: Double = 0 {
+ didSet {
+ sqlite3_busy_timeout(handle, Int32(busyTimeout * 1_000))
+ }
+ }
+
+ /// Sets a handler to call after encountering a busy signal (lock).
+ ///
+ /// - Parameter callback: This block is executed during a lock in which a
+ /// busy error would otherwise be returned. It’s passed the number of
+ /// times it’s been called for this lock. If it returns `true`, it will
+ /// try again. If it returns `false`, no further attempts will be made.
+ public func busyHandler(_ callback: ((_ tries: Int) -> Bool)?) {
+ guard let callback else {
+ sqlite3_busy_handler(handle, nil, nil)
+ busyHandler = nil
+ return
+ }
+
+ let box: BusyHandler = { callback(Int($0)) ? 1 : 0 }
+ sqlite3_busy_handler(handle, { callback, tries in
+ unsafeBitCast(callback, to: BusyHandler.self)(tries)
+ }, unsafeBitCast(box, to: UnsafeMutableRawPointer.self))
+ busyHandler = box
+ }
+ fileprivate typealias BusyHandler = @convention(block) (Int32) -> Int32
+ fileprivate var busyHandler: BusyHandler?
+
+ /// Sets a handler to call when a statement is executed with the compiled
+ /// SQL.
+ ///
+ /// - Parameter callback: This block is invoked when a statement is executed
+ /// with the compiled SQL as its argument.
+ ///
+ /// db.trace { SQL in print(SQL) }
+ public func trace(_ callback: ((String) -> Void)?) {
+ if #available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) {
+ trace_v2(callback)
+ } else {
+ trace_v1(callback)
+ }
+ }
+
+ @available(OSX, deprecated: 10.12)
+ @available(iOS, deprecated: 10.0)
+ @available(watchOS, deprecated: 3.0)
+ @available(tvOS, deprecated: 10.0)
+ fileprivate func trace_v1(_ callback: ((String) -> Void)?) {
+ guard let callback else {
+ sqlite3_trace(handle, nil /* xCallback */, nil /* pCtx */)
+ trace = nil
+ return
+ }
+ let box: Trace = { (pointer: UnsafeRawPointer) in
+ callback(String(cString: pointer.assumingMemoryBound(to: UInt8.self)))
+ }
+ sqlite3_trace(handle, { (context: UnsafeMutableRawPointer?, SQL: UnsafePointer?) in
+ if let context, let SQL {
+ unsafeBitCast(context, to: Trace.self)(SQL)
+ }
+ },
+ unsafeBitCast(box, to: UnsafeMutableRawPointer.self)
+ )
+ trace = box
+ }
+
+ @available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *)
+ fileprivate func trace_v2(_ callback: ((String) -> Void)?) {
+ guard let callback else {
+ // If the X callback is NULL or if the M mask is zero, then tracing is disabled.
+ sqlite3_trace_v2(handle, 0 /* mask */, nil /* xCallback */, nil /* pCtx */)
+ trace = nil
+ return
+ }
+
+ let box: Trace = { (pointer: UnsafeRawPointer) in
+ callback(String(cString: pointer.assumingMemoryBound(to: UInt8.self)))
+ }
+ sqlite3_trace_v2(handle, UInt32(SQLITE_TRACE_STMT) /* mask */, {
+ // A trace callback is invoked with four arguments: callback(T,C,P,X).
+ // The T argument is one of the SQLITE_TRACE constants to indicate why the
+ // callback was invoked. The C argument is a copy of the context pointer.
+ // The P and X arguments are pointers whose meanings depend on T.
+ (_: UInt32, context: UnsafeMutableRawPointer?, pointer: UnsafeMutableRawPointer?, _: UnsafeMutableRawPointer?) in
+ if let pointer,
+ let expandedSQL = sqlite3_expanded_sql(OpaquePointer(pointer)) {
+ unsafeBitCast(context, to: Trace.self)(expandedSQL)
+ sqlite3_free(expandedSQL)
+ }
+ return Int32(0) // currently ignored
+ },
+ unsafeBitCast(box, to: UnsafeMutableRawPointer.self) /* pCtx */
+ )
+ trace = box
+ }
+
+ fileprivate typealias Trace = @convention(block) (UnsafeRawPointer) -> Void
+ fileprivate var trace: Trace?
+
+ /// Registers a callback to be invoked whenever a row is inserted, updated,
+ /// or deleted in a rowid table.
+ ///
+ /// - Parameter callback: A callback invoked with the `Operation` (one of
+ /// `.Insert`, `.Update`, or `.Delete`), database name, table name, and
+ /// rowid.
+ public func updateHook(_ callback: ((_ operation: Operation, _ db: String, _ table: String, _ rowid: Int64) -> Void)?) {
+ guard let callback else {
+ sqlite3_update_hook(handle, nil, nil)
+ updateHook = nil
+ return
+ }
+
+ let box: UpdateHook = {
+ callback(
+ Operation(rawValue: $0),
+ String(cString: $1),
+ String(cString: $2),
+ $3
+ )
+ }
+ sqlite3_update_hook(handle, { callback, operation, db, table, rowid in
+ unsafeBitCast(callback, to: UpdateHook.self)(operation, db!, table!, rowid)
+ }, unsafeBitCast(box, to: UnsafeMutableRawPointer.self))
+ updateHook = box
+ }
+ fileprivate typealias UpdateHook = @convention(block) (Int32, UnsafePointer, UnsafePointer, Int64) -> Void
+ fileprivate var updateHook: UpdateHook?
+
+ /// Registers a callback to be invoked whenever a transaction is committed.
+ ///
+ /// - Parameter callback: A callback invoked whenever a transaction is
+ /// committed. If this callback throws, the transaction will be rolled
+ /// back.
+ public func commitHook(_ callback: (() throws -> Void)?) {
+ guard let callback else {
+ sqlite3_commit_hook(handle, nil, nil)
+ commitHook = nil
+ return
+ }
+
+ let box: CommitHook = {
+ do {
+ try callback()
+ } catch {
+ return 1
+ }
+ return 0
+ }
+ sqlite3_commit_hook(handle, { callback in
+ unsafeBitCast(callback, to: CommitHook.self)()
+ }, unsafeBitCast(box, to: UnsafeMutableRawPointer.self))
+ commitHook = box
+ }
+ fileprivate typealias CommitHook = @convention(block) () -> Int32
+ fileprivate var commitHook: CommitHook?
+
+ /// Registers a callback to be invoked whenever a transaction rolls back.
+ ///
+ /// - Parameter callback: A callback invoked when a transaction is rolled
+ /// back.
+ public func rollbackHook(_ callback: (() -> Void)?) {
+ guard let callback else {
+ sqlite3_rollback_hook(handle, nil, nil)
+ rollbackHook = nil
+ return
+ }
+
+ let box: RollbackHook = { callback() }
+ sqlite3_rollback_hook(handle, { callback in
+ unsafeBitCast(callback, to: RollbackHook.self)()
+ }, unsafeBitCast(box, to: UnsafeMutableRawPointer.self))
+ rollbackHook = box
+ }
+ fileprivate typealias RollbackHook = @convention(block) () -> Void
+ fileprivate var rollbackHook: RollbackHook?
+
+ /// Creates or redefines a custom SQL function.
+ ///
+ /// - Parameters:
+ ///
+ /// - function: The name of the function to create or redefine.
+ ///
+ /// - argumentCount: The number of arguments that the function takes. If
+ /// `nil`, the function may take any number of arguments.
+ ///
+ /// Default: `nil`
+ ///
+ /// - deterministic: Whether or not the function is deterministic (_i.e._
+ /// the function always returns the same result for a given input).
+ ///
+ /// Default: `false`
+ ///
+ /// - block: A block of code to run when the function is called. The block
+ /// is called with an array of raw SQL values mapped to the function’s
+ /// parameters and should return a raw SQL value (or nil).
+ public func createFunction(_ functionName: String,
+ argumentCount: UInt? = nil,
+ deterministic: Bool = false,
+ _ block: @escaping (_ args: [Binding?]) -> Binding?) {
+ let argc = argumentCount.map { Int($0) } ?? -1
+ let box: Function = { (context: Context, argc, argv: Argv) in
+ context.set(result: block(argv.getBindings(argc: argc)))
+ }
+ func xFunc(context: Context, argc: Int32, value: Argv) {
+ unsafeBitCast(sqlite3_user_data(context), to: Function.self)(context, argc, value)
+ }
+ let flags = SQLITE_UTF8 | (deterministic ? SQLITE_DETERMINISTIC : 0)
+ let resultCode = sqlite3_create_function_v2(
+ handle,
+ functionName,
+ Int32(argc),
+ flags,
+ /* pApp */ unsafeBitCast(box, to: UnsafeMutableRawPointer.self),
+ xFunc, /*xStep*/ nil, /*xFinal*/ nil, /*xDestroy*/ nil
+ )
+
+ if let result = Result(errorCode: resultCode, connection: self) {
+ fatalError("Error creating function: \(result)")
+ }
+ register(functionName, argc: argc, value: box)
+ }
+
+ func register(_ functionName: String, argc: Int, value: Any) {
+ if functions[functionName] == nil {
+ functions[functionName] = [:] // fails on Linux, https://github.com/stephencelis/SQLite.swift/issues/1071
+ }
+ functions[functionName]?[argc] = value
+ }
+
+ fileprivate typealias Function = @convention(block) (Context, Int32, Argv) -> Void
+ fileprivate var functions = [String: [Int: Any]]()
+
+ /// Defines a new collating sequence.
+ ///
+ /// - Parameters:
+ ///
+ /// - collation: The name of the collation added.
+ ///
+ /// - block: A collation function that takes two strings and returns the
+ /// comparison result.
+ public func createCollation(_ collation: String, _ block: @escaping (_ lhs: String, _ rhs: String) -> ComparisonResult) throws {
+ let box: Collation = { (lhs: UnsafeRawPointer, rhs: UnsafeRawPointer) in
+ let lstr = String(cString: lhs.assumingMemoryBound(to: UInt8.self))
+ let rstr = String(cString: rhs.assumingMemoryBound(to: UInt8.self))
+ return Int32(block(lstr, rstr).rawValue)
+ }
+ try check(sqlite3_create_collation_v2(handle, collation, SQLITE_UTF8,
+ unsafeBitCast(box, to: UnsafeMutableRawPointer.self), { (callback: UnsafeMutableRawPointer?, _,
+ lhs: UnsafeRawPointer?, _, rhs: UnsafeRawPointer?) in /* xCompare */
+ if let lhs, let rhs {
+ return unsafeBitCast(callback, to: Collation.self)(lhs, rhs)
+ } else {
+ fatalError("sqlite3_create_collation_v2 callback called with NULL pointer")
+ }
+ }, nil /* xDestroy */))
+ collations[collation] = box
+ }
+ fileprivate typealias Collation = @convention(block) (UnsafeRawPointer, UnsafeRawPointer) -> Int32
+ fileprivate var collations = [String: Collation]()
+
+ // MARK: - Backup
+
+ /// Prepares a new backup for current connection.
+ ///
+ /// - Parameters:
+ ///
+ /// - databaseName: The name of the database to backup.
+ ///
+ /// Default: `.main`
+ ///
+ /// - targetConnection: The name of the database to save backup into.
+ ///
+ /// - targetDatabaseName: The name of the database to save backup into.
+ ///
+ /// Default: `.main`.
+ ///
+ /// - Returns: A new database backup.
+ public func backup(databaseName: Backup.DatabaseName = .main,
+ usingConnection targetConnection: Connection,
+ andDatabaseName targetDatabaseName: Backup.DatabaseName = .main) throws -> Backup {
+ try Backup(sourceConnection: self, sourceName: databaseName, targetConnection: targetConnection,
+ targetName: targetDatabaseName)
+ }
+
+ // MARK: - Error Handling
+
+ func sync(_ block: () throws -> T) rethrows -> T {
+ if DispatchQueue.getSpecific(key: Connection.queueKey) == queueContext {
+ return try block()
+ } else {
+ return try queue.sync(execute: block)
+ }
+ }
+
+ @discardableResult func check(_ resultCode: Int32, statement: Statement? = nil) throws -> Int32 {
+ guard let error = Result(errorCode: resultCode, connection: self, statement: statement) else {
+ return resultCode
+ }
+
+ throw error
+ }
+
+ fileprivate var queue = DispatchQueue(label: "SQLite.Database", attributes: [])
+
+ fileprivate static let queueKey = DispatchSpecificKey()
+
+ fileprivate lazy var queueContext: Int = unsafeBitCast(self, to: Int.self)
+
+}
+
+extension Connection: CustomStringConvertible {
+
+ public var description: String {
+ String(cString: sqlite3_db_filename(handle, nil))
+ }
+
+}
+
+extension Connection.Location: CustomStringConvertible {
+
+ public var description: String {
+ switch self {
+ case .inMemory:
+ return ":memory:"
+ case .temporary:
+ return ""
+ case let .uri(URI, parameters):
+ guard parameters.count > 0,
+ var components = URLComponents(string: URI) else {
+ return URI
+ }
+ components.queryItems =
+ (components.queryItems ?? []) + parameters.map(\.queryItem)
+ if components.scheme == nil {
+ components.scheme = "file"
+ }
+ return components.description
+ }
+ }
+
+}
+
+typealias Context = OpaquePointer?
+extension Context {
+ func set(result: Binding?) {
+ switch result {
+ case let blob as Blob:
+ sqlite3_result_blob(self, blob.bytes, Int32(blob.bytes.count), nil)
+ case let double as Double:
+ sqlite3_result_double(self, double)
+ case let int as Int64:
+ sqlite3_result_int64(self, int)
+ case let string as String:
+ sqlite3_result_text(self, string, Int32(string.lengthOfBytes(using: .utf8)), SQLITE_TRANSIENT)
+ case .none:
+ sqlite3_result_null(self)
+ default:
+ fatalError("unsupported result type: \(String(describing: result))")
+ }
+ }
+}
+
+typealias Argv = UnsafeMutablePointer?
+extension Argv {
+ func getBindings(argc: Int32) -> [Binding?] {
+ (0.. sqlite_schema
+ case renameColumn // ALTER TABLE ... RENAME COLUMN
+ case dropColumn // ALTER TABLE ... DROP COLUMN
+
+ func isSupported(by version: SQLiteVersion) -> Bool {
+ switch self {
+ case .partialIntegrityCheck, .sqliteSchemaTable:
+ return version >= .init(major: 3, minor: 33)
+ case .renameColumn:
+ return version >= .init(major: 3, minor: 25)
+ case .dropColumn:
+ return version >= .init(major: 3, minor: 35)
+ }
+ }
+}
+
+extension Connection {
+ func supports(_ feature: SQLiteFeature) -> Bool {
+ feature.isSupported(by: sqliteVersion)
+ }
+}
diff --git a/Sources/SQLite/Core/SQLiteVersion.swift b/Sources/SQLite/Core/SQLiteVersion.swift
new file mode 100644
index 00000000..fa7358da
--- /dev/null
+++ b/Sources/SQLite/Core/SQLiteVersion.swift
@@ -0,0 +1,22 @@
+import Foundation
+
+public struct SQLiteVersion: Comparable, CustomStringConvertible {
+ public let major: Int
+ public let minor: Int
+ public var point: Int = 0
+
+ public var description: String {
+ "SQLite \(major).\(minor).\(point)"
+ }
+
+ public static func <(lhs: SQLiteVersion, rhs: SQLiteVersion) -> Bool {
+ lhs.tuple < rhs.tuple
+ }
+
+ public static func ==(lhs: SQLiteVersion, rhs: SQLiteVersion) -> Bool {
+ lhs.tuple == rhs.tuple
+ }
+
+ static var zero: SQLiteVersion = .init(major: 0, minor: 0)
+ private var tuple: (Int, Int, Int) { (major, minor, point) }
+}
diff --git a/Sources/SQLite/Core/Statement.swift b/Sources/SQLite/Core/Statement.swift
new file mode 100644
index 00000000..82d535b9
--- /dev/null
+++ b/Sources/SQLite/Core/Statement.swift
@@ -0,0 +1,339 @@
+//
+// SQLite.swift
+// https://github.com/stephencelis/SQLite.swift
+// Copyright © 2014-2015 Stephen Celis.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+#if SQLITE_SWIFT_STANDALONE
+import sqlite3
+#elseif SQLITE_SWIFT_SQLCIPHER
+import SQLCipher
+#elseif canImport(SwiftToolchainCSQLite)
+import SwiftToolchainCSQLite
+#else
+import SQLite3
+#endif
+
+/// A single SQL statement.
+public final class Statement {
+
+ fileprivate var handle: OpaquePointer?
+
+ fileprivate let connection: Connection
+
+ init(_ connection: Connection, _ SQL: String) throws {
+ self.connection = connection
+ try connection.check(sqlite3_prepare_v2(connection.handle, SQL, -1, &handle, nil))
+ }
+
+ deinit {
+ sqlite3_finalize(handle)
+ }
+
+ public lazy var columnCount: Int = Int(sqlite3_column_count(handle))
+
+ public lazy var columnNames: [String] = (0.. Statement {
+ bind(values)
+ }
+
+ /// Binds a list of parameters to a statement.
+ ///
+ /// - Parameter values: A list of parameters to bind to the statement.
+ ///
+ /// - Returns: The statement object (useful for chaining).
+ public func bind(_ values: [Binding?]) -> Statement {
+ if values.isEmpty { return self }
+ reset()
+ guard values.count == Int(sqlite3_bind_parameter_count(handle)) else {
+ fatalError("\(sqlite3_bind_parameter_count(handle)) values expected, \(values.count) passed")
+ }
+ for idx in 1...values.count { bind(values[idx - 1], atIndex: idx) }
+ return self
+ }
+
+ /// Binds a dictionary of named parameters to a statement.
+ ///
+ /// - Parameter values: A dictionary of named parameters to bind to the
+ /// statement.
+ ///
+ /// - Returns: The statement object (useful for chaining).
+ public func bind(_ values: [String: Binding?]) -> Statement {
+ reset()
+ for (name, value) in values {
+ let idx = sqlite3_bind_parameter_index(handle, name)
+ guard idx > 0 else {
+ fatalError("parameter not found: \(name)")
+ }
+ bind(value, atIndex: Int(idx))
+ }
+ return self
+ }
+
+ fileprivate func bind(_ value: Binding?, atIndex idx: Int) {
+ switch value {
+ case .none:
+ sqlite3_bind_null(handle, Int32(idx))
+ case let value as Blob where value.bytes.count == 0:
+ sqlite3_bind_zeroblob(handle, Int32(idx), 0)
+ case let value as Blob:
+ sqlite3_bind_blob(handle, Int32(idx), value.bytes, Int32(value.bytes.count), SQLITE_TRANSIENT)
+ case let value as Double:
+ sqlite3_bind_double(handle, Int32(idx), value)
+ case let value as Int64:
+ sqlite3_bind_int64(handle, Int32(idx), value)
+ case let value as String:
+ sqlite3_bind_text(handle, Int32(idx), value, -1, SQLITE_TRANSIENT)
+ case let value as Int:
+ self.bind(value.datatypeValue, atIndex: idx)
+ case let value as Bool:
+ self.bind(value.datatypeValue, atIndex: idx)
+ case .some(let value):
+ fatalError("tried to bind unexpected value \(value)")
+ }
+ }
+
+ /// - Parameter bindings: A list of parameters to bind to the statement.
+ ///
+ /// - Throws: `Result.Error` if query execution fails.
+ ///
+ /// - Returns: The statement object (useful for chaining).
+ @discardableResult public func run(_ bindings: Binding?...) throws -> Statement {
+ guard bindings.isEmpty else {
+ return try run(bindings)
+ }
+
+ reset(clearBindings: false)
+ repeat {} while try step()
+ return self
+ }
+
+ /// - Parameter bindings: A list of parameters to bind to the statement.
+ ///
+ /// - Throws: `Result.Error` if query execution fails.
+ ///
+ /// - Returns: The statement object (useful for chaining).
+ @discardableResult public func run(_ bindings: [Binding?]) throws -> Statement {
+ try bind(bindings).run()
+ }
+
+ /// - Parameter bindings: A dictionary of named parameters to bind to the
+ /// statement.
+ ///
+ /// - Throws: `Result.Error` if query execution fails.
+ ///
+ /// - Returns: The statement object (useful for chaining).
+ @discardableResult public func run(_ bindings: [String: Binding?]) throws -> Statement {
+ try bind(bindings).run()
+ }
+
+ /// - Parameter bindings: A list of parameters to bind to the statement.
+ ///
+ /// - Returns: The first value of the first row returned.
+ public func scalar(_ bindings: Binding?...) throws -> Binding? {
+ guard bindings.isEmpty else {
+ return try scalar(bindings)
+ }
+
+ reset(clearBindings: false)
+ _ = try step()
+ return row[0]
+ }
+
+ /// - Parameter bindings: A list of parameters to bind to the statement.
+ ///
+ /// - Returns: The first value of the first row returned.
+ public func scalar(_ bindings: [Binding?]) throws -> Binding? {
+ try bind(bindings).scalar()
+ }
+
+ /// - Parameter bindings: A dictionary of named parameters to bind to the
+ /// statement.
+ ///
+ /// - Returns: The first value of the first row returned.
+ public func scalar(_ bindings: [String: Binding?]) throws -> Binding? {
+ try bind(bindings).scalar()
+ }
+
+ public func step() throws -> Bool {
+ try connection.sync { try connection.check(sqlite3_step(handle)) == SQLITE_ROW }
+ }
+
+ public func reset() {
+ reset(clearBindings: true)
+ }
+
+ fileprivate func reset(clearBindings shouldClear: Bool) {
+ sqlite3_reset(handle)
+ if shouldClear { sqlite3_clear_bindings(handle) }
+ }
+
+}
+
+extension Statement: Sequence {
+
+ public func makeIterator() -> Statement {
+ reset(clearBindings: false)
+ return self
+ }
+
+}
+
+public protocol FailableIterator: IteratorProtocol {
+ func failableNext() throws -> Self.Element?
+}
+
+extension FailableIterator {
+ public func next() -> Element? {
+ // swiftlint:disable:next force_try
+ try! failableNext()
+ }
+}
+
+extension Array {
+ public init(_ failableIterator: I) throws where I.Element == Element {
+ self.init()
+ while let row = try failableIterator.failableNext() {
+ append(row)
+ }
+ }
+}
+
+extension Statement: FailableIterator {
+ public typealias Element = [Binding?]
+ public func failableNext() throws -> [Binding?]? {
+ try step() ? Array(row) : nil
+ }
+}
+
+extension Statement {
+ func prepareRowIterator() -> RowIterator {
+ RowIterator(statement: self, columnNames: columnNameMap)
+ }
+
+ var columnNameMap: [String: Int] {
+ var result = [String: Int]()
+ for (index, name) in self.columnNames.enumerated() {
+ result[name.quote()] = index
+ }
+
+ return result
+ }
+}
+
+extension Statement: CustomStringConvertible {
+
+ public var description: String {
+ String(cString: sqlite3_sql(handle))
+ }
+
+}
+
+public struct Cursor {
+
+ fileprivate let handle: OpaquePointer
+
+ fileprivate let columnCount: Int
+
+ fileprivate init(_ statement: Statement) {
+ handle = statement.handle!
+ columnCount = statement.columnCount
+ }
+
+ public subscript(idx: Int) -> Double {
+ sqlite3_column_double(handle, Int32(idx))
+ }
+
+ public subscript(idx: Int) -> Int64 {
+ sqlite3_column_int64(handle, Int32(idx))
+ }
+
+ public subscript(idx: Int) -> String {
+ String(cString: UnsafePointer(sqlite3_column_text(handle, Int32(idx))))
+ }
+
+ public subscript(idx: Int) -> Blob {
+ if let pointer = sqlite3_column_blob(handle, Int32(idx)) {
+ let length = Int(sqlite3_column_bytes(handle, Int32(idx)))
+ return Blob(bytes: pointer, length: length)
+ } else {
+ // The return value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer.
+ // https://www.sqlite.org/c3ref/column_blob.html
+ return Blob(bytes: [])
+ }
+ }
+
+ // MARK: -
+
+ public subscript(idx: Int) -> Bool {
+ Bool.fromDatatypeValue(self[idx])
+ }
+
+ public subscript(idx: Int) -> Int {
+ Int.fromDatatypeValue(self[idx])
+ }
+
+}
+
+/// Cursors provide direct access to a statement’s current row.
+extension Cursor: Sequence {
+
+ public subscript(idx: Int) -> Binding? {
+ switch sqlite3_column_type(handle, Int32(idx)) {
+ case SQLITE_BLOB:
+ return self[idx] as Blob
+ case SQLITE_FLOAT:
+ return self[idx] as Double
+ case SQLITE_INTEGER:
+ return self[idx] as Int64
+ case SQLITE_NULL:
+ return nil
+ case SQLITE_TEXT:
+ return self[idx] as String
+ case let type:
+ fatalError("unsupported column type: \(type)")
+ }
+ }
+
+ public func makeIterator() -> AnyIterator {
+ var idx = 0
+ return AnyIterator {
+ if idx >= columnCount {
+ return .none
+ } else {
+ idx += 1
+ return self[idx - 1]
+ }
+ }
+ }
+
+}
diff --git a/Sources/SQLite/Core/URIQueryParameter.swift b/Sources/SQLite/Core/URIQueryParameter.swift
new file mode 100644
index 00000000..abbab2e7
--- /dev/null
+++ b/Sources/SQLite/Core/URIQueryParameter.swift
@@ -0,0 +1,53 @@
+import Foundation
+
+/// See https://www.sqlite.org/uri.html
+public enum URIQueryParameter: CustomStringConvertible {
+ public enum FileMode: String {
+ case readOnly = "ro", readWrite = "rw", readWriteCreate = "rwc", memory
+ }
+
+ public enum CacheMode: String {
+ case shared, `private`
+ }
+
+ /// The cache query parameter determines if the new database is opened using shared cache mode or with a private cache.
+ case cache(CacheMode)
+
+ /// The immutable query parameter is a boolean that signals to SQLite that the underlying database file is held on read-only media
+ /// and cannot be modified, even by another process with elevated privileges.
+ case immutable(Bool)
+
+ /// When creating a new database file during `sqlite3_open_v2()` on unix systems, SQLite will try to set the permissions of the new database
+ /// file to match the existing file "filename".
+ case modeOf(String)
+
+ /// The mode query parameter determines if the new database is opened read-only, read-write, read-write and created if it does not exist,
+ /// or that the database is a pure in-memory database that never interacts with disk, respectively.
+ case mode(FileMode)
+
+ /// The nolock query parameter is a boolean that disables all calls to the `xLock`, ` xUnlock`, and `xCheckReservedLock` methods
+ /// of the VFS when true.
+ case nolock(Bool)
+
+ /// The psow query parameter overrides the `powersafe_overwrite` property of the database file being opened.
+ case powersafeOverwrite(Bool)
+
+ /// The vfs query parameter causes the database connection to be opened using the VFS called NAME.
+ case vfs(String)
+
+ public var description: String {
+ queryItem.description
+ }
+
+ var queryItem: URLQueryItem {
+ switch self {
+ case .cache(let mode): return .init(name: "cache", value: mode.rawValue)
+ case .immutable(let bool): return .init(name: "immutable", value: NSNumber(value: bool).description)
+ case .modeOf(let filename): return .init(name: "modeOf", value: filename)
+ case .mode(let fileMode): return .init(name: "mode", value: fileMode.rawValue)
+ case .nolock(let bool): return .init(name: "nolock", value: NSNumber(value: bool).description)
+ case .powersafeOverwrite(let bool): return .init(name: "psow", value: NSNumber(value: bool).description)
+ case .vfs(let name): return .init(name: "vfs", value: name)
+ }
+ }
+}
diff --git a/Sources/SQLite/Core/Value.swift b/Sources/SQLite/Core/Value.swift
new file mode 100644
index 00000000..249a7728
--- /dev/null
+++ b/Sources/SQLite/Core/Value.swift
@@ -0,0 +1,132 @@
+//
+// SQLite.swift
+// https://github.com/stephencelis/SQLite.swift
+// Copyright © 2014-2015 Stephen Celis.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+/// - Warning: `Binding` is a protocol that SQLite.swift uses internally to
+/// directly map SQLite types to Swift types.
+///
+/// Do not conform custom types to the Binding protocol. See the `Value`
+/// protocol, instead.
+public protocol Binding {}
+
+public protocol Number: Binding {}
+
+public protocol Value: Expressible { // extensions cannot have inheritance clauses
+
+ associatedtype ValueType = Self
+
+ associatedtype Datatype: Binding
+
+ static var declaredDatatype: String { get }
+
+ static func fromDatatypeValue(_ datatypeValue: Datatype) throws -> ValueType
+
+ var datatypeValue: Datatype { get }
+
+}
+
+extension Double: Number, Value {
+
+ public static let declaredDatatype = "REAL"
+
+ public static func fromDatatypeValue(_ datatypeValue: Double) -> Double {
+ datatypeValue
+ }
+
+ public var datatypeValue: Double {
+ self
+ }
+
+}
+
+extension Int64: Number, Value {
+
+ public static let declaredDatatype = "INTEGER"
+
+ public static func fromDatatypeValue(_ datatypeValue: Int64) -> Int64 {
+ datatypeValue
+ }
+
+ public var datatypeValue: Int64 {
+ self
+ }
+
+}
+
+extension String: Binding, Value {
+
+ public static let declaredDatatype = "TEXT"
+
+ public static func fromDatatypeValue(_ datatypeValue: String) -> String {
+ datatypeValue
+ }
+
+ public var datatypeValue: String {
+ self
+ }
+
+}
+
+extension Blob: Binding, Value {
+
+ public static let declaredDatatype = "BLOB"
+
+ public static func fromDatatypeValue(_ datatypeValue: Blob) -> Blob {
+ datatypeValue
+ }
+
+ public var datatypeValue: Blob {
+ self
+ }
+
+}
+
+// MARK: -
+
+extension Bool: Binding, Value {
+
+ public static var declaredDatatype = Int64.declaredDatatype
+
+ public static func fromDatatypeValue(_ datatypeValue: Int64) -> Bool {
+ datatypeValue != 0
+ }
+
+ public var datatypeValue: Int64 {
+ self ? 1 : 0
+ }
+
+}
+
+extension Int: Number, Value {
+
+ public static var declaredDatatype = Int64.declaredDatatype
+
+ public static func fromDatatypeValue(_ datatypeValue: Int64) -> Int {
+ Int(datatypeValue)
+ }
+
+ public var datatypeValue: Int64 {
+ Int64(self)
+ }
+
+}
diff --git a/Sources/SQLite/Extensions/Cipher.swift b/Sources/SQLite/Extensions/Cipher.swift
new file mode 100644
index 00000000..03194ef1
--- /dev/null
+++ b/Sources/SQLite/Extensions/Cipher.swift
@@ -0,0 +1,114 @@
+#if SQLITE_SWIFT_SQLCIPHER
+import SQLCipher
+
+/// Extension methods for [SQLCipher](https://www.zetetic.net/sqlcipher/).
+/// @see [sqlcipher api](https://www.zetetic.net/sqlcipher/sqlcipher-api/)
+extension Connection {
+
+ /// - Returns: the SQLCipher version
+ ///
+ /// See https://www.zetetic.net/sqlcipher/sqlcipher-api/#cipher_version
+ public var cipherVersion: String? {
+ (try? scalar("PRAGMA cipher_version")) as? String
+ }
+
+ /// Specify the key for an encrypted database. This routine should be
+ /// called right after sqlite3_open().
+ ///
+ /// @param key The key to use.The key itself can be a passphrase, which is converted to a key
+ /// using [PBKDF2](https://en.wikipedia.org/wiki/PBKDF2) key derivation. The result
+ /// is used as the encryption key for the database.
+ ///
+ /// Alternatively, it is possible to specify an exact byte sequence using a blob literal.
+ /// With this method, it is the calling application's responsibility to ensure that the data
+ /// provided is a 64 character hex string, which will be converted directly to 32 bytes (256 bits)
+ /// of key data.
+ /// e.g. x'2DD29CA851E7B56E4697B0E1F08507293D761A05CE4D1B628663F411A8086D99'
+ /// @param db name of the database, defaults to 'main'
+ ///
+ /// See https://www.zetetic.net/sqlcipher/sqlcipher-api/#sqlite3_key
+ public func key(_ key: String, db: String = "main") throws {
+ try _key_v2(db: db, keyPointer: key, keySize: key.utf8.count)
+ }
+
+ public func key(_ key: Blob, db: String = "main") throws {
+ try _key_v2(db: db, keyPointer: key.bytes, keySize: key.bytes.count)
+ }
+
+ /// Same as `key(_ key: String, db: String = "main")`, running "PRAGMA cipher_migrate;"
+ /// immediately after calling `sqlite3_key_v2`, which performs the migration of
+ /// SQLCipher database created by older major version of SQLCipher, to be able to
+ /// open this database with new major version of SQLCipher
+ /// (e.g. to open database created by SQLCipher version 3.x.x with SQLCipher version 4.x.x).
+ /// As "PRAGMA cipher_migrate;" is time-consuming, it is recommended to use this function
+ /// only after failure of `key(_ key: String, db: String = "main")`, if older versions of
+ /// your app may ise older version of SQLCipher
+ ///
+ /// See https://www.zetetic.net/sqlcipher/sqlcipher-api/#cipher_migrate
+ /// and https://discuss.zetetic.net/t/upgrading-to-sqlcipher-4/3283
+ /// for more details regarding SQLCipher upgrade
+ public func keyAndMigrate(_ key: String, db: String = "main") throws {
+ try _key_v2(db: db, keyPointer: key, keySize: key.utf8.count, migrate: true)
+ }
+
+ /// Same as `[`keyAndMigrate(_ key: String, db: String = "main")` accepting byte array as key
+ public func keyAndMigrate(_ key: Blob, db: String = "main") throws {
+ try _key_v2(db: db, keyPointer: key.bytes, keySize: key.bytes.count, migrate: true)
+ }
+
+ /// Change the key on an open database. NB: only works if the database is already encrypted.
+ ///
+ /// To change the key on an existing encrypted database, it must first be unlocked with the
+ /// current encryption key. Once the database is readable and writeable, rekey can be used
+ /// to re-encrypt every page in the database with a new key.
+ ///
+ /// See https://www.zetetic.net/sqlcipher/sqlcipher-api/#sqlite3_rekey
+ public func rekey(_ key: String, db: String = "main") throws {
+ try _rekey_v2(db: db, keyPointer: key, keySize: key.utf8.count)
+ }
+
+ public func rekey(_ key: Blob, db: String = "main") throws {
+ try _rekey_v2(db: db, keyPointer: key.bytes, keySize: key.bytes.count)
+ }
+
+ /// Converts a non-encrypted database to an encrypted one.
+ ///
+ /// See https://www.zetetic.net/sqlcipher/sqlcipher-api/#sqlcipher_export
+ public func sqlcipher_export(_ location: Location, key: String) throws {
+ let schemaName = "cipher_export"
+
+ try attach(location, as: schemaName, key: key)
+ try run("SELECT sqlcipher_export(?)", schemaName)
+ try detach(schemaName)
+ }
+
+ // MARK: - private
+ private func _key_v2(db: String,
+ keyPointer: UnsafePointer,
+ keySize: Int,
+ migrate: Bool = false) throws {
+ try check(sqlite3_key_v2(handle, db, keyPointer, Int32(keySize)))
+ if migrate {
+ // Run "PRAGMA cipher_migrate;" immediately after `sqlite3_key_v2`
+ // per recommendation of SQLCipher authors
+ let migrateResult = try scalar("PRAGMA cipher_migrate;")
+ if (migrateResult as? String) != "0" {
+ // "0" is the result of successful migration
+ throw Result.error(message: "Error in cipher migration, result \(migrateResult.debugDescription)", code: 1, statement: nil)
+ }
+ }
+ try cipher_key_check()
+ }
+
+ private func _rekey_v2(db: String, keyPointer: UnsafePointer, keySize: Int) throws {
+ try check(sqlite3_rekey_v2(handle, db, keyPointer, Int32(keySize)))
+ }
+
+ // When opening an existing database, sqlite3_key_v2 will not immediately throw an error if
+ // the key provided is incorrect. To test that the database can be successfully opened with the
+ // provided key, it is necessary to perform some operation on the database (i.e. read from it).
+ private func cipher_key_check() throws {
+ _ = try scalar("SELECT count(*) FROM sqlite_master;")
+ }
+}
+#endif
diff --git a/Sources/SQLite/Extensions/FTS4.swift b/Sources/SQLite/Extensions/FTS4.swift
new file mode 100644
index 00000000..c02cfdc1
--- /dev/null
+++ b/Sources/SQLite/Extensions/FTS4.swift
@@ -0,0 +1,326 @@
+//
+// SQLite.swift
+// https://github.com/stephencelis/SQLite.swift
+// Copyright © 2014-2015 Stephen Celis.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+extension Module {
+
+ public static func FTS4(_ column: Expressible, _ more: Expressible...) -> Module {
+ FTS4([column] + more)
+ }
+
+ public static func FTS4(_ columns: [Expressible] = [], tokenize tokenizer: Tokenizer? = nil) -> Module {
+ FTS4(FTS4Config().columns(columns).tokenizer(tokenizer))
+ }
+
+ public static func FTS4(_ config: FTS4Config) -> Module {
+ Module(name: "fts4", arguments: config.arguments())
+ }
+}
+
+extension VirtualTable {
+
+ /// Builds an expression appended with a `MATCH` query against the given
+ /// pattern.
+ ///
+ /// let emails = VirtualTable("emails")
+ ///
+ /// emails.filter(emails.match("Hello"))
+ /// // SELECT * FROM "emails" WHERE "emails" MATCH 'Hello'
+ ///
+ /// - Parameter pattern: A pattern to match.
+ ///
+ /// - Returns: An expression appended with a `MATCH` query against the given
+ /// pattern.
+ public func match(_ pattern: String) -> Expression {
+ "MATCH".infix(tableName(), pattern)
+ }
+
+ public func match(_ pattern: Expression) -> Expression {
+ "MATCH".infix(tableName(), pattern)
+ }
+
+ public func match(_ pattern: Expression) -> Expression {
+ "MATCH".infix(tableName(), pattern)
+ }
+
+ /// Builds a copy of the query with a `WHERE … MATCH` clause.
+ ///
+ /// let emails = VirtualTable("emails")
+ ///
+ /// emails.match("Hello")
+ /// // SELECT * FROM "emails" WHERE "emails" MATCH 'Hello'
+ ///
+ /// - Parameter pattern: A pattern to match.
+ ///
+ /// - Returns: A query with the given `WHERE … MATCH` clause applied.
+ public func match(_ pattern: String) -> QueryType {
+ filter(match(pattern))
+ }
+
+ public func match(_ pattern: Expression) -> QueryType {
+ filter(match(pattern))
+ }
+
+ public func match(_ pattern: Expression) -> QueryType {
+ filter(match(pattern))
+ }
+
+}
+
+// swiftlint:disable identifier_name
+public struct Tokenizer {
+
+ public static let Simple = Tokenizer("simple")
+ public static let Porter = Tokenizer("porter")
+
+ public static func Unicode61(removeDiacritics: Bool? = nil,
+ tokenchars: Set = [],
+ separators: Set = []) -> Tokenizer {
+ var arguments = [String]()
+
+ if let removeDiacritics {
+ arguments.append("remove_diacritics=\(removeDiacritics ? 1 : 0)".quote())
+ }
+
+ if !tokenchars.isEmpty {
+ let joined = tokenchars.map { String($0) }.joined(separator: "")
+ arguments.append("tokenchars=\(joined)".quote())
+ }
+
+ if !separators.isEmpty {
+ let joined = separators.map { String($0) }.joined(separator: "")
+ arguments.append("separators=\(joined)".quote())
+ }
+
+ return Tokenizer("unicode61", arguments)
+ }
+
+ // https://sqlite.org/fts5.html#the_experimental_trigram_tokenizer
+ public static func Trigram(caseSensitive: Bool = false) -> Tokenizer {
+ Tokenizer("trigram", ["case_sensitive", caseSensitive ? "1" : "0"])
+ }
+
+ public static func Custom(_ name: String) -> Tokenizer {
+ Tokenizer(Tokenizer.moduleName.quote(), [name.quote()])
+ }
+
+ public let name: String
+
+ public let arguments: [String]
+
+ fileprivate init(_ name: String, _ arguments: [String] = []) {
+ self.name = name
+ self.arguments = arguments
+ }
+
+ fileprivate static let moduleName = "SQLite.swift"
+
+}
+
+extension Tokenizer: CustomStringConvertible {
+
+ public var description: String {
+ ([name] + arguments).joined(separator: " ")
+ }
+
+}
+
+/// Configuration options shared between the [FTS4](https://www.sqlite.org/fts3.html) and
+/// [FTS5](https://www.sqlite.org/fts5.html) extensions.
+open class FTSConfig {
+ public enum ColumnOption {
+ /// [The notindexed= option](https://www.sqlite.org/fts3.html#section_6_5)
+ case unindexed
+ }
+
+ typealias ColumnDefinition = (Expressible, options: [ColumnOption])
+ var columnDefinitions = [ColumnDefinition]()
+ var tokenizer: Tokenizer?
+ var prefixes = [Int]()
+ var externalContentSchema: SchemaType?
+ var isContentless: Bool = false
+
+ /// Adds a column definition
+ @discardableResult open func column(_ column: Expressible, _ options: [ColumnOption] = []) -> Self {
+ columnDefinitions.append((column, options))
+ return self
+ }
+
+ @discardableResult open func columns(_ columns: [Expressible]) -> Self {
+ for column in columns {
+ self.column(column)
+ }
+ return self
+ }
+
+ /// [Tokenizers](https://www.sqlite.org/fts3.html#tokenizer)
+ @discardableResult open func tokenizer(_ tokenizer: Tokenizer?) -> Self {
+ self.tokenizer = tokenizer
+ return self
+ }
+
+ /// [The prefix= option](https://www.sqlite.org/fts3.html#section_6_6)
+ @discardableResult open func prefix(_ prefix: [Int]) -> Self {
+ prefixes += prefix
+ return self
+ }
+
+ /// [The content= option](https://www.sqlite.org/fts3.html#section_6_2)
+ @discardableResult open func externalContent(_ schema: SchemaType) -> Self {
+ externalContentSchema = schema
+ return self
+ }
+
+ /// [Contentless FTS4 Tables](https://www.sqlite.org/fts3.html#section_6_2_1)
+ @discardableResult open func contentless() -> Self {
+ isContentless = true
+ return self
+ }
+
+ func formatColumnDefinitions() -> [Expressible] {
+ columnDefinitions.map { $0.0 }
+ }
+
+ func arguments() -> [Expressible] {
+ options().arguments
+ }
+
+ func options() -> Options {
+ var options = Options()
+ options.append(formatColumnDefinitions())
+ if let tokenizer {
+ options.append("tokenize", value: Expression(literal: tokenizer.description))
+ }
+ options.appendCommaSeparated("prefix", values: prefixes.sorted().map { String($0) })
+ if isContentless {
+ options.append("content", value: "")
+ } else if let externalContentSchema {
+ options.append("content", value: externalContentSchema.tableName())
+ }
+ return options
+ }
+
+ struct Options {
+ var arguments = [Expressible]()
+
+ @discardableResult mutating func append(_ columns: [Expressible]) -> Options {
+ arguments.append(contentsOf: columns)
+ return self
+ }
+
+ @discardableResult mutating func appendCommaSeparated(_ key: String, values: [String]) -> Options {
+ if values.isEmpty {
+ return self
+ } else {
+ return append(key, value: values.joined(separator: ","))
+ }
+ }
+
+ @discardableResult mutating func append(_ key: String, value: String) -> Options {
+ append(key, value: Expression(value))
+ }
+
+ @discardableResult mutating func append(_ key: String, value: Expressible) -> Options {
+ arguments.append("=".join([Expression(literal: key), value]))
+ return self
+ }
+ }
+}
+
+/// Configuration for the [FTS4](https://www.sqlite.org/fts3.html) extension.
+open class FTS4Config: FTSConfig {
+ /// [The matchinfo= option](https://www.sqlite.org/fts3.html#section_6_4)
+ public enum MatchInfo: String {
+ case fts3
+ }
+
+ /// [FTS4 options](https://www.sqlite.org/fts3.html#fts4_options)
+ public enum Order: String {
+ /// Data structures are optimized for returning results in ascending order by docid (default)
+ case asc
+ /// FTS4 stores its data in such a way as to optimize returning results in descending order by docid.
+ case desc
+ }
+
+ var compressFunction: String?
+ var uncompressFunction: String?
+ var languageId: String?
+ var matchInfo: MatchInfo?
+ var order: Order?
+
+ override public init() {
+ }
+
+ /// [The compress= and uncompress= options](https://www.sqlite.org/fts3.html#section_6_1)
+ @discardableResult open func compress(_ functionName: String) -> Self {
+ compressFunction = functionName
+ return self
+ }
+
+ /// [The compress= and uncompress= options](https://www.sqlite.org/fts3.html#section_6_1)
+ @discardableResult open func uncompress(_ functionName: String) -> Self {
+ uncompressFunction = functionName
+ return self
+ }
+
+ /// [The languageid= option](https://www.sqlite.org/fts3.html#section_6_3)
+ @discardableResult open func languageId(_ columnName: String) -> Self {
+ languageId = columnName
+ return self
+ }
+
+ /// [The matchinfo= option](https://www.sqlite.org/fts3.html#section_6_4)
+ @discardableResult open func matchInfo(_ matchInfo: MatchInfo) -> Self {
+ self.matchInfo = matchInfo
+ return self
+ }
+
+ /// [FTS4 options](https://www.sqlite.org/fts3.html#fts4_options)
+ @discardableResult open func order(_ order: Order) -> Self {
+ self.order = order
+ return self
+ }
+
+ override func options() -> Options {
+ var options = super.options()
+ for (column, _) in (columnDefinitions.filter { $0.options.contains(.unindexed) }) {
+ options.append("notindexed", value: column)
+ }
+ if let languageId {
+ options.append("languageid", value: languageId)
+ }
+ if let compressFunction {
+ options.append("compress", value: compressFunction)
+ }
+ if let uncompressFunction {
+ options.append("uncompress", value: uncompressFunction)
+ }
+ if let matchInfo {
+ options.append("matchinfo", value: matchInfo.rawValue)
+ }
+ if let order {
+ options.append("order", value: order.rawValue)
+ }
+ return options
+ }
+}
diff --git a/Sources/SQLite/Extensions/FTS5.swift b/Sources/SQLite/Extensions/FTS5.swift
new file mode 100644
index 00000000..3e84e171
--- /dev/null
+++ b/Sources/SQLite/Extensions/FTS5.swift
@@ -0,0 +1,93 @@
+//
+// SQLite.swift
+// https://github.com/stephencelis/SQLite.swift
+// Copyright © 2014-2015 Stephen Celis.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+extension Module {
+ public static func FTS5(_ config: FTS5Config) -> Module {
+ Module(name: "fts5", arguments: config.arguments())
+ }
+}
+
+/// Configuration for the [FTS5](https://www.sqlite.org/fts5.html) extension.
+///
+/// **Note:** this is currently only applicable when using SQLite.swift together with a FTS5-enabled version
+/// of SQLite.
+open class FTS5Config: FTSConfig {
+ public enum Detail: String {
+ /// store rowid, column number, term offset
+ case full
+ /// store rowid, column number
+ case column
+ /// store rowid
+ case none
+ }
+
+ var detail: Detail?
+ var contentRowId: Expressible?
+ var columnSize: Int?
+
+ override public init() {
+ }
+
+ /// [External Content Tables](https://www.sqlite.org/fts5.html#section_4_4_2)
+ @discardableResult open func contentRowId(_ column: Expressible) -> Self {
+ contentRowId = column
+ return self
+ }
+
+ /// [The Columnsize Option](https://www.sqlite.org/fts5.html#section_4_5)
+ @discardableResult open func columnSize(_ size: Int) -> Self {
+ columnSize = size
+ return self
+ }
+
+ /// [The Detail Option](https://www.sqlite.org/fts5.html#section_4_6)
+ @discardableResult open func detail(_ detail: Detail) -> Self {
+ self.detail = detail
+ return self
+ }
+
+ override func options() -> Options {
+ var options = super.options()
+ if let contentRowId {
+ options.append("content_rowid", value: contentRowId)
+ }
+ if let columnSize {
+ options.append("columnsize", value: Expression(value: columnSize))
+ }
+ if let detail {
+ options.append("detail", value: detail.rawValue)
+ }
+ return options
+ }
+
+ override func formatColumnDefinitions() -> [Expressible] {
+ columnDefinitions.map { definition in
+ if definition.options.contains(.unindexed) {
+ return " ".join([definition.0, Expression(literal: "UNINDEXED")])
+ } else {
+ return definition.0
+ }
+ }
+ }
+}
diff --git a/SQLite Mac/SQLite Mac.h b/Sources/SQLite/Extensions/RTree.swift
similarity index 64%
rename from SQLite Mac/SQLite Mac.h
rename to Sources/SQLite/Extensions/RTree.swift
index 644566b7..5ecdf78b 100644
--- a/SQLite Mac/SQLite Mac.h
+++ b/Sources/SQLite/Extensions/RTree.swift
@@ -1,6 +1,7 @@
//
-// SQLite Mac.h
-// Copyright (c) 2014 Stephen Celis.
+// SQLite.swift
+// https://github.com/stephencelis/SQLite.swift
+// Copyright © 2014-2015 Stephen Celis.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
@@ -21,10 +22,16 @@
// THE SOFTWARE.
//
-#import
+extension Module {
+ public static func RTree(_ primaryKey: Expression,
+ _ pairs: (Expression, Expression)...)
+ -> Module where T.Datatype == Int64, U.Datatype == Double {
+ var arguments: [Expressible] = [primaryKey]
-//! Project version number for SQLite Mac.
-FOUNDATION_EXPORT double SQLite_MacVersionNumber;
+ for pair in pairs {
+ arguments.append(contentsOf: [pair.0, pair.1] as [Expressible])
+ }
-//! Project version string for SQLite Mac.
-FOUNDATION_EXPORT const unsigned char SQLite_MacVersionString[];
+ return Module(name: "rtree", arguments: arguments)
+ }
+}
diff --git a/Sources/SQLite/Foundation.swift b/Sources/SQLite/Foundation.swift
new file mode 100644
index 00000000..44a31736
--- /dev/null
+++ b/Sources/SQLite/Foundation.swift
@@ -0,0 +1,102 @@
+//
+// SQLite.swift
+// https://github.com/stephencelis/SQLite.swift
+// Copyright © 2014-2015 Stephen Celis.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+import Foundation
+
+extension Data: Value {
+
+ public static var declaredDatatype: String {
+ Blob.declaredDatatype
+ }
+
+ public static func fromDatatypeValue(_ dataValue: Blob) -> Data {
+ Data(dataValue.bytes)
+ }
+
+ public var datatypeValue: Blob {
+ withUnsafeBytes { (pointer: UnsafeRawBufferPointer) -> Blob in
+ Blob(bytes: pointer.baseAddress!, length: count)
+ }
+ }
+
+}
+
+extension Date: Value {
+
+ public static var declaredDatatype: String {
+ String.declaredDatatype
+ }
+
+ public static func fromDatatypeValue(_ stringValue: String) -> Date {
+ dateFormatter.date(from: stringValue)!
+ }
+
+ public var datatypeValue: String {
+ dateFormatter.string(from: self)
+ }
+
+}
+
+/// A global date formatter used to serialize and deserialize `NSDate` objects.
+/// If multiple date formats are used in an application’s database(s), use a
+/// custom `Value` type per additional format.
+public var dateFormatter: DateFormatter = {
+ let formatter = DateFormatter()
+ formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"
+ formatter.locale = Locale(identifier: "en_US_POSIX")
+ formatter.timeZone = TimeZone(secondsFromGMT: 0)
+ return formatter
+}()
+
+extension UUID: Value {
+
+ public static var declaredDatatype: String {
+ String.declaredDatatype
+ }
+
+ public static func fromDatatypeValue(_ stringValue: String) -> UUID {
+ UUID(uuidString: stringValue)!
+ }
+
+ public var datatypeValue: String {
+ uuidString
+ }
+
+}
+
+extension URL: Value {
+
+ public static var declaredDatatype: String {
+ String.declaredDatatype
+ }
+
+ public static func fromDatatypeValue(_ stringValue: String) -> URL {
+ URL(string: stringValue)!
+ }
+
+ public var datatypeValue: String {
+ absoluteString
+ }
+
+}
diff --git a/Sources/SQLite/Helpers.swift b/Sources/SQLite/Helpers.swift
new file mode 100644
index 00000000..e3c84589
--- /dev/null
+++ b/Sources/SQLite/Helpers.swift
@@ -0,0 +1,131 @@
+//
+// SQLite.swift
+// https://github.com/stephencelis/SQLite.swift
+// Copyright © 2014-2015 Stephen Celis.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+#if SQLITE_SWIFT_STANDALONE
+import sqlite3
+#elseif SQLITE_SWIFT_SQLCIPHER
+import SQLCipher
+#elseif canImport(SwiftToolchainCSQLite)
+import SwiftToolchainCSQLite
+#else
+import SQLite3
+#endif
+
+public typealias Star = (Expression?, Expression?) -> Expression
+
+public func *(_: Expression?, _: Expression?) -> Expression {
+ Expression(literal: "*")
+}
+
+// swiftlint:disable:next type_name
+public protocol _OptionalType {
+
+ associatedtype WrappedType
+
+}
+
+extension Optional: _OptionalType {
+
+ public typealias WrappedType = Wrapped
+
+}
+
+// let SQLITE_STATIC = unsafeBitCast(0, sqlite3_destructor_type.self)
+let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
+
+extension String {
+ func quote(_ mark: Character = "\"") -> String {
+ var quoted = ""
+ quoted.append(mark)
+ for character in self {
+ quoted.append(character)
+ if character == mark {
+ quoted.append(character)
+ }
+ }
+ quoted.append(mark)
+ return quoted
+ }
+
+ func join(_ expressions: [Expressible]) -> Expressible {
+ var (template, bindings) = ([String](), [Binding?]())
+ for expressible in expressions {
+ let expression = expressible.expression
+ template.append(expression.template)
+ bindings.append(contentsOf: expression.bindings)
+ }
+ return Expression(template.joined(separator: self), bindings)
+ }
+
+ func infix(_ lhs: Expressible, _ rhs: Expressible, wrap: Bool = true) -> Expression {
+ infix([lhs, rhs], wrap: wrap)
+ }
+
+ func infix