Skip to content

Commit 49f26ed

Browse files
authored
Return result from Database.inTransaction (#17)
1 parent 707ad42 commit 49f26ed

File tree

4 files changed

+56
-40
lines changed

4 files changed

+56
-40
lines changed

Sources/SQLite/Database.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,16 @@ public final class Database {
6262
}
6363
}
6464

65-
public func inTransaction(_ block: () throws -> Void) throws {
65+
public func inTransaction<T>(_ block: (Database) throws -> T) throws -> T {
6666
return try sync {
6767
_transactionCount += 1
6868
defer { _transactionCount -= 1 }
6969

7070
do {
7171
try execute(raw: "SAVEPOINT database_transaction;")
72-
try block()
72+
let result = try block(self)
7373
try execute(raw: "RELEASE SAVEPOINT database_transaction;")
74+
return result
7475
} catch {
7576
try execute(raw: "ROLLBACK;")
7677
throw error

Sources/SQLite/SQLiteEncoder.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ public final class SQLiteEncoder {
1919

2020
if let array = value as? Array<Encodable> {
2121
do {
22-
try _database.inTransaction {
22+
try _database.inTransaction { db in
2323
try array.forEach { (element: Encodable) in
2424
try element.encode(to: encoder)
25-
try _database.write(sql, arguments: encoder.encodedArguments)
25+
try db.write(sql, arguments: encoder.encodedArguments)
2626
}
2727
}
2828
} catch {

Tests/SQLiteTests/DatabaseTests.swift

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -233,9 +233,9 @@ class DatabaseTests: XCTestCase {
233233

234234
XCTAssertNoThrow(try database.execute(raw: _createTableWithFloatStringData))
235235

236-
let block = {
236+
let block = { (db: Database) in
237237
for row in [one, two, three, four, five] {
238-
XCTAssertNoThrow(try self.database.write(self._insertIDFloatStringAndData, arguments: row))
238+
XCTAssertNoThrow(try db.write(self._insertIDFloatStringAndData, arguments: row))
239239
}
240240
}
241241

@@ -249,14 +249,29 @@ class DatabaseTests: XCTestCase {
249249
}
250250
}
251251

252+
func testReturnValueFromInTransaction() throws {
253+
let one: SQLiteArguments = [
254+
"id": .integer(1), "float": .double(1.23), "string": .text("123"), "data": .data(_textData)
255+
]
256+
257+
XCTAssertNoThrow(try database.execute(raw: _createTableWithFloatStringData))
258+
XCTAssertNoThrow(try database.write(_insertIDFloatStringAndData, arguments: one))
259+
260+
let row = try database.inTransaction { db in
261+
return try db.read(_selectWhereID, arguments: ["id": .integer(1)]).first
262+
}
263+
264+
XCTAssertEqual(row, one)
265+
}
266+
252267
func testInvalidInsertOfBlobInTransactionRollsBack() throws {
253268
let one: SQLiteArguments = ["id": .integer(1), "data": .data(_textData)]
254269
let two: SQLiteArguments = ["id": .integer(2)]
255270

256271
XCTAssertNoThrow(try database.execute(raw: _createTableWithBlob))
257272
XCTAssertNoThrow(try database.write(_insertIDAndData, arguments: one))
258273

259-
let block = { try self.database.write(self._insertIDAndData, arguments: two) }
274+
let block = { try ($0 as Database).write(self._insertIDAndData, arguments: two) }
260275
XCTAssertThrowsError(try database.inTransaction(block))
261276

262277
var fetched: Array<SQLiteRow> = []
@@ -272,20 +287,20 @@ class DatabaseTests: XCTestCase {
272287

273288
XCTAssertNoThrow(try database.execute(raw: _createTableWithBlob))
274289

275-
try database.inTransaction {
290+
try database.inTransaction { db in
276291
XCTAssertTrue(database.hasOpenTransactions)
277-
XCTAssertNoThrow(try database.write(_insertIDAndData, arguments: arguments(with: 1)))
292+
XCTAssertNoThrow(try db.write(_insertIDAndData, arguments: arguments(with: 1)))
278293
}
279294
XCTAssertFalse(database.hasOpenTransactions)
280295

281-
try database.inTransaction {
282-
XCTAssertTrue(database.hasOpenTransactions)
283-
XCTAssertNoThrow(try database.write(_insertIDAndData, arguments: arguments(with: 2)))
284-
try database.inTransaction {
285-
XCTAssertTrue(database.hasOpenTransactions)
286-
XCTAssertNoThrow(try database.write(_insertIDAndData, arguments: arguments(with: 3)))
296+
try database.inTransaction { db in
297+
XCTAssertTrue(db.hasOpenTransactions)
298+
XCTAssertNoThrow(try db.write(_insertIDAndData, arguments: arguments(with: 2)))
299+
try db.inTransaction { db in
300+
XCTAssertTrue(db.hasOpenTransactions)
301+
XCTAssertNoThrow(try db.write(_insertIDAndData, arguments: arguments(with: 3)))
287302
}
288-
XCTAssertTrue(database.hasOpenTransactions)
303+
XCTAssertTrue(db.hasOpenTransactions)
289304
}
290305
XCTAssertFalse(database.hasOpenTransactions)
291306
}

Tests/SQLiteTests/ObserveTests.swift

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,9 @@ class ObserveTests: XCTestCase {
8989

9090
expectationAndResultsForPeople = (expectation, [updatedPerson, replacedPerson])
9191

92-
try database.inTransaction {
93-
try database.write(Person.insert, arguments: replacedPerson.asArguments)
94-
try database.write(Person.updateTitleWithID, arguments: [
92+
try database.inTransaction { db in
93+
try db.write(Person.insert, arguments: replacedPerson.asArguments)
94+
try db.write(Person.updateTitleWithID, arguments: [
9595
"id": .text("2"), "title": .text("Technical Fellow")
9696
])
9797
}
@@ -137,14 +137,14 @@ class ObserveTests: XCTestCase {
137137

138138
expectationAndResultsForPeople = (expectation, [insertedPerson, replacedPerson])
139139

140-
try database.inTransaction {
141-
try database.write(Person.deleteWithID, arguments: ["id": .text("2")])
142-
try database.write(Person.insert, arguments: insertedPerson.asArguments)
143-
try database.write(Person.insert, arguments: replacedPerson.asArguments)
140+
try database.inTransaction { db in
141+
try db.write(Person.deleteWithID, arguments: ["id": .text("2")])
142+
try db.write(Person.insert, arguments: insertedPerson.asArguments)
143+
try db.write(Person.insert, arguments: replacedPerson.asArguments)
144144

145-
try database.write(Pet.deleteWithName, arguments: ["name": .text("小飞球")])
146-
try database.write(Pet.insert, arguments: insertedPet.asArguments)
147-
try database.write(Pet.insert, arguments: replacedPet.asArguments)
145+
try db.write(Pet.deleteWithName, arguments: ["name": .text("小飞球")])
146+
try db.write(Pet.insert, arguments: insertedPet.asArguments)
147+
try db.write(Pet.insert, arguments: replacedPet.asArguments)
148148
}
149149

150150
waitForExpectations(timeout: 0.5)
@@ -165,14 +165,14 @@ class ObserveTests: XCTestCase {
165165
expectationAndResultsForPeople = (peopleExpectation, [insertedPerson, replacedPerson])
166166
expectationAndResultsForPets = (petsExpectation, [insertedPet, replacedPet])
167167

168-
try database.inTransaction {
169-
try database.write(Person.deleteWithID, arguments: ["id": .text("2")])
170-
try database.write(Person.insert, arguments: insertedPerson.asArguments)
171-
try database.write(Person.insert, arguments: replacedPerson.asArguments)
168+
try database.inTransaction { db in
169+
try db.write(Person.deleteWithID, arguments: ["id": .text("2")])
170+
try db.write(Person.insert, arguments: insertedPerson.asArguments)
171+
try db.write(Person.insert, arguments: replacedPerson.asArguments)
172172

173-
try database.write(Pet.deleteWithName, arguments: ["name": .text("小飞球")])
174-
try database.write(Pet.insert, arguments: insertedPet.asArguments)
175-
try database.write(Pet.insert, arguments: replacedPet.asArguments)
173+
try db.write(Pet.deleteWithName, arguments: ["name": .text("小飞球")])
174+
try db.write(Pet.insert, arguments: insertedPet.asArguments)
175+
try db.write(Pet.insert, arguments: replacedPet.asArguments)
176176
}
177177

178178
waitForExpectations(timeout: 0.5)
@@ -185,8 +185,8 @@ class ObserveTests: XCTestCase {
185185

186186
expectationAndResultsForPetOwners = (petOwnersExpectation, [_petOwner1])
187187

188-
try database.inTransaction {
189-
try database.write(Pet.deleteWithName, arguments: ["name": .text("小飞球")])
188+
try database.inTransaction { db in
189+
try db.write(Pet.deleteWithName, arguments: ["name": .text("小飞球")])
190190
}
191191

192192
waitForExpectations(timeout: 0.5)
@@ -203,9 +203,9 @@ class ObserveTests: XCTestCase {
203203

204204
expectationAndResultsForPetOwners = (petOwnersExpectation, [_petOwner1, _petOwner2, petOwner3])
205205

206-
try database.inTransaction {
207-
try database.write(Person.insert, arguments: insertedPerson.asArguments)
208-
try database.write(Pet.insert, arguments: insertedPet.asArguments)
206+
try database.inTransaction { db in
207+
try db.write(Person.insert, arguments: insertedPerson.asArguments)
208+
try db.write(Pet.insert, arguments: insertedPet.asArguments)
209209
}
210210

211211
waitForExpectations(timeout: 0.5)
@@ -223,8 +223,8 @@ class ObserveTests: XCTestCase {
223223

224224
expectationAndResultsForPetOwners = (petOwnersExpectation, [updatedPetOwner, _petOwner2])
225225

226-
try database.inTransaction {
227-
try database.write(Pet.updateNameWithRegistrationID, arguments: [
226+
try database.inTransaction { db in
227+
try db.write(Pet.updateNameWithRegistrationID, arguments: [
228228
"name": .text("February"),
229229
"registration_id": .text("1"),
230230
])

0 commit comments

Comments
 (0)