// // Copyright 2021 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // MARK: This file is used to evaluate the experience of using the Firebase Database APIs in Swift. import Foundation import FirebaseCore import FirebaseDatabase final class DatabaseAPITests { func usage() { // MARK: - Database var url = "url" let path = "path" let host = "host" let port = 0 let yes = true // Retrieve Database Instance var database = Database.database() database = Database.database(url: url) if let app = FirebaseApp.app() { database = Database.database(app: app, url: url) database = Database.database(app: app) } // Retrieve FirebaseApp let /* app */ _: FirebaseApp? = database.app // Retrieve DatabaseReference var databaseReference: DatabaseReference = database.reference() databaseReference = database.reference(withPath: path) databaseReference = database.reference(fromURL: url) // Instance methods database.purgeOutstandingWrites() database.goOffline() database.goOnline() database.useEmulator(withHost: host, port: port) // Instance members let /* isPersistenceEnabled */ _: Bool = database.isPersistenceEnabled let /* persistenceCacheSizeBytes */ _: UInt = database.persistenceCacheSizeBytes let /* callbackQueue */ _: DispatchQueue = database.callbackQueue // Class methods Database.setLoggingEnabled(yes) let /* sdkVersion */ _: String = Database.sdkVersion() // MARK: - DatabaseQuery let uint: UInt = 0 let dataEventType: DataEventType = .value let child = "child" let childKey: String? = "key" let value: Any? = "value" let priority: Any? = "priority" var databaseHandle: DatabaseHandle = uint var databaseQuery = DatabaseQuery() // Observe for data // observe(_ eventType:with block:) databaseHandle = databaseQuery.observe(dataEventType) { dataSnapshot in let /* dataSnapshot */ _: DataSnapshot = dataSnapshot } // observe(_ eventType:andPreviousSiblingKeyWith block:) databaseHandle = databaseQuery.observe(dataEventType) { dataSnapshot, optionalString in let /* dataSnapshot */ _: DataSnapshot = dataSnapshot let /* optionalString */ _: String? = optionalString } // observe(_ eventType:with block:withCancel cancelBlock:) databaseHandle = databaseQuery.observe(dataEventType) { dataSnapshot in let /* dataSnapshot */ _: DataSnapshot = dataSnapshot } withCancel: { error in let /* error */ _: Error = error } // observe(_ eventType:andPreviousSiblingKeyWith block:withCancel cancelBlock:) databaseHandle = databaseQuery.observe(dataEventType) { dataSnapshot, optionalString in let /* dataSnapshot */ _: DataSnapshot = dataSnapshot let /* optionalString */ _: String? = optionalString } withCancel: { error in let /* error */ _: Error = error } // Get data // getData(completion block:) databaseQuery.getData { optionalError, dataSnapshot in let /* optionalError */ _: Error? = optionalError let /* dataSnapshot */ _: DataSnapshot? = dataSnapshot } if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) { // async/await is a Swift Concurrency feature available on iOS 13+ and macOS 10.15+ Task { do { let /* dataSnapshot */ _: DataSnapshot = try await DatabaseQuery().getData() } catch { // ... } } } // Observe Single Event // observeSingleEvent(of eventType:with block:) databaseQuery.observeSingleEvent(of: dataEventType) { dataSnapshot in let /* dataSnapshot */ _: DataSnapshot = dataSnapshot } // observeSingleEvent(of eventType:andPreviousSiblingKeyWith block:) databaseQuery.observeSingleEvent(of: dataEventType) { dataSnapshot, optionalString in let /* dataSnapshot */ _: DataSnapshot = dataSnapshot let /* optionalString */ _: String? = optionalString } if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) { // async/await is a Swift Concurrency feature available on iOS 13+ and macOS 10.15+ Task { // observeSingleEvent(of eventType:) let _: (DataSnapshot, String?) = await DatabaseQuery() .observeSingleEventAndPreviousSiblingKey(of: dataEventType) } } // observeSingleEvent(of eventType:with block:withCancel cancelBlock:) databaseQuery.observeSingleEvent(of: dataEventType) { dataSnapshot in let /* dataSnapshot */ _: DataSnapshot = dataSnapshot } withCancel: { error in let /* error */ _: Error = error } // observeSingleEvent(of eventType:andPreviousSiblingKeyWith block:withCancel cancelBlock:) databaseQuery.observeSingleEvent(of: dataEventType) { dataSnapshot, optionalString in let /* dataSnapshot */ _: DataSnapshot = dataSnapshot let /* optionalString */ _: String? = optionalString } withCancel: { error in let /* error */ _: Error = error } // Remove Observers databaseQuery.removeObserver(withHandle: databaseHandle) databaseQuery.removeAllObservers() // Keep Synced databaseQuery.keepSynced(yes) // Limited Views of Data databaseQuery = databaseQuery.queryLimited(toFirst: databaseHandle) databaseQuery = databaseQuery.queryLimited(toLast: databaseHandle) databaseQuery = databaseQuery.queryOrdered(byChild: child) databaseQuery = databaseQuery.queryOrderedByKey() databaseQuery = databaseQuery.queryOrderedByValue() databaseQuery = databaseQuery.queryOrderedByPriority() databaseQuery = databaseQuery.queryStarting(atValue: value) databaseQuery = databaseQuery.queryStarting(atValue: value, childKey: childKey) databaseQuery = databaseQuery.queryStarting(afterValue: value) databaseQuery = databaseQuery.queryStarting(afterValue: value, childKey: childKey) databaseQuery = databaseQuery.queryEnding(atValue: value) databaseQuery = databaseQuery.queryEnding(beforeValue: value) databaseQuery = databaseQuery.queryEnding(beforeValue: value, childKey: childKey) databaseQuery = databaseQuery.queryEqual(toValue: value) databaseQuery = databaseQuery.queryEqual(toValue: value, childKey: childKey) // Retrieve DatabaseReference Instance databaseReference = databaseQuery.ref // MARK: - DatabaseReference let priorityAny: Any = "priority" let values = [AnyHashable: Any]() var transactionResult = TransactionResult() // Retrieve Child DatabaseReference databaseReference = databaseReference.child(child) databaseReference = databaseReference.childByAutoId() // Set value databaseReference.setValue(value) // setValue(_ value:withCompletionBlock block:) databaseReference.setValue(value) { optionalError, databaseReference in let /* optionalError */ _: Error? = optionalError let /* databaseReference */ _: DatabaseReference = databaseReference } if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) { // async/await is a Swift Concurrency feature available on iOS 13+ and macOS 10.15+ Task { do { // setValue(_ value:) let /* ref */ _: DatabaseReference = try await DatabaseReference().setValue(value) } catch { // ... } } } databaseReference.setValue(value, andPriority: priority) // setValue(_ value:andPriority priority:withCompletionBlock block:) databaseReference.setValue(value, andPriority: priority) { optionalError, databaseReference in let /* optionalError */ _: Error? = optionalError let /* databaseReference */ _: DatabaseReference = databaseReference } if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) { // async/await is a Swift Concurrency feature available on iOS 13+ and macOS 10.15+ Task { do { // setValue(_ value:andPriority priority:) let /* ref */ _: DatabaseReference = try await DatabaseReference() .setValue(value, andPriority: priority) } catch { // ... } } } // Remove value databaseReference.removeValue() // removeValue(completionBlock block:) databaseReference.removeValue { optionalError, databaseReference in let /* optionalError */ _: Error? = optionalError let /* databaseReference */ _: DatabaseReference = databaseReference } if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) { // async/await is a Swift Concurrency feature available on iOS 13+ and macOS 10.15+ Task { do { let /* ref */ _: DatabaseReference = try await DatabaseReference().removeValue() } catch { // ... } } } // Set priority databaseReference.setPriority(priority) // setPriority(_ priority:withCompletionBlock block:) databaseReference.setPriority(priority) { optionalError, databaseReference in let /* optionalError */ _: Error? = optionalError let /* databaseReference */ _: DatabaseReference = databaseReference } if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) { // async/await is a Swift Concurrency feature available on iOS 13+ and macOS 10.15+ Task { do { // setPriority(_ priority:) let /* ref */ _: DatabaseReference = try await DatabaseReference().setPriority(priority) } catch { // ... } } } // Update child values databaseReference.updateChildValues(values) // updateChildValues(_ values:withCompletionBlock block:) databaseReference.updateChildValues(values) { optionalError, databaseReference in let /* optionalError */ _: Error? = optionalError let /* databaseReference */ _: DatabaseReference = databaseReference } if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) { // async/await is a Swift Concurrency feature available on iOS 13+ and macOS 10.15+ Task { do { // updateChildValues(_ values:) let /* ref */ _: DatabaseReference = try await DatabaseReference() .updateChildValues(values) } catch { // ... } } } // Observe for data // observe(_ eventType:with block:) databaseHandle = databaseReference.observe(dataEventType) { dataSnapshot in let /* dataSnapshot */ _: DataSnapshot = dataSnapshot } // observe(_ eventType:andPreviousSiblingKeyWith block:) databaseHandle = databaseReference.observe(dataEventType) { dataSnapshot, optionalString in let /* dataSnapshot */ _: DataSnapshot = dataSnapshot let /* optionalString */ _: String? = optionalString } // observe(_ eventType:with block:withCancel cancelBlock:) databaseHandle = databaseReference.observe(dataEventType) { dataSnapshot in let /* dataSnapshot */ _: DataSnapshot = dataSnapshot } withCancel: { error in let /* error */ _: Error = error } // observe(_ eventType:andPreviousSiblingKeyWith block:withCancel cancelBlock:) databaseHandle = databaseReference.observe(dataEventType) { dataSnapshot, optionalString in let /* dataSnapshot */ _: DataSnapshot = dataSnapshot let /* optionalString */ _: String? = optionalString } withCancel: { error in let /* error */ _: Error = error } // Observe Single Event // observeSingleEvent(of eventType:with block:) databaseReference.observeSingleEvent(of: dataEventType) { dataSnapshot in let /* dataSnapshot */ _: DataSnapshot = dataSnapshot } // observeSingleEvent(of eventType:andPreviousSiblingKeyWith block:) databaseReference.observeSingleEvent(of: dataEventType) { dataSnapshot, optionalString in let /* dataSnapshot */ _: DataSnapshot = dataSnapshot let /* optionalString */ _: String? = optionalString } if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) { // async/await is a Swift Concurrency feature available on iOS 13+ and macOS 10.15+ Task { // observeSingleEvent(of eventType:) let _: (DataSnapshot, String?) = await DatabaseReference() .observeSingleEventAndPreviousSiblingKey(of: dataEventType) } } // observeSingleEvent(of eventType:with block:withCancel cancelBlock:) databaseReference.observeSingleEvent(of: dataEventType) { dataSnapshot in let /* dataSnapshot */ _: DataSnapshot = dataSnapshot } withCancel: { error in let /* error */ _: Error = error } // observeSingleEvent(of eventType:andPreviousSiblingKeyWith block:withCancel cancelBlock:) databaseReference.observeSingleEvent(of: dataEventType) { dataSnapshot, optionalString in let /* dataSnapshot */ _: DataSnapshot = dataSnapshot let /* optionalString */ _: String? = optionalString } withCancel: { error in let /* error */ _: Error = error } // Get data // getData(completion block:) databaseReference.getData { optionalError, dataSnapshot in let /* optionalError */ _: Error? = optionalError let /* dataSnapshot */ _: DataSnapshot? = dataSnapshot } if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) { // async/await is a Swift Concurrency feature available on iOS 13+ and macOS 10.15+ Task { do { let /* dataSnapshot */ _: DataSnapshot = try await DatabaseReference().getData() } catch { // ... } } } // Remove Observers databaseReference.removeObserver(withHandle: databaseHandle) databaseReference.removeAllObservers() // Keep Synced databaseReference.keepSynced(yes) // Limited Views of Data databaseQuery = databaseReference.queryLimited(toFirst: databaseHandle) databaseQuery = databaseReference.queryLimited(toLast: databaseHandle) databaseQuery = databaseReference.queryOrdered(byChild: child) databaseQuery = databaseReference.queryOrderedByKey() databaseQuery = databaseReference.queryOrderedByPriority() databaseQuery = databaseReference.queryStarting(atValue: value) databaseQuery = databaseReference.queryStarting(atValue: value, childKey: childKey) databaseQuery = databaseReference.queryStarting(afterValue: value) databaseQuery = databaseReference.queryStarting(afterValue: value, childKey: childKey) databaseQuery = databaseReference.queryEnding(atValue: value) databaseQuery = databaseReference.queryEnding(atValue: value, childKey: childKey) databaseQuery = databaseReference.queryEqual(toValue: value) databaseQuery = databaseReference.queryEqual(toValue: value, childKey: childKey) // onDisconnectSetValue databaseReference.onDisconnectSetValue(value) // onDisconnectSetValue(_ value:withCompletionBlock block:) databaseReference.onDisconnectSetValue(value) { optionalError, databaseReference in let /* optionalError */ _: Error? = optionalError let /* databaseReference */ _: DatabaseReference = databaseReference } if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) { // async/await is a Swift Concurrency feature available on iOS 13+ and macOS 10.15+ Task { do { // onDisconnectSetValue(_ value:) let /* ref */ _: DatabaseReference = try await DatabaseReference() .onDisconnectSetValue(value) } catch { // ... } } } databaseReference.onDisconnectSetValue(value, andPriority: priorityAny) // onDisconnectSetValue(_ value:andPriority priority:withCompletionBlock block:) databaseReference .onDisconnectSetValue(value, andPriority: priority) { optionalError, databaseReference in let /* optionalError */ _: Error? = optionalError let /* databaseReference */ _: DatabaseReference = databaseReference } if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) { // async/await is a Swift Concurrency feature available on iOS 13+ and macOS 10.15+ Task { do { // onDisconnectSetValue(_ value:andPriority priority:) let /* ref */ _: DatabaseReference = try await DatabaseReference().onDisconnectSetValue( value, andPriority: priority ) } catch { // ... } } } // onDisconnectRemoveValue databaseReference.onDisconnectRemoveValue() // onDisconnectRemoveValue(completionBlock block:) databaseReference.onDisconnectRemoveValue { optionalError, databaseReference in let /* optionalError */ _: Error? = optionalError let /* databaseReference */ _: DatabaseReference = databaseReference } if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) { // async/await is a Swift Concurrency feature available on iOS 13+ and macOS 10.15+ Task { do { let /* ref */ _: DatabaseReference = try await DatabaseReference() .onDisconnectRemoveValue() } catch { // ... } } } // onDisconnectUpdateChildValues databaseReference.onDisconnectUpdateChildValues(values) // onDisconnectUpdateChildValues(_ values:withCompletionBlock block:) databaseReference.onDisconnectUpdateChildValues(values) { optionalError, databaseReference in let /* optionalError */ _: Error? = optionalError let /* databaseReference */ _: DatabaseReference = databaseReference } if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) { // async/await is a Swift Concurrency feature available on iOS 13+ and macOS 10.15+ Task { do { // onDisconnectUpdateChildValues(_ values:) let /* ref */ _: DatabaseReference = try await DatabaseReference() .onDisconnectUpdateChildValues(values) } catch { // ... } } } // cancelDisconnectOperations databaseReference.cancelDisconnectOperations() // cancelDisconnectOperations(completionBlock block:) databaseReference.cancelDisconnectOperations { optionalError, databaseReference in let /* optionalError */ _: Error? = optionalError let /* databaseReference */ _: DatabaseReference = databaseReference } if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) { // async/await is a Swift Concurrency feature available on iOS 13+ and macOS 10.15+ Task { do { let /* ref */ _: DatabaseReference = try await DatabaseReference() .cancelDisconnectOperations() } catch { // ... } } } // runTransactionBlock // runTransactionBlock(_ block:) databaseReference.runTransactionBlock { mutableData in let /* mutableData */ _: MutableData = mutableData return transactionResult } // runTransactionBlock(_ block:andCompletionBlock completionBlock:) databaseReference.runTransactionBlock { mutableData in let /* mutableData */ _: MutableData = mutableData return transactionResult } andCompletionBlock: { optionalError, bool, optionalDataSnapshot in let /* optionalError */ _: Error? = optionalError let /* bool */ _: Bool = bool let /* optionalDataSnapshot */ _: DataSnapshot? = optionalDataSnapshot } if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) { // async/await is a Swift Concurrency feature available on iOS 13+ and macOS 10.15+ Task { do { // runTransactionBlock(_ block:) let _: (Bool, DataSnapshot) = try await DatabaseReference() .runTransactionBlock { mutableData in let /* mutableData */ _: MutableData = mutableData return TransactionResult() } } catch { // ... } } } // runTransactionBlock(_ block:andCompletionBlock completionBlock:withLocalEvents localEvents:) databaseReference.runTransactionBlock({ mutableData in let /* mutableData */ _: MutableData = mutableData return transactionResult }, andCompletionBlock: { optionalError, bool, optionalDataSnapshot in let /* optionalError */ _: Error? = optionalError let /* bool */ _: Bool = bool let /* optionalDataSnapshot */ _: DataSnapshot? = optionalDataSnapshot }, withLocalEvents: yes) // description let /* description */ _: String = databaseReference.description() // Class methods DatabaseReference.goOffline() DatabaseReference.goOnline() // Instance properties let /* parent */ _: DatabaseReference? = databaseReference.parent let /* childKey */ _: String? = databaseReference.key databaseReference = databaseReference.root url = databaseReference.url database = databaseReference.database // MARK: - DataEventType let optionalDataEventType = DataEventType(rawValue: 0) switch optionalDataEventType { case .childAdded: break case .childRemoved: break case .childChanged: break case .childMoved: break case .value: break case .none, .some: break } // MARK: - DataSnapshot var dataSnapshot = DataSnapshot() // Navigating and inspecting a snapshot dataSnapshot = dataSnapshot.childSnapshot(forPath: path) let /* hasChild */ _: Bool = dataSnapshot.hasChild(child) let /* hasChildren */ _: Bool = dataSnapshot.hasChildren() let /* exists */ _: Bool = dataSnapshot.exists() // Data export let /* value */ _: Any? = dataSnapshot.valueInExportFormat() // Properties databaseReference = dataSnapshot.ref let /* value */ _: Any? = dataSnapshot.value let /* uint */ _: UInt = dataSnapshot.childrenCount let /* child */ _: String? = dataSnapshot.key let /* children */ _: NSEnumerator = dataSnapshot.children let /* priority */ _: Any? = dataSnapshot.priority // MARK: - MutableData var mutableData = MutableData() // Inspecting and navigating the data let /* hasChildren */ _: Bool = mutableData.hasChildren() let /* hasChild */ _: Bool = mutableData.hasChild(atPath: path) mutableData = mutableData.childData(byAppendingPath: path) // Properties let /* value */ _: Any? = mutableData.value let /* priority */ _: Any? = mutableData.priority let /* uint */ _: UInt = mutableData.childrenCount let /* children */ _: NSEnumerator = mutableData.children let /* childKey */ _: String? = mutableData.key // MARK: - ServerValue let nsNumber: NSNumber = 0 let /* values */ _: [AnyHashable: Any] = ServerValue.timestamp() let /* values */ _: [AnyHashable: Any] = ServerValue.increment(nsNumber) // MARK: - TransactionResult transactionResult = TransactionResult.success(withValue: mutableData) transactionResult = TransactionResult.abort() } }