From 98d568ca0645ce45033bc7bd6bb84eb93d5a76b5 Mon Sep 17 00:00:00 2001 From: Vishesh Yadav Date: Tue, 21 Oct 2025 19:53:23 -0700 Subject: [PATCH 1/6] Rename getRange to getRangeNative --- Sources/FoundationDB/Database.swift | 2 +- .../FoundationDB/Fdb+AsyncKVSequence.swift | 2 +- Sources/FoundationDB/FoundationdDB.swift | 97 +++++++------------ Sources/FoundationDB/Transaction.swift | 4 +- .../Sources/StackTester/StackTester.swift | 12 +-- 5 files changed, 45 insertions(+), 72 deletions(-) diff --git a/Sources/FoundationDB/Database.swift b/Sources/FoundationDB/Database.swift index 0ee7d28..cce6200 100644 --- a/Sources/FoundationDB/Database.swift +++ b/Sources/FoundationDB/Database.swift @@ -53,7 +53,7 @@ public final class FDBDatabase: DatabaseProtocol { /// /// - Returns: A new transaction instance conforming to `TransactionProtocol`. /// - Throws: `FDBError` if the transaction cannot be created. - public func createTransaction() throws -> any TransactionProtocol { + public func createTransaction() throws -> FDBTransaction { var transaction: OpaquePointer? let error = fdb_database_create_transaction(database, &transaction) if error != 0 { diff --git a/Sources/FoundationDB/Fdb+AsyncKVSequence.swift b/Sources/FoundationDB/Fdb+AsyncKVSequence.swift index ddcb349..e111837 100644 --- a/Sources/FoundationDB/Fdb+AsyncKVSequence.swift +++ b/Sources/FoundationDB/Fdb+AsyncKVSequence.swift @@ -228,7 +228,7 @@ extension FDB { private mutating func startBackgroundPreFetch() { preFetchTask = Task { [transaction, nextBeginSelector, endSelector, batchLimit, snapshot] in - return try await transaction.getRange( + return try await transaction.getRangeNative( beginSelector: nextBeginSelector, endSelector: endSelector, limit: batchLimit, diff --git a/Sources/FoundationDB/FoundationdDB.swift b/Sources/FoundationDB/FoundationdDB.swift index f96fa41..a0018ba 100644 --- a/Sources/FoundationDB/FoundationdDB.swift +++ b/Sources/FoundationDB/FoundationdDB.swift @@ -24,12 +24,14 @@ /// and transaction retry logic. Implementations handle the underlying database /// connection and resource management. /// Database interface for FoundationDB operations -public protocol DatabaseProtocol { +protocol DatabaseProtocol { + associatedtype Transaction: TransactionProtocol + /// Creates a new transaction for database operations. /// /// - Returns: A new transaction instance conforming to `TransactionProtocol`. /// - Throws: `FDBError` if the transaction cannot be created. - func createTransaction() throws -> any TransactionProtocol + func createTransaction() throws -> Transaction /// Executes a transaction with automatic retry logic. /// @@ -50,7 +52,7 @@ public protocol DatabaseProtocol { /// a FoundationDB transaction, including reads, writes, atomic operations, /// and transaction management. /// Transaction interface for FoundationDB operations -public protocol TransactionProtocol: Sendable { +protocol TransactionProtocol: Sendable { /// Retrieves a value for the given key. /// /// - Parameters: @@ -108,19 +110,6 @@ public protocol TransactionProtocol: Sendable { beginSelector: FDB.KeySelector, endSelector: FDB.KeySelector, snapshot: Bool ) -> FDB.AsyncKVSequence - /// Retrieves key-value pairs within a range using selectable endpoints. - /// - /// - Parameters: - /// - begin: The start of the range (converted to key selector). - /// - end: The end of the range (converted to key selector). - /// - limit: Maximum number of key-value pairs to return (0 for no limit). - /// - snapshot: Whether to perform a snapshot read. - /// - Returns: A `ResultRange` containing the key-value pairs and more flag. - /// - Throws: `FDBError` if the operation fails. - func getRange( - begin: FDB.Selectable, end: FDB.Selectable, limit: Int, snapshot: Bool - ) async throws -> ResultRange - /// Retrieves key-value pairs within a range using key selectors. /// /// - Parameters: @@ -130,7 +119,7 @@ public protocol TransactionProtocol: Sendable { /// - snapshot: Whether to perform a snapshot read. /// - Returns: A `ResultRange` containing the key-value pairs and more flag. /// - Throws: `FDBError` if the operation fails. - func getRange( + func getRangeNative( beginSelector: FDB.KeySelector, endSelector: FDB.KeySelector, limit: Int, snapshot: Bool ) async throws -> ResultRange @@ -143,7 +132,7 @@ public protocol TransactionProtocol: Sendable { /// - snapshot: Whether to perform a snapshot read. /// - Returns: A `ResultRange` containing the key-value pairs and more flag. /// - Throws: `FDBError` if the operation fails. - func getRange( + func getRangeNative( beginKey: FDB.Key, endKey: FDB.Key, limit: Int, snapshot: Bool ) async throws -> ResultRange @@ -271,8 +260,8 @@ public protocol TransactionProtocol: Sendable { /// - value: Integer value for the option. /// - option: The transaction option to set. /// - Throws: `FDBError` if the option cannot be set. - func setOption(to value: Int, forOption option: FDB.TransactionOption) throws -} + func setOption(to value: Int, forOption option: FDB.TransactionOption) throws} + /// Default implementation of transaction retry logic for `DatabaseProtocol`. extension DatabaseProtocol { @@ -318,92 +307,76 @@ extension DatabaseProtocol { } extension TransactionProtocol { - public func getValue(for key: FDB.Key, snapshot: Bool = false) async throws -> FDB.Value? { + public func getValue(for key: FDB.Key, snapshot: Bool = false) async throws -> FDB.Value? { try await getValue(for: key, snapshot: snapshot) } - public func getKey(selector: FDB.Selectable, snapshot: Bool = false) async throws -> FDB.Key? { + public func getKey(selector: FDB.Selectable, snapshot: Bool = false) async throws -> FDB.Key? { try await getKey(selector: selector.toKeySelector(), snapshot: snapshot) } - public func getKey(selector: FDB.KeySelector, snapshot: Bool = false) async throws -> FDB.Key? { + public func getKey(selector: FDB.KeySelector, snapshot: Bool = false) async throws -> FDB.Key? { try await getKey(selector: selector, snapshot: snapshot) } - public func readRange( - beginSelector: FDB.KeySelector, endSelector: FDB.KeySelector, snapshot: Bool = false + public func readRange( + beginSelector: FDB.KeySelector, endSelector: FDB.KeySelector, snapshot: Bool = false ) -> FDB.AsyncKVSequence { FDB.AsyncKVSequence( - transaction: self, - beginSelector: beginSelector, - endSelector: endSelector, - snapshot: snapshot + transaction: self, + beginSelector: beginSelector, + endSelector: endSelector, + snapshot: snapshot ) } - public func readRange( - beginSelector: FDB.KeySelector, endSelector: FDB.KeySelector + public func readRange( + beginSelector: FDB.KeySelector, endSelector: FDB.KeySelector ) -> FDB.AsyncKVSequence { readRange( - beginSelector: beginSelector, endSelector: endSelector, snapshot: false + beginSelector: beginSelector, endSelector: endSelector, snapshot: false ) } - public func readRange( - begin: FDB.Selectable, end: FDB.Selectable, snapshot: Bool = false + public func readRange( + begin: FDB.Selectable, end: FDB.Selectable, snapshot: Bool = false ) -> FDB.AsyncKVSequence { let beginSelector = begin.toKeySelector() let endSelector = end.toKeySelector() return readRange( - beginSelector: beginSelector, endSelector: endSelector, snapshot: snapshot + beginSelector: beginSelector, endSelector: endSelector, snapshot: snapshot ) } - public func readRange( - beginKey: FDB.Key, endKey: FDB.Key, snapshot: Bool = false + public func readRange( + beginKey: FDB.Key, endKey: FDB.Key, snapshot: Bool = false ) -> FDB.AsyncKVSequence { let beginSelector = FDB.KeySelector.firstGreaterOrEqual(beginKey) let endSelector = FDB.KeySelector.firstGreaterOrEqual(endKey) return readRange( - beginSelector: beginSelector, endSelector: endSelector, snapshot: snapshot - ) - } - - public func getRange( - begin: FDB.Selectable, end: FDB.Selectable, limit: Int = 0, snapshot: Bool = false - ) async throws -> ResultRange { - let beginSelector = begin.toKeySelector() - let endSelector = end.toKeySelector() - return try await getRange( - beginSelector: beginSelector, endSelector: endSelector, limit: limit, snapshot: snapshot + beginSelector: beginSelector, endSelector: endSelector, snapshot: snapshot ) } - public func getRange( - beginSelector: FDB.KeySelector, endSelector: FDB.KeySelector, limit: Int = 0, - snapshot: Bool = false + func getRangeNative( + beginSelector: FDB.KeySelector, endSelector: FDB.KeySelector, limit: Int = 0, + snapshot: Bool = false ) async throws -> ResultRange { - try await getRange( - beginSelector: beginSelector, endSelector: endSelector, limit: limit, snapshot: snapshot + try await getRangeNative( + beginSelector: beginSelector, endSelector: endSelector, limit: limit, snapshot: snapshot ) } - public func getRange( - beginKey: FDB.Key, endKey: FDB.Key, limit: Int = 0, snapshot: Bool = false - ) async throws -> ResultRange { - try await getRange(beginKey: beginKey, endKey: endKey, limit: limit, snapshot: snapshot) - } - - public func setOption(forOption option: FDB.TransactionOption) throws { + public func setOption(forOption option: FDB.TransactionOption) throws { try setOption(to: nil, forOption: option) } - public func setOption(to value: String, forOption option: FDB.TransactionOption) throws { + public func setOption(to value: String, forOption option: FDB.TransactionOption) throws { let valueBytes = [UInt8](value.utf8) try setOption(to: valueBytes, forOption: option) } - public func setOption(to value: Int, forOption option: FDB.TransactionOption) throws { + public func setOption(to value: Int, forOption option: FDB.TransactionOption) throws { let valueBytes = withUnsafeBytes(of: Int64(value)) { [UInt8]($0) } try setOption(to: valueBytes, forOption: option) } diff --git a/Sources/FoundationDB/Transaction.swift b/Sources/FoundationDB/Transaction.swift index c73effe..96f7840 100644 --- a/Sources/FoundationDB/Transaction.swift +++ b/Sources/FoundationDB/Transaction.swift @@ -230,7 +230,7 @@ public final class FDBTransaction: TransactionProtocol, @unchecked Sendable { } } - public func getRange( + func getRangeNative( beginSelector: FDB.KeySelector, endSelector: FDB.KeySelector, limit: Int = 0, snapshot: Bool ) async throws -> ResultRange { @@ -261,7 +261,7 @@ public final class FDBTransaction: TransactionProtocol, @unchecked Sendable { return try await future.getAsync() ?? ResultRange(records: [], more: false) } - public func getRange( + func getRangeNative( beginKey: FDB.Key, endKey: FDB.Key, limit: Int = 0, snapshot: Bool ) async throws -> ResultRange { let future = beginKey.withUnsafeBytes { beginKeyBytes in diff --git a/Tests/StackTester/Sources/StackTester/StackTester.swift b/Tests/StackTester/Sources/StackTester/StackTester.swift index 535b14d..32bd2a1 100644 --- a/Tests/StackTester/Sources/StackTester/StackTester.swift +++ b/Tests/StackTester/Sources/StackTester/StackTester.swift @@ -19,7 +19,7 @@ */ import Foundation -import FoundationDB +@testable import FoundationDB // Simple stack entry - equivalent to Go's stackEntry struct StackEntry { @@ -32,7 +32,7 @@ class StackMachine { private var stack: [StackEntry] = [] private var database: FDBDatabase private let verbose: Bool - private var transaction: (any TransactionProtocol)? + private var transaction: FDBTransaction? private var transactionMap: [String: any TransactionProtocol] = [:] private var transactionName: String = "MAIN" private var lastVersion: Int64 = 0 @@ -336,7 +336,7 @@ class StackMachine { let beginKey = waitAndPop().item as! [UInt8] let transaction = try currentTransaction() - let result = try await transaction.getRange( + let result = try await transaction.getRangeNative( beginKey: beginKey, endKey: endKey, limit: limit, @@ -357,7 +357,7 @@ class StackMachine { var endKey = prefix endKey.append(0xFF) - let result = try await transaction.getRange( + let result = try await transaction.getRangeNative( beginKey: prefix, endKey: endKey, limit: limit, @@ -384,7 +384,7 @@ class StackMachine { let endSelector = FDB.KeySelector(key: endKey, orEqual: endOrEqual, offset: endOffset) let transaction = try currentTransaction() - let result = try await transaction.getRange( + let result = try await transaction.getRangeNative( beginSelector: beginSelector, endSelector: endSelector, limit: limit, @@ -680,7 +680,7 @@ class StackMachine { let beginKey = prefixTuple.encode() let endKey = beginKey + [0xFF] // Simple range end - let result = try await transaction.getRange( + let result = try await transaction.getRangeNative( beginKey: beginKey, endKey: endKey, limit: 0, From d6a75ed0051b1446dbcffabdc2b86890bb130093 Mon Sep 17 00:00:00 2001 From: Vishesh Yadav Date: Tue, 21 Oct 2025 19:53:45 -0700 Subject: [PATCH 2/6] Rename readRange to getRange() --- README.md | 2 +- Sources/FoundationDB/Fdb+AsyncKVSequence.swift | 2 +- Sources/FoundationDB/FoundationdDB.swift | 16 ++++++++-------- .../FoundationDBTests/FoundationDBTests.swift | 18 +++++++++--------- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 77acbfa..14347f1 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ try await database.withTransaction { transaction in ```swift // Efficient streaming over large result sets -let sequence = transaction.readRange( +let sequence = transaction.getRange( beginSelector: .firstGreaterOrEqual("user:"), endSelector: .firstGreaterOrEqual("user;") ) diff --git a/Sources/FoundationDB/Fdb+AsyncKVSequence.swift b/Sources/FoundationDB/Fdb+AsyncKVSequence.swift index e111837..fad3ed6 100644 --- a/Sources/FoundationDB/Fdb+AsyncKVSequence.swift +++ b/Sources/FoundationDB/Fdb+AsyncKVSequence.swift @@ -33,7 +33,7 @@ extension FDB { /// ## Usage /// /// ```swift - /// let sequence = transaction.readRange( + /// let sequence = transaction.getRange( /// beginSelector: .firstGreaterOrEqual("user:"), /// endSelector: .firstGreaterOrEqual("user;") /// ) diff --git a/Sources/FoundationDB/FoundationdDB.swift b/Sources/FoundationDB/FoundationdDB.swift index a0018ba..629cb3b 100644 --- a/Sources/FoundationDB/FoundationdDB.swift +++ b/Sources/FoundationDB/FoundationdDB.swift @@ -106,7 +106,7 @@ protocol TransactionProtocol: Sendable { /// - endSelector: The key selector for the end of the range. /// - snapshot: Whether to perform a snapshot read. /// - Returns: An async sequence that yields key-value pairs. - func readRange( + func getRange( beginSelector: FDB.KeySelector, endSelector: FDB.KeySelector, snapshot: Bool ) -> FDB.AsyncKVSequence @@ -319,7 +319,7 @@ extension TransactionProtocol { try await getKey(selector: selector, snapshot: snapshot) } - public func readRange( + public func getRange( beginSelector: FDB.KeySelector, endSelector: FDB.KeySelector, snapshot: Bool = false ) -> FDB.AsyncKVSequence { FDB.AsyncKVSequence( @@ -330,30 +330,30 @@ extension TransactionProtocol { ) } - public func readRange( + public func getRange( beginSelector: FDB.KeySelector, endSelector: FDB.KeySelector ) -> FDB.AsyncKVSequence { - readRange( + getRange( beginSelector: beginSelector, endSelector: endSelector, snapshot: false ) } - public func readRange( + public func getRange( begin: FDB.Selectable, end: FDB.Selectable, snapshot: Bool = false ) -> FDB.AsyncKVSequence { let beginSelector = begin.toKeySelector() let endSelector = end.toKeySelector() - return readRange( + return getRange( beginSelector: beginSelector, endSelector: endSelector, snapshot: snapshot ) } - public func readRange( + public func getRange( beginKey: FDB.Key, endKey: FDB.Key, snapshot: Bool = false ) -> FDB.AsyncKVSequence { let beginSelector = FDB.KeySelector.firstGreaterOrEqual(beginKey) let endSelector = FDB.KeySelector.firstGreaterOrEqual(endKey) - return readRange( + return getRange( beginSelector: beginSelector, endSelector: endSelector, snapshot: snapshot ) } diff --git a/Tests/FoundationDBTests/FoundationDBTests.swift b/Tests/FoundationDBTests/FoundationDBTests.swift index 85123cb..d8a6f45 100644 --- a/Tests/FoundationDBTests/FoundationDBTests.swift +++ b/Tests/FoundationDBTests/FoundationDBTests.swift @@ -68,12 +68,12 @@ extension TransactionProtocol { clearRange(beginKey: beginKeyBytes, endKey: endKeyBytes) } - func readRange( + func getRange( beginKey: String, endKey: String, snapshot: Bool = false ) -> FDB.AsyncKVSequence { let beginSelector = FDB.KeySelector.firstGreaterOrEqual(beginKey) let endSelector = FDB.KeySelector.firstGreaterOrEqual(endKey) - return readRange( + return getRange( beginSelector: beginSelector, endSelector: endSelector, snapshot: snapshot ) } @@ -1355,8 +1355,8 @@ func transactionOptionConvenienceMethods() throws { #expect(validationPassed, "Transaction option convenience methods have valid signatures") } -@Test("readRange with KeySelectors - basic functionality") -func readRangeWithKeySelectors() async throws { +@Test("getRange with KeySelectors - basic functionality") +func getRangeWithKeySelectors() async throws { try await FDBClient.maybeInitialize() let database = try FDBClient.openDatabase() let transaction = try database.createTransaction() @@ -1374,12 +1374,12 @@ func readRangeWithKeySelectors() async throws { } _ = try await newTransaction.commit() - // Test readRange method with limited results to trigger pre-fetching + // Test getRange method with limited results to trigger pre-fetching let readTransaction = try database.createTransaction() let beginSelector = FDB.KeySelector.firstGreaterOrEqual("test_read_range_015") let endSelector = FDB.KeySelector.firstGreaterOrEqual("test_read_range_032") - let asyncSequence = readTransaction.readRange( + let asyncSequence = readTransaction.getRange( beginSelector: beginSelector, endSelector: endSelector ) @@ -1405,8 +1405,8 @@ func readRangeWithKeySelectors() async throws { #expect(count == 17, "Should read expected number of records in range") } -@Test("readRange with AsyncIterator - comprehensive pre-fetching test") -func readRangeAsyncIteratorPrefetch() async throws { +@Test("getRange with AsyncIterator - comprehensive pre-fetching test") +func getRangeAsyncIteratorPrefetch() async throws { try await FDBClient.maybeInitialize() let database = try FDBClient.openDatabase() let transaction = try database.createTransaction() @@ -1429,7 +1429,7 @@ func readRangeAsyncIteratorPrefetch() async throws { let beginSelector = FDB.KeySelector.firstGreaterOrEqual("test_async_iter_020") let endSelector = FDB.KeySelector.firstGreaterOrEqual("test_async_iter_080") - let asyncSequence = readTransaction.readRange( + let asyncSequence = readTransaction.getRange( beginSelector: beginSelector, endSelector: endSelector ) From 8ceed48000317cd5733881bc4acb264084c33143 Mon Sep 17 00:00:00 2001 From: Vishesh Yadav Date: Tue, 21 Oct 2025 19:55:48 -0700 Subject: [PATCH 3/6] Update documentation --- Sources/FoundationDB/FoundationdDB.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Sources/FoundationDB/FoundationdDB.swift b/Sources/FoundationDB/FoundationdDB.swift index 629cb3b..89dcbf9 100644 --- a/Sources/FoundationDB/FoundationdDB.swift +++ b/Sources/FoundationDB/FoundationdDB.swift @@ -112,6 +112,9 @@ protocol TransactionProtocol: Sendable { /// Retrieves key-value pairs within a range using key selectors. /// + /// This method directly calls FDB's C `fdb_transaction_get_range()` API. + /// Prefer using `getRange()` instead, which returns an `AsyncSequence` for better ergonomics. + /// /// - Parameters: /// - beginSelector: The key selector for the start of the range. /// - endSelector: The key selector for the end of the range. @@ -125,6 +128,9 @@ protocol TransactionProtocol: Sendable { /// Retrieves key-value pairs within a range using byte array keys. /// + /// This method directly calls FDB's C `fdb_transaction_get_range()` API. + /// Prefer using `getRange()` instead, which returns an `AsyncSequence` for better ergonomics. + /// /// - Parameters: /// - beginKey: The start key of the range as a byte array. /// - endKey: The end key of the range as a byte array. From fcc0e74567be4136cde0699b307fc9172c8879d5 Mon Sep 17 00:00:00 2001 From: Vishesh Yadav Date: Tue, 21 Oct 2025 20:08:51 -0700 Subject: [PATCH 4/6] Fix build errors in tests --- .../FoundationDBTests/FoundationDBTests.swift | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Tests/FoundationDBTests/FoundationDBTests.swift b/Tests/FoundationDBTests/FoundationDBTests.swift index d8a6f45..1332e66 100644 --- a/Tests/FoundationDBTests/FoundationDBTests.swift +++ b/Tests/FoundationDBTests/FoundationDBTests.swift @@ -78,12 +78,12 @@ extension TransactionProtocol { ) } - func getRange( + func getRangeNative( beginKey: String, endKey: String, limit: Int = 0, snapshot: Bool = false ) async throws -> ResultRange { let beginKeyBytes = [UInt8](beginKey.utf8) let endKeyBytes = [UInt8](endKey.utf8) - return try await getRange( + return try await getRangeNative( beginKey: beginKeyBytes, endKey: endKeyBytes, limit: limit, snapshot: snapshot ) } @@ -519,7 +519,7 @@ func getRangeBytes() async throws { let readTransaction = try database.createTransaction() let beginKey: FDB.Key = [UInt8]("test_byte_range_001".utf8) let endKey: FDB.Key = [UInt8]("test_byte_range_003".utf8) - let result = try await readTransaction.getRange(beginKey: beginKey, endKey: endKey) + let result = try await readTransaction.getRangeNative(beginKey: beginKey, endKey: endKey, limit: 0, snapshot: false) #expect(!result.more) try #require( @@ -555,8 +555,8 @@ func getRangeWithLimit() async throws { // Test with limit let readTransaction = try database.createTransaction() - let result = try await readTransaction.getRange( - beginKey: "test_limit_key_001", endKey: "test_limit_key_999", limit: 3 + let result = try await readTransaction.getRangeNative( + beginKey: "test_limit_key_001", endKey: "test_limit_key_999", limit: 3, snapshot: false ) #expect(result.records.count == 3, "Should return exactly 3 key-value pairs due to limit") @@ -589,7 +589,7 @@ func getRangeEmpty() async throws { let newTransaction = try database.createTransaction() // Test empty range - let result = try await newTransaction.getRange( + let result = try await newTransaction.getRangeNative( beginKey: "test_empty_start", endKey: "test_empty_end" ) @@ -598,8 +598,8 @@ func getRangeEmpty() async throws { #expect(result.more == false, "Should indicate no more results") } -@Test("getRange with KeySelectors - firstGreaterOrEqual") -func getRangeWithKeySelectors() async throws { +@Test("getRangeNative with KeySelectors - firstGreaterOrEqual") +func getRangeNativeWithKeySelectors() async throws { try await FDBClient.maybeInitialize() let database = try FDBClient.openDatabase() let transaction = try database.createTransaction() @@ -626,7 +626,7 @@ func getRangeWithKeySelectors() async throws { let readTransaction = try database.createTransaction() let beginSelector = FDB.KeySelector.firstGreaterOrEqual(key1) let endSelector = FDB.KeySelector.firstGreaterOrEqual(key3) - let result = try await readTransaction.getRange( + let result = try await readTransaction.getRangeNative( beginSelector: beginSelector, endSelector: endSelector ) @@ -664,7 +664,7 @@ func getRangeWithStringSelectorKeys() async throws { let readTransaction = try database.createTransaction() let beginSelector = FDB.KeySelector.firstGreaterOrEqual("test_str_selector_001") let endSelector = FDB.KeySelector.firstGreaterOrEqual("test_str_selector_003") - let result = try await readTransaction.getRange( + let result = try await readTransaction.getRangeNative( beginSelector: beginSelector, endSelector: endSelector ) @@ -700,8 +700,8 @@ func getRangeWithSelectable() async throws { // Test using the general Selectable protocol with mixed key types let readTransaction = try database.createTransaction() let beginKey: FDB.Key = [UInt8]("test_mixed_001".utf8) - let endString = "test_mixed_003" - let result = try await readTransaction.getRange(begin: beginKey, end: endString) + let endKey = [UInt8]("test_mixed_003".utf8) + let result = try await readTransaction.getRangeNative(beginKey: beginKey, endKey: endKey, limit: 0, snapshot: false) #expect(!result.more) try #require(result.records.count == 2, "Should return 2 key-value pairs") @@ -735,10 +735,10 @@ func keySelectorMethods() async throws { let beginSelectorGT = FDB.KeySelector.firstGreaterThan("test_offset_002") let endSelector = FDB.KeySelector.firstGreaterOrEqual("test_offset_999") - let resultGTE = try await readTransaction.getRange( + let resultGTE = try await readTransaction.getRangeNative( beginSelector: beginSelectorGTE, endSelector: endSelector ) - let resultGT = try await readTransaction.getRange( + let resultGT = try await readTransaction.getRangeNative( beginSelector: beginSelectorGT, endSelector: endSelector ) From 35203a3d2e5536620e57d335d3211d10fa0087ab Mon Sep 17 00:00:00 2001 From: Vishesh Yadav Date: Tue, 21 Oct 2025 20:09:48 -0700 Subject: [PATCH 5/6] Run swift-format --- Sources/FoundationDB/FoundationdDB.swift | 32 +++++++++---------- .../FoundationDBTests/FoundationDBTests.swift | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Sources/FoundationDB/FoundationdDB.swift b/Sources/FoundationDB/FoundationdDB.swift index 89dcbf9..5c8f77f 100644 --- a/Sources/FoundationDB/FoundationdDB.swift +++ b/Sources/FoundationDB/FoundationdDB.swift @@ -266,8 +266,8 @@ protocol TransactionProtocol: Sendable { /// - value: Integer value for the option. /// - option: The transaction option to set. /// - Throws: `FDBError` if the option cannot be set. - func setOption(to value: Int, forOption option: FDB.TransactionOption) throws} - + func setOption(to value: Int, forOption option: FDB.TransactionOption) throws +} /// Default implementation of transaction retry logic for `DatabaseProtocol`. extension DatabaseProtocol { @@ -326,50 +326,50 @@ extension TransactionProtocol { } public func getRange( - beginSelector: FDB.KeySelector, endSelector: FDB.KeySelector, snapshot: Bool = false + beginSelector: FDB.KeySelector, endSelector: FDB.KeySelector, snapshot: Bool = false ) -> FDB.AsyncKVSequence { FDB.AsyncKVSequence( - transaction: self, - beginSelector: beginSelector, - endSelector: endSelector, - snapshot: snapshot + transaction: self, + beginSelector: beginSelector, + endSelector: endSelector, + snapshot: snapshot ) } public func getRange( - beginSelector: FDB.KeySelector, endSelector: FDB.KeySelector + beginSelector: FDB.KeySelector, endSelector: FDB.KeySelector ) -> FDB.AsyncKVSequence { getRange( - beginSelector: beginSelector, endSelector: endSelector, snapshot: false + beginSelector: beginSelector, endSelector: endSelector, snapshot: false ) } public func getRange( - begin: FDB.Selectable, end: FDB.Selectable, snapshot: Bool = false + begin: FDB.Selectable, end: FDB.Selectable, snapshot: Bool = false ) -> FDB.AsyncKVSequence { let beginSelector = begin.toKeySelector() let endSelector = end.toKeySelector() return getRange( - beginSelector: beginSelector, endSelector: endSelector, snapshot: snapshot + beginSelector: beginSelector, endSelector: endSelector, snapshot: snapshot ) } public func getRange( - beginKey: FDB.Key, endKey: FDB.Key, snapshot: Bool = false + beginKey: FDB.Key, endKey: FDB.Key, snapshot: Bool = false ) -> FDB.AsyncKVSequence { let beginSelector = FDB.KeySelector.firstGreaterOrEqual(beginKey) let endSelector = FDB.KeySelector.firstGreaterOrEqual(endKey) return getRange( - beginSelector: beginSelector, endSelector: endSelector, snapshot: snapshot + beginSelector: beginSelector, endSelector: endSelector, snapshot: snapshot ) } func getRangeNative( - beginSelector: FDB.KeySelector, endSelector: FDB.KeySelector, limit: Int = 0, - snapshot: Bool = false + beginSelector: FDB.KeySelector, endSelector: FDB.KeySelector, limit: Int = 0, + snapshot: Bool = false ) async throws -> ResultRange { try await getRangeNative( - beginSelector: beginSelector, endSelector: endSelector, limit: limit, snapshot: snapshot + beginSelector: beginSelector, endSelector: endSelector, limit: limit, snapshot: snapshot ) } diff --git a/Tests/FoundationDBTests/FoundationDBTests.swift b/Tests/FoundationDBTests/FoundationDBTests.swift index 1332e66..8c71c2e 100644 --- a/Tests/FoundationDBTests/FoundationDBTests.swift +++ b/Tests/FoundationDBTests/FoundationDBTests.swift @@ -556,7 +556,7 @@ func getRangeWithLimit() async throws { // Test with limit let readTransaction = try database.createTransaction() let result = try await readTransaction.getRangeNative( - beginKey: "test_limit_key_001", endKey: "test_limit_key_999", limit: 3, snapshot: false + beginKey: "test_limit_key_001", endKey: "test_limit_key_999", limit: 3, snapshot: false ) #expect(result.records.count == 3, "Should return exactly 3 key-value pairs due to limit") From 0833a11068c161ae95ece28523fb343cf5d0f458 Mon Sep 17 00:00:00 2001 From: Vishesh Yadav Date: Tue, 21 Oct 2025 22:59:55 -0700 Subject: [PATCH 6/6] fix warnings in build --- Package.swift | 2 +- Sources/FoundationDB/Network.swift | 2 +- Sources/FoundationDB/Transaction.swift | 2 +- .../FoundationDBTupleTests.swift | 2 +- .../Sources/StackTester/StackTester.swift | 18 +++++++++--------- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Package.swift b/Package.swift index 8413e43..06117ed 100644 --- a/Package.swift +++ b/Package.swift @@ -24,7 +24,7 @@ import PackageDescription let package = Package( name: "FoundationDB", platforms: [ - .macOS(.v14), + .macOS(.v15), ], products: [ .library(name: "FoundationDB", targets: ["FoundationDB"]), diff --git a/Sources/FoundationDB/Network.swift b/Sources/FoundationDB/Network.swift index b66716e..43509ac 100644 --- a/Sources/FoundationDB/Network.swift +++ b/Sources/FoundationDB/Network.swift @@ -65,7 +65,7 @@ final class FDBNetwork: Sendable { /// Stops the FoundationDB network and waits for the network thread to complete. deinit { - try networkThread.withLock { networkThread in + _ = networkThread.withLock { networkThread in if networkThread == nil { return networkThread } diff --git a/Sources/FoundationDB/Transaction.swift b/Sources/FoundationDB/Transaction.swift index 96f7840..a59b3fe 100644 --- a/Sources/FoundationDB/Transaction.swift +++ b/Sources/FoundationDB/Transaction.swift @@ -158,7 +158,7 @@ public final class FDBTransaction: TransactionProtocol, @unchecked Sendable { } public func onError(_ error: FDBError) async throws { - try await Future( + _ = try await Future( fdb_transaction_on_error(transaction, error.code) ).getAsync() } diff --git a/Tests/FoundationDBTests/FoundationDBTupleTests.swift b/Tests/FoundationDBTests/FoundationDBTupleTests.swift index e4bff01..60b88cd 100644 --- a/Tests/FoundationDBTests/FoundationDBTupleTests.swift +++ b/Tests/FoundationDBTests/FoundationDBTupleTests.swift @@ -31,7 +31,7 @@ func testTupleNil() throws { var offset = 1 let decoded = try TupleNil.decodeTuple(from: encoded, at: &offset) - #expect(decoded is TupleNil, "Should decode back to TupleNil") + #expect(type(of: decoded) == TupleNil.self, "Should decode back to TupleNil") #expect(offset == 1, "Offset should not advance for TupleNil") } diff --git a/Tests/StackTester/Sources/StackTester/StackTester.swift b/Tests/StackTester/Sources/StackTester/StackTester.swift index 32bd2a1..c47f7b4 100644 --- a/Tests/StackTester/Sources/StackTester/StackTester.swift +++ b/Tests/StackTester/Sources/StackTester/StackTester.swift @@ -296,11 +296,11 @@ class StackMachine { case "COMMIT": let transaction = try currentTransaction() - let success = try await transaction.commit() + _ = try await transaction.commit() store(idx, Array("COMMIT_RESULT".utf8)) case "RESET": - if let transaction = transactionMap[transactionName] as? FDBTransaction { + if transactionMap[transactionName] as? FDBTransaction != nil { try newTransaction() } @@ -329,8 +329,8 @@ class StackMachine { case "GET_RANGE": // Python/Go order: begin, end, limit, reverse, mode (but Go pops in reverse) // Go pops: mode, reverse, limit, endKey, beginKey - let mode = waitAndPop().item as! Int64 // Streaming mode, ignore for now - let reverse = (waitAndPop().item as! Int64) != 0 + _ = waitAndPop().item as! Int64 // Streaming mode, ignore for now + _ = (waitAndPop().item as! Int64) != 0 let limit = Int(waitAndPop().item as! Int64) let endKey = waitAndPop().item as! [UInt8] let beginKey = waitAndPop().item as! [UInt8] @@ -348,8 +348,8 @@ class StackMachine { case "GET_RANGE_STARTS_WITH": // Python order: prefix, limit, reverse, mode (pops 4 parameters) // Go order: same but pops in reverse - let mode = waitAndPop().item as! Int64 // Streaming mode, ignore for now - let reverse = (waitAndPop().item as! Int64) != 0 + _ = waitAndPop().item as! Int64 // Streaming mode, ignore for now + _ = (waitAndPop().item as! Int64) != 0 let limit = Int(waitAndPop().item as! Int64) let prefix = waitAndPop().item as! [UInt8] let transaction = try currentTransaction() @@ -370,8 +370,8 @@ class StackMachine { // Python pops 10 parameters: begin_key, begin_or_equal, begin_offset, end_key, end_or_equal, end_offset, limit, reverse, mode, prefix // Go pops in reverse order let prefix = waitAndPop().item as! [UInt8] - let mode = waitAndPop().item as! Int64 // Streaming mode, ignore for now - let reverse = (waitAndPop().item as! Int64) != 0 + _ = waitAndPop().item as! Int64 // Streaming mode, ignore for now + _ = (waitAndPop().item as! Int64) != 0 let limit = Int(waitAndPop().item as! Int64) let endOffset = Int(waitAndPop().item as! Int64) let endOrEqual = (waitAndPop().item as! Int64) != 0 @@ -651,7 +651,7 @@ class StackMachine { case "START_THREAD": // Threading not supported in current implementation, just consume the instruction - let instruction = waitAndPop().item + _ = waitAndPop().item // Could implement this with Task.detached in the future case "WAIT_EMPTY":