|  | // 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 "storage/browser/database/databases_table.h" | 
|  |  | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include "base/logging.h" | 
|  | #include "base/strings/utf_string_conversions.h" | 
|  | #include "sql/statement.h" | 
|  |  | 
|  | namespace storage { | 
|  |  | 
|  | DatabaseDetails::DatabaseDetails() : estimated_size(0) { } | 
|  |  | 
|  | DatabaseDetails::DatabaseDetails(const DatabaseDetails& other) = default; | 
|  |  | 
|  | DatabaseDetails::~DatabaseDetails() {} | 
|  |  | 
|  | bool DatabasesTable::Init() { | 
|  | // 'Databases' schema: | 
|  | //   id              A unique ID assigned to each database | 
|  | //   origin          The originto which the database belongs. This is a | 
|  | //                   string that can be used as part of a file name | 
|  | //                   (http_webkit.org_0, for example). | 
|  | //   name            The database name. | 
|  | //   description     A short description of the database. | 
|  | //   estimated_size  The estimated size of the database. | 
|  | return db_->DoesTableExist("Databases") || | 
|  | (db_->Execute( | 
|  | "CREATE TABLE Databases (" | 
|  | "id INTEGER PRIMARY KEY AUTOINCREMENT, " | 
|  | "origin TEXT NOT NULL, " | 
|  | "name TEXT NOT NULL, " | 
|  | "description TEXT NOT NULL, " | 
|  | "estimated_size INTEGER NOT NULL)") && | 
|  | db_->Execute( | 
|  | "CREATE INDEX origin_index ON Databases (origin)") && | 
|  | db_->Execute( | 
|  | "CREATE UNIQUE INDEX unique_index ON Databases (origin, name)")); | 
|  | } | 
|  |  | 
|  | int64_t DatabasesTable::GetDatabaseID(const std::string& origin_identifier, | 
|  | const base::string16& database_name) { | 
|  | sql::Statement select_statement(db_->GetCachedStatement( | 
|  | SQL_FROM_HERE, "SELECT id FROM Databases WHERE origin = ? AND name = ?")); | 
|  | select_statement.BindString(0, origin_identifier); | 
|  | select_statement.BindString16(1, database_name); | 
|  |  | 
|  | if (select_statement.Step()) { | 
|  | return select_statement.ColumnInt64(0); | 
|  | } | 
|  |  | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | bool DatabasesTable::GetDatabaseDetails(const std::string& origin_identifier, | 
|  | const base::string16& database_name, | 
|  | DatabaseDetails* details) { | 
|  | DCHECK(details); | 
|  | sql::Statement select_statement(db_->GetCachedStatement( | 
|  | SQL_FROM_HERE, "SELECT description, estimated_size FROM Databases " | 
|  | "WHERE origin = ? AND name = ?")); | 
|  | select_statement.BindString(0, origin_identifier); | 
|  | select_statement.BindString16(1, database_name); | 
|  |  | 
|  | if (select_statement.Step()) { | 
|  | details->origin_identifier = origin_identifier; | 
|  | details->database_name = database_name; | 
|  | details->description = select_statement.ColumnString16(0); | 
|  | details->estimated_size = select_statement.ColumnInt64(1); | 
|  | return true; | 
|  | } | 
|  |  | 
|  | return false; | 
|  | } | 
|  |  | 
|  | bool DatabasesTable::InsertDatabaseDetails(const DatabaseDetails& details) { | 
|  | sql::Statement insert_statement(db_->GetCachedStatement( | 
|  | SQL_FROM_HERE, "INSERT INTO Databases (origin, name, description, " | 
|  | "estimated_size) VALUES (?, ?, ?, ?)")); | 
|  | insert_statement.BindString(0, details.origin_identifier); | 
|  | insert_statement.BindString16(1, details.database_name); | 
|  | insert_statement.BindString16(2, details.description); | 
|  | insert_statement.BindInt64(3, details.estimated_size); | 
|  |  | 
|  | return insert_statement.Run(); | 
|  | } | 
|  |  | 
|  | bool DatabasesTable::UpdateDatabaseDetails(const DatabaseDetails& details) { | 
|  | sql::Statement update_statement(db_->GetCachedStatement( | 
|  | SQL_FROM_HERE, "UPDATE Databases SET description = ?, " | 
|  | "estimated_size = ? WHERE origin = ? AND name = ?")); | 
|  | update_statement.BindString16(0, details.description); | 
|  | update_statement.BindInt64(1, details.estimated_size); | 
|  | update_statement.BindString(2, details.origin_identifier); | 
|  | update_statement.BindString16(3, details.database_name); | 
|  |  | 
|  | return (update_statement.Run() && db_->GetLastChangeCount()); | 
|  | } | 
|  |  | 
|  | bool DatabasesTable::DeleteDatabaseDetails( | 
|  | const std::string& origin_identifier, | 
|  | const base::string16& database_name) { | 
|  | sql::Statement delete_statement(db_->GetCachedStatement( | 
|  | SQL_FROM_HERE, "DELETE FROM Databases WHERE origin = ? AND name = ?")); | 
|  | delete_statement.BindString(0, origin_identifier); | 
|  | delete_statement.BindString16(1, database_name); | 
|  |  | 
|  | return (delete_statement.Run() && db_->GetLastChangeCount()); | 
|  | } | 
|  |  | 
|  | bool DatabasesTable::GetAllOriginIdentifiers( | 
|  | std::vector<std::string>* origin_identifiers) { | 
|  | sql::Statement statement(db_->GetCachedStatement( | 
|  | SQL_FROM_HERE, "SELECT DISTINCT origin FROM Databases ORDER BY origin")); | 
|  |  | 
|  | while (statement.Step()) | 
|  | origin_identifiers->push_back(statement.ColumnString(0)); | 
|  |  | 
|  | return statement.Succeeded(); | 
|  | } | 
|  |  | 
|  | bool DatabasesTable::GetAllDatabaseDetailsForOriginIdentifier( | 
|  | const std::string& origin_identifier, | 
|  | std::vector<DatabaseDetails>* details_vector) { | 
|  | sql::Statement statement(db_->GetCachedStatement( | 
|  | SQL_FROM_HERE, "SELECT name, description, estimated_size " | 
|  | "FROM Databases WHERE origin = ? ORDER BY name")); | 
|  | statement.BindString(0, origin_identifier); | 
|  |  | 
|  | while (statement.Step()) { | 
|  | DatabaseDetails details; | 
|  | details.origin_identifier = origin_identifier; | 
|  | details.database_name = statement.ColumnString16(0); | 
|  | details.description = statement.ColumnString16(1); | 
|  | details.estimated_size = statement.ColumnInt64(2); | 
|  | details_vector->push_back(details); | 
|  | } | 
|  |  | 
|  | return statement.Succeeded(); | 
|  | } | 
|  |  | 
|  | bool DatabasesTable::DeleteOriginIdentifier( | 
|  | const std::string& origin_identifier) { | 
|  | sql::Statement delete_statement(db_->GetCachedStatement( | 
|  | SQL_FROM_HERE, "DELETE FROM Databases WHERE origin = ?")); | 
|  | delete_statement.BindString(0, origin_identifier); | 
|  |  | 
|  | return (delete_statement.Run() && db_->GetLastChangeCount()); | 
|  | } | 
|  |  | 
|  | }  // namespace storage |