Make SyncDatabase work with DatabaseQueue changes.
This commit is contained in:
parent
e0f61c362b
commit
894d3909a3
@ -26,23 +26,23 @@ public struct SyncDatabase {
|
|||||||
|
|
||||||
// MARK: - API
|
// MARK: - API
|
||||||
|
|
||||||
public func insertStatuses(_ statuses: [SyncStatus], completion: VoidCompletionBlock? = nil) {
|
public func insertStatuses(_ statuses: [SyncStatus], completion: DatabaseCompletionBlock? = nil) {
|
||||||
syncStatusTable.insertStatuses(statuses, completion: completion)
|
syncStatusTable.insertStatuses(statuses, completion: completion)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func selectForProcessing() -> [SyncStatus] {
|
public func selectForProcessing() throws -> [SyncStatus] {
|
||||||
return syncStatusTable.selectForProcessing()
|
return try syncStatusTable.selectForProcessing()
|
||||||
}
|
}
|
||||||
|
|
||||||
public func selectPendingCount() -> Int {
|
public func selectPendingCount() throws -> Int {
|
||||||
return syncStatusTable.selectPendingCount()
|
return try syncStatusTable.selectPendingCount()
|
||||||
}
|
}
|
||||||
|
|
||||||
public func resetSelectedForProcessing(_ articleIDs: [String], completion: VoidCompletionBlock? = nil) {
|
public func resetSelectedForProcessing(_ articleIDs: [String], completion: DatabaseCompletionBlock? = nil) {
|
||||||
syncStatusTable.resetSelectedForProcessing(articleIDs, completion: completion)
|
syncStatusTable.resetSelectedForProcessing(articleIDs, completion: completion)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func deleteSelectedForProcessing(_ articleIDs: [String], completion: VoidCompletionBlock? = nil) {
|
public func deleteSelectedForProcessing(_ articleIDs: [String], completion: DatabaseCompletionBlock? = nil) {
|
||||||
syncStatusTable.deleteSelectedForProcessing(articleIDs, completion: completion)
|
syncStatusTable.deleteSelectedForProcessing(articleIDs, completion: completion)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,14 +20,13 @@ struct SyncStatusTable: DatabaseTable {
|
|||||||
self.queue = queue
|
self.queue = queue
|
||||||
}
|
}
|
||||||
|
|
||||||
func selectForProcessing() -> [SyncStatus] {
|
func selectForProcessing() throws -> [SyncStatus] {
|
||||||
var statuses: Set<SyncStatus>? = nil
|
var statuses: Set<SyncStatus>? = nil
|
||||||
|
var error: DatabaseError?
|
||||||
|
|
||||||
guard !queue.isSuspended else {
|
queue.runInTransactionSync { databaseResult in
|
||||||
return [SyncStatus]()
|
|
||||||
}
|
|
||||||
|
|
||||||
queue.runInDatabaseSync { database in
|
func makeDatabaseCall(_ database: FMDatabase) {
|
||||||
let updateSQL = "update syncStatus set selected = true"
|
let updateSQL = "update syncStatus set selected = true"
|
||||||
database.executeUpdate(updateSQL, withArgumentsIn: nil)
|
database.executeUpdate(updateSQL, withArgumentsIn: nil)
|
||||||
|
|
||||||
@ -37,74 +36,101 @@ struct SyncStatusTable: DatabaseTable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch databaseResult {
|
||||||
|
case .success(let database):
|
||||||
|
makeDatabaseCall(database)
|
||||||
|
case .failure(let databaseError):
|
||||||
|
error = databaseError
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if let error = error {
|
||||||
|
throw(error)
|
||||||
|
}
|
||||||
return statuses != nil ? Array(statuses!) : [SyncStatus]()
|
return statuses != nil ? Array(statuses!) : [SyncStatus]()
|
||||||
}
|
}
|
||||||
|
|
||||||
func selectPendingCount() -> Int {
|
func selectPendingCount() throws -> Int {
|
||||||
var count: Int = 0
|
var count: Int = 0
|
||||||
|
var error: DatabaseError?
|
||||||
|
|
||||||
guard !queue.isSuspended else {
|
queue.runInDatabaseSync { databaseResult in
|
||||||
return count
|
|
||||||
}
|
|
||||||
|
|
||||||
queue.runInDatabaseSync { database in
|
func makeDatabaseCall(_ database: FMDatabase) {
|
||||||
let sql = "select count(*) from syncStatus"
|
let sql = "select count(*) from syncStatus"
|
||||||
if let resultSet = database.executeQuery(sql, withArgumentsIn: nil) {
|
if let resultSet = database.executeQuery(sql, withArgumentsIn: nil) {
|
||||||
count = numberWithCountResultSet(resultSet)
|
count = numberWithCountResultSet(resultSet)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch databaseResult {
|
||||||
|
case .success(let database):
|
||||||
|
makeDatabaseCall(database)
|
||||||
|
case .failure(let databaseError):
|
||||||
|
error = databaseError
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if let error = error {
|
||||||
|
throw(error)
|
||||||
|
}
|
||||||
return count
|
return count
|
||||||
}
|
}
|
||||||
|
|
||||||
func resetSelectedForProcessing(_ articleIDs: [String], completion: VoidCompletionBlock? = nil) {
|
func resetSelectedForProcessing(_ articleIDs: [String], completion: DatabaseCompletionBlock? = nil) {
|
||||||
guard !queue.isSuspended else {
|
queue.runInTransaction { databaseResult in
|
||||||
if let completion = completion {
|
|
||||||
callVoidCompletionBlock(completion)
|
func makeDatabaseCall(_ database: FMDatabase) {
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
queue.runInTransaction { database in
|
|
||||||
let parameters = articleIDs.map { $0 as AnyObject }
|
let parameters = articleIDs.map { $0 as AnyObject }
|
||||||
let placeholders = NSString.rs_SQLValueList(withPlaceholders: UInt(articleIDs.count))!
|
let placeholders = NSString.rs_SQLValueList(withPlaceholders: UInt(articleIDs.count))!
|
||||||
let updateSQL = "update syncStatus set selected = false where articleID in \(placeholders)"
|
let updateSQL = "update syncStatus set selected = false where articleID in \(placeholders)"
|
||||||
database.executeUpdate(updateSQL, withArgumentsIn: parameters)
|
database.executeUpdate(updateSQL, withArgumentsIn: parameters)
|
||||||
if let completion = completion {
|
}
|
||||||
callVoidCompletionBlock(completion)
|
|
||||||
|
switch databaseResult {
|
||||||
|
case .success(let database):
|
||||||
|
makeDatabaseCall(database)
|
||||||
|
callCompletion(completion, nil)
|
||||||
|
case .failure(let databaseError):
|
||||||
|
callCompletion(completion, databaseError)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteSelectedForProcessing(_ articleIDs: [String], completion: VoidCompletionBlock? = nil) {
|
func deleteSelectedForProcessing(_ articleIDs: [String], completion: DatabaseCompletionBlock? = nil) {
|
||||||
guard !queue.isSuspended else {
|
queue.runInTransaction { databaseResult in
|
||||||
if let completion = completion {
|
|
||||||
callVoidCompletionBlock(completion)
|
func makeDatabaseCall(_ database: FMDatabase) {
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
queue.runInTransaction { database in
|
|
||||||
let parameters = articleIDs.map { $0 as AnyObject }
|
let parameters = articleIDs.map { $0 as AnyObject }
|
||||||
let placeholders = NSString.rs_SQLValueList(withPlaceholders: UInt(articleIDs.count))!
|
let placeholders = NSString.rs_SQLValueList(withPlaceholders: UInt(articleIDs.count))!
|
||||||
let deleteSQL = "delete from syncStatus where articleID in \(placeholders)"
|
let deleteSQL = "delete from syncStatus where articleID in \(placeholders)"
|
||||||
database.executeUpdate(deleteSQL, withArgumentsIn: parameters)
|
database.executeUpdate(deleteSQL, withArgumentsIn: parameters)
|
||||||
if let completion = completion {
|
}
|
||||||
callVoidCompletionBlock(completion)
|
|
||||||
|
switch databaseResult {
|
||||||
|
case .success(let database):
|
||||||
|
makeDatabaseCall(database)
|
||||||
|
callCompletion(completion, nil)
|
||||||
|
case .failure(let databaseError):
|
||||||
|
callCompletion(completion, databaseError)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func insertStatuses(_ statuses: [SyncStatus], completion: VoidCompletionBlock? = nil) {
|
func insertStatuses(_ statuses: [SyncStatus], completion: DatabaseCompletionBlock? = nil) {
|
||||||
guard !queue.isSuspended else {
|
queue.runInTransaction { databaseResult in
|
||||||
if let completion = completion {
|
|
||||||
callVoidCompletionBlock(completion)
|
func makeDatabaseCall(_ database: FMDatabase) {
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
queue.runInTransaction { database in
|
|
||||||
let statusArray = statuses.map { $0.databaseDictionary() }
|
let statusArray = statuses.map { $0.databaseDictionary() }
|
||||||
self.insertRows(statusArray, insertType: .orReplace, in: database)
|
self.insertRows(statusArray, insertType: .orReplace, in: database)
|
||||||
if let completion = completion {
|
}
|
||||||
callVoidCompletionBlock(completion)
|
|
||||||
|
switch databaseResult {
|
||||||
|
case .success(let database):
|
||||||
|
makeDatabaseCall(database)
|
||||||
|
callCompletion(completion, nil)
|
||||||
|
case .failure(let databaseError):
|
||||||
|
callCompletion(completion, databaseError)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -125,3 +151,12 @@ private extension SyncStatusTable {
|
|||||||
return SyncStatus(articleID: articleID, key: key, flag: flag, selected: selected)
|
return SyncStatus(articleID: articleID, key: key, flag: flag, selected: selected)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func callCompletion(_ completion: DatabaseCompletionBlock?, _ databaseError: DatabaseError?) {
|
||||||
|
guard let completion = completion else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
completion(databaseError)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user