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 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
430 | 430 |
431 WebDatabaseTable::TypeKey AutofillTable::GetTypeKey() const { | 431 WebDatabaseTable::TypeKey AutofillTable::GetTypeKey() const { |
432 return GetKey(); | 432 return GetKey(); |
433 } | 433 } |
434 | 434 |
435 bool AutofillTable::CreateTablesIfNecessary() { | 435 bool AutofillTable::CreateTablesIfNecessary() { |
436 return (InitMainTable() && InitCreditCardsTable() && InitProfilesTable() && | 436 return (InitMainTable() && InitCreditCardsTable() && InitProfilesTable() && |
437 InitProfileNamesTable() && InitProfileEmailsTable() && | 437 InitProfileNamesTable() && InitProfileEmailsTable() && |
438 InitProfilePhonesTable() && InitProfileTrashTable() && | 438 InitProfilePhonesTable() && InitProfileTrashTable() && |
439 InitMaskedCreditCardsTable() && InitUnmaskedCreditCardsTable() && | 439 InitMaskedCreditCardsTable() && InitUnmaskedCreditCardsTable() && |
440 InitServerAddressesTable()); | 440 InitServerCardMetadataTable() && InitServerAddressesTable() && |
441 InitServerAddressMetadataTable()); | |
441 } | 442 } |
442 | 443 |
443 bool AutofillTable::IsSyncable() { | 444 bool AutofillTable::IsSyncable() { |
444 return true; | 445 return true; |
445 } | 446 } |
446 | 447 |
447 bool AutofillTable::MigrateToVersion(int version, | 448 bool AutofillTable::MigrateToVersion(int version, |
448 bool* update_compatible_version) { | 449 bool* update_compatible_version) { |
449 // Migrate if necessary. | 450 // Migrate if necessary. |
450 switch (version) { | 451 switch (version) { |
(...skipping 17 matching lines...) Expand all Loading... | |
468 return MigrateToVersion61AddUsageStats(); | 469 return MigrateToVersion61AddUsageStats(); |
469 case 62: | 470 case 62: |
470 *update_compatible_version = false; | 471 *update_compatible_version = false; |
471 return MigrateToVersion62AddUsageStatsForUnmaskedCards(); | 472 return MigrateToVersion62AddUsageStatsForUnmaskedCards(); |
472 case 63: | 473 case 63: |
473 *update_compatible_version = false; | 474 *update_compatible_version = false; |
474 return MigrateToVersion63AddServerRecipientName(); | 475 return MigrateToVersion63AddServerRecipientName(); |
475 case 64: | 476 case 64: |
476 *update_compatible_version = false; | 477 *update_compatible_version = false; |
477 return MigrateToVersion64AddUnmaskDate(); | 478 return MigrateToVersion64AddUnmaskDate(); |
479 case 65: | |
480 *update_compatible_version = false; | |
481 return MigrateToVersion65AddServerMetadataTables(); | |
478 } | 482 } |
479 return true; | 483 return true; |
480 } | 484 } |
481 | 485 |
482 bool AutofillTable::AddFormFieldValues( | 486 bool AutofillTable::AddFormFieldValues( |
483 const std::vector<FormFieldData>& elements, | 487 const std::vector<FormFieldData>& elements, |
484 std::vector<AutofillChange>* changes) { | 488 std::vector<AutofillChange>* changes) { |
485 return AddFormFieldValuesTime(elements, changes, Time::Now()); | 489 return AddFormFieldValuesTime(elements, changes, Time::Now()); |
486 } | 490 } |
487 | 491 |
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
897 | 901 |
898 return s.Succeeded(); | 902 return s.Succeeded(); |
899 } | 903 } |
900 | 904 |
901 bool AutofillTable::GetServerProfiles(std::vector<AutofillProfile*>* profiles) { | 905 bool AutofillTable::GetServerProfiles(std::vector<AutofillProfile*>* profiles) { |
902 profiles->clear(); | 906 profiles->clear(); |
903 | 907 |
904 sql::Statement s(db_->GetUniqueStatement( | 908 sql::Statement s(db_->GetUniqueStatement( |
905 "SELECT " | 909 "SELECT " |
906 "id," | 910 "id," |
911 "use_count," | |
912 "use_date," | |
907 "recipient_name," | 913 "recipient_name," |
908 "company_name," | 914 "company_name," |
909 "street_address," | 915 "street_address," |
910 "address_1," // ADDRESS_HOME_STATE | 916 "address_1," // ADDRESS_HOME_STATE |
911 "address_2," // ADDRESS_HOME_CITY | 917 "address_2," // ADDRESS_HOME_CITY |
912 "address_3," // ADDRESS_HOME_DEPENDENT_LOCALITY | 918 "address_3," // ADDRESS_HOME_DEPENDENT_LOCALITY |
913 "address_4," // Not supported in AutofillProfile yet. | 919 "address_4," // Not supported in AutofillProfile yet. |
914 "postal_code," // ADDRESS_HOME_ZIP | 920 "postal_code," // ADDRESS_HOME_ZIP |
915 "sorting_code," // ADDRESS_HOME_SORTING_CODE | 921 "sorting_code," // ADDRESS_HOME_SORTING_CODE |
916 "country_code," // ADDRESS_HOME_COUNTRY | 922 "country_code," // ADDRESS_HOME_COUNTRY |
917 "phone_number," // PHONE_HOME_WHOLE_NUMBER | 923 "phone_number," // PHONE_HOME_WHOLE_NUMBER |
918 "language_code " | 924 "language_code " |
919 "FROM server_addresses")); | 925 "FROM server_addresses addresses " |
926 "LEFT OUTER JOIN server_address_metadata USING (id)")); | |
920 | 927 |
921 while (s.Step()) { | 928 while (s.Step()) { |
922 int index = 0; | 929 int index = 0; |
923 scoped_ptr<AutofillProfile> profile(new AutofillProfile( | 930 scoped_ptr<AutofillProfile> profile(new AutofillProfile( |
924 AutofillProfile::SERVER_PROFILE, s.ColumnString(index++))); | 931 AutofillProfile::SERVER_PROFILE, s.ColumnString(index++))); |
932 profile->set_use_count(s.ColumnInt64(index++)); | |
933 profile->set_use_date( | |
934 base::Time::FromInternalValue(s.ColumnInt64(index++))); | |
925 | 935 |
926 base::string16 recipient_name = s.ColumnString16(index++); | 936 base::string16 recipient_name = s.ColumnString16(index++); |
927 profile->SetRawInfo(COMPANY_NAME, s.ColumnString16(index++)); | 937 profile->SetRawInfo(COMPANY_NAME, s.ColumnString16(index++)); |
928 profile->SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, s.ColumnString16(index++)); | 938 profile->SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, s.ColumnString16(index++)); |
929 profile->SetRawInfo(ADDRESS_HOME_STATE, s.ColumnString16(index++)); | 939 profile->SetRawInfo(ADDRESS_HOME_STATE, s.ColumnString16(index++)); |
930 profile->SetRawInfo(ADDRESS_HOME_CITY, s.ColumnString16(index++)); | 940 profile->SetRawInfo(ADDRESS_HOME_CITY, s.ColumnString16(index++)); |
931 profile->SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY, | 941 profile->SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY, |
932 s.ColumnString16(index++)); | 942 s.ColumnString16(index++)); |
933 index++; // Skip address_4 which we haven't added to AutofillProfile yet. | 943 index++; // Skip address_4 which we haven't added to AutofillProfile yet. |
934 profile->SetRawInfo(ADDRESS_HOME_ZIP, s.ColumnString16(index++)); | 944 profile->SetRawInfo(ADDRESS_HOME_ZIP, s.ColumnString16(index++)); |
(...skipping 19 matching lines...) Expand all Loading... | |
954 const std::vector<AutofillProfile>& profiles) { | 964 const std::vector<AutofillProfile>& profiles) { |
955 sql::Transaction transaction(db_); | 965 sql::Transaction transaction(db_); |
956 if (!transaction.Begin()) | 966 if (!transaction.Begin()) |
957 return; | 967 return; |
958 | 968 |
959 // Delete all old ones first. | 969 // Delete all old ones first. |
960 sql::Statement delete_old(db_->GetUniqueStatement( | 970 sql::Statement delete_old(db_->GetUniqueStatement( |
961 "DELETE FROM server_addresses")); | 971 "DELETE FROM server_addresses")); |
962 delete_old.Run(); | 972 delete_old.Run(); |
963 | 973 |
974 // Delete metadata for addresses no longer in the list. | |
975 sql::Statement get_metadata(db_->GetUniqueStatement( | |
976 "SELECT id FROM server_address_metadata")); | |
977 while (get_metadata.Step()) { | |
978 std::string server_id = get_metadata.ColumnString(0); | |
979 bool found_address = false; | |
980 for (const AutofillProfile& cur_address : profiles) { | |
981 if (cur_address.server_id() == server_id) { | |
982 found_address = true; | |
983 break; | |
984 } | |
985 } | |
986 if (!found_address) { | |
987 sql::Statement metadata_delete(db_->GetUniqueStatement( | |
brettw
2015/04/07 18:04:06
Are you sure that you can delete a row that you ha
| |
988 "DELETE FROM server_address_metadata WHERE id = ?")); | |
989 metadata_delete.BindString(0, server_id); | |
990 metadata_delete.Run(); | |
991 DCHECK_EQ(1, db_->GetLastChangeCount()); | |
992 } | |
993 } | |
994 | |
964 sql::Statement insert(db_->GetUniqueStatement( | 995 sql::Statement insert(db_->GetUniqueStatement( |
965 "INSERT INTO server_addresses(" | 996 "INSERT INTO server_addresses(" |
966 "id," | 997 "id," |
967 "recipient_name," | 998 "recipient_name," |
968 "company_name," | 999 "company_name," |
969 "street_address," | 1000 "street_address," |
970 "address_1," // ADDRESS_HOME_STATE | 1001 "address_1," // ADDRESS_HOME_STATE |
971 "address_2," // ADDRESS_HOME_CITY | 1002 "address_2," // ADDRESS_HOME_CITY |
972 "address_3," // ADDRESS_HOME_DEPENDENT_LOCALITY | 1003 "address_3," // ADDRESS_HOME_DEPENDENT_LOCALITY |
973 "address_4," // Not supported in AutofillProfile yet. | 1004 "address_4," // Not supported in AutofillProfile yet. |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1148 | 1179 |
1149 bool AutofillTable::GetServerCreditCards( | 1180 bool AutofillTable::GetServerCreditCards( |
1150 std::vector<CreditCard*>* credit_cards) { | 1181 std::vector<CreditCard*>* credit_cards) { |
1151 credit_cards->clear(); | 1182 credit_cards->clear(); |
1152 | 1183 |
1153 sql::Statement s(db_->GetUniqueStatement( | 1184 sql::Statement s(db_->GetUniqueStatement( |
1154 "SELECT " | 1185 "SELECT " |
1155 "card_number_encrypted, " // 0 | 1186 "card_number_encrypted, " // 0 |
1156 "last_four," // 1 | 1187 "last_four," // 1 |
1157 "masked.id," // 2 | 1188 "masked.id," // 2 |
1158 "use_count," // 3 | 1189 "metadata.use_count," // 3 |
1159 "use_date," // 4 | 1190 "metadata.use_date," // 4 |
1160 "type," // 5 | 1191 "type," // 5 |
1161 "status," // 6 | 1192 "status," // 6 |
1162 "name_on_card," // 7 | 1193 "name_on_card," // 7 |
1163 "exp_month," // 8 | 1194 "exp_month," // 8 |
1164 "exp_year " // 9 | 1195 "exp_year " // 9 |
1165 "FROM masked_credit_cards masked " | 1196 "FROM masked_credit_cards masked " |
1166 "LEFT OUTER JOIN unmasked_credit_cards unmasked " | 1197 "LEFT OUTER JOIN unmasked_credit_cards USING (id) " |
1167 "ON masked.id = unmasked.id")); | 1198 "LEFT OUTER JOIN server_card_metadata metadata USING (id)")); |
1168 while (s.Step()) { | 1199 while (s.Step()) { |
1169 int index = 0; | 1200 int index = 0; |
1170 | 1201 |
1171 // If the card_number_encrypted field is nonempty, we can assume this card | 1202 // If the card_number_encrypted field is nonempty, we can assume this card |
1172 // is a full card, otherwise it's masked. | 1203 // is a full card, otherwise it's masked. |
1173 base::string16 full_card_number = UnencryptedCardFromColumn(s, index++); | 1204 base::string16 full_card_number = UnencryptedCardFromColumn(s, index++); |
1174 base::string16 last_four = s.ColumnString16(index++); | 1205 base::string16 last_four = s.ColumnString16(index++); |
1175 CreditCard::RecordType record_type = full_card_number.empty() ? | 1206 CreditCard::RecordType record_type = full_card_number.empty() ? |
1176 CreditCard::MASKED_SERVER_CARD : | 1207 CreditCard::MASKED_SERVER_CARD : |
1177 CreditCard::FULL_SERVER_CARD; | 1208 CreditCard::FULL_SERVER_CARD; |
1178 std::string server_id = s.ColumnString(index++); | 1209 std::string server_id = s.ColumnString(index++); |
1179 | 1210 |
1180 CreditCard* card = new CreditCard(record_type, server_id); | 1211 CreditCard* card = new CreditCard(record_type, server_id); |
1181 card->SetRawInfo( | 1212 card->SetRawInfo( |
1182 CREDIT_CARD_NUMBER, | 1213 CREDIT_CARD_NUMBER, |
1183 record_type == CreditCard::MASKED_SERVER_CARD ? last_four | 1214 record_type == CreditCard::MASKED_SERVER_CARD ? last_four |
1184 : full_card_number); | 1215 : full_card_number); |
1185 int64 use_count = s.ColumnInt64(index++); | 1216 card->set_use_count(s.ColumnInt64(index++)); |
1186 int64 use_date = s.ColumnInt64(index++); | 1217 card->set_use_date(base::Time::FromInternalValue(s.ColumnInt64(index++))); |
1218 | |
1187 std::string card_type = s.ColumnString(index++); | 1219 std::string card_type = s.ColumnString(index++); |
1188 if (record_type == CreditCard::MASKED_SERVER_CARD) { | 1220 if (record_type == CreditCard::MASKED_SERVER_CARD) { |
1189 // The type must be set after setting the number to override the | 1221 // The type must be set after setting the number to override the |
1190 // autodectected type. | 1222 // autodectected type. |
1191 card->SetTypeForMaskedCard(card_type.c_str()); | 1223 card->SetTypeForMaskedCard(card_type.c_str()); |
1192 DCHECK_EQ(0, use_count); | |
1193 DCHECK_EQ(0, use_date); | |
1194 } else { | 1224 } else { |
1195 DCHECK_EQ(CreditCard::GetCreditCardType(full_card_number), card_type); | 1225 DCHECK_EQ(CreditCard::GetCreditCardType(full_card_number), card_type); |
1196 card->set_use_count(use_count); | |
1197 card->set_use_date(base::Time::FromInternalValue(use_date)); | |
1198 } | 1226 } |
1199 | 1227 |
1200 card->SetServerStatus(ServerStatusStringToEnum(s.ColumnString(index++))); | 1228 card->SetServerStatus(ServerStatusStringToEnum(s.ColumnString(index++))); |
1201 card->SetRawInfo(CREDIT_CARD_NAME, s.ColumnString16(index++)); | 1229 card->SetRawInfo(CREDIT_CARD_NAME, s.ColumnString16(index++)); |
1202 card->SetRawInfo(CREDIT_CARD_EXP_MONTH, s.ColumnString16(index++)); | 1230 card->SetRawInfo(CREDIT_CARD_EXP_MONTH, s.ColumnString16(index++)); |
1203 card->SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, s.ColumnString16(index++)); | 1231 card->SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, s.ColumnString16(index++)); |
1204 credit_cards->push_back(card); | 1232 credit_cards->push_back(card); |
1205 } | 1233 } |
1206 | 1234 |
1207 return s.Succeeded(); | 1235 return s.Succeeded(); |
(...skipping 28 matching lines...) Expand all Loading... | |
1236 // is compiled every time because it's much more likely that this is never | 1264 // is compiled every time because it's much more likely that this is never |
1237 // executed than it runs more than once. | 1265 // executed than it runs more than once. |
1238 sql::Statement unmasked_delete(db_->GetUniqueStatement( | 1266 sql::Statement unmasked_delete(db_->GetUniqueStatement( |
1239 "DELETE FROM unmasked_credit_cards WHERE id = ?")); | 1267 "DELETE FROM unmasked_credit_cards WHERE id = ?")); |
1240 unmasked_delete.BindString(0, server_id); | 1268 unmasked_delete.BindString(0, server_id); |
1241 unmasked_delete.Run(); | 1269 unmasked_delete.Run(); |
1242 DCHECK_EQ(1, db_->GetLastChangeCount()); | 1270 DCHECK_EQ(1, db_->GetLastChangeCount()); |
1243 } | 1271 } |
1244 } | 1272 } |
1245 | 1273 |
1274 // Do the same for the metadata table. | |
1275 sql::Statement get_metadata(db_->GetUniqueStatement( | |
1276 "SELECT id FROM server_card_metadata")); | |
1277 while (get_metadata.Step()) { | |
1278 // We expect relatively few cards, just do brute-force. | |
1279 std::string server_id = get_metadata.ColumnString(0); | |
1280 bool found_card = false; | |
1281 for (const CreditCard& cur_card : credit_cards) { | |
1282 if (cur_card.server_id() == server_id) { | |
1283 found_card = true; | |
1284 break; | |
1285 } | |
1286 } | |
1287 if (!found_card) { | |
1288 sql::Statement metadata_delete(db_->GetUniqueStatement( | |
brettw
2015/04/07 18:04:06
Ditto about deleting.
Evan Stade
2015/04/07 19:23:32
This code is essentially a copy-paste of the above
| |
1289 "DELETE FROM server_card_metadata WHERE id = ?")); | |
1290 metadata_delete.BindString(0, server_id); | |
1291 metadata_delete.Run(); | |
1292 DCHECK_EQ(1, db_->GetLastChangeCount()); | |
1293 } | |
1294 } | |
1295 | |
1246 sql::Statement masked_insert(db_->GetUniqueStatement( | 1296 sql::Statement masked_insert(db_->GetUniqueStatement( |
1247 "INSERT INTO masked_credit_cards(" | 1297 "INSERT INTO masked_credit_cards(" |
1248 "id," // 0 | 1298 "id," // 0 |
1249 "type," // 1 | 1299 "type," // 1 |
1250 "status," // 2 | 1300 "status," // 2 |
1251 "name_on_card," // 3 | 1301 "name_on_card," // 3 |
1252 "last_four," // 4 | 1302 "last_four," // 4 |
1253 "exp_month," // 4 | 1303 "exp_month," // 4 |
1254 "exp_year) " // 5 | 1304 "exp_year) " // 5 |
1255 "VALUES (?,?,?,?,?,?,?)")); | 1305 "VALUES (?,?,?,?,?,?,?)")); |
(...skipping 10 matching lines...) Expand all Loading... | |
1266 masked_insert.BindString16(6, | 1316 masked_insert.BindString16(6, |
1267 card.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR)); | 1317 card.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR)); |
1268 | 1318 |
1269 masked_insert.Run(); | 1319 masked_insert.Run(); |
1270 masked_insert.Reset(true); | 1320 masked_insert.Reset(true); |
1271 } | 1321 } |
1272 | 1322 |
1273 transaction.Commit(); | 1323 transaction.Commit(); |
1274 } | 1324 } |
1275 | 1325 |
1276 bool AutofillTable::UnmaskServerCreditCard(const std::string& id, | 1326 bool AutofillTable::UnmaskServerCreditCard(const CreditCard& masked, |
1277 const base::string16& full_number) { | 1327 const base::string16& full_number) { |
1278 // Make sure there aren't duplicates for this card. | 1328 // Make sure there aren't duplicates for this card. |
1279 MaskServerCreditCard(id); | 1329 MaskServerCreditCard(masked.server_id()); |
1280 sql::Statement s(db_->GetUniqueStatement( | 1330 sql::Statement s(db_->GetUniqueStatement( |
1281 "INSERT INTO unmasked_credit_cards(" | 1331 "INSERT INTO unmasked_credit_cards(" |
1282 "id," | 1332 "id," |
1283 "card_number_encrypted," | 1333 "card_number_encrypted," |
1284 "use_count," | |
1285 "use_date," | |
1286 "unmask_date)" | 1334 "unmask_date)" |
1287 "VALUES (?,?,?,?,?)")); | 1335 "VALUES (?,?,?)")); |
1288 s.BindString(0, id); | 1336 s.BindString(0, masked.server_id()); |
1289 | 1337 |
1290 std::string encrypted_data; | 1338 std::string encrypted_data; |
1291 OSCrypt::EncryptString16(full_number, &encrypted_data); | 1339 OSCrypt::EncryptString16(full_number, &encrypted_data); |
1292 s.BindBlob(1, encrypted_data.data(), | 1340 s.BindBlob(1, encrypted_data.data(), |
1293 static_cast<int>(encrypted_data.length())); | 1341 static_cast<int>(encrypted_data.length())); |
1294 | 1342 s.BindInt64(2, base::Time::Now().ToInternalValue()); // unmask_date |
1295 // Unmasking counts as a usage, so set the stats accordingly. | |
1296 base::Time now = base::Time::Now(); | |
1297 s.BindInt64(2, 1); // use_count | |
1298 s.BindInt64(3, now.ToInternalValue()); // use_date | |
1299 | |
1300 s.BindInt64(4, now.ToInternalValue()); // unmask_date | |
1301 | 1343 |
1302 s.Run(); | 1344 s.Run(); |
1345 | |
1346 CreditCard unmasked = masked; | |
1347 unmasked.set_record_type(CreditCard::FULL_SERVER_CARD); | |
1348 unmasked.SetNumber(full_number); | |
1349 unmasked.RecordUse(); | |
1350 UpdateServerCardUsageStats(unmasked); | |
1351 | |
1303 return db_->GetLastChangeCount() > 0; | 1352 return db_->GetLastChangeCount() > 0; |
1304 } | 1353 } |
1305 | 1354 |
1306 bool AutofillTable::MaskServerCreditCard(const std::string& id) { | 1355 bool AutofillTable::MaskServerCreditCard(const std::string& id) { |
1307 sql::Statement s(db_->GetUniqueStatement( | 1356 sql::Statement s(db_->GetUniqueStatement( |
1308 "DELETE FROM unmasked_credit_cards WHERE id = ?")); | 1357 "DELETE FROM unmasked_credit_cards WHERE id = ?")); |
1309 s.BindString(0, id); | 1358 s.BindString(0, id); |
1310 s.Run(); | 1359 s.Run(); |
1311 return db_->GetLastChangeCount() > 0; | 1360 return db_->GetLastChangeCount() > 0; |
1312 } | 1361 } |
1313 | 1362 |
1314 bool AutofillTable::UpdateUnmaskedCardUsageStats( | 1363 bool AutofillTable::UpdateServerCardUsageStats( |
1315 const CreditCard& credit_card) { | 1364 const CreditCard& credit_card) { |
1316 DCHECK_EQ(CreditCard::FULL_SERVER_CARD, credit_card.record_type()); | 1365 DCHECK_NE(CreditCard::LOCAL_CARD, credit_card.record_type()); |
1366 sql::Transaction transaction(db_); | |
1367 if (!transaction.Begin()) | |
1368 return false; | |
1369 | |
1370 sql::Statement remove(db_->GetUniqueStatement( | |
1371 "DELETE FROM server_card_metadata WHERE id = ?")); | |
1372 remove.BindString(0, credit_card.server_id()); | |
1373 remove.Run(); | |
1317 | 1374 |
1318 sql::Statement s(db_->GetUniqueStatement( | 1375 sql::Statement s(db_->GetUniqueStatement( |
1319 "UPDATE unmasked_credit_cards " | 1376 "INSERT INTO server_card_metadata(" |
brettw
2015/04/07 18:04:06
I think you can join this line and the next.
Evan Stade
2015/04/07 19:23:32
Done.
| |
1320 "SET use_count=?, use_date=? " | 1377 "use_count, use_date, id)" |
1321 "WHERE id=?")); | 1378 "VALUES (?,?,?)")); |
1322 s.BindInt64(0, credit_card.use_count()); | 1379 s.BindInt64(0, credit_card.use_count()); |
1323 s.BindInt64(1, credit_card.use_date().ToInternalValue()); | 1380 s.BindInt64(1, credit_card.use_date().ToInternalValue()); |
1324 s.BindString(2, credit_card.server_id()); | 1381 s.BindString(2, credit_card.server_id()); |
1325 s.Run(); | 1382 s.Run(); |
1383 | |
1384 transaction.Commit(); | |
1385 | |
1326 return db_->GetLastChangeCount() > 0; | 1386 return db_->GetLastChangeCount() > 0; |
1327 } | 1387 } |
1328 | 1388 |
1389 bool AutofillTable::UpdateServerAddressUsageStats( | |
1390 const AutofillProfile& profile) { | |
1391 DCHECK_EQ(AutofillProfile::SERVER_PROFILE, profile.record_type()); | |
1392 | |
1393 sql::Transaction transaction(db_); | |
1394 if (!transaction.Begin()) | |
1395 return false; | |
1396 | |
1397 sql::Statement remove(db_->GetUniqueStatement( | |
1398 "DELETE FROM server_address_metadata WHERE id = ?")); | |
1399 remove.BindString(0, profile.server_id()); | |
1400 remove.Run(); | |
1401 | |
1402 sql::Statement s(db_->GetUniqueStatement( | |
1403 "INSERT INTO server_address_metadata(" | |
brettw
2015/04/07 18:04:06
Can this and the next be joined?
Evan Stade
2015/04/07 19:23:32
Done.
| |
1404 "use_count, use_date, id)" | |
1405 "VALUES (?,?,?)")); | |
1406 s.BindInt64(0, profile.use_count()); | |
1407 s.BindInt64(1, profile.use_date().ToInternalValue()); | |
1408 s.BindString(2, profile.server_id()); | |
1409 s.Run(); | |
1410 | |
1411 transaction.Commit(); | |
1412 | |
1413 return db_->GetLastChangeCount() > 0; | |
1414 } | |
1415 | |
1329 bool AutofillTable::ClearAllServerData() { | 1416 bool AutofillTable::ClearAllServerData() { |
1330 sql::Transaction transaction(db_); | 1417 sql::Transaction transaction(db_); |
1331 if (!transaction.Begin()) | 1418 if (!transaction.Begin()) |
1332 return false; // Some error, nothing was changed. | 1419 return false; // Some error, nothing was changed. |
1333 | 1420 |
1334 sql::Statement masked(db_->GetUniqueStatement( | 1421 sql::Statement masked(db_->GetUniqueStatement( |
1335 "DELETE FROM masked_credit_cards")); | 1422 "DELETE FROM masked_credit_cards")); |
1336 masked.Run(); | 1423 masked.Run(); |
1337 bool changed = db_->GetLastChangeCount() > 0; | 1424 bool changed = db_->GetLastChangeCount() > 0; |
1338 | 1425 |
1339 sql::Statement unmasked(db_->GetUniqueStatement( | 1426 sql::Statement unmasked(db_->GetUniqueStatement( |
1340 "DELETE FROM unmasked_credit_cards")); | 1427 "DELETE FROM unmasked_credit_cards")); |
1341 unmasked.Run(); | 1428 unmasked.Run(); |
1342 changed |= db_->GetLastChangeCount() > 0; | 1429 changed |= db_->GetLastChangeCount() > 0; |
1343 | 1430 |
1344 sql::Statement addresses(db_->GetUniqueStatement( | 1431 sql::Statement addresses(db_->GetUniqueStatement( |
1345 "DELETE FROM server_addresses")); | 1432 "DELETE FROM server_addresses")); |
1346 addresses.Run(); | 1433 addresses.Run(); |
1347 changed |= db_->GetLastChangeCount() > 0; | 1434 changed |= db_->GetLastChangeCount() > 0; |
1348 | 1435 |
1436 sql::Statement card_metadata(db_->GetUniqueStatement( | |
1437 "DELETE FROM server_card_metadata")); | |
1438 card_metadata.Run(); | |
1439 changed |= db_->GetLastChangeCount() > 0; | |
1440 | |
1441 sql::Statement address_metadata(db_->GetUniqueStatement( | |
1442 "DELETE FROM server_address_metadata")); | |
1443 address_metadata.Run(); | |
1444 changed |= db_->GetLastChangeCount() > 0; | |
1445 | |
1349 transaction.Commit(); | 1446 transaction.Commit(); |
1350 return changed; | 1447 return changed; |
1351 } | 1448 } |
1352 | 1449 |
1353 bool AutofillTable::UpdateCreditCard(const CreditCard& credit_card) { | 1450 bool AutofillTable::UpdateCreditCard(const CreditCard& credit_card) { |
1354 DCHECK(base::IsValidGUID(credit_card.guid())); | 1451 DCHECK(base::IsValidGUID(credit_card.guid())); |
1355 | 1452 |
1356 CreditCard* tmp_credit_card = NULL; | 1453 CreditCard* tmp_credit_card = NULL; |
1357 if (!GetCreditCard(credit_card.guid(), &tmp_credit_card)) | 1454 if (!GetCreditCard(credit_card.guid(), &tmp_credit_card)) |
1358 return false; | 1455 return false; |
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1708 } | 1805 } |
1709 } | 1806 } |
1710 return true; | 1807 return true; |
1711 } | 1808 } |
1712 | 1809 |
1713 bool AutofillTable::InitUnmaskedCreditCardsTable() { | 1810 bool AutofillTable::InitUnmaskedCreditCardsTable() { |
1714 if (!db_->DoesTableExist("unmasked_credit_cards")) { | 1811 if (!db_->DoesTableExist("unmasked_credit_cards")) { |
1715 if (!db_->Execute("CREATE TABLE unmasked_credit_cards (" | 1812 if (!db_->Execute("CREATE TABLE unmasked_credit_cards (" |
1716 "id VARCHAR," | 1813 "id VARCHAR," |
1717 "card_number_encrypted VARCHAR, " | 1814 "card_number_encrypted VARCHAR, " |
1718 "use_count INTEGER NOT NULL DEFAULT 0, " | |
1719 "use_date INTEGER NOT NULL DEFAULT 0, " | |
1720 "unmask_date INTEGER NOT NULL DEFAULT 0)")) { | 1815 "unmask_date INTEGER NOT NULL DEFAULT 0)")) { |
1721 NOTREACHED(); | 1816 NOTREACHED(); |
1722 return false; | 1817 return false; |
1723 } | 1818 } |
1724 } | 1819 } |
1725 return true; | 1820 return true; |
1726 } | 1821 } |
1727 | 1822 |
1823 bool AutofillTable::InitServerCardMetadataTable() { | |
1824 if (!db_->DoesTableExist("server_card_metadata")) { | |
1825 if (!db_->Execute("CREATE TABLE server_card_metadata (" | |
1826 "id VARCHAR NOT NULL," | |
1827 "use_count INTEGER NOT NULL DEFAULT 0, " | |
1828 "use_date INTEGER NOT NULL DEFAULT 0)")) { | |
1829 NOTREACHED(); | |
1830 return false; | |
1831 } | |
1832 } | |
1833 return true; | |
1834 } | |
1835 | |
1728 bool AutofillTable::InitServerAddressesTable() { | 1836 bool AutofillTable::InitServerAddressesTable() { |
1729 if (!db_->DoesTableExist("server_addresses")) { | 1837 if (!db_->DoesTableExist("server_addresses")) { |
1730 // The space after language_code is necessary to match what sqlite does | 1838 // The space after language_code is necessary to match what sqlite does |
1731 // when it appends the column in migration. | 1839 // when it appends the column in migration. |
1732 if (!db_->Execute("CREATE TABLE server_addresses (" | 1840 if (!db_->Execute("CREATE TABLE server_addresses (" |
1733 "id VARCHAR," | 1841 "id VARCHAR," |
1734 "company_name VARCHAR," | 1842 "company_name VARCHAR," |
1735 "street_address VARCHAR," | 1843 "street_address VARCHAR," |
1736 "address_1 VARCHAR," | 1844 "address_1 VARCHAR," |
1737 "address_2 VARCHAR," | 1845 "address_2 VARCHAR," |
1738 "address_3 VARCHAR," | 1846 "address_3 VARCHAR," |
1739 "address_4 VARCHAR," | 1847 "address_4 VARCHAR," |
1740 "postal_code VARCHAR," | 1848 "postal_code VARCHAR," |
1741 "sorting_code VARCHAR," | 1849 "sorting_code VARCHAR," |
1742 "country_code VARCHAR," | 1850 "country_code VARCHAR," |
1743 "language_code VARCHAR, " // Space required. | 1851 "language_code VARCHAR, " // Space required. |
1744 "recipient_name VARCHAR, " // Ditto. | 1852 "recipient_name VARCHAR, " // Ditto. |
1745 "phone_number VARCHAR)")) { | 1853 "phone_number VARCHAR)")) { |
1746 NOTREACHED(); | 1854 NOTREACHED(); |
1747 return false; | 1855 return false; |
1748 } | 1856 } |
1749 } | 1857 } |
1750 return true; | 1858 return true; |
1751 } | 1859 } |
1752 | 1860 |
1861 bool AutofillTable::InitServerAddressMetadataTable() { | |
1862 if (!db_->DoesTableExist("server_address_metadata")) { | |
1863 if (!db_->Execute("CREATE TABLE server_address_metadata (" | |
1864 "id VARCHAR NOT NULL," | |
1865 "use_count INTEGER NOT NULL DEFAULT 0, " | |
1866 "use_date INTEGER NOT NULL DEFAULT 0)")) { | |
1867 NOTREACHED(); | |
1868 return false; | |
1869 } | |
1870 } | |
1871 return true; | |
1872 } | |
1873 | |
1753 bool AutofillTable::MigrateToVersion54AddI18nFieldsAndRemoveDeprecatedFields() { | 1874 bool AutofillTable::MigrateToVersion54AddI18nFieldsAndRemoveDeprecatedFields() { |
1754 sql::Transaction transaction(db_); | 1875 sql::Transaction transaction(db_); |
1755 if (!transaction.Begin()) | 1876 if (!transaction.Begin()) |
1756 return false; | 1877 return false; |
1757 | 1878 |
1758 // Test the existence of the |address_line_1| column as an indication that a | 1879 // Test the existence of the |address_line_1| column as an indication that a |
1759 // migration is needed. It is possible that the new |autofill_profile_phones| | 1880 // migration is needed. It is possible that the new |autofill_profile_phones| |
1760 // schema is in place because the table was newly created when migrating from | 1881 // schema is in place because the table was newly created when migrating from |
1761 // a pre-version-23 database. | 1882 // a pre-version-23 database. |
1762 if (db_->DoesColumnExist("autofill_profiles", "address_line_1")) { | 1883 if (db_->DoesColumnExist("autofill_profiles", "address_line_1")) { |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2047 } | 2168 } |
2048 if (!db_->DoesColumnExist("server_addresses", "phone_number") && | 2169 if (!db_->DoesColumnExist("server_addresses", "phone_number") && |
2049 !db_->Execute("ALTER TABLE server_addresses ADD COLUMN " | 2170 !db_->Execute("ALTER TABLE server_addresses ADD COLUMN " |
2050 "phone_number VARCHAR")) { | 2171 "phone_number VARCHAR")) { |
2051 return false; | 2172 return false; |
2052 } | 2173 } |
2053 | 2174 |
2054 return transaction.Commit(); | 2175 return transaction.Commit(); |
2055 } | 2176 } |
2056 | 2177 |
2178 bool AutofillTable::MigrateToVersion65AddServerMetadataTables() { | |
2179 sql::Transaction transaction(db_); | |
2180 if (!transaction.Begin()) | |
2181 return false; | |
2182 | |
2183 if (!db_->DoesTableExist("server_card_metadata") && | |
2184 !db_->Execute("CREATE TABLE server_card_metadata (" | |
2185 "id VARCHAR NOT NULL," | |
2186 "use_count INTEGER NOT NULL DEFAULT 0, " | |
2187 "use_date INTEGER NOT NULL DEFAULT 0)")) { | |
2188 return false; | |
2189 } | |
2190 | |
2191 // This clobbers existing usage metadata, which is not synced and only | |
2192 // applies to unmasked cards. Trying to migrate the usage metadata would be | |
2193 // tricky as multiple devices for the same user get DB upgrades. | |
2194 if (!db_->Execute("UPDATE unmasked_credit_cards " | |
2195 "SET use_count=0, use_date=0")) { | |
2196 return false; | |
2197 } | |
2198 | |
2199 if (!db_->DoesTableExist("server_address_metadata") && | |
2200 !db_->Execute("CREATE TABLE server_address_metadata (" | |
2201 "id VARCHAR NOT NULL," | |
2202 "use_count INTEGER NOT NULL DEFAULT 0, " | |
2203 "use_date INTEGER NOT NULL DEFAULT 0)")) { | |
2204 return false; | |
2205 } | |
2206 | |
2207 // Get existing server addresses and generate IDs for them. | |
2208 sql::Statement s(db_->GetUniqueStatement( | |
2209 "SELECT " | |
2210 "id," | |
2211 "recipient_name," | |
2212 "company_name," | |
2213 "street_address," | |
2214 "address_1," // ADDRESS_HOME_STATE | |
2215 "address_2," // ADDRESS_HOME_CITY | |
2216 "address_3," // ADDRESS_HOME_DEPENDENT_LOCALITY | |
2217 "address_4," // Not supported in AutofillProfile yet. | |
2218 "postal_code," // ADDRESS_HOME_ZIP | |
2219 "sorting_code," // ADDRESS_HOME_SORTING_CODE | |
2220 "country_code," // ADDRESS_HOME_COUNTRY | |
2221 "phone_number," // PHONE_HOME_WHOLE_NUMBER | |
2222 "language_code " | |
2223 "FROM server_addresses addresses")); | |
2224 std::vector<AutofillProfile> profiles; | |
2225 while (s.Step()) { | |
2226 int index = 0; | |
2227 AutofillProfile profile( | |
2228 AutofillProfile::SERVER_PROFILE, s.ColumnString(index++)); | |
2229 | |
2230 base::string16 recipient_name = s.ColumnString16(index++); | |
2231 profile.SetRawInfo(COMPANY_NAME, s.ColumnString16(index++)); | |
brettw
2015/04/07 18:04:06
It seems bad to duplicate this.
Can we call GetSe
Evan Stade
2015/04/07 19:23:32
I explicitly wanted to avoid that. We generally do
brettw
2015/04/07 21:02:31
Oh I see. I think we should have a comment to this
Evan Stade
2015/04/07 21:26:24
I added a comment in the header.
| |
2232 profile.SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, s.ColumnString16(index++)); | |
2233 profile.SetRawInfo(ADDRESS_HOME_STATE, s.ColumnString16(index++)); | |
2234 profile.SetRawInfo(ADDRESS_HOME_CITY, s.ColumnString16(index++)); | |
2235 profile.SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY, | |
2236 s.ColumnString16(index++)); | |
2237 index++; // Skip address_4 which we haven't added to AutofillProfile yet. | |
2238 profile.SetRawInfo(ADDRESS_HOME_ZIP, s.ColumnString16(index++)); | |
2239 profile.SetRawInfo(ADDRESS_HOME_SORTING_CODE, s.ColumnString16(index++)); | |
2240 profile.SetRawInfo(ADDRESS_HOME_COUNTRY, s.ColumnString16(index++)); | |
2241 base::string16 phone_number = s.ColumnString16(index++); | |
2242 profile.set_language_code(s.ColumnString(index++)); | |
2243 profile.SetInfo(AutofillType(NAME_FULL), recipient_name, | |
2244 profile.language_code()); | |
2245 profile.SetInfo(AutofillType(PHONE_HOME_WHOLE_NUMBER), phone_number, | |
2246 profile.language_code()); | |
2247 profile.GenerateServerProfileIdentifier(); | |
2248 profiles.push_back(profile); | |
2249 } | |
2250 | |
2251 // Reinsert with the generated IDs. | |
2252 sql::Statement delete_old(db_->GetUniqueStatement( | |
2253 "DELETE FROM server_addresses")); | |
2254 delete_old.Run(); | |
2255 | |
2256 sql::Statement insert(db_->GetUniqueStatement( | |
2257 "INSERT INTO server_addresses(" | |
2258 "id," | |
2259 "recipient_name," | |
2260 "company_name," | |
2261 "street_address," | |
2262 "address_1," // ADDRESS_HOME_STATE | |
2263 "address_2," // ADDRESS_HOME_CITY | |
2264 "address_3," // ADDRESS_HOME_DEPENDENT_LOCALITY | |
2265 "address_4," // Not supported in AutofillProfile yet. | |
2266 "postal_code," // ADDRESS_HOME_ZIP | |
2267 "sorting_code," // ADDRESS_HOME_SORTING_CODE | |
2268 "country_code," // ADDRESS_HOME_COUNTRY | |
2269 "phone_number," // PHONE_HOME_WHOLE_NUMBER | |
2270 "language_code) " | |
2271 "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)")); | |
2272 for (const AutofillProfile& profile : profiles) { | |
2273 int index = 0; | |
2274 insert.BindString(index++, profile.server_id()); | |
2275 insert.BindString16(index++, profile.GetRawInfo(NAME_FULL)); | |
2276 insert.BindString16(index++, profile.GetRawInfo(COMPANY_NAME)); | |
2277 insert.BindString16(index++, | |
2278 profile.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS)); | |
2279 insert.BindString16(index++, profile.GetRawInfo(ADDRESS_HOME_STATE)); | |
2280 insert.BindString16(index++, profile.GetRawInfo(ADDRESS_HOME_CITY)); | |
2281 insert.BindString16(index++, | |
2282 profile.GetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY)); | |
2283 index++; // SKip address_4 which we haven't added to AutofillProfile yet. | |
2284 insert.BindString16(index++, profile.GetRawInfo(ADDRESS_HOME_ZIP)); | |
2285 insert.BindString16(index++, profile.GetRawInfo(ADDRESS_HOME_SORTING_CODE)); | |
2286 insert.BindString16(index++, profile.GetRawInfo(ADDRESS_HOME_COUNTRY)); | |
2287 insert.BindString16(index++, profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER)); | |
2288 insert.BindString(index++, profile.language_code()); | |
2289 insert.Run(); | |
2290 insert.Reset(true); | |
2291 } | |
2292 | |
2293 return transaction.Commit(); | |
2294 } | |
2295 | |
2057 } // namespace autofill | 2296 } // namespace autofill |
OLD | NEW |