Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/search_engines/keyword_table.h" | 5 #include "components/search_engines/keyword_table.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <set> | 10 #include <set> |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 42 columns.push_back("id"); | 42 columns.push_back("id"); |
| 43 columns.push_back("short_name"); | 43 columns.push_back("short_name"); |
| 44 columns.push_back("keyword"); | 44 columns.push_back("keyword"); |
| 45 columns.push_back("favicon_url"); | 45 columns.push_back("favicon_url"); |
| 46 columns.push_back("url"); | 46 columns.push_back("url"); |
| 47 columns.push_back("safe_for_autoreplace"); | 47 columns.push_back("safe_for_autoreplace"); |
| 48 columns.push_back("originating_url"); | 48 columns.push_back("originating_url"); |
| 49 columns.push_back("date_created"); | 49 columns.push_back("date_created"); |
| 50 columns.push_back("usage_count"); | 50 columns.push_back("usage_count"); |
| 51 columns.push_back("input_encodings"); | 51 columns.push_back("input_encodings"); |
| 52 columns.push_back("show_in_default_list"); | 52 if (version <= 67) { |
| 53 // Column removed after version 67. | |
| 54 columns.push_back("show_in_default_list"); | |
| 55 } | |
| 53 columns.push_back("suggest_url"); | 56 columns.push_back("suggest_url"); |
| 54 columns.push_back("prepopulate_id"); | 57 columns.push_back("prepopulate_id"); |
| 55 if (version <= 44) { | 58 if (version <= 44) { |
| 56 // Columns removed after version 44. | 59 // Columns removed after version 44. |
| 57 columns.push_back("autogenerate_keyword"); | 60 columns.push_back("autogenerate_keyword"); |
| 58 columns.push_back("logo_id"); | 61 columns.push_back("logo_id"); |
| 59 } | 62 } |
| 60 columns.push_back("created_by_policy"); | 63 columns.push_back("created_by_policy"); |
| 61 columns.push_back("instant_url"); | 64 columns.push_back("instant_url"); |
| 62 columns.push_back("last_modified"); | 65 columns.push_back("last_modified"); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 112 std::string()); | 115 std::string()); |
| 113 s->BindString(starting_column + 3, data.url()); | 116 s->BindString(starting_column + 3, data.url()); |
| 114 s->BindBool(starting_column + 4, data.safe_for_autoreplace); | 117 s->BindBool(starting_column + 4, data.safe_for_autoreplace); |
| 115 s->BindString(starting_column + 5, data.originating_url.is_valid() ? | 118 s->BindString(starting_column + 5, data.originating_url.is_valid() ? |
| 116 history::URLDatabase::GURLToDatabaseURL(data.originating_url) : | 119 history::URLDatabase::GURLToDatabaseURL(data.originating_url) : |
| 117 std::string()); | 120 std::string()); |
| 118 s->BindInt64(starting_column + 6, data.date_created.ToTimeT()); | 121 s->BindInt64(starting_column + 6, data.date_created.ToTimeT()); |
| 119 s->BindInt(starting_column + 7, data.usage_count); | 122 s->BindInt(starting_column + 7, data.usage_count); |
| 120 s->BindString(starting_column + 8, | 123 s->BindString(starting_column + 8, |
| 121 base::JoinString(data.input_encodings, ";")); | 124 base::JoinString(data.input_encodings, ";")); |
| 122 s->BindBool(starting_column + 9, data.show_in_default_list); | 125 s->BindString(starting_column + 9, data.suggestions_url); |
| 123 s->BindString(starting_column + 10, data.suggestions_url); | 126 s->BindInt(starting_column + 10, data.prepopulate_id); |
| 124 s->BindInt(starting_column + 11, data.prepopulate_id); | 127 s->BindBool(starting_column + 11, data.created_by_policy); |
| 125 s->BindBool(starting_column + 12, data.created_by_policy); | 128 s->BindString(starting_column + 12, data.instant_url); |
| 126 s->BindString(starting_column + 13, data.instant_url); | 129 s->BindInt64(starting_column + 13, data.last_modified.ToTimeT()); |
| 127 s->BindInt64(starting_column + 14, data.last_modified.ToTimeT()); | 130 s->BindString(starting_column + 14, data.sync_guid); |
| 128 s->BindString(starting_column + 15, data.sync_guid); | 131 s->BindString(starting_column + 15, alternate_urls); |
| 129 s->BindString(starting_column + 16, alternate_urls); | 132 s->BindString(starting_column + 16, data.search_terms_replacement_key); |
| 130 s->BindString(starting_column + 17, data.search_terms_replacement_key); | 133 s->BindString(starting_column + 17, data.image_url); |
| 131 s->BindString(starting_column + 18, data.image_url); | 134 s->BindString(starting_column + 18, data.search_url_post_params); |
| 132 s->BindString(starting_column + 19, data.search_url_post_params); | 135 s->BindString(starting_column + 19, data.suggestions_url_post_params); |
| 133 s->BindString(starting_column + 20, data.suggestions_url_post_params); | 136 s->BindString(starting_column + 20, data.instant_url_post_params); |
| 134 s->BindString(starting_column + 21, data.instant_url_post_params); | 137 s->BindString(starting_column + 21, data.image_url_post_params); |
| 135 s->BindString(starting_column + 22, data.image_url_post_params); | 138 s->BindString(starting_column + 22, data.new_tab_url); |
| 136 s->BindString(starting_column + 23, data.new_tab_url); | |
| 137 } | 139 } |
| 138 | 140 |
| 139 WebDatabaseTable::TypeKey GetKey() { | 141 WebDatabaseTable::TypeKey GetKey() { |
| 140 // We just need a unique constant. Use the address of a static that | 142 // We just need a unique constant. Use the address of a static that |
| 141 // COMDAT folding won't touch in an optimizing linker. | 143 // COMDAT folding won't touch in an optimizing linker. |
| 142 static int table_key = 0; | 144 static int table_key = 0; |
| 143 return reinterpret_cast<void*>(&table_key); | 145 return reinterpret_cast<void*>(&table_key); |
| 144 } | 146 } |
| 145 | 147 |
| 146 } // namespace | 148 } // namespace |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 164 "id INTEGER PRIMARY KEY," | 166 "id INTEGER PRIMARY KEY," |
| 165 "short_name VARCHAR NOT NULL," | 167 "short_name VARCHAR NOT NULL," |
| 166 "keyword VARCHAR NOT NULL," | 168 "keyword VARCHAR NOT NULL," |
| 167 "favicon_url VARCHAR NOT NULL," | 169 "favicon_url VARCHAR NOT NULL," |
| 168 "url VARCHAR NOT NULL," | 170 "url VARCHAR NOT NULL," |
| 169 "safe_for_autoreplace INTEGER," | 171 "safe_for_autoreplace INTEGER," |
| 170 "originating_url VARCHAR," | 172 "originating_url VARCHAR," |
| 171 "date_created INTEGER DEFAULT 0," | 173 "date_created INTEGER DEFAULT 0," |
| 172 "usage_count INTEGER DEFAULT 0," | 174 "usage_count INTEGER DEFAULT 0," |
| 173 "input_encodings VARCHAR," | 175 "input_encodings VARCHAR," |
| 174 "show_in_default_list INTEGER," | |
| 175 "suggest_url VARCHAR," | 176 "suggest_url VARCHAR," |
| 176 "prepopulate_id INTEGER DEFAULT 0," | 177 "prepopulate_id INTEGER DEFAULT 0," |
| 177 "created_by_policy INTEGER DEFAULT 0," | 178 "created_by_policy INTEGER DEFAULT 0," |
| 178 "instant_url VARCHAR," | 179 "instant_url VARCHAR," |
| 179 "last_modified INTEGER DEFAULT 0," | 180 "last_modified INTEGER DEFAULT 0," |
| 180 "sync_guid VARCHAR," | 181 "sync_guid VARCHAR," |
| 181 "alternate_urls VARCHAR," | 182 "alternate_urls VARCHAR," |
| 182 "search_terms_replacement_key VARCHAR," | 183 "search_terms_replacement_key VARCHAR," |
| 183 "image_url VARCHAR," | 184 "image_url VARCHAR," |
| 184 "search_url_post_params VARCHAR," | 185 "search_url_post_params VARCHAR," |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 195 bool KeywordTable::MigrateToVersion(int version, | 196 bool KeywordTable::MigrateToVersion(int version, |
| 196 bool* update_compatible_version) { | 197 bool* update_compatible_version) { |
| 197 // Migrate if necessary. | 198 // Migrate if necessary. |
| 198 switch (version) { | 199 switch (version) { |
| 199 case 53: | 200 case 53: |
| 200 *update_compatible_version = true; | 201 *update_compatible_version = true; |
| 201 return MigrateToVersion53AddNewTabURLColumn(); | 202 return MigrateToVersion53AddNewTabURLColumn(); |
| 202 case 59: | 203 case 59: |
| 203 *update_compatible_version = true; | 204 *update_compatible_version = true; |
| 204 return MigrateToVersion59RemoveExtensionKeywords(); | 205 return MigrateToVersion59RemoveExtensionKeywords(); |
| 206 case 68: | |
| 207 *update_compatible_version = true; | |
| 208 return MigrateToVersion68RemoveShowInDefaultListColumn(); | |
| 205 } | 209 } |
| 206 | 210 |
| 207 return true; | 211 return true; |
| 208 } | 212 } |
| 209 | 213 |
| 210 bool KeywordTable::PerformOperations(const Operations& operations) { | 214 bool KeywordTable::PerformOperations(const Operations& operations) { |
| 211 sql::Transaction transaction(db_); | 215 sql::Transaction transaction(db_); |
| 212 if (!transaction.Begin()) | 216 if (!transaction.Begin()) |
| 213 return false; | 217 return false; |
| 214 | 218 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 282 bool KeywordTable::MigrateToVersion53AddNewTabURLColumn() { | 286 bool KeywordTable::MigrateToVersion53AddNewTabURLColumn() { |
| 283 return db_->Execute("ALTER TABLE keywords ADD COLUMN new_tab_url " | 287 return db_->Execute("ALTER TABLE keywords ADD COLUMN new_tab_url " |
| 284 "VARCHAR DEFAULT ''"); | 288 "VARCHAR DEFAULT ''"); |
| 285 } | 289 } |
| 286 | 290 |
| 287 bool KeywordTable::MigrateToVersion59RemoveExtensionKeywords() { | 291 bool KeywordTable::MigrateToVersion59RemoveExtensionKeywords() { |
| 288 return db_->Execute("DELETE FROM keywords " | 292 return db_->Execute("DELETE FROM keywords " |
| 289 "WHERE url LIKE 'chrome-extension://%'"); | 293 "WHERE url LIKE 'chrome-extension://%'"); |
| 290 } | 294 } |
| 291 | 295 |
| 296 // SQLite does not support DROP COLUMN operation. So A new table is created | |
| 297 // without the show_in_default_list column. Data from all but the dropped column | |
| 298 // of the old table is copied into it. After that, the old table is dropped and | |
| 299 // the new table is renamed to it. | |
| 300 bool KeywordTable::MigrateToVersion68RemoveShowInDefaultListColumn() { | |
| 301 sql::Transaction transaction(db_); | |
| 302 return transaction.Begin() && | |
| 303 db_->Execute( | |
| 304 "CREATE TABLE temp_keywords (" | |
| 305 "id INTEGER PRIMARY KEY," | |
| 306 "short_name VARCHAR NOT NULL," | |
| 307 "keyword VARCHAR NOT NULL," | |
| 308 "favicon_url VARCHAR NOT NULL," | |
| 309 "url VARCHAR NOT NULL," | |
| 310 "safe_for_autoreplace INTEGER," | |
| 311 "originating_url VARCHAR," | |
| 312 "date_created INTEGER DEFAULT 0," | |
| 313 "usage_count INTEGER DEFAULT 0," | |
| 314 "input_encodings VARCHAR," | |
| 315 "suggest_url VARCHAR," | |
| 316 "prepopulate_id INTEGER DEFAULT 0," | |
| 317 "created_by_policy INTEGER DEFAULT 0," | |
| 318 "instant_url VARCHAR," | |
| 319 "last_modified INTEGER DEFAULT 0," | |
| 320 "sync_guid VARCHAR," | |
| 321 "alternate_urls VARCHAR," | |
| 322 "search_terms_replacement_key VARCHAR," | |
| 323 "image_url VARCHAR," | |
| 324 "search_url_post_params VARCHAR," | |
| 325 "suggest_url_post_params VARCHAR," | |
| 326 "instant_url_post_params VARCHAR," | |
| 327 "image_url_post_params VARCHAR," | |
| 328 "new_tab_url VARCHAR)") && | |
| 329 db_->Execute( | |
| 330 "INSERT INTO temp_keywords SELECT " | |
| 331 "id, short_name, keyword, favicon_url, url, " | |
| 332 "safe_for_autoreplace, originating_url, " | |
| 333 "date_created, usage_count, input_encodings, " | |
| 334 "suggest_url, prepopulate_id, created_by_policy, " | |
| 335 "instant_url, last_modified, sync_guid, " | |
| 336 "alternate_urls, search_terms_replacement_key, " | |
| 337 "image_url, search_url_post_params, " | |
| 338 "suggest_url_post_params, instant_url_post_params," | |
| 339 "image_url_post_params, new_tab_url FROM keywords") && | |
|
Peter Kasting
2016/11/14 19:59:16
Nit: Can ColumnsForVersion() be used to shorten th
| |
| 340 db_->Execute("DROP TABLE keywords") && | |
| 341 db_->Execute("ALTER TABLE temp_keywords RENAME TO keywords") && | |
| 342 transaction.Commit(); | |
| 343 } | |
| 344 | |
| 292 // static | 345 // static |
| 293 bool KeywordTable::GetKeywordDataFromStatement(const sql::Statement& s, | 346 bool KeywordTable::GetKeywordDataFromStatement(const sql::Statement& s, |
| 294 TemplateURLData* data) { | 347 TemplateURLData* data) { |
| 295 DCHECK(data); | 348 DCHECK(data); |
| 296 | 349 |
| 297 data->SetShortName(s.ColumnString16(1)); | 350 data->SetShortName(s.ColumnString16(1)); |
| 298 data->SetKeyword(s.ColumnString16(2)); | 351 data->SetKeyword(s.ColumnString16(2)); |
| 299 // Due to past bugs, we might have persisted entries with empty URLs. Avoid | 352 // Due to past bugs, we might have persisted entries with empty URLs. Avoid |
| 300 // reading these out. (GetKeywords() will delete these entries on return.) | 353 // reading these out. (GetKeywords() will delete these entries on return.) |
| 301 // NOTE: This code should only be needed as long as we might be reading such | 354 // NOTE: This code should only be needed as long as we might be reading such |
| 302 // potentially-old data and can be removed afterward. | 355 // potentially-old data and can be removed afterward. |
| 303 if (s.ColumnString(4).empty()) | 356 if (s.ColumnString(4).empty()) |
| 304 return false; | 357 return false; |
| 305 data->SetURL(s.ColumnString(4)); | 358 data->SetURL(s.ColumnString(4)); |
| 306 data->suggestions_url = s.ColumnString(11); | 359 data->suggestions_url = s.ColumnString(10); |
| 307 data->instant_url = s.ColumnString(14); | 360 data->instant_url = s.ColumnString(13); |
| 308 data->image_url = s.ColumnString(19); | 361 data->image_url = s.ColumnString(18); |
| 309 data->new_tab_url = s.ColumnString(24); | 362 data->new_tab_url = s.ColumnString(23); |
| 310 data->search_url_post_params = s.ColumnString(20); | 363 data->search_url_post_params = s.ColumnString(19); |
| 311 data->suggestions_url_post_params = s.ColumnString(21); | 364 data->suggestions_url_post_params = s.ColumnString(20); |
| 312 data->instant_url_post_params = s.ColumnString(22); | 365 data->instant_url_post_params = s.ColumnString(21); |
| 313 data->image_url_post_params = s.ColumnString(23); | 366 data->image_url_post_params = s.ColumnString(22); |
| 314 data->favicon_url = GURL(s.ColumnString(3)); | 367 data->favicon_url = GURL(s.ColumnString(3)); |
| 315 data->originating_url = GURL(s.ColumnString(6)); | 368 data->originating_url = GURL(s.ColumnString(6)); |
| 316 data->show_in_default_list = s.ColumnBool(10); | |
| 317 data->safe_for_autoreplace = s.ColumnBool(5); | 369 data->safe_for_autoreplace = s.ColumnBool(5); |
| 318 data->input_encodings = base::SplitString( | 370 data->input_encodings = base::SplitString( |
| 319 s.ColumnString(9), ";", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); | 371 s.ColumnString(9), ";", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); |
| 320 data->id = s.ColumnInt64(0); | 372 data->id = s.ColumnInt64(0); |
| 321 data->date_created = Time::FromTimeT(s.ColumnInt64(7)); | 373 data->date_created = Time::FromTimeT(s.ColumnInt64(7)); |
| 322 data->last_modified = Time::FromTimeT(s.ColumnInt64(15)); | 374 data->last_modified = Time::FromTimeT(s.ColumnInt64(14)); |
| 323 data->created_by_policy = s.ColumnBool(13); | 375 data->created_by_policy = s.ColumnBool(12); |
| 324 data->usage_count = s.ColumnInt(8); | 376 data->usage_count = s.ColumnInt(8); |
| 325 data->prepopulate_id = s.ColumnInt(12); | 377 data->prepopulate_id = s.ColumnInt(11); |
| 326 data->sync_guid = s.ColumnString(16); | 378 data->sync_guid = s.ColumnString(15); |
| 327 | 379 |
| 328 data->alternate_urls.clear(); | 380 data->alternate_urls.clear(); |
| 329 base::JSONReader json_reader; | 381 base::JSONReader json_reader; |
| 330 std::unique_ptr<base::Value> value( | 382 std::unique_ptr<base::Value> value( |
| 331 json_reader.ReadToValue(s.ColumnString(17))); | 383 json_reader.ReadToValue(s.ColumnString(16))); |
| 332 base::ListValue* alternate_urls_value; | 384 base::ListValue* alternate_urls_value; |
| 333 if (value.get() && value->GetAsList(&alternate_urls_value)) { | 385 if (value.get() && value->GetAsList(&alternate_urls_value)) { |
| 334 std::string alternate_url; | 386 std::string alternate_url; |
| 335 for (size_t i = 0; i < alternate_urls_value->GetSize(); ++i) { | 387 for (size_t i = 0; i < alternate_urls_value->GetSize(); ++i) { |
| 336 if (alternate_urls_value->GetString(i, &alternate_url)) | 388 if (alternate_urls_value->GetString(i, &alternate_url)) |
| 337 data->alternate_urls.push_back(alternate_url); | 389 data->alternate_urls.push_back(alternate_url); |
| 338 } | 390 } |
| 339 } | 391 } |
| 340 | 392 |
| 341 data->search_terms_replacement_key = s.ColumnString(18); | 393 data->search_terms_replacement_key = s.ColumnString(17); |
| 342 | 394 |
| 343 return true; | 395 return true; |
| 344 } | 396 } |
| 345 | 397 |
| 346 bool KeywordTable::AddKeyword(const TemplateURLData& data) { | 398 bool KeywordTable::AddKeyword(const TemplateURLData& data) { |
| 347 DCHECK(data.id); | 399 DCHECK(data.id); |
| 348 std::string query("INSERT INTO keywords (" + GetKeywordColumns() + ") " | 400 std::string query("INSERT INTO keywords (" + GetKeywordColumns() + ") " |
| 349 "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?," | 401 "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?," |
| 350 " ?)"); | 402 " ?)"); |
| 351 sql::Statement s(db_->GetCachedStatement(SQL_FROM_HERE, query.c_str())); | 403 sql::Statement s(db_->GetCachedStatement(SQL_FROM_HERE, query.c_str())); |
| 352 BindURLToStatement(data, &s, 0, 1); | 404 BindURLToStatement(data, &s, 0, 1); |
| 353 | 405 |
| 354 return s.Run(); | 406 return s.Run(); |
| 355 } | 407 } |
| 356 | 408 |
| 357 bool KeywordTable::RemoveKeyword(TemplateURLID id) { | 409 bool KeywordTable::RemoveKeyword(TemplateURLID id) { |
| 358 DCHECK(id); | 410 DCHECK(id); |
| 359 sql::Statement s(db_->GetCachedStatement( | 411 sql::Statement s(db_->GetCachedStatement( |
| 360 SQL_FROM_HERE, "DELETE FROM keywords WHERE id = ?")); | 412 SQL_FROM_HERE, "DELETE FROM keywords WHERE id = ?")); |
| 361 s.BindInt64(0, id); | 413 s.BindInt64(0, id); |
| 362 | 414 |
| 363 return s.Run(); | 415 return s.Run(); |
| 364 } | 416 } |
| 365 | 417 |
| 366 bool KeywordTable::UpdateKeyword(const TemplateURLData& data) { | 418 bool KeywordTable::UpdateKeyword(const TemplateURLData& data) { |
| 367 DCHECK(data.id); | 419 DCHECK(data.id); |
| 368 sql::Statement s(db_->GetCachedStatement( | 420 sql::Statement s(db_->GetCachedStatement( |
| 369 SQL_FROM_HERE, | 421 SQL_FROM_HERE, |
| 370 "UPDATE keywords SET short_name=?, keyword=?, favicon_url=?, url=?, " | 422 "UPDATE keywords SET short_name=?, keyword=?, favicon_url=?, url=?, " |
| 371 "safe_for_autoreplace=?, originating_url=?, date_created=?, " | 423 "safe_for_autoreplace=?, originating_url=?, date_created=?, " |
| 372 "usage_count=?, input_encodings=?, show_in_default_list=?, " | 424 "usage_count=?, input_encodings=?, suggest_url=?, " |
| 373 "suggest_url=?, prepopulate_id=?, created_by_policy=?, instant_url=?, " | 425 "prepopulate_id=?, created_by_policy=?, instant_url=?, " |
| 374 "last_modified=?, sync_guid=?, alternate_urls=?, " | 426 "last_modified=?, sync_guid=?, alternate_urls=?, " |
| 375 "search_terms_replacement_key=?, image_url=?, search_url_post_params=?, " | 427 "search_terms_replacement_key=?, image_url=?, search_url_post_params=?, " |
| 376 "suggest_url_post_params=?, instant_url_post_params=?, " | 428 "suggest_url_post_params=?, instant_url_post_params=?, " |
| 377 "image_url_post_params=?, new_tab_url=? WHERE id=?")); | 429 "image_url_post_params=?, new_tab_url=? WHERE id=?")); |
| 378 BindURLToStatement(data, &s, 24, 0); // "24" binds id() as the last item. | 430 BindURLToStatement(data, &s, 23, 0); // "23" binds id() as the last item. |
| 379 | 431 |
| 380 return s.Run(); | 432 return s.Run(); |
| 381 } | 433 } |
| 382 | 434 |
| 383 bool KeywordTable::GetKeywordAsString(TemplateURLID id, | 435 bool KeywordTable::GetKeywordAsString(TemplateURLID id, |
| 384 const std::string& table_name, | 436 const std::string& table_name, |
| 385 std::string* result) { | 437 std::string* result) { |
| 386 std::string query("SELECT " + | 438 std::string query("SELECT " + |
| 387 ColumnsForVersion(WebDatabase::kCurrentVersionNumber, true) + | 439 ColumnsForVersion(WebDatabase::kCurrentVersionNumber, true) + |
| 388 " FROM " + table_name + " WHERE id=?"); | 440 " FROM " + table_name + " WHERE id=?"); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 478 } | 530 } |
| 479 } | 531 } |
| 480 | 532 |
| 481 // Replace the old table with the new one. | 533 // Replace the old table with the new one. |
| 482 sql = "DROP TABLE " + name; | 534 sql = "DROP TABLE " + name; |
| 483 if (!db_->Execute(sql.c_str())) | 535 if (!db_->Execute(sql.c_str())) |
| 484 return false; | 536 return false; |
| 485 sql = "ALTER TABLE keywords_temp RENAME TO " + name; | 537 sql = "ALTER TABLE keywords_temp RENAME TO " + name; |
| 486 return db_->Execute(sql.c_str()); | 538 return db_->Execute(sql.c_str()); |
| 487 } | 539 } |
| OLD | NEW |