// Copyright (c) 2009 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 "app/sql/meta_table.h" #include "app/sql/connection.h" #include "app/sql/statement.h" #include "base/logging.h" #include "base/string_util.h" namespace sql { // Key used in our meta table for version numbers. static const char kVersionKey[] = "version"; static const char kCompatibleVersionKey[] = "last_compatible_version"; MetaTable::MetaTable() : db_(NULL) { } MetaTable::~MetaTable() { } // static bool MetaTable::DoesTableExist(sql::Connection* db) { DCHECK(db); return db->DoesTableExist("meta"); } bool MetaTable::Init(Connection* db, int version, int compatible_version) { DCHECK(!db_ && db); db_ = db; if (!DoesTableExist(db)) { if (!db_->Execute("CREATE TABLE meta" "(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY," "value LONGVARCHAR)")) return false; // Note: there is no index over the meta table. We currently only have a // couple of keys, so it doesn't matter. If we start storing more stuff in // there, we should create an index. SetVersionNumber(version); SetCompatibleVersionNumber(compatible_version); } return true; } void MetaTable::Reset() { db_ = NULL; } bool MetaTable::SetValue(const char* key, const std::string& value) { Statement s; if (!PrepareSetStatement(&s, key)) return false; s.BindString(1, value); return s.Run(); } bool MetaTable::GetValue(const char* key, std::string* value) { Statement s; if (!PrepareGetStatement(&s, key)) return false; *value = s.ColumnString(0); return true; } bool MetaTable::SetValue(const char* key, int value) { Statement s; if (!PrepareSetStatement(&s, key)) return false; s.BindInt(1, value); return s.Run(); } bool MetaTable::GetValue(const char* key, int* value) { Statement s; if (!PrepareGetStatement(&s, key)) return false; *value = s.ColumnInt(0); return true; } bool MetaTable::SetValue(const char* key, int64 value) { Statement s; if (!PrepareSetStatement(&s, key)) return false; s.BindInt64(1, value); return s.Run(); } bool MetaTable::GetValue(const char* key, int64* value) { Statement s; if (!PrepareGetStatement(&s, key)) return false; *value = s.ColumnInt64(0); return true; } void MetaTable::SetVersionNumber(int version) { SetValue(kVersionKey, version); } int MetaTable::GetVersionNumber() { int version = 0; if (!GetValue(kVersionKey, &version)) return 0; return version; } void MetaTable::SetCompatibleVersionNumber(int version) { SetValue(kCompatibleVersionKey, version); } int MetaTable::GetCompatibleVersionNumber() { int version = 0; if (!GetValue(kCompatibleVersionKey, &version)) return 0; return version; } bool MetaTable::PrepareSetStatement(Statement* statement, const char* key) { DCHECK(db_ && statement); statement->Assign(db_->GetCachedStatement(SQL_FROM_HERE, "INSERT OR REPLACE INTO meta (key,value) VALUES (?,?)")); if (!statement->is_valid()) { NOTREACHED() << db_->GetErrorMessage(); return false; } statement->BindCString(0, key); return true; } bool MetaTable::PrepareGetStatement(Statement* statement, const char* key) { DCHECK(db_ && statement); statement->Assign(db_->GetCachedStatement(SQL_FROM_HERE, "SELECT value FROM meta WHERE key=?")); if (!statement->is_valid()) { NOTREACHED() << db_->GetErrorMessage(); return false; } statement->BindCString(0, key); if (!statement->Step()) return false; return true; } } // namespace sql