OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "chrome/browser/webdata/autofill_table.h" | 5 #include "chrome/browser/webdata/autofill_table.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <map> | 9 #include <map> |
10 #include <set> | 10 #include <set> |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
397 return true; | 397 return true; |
398 } | 398 } |
399 | 399 |
400 bool AutofillTable::AddFormFieldValues(const std::vector<FormField>& elements, | 400 bool AutofillTable::AddFormFieldValues(const std::vector<FormField>& elements, |
401 std::vector<AutofillChange>* changes) { | 401 std::vector<AutofillChange>* changes) { |
402 return AddFormFieldValuesTime(elements, changes, Time::Now()); | 402 return AddFormFieldValuesTime(elements, changes, Time::Now()); |
403 } | 403 } |
404 | 404 |
405 bool AutofillTable::AddFormFieldValue(const FormField& element, | 405 bool AutofillTable::AddFormFieldValue(const FormField& element, |
406 std::vector<AutofillChange>* changes) { | 406 std::vector<AutofillChange>* changes) { |
407 return AddFormFieldValueTime(element, changes, base::Time::Now()); | 407 return AddFormFieldValueTime(element, changes, Time::Now()); |
408 } | 408 } |
409 | 409 |
410 bool AutofillTable::GetFormValuesForElementName(const string16& name, | 410 bool AutofillTable::GetFormValuesForElementName(const string16& name, |
411 const string16& prefix, | 411 const string16& prefix, |
412 std::vector<string16>* values, | 412 std::vector<string16>* values, |
413 int limit) { | 413 int limit) { |
414 DCHECK(values); | 414 DCHECK(values); |
415 sql::Statement s; | 415 sql::Statement s; |
416 | 416 |
417 if (prefix.empty()) { | 417 if (prefix.empty()) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
450 s.BindInt(3, limit); | 450 s.BindInt(3, limit); |
451 } | 451 } |
452 | 452 |
453 values->clear(); | 453 values->clear(); |
454 while (s.Step()) | 454 while (s.Step()) |
455 values->push_back(s.ColumnString16(0)); | 455 values->push_back(s.ColumnString16(0)); |
456 return s.Succeeded(); | 456 return s.Succeeded(); |
457 } | 457 } |
458 | 458 |
459 bool AutofillTable::RemoveFormElementsAddedBetween( | 459 bool AutofillTable::RemoveFormElementsAddedBetween( |
460 base::Time delete_begin, | 460 const Time& delete_begin, |
461 base::Time delete_end, | 461 const Time& delete_end, |
462 std::vector<AutofillChange>* changes) { | 462 std::vector<AutofillChange>* changes) { |
463 DCHECK(changes); | 463 DCHECK(changes); |
464 // Query for the pair_id, name, and value of all form elements that | 464 // Query for the pair_id, name, and value of all form elements that |
465 // were used between the given times. | 465 // were used between the given times. |
466 sql::Statement s(db_->GetUniqueStatement( | 466 sql::Statement s(db_->GetUniqueStatement( |
467 "SELECT DISTINCT a.pair_id, a.name, a.value " | 467 "SELECT DISTINCT a.pair_id, a.name, a.value " |
468 "FROM autofill_dates ad JOIN autofill a ON ad.pair_id = a.pair_id " | 468 "FROM autofill_dates ad JOIN autofill a ON ad.pair_id = a.pair_id " |
469 "WHERE ad.date_created >= ? AND ad.date_created < ?")); | 469 "WHERE ad.date_created >= ? AND ad.date_created < ?")); |
470 if (!s) { | 470 if (!s) { |
471 NOTREACHED() << "Statement 1 prepare failed"; | 471 NOTREACHED() << "Statement 1 prepare failed"; |
(...skipping 30 matching lines...) Expand all Loading... |
502 AutofillChange::Type change_type = | 502 AutofillChange::Type change_type = |
503 was_removed ? AutofillChange::REMOVE : AutofillChange::UPDATE; | 503 was_removed ? AutofillChange::REMOVE : AutofillChange::UPDATE; |
504 changes->push_back(AutofillChange(change_type, | 504 changes->push_back(AutofillChange(change_type, |
505 AutofillKey(itr->b, itr->c))); | 505 AutofillKey(itr->b, itr->c))); |
506 } | 506 } |
507 | 507 |
508 return true; | 508 return true; |
509 } | 509 } |
510 | 510 |
511 bool AutofillTable::RemoveFormElementForTimeRange(int64 pair_id, | 511 bool AutofillTable::RemoveFormElementForTimeRange(int64 pair_id, |
512 const Time delete_begin, | 512 const Time& delete_begin, |
513 const Time delete_end, | 513 const Time& delete_end, |
514 int* how_many) { | 514 int* how_many) { |
515 sql::Statement s(db_->GetUniqueStatement( | 515 sql::Statement s(db_->GetUniqueStatement( |
516 "DELETE FROM autofill_dates WHERE pair_id = ? AND " | 516 "DELETE FROM autofill_dates WHERE pair_id = ? AND " |
517 "date_created >= ? AND date_created < ?")); | 517 "date_created >= ? AND date_created < ?")); |
518 if (!s) { | 518 if (!s) { |
519 NOTREACHED() << "Statement 1 prepare failed"; | 519 NOTREACHED() << "Statement 1 prepare failed"; |
520 return false; | 520 return false; |
521 } | 521 } |
522 s.BindInt64(0, pair_id); | 522 s.BindInt64(0, pair_id); |
523 s.BindInt64(1, delete_begin.is_null() ? 0 : delete_begin.ToTimeT()); | 523 s.BindInt64(1, delete_begin.is_null() ? 0 : delete_begin.ToTimeT()); |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
629 if (!s.Run()) { | 629 if (!s.Run()) { |
630 NOTREACHED(); | 630 NOTREACHED(); |
631 return false; | 631 return false; |
632 } | 632 } |
633 | 633 |
634 *pair_id = db_->GetLastInsertRowId(); | 634 *pair_id = db_->GetLastInsertRowId(); |
635 return true; | 635 return true; |
636 } | 636 } |
637 | 637 |
638 bool AutofillTable::InsertPairIDAndDate(int64 pair_id, | 638 bool AutofillTable::InsertPairIDAndDate(int64 pair_id, |
639 base::Time date_created) { | 639 const Time& date_created) { |
640 sql::Statement s(db_->GetUniqueStatement( | 640 sql::Statement s(db_->GetUniqueStatement( |
641 "INSERT INTO autofill_dates " | 641 "INSERT INTO autofill_dates " |
642 "(pair_id, date_created) VALUES (?, ?)")); | 642 "(pair_id, date_created) VALUES (?, ?)")); |
643 if (!s) { | 643 if (!s) { |
644 NOTREACHED() << "Statement prepare failed"; | 644 NOTREACHED() << "Statement prepare failed"; |
645 return false; | 645 return false; |
646 } | 646 } |
647 | 647 |
648 s.BindInt64(0, pair_id); | 648 s.BindInt64(0, pair_id); |
649 s.BindInt64(1, date_created.ToTimeT()); | 649 s.BindInt64(1, date_created.ToTimeT()); |
650 | 650 |
651 if (!s.Run()) { | 651 if (!s.Run()) { |
652 NOTREACHED(); | 652 NOTREACHED(); |
653 return false; | 653 return false; |
654 } | 654 } |
655 | 655 |
656 return true; | 656 return true; |
657 } | 657 } |
658 | 658 |
659 bool AutofillTable::AddFormFieldValuesTime( | 659 bool AutofillTable::AddFormFieldValuesTime( |
660 const std::vector<FormField>& elements, | 660 const std::vector<FormField>& elements, |
661 std::vector<AutofillChange>* changes, | 661 std::vector<AutofillChange>* changes, |
662 base::Time time) { | 662 Time time) { |
663 // Only add one new entry for each unique element name. Use |seen_names| to | 663 // Only add one new entry for each unique element name. Use |seen_names| to |
664 // track this. Add up to |kMaximumUniqueNames| unique entries per form. | 664 // track this. Add up to |kMaximumUniqueNames| unique entries per form. |
665 const size_t kMaximumUniqueNames = 256; | 665 const size_t kMaximumUniqueNames = 256; |
666 std::set<string16> seen_names; | 666 std::set<string16> seen_names; |
667 bool result = true; | 667 bool result = true; |
668 for (std::vector<FormField>::const_iterator | 668 for (std::vector<FormField>::const_iterator |
669 itr = elements.begin(); | 669 itr = elements.begin(); |
670 itr != elements.end(); | 670 itr != elements.end(); |
671 itr++) { | 671 itr++) { |
672 if (seen_names.size() >= kMaximumUniqueNames) | 672 if (seen_names.size() >= kMaximumUniqueNames) |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
707 "SELECT name, value, date_created FROM autofill a JOIN " | 707 "SELECT name, value, date_created FROM autofill a JOIN " |
708 "autofill_dates ad ON a.pair_id=ad.pair_id")); | 708 "autofill_dates ad ON a.pair_id=ad.pair_id")); |
709 | 709 |
710 if (!s) { | 710 if (!s) { |
711 NOTREACHED() << "Statement prepare failed"; | 711 NOTREACHED() << "Statement prepare failed"; |
712 return false; | 712 return false; |
713 } | 713 } |
714 | 714 |
715 bool first_entry = true; | 715 bool first_entry = true; |
716 AutofillKey* current_key_ptr = NULL; | 716 AutofillKey* current_key_ptr = NULL; |
717 std::vector<base::Time>* timestamps_ptr = NULL; | 717 std::vector<Time>* timestamps_ptr = NULL; |
718 string16 name, value; | 718 string16 name, value; |
719 base::Time time; | 719 Time time; |
720 while (s.Step()) { | 720 while (s.Step()) { |
721 name = s.ColumnString16(0); | 721 name = s.ColumnString16(0); |
722 value = s.ColumnString16(1); | 722 value = s.ColumnString16(1); |
723 time = Time::FromTimeT(s.ColumnInt64(2)); | 723 time = Time::FromTimeT(s.ColumnInt64(2)); |
724 | 724 |
725 if (first_entry) { | 725 if (first_entry) { |
726 current_key_ptr = new AutofillKey(name, value); | 726 current_key_ptr = new AutofillKey(name, value); |
727 | 727 |
728 timestamps_ptr = new std::vector<base::Time>; | 728 timestamps_ptr = new std::vector<Time>; |
729 timestamps_ptr->push_back(time); | 729 timestamps_ptr->push_back(time); |
730 | 730 |
731 first_entry = false; | 731 first_entry = false; |
732 } else { | 732 } else { |
733 // we've encountered the next entry | 733 // we've encountered the next entry |
734 if (current_key_ptr->name().compare(name) != 0 || | 734 if (current_key_ptr->name().compare(name) != 0 || |
735 current_key_ptr->value().compare(value) != 0) { | 735 current_key_ptr->value().compare(value) != 0) { |
736 AutofillEntry entry(*current_key_ptr, *timestamps_ptr); | 736 AutofillEntry entry(*current_key_ptr, *timestamps_ptr); |
737 entries->push_back(entry); | 737 entries->push_back(entry); |
738 | 738 |
739 delete current_key_ptr; | 739 delete current_key_ptr; |
740 delete timestamps_ptr; | 740 delete timestamps_ptr; |
741 | 741 |
742 current_key_ptr = new AutofillKey(name, value); | 742 current_key_ptr = new AutofillKey(name, value); |
743 timestamps_ptr = new std::vector<base::Time>; | 743 timestamps_ptr = new std::vector<Time>; |
744 } | 744 } |
745 timestamps_ptr->push_back(time); | 745 timestamps_ptr->push_back(time); |
746 } | 746 } |
747 } | 747 } |
748 // If there is at least one result returned, first_entry will be false. | 748 // If there is at least one result returned, first_entry will be false. |
749 // For this case we need to do a final cleanup step. | 749 // For this case we need to do a final cleanup step. |
750 if (!first_entry) { | 750 if (!first_entry) { |
751 AutofillEntry entry(*current_key_ptr, *timestamps_ptr); | 751 AutofillEntry entry(*current_key_ptr, *timestamps_ptr); |
752 entries->push_back(entry); | 752 entries->push_back(entry); |
753 delete current_key_ptr; | 753 delete current_key_ptr; |
754 delete timestamps_ptr; | 754 delete timestamps_ptr; |
755 } | 755 } |
756 | 756 |
757 return s.Succeeded(); | 757 return s.Succeeded(); |
758 } | 758 } |
759 | 759 |
760 bool AutofillTable::GetAutofillTimestamps(const string16& name, | 760 bool AutofillTable::GetAutofillTimestamps(const string16& name, |
761 const string16& value, | 761 const string16& value, |
762 std::vector<base::Time>* timestamps) { | 762 std::vector<Time>* timestamps) { |
763 DCHECK(timestamps); | 763 DCHECK(timestamps); |
764 sql::Statement s(db_->GetUniqueStatement( | 764 sql::Statement s(db_->GetUniqueStatement( |
765 "SELECT date_created FROM autofill a JOIN " | 765 "SELECT date_created FROM autofill a JOIN " |
766 "autofill_dates ad ON a.pair_id=ad.pair_id " | 766 "autofill_dates ad ON a.pair_id=ad.pair_id " |
767 "WHERE a.name = ? AND a.value = ?")); | 767 "WHERE a.name = ? AND a.value = ?")); |
768 | 768 |
769 if (!s) { | 769 if (!s) { |
770 NOTREACHED() << "Statement prepare failed"; | 770 NOTREACHED() << "Statement prepare failed"; |
771 return false; | 771 return false; |
772 } | 772 } |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
835 for (size_t i = 0; i < entry.timestamps().size(); i++) { | 835 for (size_t i = 0; i < entry.timestamps().size(); i++) { |
836 if (!InsertPairIDAndDate(pair_id, entry.timestamps()[i])) | 836 if (!InsertPairIDAndDate(pair_id, entry.timestamps()[i])) |
837 return false; | 837 return false; |
838 } | 838 } |
839 | 839 |
840 return true; | 840 return true; |
841 } | 841 } |
842 | 842 |
843 bool AutofillTable::AddFormFieldValueTime(const FormField& element, | 843 bool AutofillTable::AddFormFieldValueTime(const FormField& element, |
844 std::vector<AutofillChange>* changes, | 844 std::vector<AutofillChange>* changes, |
845 base::Time time) { | 845 Time time) { |
846 int count = 0; | 846 int count = 0; |
847 int64 pair_id; | 847 int64 pair_id; |
848 | 848 |
849 if (!GetIDAndCountOfFormElement(element, &pair_id, &count)) | 849 if (!GetIDAndCountOfFormElement(element, &pair_id, &count)) |
850 return false; | 850 return false; |
851 | 851 |
852 if (count == 0 && !InsertFormElement(element, &pair_id)) | 852 if (count == 0 && !InsertFormElement(element, &pair_id)) |
853 return false; | 853 return false; |
854 | 854 |
855 if (!SetCountOfFormElement(pair_id, count + 1)) | 855 if (!SetCountOfFormElement(pair_id, count + 1)) |
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1236 if (!s) { | 1236 if (!s) { |
1237 NOTREACHED() << "Statement prepare failed"; | 1237 NOTREACHED() << "Statement prepare failed"; |
1238 return false; | 1238 return false; |
1239 } | 1239 } |
1240 | 1240 |
1241 s.BindString(0, guid); | 1241 s.BindString(0, guid); |
1242 return s.Run(); | 1242 return s.Run(); |
1243 } | 1243 } |
1244 | 1244 |
1245 bool AutofillTable::RemoveAutofillProfilesAndCreditCardsModifiedBetween( | 1245 bool AutofillTable::RemoveAutofillProfilesAndCreditCardsModifiedBetween( |
1246 base::Time delete_begin, | 1246 const Time& delete_begin, |
1247 base::Time delete_end, | 1247 const Time& delete_end, |
1248 std::vector<std::string>* profile_guids, | 1248 std::vector<std::string>* profile_guids, |
1249 std::vector<std::string>* credit_card_guids) { | 1249 std::vector<std::string>* credit_card_guids) { |
1250 DCHECK(delete_end.is_null() || delete_begin < delete_end); | 1250 DCHECK(delete_end.is_null() || delete_begin < delete_end); |
1251 | 1251 |
1252 time_t delete_begin_t = delete_begin.ToTimeT(); | 1252 time_t delete_begin_t = delete_begin.ToTimeT(); |
1253 time_t delete_end_t = delete_end.is_null() ? | 1253 time_t delete_end_t = delete_end.is_null() ? |
1254 std::numeric_limits<time_t>::max() : | 1254 std::numeric_limits<time_t>::max() : |
1255 delete_end.ToTimeT(); | 1255 delete_end.ToTimeT(); |
1256 | 1256 |
1257 // Remember Autofill profiles in the time range. | 1257 // Remember Autofill profiles in the time range. |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1360 | 1360 |
1361 | 1361 |
1362 bool AutofillTable::RemoveFormElementForID(int64 pair_id) { | 1362 bool AutofillTable::RemoveFormElementForID(int64 pair_id) { |
1363 sql::Statement s(db_->GetUniqueStatement( | 1363 sql::Statement s(db_->GetUniqueStatement( |
1364 "DELETE FROM autofill WHERE pair_id = ?")); | 1364 "DELETE FROM autofill WHERE pair_id = ?")); |
1365 if (!s) { | 1365 if (!s) { |
1366 NOTREACHED() << "Statement prepare failed"; | 1366 NOTREACHED() << "Statement prepare failed"; |
1367 return false; | 1367 return false; |
1368 } | 1368 } |
1369 s.BindInt64(0, pair_id); | 1369 s.BindInt64(0, pair_id); |
1370 if (s.Run()) { | 1370 if (s.Run()) |
1371 return RemoveFormElementForTimeRange(pair_id, base::Time(), base::Time(), | 1371 return RemoveFormElementForTimeRange(pair_id, Time(), Time(), NULL); |
1372 NULL); | 1372 |
1373 } | |
1374 return false; | 1373 return false; |
1375 } | 1374 } |
1376 | 1375 |
1377 bool AutofillTable::AddAutofillGUIDToTrash(const std::string& guid) { | 1376 bool AutofillTable::AddAutofillGUIDToTrash(const std::string& guid) { |
1378 sql::Statement s(db_->GetUniqueStatement( | 1377 sql::Statement s(db_->GetUniqueStatement( |
1379 "INSERT INTO autofill_profiles_trash" | 1378 "INSERT INTO autofill_profiles_trash" |
1380 " (guid) " | 1379 " (guid) " |
1381 "VALUES (?)")); | 1380 "VALUES (?)")); |
1382 if (!s) { | 1381 if (!s) { |
1383 NOTREACHED(); | 1382 NOTREACHED(); |
(...skipping 769 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2153 "UPDATE autofill_profiles SET date_modified=? " | 2152 "UPDATE autofill_profiles SET date_modified=? " |
2154 "WHERE guid=?")); | 2153 "WHERE guid=?")); |
2155 s_date.BindInt64(0, date_item->second); | 2154 s_date.BindInt64(0, date_item->second); |
2156 s_date.BindString(1, iter->guid()); | 2155 s_date.BindString(1, iter->guid()); |
2157 if (!s_date.Run()) | 2156 if (!s_date.Run()) |
2158 return false; | 2157 return false; |
2159 } | 2158 } |
2160 | 2159 |
2161 return true; | 2160 return true; |
2162 } | 2161 } |
OLD | NEW |