1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file.
4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/webdata/keyword_table.h"
6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "app/sql/statement.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/logging.h"
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/string_split.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/string_util.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/utf_string_conversions.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/history/history_database.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/search_engines/template_url.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "googleurl/src/gurl.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing base::Time;
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace {
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// ID of the url column in keywords.
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst int kUrlIdPosition = 16;
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Keys used in the meta table.
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kDefaultSearchProviderKey = "Default Search Provider ID";
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kBuiltinKeywordVersion = "Builtin Keyword Version";
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid BindURLToStatement(const TemplateURL& url, sql::Statement* s) {
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->BindString(0, UTF16ToUTF8(url.short_name()));
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->BindString(1, UTF16ToUTF8(url.keyword()));
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GURL favicon_url = url.GetFaviconURL();
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!favicon_url.is_valid()) {
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    s->BindString(2, std::string());
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else {
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    s->BindString(2, history::HistoryDatabase::GURLToDatabaseURL(
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        url.GetFaviconURL()));
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->BindString(3, url.url() ? url.url()->url() : std::string());
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->BindInt(4, url.safe_for_autoreplace() ? 1 : 0);
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!url.originating_url().is_valid()) {
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    s->BindString(5, std::string());
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else {
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    s->BindString(5, history::HistoryDatabase::GURLToDatabaseURL(
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        url.originating_url()));
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->BindInt64(6, url.date_created().ToTimeT());
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->BindInt(7, url.usage_count());
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->BindString(8, JoinString(url.input_encodings(), ';'));
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->BindInt(9, url.show_in_default_list() ? 1 : 0);
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->BindString(10, url.suggestions_url() ? url.suggestions_url()->url() :
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                std::string());
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->BindInt(11, url.prepopulate_id());
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->BindInt(12, url.autogenerate_keyword() ? 1 : 0);
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->BindInt(13, url.logo_id());
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->BindBool(14, url.created_by_policy());
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s->BindString(15, url.instant_url() ? url.instant_url()->url() :
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                std::string());
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // anonymous namespace
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenKeywordTable::~KeywordTable() {}
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool KeywordTable::Init() {
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!db_->DoesTableExist("keywords")) {
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!db_->Execute("CREATE TABLE keywords ("
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "id INTEGER PRIMARY KEY,"
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "short_name VARCHAR NOT NULL,"
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "keyword VARCHAR NOT NULL,"
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "favicon_url VARCHAR NOT NULL,"
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "url VARCHAR NOT NULL,"
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "show_in_default_list INTEGER,"
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "safe_for_autoreplace INTEGER,"
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "originating_url VARCHAR,"
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "date_created INTEGER DEFAULT 0,"
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "usage_count INTEGER DEFAULT 0,"
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "input_encodings VARCHAR,"
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "suggest_url VARCHAR,"
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "prepopulate_id INTEGER DEFAULT 0,"
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "autogenerate_keyword INTEGER DEFAULT 0,"
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "logo_id INTEGER DEFAULT 0,"
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "created_by_policy INTEGER DEFAULT 0,"
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "instant_url VARCHAR)")) {
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED();
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return false;
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return true;
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool KeywordTable::IsSyncable() {
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return true;
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool KeywordTable::AddKeyword(const TemplateURL& url) {
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(url.id());
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Be sure to change kUrlIdPosition if you add columns
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  sql::Statement s(db_->GetCachedStatement(SQL_FROM_HERE,
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "INSERT INTO keywords "
98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "(short_name, keyword, favicon_url, url, safe_for_autoreplace, "
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "originating_url, date_created, usage_count, input_encodings, "
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "show_in_default_list, suggest_url, prepopulate_id, "
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "autogenerate_keyword, logo_id, created_by_policy, instant_url, "
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "id) VALUES "
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"));
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!s) {
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NOTREACHED() << "Statement prepare failed";
106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  BindURLToStatement(url, &s);
109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindInt64(kUrlIdPosition, url.id());
110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!s.Run()) {
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NOTREACHED();
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return true;
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool KeywordTable::RemoveKeyword(TemplateURLID id) {
118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(id);
119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  sql::Statement s(
120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      db_->GetUniqueStatement("DELETE FROM keywords WHERE id = ?"));
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!s) {
122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NOTREACHED() << "Statement prepare failed";
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindInt64(0, id);
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return s.Run();
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool KeywordTable::GetKeywords(std::vector<TemplateURL*>* urls) {
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  sql::Statement s(db_->GetUniqueStatement(
131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "SELECT id, short_name, keyword, favicon_url, url, "
132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "safe_for_autoreplace, originating_url, date_created, "
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "usage_count, input_encodings, show_in_default_list, "
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "suggest_url, prepopulate_id, autogenerate_keyword, logo_id, "
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "created_by_policy, instant_url "
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "FROM keywords ORDER BY id ASC"));
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!s) {
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NOTREACHED() << "Statement prepare failed";
139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  while (s.Step()) {
142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    TemplateURL* template_url = new TemplateURL();
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    template_url->set_id(s.ColumnInt64(0));
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string tmp;
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    tmp = s.ColumnString(1);
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(!tmp.empty());
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    template_url->set_short_name(UTF8ToUTF16(tmp));
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    template_url->set_keyword(UTF8ToUTF16(s.ColumnString(2)));
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    tmp = s.ColumnString(3);
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!tmp.empty())
154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      template_url->SetFaviconURL(GURL(tmp));
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    template_url->SetURL(s.ColumnString(4), 0, 0);
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    template_url->set_safe_for_autoreplace(s.ColumnInt(5) == 1);
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    tmp = s.ColumnString(6);
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!tmp.empty())
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      template_url->set_originating_url(GURL(tmp));
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    template_url->set_date_created(Time::FromTimeT(s.ColumnInt64(7)));
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    template_url->set_usage_count(s.ColumnInt(8));
167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::vector<std::string> encodings;
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    base::SplitString(s.ColumnString(9), ';', &encodings);
170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    template_url->set_input_encodings(encodings);
171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    template_url->set_show_in_default_list(s.ColumnInt(10) == 1);
173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    template_url->SetSuggestionsURL(s.ColumnString(11), 0, 0);
175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    template_url->set_prepopulate_id(s.ColumnInt(12));
177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    template_url->set_autogenerate_keyword(s.ColumnInt(13) == 1);
179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    template_url->set_logo_id(s.ColumnInt(14));
181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    template_url->set_created_by_policy(s.ColumnBool(15));
183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    template_url->SetInstantURL(s.ColumnString(16), 0, 0);
185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    urls->push_back(template_url);
187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return s.Succeeded();
189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool KeywordTable::UpdateKeyword(const TemplateURL& url) {
192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(url.id());
193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Be sure to change kUrlIdPosition if you add columns
194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  sql::Statement s(db_->GetUniqueStatement(
195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "UPDATE keywords "
196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "SET short_name=?, keyword=?, favicon_url=?, url=?, "
197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "safe_for_autoreplace=?, originating_url=?, date_created=?, "
198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "usage_count=?, input_encodings=?, show_in_default_list=?, "
199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "suggest_url=?, prepopulate_id=?, autogenerate_keyword=?, "
200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "logo_id=?, created_by_policy=?, instant_url=? WHERE id=?"));
201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!s) {
202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NOTREACHED() << "Statement prepare failed";
203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  BindURLToStatement(url, &s);
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindInt64(kUrlIdPosition, url.id());
207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return s.Run();
208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool KeywordTable::SetDefaultSearchProviderID(int64 id) {
211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return meta_table_->SetValue(kDefaultSearchProviderKey, id);
212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenint64 KeywordTable::GetDefaulSearchProviderID() {
215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int64 value = 0;
216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  meta_table_->GetValue(kDefaultSearchProviderKey, &value);
217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return value;
218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool KeywordTable::SetBuitinKeywordVersion(int version) {
221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return meta_table_->SetValue(kBuiltinKeywordVersion, version);
222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenint KeywordTable::GetBuitinKeywordVersion() {
225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int version = 0;
226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  meta_table_->GetValue(kBuiltinKeywordVersion, &version);
227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return version;
228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool KeywordTable::MigrateToVersion21AutoGenerateKeywordColumn() {
231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return db_->Execute("ALTER TABLE keywords ADD COLUMN autogenerate_keyword "
232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "INTEGER DEFAULT 0");
233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool KeywordTable::MigrateToVersion25AddLogoIDColumn() {
236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return db_->Execute(
237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "ALTER TABLE keywords ADD COLUMN logo_id INTEGER DEFAULT 0");
238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool KeywordTable::MigrateToVersion26AddCreatedByPolicyColumn() {
241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return db_->Execute("ALTER TABLE keywords ADD COLUMN created_by_policy "
242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "INTEGER DEFAULT 0");
243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool KeywordTable::MigrateToVersion28SupportsInstantColumn() {
246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return db_->Execute("ALTER TABLE keywords ADD COLUMN supports_instant "
247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "INTEGER DEFAULT 0");
248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool KeywordTable::MigrateToVersion29InstantUrlToSupportsInstant() {
251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!db_->Execute("ALTER TABLE keywords ADD COLUMN instant_url VARCHAR"))
252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!db_->Execute("CREATE TABLE keywords_temp ("
255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    "id INTEGER PRIMARY KEY,"
256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    "short_name VARCHAR NOT NULL,"
257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    "keyword VARCHAR NOT NULL,"
258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    "favicon_url VARCHAR NOT NULL,"
259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    "url VARCHAR NOT NULL,"
260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    "show_in_default_list INTEGER,"
261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    "safe_for_autoreplace INTEGER,"
262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    "originating_url VARCHAR,"
263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    "date_created INTEGER DEFAULT 0,"
264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    "usage_count INTEGER DEFAULT 0,"
265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    "input_encodings VARCHAR,"
266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    "suggest_url VARCHAR,"
267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    "prepopulate_id INTEGER DEFAULT 0,"
268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    "autogenerate_keyword INTEGER DEFAULT 0,"
269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    "logo_id INTEGER DEFAULT 0,"
270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    "created_by_policy INTEGER DEFAULT 0,"
271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    "instant_url VARCHAR)")) {
272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!db_->Execute(
276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "INSERT INTO keywords_temp "
277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "SELECT id, short_name, keyword, favicon_url, url, "
278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "show_in_default_list, safe_for_autoreplace, originating_url, "
279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "date_created, usage_count, input_encodings, suggest_url, "
280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "prepopulate_id, autogenerate_keyword, logo_id, created_by_policy, "
281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "instant_url FROM keywords")) {
282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!db_->Execute("DROP TABLE keywords"))
286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!db_->Execute("ALTER TABLE keywords_temp RENAME TO keywords"))
289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return true;
292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
293