| 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/keyword_table.h" | 5 #include "chrome/browser/webdata/keyword_table.h" | 
| 6 | 6 | 
| 7 #include "app/sql/statement.h" | 7 #include "app/sql/statement.h" | 
| 8 #include "base/logging.h" | 8 #include "base/logging.h" | 
| 9 #include "base/string_split.h" | 9 #include "base/string_split.h" | 
| 10 #include "base/string_util.h" | 10 #include "base/string_util.h" | 
| 11 #include "base/utf_string_conversions.h" | 11 #include "base/utf_string_conversions.h" | 
| 12 #include "chrome/browser/history/history_database.h" | 12 #include "chrome/browser/history/history_database.h" | 
| 13 #include "chrome/browser/search_engines/template_url.h" | 13 #include "chrome/browser/search_engines/template_url.h" | 
| 14 #include "googleurl/src/gurl.h" | 14 #include "googleurl/src/gurl.h" | 
| 15 | 15 | 
| 16 using base::Time; | 16 using base::Time; | 
| 17 | 17 | 
| 18 namespace { | 18 namespace { | 
| 19 | 19 | 
| 20 // ID of the url column in keywords. | 20 // ID of the url column in keywords. | 
| 21 const int kUrlIdPosition = 17; | 21 const int kUrlIdPosition = 18; | 
| 22 | 22 | 
| 23 // Keys used in the meta table. | 23 // Keys used in the meta table. | 
| 24 const char* kDefaultSearchProviderKey = "Default Search Provider ID"; | 24 const char* kDefaultSearchProviderKey = "Default Search Provider ID"; | 
| 25 const char* kBuiltinKeywordVersion = "Builtin Keyword Version"; | 25 const char* kBuiltinKeywordVersion = "Builtin Keyword Version"; | 
| 26 | 26 | 
| 27 void BindURLToStatement(const TemplateURL& url, sql::Statement* s) { | 27 void BindURLToStatement(const TemplateURL& url, sql::Statement* s) { | 
| 28   s->BindString(0, UTF16ToUTF8(url.short_name())); | 28   s->BindString(0, UTF16ToUTF8(url.short_name())); | 
| 29   s->BindString(1, UTF16ToUTF8(url.keyword())); | 29   s->BindString(1, UTF16ToUTF8(url.keyword())); | 
| 30   GURL favicon_url = url.GetFaviconURL(); | 30   GURL favicon_url = url.GetFaviconURL(); | 
| 31   if (!favicon_url.is_valid()) { | 31   if (!favicon_url.is_valid()) { | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
| 48   s->BindInt(9, url.show_in_default_list() ? 1 : 0); | 48   s->BindInt(9, url.show_in_default_list() ? 1 : 0); | 
| 49   s->BindString(10, url.suggestions_url() ? url.suggestions_url()->url() : | 49   s->BindString(10, url.suggestions_url() ? url.suggestions_url()->url() : | 
| 50                 std::string()); | 50                 std::string()); | 
| 51   s->BindInt(11, url.prepopulate_id()); | 51   s->BindInt(11, url.prepopulate_id()); | 
| 52   s->BindInt(12, url.autogenerate_keyword() ? 1 : 0); | 52   s->BindInt(12, url.autogenerate_keyword() ? 1 : 0); | 
| 53   s->BindInt(13, url.logo_id()); | 53   s->BindInt(13, url.logo_id()); | 
| 54   s->BindBool(14, url.created_by_policy()); | 54   s->BindBool(14, url.created_by_policy()); | 
| 55   s->BindString(15, url.instant_url() ? url.instant_url()->url() : | 55   s->BindString(15, url.instant_url() ? url.instant_url()->url() : | 
| 56                 std::string()); | 56                 std::string()); | 
| 57   s->BindInt64(16, url.last_modified().ToTimeT()); | 57   s->BindInt64(16, url.last_modified().ToTimeT()); | 
|  | 58   s->BindString(17, url.sync_guid()); | 
| 58 } | 59 } | 
| 59 }  // anonymous namespace | 60 }  // anonymous namespace | 
| 60 | 61 | 
| 61 KeywordTable::~KeywordTable() {} | 62 KeywordTable::~KeywordTable() {} | 
| 62 | 63 | 
| 63 bool KeywordTable::Init() { | 64 bool KeywordTable::Init() { | 
| 64   if (!db_->DoesTableExist("keywords")) { | 65   if (!db_->DoesTableExist("keywords")) { | 
| 65     if (!db_->Execute("CREATE TABLE keywords (" | 66     if (!db_->Execute("CREATE TABLE keywords (" | 
| 66                       "id INTEGER PRIMARY KEY," | 67                       "id INTEGER PRIMARY KEY," | 
| 67                       "short_name VARCHAR NOT NULL," | 68                       "short_name VARCHAR NOT NULL," | 
| 68                       "keyword VARCHAR NOT NULL," | 69                       "keyword VARCHAR NOT NULL," | 
| 69                       "favicon_url VARCHAR NOT NULL," | 70                       "favicon_url VARCHAR NOT NULL," | 
| 70                       "url VARCHAR NOT NULL," | 71                       "url VARCHAR NOT NULL," | 
| 71                       "show_in_default_list INTEGER," | 72                       "show_in_default_list INTEGER," | 
| 72                       "safe_for_autoreplace INTEGER," | 73                       "safe_for_autoreplace INTEGER," | 
| 73                       "originating_url VARCHAR," | 74                       "originating_url VARCHAR," | 
| 74                       "date_created INTEGER DEFAULT 0," | 75                       "date_created INTEGER DEFAULT 0," | 
| 75                       "usage_count INTEGER DEFAULT 0," | 76                       "usage_count INTEGER DEFAULT 0," | 
| 76                       "input_encodings VARCHAR," | 77                       "input_encodings VARCHAR," | 
| 77                       "suggest_url VARCHAR," | 78                       "suggest_url VARCHAR," | 
| 78                       "prepopulate_id INTEGER DEFAULT 0," | 79                       "prepopulate_id INTEGER DEFAULT 0," | 
| 79                       "autogenerate_keyword INTEGER DEFAULT 0," | 80                       "autogenerate_keyword INTEGER DEFAULT 0," | 
| 80                       "logo_id INTEGER DEFAULT 0," | 81                       "logo_id INTEGER DEFAULT 0," | 
| 81                       "created_by_policy INTEGER DEFAULT 0," | 82                       "created_by_policy INTEGER DEFAULT 0," | 
| 82                       "instant_url VARCHAR," | 83                       "instant_url VARCHAR," | 
| 83                       "last_modified INTEGER DEFAULT 0)")) { | 84                       "last_modified INTEGER DEFAULT 0," | 
|  | 85                       "sync_guid VARCHAR)")) { | 
| 84       NOTREACHED(); | 86       NOTREACHED(); | 
| 85       return false; | 87       return false; | 
| 86     } | 88     } | 
| 87   } | 89   } | 
| 88   return true; | 90   return true; | 
| 89 } | 91 } | 
| 90 | 92 | 
| 91 bool KeywordTable::IsSyncable() { | 93 bool KeywordTable::IsSyncable() { | 
| 92   return true; | 94   return true; | 
| 93 } | 95 } | 
| 94 | 96 | 
| 95 bool KeywordTable::AddKeyword(const TemplateURL& url) { | 97 bool KeywordTable::AddKeyword(const TemplateURL& url) { | 
| 96   DCHECK(url.id()); | 98   DCHECK(url.id()); | 
| 97   // Be sure to change kUrlIdPosition if you add columns | 99   // Be sure to change kUrlIdPosition if you add columns | 
| 98   sql::Statement s(db_->GetCachedStatement(SQL_FROM_HERE, | 100   sql::Statement s(db_->GetCachedStatement(SQL_FROM_HERE, | 
| 99       "INSERT INTO keywords " | 101       "INSERT INTO keywords " | 
| 100       "(short_name, keyword, favicon_url, url, safe_for_autoreplace, " | 102       "(short_name, keyword, favicon_url, url, safe_for_autoreplace, " | 
| 101       "originating_url, date_created, usage_count, input_encodings, " | 103       "originating_url, date_created, usage_count, input_encodings, " | 
| 102       "show_in_default_list, suggest_url, prepopulate_id, " | 104       "show_in_default_list, suggest_url, prepopulate_id, " | 
| 103       "autogenerate_keyword, logo_id, created_by_policy, instant_url, " | 105       "autogenerate_keyword, logo_id, created_by_policy, instant_url, " | 
| 104       "last_modified, id) VALUES " | 106       "last_modified, sync_guid, id) VALUES " | 
| 105       "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)")); | 107       "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)")); | 
| 106   if (!s) { | 108   if (!s) { | 
| 107     NOTREACHED() << "Statement prepare failed"; | 109     NOTREACHED() << "Statement prepare failed"; | 
| 108     return false; | 110     return false; | 
| 109   } | 111   } | 
| 110   BindURLToStatement(url, &s); | 112   BindURLToStatement(url, &s); | 
| 111   s.BindInt64(kUrlIdPosition, url.id()); | 113   s.BindInt64(kUrlIdPosition, url.id()); | 
| 112   if (!s.Run()) { | 114   if (!s.Run()) { | 
| 113     NOTREACHED(); | 115     NOTREACHED(); | 
| 114     return false; | 116     return false; | 
| 115   } | 117   } | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 127   s.BindInt64(0, id); | 129   s.BindInt64(0, id); | 
| 128   return s.Run(); | 130   return s.Run(); | 
| 129 } | 131 } | 
| 130 | 132 | 
| 131 bool KeywordTable::GetKeywords(std::vector<TemplateURL*>* urls) { | 133 bool KeywordTable::GetKeywords(std::vector<TemplateURL*>* urls) { | 
| 132   sql::Statement s(db_->GetUniqueStatement( | 134   sql::Statement s(db_->GetUniqueStatement( | 
| 133       "SELECT id, short_name, keyword, favicon_url, url, " | 135       "SELECT id, short_name, keyword, favicon_url, url, " | 
| 134       "safe_for_autoreplace, originating_url, date_created, " | 136       "safe_for_autoreplace, originating_url, date_created, " | 
| 135       "usage_count, input_encodings, show_in_default_list, " | 137       "usage_count, input_encodings, show_in_default_list, " | 
| 136       "suggest_url, prepopulate_id, autogenerate_keyword, logo_id, " | 138       "suggest_url, prepopulate_id, autogenerate_keyword, logo_id, " | 
| 137       "created_by_policy, instant_url, last_modified " | 139       "created_by_policy, instant_url, last_modified, sync_guid " | 
| 138       "FROM keywords ORDER BY id ASC")); | 140       "FROM keywords ORDER BY id ASC")); | 
| 139   if (!s) { | 141   if (!s) { | 
| 140     NOTREACHED() << "Statement prepare failed"; | 142     NOTREACHED() << "Statement prepare failed"; | 
| 141     return false; | 143     return false; | 
| 142   } | 144   } | 
| 143   while (s.Step()) { | 145   while (s.Step()) { | 
| 144     TemplateURL* template_url = new TemplateURL(); | 146     TemplateURL* template_url = new TemplateURL(); | 
| 145     template_url->set_id(s.ColumnInt64(0)); | 147     template_url->set_id(s.ColumnInt64(0)); | 
| 146 | 148 | 
| 147     std::string tmp; | 149     std::string tmp; | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 180     template_url->set_autogenerate_keyword(s.ColumnInt(13) == 1); | 182     template_url->set_autogenerate_keyword(s.ColumnInt(13) == 1); | 
| 181 | 183 | 
| 182     template_url->set_logo_id(s.ColumnInt(14)); | 184     template_url->set_logo_id(s.ColumnInt(14)); | 
| 183 | 185 | 
| 184     template_url->set_created_by_policy(s.ColumnBool(15)); | 186     template_url->set_created_by_policy(s.ColumnBool(15)); | 
| 185 | 187 | 
| 186     template_url->SetInstantURL(s.ColumnString(16), 0, 0); | 188     template_url->SetInstantURL(s.ColumnString(16), 0, 0); | 
| 187 | 189 | 
| 188     template_url->set_last_modified(Time::FromTimeT(s.ColumnInt64(17))); | 190     template_url->set_last_modified(Time::FromTimeT(s.ColumnInt64(17))); | 
| 189 | 191 | 
|  | 192     template_url->set_sync_guid(s.ColumnString(18)); | 
|  | 193 | 
| 190     urls->push_back(template_url); | 194     urls->push_back(template_url); | 
| 191   } | 195   } | 
| 192   return s.Succeeded(); | 196   return s.Succeeded(); | 
| 193 } | 197 } | 
| 194 | 198 | 
| 195 bool KeywordTable::UpdateKeyword(const TemplateURL& url) { | 199 bool KeywordTable::UpdateKeyword(const TemplateURL& url) { | 
| 196   DCHECK(url.id()); | 200   DCHECK(url.id()); | 
| 197   // Be sure to change kUrlIdPosition if you add columns | 201   // Be sure to change kUrlIdPosition if you add columns | 
| 198   sql::Statement s(db_->GetUniqueStatement( | 202   sql::Statement s(db_->GetUniqueStatement( | 
| 199       "UPDATE keywords " | 203       "UPDATE keywords " | 
| 200       "SET short_name=?, keyword=?, favicon_url=?, url=?, " | 204       "SET short_name=?, keyword=?, favicon_url=?, url=?, " | 
| 201       "safe_for_autoreplace=?, originating_url=?, date_created=?, " | 205       "safe_for_autoreplace=?, originating_url=?, date_created=?, " | 
| 202       "usage_count=?, input_encodings=?, show_in_default_list=?, " | 206       "usage_count=?, input_encodings=?, show_in_default_list=?, " | 
| 203       "suggest_url=?, prepopulate_id=?, autogenerate_keyword=?, " | 207       "suggest_url=?, prepopulate_id=?, autogenerate_keyword=?, " | 
| 204       "logo_id=?, created_by_policy=?, instant_url=?, last_modified=? " | 208       "logo_id=?, created_by_policy=?, instant_url=?, last_modified=?, " | 
| 205       "WHERE id=?")); | 209       "sync_guid=? WHERE id=?")); | 
| 206   if (!s) { | 210   if (!s) { | 
| 207     NOTREACHED() << "Statement prepare failed"; | 211     NOTREACHED() << "Statement prepare failed"; | 
| 208     return false; | 212     return false; | 
| 209   } | 213   } | 
| 210   BindURLToStatement(url, &s); | 214   BindURLToStatement(url, &s); | 
| 211   s.BindInt64(kUrlIdPosition, url.id()); | 215   s.BindInt64(kUrlIdPosition, url.id()); | 
| 212   return s.Run(); | 216   return s.Run(); | 
| 213 } | 217 } | 
| 214 | 218 | 
| 215 bool KeywordTable::SetDefaultSearchProviderID(int64 id) { | 219 bool KeywordTable::SetDefaultSearchProviderID(int64 id) { | 
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 294   if (!db_->Execute("ALTER TABLE keywords_temp RENAME TO keywords")) | 298   if (!db_->Execute("ALTER TABLE keywords_temp RENAME TO keywords")) | 
| 295     return false; | 299     return false; | 
| 296 | 300 | 
| 297   return true; | 301   return true; | 
| 298 } | 302 } | 
| 299 | 303 | 
| 300 bool KeywordTable::MigrateToVersion38AddLastModifiedColumn() { | 304 bool KeywordTable::MigrateToVersion38AddLastModifiedColumn() { | 
| 301   return db_->Execute( | 305   return db_->Execute( | 
| 302       "ALTER TABLE keywords ADD COLUMN last_modified INTEGER DEFAULT 0"); | 306       "ALTER TABLE keywords ADD COLUMN last_modified INTEGER DEFAULT 0"); | 
| 303 } | 307 } | 
|  | 308 | 
|  | 309 bool KeywordTable::MigrateToVersion39AddSyncGUIDColumn() { | 
|  | 310   return db_->Execute( | 
|  | 311       "ALTER TABLE keywords ADD COLUMN sync_guid VARCHAR"); | 
|  | 312 } | 
| OLD | NEW | 
|---|