// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/webdata/web_intents_table.h" #include <string> #include "base/i18n/case_conversion.h" #include "base/logging.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "components/webdata/common/web_database.h" #include "net/base/mime_util.h" #include "sql/statement.h" #include "third_party/sqlite/sqlite3.h" #include "url/gurl.h" namespace { WebDatabaseTable::TypeKey GetKey() { // We just need a unique constant. Use the address of a static that // COMDAT folding won't touch in an optimizing linker. static int table_key = 0; return reinterpret_cast<void*>(&table_key); } } // namespace WebIntentsTable::WebIntentsTable() { } WebIntentsTable::~WebIntentsTable() { } WebIntentsTable* WebIntentsTable::FromWebDatabase(WebDatabase* db) { return static_cast<WebIntentsTable*>(db->GetTable(GetKey())); } WebDatabaseTable::TypeKey WebIntentsTable::GetTypeKey() const { return GetKey(); } bool WebIntentsTable::Init(sql::Connection* db, sql::MetaTable* meta_table) { WebDatabaseTable::Init(db, meta_table); if (!db_->DoesTableExist("web_intents")) { if (!db_->Execute("CREATE TABLE web_intents (" " service_url LONGVARCHAR," " action VARCHAR," " type VARCHAR," " title LONGVARCHAR," " disposition VARCHAR," " scheme VARCHAR," " UNIQUE (service_url, action, scheme, type))")) { return false; } if (!db_->Execute("CREATE INDEX IF NOT EXISTS web_intents_index" " ON web_intents (action)")) return false; if (!db_->Execute("CREATE INDEX IF NOT EXISTS web_intents_index" " ON web_intents (scheme)")) return false; } if (!db_->DoesTableExist("web_intents_defaults")) { if (!db_->Execute("CREATE TABLE web_intents_defaults (" " action VARCHAR," " type VARCHAR," " url_pattern LONGVARCHAR," " user_date INTEGER," " suppression INTEGER," " service_url LONGVARCHAR," " scheme VARCHAR," " UNIQUE (action, scheme, type, url_pattern))")) { return false; } if (!db_->Execute("CREATE INDEX IF NOT EXISTS web_intents_default_index" " ON web_intents_defaults (action)")) return false; if (!db_->Execute("CREATE INDEX IF NOT EXISTS web_intents_default_index" " ON web_intents_defaults (scheme)")) return false; } return true; } // TODO(jhawkins): Figure out Sync story. bool WebIntentsTable::IsSyncable() { return false; } bool WebIntentsTable::MigrateToVersion(int version, bool* update_compatible_version) { if (version == 46) { *update_compatible_version = true; return MigrateToVersion46AddSchemeColumn(); } return true; } // Updates the table by way of renaming the old tables, rerunning // the Init method, then selecting old values into the new tables. bool WebIntentsTable::MigrateToVersion46AddSchemeColumn() { if (!db_->Execute("ALTER TABLE web_intents RENAME TO old_web_intents")) { DLOG(WARNING) << "Could not backup web_intents table."; return false; } if (!db_->Execute("ALTER TABLE web_intents_defaults" " RENAME TO old_web_intents_defaults")) { DLOG(WARNING) << "Could not backup web_intents_defaults table."; return false; } if (!Init(db_, meta_table_)) return false; int error = db_->ExecuteAndReturnErrorCode( "INSERT INTO web_intents" " (service_url, action, type, title, disposition)" " SELECT " " service_url, action, type, title, disposition" " FROM old_web_intents"); if (error != SQLITE_OK) { DLOG(WARNING) << "Could not copy old intent data to upgraded table." << db_->GetErrorMessage(); } error = db_->ExecuteAndReturnErrorCode( "INSERT INTO web_intents_defaults" " (service_url, action, type, url_pattern, user_date, suppression)" " SELECT " " service_url, action, type, url_pattern, user_date, suppression" " FROM old_web_intents_defaults"); if (error != SQLITE_OK) { DLOG(WARNING) << "Could not copy old intent defaults to upgraded table." << db_->GetErrorMessage(); } if (!db_->Execute("DROP table old_web_intents")) { LOG(WARNING) << "Could not drop backup web_intents table."; return false; } if (!db_->Execute("DROP table old_web_intents_defaults")) { DLOG(WARNING) << "Could not drop backup web_intents_defaults table."; return false; } return true; }