Index: components/autofill/core/browser/webdata/autofill_table.cc |
diff --git a/components/autofill/core/browser/webdata/autofill_table.cc b/components/autofill/core/browser/webdata/autofill_table.cc |
index 279015e4a4ec6c42ece290508f454c09b9edd2f7..14fd62e5fc099f059b61d819e7c474acd167f4a4 100644 |
--- a/components/autofill/core/browser/webdata/autofill_table.cc |
+++ b/components/autofill/core/browser/webdata/autofill_table.cc |
@@ -571,6 +571,9 @@ bool AutofillTable::MigrateToVersion(int version, |
case 61: |
*update_compatible_version = false; |
return MigrateToVersion61AddUsageStats(); |
+ case 62: |
+ *update_compatible_version = false; |
+ return MigrateToVersion62AddUsageStatsForUnmaskedCards(); |
} |
return true; |
} |
@@ -1231,11 +1234,13 @@ bool AutofillTable::GetServerCreditCards( |
"card_number_encrypted, " // 0 |
"last_four," // 1 |
"masked.id," // 2 |
- "type," // 3 |
- "status," // 4 |
- "name_on_card," // 5 |
- "exp_month," // 6 |
- "exp_year " // 7 |
+ "use_count," // 3 |
+ "use_date," // 4 |
+ "type," // 5 |
+ "status," // 6 |
+ "name_on_card," // 7 |
+ "exp_month," // 8 |
+ "exp_year " // 9 |
"FROM masked_credit_cards masked " |
"LEFT OUTER JOIN unmasked_credit_cards unmasked " |
"ON masked.id = unmasked.id")); |
@@ -1256,13 +1261,19 @@ bool AutofillTable::GetServerCreditCards( |
CREDIT_CARD_NUMBER, |
record_type == CreditCard::MASKED_SERVER_CARD ? last_four |
: full_card_number); |
+ int64 use_count = s.ColumnInt64(index++); |
+ int64 use_date = s.ColumnInt64(index++); |
std::string card_type = s.ColumnString(index++); |
if (record_type == CreditCard::MASKED_SERVER_CARD) { |
// The type must be set after setting the number to override the |
// autodectected type. |
card->SetTypeForMaskedCard(card_type.c_str()); |
+ DCHECK_EQ(0, use_count); |
+ DCHECK_EQ(0, use_date); |
} else { |
DCHECK_EQ(CreditCard::GetCreditCardType(full_card_number), card_type); |
+ card->set_use_count(use_count); |
+ card->set_use_date(base::Time::FromInternalValue(use_date)); |
} |
card->SetServerStatus(ServerStatusStringToEnum(s.ColumnString(index++))); |
@@ -1356,8 +1367,9 @@ bool AutofillTable::UnmaskServerCreditCard(const std::string& id, |
// Make sure there aren't duplicates for this card. |
MaskServerCreditCard(id); |
sql::Statement s(db_->GetUniqueStatement( |
- "INSERT INTO unmasked_credit_cards(id, card_number_encrypted) " |
- "VALUES (?,?)")); |
+ "INSERT INTO unmasked_credit_cards(id, card_number_encrypted," |
+ " use_count, use_date) " |
+ "VALUES (?,?,?,?)")); |
s.BindString(0, id); |
std::string encrypted_data; |
@@ -1365,6 +1377,10 @@ bool AutofillTable::UnmaskServerCreditCard(const std::string& id, |
s.BindBlob(1, encrypted_data.data(), |
static_cast<int>(encrypted_data.length())); |
+ // Unmasking counts as a usage, so set the stats accordingly. |
+ s.BindInt64(2, 1); |
+ s.BindInt64(3, base::Time::Now().ToInternalValue()); |
+ |
s.Run(); |
return db_->GetLastChangeCount() > 0; |
} |
@@ -1377,6 +1393,21 @@ bool AutofillTable::MaskServerCreditCard(const std::string& id) { |
return db_->GetLastChangeCount() > 0; |
} |
+bool AutofillTable::UpdateUnmaskedCardUsageStats( |
+ const CreditCard& credit_card) { |
+ DCHECK_EQ(CreditCard::FULL_SERVER_CARD, credit_card.record_type()); |
+ |
+ sql::Statement s(db_->GetUniqueStatement( |
+ "UPDATE unmasked_credit_cards " |
+ "SET use_count=?, use_date=? " |
+ "WHERE id=?")); |
+ s.BindInt64(0, credit_card.use_count()); |
+ s.BindInt64(1, credit_card.use_date().ToInternalValue()); |
+ s.BindString(2, credit_card.server_id()); |
+ s.Run(); |
+ return db_->GetLastChangeCount() > 0; |
+} |
+ |
bool AutofillTable::UpdateCreditCard(const CreditCard& credit_card) { |
DCHECK(base::IsValidGUID(credit_card.guid())); |
@@ -1733,7 +1764,9 @@ bool AutofillTable::InitUnmaskedCreditCardsTable() { |
if (!db_->DoesTableExist("unmasked_credit_cards")) { |
if (!db_->Execute("CREATE TABLE unmasked_credit_cards (" |
"id VARCHAR," |
- "card_number_encrypted VARCHAR)")) { |
+ "card_number_encrypted VARCHAR, " |
+ "use_count INTEGER NOT NULL DEFAULT 0, " |
+ "use_date INTEGER NOT NULL DEFAULT 0)")) { |
NOTREACHED(); |
return false; |
} |
@@ -2710,9 +2743,46 @@ bool AutofillTable::MigrateToVersion57AddFullNameField() { |
} |
bool AutofillTable::MigrateToVersion60AddServerCards() { |
- return InitMaskedCreditCardsTable() && |
- InitUnmaskedCreditCardsTable() && |
- InitServerAddressesTable(); |
+ sql::Transaction transaction(db_); |
+ if (!transaction.Begin()) |
+ return false; |
+ |
+ if (!db_->DoesTableExist("masked_credit_cards") && |
+ !db_->Execute("CREATE TABLE masked_credit_cards (" |
+ "id VARCHAR," |
+ "status VARCHAR," |
+ "name_on_card VARCHAR," |
+ "type VARCHAR," |
+ "last_four VARCHAR," |
+ "exp_month INTEGER DEFAULT 0," |
+ "exp_year INTEGER DEFAULT 0)")) { |
+ return false; |
+ } |
+ |
+ if (!db_->DoesTableExist("unmasked_credit_cards") && |
+ !db_->Execute("CREATE TABLE unmasked_credit_cards (" |
+ "id VARCHAR," |
+ "card_number_encrypted VARCHAR)")) { |
+ return false; |
+ } |
+ |
+ if (!db_->DoesTableExist("server_addresses") && |
+ !db_->Execute("CREATE TABLE server_addresses (" |
+ "id VARCHAR," |
+ "company_name VARCHAR," |
+ "street_address VARCHAR," |
+ "address_1 VARCHAR," |
+ "address_2 VARCHAR," |
+ "address_3 VARCHAR," |
+ "address_4 VARCHAR," |
+ "postal_code VARCHAR," |
+ "sorting_code VARCHAR," |
+ "country_code VARCHAR," |
+ "language_code VARCHAR)")) { |
+ return false; |
+ } |
+ |
+ return transaction.Commit(); |
} |
bool AutofillTable::MigrateToVersion61AddUsageStats() { |
@@ -2751,4 +2821,26 @@ bool AutofillTable::MigrateToVersion61AddUsageStats() { |
return transaction.Commit(); |
} |
+bool AutofillTable::MigrateToVersion62AddUsageStatsForUnmaskedCards() { |
+ sql::Transaction transaction(db_); |
+ if (!transaction.Begin()) |
+ return false; |
+ |
+ // Add use_count to unmasked_credit_cards. |
+ if (!db_->DoesColumnExist("unmasked_credit_cards", "use_count") && |
+ !db_->Execute("ALTER TABLE unmasked_credit_cards ADD COLUMN " |
+ "use_count INTEGER NOT NULL DEFAULT 0")) { |
+ return false; |
+ } |
+ |
+ // Add use_date to unmasked_credit_cards. |
+ if (!db_->DoesColumnExist("unmasked_credit_cards", "use_date") && |
+ !db_->Execute("ALTER TABLE unmasked_credit_cards ADD COLUMN " |
+ "use_date INTEGER NOT NULL DEFAULT 0")) { |
+ return false; |
+ } |
+ |
+ return transaction.Commit(); |
+} |
+ |
} // namespace autofill |