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
		
	
| 
 | |
| @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)
 | |
|     }
 | |
| }
 |