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
3 // found in the LICENSE file.
5 #include "chrome/browser/history/android/android_urls_database.h"
7 #include "base/logging.h"
11 AndroidURLsDatabase::AndroidURLsDatabase() {
14 AndroidURLsDatabase::~AndroidURLsDatabase() {
17 bool AndroidURLsDatabase::CreateAndroidURLsTable() {
18 const char* name = "android_urls";
19 if (!GetDB().DoesTableExist(name)) {
21 sql.append("CREATE TABLE ");
24 "id INTEGER PRIMARY KEY,"
25 "raw_url LONGVARCHAR," // Passed in raw url.
26 "url_id INTEGER NOT NULL" // url id in urls table.
28 if (!GetDB().Execute(sql.c_str())) {
29 LOG(ERROR) << GetDB().GetErrorMessage();
33 if (!GetDB().Execute("CREATE INDEX android_urls_raw_url_idx"
34 " ON android_urls(raw_url)")) {
35 LOG(ERROR) << GetDB().GetErrorMessage();
39 if (!GetDB().Execute("CREATE INDEX android_urls_url_id_idx"
40 " ON android_urls(url_id)")) {
41 LOG(ERROR) << GetDB().GetErrorMessage();
48 AndroidURLID AndroidURLsDatabase::AddAndroidURLRow(const std::string& raw_url,
50 if (GetAndroidURLRow(url_id, NULL)) {
51 LOG(ERROR) << "url_id already exist";
55 sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE,
56 "INSERT INTO android_urls (raw_url, url_id) VALUES (?, ?)"));
58 statement.BindString(0, raw_url);
59 statement.BindInt64(1, static_cast<int64>(url_id));
61 if (!statement.Run()) {
62 LOG(ERROR) << GetDB().GetErrorMessage();
65 return GetDB().GetLastInsertRowId();
68 bool AndroidURLsDatabase::GetAndroidURLRow(URLID url_id, AndroidURLRow* row) {
69 sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE,
70 "SELECT id, raw_url, url_id FROM android_urls WHERE url_id = ?"));
72 statement.BindInt64(0, url_id);
74 if (!statement.Step())
77 row->id = statement.ColumnInt64(0);
78 row->raw_url = statement.ColumnString(1);
79 row->url_id = statement.ColumnInt64(2);
84 bool AndroidURLsDatabase::DeleteAndroidURLRows(
85 const std::vector<URLID>& url_ids) {
90 sql.append("DELETE FROM android_urls ");
91 std::ostringstream oss;
93 for (std::vector<URLID>::const_iterator i = url_ids.begin();
94 i != url_ids.end(); ++i) {
103 sql.append(" WHERE url_id in ( ");
104 sql.append(oss.str());
108 if (!GetDB().Execute(sql.c_str())) {
109 LOG(ERROR) << GetDB().GetErrorMessage();
115 bool AndroidURLsDatabase::DeleteUnusedAndroidURLs() {
116 return GetDB().Execute("DELETE FROM android_urls WHERE url_id NOT IN ("
117 "SELECT id FROM urls)");
120 bool AndroidURLsDatabase::UpdateAndroidURLRow(AndroidURLID id,
121 const std::string& raw_url,
123 sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE,
124 "UPDATE android_urls SET raw_url = ?, url_id = ? WHERE id = ?"));
126 statement.BindString(0, raw_url);
127 statement.BindInt64(1, url_id);
128 statement.BindInt64(2, id);
130 if (!statement.is_valid()) {
131 LOG(ERROR) << GetDB().GetErrorMessage();
135 if (!statement.Run()) {
136 LOG(ERROR) << GetDB().GetErrorMessage();
143 bool AndroidURLsDatabase::ClearAndroidURLRows() {
144 // The android_urls table might not exist if the Android content provider is
145 // never used, especially in the unit tests. See http://b/6385692.
146 if (GetDB().DoesTableExist("android_urls"))
147 return GetDB().Execute("DELETE FROM android_urls");
152 bool AndroidURLsDatabase::MigrateToVersion22() {
153 if (!GetDB().DoesTableExist("android_urls"))
156 if (!GetDB().Execute("ALTER TABLE android_urls RENAME TO android_urls_tmp"))
159 if (!GetDB().Execute("DROP INDEX android_urls_raw_url_idx"))
162 if (!GetDB().Execute("DROP INDEX android_urls_url_id_idx"))
165 if (!CreateAndroidURLsTable())
168 if (!GetDB().Execute(
169 "INSERT INTO android_urls (id, raw_url, url_id) "
170 "SELECT id, raw_url, url_id FROM android_urls_tmp"))
173 if (!GetDB().Execute("DROP TABLE android_urls_tmp"))
179 } // namespace history