Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(62)

Side by Side Diff: chrome/browser/webdata/keyword_table.cc

Issue 10908226: Introduces a search term extraction mechanism working for arbitrary search providers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Removed need for espv=1 for search term extraction. Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/keyword_table.h" 5 #include "chrome/browser/webdata/keyword_table.h"
6 6
7 #include <set> 7 #include <set>
8 8
9 #include "base/json/json_reader.h"
10 #include "base/json/json_writer.h"
9 #include "base/logging.h" 11 #include "base/logging.h"
10 #include "base/memory/scoped_ptr.h" 12 #include "base/memory/scoped_ptr.h"
11 #include "base/metrics/histogram.h" 13 #include "base/metrics/histogram.h"
12 #include "base/metrics/stats_counters.h" 14 #include "base/metrics/stats_counters.h"
13 #include "base/string_number_conversions.h" 15 #include "base/string_number_conversions.h"
14 #include "base/string_split.h" 16 #include "base/string_split.h"
15 #include "base/string_util.h" 17 #include "base/string_util.h"
16 #include "base/stringprintf.h" 18 #include "base/stringprintf.h"
17 #include "base/utf_string_conversions.h" 19 #include "base/utf_string_conversions.h"
20 #include "base/values.h"
18 #include "chrome/browser/history/history_database.h" 21 #include "chrome/browser/history/history_database.h"
19 #include "chrome/browser/protector/histograms.h" 22 #include "chrome/browser/protector/histograms.h"
20 #include "chrome/browser/protector/protector_utils.h" 23 #include "chrome/browser/protector/protector_utils.h"
21 #include "chrome/browser/search_engines/search_terms_data.h" 24 #include "chrome/browser/search_engines/search_terms_data.h"
22 #include "chrome/browser/search_engines/template_url.h" 25 #include "chrome/browser/search_engines/template_url.h"
23 #include "chrome/browser/search_engines/template_url_service.h" 26 #include "chrome/browser/search_engines/template_url_service.h"
24 #include "chrome/browser/webdata/web_database.h" 27 #include "chrome/browser/webdata/web_database.h"
25 #include "googleurl/src/gurl.h" 28 #include "googleurl/src/gurl.h"
26 #include "sql/statement.h" 29 #include "sql/statement.h"
27 #include "sql/transaction.h" 30 #include "sql/transaction.h"
28 31
29 using base::Time; 32 using base::Time;
30 33
31 // static 34 // static
32 const char KeywordTable::kDefaultSearchProviderKey[] = 35 const char KeywordTable::kDefaultSearchProviderKey[] =
33 "Default Search Provider ID"; 36 "Default Search Provider ID";
34 const char KeywordTable::kDefaultSearchIDBackupKey[] = 37 const char KeywordTable::kDefaultSearchIDBackupKey[] =
35 "Default Search Provider ID Backup"; 38 "Default Search Provider ID Backup";
36 const char KeywordTable::kBackupSignatureKey[] = 39 const char KeywordTable::kBackupSignatureKey[] =
37 "Default Search Provider ID Backup Signature"; 40 "Default Search Provider ID Backup Signature";
38 const char KeywordTable::kKeywordColumns[] = "id, short_name, keyword, " 41 const char KeywordTable::kKeywordColumns[] = "id, short_name, keyword, "
39 "favicon_url, url, safe_for_autoreplace, originating_url, date_created, " 42 "favicon_url, url, safe_for_autoreplace, originating_url, date_created, "
40 "usage_count, input_encodings, show_in_default_list, suggest_url, " 43 "usage_count, input_encodings, show_in_default_list, suggest_url, "
41 "prepopulate_id, created_by_policy, instant_url, last_modified, sync_guid"; 44 "prepopulate_id, created_by_policy, instant_url, last_modified, sync_guid, "
45 "alternate_urls";
42 46
43 namespace { 47 namespace {
44 48
45 // Keys used in the meta table. 49 // Keys used in the meta table.
46 const char kBuiltinKeywordVersion[] = "Builtin Keyword Version"; 50 const char kBuiltinKeywordVersion[] = "Builtin Keyword Version";
47 51
48 // The set of columns up through version 44. (There were different columns 52 // The set of columns up through version 44. (There were different columns
49 // below version 29 but none of the code below needs to worry about that case.) 53 // below version 29 but none of the code below needs to worry about that case.)
50 const char kKeywordColumnsVersion44Concatenated[] = "id || short_name || " 54 const char kKeywordColumnsVersion44Concatenated[] = "id || short_name || "
51 "keyword || favicon_url || url || safe_for_autoreplace || " 55 "keyword || favicon_url || url || safe_for_autoreplace || "
52 "originating_url || date_created || usage_count || input_encodings || " 56 "originating_url || date_created || usage_count || input_encodings || "
53 "show_in_default_list || suggest_url || prepopulate_id || " 57 "show_in_default_list || suggest_url || prepopulate_id || "
54 "autogenerate_keyword || logo_id || created_by_policy || instant_url || " 58 "autogenerate_keyword || logo_id || created_by_policy || instant_url || "
55 "last_modified || sync_guid"; 59 "last_modified || sync_guid";
56 const char kKeywordColumnsVersion44[] = "id, short_name, keyword, favicon_url, " 60 const char kKeywordColumnsVersion44[] = "id, short_name, keyword, favicon_url, "
57 "url, safe_for_autoreplace, originating_url, date_created, usage_count, " 61 "url, safe_for_autoreplace, originating_url, date_created, usage_count, "
58 "input_encodings, show_in_default_list, suggest_url, prepopulate_id, " 62 "input_encodings, show_in_default_list, suggest_url, prepopulate_id, "
59 "autogenerate_keyword, logo_id, created_by_policy, instant_url, " 63 "autogenerate_keyword, logo_id, created_by_policy, instant_url, "
60 "last_modified, sync_guid"; 64 "last_modified, sync_guid";
61 // NOTE: Remember to change what |kKeywordColumnsVersion45| says if the column 65 // The set of columns from version 45 through version 46 (inclusively).
62 // set in |kKeywordColumns| changes, and update any code that needs to switch 66 const char kKeywordColumnsVersion46Concatenated[] = "id || short_name || "
63 // column sets based on a version number! 67 "keyword || favicon_url || url || safe_for_autoreplace || "
64 const char* const kKeywordColumnsVersion45 = KeywordTable::kKeywordColumns; 68 "originating_url || date_created || usage_count || input_encodings || "
69 "show_in_default_list || suggest_url || prepopulate_id || "
70 "created_by_policy || instant_url || last_modified || sync_guid";
71 const char kKeywordColumnsVersion46[] = "id, short_name, keyword, "
72 "favicon_url, url, safe_for_autoreplace, originating_url, date_created, "
73 "usage_count, input_encodings, show_in_default_list, suggest_url, "
74 "prepopulate_id, created_by_policy, instant_url, last_modified, sync_guid";
65 75
66 // The current columns. 76 // The current columns.
67 const char kKeywordColumnsConcatenated[] = "id || short_name || keyword || " 77 const char kKeywordColumnsConcatenated[] = "id || short_name || "
Peter Kasting 2012/10/02 21:47:59 Nit: Why rewrap this value (and all the subsequent
beaudoin 2012/10/03 22:46:52 Done.
68 "favicon_url || url || safe_for_autoreplace || originating_url || " 78 "keyword || favicon_url || url || safe_for_autoreplace || "
69 "date_created || usage_count || input_encodings || show_in_default_list || " 79 "originating_url || date_created || usage_count || input_encodings || "
70 "suggest_url || prepopulate_id || created_by_policy || instant_url || " 80 "show_in_default_list || suggest_url || prepopulate_id || "
71 "last_modified || sync_guid"; 81 "created_by_policy || instant_url || last_modified || sync_guid || "
82 "alternate_urls";
72 83
73 // Inserts the data from |data| into |s|. |s| is assumed to have slots for all 84 // Inserts the data from |data| into |s|. |s| is assumed to have slots for all
74 // the columns in the keyword table. |id_column| is the slot number to bind 85 // the columns in the keyword table. |id_column| is the slot number to bind
75 // |data|'s |id| to; |starting_column| is the slot number of the first of a 86 // |data|'s |id| to; |starting_column| is the slot number of the first of a
76 // contiguous set of slots to bind all the other fields to. 87 // contiguous set of slots to bind all the other fields to.
77 void BindURLToStatement(const TemplateURLData& data, 88 void BindURLToStatement(const TemplateURLData& data,
78 sql::Statement* s, 89 sql::Statement* s,
79 int id_column, 90 int id_column,
80 int starting_column) { 91 int starting_column) {
92 // Serialize |alternate_urls| to JSON.
93 // TODO(beaudoin): Check what it would take to use a new table to store
94 // alternate_urls while keeping backups and table signature in a good state.
95 // See: crbug.com/153520
96 ListValue alternate_urls_value;
97 for (size_t i = 0; i < data.alternate_urls.size(); ++i)
98 alternate_urls_value.AppendString(data.alternate_urls[i]);
99 std::string alternate_urls;
100 base::JSONWriter::Write(&alternate_urls_value, &alternate_urls);
101
81 s->BindInt64(id_column, data.id); 102 s->BindInt64(id_column, data.id);
82 s->BindString16(starting_column, data.short_name); 103 s->BindString16(starting_column, data.short_name);
83 s->BindString16(starting_column + 1, data.keyword()); 104 s->BindString16(starting_column + 1, data.keyword());
84 s->BindString(starting_column + 2, data.favicon_url.is_valid() ? 105 s->BindString(starting_column + 2, data.favicon_url.is_valid() ?
85 history::HistoryDatabase::GURLToDatabaseURL(data.favicon_url) : 106 history::HistoryDatabase::GURLToDatabaseURL(data.favicon_url) :
86 std::string()); 107 std::string());
87 s->BindString(starting_column + 3, data.url()); 108 s->BindString(starting_column + 3, data.url());
88 s->BindBool(starting_column + 4, data.safe_for_autoreplace); 109 s->BindBool(starting_column + 4, data.safe_for_autoreplace);
89 s->BindString(starting_column + 5, data.originating_url.is_valid() ? 110 s->BindString(starting_column + 5, data.originating_url.is_valid() ?
90 history::HistoryDatabase::GURLToDatabaseURL(data.originating_url) : 111 history::HistoryDatabase::GURLToDatabaseURL(data.originating_url) :
91 std::string()); 112 std::string());
92 s->BindInt64(starting_column + 6, data.date_created.ToTimeT()); 113 s->BindInt64(starting_column + 6, data.date_created.ToTimeT());
93 s->BindInt(starting_column + 7, data.usage_count); 114 s->BindInt(starting_column + 7, data.usage_count);
94 s->BindString(starting_column + 8, JoinString(data.input_encodings, ';')); 115 s->BindString(starting_column + 8, JoinString(data.input_encodings, ';'));
95 s->BindBool(starting_column + 9, data.show_in_default_list); 116 s->BindBool(starting_column + 9, data.show_in_default_list);
96 s->BindString(starting_column + 10, data.suggestions_url); 117 s->BindString(starting_column + 10, data.suggestions_url);
97 s->BindInt(starting_column + 11, data.prepopulate_id); 118 s->BindInt(starting_column + 11, data.prepopulate_id);
98 s->BindBool(starting_column + 12, data.created_by_policy); 119 s->BindBool(starting_column + 12, data.created_by_policy);
99 s->BindString(starting_column + 13, data.instant_url); 120 s->BindString(starting_column + 13, data.instant_url);
100 s->BindInt64(starting_column + 14, data.last_modified.ToTimeT()); 121 s->BindInt64(starting_column + 14, data.last_modified.ToTimeT());
101 s->BindString(starting_column + 15, data.sync_guid); 122 s->BindString(starting_column + 15, data.sync_guid);
123 s->BindString(starting_column + 16, alternate_urls);
102 } 124 }
103 125
104 } // anonymous namespace 126 } // anonymous namespace
105 127
106 KeywordTable::KeywordTable(sql::Connection* db, sql::MetaTable* meta_table) 128 KeywordTable::KeywordTable(sql::Connection* db, sql::MetaTable* meta_table)
107 : WebDatabaseTable(db, meta_table), 129 : WebDatabaseTable(db, meta_table),
108 backup_overwritten_(false) { 130 backup_overwritten_(false) {
109 } 131 }
110 132
111 KeywordTable::~KeywordTable() {} 133 KeywordTable::~KeywordTable() {}
(...skipping 10 matching lines...) Expand all
122 "originating_url VARCHAR," 144 "originating_url VARCHAR,"
123 "date_created INTEGER DEFAULT 0," 145 "date_created INTEGER DEFAULT 0,"
124 "usage_count INTEGER DEFAULT 0," 146 "usage_count INTEGER DEFAULT 0,"
125 "input_encodings VARCHAR," 147 "input_encodings VARCHAR,"
126 "show_in_default_list INTEGER," 148 "show_in_default_list INTEGER,"
127 "suggest_url VARCHAR," 149 "suggest_url VARCHAR,"
128 "prepopulate_id INTEGER DEFAULT 0," 150 "prepopulate_id INTEGER DEFAULT 0,"
129 "created_by_policy INTEGER DEFAULT 0," 151 "created_by_policy INTEGER DEFAULT 0,"
130 "instant_url VARCHAR," 152 "instant_url VARCHAR,"
131 "last_modified INTEGER DEFAULT 0," 153 "last_modified INTEGER DEFAULT 0,"
132 "sync_guid VARCHAR)") && 154 "sync_guid VARCHAR,"
155 "alternate_urls VARCHAR)") &&
133 UpdateBackupSignature(WebDatabase::kCurrentVersionNumber)); 156 UpdateBackupSignature(WebDatabase::kCurrentVersionNumber));
134 } 157 }
135 158
136 bool KeywordTable::IsSyncable() { 159 bool KeywordTable::IsSyncable() {
137 return true; 160 return true;
138 } 161 }
139 162
140 bool KeywordTable::AddKeyword(const TemplateURLData& data) { 163 bool KeywordTable::AddKeyword(const TemplateURLData& data) {
141 DCHECK(data.id); 164 DCHECK(data.id);
142 std::string query("INSERT INTO keywords (" + std::string(kKeywordColumns) + 165 std::string query("INSERT INTO keywords (" + std::string(kKeywordColumns) +
143 ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); 166 ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
144 sql::Statement s(db_->GetUniqueStatement(query.c_str())); 167 sql::Statement s(db_->GetUniqueStatement(query.c_str()));
145 BindURLToStatement(data, &s, 0, 1); 168 BindURLToStatement(data, &s, 0, 1);
146 169
147 return s.Run() && UpdateBackupSignature(WebDatabase::kCurrentVersionNumber); 170 return s.Run() && UpdateBackupSignature(WebDatabase::kCurrentVersionNumber);
148 } 171 }
149 172
150 bool KeywordTable::RemoveKeyword(TemplateURLID id) { 173 bool KeywordTable::RemoveKeyword(TemplateURLID id) {
151 DCHECK(id); 174 DCHECK(id);
152 sql::Statement s( 175 sql::Statement s(
153 db_->GetUniqueStatement("DELETE FROM keywords WHERE id = ?")); 176 db_->GetUniqueStatement("DELETE FROM keywords WHERE id = ?"));
(...skipping 21 matching lines...) Expand all
175 succeeded &= RemoveKeyword(*i); 198 succeeded &= RemoveKeyword(*i);
176 return succeeded; 199 return succeeded;
177 } 200 }
178 201
179 bool KeywordTable::UpdateKeyword(const TemplateURLData& data) { 202 bool KeywordTable::UpdateKeyword(const TemplateURLData& data) {
180 DCHECK(data.id); 203 DCHECK(data.id);
181 sql::Statement s(db_->GetUniqueStatement("UPDATE keywords SET short_name=?, " 204 sql::Statement s(db_->GetUniqueStatement("UPDATE keywords SET short_name=?, "
182 "keyword=?, favicon_url=?, url=?, safe_for_autoreplace=?, " 205 "keyword=?, favicon_url=?, url=?, safe_for_autoreplace=?, "
183 "originating_url=?, date_created=?, usage_count=?, input_encodings=?, " 206 "originating_url=?, date_created=?, usage_count=?, input_encodings=?, "
184 "show_in_default_list=?, suggest_url=?, prepopulate_id=?, " 207 "show_in_default_list=?, suggest_url=?, prepopulate_id=?, "
185 "created_by_policy=?, instant_url=?, last_modified=?, sync_guid=? WHERE " 208 "created_by_policy=?, instant_url=?, last_modified=?, sync_guid=?, "
186 "id=?")); 209 "alternate_urls=? WHERE id=?"));
187 BindURLToStatement(data, &s, 16, 0); // "16" binds id() as the last item. 210 BindURLToStatement(data, &s, 17, 0); // "17" binds id() as the last item.
188 211
189 return s.Run() && UpdateBackupSignature(WebDatabase::kCurrentVersionNumber); 212 return s.Run() && UpdateBackupSignature(WebDatabase::kCurrentVersionNumber);
190 } 213 }
191 214
192 bool KeywordTable::SetDefaultSearchProviderID(int64 id) { 215 bool KeywordTable::SetDefaultSearchProviderID(int64 id) {
193 // Added for http://crbug.com/116952. 216 // Added for http://crbug.com/116952.
194 UMA_HISTOGRAM_COUNTS_100("Search.DefaultSearchProviderID", 217 UMA_HISTOGRAM_COUNTS_100("Search.DefaultSearchProviderID",
195 static_cast<int32>(id)); 218 static_cast<int32>(id));
196 return meta_table_->SetValue(kDefaultSearchProviderKey, id) && 219 return meta_table_->SetValue(kDefaultSearchProviderKey, id) &&
197 UpdateBackupSignature(WebDatabase::kCurrentVersionNumber); 220 UpdateBackupSignature(WebDatabase::kCurrentVersionNumber);
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 bool KeywordTable::MigrateToVersion26AddCreatedByPolicyColumn() { 325 bool KeywordTable::MigrateToVersion26AddCreatedByPolicyColumn() {
303 return db_->Execute("ALTER TABLE keywords ADD COLUMN created_by_policy " 326 return db_->Execute("ALTER TABLE keywords ADD COLUMN created_by_policy "
304 "INTEGER DEFAULT 0"); 327 "INTEGER DEFAULT 0");
305 } 328 }
306 329
307 bool KeywordTable::MigrateToVersion28SupportsInstantColumn() { 330 bool KeywordTable::MigrateToVersion28SupportsInstantColumn() {
308 return db_->Execute("ALTER TABLE keywords ADD COLUMN supports_instant " 331 return db_->Execute("ALTER TABLE keywords ADD COLUMN supports_instant "
309 "INTEGER DEFAULT 0"); 332 "INTEGER DEFAULT 0");
310 } 333 }
311 334
312 bool KeywordTable::MigrateToVersion29InstantUrlToSupportsInstant() { 335 bool KeywordTable::MigrateToVersion29InstantURLToSupportsInstant() {
313 sql::Transaction transaction(db_); 336 sql::Transaction transaction(db_);
314 return transaction.Begin() && 337 return transaction.Begin() &&
315 db_->Execute("ALTER TABLE keywords ADD COLUMN instant_url VARCHAR") && 338 db_->Execute("ALTER TABLE keywords ADD COLUMN instant_url VARCHAR") &&
316 db_->Execute("CREATE TABLE keywords_temp (" 339 db_->Execute("CREATE TABLE keywords_temp ("
317 "id INTEGER PRIMARY KEY," 340 "id INTEGER PRIMARY KEY,"
318 "short_name VARCHAR NOT NULL," 341 "short_name VARCHAR NOT NULL,"
319 "keyword VARCHAR NOT NULL," 342 "keyword VARCHAR NOT NULL,"
320 "favicon_url VARCHAR NOT NULL," 343 "favicon_url VARCHAR NOT NULL,"
321 "url VARCHAR NOT NULL," 344 "url VARCHAR NOT NULL,"
322 "safe_for_autoreplace INTEGER," 345 "safe_for_autoreplace INTEGER,"
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 // Old backup was invalid; drop the table entirely, which will trigger the 402 // Old backup was invalid; drop the table entirely, which will trigger the
380 // protector code to prompt the user and recreate the table. 403 // protector code to prompt the user and recreate the table.
381 if (db_->DoesTableExist("keywords_backup") && 404 if (db_->DoesTableExist("keywords_backup") &&
382 !db_->Execute("DROP TABLE keywords_backup")) 405 !db_->Execute("DROP TABLE keywords_backup"))
383 return false; 406 return false;
384 } 407 }
385 408
386 return transaction.Commit(); 409 return transaction.Commit();
387 } 410 }
388 411
412 bool KeywordTable::MigrateToVersion47AddAlternateURLsColumn() {
413 sql::Transaction transaction(db_);
414
415 // Fill the |alternate_urls| column with empty strings, otherwise it breaks
416 // code relying on |kKeywordColumnsConcatenated|.
Peter Kasting 2012/10/02 21:47:59 Why? We have other VARCHAR columns that don't def
beaudoin 2012/10/03 22:46:52 It's needed for the migration. When adding the col
Peter Kasting 2012/10/03 22:59:33 So doesn't that mean that all our other VARCHARs s
beaudoin 2012/10/04 00:03:58 I think the fact that any update to the table (sav
417 if (!transaction.Begin() ||
418 !db_->Execute("ALTER TABLE keywords ADD COLUMN "
419 "alternate_urls VARCHAR DEFAULT ''"))
420 return false;
421
422 if (db_->DoesTableExist("keywords_backup")) {
423 if (!db_->Execute("ALTER TABLE keywords_backup ADD COLUMN "
424 "alternate_urls VARCHAR DEFAULT ''") ||
425 !SignBackup(47))
Peter Kasting 2012/10/02 21:47:59 We should only migrate and sign the backup if it w
beaudoin 2012/10/03 22:46:52 Done.
426 return false;
427 }
428
429 return transaction.Commit();
430 }
431
389 // static 432 // static
390 bool KeywordTable::GetKeywordDataFromStatement(const sql::Statement& s, 433 bool KeywordTable::GetKeywordDataFromStatement(const sql::Statement& s,
391 TemplateURLData* data) { 434 TemplateURLData* data) {
392 DCHECK(data); 435 DCHECK(data);
436
393 data->short_name = s.ColumnString16(1); 437 data->short_name = s.ColumnString16(1);
394 data->SetKeyword(s.ColumnString16(2)); 438 data->SetKeyword(s.ColumnString16(2));
395 // Due to past bugs, we might have persisted entries with empty URLs. Avoid 439 // Due to past bugs, we might have persisted entries with empty URLs. Avoid
396 // reading these out. (GetKeywords() will delete these entries on return.) 440 // reading these out. (GetKeywords() will delete these entries on return.)
397 // NOTE: This code should only be needed as long as we might be reading such 441 // NOTE: This code should only be needed as long as we might be reading such
398 // potentially-old data and can be removed afterward. 442 // potentially-old data and can be removed afterward.
399 if (s.ColumnString(4).empty()) 443 if (s.ColumnString(4).empty())
400 return false; 444 return false;
401 data->SetURL(s.ColumnString(4)); 445 data->SetURL(s.ColumnString(4));
402 data->suggestions_url = s.ColumnString(11); 446 data->suggestions_url = s.ColumnString(11);
403 data->instant_url = s.ColumnString(14); 447 data->instant_url = s.ColumnString(14);
404 data->favicon_url = GURL(s.ColumnString(3)); 448 data->favicon_url = GURL(s.ColumnString(3));
405 data->originating_url = GURL(s.ColumnString(6)); 449 data->originating_url = GURL(s.ColumnString(6));
406 data->show_in_default_list = s.ColumnBool(10); 450 data->show_in_default_list = s.ColumnBool(10);
407 data->safe_for_autoreplace = s.ColumnBool(5); 451 data->safe_for_autoreplace = s.ColumnBool(5);
408 base::SplitString(s.ColumnString(9), ';', &data->input_encodings); 452 base::SplitString(s.ColumnString(9), ';', &data->input_encodings);
409 data->id = s.ColumnInt64(0); 453 data->id = s.ColumnInt64(0);
410 data->date_created = Time::FromTimeT(s.ColumnInt64(7)); 454 data->date_created = Time::FromTimeT(s.ColumnInt64(7));
411 data->last_modified = Time::FromTimeT(s.ColumnInt64(15)); 455 data->last_modified = Time::FromTimeT(s.ColumnInt64(15));
412 data->created_by_policy = s.ColumnBool(13); 456 data->created_by_policy = s.ColumnBool(13);
413 data->usage_count = s.ColumnInt(8); 457 data->usage_count = s.ColumnInt(8);
414 data->prepopulate_id = s.ColumnInt(12); 458 data->prepopulate_id = s.ColumnInt(12);
415 data->sync_guid = s.ColumnString(16); 459 data->sync_guid = s.ColumnString(16);
460
461 data->alternate_urls.clear();
462 base::JSONReader json_reader;
463 scoped_ptr<Value> value(json_reader.ReadToValue(s.ColumnString(17)));
464 ListValue* alternate_urls_value;
465 if (value.get() && value->GetAsList(&alternate_urls_value)) {
466 std::string alternate_url;
467 for (size_t i = 0; i < alternate_urls_value->GetSize(); ++i) {
468 if (alternate_urls_value->GetString(i, &alternate_url))
469 data->alternate_urls.push_back(alternate_url);
470 }
471 }
472
416 return true; 473 return true;
417 } 474 }
418 475
419 bool KeywordTable::GetSignatureData(int table_version, std::string* backup) { 476 bool KeywordTable::GetSignatureData(int table_version, std::string* backup) {
420 DCHECK(backup); 477 DCHECK(backup);
421 478
422 int64 backup_value = kInvalidTemplateURLID; 479 int64 backup_value = kInvalidTemplateURLID;
423 if (!meta_table_->GetValue(kDefaultSearchIDBackupKey, &backup_value)) { 480 if (!meta_table_->GetValue(kDefaultSearchIDBackupKey, &backup_value)) {
424 LOG(ERROR) << "No backup id for signing."; 481 LOG(ERROR) << "No backup id for signing.";
425 return false; 482 return false;
(...skipping 11 matching lines...) Expand all
437 494
438 bool KeywordTable::GetTableContents(const char* table_name, 495 bool KeywordTable::GetTableContents(const char* table_name,
439 int table_version, 496 int table_version,
440 std::string* contents) { 497 std::string* contents) {
441 DCHECK(contents); 498 DCHECK(contents);
442 499
443 if (!db_->DoesTableExist(table_name)) 500 if (!db_->DoesTableExist(table_name))
444 return false; 501 return false;
445 502
446 contents->clear(); 503 contents->clear();
447 std::string query("SELECT " + 504 const char* keywords_columns_concatenated = kKeywordColumnsConcatenated;
Peter Kasting 2012/10/02 21:47:59 Nit: Probably makes sense to have helper functions
beaudoin 2012/10/03 22:46:52 Refactored this in a major way, got rid of all the
448 std::string((table_version <= 44) ? 505 if (table_version <= 44)
449 kKeywordColumnsVersion44Concatenated : kKeywordColumnsConcatenated) + 506 keywords_columns_concatenated = kKeywordColumnsVersion44Concatenated;
507 else if (table_version <= 46)
508 keywords_columns_concatenated = kKeywordColumnsVersion46Concatenated;
509 std::string query("SELECT " + std::string(keywords_columns_concatenated) +
450 " FROM " + std::string(table_name) + " ORDER BY id ASC"); 510 " FROM " + std::string(table_name) + " ORDER BY id ASC");
451 sql::Statement s((table_version == WebDatabase::kCurrentVersionNumber) ? 511 sql::Statement s((table_version == WebDatabase::kCurrentVersionNumber) ?
452 db_->GetCachedStatement(sql::StatementID(table_name), query.c_str()) : 512 db_->GetCachedStatement(sql::StatementID(table_name), query.c_str()) :
453 db_->GetUniqueStatement(query.c_str())); 513 db_->GetUniqueStatement(query.c_str()));
454 while (s.Step()) 514 while (s.Step())
455 *contents += s.ColumnString(0); 515 *contents += s.ColumnString(0);
456 return s.Succeeded(); 516 return s.Succeeded();
457 } 517 }
458 518
459 bool KeywordTable::UpdateBackupSignature(int table_version) { 519 bool KeywordTable::UpdateBackupSignature(int table_version) {
460 sql::Transaction transaction(db_); 520 sql::Transaction transaction(db_);
461 if (!transaction.Begin()) 521 if (!transaction.Begin())
462 return false; 522 return false;
463 523
464 int64 id = kInvalidTemplateURLID; 524 int64 id = kInvalidTemplateURLID;
465 if (!UpdateDefaultSearchProviderIDBackup(&id)) { 525 if (!UpdateDefaultSearchProviderIDBackup(&id)) {
466 LOG(ERROR) << "Failed to update default search id backup."; 526 LOG(ERROR) << "Failed to update default search id backup.";
467 return false; 527 return false;
468 } 528 }
469 529
470 // Backup of all keywords. 530 // Backup of all keywords.
471 if (db_->DoesTableExist("keywords_backup") && 531 if (db_->DoesTableExist("keywords_backup") &&
472 !db_->Execute("DROP TABLE keywords_backup")) 532 !db_->Execute("DROP TABLE keywords_backup"))
473 return false; 533 return false;
474 534
535 const char* keywords_columns = kKeywordColumns;
536 if (table_version <= 44)
537 keywords_columns = kKeywordColumnsVersion44;
538 else if (table_version <= 46)
539 keywords_columns = kKeywordColumnsVersion46;
475 std::string query("CREATE TABLE keywords_backup AS SELECT " + 540 std::string query("CREATE TABLE keywords_backup AS SELECT " +
476 std::string((table_version <= 44) ? 541 std::string(keywords_columns) + " FROM keywords ORDER BY id ASC");
477 kKeywordColumnsVersion44 : kKeywordColumns) +
478 " FROM keywords ORDER BY id ASC");
479 if (!db_->Execute(query.c_str())) { 542 if (!db_->Execute(query.c_str())) {
480 LOG(ERROR) << "Failed to create keywords_backup table."; 543 LOG(ERROR) << "Failed to create keywords_backup table.";
481 return false; 544 return false;
482 } 545 }
483 546
484 return SignBackup(table_version) && transaction.Commit(); 547 return SignBackup(table_version) && transaction.Commit();
485 } 548 }
486 549
487 bool KeywordTable::SignBackup(int table_version) { 550 bool KeywordTable::SignBackup(int table_version) {
488 std::string data_to_sign; 551 std::string data_to_sign;
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
557 "input_encodings VARCHAR," 620 "input_encodings VARCHAR,"
558 "show_in_default_list INTEGER," 621 "show_in_default_list INTEGER,"
559 "suggest_url VARCHAR," 622 "suggest_url VARCHAR,"
560 "prepopulate_id INTEGER DEFAULT 0," 623 "prepopulate_id INTEGER DEFAULT 0,"
561 "created_by_policy INTEGER DEFAULT 0," 624 "created_by_policy INTEGER DEFAULT 0,"
562 "instant_url VARCHAR," 625 "instant_url VARCHAR,"
563 "last_modified INTEGER DEFAULT 0," 626 "last_modified INTEGER DEFAULT 0,"
564 "sync_guid VARCHAR)")) 627 "sync_guid VARCHAR)"))
565 return false; 628 return false;
566 std::string sql("INSERT INTO keywords_temp SELECT " + 629 std::string sql("INSERT INTO keywords_temp SELECT " +
567 std::string(kKeywordColumnsVersion45) + " FROM " + name); 630 std::string(kKeywordColumnsVersion46) + " FROM " + name);
568 if (!db_->Execute(sql.c_str())) 631 if (!db_->Execute(sql.c_str()))
569 return false; 632 return false;
570 633
571 // NOTE: The ORDER BY here ensures that the uniquing process for keywords will 634 // NOTE: The ORDER BY here ensures that the uniquing process for keywords will
572 // happen identically on both the normal and backup tables. 635 // happen identically on both the normal and backup tables.
573 sql = "SELECT id, keyword, url, autogenerate_keyword FROM " + name + 636 sql = "SELECT id, keyword, url, autogenerate_keyword FROM " + name +
574 " ORDER BY id ASC"; 637 " ORDER BY id ASC";
575 sql::Statement s(db_->GetUniqueStatement(sql.c_str())); 638 sql::Statement s(db_->GetUniqueStatement(sql.c_str()));
576 string16 placeholder_keyword(ASCIIToUTF16("dummy")); 639 string16 placeholder_keyword(ASCIIToUTF16("dummy"));
577 std::set<string16> keywords; 640 std::set<string16> keywords;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
619 } 682 }
620 } 683 }
621 684
622 // Replace the old table with the new one. 685 // Replace the old table with the new one.
623 sql = "DROP TABLE " + name; 686 sql = "DROP TABLE " + name;
624 if (!db_->Execute(sql.c_str())) 687 if (!db_->Execute(sql.c_str()))
625 return false; 688 return false;
626 sql = "ALTER TABLE keywords_temp RENAME TO " + name; 689 sql = "ALTER TABLE keywords_temp RENAME TO " + name;
627 return db_->Execute(sql.c_str()); 690 return db_->Execute(sql.c_str());
628 } 691 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698