Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "components/omnibox/browser/shortcuts_database.h" | 5 #include "components/omnibox/browser/shortcuts_database.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/bind.h" | |
| 9 #include "base/guid.h" | 10 #include "base/guid.h" |
| 10 #include "base/logging.h" | 11 #include "base/logging.h" |
| 11 #include "base/strings/stringprintf.h" | 12 #include "base/strings/stringprintf.h" |
| 12 #include "base/time/time.h" | 13 #include "base/time/time.h" |
| 13 #include "components/omnibox/browser/autocomplete_match_type.h" | 14 #include "components/omnibox/browser/autocomplete_match_type.h" |
| 14 #include "sql/meta_table.h" | 15 #include "sql/meta_table.h" |
| 16 #include "sql/recovery.h" | |
| 15 #include "sql/statement.h" | 17 #include "sql/statement.h" |
| 16 #include "sql/transaction.h" | 18 #include "sql/transaction.h" |
| 17 #include "ui/base/page_transition_types.h" | 19 #include "ui/base/page_transition_types.h" |
| 18 | 20 |
| 19 | 21 |
| 20 // Helpers -------------------------------------------------------------------- | 22 // Helpers -------------------------------------------------------------------- |
| 21 | 23 |
| 22 namespace { | 24 namespace { |
| 23 | 25 |
| 24 // Current version number. We write databases at the "current" version number, | 26 // Current version number. We write databases at the "current" version number, |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 48 bool DeleteShortcut(const char* field_name, | 50 bool DeleteShortcut(const char* field_name, |
| 49 const std::string& id, | 51 const std::string& id, |
| 50 sql::Connection& db) { | 52 sql::Connection& db) { |
| 51 sql::Statement s(db.GetUniqueStatement( | 53 sql::Statement s(db.GetUniqueStatement( |
| 52 base::StringPrintf("DELETE FROM omni_box_shortcuts WHERE %s = ?", | 54 base::StringPrintf("DELETE FROM omni_box_shortcuts WHERE %s = ?", |
| 53 field_name).c_str())); | 55 field_name).c_str())); |
| 54 s.BindString(0, id); | 56 s.BindString(0, id); |
| 55 return s.Run(); | 57 return s.Run(); |
| 56 } | 58 } |
| 57 | 59 |
| 60 void DatabaseErrorCallback(sql::Connection* db, | |
| 61 const base::FilePath& db_path, | |
| 62 int extended_error, | |
| 63 sql::Statement* stmt) { | |
| 64 if (sql::Recovery::ShouldRecoverOrRaze(extended_error)) { | |
| 65 // Prevent reentrant calls. | |
| 66 db->reset_error_callback(); | |
| 67 | |
| 68 // After this call, the |db| handle is poisoned so that future calls will | |
| 69 // return errors until the handle is re-opened. | |
| 70 sql::Recovery::RecoverDatabaseOrRaze(db, db_path); | |
| 71 } | |
| 72 | |
| 73 // The default handling is to assert on debug and to ignore on release. | |
| 74 if (!sql::Connection::ShouldIgnoreSqliteError(extended_error)) | |
|
Mark P
2016/04/19 23:34:27
You misunderstood my comment.
I meant in the curr
Scott Hess - ex-Googler
2016/05/13 21:24:35
I'll just have the recovery path return. Connecti
| |
| 75 DLOG(FATAL) << db->GetErrorMessage(); | |
| 76 } | |
| 77 | |
| 58 } // namespace | 78 } // namespace |
| 59 | 79 |
| 60 // ShortcutsDatabase::Shortcut::MatchCore ------------------------------------- | 80 // ShortcutsDatabase::Shortcut::MatchCore ------------------------------------- |
| 61 | 81 |
| 62 ShortcutsDatabase::Shortcut::MatchCore::MatchCore( | 82 ShortcutsDatabase::Shortcut::MatchCore::MatchCore( |
| 63 const base::string16& fill_into_edit, | 83 const base::string16& fill_into_edit, |
| 64 const GURL& destination_url, | 84 const GURL& destination_url, |
| 65 const base::string16& contents, | 85 const base::string16& contents, |
| 66 const std::string& contents_class, | 86 const std::string& contents_class, |
| 67 const base::string16& description, | 87 const base::string16& description, |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 116 | 136 |
| 117 // ShortcutsDatabase ---------------------------------------------------------- | 137 // ShortcutsDatabase ---------------------------------------------------------- |
| 118 | 138 |
| 119 ShortcutsDatabase::ShortcutsDatabase(const base::FilePath& database_path) | 139 ShortcutsDatabase::ShortcutsDatabase(const base::FilePath& database_path) |
| 120 : database_path_(database_path) { | 140 : database_path_(database_path) { |
| 121 } | 141 } |
| 122 | 142 |
| 123 bool ShortcutsDatabase::Init() { | 143 bool ShortcutsDatabase::Init() { |
| 124 db_.set_histogram_tag("Shortcuts"); | 144 db_.set_histogram_tag("Shortcuts"); |
| 125 | 145 |
| 146 // To recover from corruption. | |
| 147 db_.set_error_callback( | |
| 148 base::Bind(&DatabaseErrorCallback, &db_, database_path_)); | |
| 149 | |
| 126 // Set the database page size to something a little larger to give us | 150 // Set the database page size to something a little larger to give us |
| 127 // better performance (we're typically seek rather than bandwidth limited). | 151 // better performance (we're typically seek rather than bandwidth limited). |
| 128 // This only has an effect before any tables have been created, otherwise | 152 // This only has an effect before any tables have been created, otherwise |
| 129 // this is a NOP. Must be a power of 2 and a max of 8192. | 153 // this is a NOP. Must be a power of 2 and a max of 8192. |
| 130 db_.set_page_size(4096); | 154 db_.set_page_size(4096); |
| 131 | 155 |
| 132 // Run the database in exclusive mode. Nobody else should be accessing the | 156 // Run the database in exclusive mode. Nobody else should be accessing the |
| 133 // database while we're running, and this will give somewhat improved perf. | 157 // database while we're running, and this will give somewhat improved perf. |
| 134 db_.set_exclusive_locking(); | 158 db_.set_exclusive_locking(); |
| 135 | 159 |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 250 "UPDATE omni_box_shortcuts SET type = %d", | 274 "UPDATE omni_box_shortcuts SET type = %d", |
| 251 static_cast<int>(AutocompleteMatchType::HISTORY_TITLE)).c_str()) && | 275 static_cast<int>(AutocompleteMatchType::HISTORY_TITLE)).c_str()) && |
| 252 db_.Execute("ALTER TABLE omni_box_shortcuts " | 276 db_.Execute("ALTER TABLE omni_box_shortcuts " |
| 253 "ADD COLUMN keyword VARCHAR") && | 277 "ADD COLUMN keyword VARCHAR") && |
| 254 transaction.Commit())) { | 278 transaction.Commit())) { |
| 255 return false; | 279 return false; |
| 256 } | 280 } |
| 257 } | 281 } |
| 258 | 282 |
| 259 if (!sql::MetaTable::DoesTableExist(&db_)) { | 283 if (!sql::MetaTable::DoesTableExist(&db_)) { |
| 260 meta_table_.Init(&db_, kCurrentVersionNumber, kCompatibleVersionNumber); | |
| 261 sql::Transaction transaction(&db_); | 284 sql::Transaction transaction(&db_); |
| 262 if (!(transaction.Begin() && | 285 if (!(transaction.Begin() && |
| 263 // Migrate old SEARCH_OTHER_ENGINE values to the new type value. | 286 meta_table_.Init( |
| 264 db_.Execute(base::StringPrintf("UPDATE omni_box_shortcuts " | 287 &db_, kCurrentVersionNumber, kCompatibleVersionNumber) && |
| 265 "SET type = 13 WHERE type = 9").c_str()) && | 288 // Migrate old SEARCH_OTHER_ENGINE values to the new type value. |
| 266 // Migrate old EXTENSION_APP values to the new type value. | 289 db_.Execute( |
| 267 db_.Execute(base::StringPrintf("UPDATE omni_box_shortcuts " | 290 "UPDATE omni_box_shortcuts SET type = 13 WHERE type = 9") && |
| 268 "SET type = 14 WHERE type = 10").c_str()) && | 291 // Migrate old EXTENSION_APP values to the new type value. |
| 269 // Migrate old CONTACT values to the new type value. | 292 db_.Execute( |
| 270 db_.Execute(base::StringPrintf("UPDATE omni_box_shortcuts " | 293 "UPDATE omni_box_shortcuts SET type = 14 WHERE type = 10") && |
| 271 "SET type = 15 WHERE type = 11").c_str()) && | 294 // Migrate old CONTACT values to the new type value. |
| 272 // Migrate old BOOKMARK_TITLE values to the new type value. | 295 db_.Execute( |
| 273 db_.Execute(base::StringPrintf("UPDATE omni_box_shortcuts " | 296 "UPDATE omni_box_shortcuts SET type = 15 WHERE type = 11") && |
| 274 "SET type = 16 WHERE type = 12").c_str()) && | 297 // Migrate old BOOKMARK_TITLE values to the new type value. |
| 275 transaction.Commit())) { | 298 db_.Execute( |
| 299 "UPDATE omni_box_shortcuts SET type = 16 WHERE type = 12") && | |
| 300 transaction.Commit())) { | |
| 276 return false; | 301 return false; |
| 277 } | 302 } |
| 278 } | 303 } |
| 279 return true; | 304 return true; |
| 280 } | 305 } |
| OLD | NEW |