// 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 "webkit/browser/database/databases_table.h" #include "base/logging.h" #include "base/strings/utf_string_conversions.h" #include "sql/statement.h" namespace webkit_database { DatabaseDetails::DatabaseDetails() : estimated_size(0) { } 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 DatabasesTable::GetDatabaseID(const base::string16& 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.BindString16(0, origin_identifier); select_statement.BindString16(1, database_name); if (select_statement.Step()) { return select_statement.ColumnInt64(0); } return -1; } bool DatabasesTable::GetDatabaseDetails(const base::string16& 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.BindString16(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.BindString16(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.BindString16(2, details.origin_identifier); update_statement.BindString16(3, details.database_name); return (update_statement.Run() && db_->GetLastChangeCount()); } bool DatabasesTable::DeleteDatabaseDetails( const base::string16& 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.BindString16(0, origin_identifier); delete_statement.BindString16(1, database_name); return (delete_statement.Run() && db_->GetLastChangeCount()); } bool DatabasesTable::GetAllOrigins(std::vector* origins) { sql::Statement statement(db_->GetCachedStatement( SQL_FROM_HERE, "SELECT DISTINCT origin FROM Databases ORDER BY origin")); while (statement.Step()) origins->push_back(statement.ColumnString16(0)); return statement.Succeeded(); } bool DatabasesTable::GetAllDatabaseDetailsForOrigin( const base::string16& origin_identifier, std::vector* details_vector) { sql::Statement statement(db_->GetCachedStatement( SQL_FROM_HERE, "SELECT name, description, estimated_size " "FROM Databases WHERE origin = ? ORDER BY name")); statement.BindString16(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::DeleteOrigin(const base::string16& origin_identifier) { sql::Statement delete_statement(db_->GetCachedStatement( SQL_FROM_HERE, "DELETE FROM Databases WHERE origin = ?")); delete_statement.BindString16(0, origin_identifier); return (delete_statement.Run() && db_->GetLastChangeCount()); } } // namespace webkit_database