mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
4.3 KiB
Swift
109 lines
4.3 KiB
Swift
4 years ago
|
|
||
|
@objc(SSKJobRecordFinder)
|
||
|
public class JobRecordFinder: NSObject, Finder {
|
||
|
|
||
|
public typealias ExtensionType = YapDatabaseSecondaryIndex
|
||
|
public typealias TransactionType = YapDatabaseSecondaryIndexTransaction
|
||
|
|
||
|
public enum JobRecordField: String {
|
||
|
case status, label, sortId
|
||
|
}
|
||
|
|
||
|
public func getNextReady(label: String, transaction: YapDatabaseReadTransaction) -> SSKJobRecord? {
|
||
|
var result: SSKJobRecord?
|
||
|
self.enumerateJobRecords(label: label, status: .ready, transaction: transaction) { jobRecord, stopPointer in
|
||
|
result = jobRecord
|
||
|
stopPointer.pointee = true
|
||
|
}
|
||
|
return result
|
||
|
}
|
||
|
|
||
|
public func allRecords(label: String, status: SSKJobRecordStatus, transaction: YapDatabaseReadTransaction) -> [SSKJobRecord] {
|
||
|
var result: [SSKJobRecord] = []
|
||
|
self.enumerateJobRecords(label: label, status: status, transaction: transaction) { jobRecord, _ in
|
||
|
result.append(jobRecord)
|
||
|
}
|
||
|
return result
|
||
|
}
|
||
|
|
||
|
public func enumerateJobRecords(label: String, status: SSKJobRecordStatus, transaction: YapDatabaseReadTransaction, block: @escaping (SSKJobRecord, UnsafeMutablePointer<ObjCBool>) -> Void) {
|
||
|
let queryFormat = String(format: "WHERE %@ = ? AND %@ = ? ORDER BY %@", JobRecordField.status.rawValue, JobRecordField.label.rawValue, JobRecordField.sortId.rawValue)
|
||
|
let query = YapDatabaseQuery(string: queryFormat, parameters: [status.rawValue, label])
|
||
|
|
||
|
self.ext(transaction: transaction).enumerateKeysAndObjects(matching: query) { _, _, object, stopPointer in
|
||
|
guard let jobRecord = object as? SSKJobRecord else {
|
||
|
owsFailDebug("expecting jobRecord but found: \(object)")
|
||
|
return
|
||
|
}
|
||
|
block(jobRecord, stopPointer)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static var dbExtensionName: String {
|
||
|
return "SecondaryIndexJobRecord"
|
||
|
}
|
||
|
|
||
|
@objc
|
||
|
public class func asyncRegisterDatabaseExtensionObjC(storage: OWSStorage) {
|
||
|
asyncRegisterDatabaseExtension(storage: storage)
|
||
|
}
|
||
|
|
||
|
public static var dbExtensionConfig: YapDatabaseSecondaryIndex {
|
||
|
let setup = YapDatabaseSecondaryIndexSetup()
|
||
|
setup.addColumn(JobRecordField.sortId.rawValue, with: .integer)
|
||
|
setup.addColumn(JobRecordField.status.rawValue, with: .integer)
|
||
|
setup.addColumn(JobRecordField.label.rawValue, with: .text)
|
||
|
|
||
|
let block: YapDatabaseSecondaryIndexWithObjectBlock = { transaction, dict, collection, key, object in
|
||
|
guard let jobRecord = object as? SSKJobRecord else {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
dict[JobRecordField.sortId.rawValue] = jobRecord.sortId
|
||
|
dict[JobRecordField.status.rawValue] = jobRecord.status.rawValue
|
||
|
dict[JobRecordField.label.rawValue] = jobRecord.label
|
||
|
}
|
||
|
|
||
|
let handler = YapDatabaseSecondaryIndexHandler.withObjectBlock(block)
|
||
|
|
||
|
let options = YapDatabaseSecondaryIndexOptions()
|
||
|
let whitelist = YapWhitelistBlacklist(whitelist: Set([SSKJobRecord.collection()]))
|
||
|
options.allowedCollections = whitelist
|
||
|
|
||
|
return YapDatabaseSecondaryIndex.init(setup: setup, handler: handler, versionTag: "2", options: options)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protocol Finder {
|
||
|
associatedtype ExtensionType: YapDatabaseExtension
|
||
|
associatedtype TransactionType: YapDatabaseExtensionTransaction
|
||
|
|
||
|
static var dbExtensionName: String { get }
|
||
|
static var dbExtensionConfig: ExtensionType { get }
|
||
|
|
||
|
func ext(transaction: YapDatabaseReadTransaction) -> TransactionType
|
||
|
|
||
|
static func asyncRegisterDatabaseExtension(storage: OWSStorage)
|
||
|
static func testingOnly_ensureDatabaseExtensionRegistered(storage: OWSStorage)
|
||
|
}
|
||
|
|
||
|
extension Finder {
|
||
|
|
||
|
public func ext(transaction: YapDatabaseReadTransaction) -> TransactionType {
|
||
|
return transaction.ext(type(of: self).dbExtensionName) as! TransactionType
|
||
|
}
|
||
|
|
||
|
public static func asyncRegisterDatabaseExtension(storage: OWSStorage) {
|
||
|
storage.asyncRegister(dbExtensionConfig, withName: dbExtensionName)
|
||
|
}
|
||
|
|
||
|
// Only for testing.
|
||
|
public static func testingOnly_ensureDatabaseExtensionRegistered(storage: OWSStorage) {
|
||
|
guard storage.registeredExtension(dbExtensionName) == nil else {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
storage.register(dbExtensionConfig, withName: dbExtensionName)
|
||
|
}
|
||
|
}
|