Skip to content

Commit 8b9bfe7

Browse files
authored
Update examples/docs to use DatabasePool for non-in-memory (#16)
* Update examples/docs to use `DatabasePool` for non-in-memory * wip
1 parent eaf664c commit 8b9bfe7

File tree

14 files changed

+169
-199
lines changed

14 files changed

+169
-199
lines changed

Examples/Reminders/ReminderForm.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,9 +225,9 @@ struct TagsPopover: View {
225225
}
226226

227227
#Preview {
228-
let (remindersList, reminder) = prepareDependencies {
229-
$0.defaultDatabase = .appDatabase
230-
return try! $0.defaultDatabase.write { db in
228+
let (remindersList, reminder) = try! prepareDependencies {
229+
$0.defaultDatabase = try Reminders.appDatabase(inMemory: true)
230+
return try $0.defaultDatabase.write { db in
231231
let remindersList = try RemindersList.fetchOne(db)!
232232
return (
233233
remindersList,

Examples/Reminders/ReminderRow.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,9 @@ struct ReminderRow: View {
127127
#Preview {
128128
var reminder: Reminder!
129129
var reminderList: RemindersList!
130-
let _ = prepareDependencies {
131-
$0.defaultDatabase = .appDatabase
132-
try! $0.defaultDatabase.read { db in
130+
let _ = try! prepareDependencies {
131+
$0.defaultDatabase = try Reminders.appDatabase(inMemory: true)
132+
try $0.defaultDatabase.read { db in
133133
reminder = try Reminder.fetchOne(db)
134134
reminderList = try RemindersList.fetchOne(db)!
135135
}

Examples/Reminders/RemindersApp.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import SwiftUI
55
@main
66
struct RemindersApp: App {
77
init() {
8-
prepareDependencies {
9-
$0.defaultDatabase = .appDatabase
8+
try! prepareDependencies {
9+
$0.defaultDatabase = try Reminders.appDatabase()
1010
}
1111
}
1212

Examples/Reminders/RemindersListDetail.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,9 +173,9 @@ struct RemindersListDetailView: View {
173173
}
174174

175175
#Preview {
176-
let remindersList = prepareDependencies {
177-
$0.defaultDatabase = .appDatabase
178-
return try! $0.defaultDatabase.read { db in
176+
let remindersList = try! prepareDependencies {
177+
$0.defaultDatabase = try Reminders.appDatabase(inMemory: true)
178+
return try $0.defaultDatabase.read { db in
179179
try RemindersList.fetchOne(db)!
180180
}
181181
}

Examples/Reminders/RemindersListForm.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,9 @@ extension Int {
6565
}
6666

6767
#Preview {
68-
let _ = prepareDependencies { $0.defaultDatabase = .appDatabase }
68+
let _ = try! prepareDependencies {
69+
$0.defaultDatabase = try Reminders.appDatabase(inMemory: true)
70+
}
6971
NavigationStack {
7072
RemindersListForm()
7173
}

Examples/Reminders/RemindersLists.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,8 @@ private struct ReminderGridCell: View {
186186
}
187187

188188
#Preview {
189-
let _ = prepareDependencies {
190-
$0.defaultDatabase = .appDatabase
189+
let _ = try! prepareDependencies {
190+
$0.defaultDatabase = try Reminders.appDatabase(inMemory: true)
191191
}
192192
NavigationStack {
193193
RemindersListsView()

Examples/Reminders/Schema.swift

Lines changed: 56 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -50,73 +50,69 @@ struct ReminderTag: Codable, FetchableRecord, MutablePersistableRecord {
5050
var tagID: Int64?
5151
}
5252

53-
extension DatabaseReader where Self == DatabaseQueue {
54-
static var appDatabase: Self {
55-
let databaseQueue: DatabaseQueue
56-
var configuration = Configuration()
57-
configuration.foreignKeysEnabled = true
58-
configuration.prepareDatabase { db in
59-
#if DEBUG
60-
db.trace(options: .profile) {
61-
print($0.expandedDescription)
62-
}
63-
#endif
64-
}
65-
if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == nil && !isTesting {
66-
let path = URL.documentsDirectory.appending(component: "db.sqlite").path()
67-
print("open", path)
68-
databaseQueue = try! DatabaseQueue(path: path, configuration: configuration)
69-
} else {
70-
databaseQueue = try! DatabaseQueue(configuration: configuration)
71-
}
72-
var migrator = DatabaseMigrator()
53+
func appDatabase(inMemory: Bool = false) throws -> any DatabaseWriter {
54+
let database: any DatabaseWriter
55+
var configuration = Configuration()
56+
configuration.foreignKeysEnabled = true
57+
configuration.prepareDatabase { db in
7358
#if DEBUG
74-
migrator.eraseDatabaseOnSchemaChange = true
75-
#endif
76-
defer {
77-
#if DEBUG
78-
migrator.registerMigration("Add mock data") { db in
79-
try db.createMockData()
59+
db.trace(options: .profile) {
60+
print($0.expandedDescription)
8061
}
81-
#endif
82-
try! migrator.migrate(databaseQueue)
62+
#endif
63+
}
64+
if inMemory {
65+
database = try DatabaseQueue(configuration: configuration)
66+
} else {
67+
let path = URL.documentsDirectory.appending(component: "db.sqlite").path()
68+
print("open", path)
69+
database = try DatabasePool(path: path, configuration: configuration)
70+
}
71+
var migrator = DatabaseMigrator()
72+
#if DEBUG
73+
migrator.eraseDatabaseOnSchemaChange = true
74+
#endif
75+
migrator.registerMigration("Add reminders lists table") { db in
76+
try db.create(table: RemindersList.databaseTableName) { table in
77+
table.autoIncrementedPrimaryKey("id")
78+
table.column("color", .integer).defaults(to: 0x4a99ef).notNull()
79+
table.column("name", .text).notNull()
8380
}
84-
migrator.registerMigration("Add reminders lists table") { db in
85-
try db.create(table: RemindersList.databaseTableName) { table in
86-
table.autoIncrementedPrimaryKey("id")
87-
table.column("color", .integer).defaults(to: 0x4a99ef).notNull()
88-
table.column("name", .text).notNull()
89-
}
81+
}
82+
migrator.registerMigration("Add reminders table") { db in
83+
try db.create(table: Reminder.databaseTableName) { table in
84+
table.autoIncrementedPrimaryKey("id")
85+
table.column("date", .date)
86+
table.column("isCompleted", .boolean).defaults(to: false).notNull()
87+
table.column("isFlagged", .boolean).defaults(to: false).notNull()
88+
table.column("listID", .integer)
89+
.references(RemindersList.databaseTableName, column: "id", onDelete: .cascade)
90+
.notNull()
91+
table.column("notes", .text).notNull()
92+
table.column("priority", .integer)
93+
table.column("title", .text).notNull()
9094
}
91-
migrator.registerMigration("Add reminders table") { db in
92-
try db.create(table: Reminder.databaseTableName) { table in
93-
table.autoIncrementedPrimaryKey("id")
94-
table.column("date", .date)
95-
table.column("isCompleted", .boolean).defaults(to: false).notNull()
96-
table.column("isFlagged", .boolean).defaults(to: false).notNull()
97-
table.column("listID", .integer)
98-
.references(RemindersList.databaseTableName, column: "id", onDelete: .cascade)
99-
.notNull()
100-
table.column("notes", .text).notNull()
101-
table.column("priority", .integer)
102-
table.column("title", .text).notNull()
103-
}
95+
}
96+
migrator.registerMigration("Add tags table") { db in
97+
try db.create(table: Tag.databaseTableName) { table in
98+
table.autoIncrementedPrimaryKey("id")
99+
table.column("name", .text).notNull().collate(.nocase).unique()
104100
}
105-
migrator.registerMigration("Add tags table") { db in
106-
try db.create(table: Tag.databaseTableName) { table in
107-
table.autoIncrementedPrimaryKey("id")
108-
table.column("name", .text).notNull().collate(.nocase).unique()
109-
}
110-
try db.create(table: ReminderTag.databaseTableName) { table in
111-
table.column("reminderID", .integer).notNull()
112-
.references(Reminder.databaseTableName, column: "id", onDelete: .cascade)
113-
table.column("tagID", .integer).notNull()
114-
.references(Tag.databaseTableName, column: "id", onDelete: .cascade)
115-
}
101+
try db.create(table: ReminderTag.databaseTableName) { table in
102+
table.column("reminderID", .integer).notNull()
103+
.references(Reminder.databaseTableName, column: "id", onDelete: .cascade)
104+
table.column("tagID", .integer).notNull()
105+
.references(Tag.databaseTableName, column: "id", onDelete: .cascade)
116106
}
117-
118-
return databaseQueue
119107
}
108+
#if DEBUG
109+
migrator.registerMigration("Add mock data") { db in
110+
try db.createMockData()
111+
}
112+
#endif
113+
try migrator.migrate(database)
114+
115+
return database
120116
}
121117

122118
#if DEBUG

Examples/Reminders/SearchReminders.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,8 +182,8 @@ private func searchQueryBase(searchText: String) -> QueryInterfaceRequest<Remind
182182

183183
#Preview {
184184
@Previewable @State var searchText = "take"
185-
let _ = prepareDependencies {
186-
$0.defaultDatabase = .appDatabase
185+
let _ = try! prepareDependencies {
186+
$0.defaultDatabase = try Reminders.appDatabase(inMemory: true)
187187
}
188188

189189
NavigationStack {

Examples/SyncUps/App.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ struct AppView: View {
8080

8181
#Preview("Happy path") {
8282
let _ = prepareDependencies {
83-
$0.defaultDatabase = .appDatabase
83+
$0.defaultDatabase = SyncUps.appDatabase(inMemory: true)
8484
}
8585
AppView(model: AppModel())
8686
}

Examples/SyncUps/Schema.swift

Lines changed: 51 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -87,66 +87,64 @@ enum Theme: String, CaseIterable, Codable, Hashable, Identifiable, DatabaseValue
8787
}
8888
}
8989

90-
extension DatabaseReader where Self == DatabaseQueue {
91-
static var appDatabase: Self {
92-
let databaseQueue: DatabaseQueue
93-
var configuration = Configuration()
94-
configuration.foreignKeysEnabled = true
95-
configuration.prepareDatabase { db in
96-
#if DEBUG
97-
db.trace(options: .profile) {
98-
print($0.expandedDescription)
99-
}
100-
#endif
101-
}
102-
if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == nil && !isTesting {
103-
let path = URL.documentsDirectory.appending(component: "db.sqlite").path()
104-
print("open", path)
105-
databaseQueue = try! DatabaseQueue(path: path, configuration: configuration)
106-
} else {
107-
databaseQueue = try! DatabaseQueue(configuration: configuration)
108-
}
109-
var migrator = DatabaseMigrator()
90+
func appDatabase(inMemory: Bool = false) throws -> any DatabaseWriter {
91+
let database: any DatabaseWriter
92+
var configuration = Configuration()
93+
configuration.foreignKeysEnabled = true
94+
configuration.prepareDatabase { db in
11095
#if DEBUG
111-
migrator.eraseDatabaseOnSchemaChange = true
112-
#endif
113-
migrator.registerMigration("Create sync-ups table") { db in
114-
try db.create(table: SyncUp.databaseTableName) { table in
115-
table.autoIncrementedPrimaryKey("id")
116-
table.column("seconds", .integer).defaults(to: 5 * 60).notNull()
117-
table.column("theme", .text).notNull().defaults(to: Theme.bubblegum)
118-
table.column("title", .text).notNull()
96+
db.trace(options: .profile) {
97+
print($0.expandedDescription)
11998
}
99+
#endif
100+
}
101+
if inMemory {
102+
database = try DatabaseQueue(configuration: configuration)
103+
} else {
104+
let path = URL.documentsDirectory.appending(component: "db.sqlite").path()
105+
print("open", path)
106+
database = try DatabasePool(path: path, configuration: configuration)
107+
}
108+
var migrator = DatabaseMigrator()
109+
#if DEBUG
110+
migrator.eraseDatabaseOnSchemaChange = true
111+
#endif
112+
migrator.registerMigration("Create sync-ups table") { db in
113+
try db.create(table: SyncUp.databaseTableName) { table in
114+
table.autoIncrementedPrimaryKey("id")
115+
table.column("seconds", .integer).defaults(to: 5 * 60).notNull()
116+
table.column("theme", .text).notNull().defaults(to: Theme.bubblegum)
117+
table.column("title", .text).notNull()
120118
}
121-
migrator.registerMigration("Create attendees table") { db in
122-
try db.create(table: Attendee.databaseTableName) { table in
123-
table.autoIncrementedPrimaryKey("id")
124-
table.column("name", .text).notNull()
125-
table.column("syncUpID", .integer)
126-
.references(SyncUp.databaseTableName, column: "id", onDelete: .cascade)
127-
.notNull()
128-
}
119+
}
120+
migrator.registerMigration("Create attendees table") { db in
121+
try db.create(table: Attendee.databaseTableName) { table in
122+
table.autoIncrementedPrimaryKey("id")
123+
table.column("name", .text).notNull()
124+
table.column("syncUpID", .integer)
125+
.references(SyncUp.databaseTableName, column: "id", onDelete: .cascade)
126+
.notNull()
129127
}
130-
migrator.registerMigration("Create meetings table") { db in
131-
try db.create(table: Meeting.databaseTableName) { table in
132-
table.autoIncrementedPrimaryKey("id")
133-
table.column("date", .datetime).notNull().unique().defaults(sql: "CURRENT_TIMESTAMP")
134-
table.column("syncUpID", .integer)
135-
.references(SyncUp.databaseTableName, column: "id", onDelete: .cascade)
136-
.notNull()
137-
table.column("transcript", .text).notNull()
138-
}
128+
}
129+
migrator.registerMigration("Create meetings table") { db in
130+
try db.create(table: Meeting.databaseTableName) { table in
131+
table.autoIncrementedPrimaryKey("id")
132+
table.column("date", .datetime).notNull().unique().defaults(sql: "CURRENT_TIMESTAMP")
133+
table.column("syncUpID", .integer)
134+
.references(SyncUp.databaseTableName, column: "id", onDelete: .cascade)
135+
.notNull()
136+
table.column("transcript", .text).notNull()
139137
}
140-
#if DEBUG
141-
migrator.registerMigration("Insert sample data") { db in
142-
try db.insertSampleData()
143-
}
144-
#endif
138+
}
139+
#if DEBUG
140+
migrator.registerMigration("Insert sample data") { db in
141+
try db.insertSampleData()
142+
}
143+
#endif
145144

146-
try! migrator.migrate(databaseQueue)
145+
try migrator.migrate(database)
147146

148-
return databaseQueue
149-
}
147+
return database
150148
}
151149

152150
#if DEBUG

0 commit comments

Comments
 (0)