Skip to content

Commit 0334631

Browse files
committed
added replace to safe storage
1 parent 370c5a8 commit 0334631

File tree

4 files changed

+65
-34
lines changed

4 files changed

+65
-34
lines changed

Sources/SQLiteORM/BaseStorage/BaseStorage+CRUD.swift

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,4 +252,56 @@ extension BaseStorage {
252252
return .failure(error)
253253
}
254254
}
255+
256+
func replaceInternal<T>(_ object: T) -> Result<Void, Error> {
257+
guard let anyTable = self.tables.first(where: { $0.type == T.self }) else {
258+
return .failure(Error.typeIsNotMapped)
259+
}
260+
var sql = "REPLACE INTO \(anyTable.name) ("
261+
let columnsCount = anyTable.columns.count
262+
for (columnIndex, column) in anyTable.columns.enumerated() {
263+
sql += "\"\(column.name)\""
264+
if columnIndex < columnsCount - 1 {
265+
sql += ", "
266+
}
267+
}
268+
sql += ") VALUES ("
269+
for columnIndex in 0..<columnsCount {
270+
sql += "?"
271+
if columnIndex < columnsCount - 1 {
272+
sql += ", "
273+
}
274+
}
275+
sql += ")"
276+
let connectionRefResult = self.connection.createConnectionRef()
277+
switch connectionRefResult {
278+
case .success(let connectionRef):
279+
let prepareResult = connectionRef.prepare(sql: sql)
280+
switch prepareResult {
281+
case .success(let statement):
282+
let table = anyTable as! Table<T>
283+
let bindResult = table.bind(columnBinder: statement, object: object, apiProvider: self.apiProvider)
284+
switch bindResult {
285+
case .success(var resultCode):
286+
guard resultCode == apiProvider.SQLITE_OK else {
287+
let errorString = connectionRef.errorMessage
288+
return .failure(Error.sqliteError(code: resultCode, text: errorString))
289+
}
290+
resultCode = statement.step()
291+
guard apiProvider.SQLITE_DONE == resultCode else {
292+
let errorString = connectionRef.errorMessage
293+
return .failure(Error.sqliteError(code: resultCode, text: errorString))
294+
}
295+
return .success(())
296+
case .failure(let error):
297+
return .failure(error)
298+
}
299+
case .failure(let error):
300+
return .failure(error)
301+
}
302+
case .failure(let error):
303+
return .failure(error)
304+
}
305+
306+
}
255307
}

Sources/SQLiteORM/SafeStorage/SafeStorage+CRUD.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,8 @@ extension SafeStorage {
1616
public func insert<T>(_ object: T) -> Result<Int64, Error> {
1717
return self.insertInternal(object)
1818
}
19+
20+
public func replace<T>(_ object: T) -> Result<Void, Error> {
21+
return self.replaceInternal(object)
22+
}
1923
}

Sources/SQLiteORM/Storage/Storage+CRUD.swift

Lines changed: 6 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -42,37 +42,12 @@ extension Storage {
4242
}
4343

4444
public func replace<T>(_ object: T) throws {
45-
guard let anyTable = self.tables.first(where: { $0.type == T.self }) else {
46-
throw Error.typeIsNotMapped
47-
}
48-
var sql = "REPLACE INTO \(anyTable.name) ("
49-
let columnsCount = anyTable.columns.count
50-
for (columnIndex, column) in anyTable.columns.enumerated() {
51-
sql += "\"\(column.name)\""
52-
if columnIndex < columnsCount - 1 {
53-
sql += ", "
54-
}
55-
}
56-
sql += ") VALUES ("
57-
for columnIndex in 0..<columnsCount {
58-
sql += "?"
59-
if columnIndex < columnsCount - 1 {
60-
sql += ", "
61-
}
62-
}
63-
sql += ")"
64-
let connectionRef = try ConnectionRef(connection: self.connection)
65-
let statement = try connectionRef.prepare(sql: sql)
66-
let table = anyTable as! Table<T>
67-
var resultCode = try table.bind(columnBinder: statement, object: object, apiProvider: self.apiProvider)
68-
guard resultCode == apiProvider.SQLITE_OK else {
69-
let errorString = connectionRef.errorMessage
70-
throw Error.sqliteError(code: resultCode, text: errorString)
71-
}
72-
resultCode = statement.step()
73-
guard apiProvider.SQLITE_DONE == resultCode else {
74-
let errorString = connectionRef.errorMessage
75-
throw Error.sqliteError(code: resultCode, text: errorString)
45+
let replaceResult = self.replaceInternal(object)
46+
switch replaceResult {
47+
case .success():
48+
return
49+
case .failure(let error):
50+
throw error
7651
}
7752
}
7853
}

Sources/SQLiteORM/Table.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public class Table<T>: AnyTable {
2828
return .success(result)
2929
}
3030

31-
func bind(columnBinder: ColumnBinder, object: T, apiProvider: SQLiteApiProvider) throws -> Int32 {
31+
func bind(columnBinder: ColumnBinder, object: T, apiProvider: SQLiteApiProvider) -> Result<Int32, Error> {
3232
var result = Int32(0)
3333
for (columnIndex, anyColumn) in self.columns.enumerated() {
3434
let binder = BinderImpl(columnIndex: columnIndex + 1, columnBinder: columnBinder)
@@ -40,9 +40,9 @@ public class Table<T>: AnyTable {
4040
break
4141
}
4242
case .failure(let error):
43-
throw error
43+
return .failure(error)
4444
}
4545
}
46-
return result
46+
return .success(result)
4747
}
4848
}

0 commit comments

Comments
 (0)