From bd83c5be5da4d16915c3217a0dece15ac51ab060 Mon Sep 17 00:00:00 2001 From: Olivia Hall Date: Thu, 5 Feb 2026 15:13:08 -0500 Subject: [PATCH] Bug 1979760 - Opens count methods on addresses, credit cards, and logins This patch: * Adds count_all_addresses * Adds count_all_credit_cards * Opens count on DatabaseLoginsStorage.kt --- CHANGELOG.md | 6 ++++++ components/autofill/src/autofill.udl | 6 ++++++ components/autofill/src/db/addresses.rs | 12 ++++++++++++ components/autofill/src/db/credit_cards.rs | 12 ++++++++++++ components/autofill/src/db/store.rs | 12 ++++++++++++ .../appservices/logins/DatabaseLoginsStorage.kt | 10 ++++++++++ .../appservices/logins/DatabaseLoginsStorageTest.kt | 8 ++++++++ 7 files changed, 66 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 84e3ebe14c..0ed9727b7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,12 @@ `tracing-logging` feature and were either also using `tracing-reporting` or not handling error reporting at all. +### Logins +* Opened count method on logins for Android. ([#7207](https://github.com/mozilla/application-services/pull/7207/)) + +### Autofill +* Added count methods for credit cards and addresses. ([#7207](https://github.com/mozilla/application-services/pull/7207/)) + ## ✨ What's New ✨ ### Ads Client diff --git a/components/autofill/src/autofill.udl b/components/autofill/src/autofill.udl index 3e55c8d748..59b6b8c288 100644 --- a/components/autofill/src/autofill.udl +++ b/components/autofill/src/autofill.udl @@ -103,6 +103,9 @@ interface Store { [Throws=AutofillApiError] sequence get_all_credit_cards(); + [Throws=AutofillApiError] + i64 count_all_credit_cards(); + [Throws=AutofillApiError] void update_credit_card(string guid, UpdatableCreditCardFields cc); @@ -121,6 +124,9 @@ interface Store { [Throws=AutofillApiError] sequence
get_all_addresses(); + [Throws=AutofillApiError] + i64 count_all_addresses(); + [Throws=AutofillApiError] void update_address(string guid, UpdatableAddressFields a); diff --git a/components/autofill/src/db/addresses.rs b/components/autofill/src/db/addresses.rs index 4029f71401..431c33d2bb 100644 --- a/components/autofill/src/db/addresses.rs +++ b/components/autofill/src/db/addresses.rs @@ -115,6 +115,15 @@ pub(crate) fn get_all_addresses(conn: &Connection) -> Result Result { + let sql = "SELECT COUNT(*) + FROM addresses_data"; + + let mut stmt = conn.prepare(sql)?; + let count: i64 = stmt.query_row([], |row| row.get(0))?; + Ok(count) +} + /// Updates just the "updatable" columns - suitable for exposure as a public /// API. pub(crate) fn update_address( @@ -404,6 +413,9 @@ mod tests { let expected_number_of_addresses = 2; assert_eq!(expected_number_of_addresses, retrieved_addresses.len()); + let address_count = count_all_addresses(&db).expect("Should count all saved addresses"); + assert_eq!(expected_number_of_addresses, address_count as usize); + let retrieved_address_guids = [ retrieved_addresses[0].guid.as_str(), retrieved_addresses[1].guid.as_str(), diff --git a/components/autofill/src/db/credit_cards.rs b/components/autofill/src/db/credit_cards.rs index c54b60625f..2c9dce20c7 100644 --- a/components/autofill/src/db/credit_cards.rs +++ b/components/autofill/src/db/credit_cards.rs @@ -119,6 +119,15 @@ pub(crate) fn get_all_credit_cards(conn: &Connection) -> Result Result { + let sql = "SELECT COUNT(*) + FROM credit_cards_data"; + + let mut stmt = conn.prepare(sql)?; + let count: i64 = stmt.query_row([], |row| row.get(0))?; + Ok(count) +} + pub fn update_credit_card( conn: &Connection, guid: &Guid, @@ -466,6 +475,9 @@ pub(crate) mod tests { retrieved_credit_cards.len() ); + let credit_card_count = count_all_credit_cards(&db)?; + assert_eq!(expected_number_of_credit_cards, credit_card_count as usize); + let retrieved_credit_card_guids = [ retrieved_credit_cards[0].guid.as_str(), retrieved_credit_cards[1].guid.as_str(), diff --git a/components/autofill/src/db/store.rs b/components/autofill/src/db/store.rs index cb28b636e1..d268b59fce 100644 --- a/components/autofill/src/db/store.rs +++ b/components/autofill/src/db/store.rs @@ -94,6 +94,12 @@ impl Store { Ok(credit_cards) } + #[handle_error(Error)] + pub fn count_all_credit_cards(&self) -> ApiResult { + let count = credit_cards::count_all_credit_cards(&self.db.lock().unwrap().writer)?; + Ok(count) + } + #[handle_error(Error)] pub fn update_credit_card( &self, @@ -136,6 +142,12 @@ impl Store { Ok(addresses) } + #[handle_error(Error)] + pub fn count_all_addresses(&self) -> ApiResult { + let count = addresses::count_all_addresses(&self.db.lock().unwrap().writer)?; + Ok(count) + } + #[handle_error(Error)] pub fn update_address(&self, guid: String, address: UpdatableAddressFields) -> ApiResult<()> { addresses::update_address(&self.db.lock().unwrap().writer, &Guid::new(&guid), &address) diff --git a/components/logins/android/src/main/java/mozilla/appservices/logins/DatabaseLoginsStorage.kt b/components/logins/android/src/main/java/mozilla/appservices/logins/DatabaseLoginsStorage.kt index 92467a63f5..c9078a52f2 100644 --- a/components/logins/android/src/main/java/mozilla/appservices/logins/DatabaseLoginsStorage.kt +++ b/components/logins/android/src/main/java/mozilla/appservices/logins/DatabaseLoginsStorage.kt @@ -65,6 +65,16 @@ class DatabaseLoginsStorage(dbPath: String, keyManager: KeyManager) : AutoClosea return store.list() } + /** + * Counts the amount of logins. + * + * @return The number of logins. + */ + @Throws(LoginsApiException::class) + fun count(): Long { + return store.count() + } + @Throws(LoginsApiException::class) fun hasLoginsByBaseDomain(baseDomain: String): Boolean { return store.hasLoginsByBaseDomain(baseDomain) diff --git a/components/logins/android/src/test/java/mozilla/appservices/logins/DatabaseLoginsStorageTest.kt b/components/logins/android/src/test/java/mozilla/appservices/logins/DatabaseLoginsStorageTest.kt index 1fa122b986..d7d8f5b771 100644 --- a/components/logins/android/src/test/java/mozilla/appservices/logins/DatabaseLoginsStorageTest.kt +++ b/components/logins/android/src/test/java/mozilla/appservices/logins/DatabaseLoginsStorageTest.kt @@ -109,6 +109,14 @@ class DatabaseLoginsStorageTest { finishAndClose(store) } + @Test + fun testCount() { + val store = getTestStore() + val count = store.count() + assertEquals(2, count) + finishAndClose(store) + } + @Test fun testWipeLocal() { val test = getTestStore()