Signal-iOS/SignalServiceKit/Storage/Database/SDSKeyValueStore/KeyValueStore.swift
2024-03-27 12:22:52 -05:00

161 lines
5.2 KiB
Swift

//
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
/// Abstract protocol for storing values by key.
/// In production, typically backed by `SDSKeyValueStore`, which uses the GRDB
/// database to persist keys and values to disk.
/// In test code, typically backed by `InMemoryKeyValueStore`, which just keeps
/// everything in memory to avoid setting up an entire db schema on every test case run.
///
/// Instances of `KeyValueStore` should be created using a `KeyValueStoreFactory`.
///
/// Methods are identical to those on `SDSKeyValueStore`.
public protocol KeyValueStore {
init(collection: String)
// MARK: - Existence
func hasValue(_ key: String, transaction: DBReadTransaction) -> Bool
// MARK: - String
func getString(_ key: String, transaction: DBReadTransaction) -> String?
func setString(_ value: String?, key: String, transaction: DBWriteTransaction)
// MARK: - Date
func getDate(_ key: String, transaction: DBReadTransaction) -> Date?
func setDate(_ value: Date, key: String, transaction: DBWriteTransaction)
// MARK: - Bool
func getBool(_ key: String, transaction: DBReadTransaction) -> Bool?
func getBool(_ key: String, defaultValue: Bool, transaction: DBReadTransaction) -> Bool
func setBool(_ value: Bool, key: String, transaction: DBWriteTransaction)
func setBoolIfChanged(
_ value: Bool,
defaultValue: Bool,
key: String,
transaction: DBWriteTransaction
)
// MARK: - UInt
func getUInt(_ key: String, transaction: DBReadTransaction) -> UInt?
// TODO: Handle numerics more generally.
func getUInt(_ key: String, defaultValue: UInt, transaction: DBReadTransaction) -> UInt
func setUInt(_ value: UInt, key: String, transaction: DBWriteTransaction)
// MARK: - Data
func getData(_ key: String, transaction: DBReadTransaction) -> Data?
func setData(_ value: Data?, key: String, transaction: DBWriteTransaction)
// MARK: - Numeric
func getNSNumber(_ key: String, transaction: DBReadTransaction) -> NSNumber?
// MARK: - Int
func getInt(_ key: String, transaction: DBReadTransaction) -> Int?
func getInt(_ key: String, defaultValue: Int, transaction: DBReadTransaction) -> Int
func setInt(_ value: Int, key: String, transaction: DBWriteTransaction)
// MARK: - Int32
func getInt32(_ key: String, transaction: DBReadTransaction) -> Int32?
func getInt32(_ key: String, defaultValue: Int32, transaction: DBReadTransaction) -> Int32
func setInt32(_ value: Int32, key: String, transaction: DBWriteTransaction)
// MARK: - UInt32
func getUInt32(_ key: String, transaction: DBReadTransaction) -> UInt32?
func getUInt32(_ key: String, defaultValue: UInt32, transaction: DBReadTransaction) -> UInt32
func setUInt32(_ value: UInt32, key: String, transaction: DBWriteTransaction)
// MARK: - UInt64
func getUInt64(_ key: String, transaction: DBReadTransaction) -> UInt64?
func getUInt64(_ key: String, defaultValue: UInt64, transaction: DBReadTransaction) -> UInt64
func setUInt64(_ value: UInt64, key: String, transaction: DBWriteTransaction)
// MARK: - Int64
func getInt64(_ key: String, transaction: DBReadTransaction) -> Int64?
func getInt64(_ key: String, defaultValue: Int64, transaction: DBReadTransaction) -> Int64
func setInt64(_ value: Int64, key: String, transaction: DBWriteTransaction)
// MARK: - Double
func getDouble(_ key: String, transaction: DBReadTransaction) -> Double?
func getDouble(_ key: String, defaultValue: Double, transaction: DBReadTransaction) -> Double
func setDouble(_ value: Double, key: String, transaction: DBWriteTransaction)
// MARK: - Object
func getObject(forKey key: String, transaction: DBReadTransaction) -> Any?
func setObject(_ anyValue: Any?, key: String, transaction: DBWriteTransaction)
// MARK: -
func removeValue(forKey key: String, transaction: DBWriteTransaction)
func removeValues(forKeys keys: [String], transaction: DBWriteTransaction)
func removeAll(transaction: DBWriteTransaction)
func enumerateKeysAndObjects(transaction: DBReadTransaction, block: (String, Any, UnsafeMutablePointer<ObjCBool>) -> Void)
func enumerateKeys(transaction: DBReadTransaction, block: (String, UnsafeMutablePointer<ObjCBool>) -> Void)
func allValues(transaction: DBReadTransaction) -> [Any]
func allDataValues(transaction: DBReadTransaction) -> [Data]
func allBoolValuesMap(transaction: DBReadTransaction) -> [String: Bool]
func allUIntValuesMap(transaction: DBReadTransaction) -> [String: UInt]
func anyDataValue(transaction: DBReadTransaction) -> Data?
func allKeys(transaction: DBReadTransaction) -> [String]
func numberOfKeys(transaction: DBReadTransaction) -> UInt
// MARK: -
func setCodable<T: Encodable>(_ value: T, key: String, transaction: DBWriteTransaction) throws
func setCodable<T: Encodable>(optional value: T, key: String, transaction: DBWriteTransaction) throws
func getCodableValue<T: Decodable>(forKey key: String, transaction: DBReadTransaction) throws -> T?
func allCodableValues<T: Decodable>(transaction: DBReadTransaction) throws -> [T]
}