session-ios/SignalUtilitiesKit/DeviceLinkIndex.swift

44 lines
1.9 KiB
Swift

@objc(LKDeviceLinkIndex)
public final class DeviceLinkIndex : NSObject {
private static let name = "loki_device_link_index"
@objc public static let masterPublicKey = "master_hex_encoded_public_key"
@objc public static let slavePublicKey = "slave_hex_encoded_public_key"
@objc public static let isAuthorized = "is_authorized"
@objc public static let indexDatabaseExtension: YapDatabaseSecondaryIndex = {
let setup = YapDatabaseSecondaryIndexSetup()
setup.addColumn(masterPublicKey, with: .text)
setup.addColumn(slavePublicKey, with: .text)
setup.addColumn(isAuthorized, with: .integer)
let handler = YapDatabaseSecondaryIndexHandler.withObjectBlock { _, map, _, _, object in
guard let deviceLink = object as? DeviceLink else { return }
map[masterPublicKey] = deviceLink.master.publicKey
map[slavePublicKey] = deviceLink.slave.publicKey
map[isAuthorized] = deviceLink.isAuthorized
}
return YapDatabaseSecondaryIndex(setup: setup, handler: handler)
}()
@objc public static let databaseExtensionName: String = name
@objc public static func asyncRegisterDatabaseExtensions(_ storage: OWSStorage) {
storage.asyncRegister(indexDatabaseExtension, withName: name)
}
@objc public static func getDeviceLinks(for query: YapDatabaseQuery, in transaction: YapDatabaseReadTransaction) -> [DeviceLink] {
guard let ext = transaction.ext(DeviceLinkIndex.name) as? YapDatabaseSecondaryIndexTransaction else {
print("[Loki] Couldn't get device link index database extension.")
return []
}
var result: [DeviceLink] = []
ext.enumerateKeysAndObjects(matching: query) { _, _, object, _ in
guard let deviceLink = object as? DeviceLink else { return }
result.append(deviceLink)
}
return result
}
}