Skip to content

Commit f25798f

Browse files
committed
SQLiteVersion type
1 parent 17a2cb8 commit f25798f

File tree

7 files changed

+55
-8
lines changed

7 files changed

+55
-8
lines changed

SQLite.xcodeproj/project.pbxproj

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,10 @@
199199
997DF2AF287FC06D00F8DF95 /* Query+with.swift in Sources */ = {isa = PBXBuildFile; fileRef = 997DF2AD287FC06D00F8DF95 /* Query+with.swift */; };
200200
997DF2B0287FC06D00F8DF95 /* Query+with.swift in Sources */ = {isa = PBXBuildFile; fileRef = 997DF2AD287FC06D00F8DF95 /* Query+with.swift */; };
201201
997DF2B1287FC06D00F8DF95 /* Query+with.swift in Sources */ = {isa = PBXBuildFile; fileRef = 997DF2AD287FC06D00F8DF95 /* Query+with.swift */; };
202+
DB7C5DA628D7C9B6006395CF /* SQLiteVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB7C5DA528D7C9B6006395CF /* SQLiteVersion.swift */; };
203+
DB7C5DA728D7C9B6006395CF /* SQLiteVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB7C5DA528D7C9B6006395CF /* SQLiteVersion.swift */; };
204+
DB7C5DA828D7C9B6006395CF /* SQLiteVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB7C5DA528D7C9B6006395CF /* SQLiteVersion.swift */; };
205+
DB7C5DA928D7C9B6006395CF /* SQLiteVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB7C5DA528D7C9B6006395CF /* SQLiteVersion.swift */; };
202206
EE247AD71C3F04ED00AE3E12 /* SQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AD61C3F04ED00AE3E12 /* SQLite.h */; settings = {ATTRIBUTES = (Public, ); }; };
203207
EE247ADE1C3F04ED00AE3E12 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE247AD31C3F04ED00AE3E12 /* SQLite.framework */; };
204208
EE247B031C3F06E900AE3E12 /* Blob.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEE1C3F06E900AE3E12 /* Blob.swift */; };
@@ -325,6 +329,7 @@
325329
49EB68C31F7B3CB400D89D40 /* Coding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Coding.swift; sourceTree = "<group>"; };
326330
997DF2AD287FC06D00F8DF95 /* Query+with.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Query+with.swift"; sourceTree = "<group>"; };
327331
A121AC451CA35C79005A31D1 /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; };
332+
DB7C5DA528D7C9B6006395CF /* SQLiteVersion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SQLiteVersion.swift; sourceTree = "<group>"; };
328333
EE247AD31C3F04ED00AE3E12 /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; };
329334
EE247AD61C3F04ED00AE3E12 /* SQLite.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SQLite.h; sourceTree = "<group>"; };
330335
EE247AD81C3F04ED00AE3E12 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -569,6 +574,7 @@
569574
19A175A9CB446640AE6F2200 /* Connection+Aggregation.swift */,
570575
3DF7B78728842972005DD8CA /* Connection+Attach.swift */,
571576
3DF7B790288449BA005DD8CA /* URIQueryParameter.swift */,
577+
DB7C5DA528D7C9B6006395CF /* SQLiteVersion.swift */,
572578
19A17F285B767BFACD96714B /* Connection+Pragmas.swift */,
573579
);
574580
path = Core;
@@ -954,6 +960,7 @@
954960
02A43A9A22738CF100FEC494 /* Backup.swift in Sources */,
955961
19A17FF4A10B44D3937C8CAC /* Errors.swift in Sources */,
956962
19A1737286A74F3CF7412906 /* DateAndTimeFunctions.swift in Sources */,
963+
DB7C5DA828D7C9B6006395CF /* SQLiteVersion.swift in Sources */,
957964
19A17073552293CA063BEA66 /* Result.swift in Sources */,
958965
997DF2B0287FC06D00F8DF95 /* Query+with.swift in Sources */,
959966
19A179B59450FE7C4811AB8A /* Connection+Aggregation.swift in Sources */,
@@ -1012,6 +1019,7 @@
10121019
3D67B3F71DB246D700A4F4C6 /* Foundation.swift in Sources */,
10131020
3D67B3F81DB246D700A4F4C6 /* Helpers.swift in Sources */,
10141021
3D67B3E91DB246D100A4F4C6 /* Statement.swift in Sources */,
1022+
DB7C5DA928D7C9B6006395CF /* SQLiteVersion.swift in Sources */,
10151023
3D67B3EA1DB246D100A4F4C6 /* Value.swift in Sources */,
10161024
3D67B3EB1DB246D100A4F4C6 /* FTS4.swift in Sources */,
10171025
3D67B3EC1DB246D100A4F4C6 /* RTree.swift in Sources */,
@@ -1069,6 +1077,7 @@
10691077
02A43A9822738CF100FEC494 /* Backup.swift in Sources */,
10701078
19A1792C0520D4E83C2EB075 /* Errors.swift in Sources */,
10711079
19A17E29278A12BC4F542506 /* DateAndTimeFunctions.swift in Sources */,
1080+
DB7C5DA628D7C9B6006395CF /* SQLiteVersion.swift in Sources */,
10721081
19A173EFEF0B3BD0B3ED406C /* Result.swift in Sources */,
10731082
997DF2AE287FC06D00F8DF95 /* Query+with.swift in Sources */,
10741083
19A176376CB6A94759F7980A /* Connection+Aggregation.swift in Sources */,
@@ -1146,6 +1155,7 @@
11461155
02A43A9922738CF100FEC494 /* Backup.swift in Sources */,
11471156
19A17490543609FCED53CACC /* Errors.swift in Sources */,
11481157
19A17152E32A9585831E3FE0 /* DateAndTimeFunctions.swift in Sources */,
1158+
DB7C5DA728D7C9B6006395CF /* SQLiteVersion.swift in Sources */,
11491159
19A17F1B3F0A3C96B5ED6D64 /* Result.swift in Sources */,
11501160
997DF2AF287FC06D00F8DF95 /* Query+with.swift in Sources */,
11511161
19A170ACC97B19730FB7BA4D /* Connection+Aggregation.swift in Sources */,

