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.
4
5 #include "storage/browser/database/databases_table.h"
6
7 #include "base/logging.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "sql/statement.h"
10
11 namespace storage {
12
DatabaseDetails()13 DatabaseDetails::DatabaseDetails() : estimated_size(0) { }
14
~DatabaseDetails()15 DatabaseDetails::~DatabaseDetails() {}
16
Init()17 bool DatabasesTable::Init() {
18 // 'Databases' schema:
19 // id A unique ID assigned to each database
20 // origin The originto which the database belongs. This is a
21 // string that can be used as part of a file name
22 // (http_webkit.org_0, for example).
23 // name The database name.
24 // description A short description of the database.
25 // estimated_size The estimated size of the database.
26 return db_->DoesTableExist("Databases") ||
27 (db_->Execute(
28 "CREATE TABLE Databases ("
29 "id INTEGER PRIMARY KEY AUTOINCREMENT, "
30 "origin TEXT NOT NULL, "
31 "name TEXT NOT NULL, "
32 "description TEXT NOT NULL, "
33 "estimated_size INTEGER NOT NULL)") &&
34 db_->Execute(
35 "CREATE INDEX origin_index ON Databases (origin)") &&
36 db_->Execute(
37 "CREATE UNIQUE INDEX unique_index ON Databases (origin, name)"));
38 }
39
GetDatabaseID(const std::string & origin_identifier,const base::string16 & database_name)40 int64 DatabasesTable::GetDatabaseID(const std::string& origin_identifier,
41 const base::string16& database_name) {
42 sql::Statement select_statement(db_->GetCachedStatement(
43 SQL_FROM_HERE, "SELECT id FROM Databases WHERE origin = ? AND name = ?"));
44 select_statement.BindString(0, origin_identifier);
45 select_statement.BindString16(1, database_name);
46
47 if (select_statement.Step()) {
48 return select_statement.ColumnInt64(0);
49 }
50
51 return -1;
52 }
53
GetDatabaseDetails(const std::string & origin_identifier,const base::string16 & database_name,DatabaseDetails * details)54 bool DatabasesTable::GetDatabaseDetails(const std::string& origin_identifier,
55 const base::string16& database_name,
56 DatabaseDetails* details) {
57 DCHECK(details);
58 sql::Statement select_statement(db_->GetCachedStatement(
59 SQL_FROM_HERE, "SELECT description, estimated_size FROM Databases "
60 "WHERE origin = ? AND name = ?"));
61 select_statement.BindString(0, origin_identifier);
62 select_statement.BindString16(1, database_name);
63
64 if (select_statement.Step()) {
65 details->origin_identifier = origin_identifier;
66 details->database_name = database_name;
67 details->description = select_statement.ColumnString16(0);
68 details->estimated_size = select_statement.ColumnInt64(1);
69 return true;
70 }
71
72 return false;
73 }
74
InsertDatabaseDetails(const DatabaseDetails & details)75 bool DatabasesTable::InsertDatabaseDetails(const DatabaseDetails& details) {
76 sql::Statement insert_statement(db_->GetCachedStatement(
77 SQL_FROM_HERE, "INSERT INTO Databases (origin, name, description, "
78 "estimated_size) VALUES (?, ?, ?, ?)"));
79 insert_statement.BindString(0, details.origin_identifier);
80 insert_statement.BindString16(1, details.database_name);
81 insert_statement.BindString16(2, details.description);
82 insert_statement.BindInt64(3, details.estimated_size);
83
84 return insert_statement.Run();
85 }
86
UpdateDatabaseDetails(const DatabaseDetails & details)87 bool DatabasesTable::UpdateDatabaseDetails(const DatabaseDetails& details) {
88 sql::Statement update_statement(db_->GetCachedStatement(
89 SQL_FROM_HERE, "UPDATE Databases SET description = ?, "
90 "estimated_size = ? WHERE origin = ? AND name = ?"));
91 update_statement.BindString16(0, details.description);
92 update_statement.BindInt64(1, details.estimated_size);
93 update_statement.BindString(2, details.origin_identifier);
94 update_statement.BindString16(3, details.database_name);
95
96 return (update_statement.Run() && db_->GetLastChangeCount());
97 }
98
DeleteDatabaseDetails(const std::string & origin_identifier,const base::string16 & database_name)99 bool DatabasesTable::DeleteDatabaseDetails(
100 const std::string& origin_identifier,
101 const base::string16& database_name) {
102 sql::Statement delete_statement(db_->GetCachedStatement(
103 SQL_FROM_HERE, "DELETE FROM Databases WHERE origin = ? AND name = ?"));
104 delete_statement.BindString(0, origin_identifier);
105 delete_statement.BindString16(1, database_name);
106
107 return (delete_statement.Run() && db_->GetLastChangeCount());
108 }
109
GetAllOriginIdentifiers(std::vector<std::string> * origin_identifiers)110 bool DatabasesTable::GetAllOriginIdentifiers(
111 std::vector<std::string>* origin_identifiers) {
112 sql::Statement statement(db_->GetCachedStatement(
113 SQL_FROM_HERE, "SELECT DISTINCT origin FROM Databases ORDER BY origin"));
114
115 while (statement.Step())
116 origin_identifiers->push_back(statement.ColumnString(0));
117
118 return statement.Succeeded();
119 }
120
GetAllDatabaseDetailsForOriginIdentifier(const std::string & origin_identifier,std::vector<DatabaseDetails> * details_vector)121 bool DatabasesTable::GetAllDatabaseDetailsForOriginIdentifier(
122 const std::string& origin_identifier,
123 std::vector<DatabaseDetails>* details_vector) {
124 sql::Statement statement(db_->GetCachedStatement(
125 SQL_FROM_HERE, "SELECT name, description, estimated_size "
126 "FROM Databases WHERE origin = ? ORDER BY name"));
127 statement.BindString(0, origin_identifier);
128
129 while (statement.Step()) {
130 DatabaseDetails details;
131 details.origin_identifier = origin_identifier;
132 details.database_name = statement.ColumnString16(0);
133 details.description = statement.ColumnString16(1);
134 details.estimated_size = statement.ColumnInt64(2);
135 details_vector->push_back(details);
136 }
137
138 return statement.Succeeded();
139 }
140
DeleteOriginIdentifier(const std::string & origin_identifier)141 bool DatabasesTable::DeleteOriginIdentifier(
142 const std::string& origin_identifier) {
143 sql::Statement delete_statement(db_->GetCachedStatement(
144 SQL_FROM_HERE, "DELETE FROM Databases WHERE origin = ?"));
145 delete_statement.BindString(0, origin_identifier);
146
147 return (delete_statement.Run() && db_->GetLastChangeCount());
148 }
149
150 } // namespace storage
151