| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/autofill/core/browser/webdata/autofill_table.h" | 5 #include "components/autofill/core/browser/webdata/autofill_table.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 #include <limits> | 9 #include <limits> |
| 10 #include <map> | 10 #include <map> |
| (...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 373 } | 373 } |
| 374 | 374 |
| 375 AutofillTable* AutofillTable::FromWebDatabase(WebDatabase* db) { | 375 AutofillTable* AutofillTable::FromWebDatabase(WebDatabase* db) { |
| 376 return static_cast<AutofillTable*>(db->GetTable(GetKey())); | 376 return static_cast<AutofillTable*>(db->GetTable(GetKey())); |
| 377 } | 377 } |
| 378 | 378 |
| 379 WebDatabaseTable::TypeKey AutofillTable::GetTypeKey() const { | 379 WebDatabaseTable::TypeKey AutofillTable::GetTypeKey() const { |
| 380 return GetKey(); | 380 return GetKey(); |
| 381 } | 381 } |
| 382 | 382 |
| 383 bool AutofillTable::Init(sql::Connection* db, sql::MetaTable* meta_table) { | 383 bool AutofillTable::CreateTablesIfNecessary() { |
| 384 WebDatabaseTable::Init(db, meta_table); | |
| 385 return (InitMainTable() && InitCreditCardsTable() && InitProfilesTable() && | 384 return (InitMainTable() && InitCreditCardsTable() && InitProfilesTable() && |
| 386 InitProfileNamesTable() && InitProfileEmailsTable() && | 385 InitProfileNamesTable() && InitProfileEmailsTable() && |
| 387 InitProfilePhonesTable() && InitProfileTrashTable()); | 386 InitProfilePhonesTable() && InitProfileTrashTable()); |
| 388 } | 387 } |
| 389 | 388 |
| 390 bool AutofillTable::IsSyncable() { | 389 bool AutofillTable::IsSyncable() { |
| 391 return true; | 390 return true; |
| 392 } | 391 } |
| 393 | 392 |
| 394 bool AutofillTable::MigrateToVersion(int version, | 393 bool AutofillTable::MigrateToVersion(int version, |
| (...skipping 928 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1323 if (!db_->Execute("CREATE TABLE autofill_profiles_trash ( " | 1322 if (!db_->Execute("CREATE TABLE autofill_profiles_trash ( " |
| 1324 "guid VARCHAR)")) { | 1323 "guid VARCHAR)")) { |
| 1325 NOTREACHED(); | 1324 NOTREACHED(); |
| 1326 return false; | 1325 return false; |
| 1327 } | 1326 } |
| 1328 } | 1327 } |
| 1329 return true; | 1328 return true; |
| 1330 } | 1329 } |
| 1331 | 1330 |
| 1332 bool AutofillTable::MigrateToVersion22ClearAutofillEmptyValueElements() { | 1331 bool AutofillTable::MigrateToVersion22ClearAutofillEmptyValueElements() { |
| 1332 if (!db_->DoesTableExist("autofill") && |
| 1333 (!db_->Execute("CREATE TABLE autofill (" |
| 1334 " name VARCHAR," |
| 1335 " value VARCHAR," |
| 1336 " value_lower VARCHAR," |
| 1337 " pair_id INTEGER PRIMARY KEY," |
| 1338 " count INTEGER DEFAULT 1)") || |
| 1339 !db_->Execute("CREATE INDEX autofill_name ON autofill (name)") || |
| 1340 !db_->Execute("CREATE INDEX autofill_name_value_lower ON" |
| 1341 " autofill (name, value_lower)") || |
| 1342 !db_->Execute("CREATE TABLE autofill_dates (" |
| 1343 " pair_id INTEGER DEFAULT 0," |
| 1344 " date_created INTEGER DEFAULT 0)") || |
| 1345 !db_->Execute("CREATE INDEX autofill_dates_pair_id ON" |
| 1346 " autofill (pair_id)"))) |
| 1347 return false; |
| 1348 |
| 1349 |
| 1333 sql::Statement s(db_->GetUniqueStatement( | 1350 sql::Statement s(db_->GetUniqueStatement( |
| 1334 "SELECT pair_id FROM autofill WHERE TRIM(value) = \"\"")); | 1351 "SELECT pair_id FROM autofill WHERE TRIM(value) = \"\"")); |
| 1335 if (!s.is_valid()) | 1352 if (!s.is_valid()) |
| 1336 return false; | 1353 return false; |
| 1337 | 1354 |
| 1338 std::set<int64> ids; | 1355 std::set<int64> ids; |
| 1339 while (s.Step()) | 1356 while (s.Step()) |
| 1340 ids.insert(s.ColumnInt64(0)); | 1357 ids.insert(s.ColumnInt64(0)); |
| 1341 if (!s.Succeeded()) | 1358 if (!s.Succeeded()) |
| 1342 return false; | 1359 return false; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1379 // Because this case does not roll back the complete set of SQL | 1396 // Because this case does not roll back the complete set of SQL |
| 1380 // transactions properly in case of failure (that is, it does not | 1397 // transactions properly in case of failure (that is, it does not |
| 1381 // roll back the table initialization done above), the incoherent | 1398 // roll back the table initialization done above), the incoherent |
| 1382 // profile will now see itself as being at version 22 -- but include a | 1399 // profile will now see itself as being at version 22 -- but include a |
| 1383 // fully initialized credit_cards table. Every time Chrome runs, it | 1400 // fully initialized credit_cards table. Every time Chrome runs, it |
| 1384 // will try to update the web database and fail at this step, unless | 1401 // will try to update the web database and fail at this step, unless |
| 1385 // we allow for the faulty assumption described above by checking for | 1402 // we allow for the faulty assumption described above by checking for |
| 1386 // the existence of the columns only AFTER we've executed the commands | 1403 // the existence of the columns only AFTER we've executed the commands |
| 1387 // to add them. | 1404 // to add them. |
| 1388 bool AutofillTable::MigrateToVersion23AddCardNumberEncryptedColumn() { | 1405 bool AutofillTable::MigrateToVersion23AddCardNumberEncryptedColumn() { |
| 1406 if (!db_->DoesTableExist("autofill_profiles") && |
| 1407 (!db_->Execute("CREATE TABLE autofill_profiles ( " |
| 1408 "label VARCHAR, " |
| 1409 "unique_id INTEGER PRIMARY KEY, " |
| 1410 "first_name VARCHAR, " |
| 1411 "middle_name VARCHAR, " |
| 1412 "last_name VARCHAR, " |
| 1413 "email VARCHAR, " |
| 1414 "company_name VARCHAR, " |
| 1415 "address_line_1 VARCHAR, " |
| 1416 "address_line_2 VARCHAR, " |
| 1417 "city VARCHAR, " |
| 1418 "state VARCHAR, " |
| 1419 "zipcode VARCHAR, " |
| 1420 "country VARCHAR, " |
| 1421 "phone VARCHAR, " |
| 1422 "fax VARCHAR)") || |
| 1423 !db_->Execute("CREATE INDEX autofill_profiles_label_index" |
| 1424 " ON autofill_profiles (label)"))) |
| 1425 return false; |
| 1426 |
| 1427 if (!db_->DoesTableExist("credit_cards") && |
| 1428 (!db_->Execute("CREATE TABLE credit_cards ( " |
| 1429 "label VARCHAR, " |
| 1430 "unique_id INTEGER PRIMARY KEY, " |
| 1431 "name_on_card VARCHAR, " |
| 1432 "type VARCHAR, " |
| 1433 "card_number VARCHAR, " |
| 1434 "expiration_month INTEGER, " |
| 1435 "expiration_year INTEGER, " |
| 1436 "verification_code VARCHAR, " |
| 1437 "billing_address VARCHAR, " |
| 1438 "shipping_address VARCHAR)") || |
| 1439 !db_->Execute("CREATE INDEX credit_cards_label_index" |
| 1440 " ON credit_cards (label)"))) |
| 1441 return false; |
| 1442 |
| 1389 if (!db_->DoesColumnExist("credit_cards", "card_number_encrypted")) { | 1443 if (!db_->DoesColumnExist("credit_cards", "card_number_encrypted")) { |
| 1390 if (!db_->Execute("ALTER TABLE credit_cards ADD COLUMN " | 1444 if (!db_->Execute("ALTER TABLE credit_cards ADD COLUMN " |
| 1391 "card_number_encrypted BLOB DEFAULT NULL")) { | 1445 "card_number_encrypted BLOB DEFAULT NULL")) { |
| 1392 LOG(WARNING) << "Could not add card_number_encrypted to " | |
| 1393 "credit_cards table."; | |
| 1394 return false; | 1446 return false; |
| 1395 } | 1447 } |
| 1396 } | 1448 } |
| 1397 | 1449 |
| 1398 if (!db_->DoesColumnExist("credit_cards", "verification_code_encrypted")) { | 1450 if (!db_->DoesColumnExist("credit_cards", "verification_code_encrypted")) { |
| 1399 if (!db_->Execute("ALTER TABLE credit_cards ADD COLUMN " | 1451 if (!db_->Execute("ALTER TABLE credit_cards ADD COLUMN " |
| 1400 "verification_code_encrypted BLOB DEFAULT NULL")) { | 1452 "verification_code_encrypted BLOB DEFAULT NULL")) { |
| 1401 LOG(WARNING) << "Could not add verification_code_encrypted to " | |
| 1402 "credit_cards table."; | |
| 1403 return false; | 1453 return false; |
| 1404 } | 1454 } |
| 1405 } | 1455 } |
| 1406 | 1456 |
| 1407 return true; | 1457 return true; |
| 1408 } | 1458 } |
| 1409 | 1459 |
| 1410 // One-time cleanup for http://crbug.com/38364 - In the presence of | 1460 // One-time cleanup for http://crbug.com/38364 - In the presence of |
| 1411 // multi-byte UTF-8 characters, that bug could cause Autofill strings | 1461 // multi-byte UTF-8 characters, that bug could cause Autofill strings |
| 1412 // to grow larger and more corrupt with each save. The cleanup removes | 1462 // to grow larger and more corrupt with each save. The cleanup removes |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1716 } | 1766 } |
| 1717 | 1767 |
| 1718 return true; | 1768 return true; |
| 1719 } | 1769 } |
| 1720 | 1770 |
| 1721 // Test the existence of the |first_name| column as an indication that | 1771 // Test the existence of the |first_name| column as an indication that |
| 1722 // we need a migration. It is possible that the new |autofill_profiles| | 1772 // we need a migration. It is possible that the new |autofill_profiles| |
| 1723 // schema is in place because the table was newly created when migrating | 1773 // schema is in place because the table was newly created when migrating |
| 1724 // from a pre-version-22 database. | 1774 // from a pre-version-22 database. |
| 1725 bool AutofillTable::MigrateToVersion33ProfilesBasedOnFirstName() { | 1775 bool AutofillTable::MigrateToVersion33ProfilesBasedOnFirstName() { |
| 1776 if (!db_->DoesTableExist("autofill_profile_names") && |
| 1777 !db_->Execute("CREATE TABLE autofill_profile_names ( " |
| 1778 "guid VARCHAR, " |
| 1779 "first_name VARCHAR, " |
| 1780 "middle_name VARCHAR, " |
| 1781 "last_name VARCHAR)")) |
| 1782 return false; |
| 1783 |
| 1784 if (!db_->DoesTableExist("autofill_profile_emails") && |
| 1785 !db_->Execute("CREATE TABLE autofill_profile_emails ( " |
| 1786 "guid VARCHAR, " |
| 1787 "email VARCHAR)")) |
| 1788 return false; |
| 1789 |
| 1790 if (!db_->DoesTableExist("autofill_profile_phones") && |
| 1791 !db_->Execute("CREATE TABLE autofill_profile_phones ( " |
| 1792 "guid VARCHAR, " |
| 1793 "type INTEGER DEFAULT 0, " |
| 1794 "number VARCHAR)")) |
| 1795 return false; |
| 1796 |
| 1726 if (db_->DoesColumnExist("autofill_profiles", "first_name")) { | 1797 if (db_->DoesColumnExist("autofill_profiles", "first_name")) { |
| 1727 // Create autofill_profiles_temp table that will receive the data. | 1798 // Create autofill_profiles_temp table that will receive the data. |
| 1728 if (!db_->DoesTableExist("autofill_profiles_temp")) { | 1799 if (!db_->DoesTableExist("autofill_profiles_temp")) { |
| 1729 if (!db_->Execute("CREATE TABLE autofill_profiles_temp ( " | 1800 if (!db_->Execute("CREATE TABLE autofill_profiles_temp ( " |
| 1730 "guid VARCHAR PRIMARY KEY, " | 1801 "guid VARCHAR PRIMARY KEY, " |
| 1731 "company_name VARCHAR, " | 1802 "company_name VARCHAR, " |
| 1732 "address_line_1 VARCHAR, " | 1803 "address_line_1 VARCHAR, " |
| 1733 "address_line_2 VARCHAR, " | 1804 "address_line_2 VARCHAR, " |
| 1734 "city VARCHAR, " | 1805 "city VARCHAR, " |
| 1735 "state VARCHAR, " | 1806 "state VARCHAR, " |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1873 bool AutofillTable::MigrateToVersion35GreatBritainCountryCodes() { | 1944 bool AutofillTable::MigrateToVersion35GreatBritainCountryCodes() { |
| 1874 sql::Statement s(db_->GetUniqueStatement( | 1945 sql::Statement s(db_->GetUniqueStatement( |
| 1875 "UPDATE autofill_profiles SET country_code=\"GB\" " | 1946 "UPDATE autofill_profiles SET country_code=\"GB\" " |
| 1876 "WHERE country_code=\"UK\"")); | 1947 "WHERE country_code=\"UK\"")); |
| 1877 | 1948 |
| 1878 return s.Run(); | 1949 return s.Run(); |
| 1879 } | 1950 } |
| 1880 | 1951 |
| 1881 // Merge and cull older profiles where possible. | 1952 // Merge and cull older profiles where possible. |
| 1882 bool AutofillTable::MigrateToVersion37MergeAndCullOlderProfiles() { | 1953 bool AutofillTable::MigrateToVersion37MergeAndCullOlderProfiles() { |
| 1954 if (!db_->DoesTableExist("autofill_profiles_trash") && |
| 1955 !db_->Execute("CREATE TABLE autofill_profiles_trash (guid VARCHAR)")) |
| 1956 return false; |
| 1957 |
| 1883 sql::Statement s(db_->GetUniqueStatement( | 1958 sql::Statement s(db_->GetUniqueStatement( |
| 1884 "SELECT guid, date_modified FROM autofill_profiles")); | 1959 "SELECT guid, date_modified FROM autofill_profiles")); |
| 1885 | 1960 |
| 1886 // Accumulate the good profiles. | 1961 // Accumulate the good profiles. |
| 1887 std::vector<AutofillProfile> accumulated_profiles; | 1962 std::vector<AutofillProfile> accumulated_profiles; |
| 1888 std::vector<AutofillProfile*> accumulated_profiles_p; | 1963 std::vector<AutofillProfile*> accumulated_profiles_p; |
| 1889 std::map<std::string, int64> modification_map; | 1964 std::map<std::string, int64> modification_map; |
| 1890 while (s.Step()) { | 1965 while (s.Step()) { |
| 1891 std::string guid = s.ColumnString(0); | 1966 std::string guid = s.ColumnString(0); |
| 1892 int64 date_modified = s.ColumnInt64(1); | 1967 int64 date_modified = s.ColumnInt64(1); |
| (...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2179 !db_->Execute("CREATE INDEX autofill_name_value_lower ON " | 2254 !db_->Execute("CREATE INDEX autofill_name_value_lower ON " |
| 2180 "autofill (name, value_lower)")) { | 2255 "autofill (name, value_lower)")) { |
| 2181 return false; | 2256 return false; |
| 2182 } | 2257 } |
| 2183 | 2258 |
| 2184 | 2259 |
| 2185 return transaction.Commit(); | 2260 return transaction.Commit(); |
| 2186 } | 2261 } |
| 2187 | 2262 |
| 2188 } // namespace autofill | 2263 } // namespace autofill |
| OLD | NEW |