Sources/SQLite/Core/Connection+Pragmas.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import Foundation
22

33
public typealias UserVersion = Int32
4-
public typealias SQLiteVersion = (Int, Int, Int)
54

65
public extension Connection {
76
/// The user version of the database.
@@ -21,9 +20,9 @@ public extension Connection {
2120
guard let version = (try? scalar("SELECT sqlite_version()")) as? String,
2221
let splits = .some(version.split(separator: ".", maxSplits: 3)), splits.count == 3,
2322
let major = Int(splits[0]), let minor = Int(splits[1]), let point = Int(splits[2]) else {
24-
return (0, 0, 0)
23+
return .zero
2524
}
26-
return (major, minor, point)
25+
return .init(major: major, minor: minor, point: point)
2726
}
2827

2928
// Changing the foreign_keys setting affects the execution of all statements prepared using the database
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import Foundation
2+
3+
public struct SQLiteVersion: Comparable, CustomStringConvertible {
4+
public let major: Int
5+
public let minor: Int
6+
public var point: Int = 0
7+
8+
public var description: String {
9+
"SQLite \(major).\(minor).\(point)"
10+
}
11+
12+
public static func <(lhs: SQLiteVersion, rhs: SQLiteVersion) -> Bool {
13+
lhs.tuple < rhs.tuple
14+
}
15+
16+
public static func ==(lhs: SQLiteVersion, rhs: SQLiteVersion) -> Bool {
17+
lhs.tuple == rhs.tuple
18+
}
19+
20+
static var zero: SQLiteVersion = .init(major: 0, minor: 0)
21+
private var tuple: (Int, Int, Int) { (major, minor, point) }
22+
}

Sources/SQLite/Schema/Connection+Schema.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,16 @@ extension Connection {
8080
}
8181
}
8282

83+
func tableInfo() throws -> [String] {
84+
try run("SELECT tbl_name FROM sqlite_master WHERE type = 'table'").compactMap { row in
85+
if let name = row[0] as? String, !name.starts(with: "sqlite_") {
86+
return name
87+
} else {
88+
return nil
89+
}
90+
}
91+
}
92+
8393
// https://sqlite.org/pragma.html#pragma_foreign_key_check
8494

8595
// There are four columns in each result row.
@@ -99,6 +109,12 @@ extension Connection {
99109
}
100110
}
101111

112+
// https://sqlite.org/pragma.html#pragma_integrity_check
113+
func integrityCheck() throws -> [String] {
114+
try run("PRAGMA integrity_check").compactMap { $0[0] as? String }.filter { $0 != "ok" }
115+
}
116+
117+
102118
private func createTableSQL(name: String) throws -> String? {
103119
try run("""
104120
SELECT sql FROM sqlite_master WHERE name=? AND type='table'

Sources/SQLite/Schema/SchemaChanger.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ public class SchemaChanger: CustomStringConvertible {
5252
switch self {
5353
case .addColumn(let definition):
5454
return "ALTER TABLE \(table.quote()) ADD COLUMN \(definition.toSQL())"
55-
case .renameColumn(let from, let to) where version >= (3, 25, 0):
55+
case .renameColumn(let from, let to) where version >= .init(major: 3, minor: 25):
5656
return "ALTER TABLE \(table.quote()) RENAME COLUMN \(from.quote()) TO \(to.quote())"
57-
case .dropColumn(let column) where version >= (3, 35, 0):
57+
case .dropColumn(let column) where version >= .init(major: 3, minor: 35):
5858
return "ALTER TABLE \(table.quote()) DROP COLUMN \(column.quote())"
5959
default: return nil
6060
}

Tests/SQLiteTests/Core/Connection+PragmaTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class ConnectionPragmaTests: SQLiteTestCase {
1919
}
2020

2121
func test_sqlite_version() {
22-
XCTAssertTrue(db.sqliteVersion >= (3, 0, 0))
22+
XCTAssertTrue(db.sqliteVersion >= .init(major: 3, minor: 0))
2323
}
2424

2525
func test_foreignKeys_defaults_to_false() {

Tests/SQLiteTests/Schema/SchemaChangerTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class SchemaChangerTests: SQLiteTestCase {
5858
}
5959

6060
func test_remove_column_legacy() throws {
61-
schemaChanger = .init(connection: db, version: (3, 24, 0)) // DROP COLUMN introduced in 3.35.0
61+
schemaChanger = .init(connection: db, version: .init(major: 3, minor: 24)) // DROP COLUMN introduced in 3.35.0
6262

6363
try schemaChanger.alter(table: "users") { table in
6464
table.remove("age")
@@ -78,7 +78,7 @@ class SchemaChangerTests: SQLiteTestCase {
7878
}
7979

8080
func test_rename_column_legacy() throws {
81-
schemaChanger = .init(connection: db, version: (3, 24, 0)) // RENAME COLUMN introduced in 3.25.0
81+
schemaChanger = .init(connection: db, version: .init(major: 3, minor: 24)) // RENAME COLUMN introduced in 3.25.0
8282

8383
try schemaChanger.alter(table: "users") { table in
8484
table.rename("age", to: "age2")

0 commit comments

Comments
 (0)