Home | History | Annotate | Download | only in sql
      1 // Copyright (c) 2009 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 "app/sql/meta_table.h"
      6 
      7 #include "app/sql/connection.h"
      8 #include "app/sql/statement.h"
      9 #include "base/logging.h"
     10 #include "base/string_util.h"
     11 
     12 namespace sql {
     13 
     14 // Key used in our meta table for version numbers.
     15 static const char kVersionKey[] = "version";
     16 static const char kCompatibleVersionKey[] = "last_compatible_version";
     17 
     18 MetaTable::MetaTable() : db_(NULL) {
     19 }
     20 
     21 MetaTable::~MetaTable() {
     22 }
     23 
     24 // static
     25 bool MetaTable::DoesTableExist(sql::Connection* db) {
     26   DCHECK(db);
     27   return db->DoesTableExist("meta");
     28 }
     29 
     30 bool MetaTable::Init(Connection* db, int version, int compatible_version) {
     31   DCHECK(!db_ && db);
     32   db_ = db;
     33   if (!DoesTableExist(db)) {
     34     if (!db_->Execute("CREATE TABLE meta"
     35         "(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY,"
     36          "value LONGVARCHAR)"))
     37       return false;
     38 
     39     // Note: there is no index over the meta table. We currently only have a
     40     // couple of keys, so it doesn't matter. If we start storing more stuff in
     41     // there, we should create an index.
     42     SetVersionNumber(version);
     43     SetCompatibleVersionNumber(compatible_version);
     44   }
     45   return true;
     46 }
     47 
     48 void MetaTable::Reset() {
     49   db_ = NULL;
     50 }
     51 
     52 bool MetaTable::SetValue(const char* key, const std::string& value) {
     53   Statement s;
     54   if (!PrepareSetStatement(&s, key))
     55     return false;
     56   s.BindString(1, value);
     57   return s.Run();
     58 }
     59 
     60 bool MetaTable::GetValue(const char* key, std::string* value) {
     61   Statement s;
     62   if (!PrepareGetStatement(&s, key))
     63     return false;
     64 
     65   *value = s.ColumnString(0);
     66   return true;
     67 }
     68 
     69 bool MetaTable::SetValue(const char* key, int value) {
     70   Statement s;
     71   if (!PrepareSetStatement(&s, key))
     72     return false;
     73 
     74   s.BindInt(1, value);
     75   return s.Run();
     76 }
     77 
     78 bool MetaTable::GetValue(const char* key, int* value) {
     79   Statement s;
     80   if (!PrepareGetStatement(&s, key))
     81     return false;
     82 
     83   *value = s.ColumnInt(0);
     84   return true;
     85 }
     86 
     87 bool MetaTable::SetValue(const char* key, int64 value) {
     88   Statement s;
     89   if (!PrepareSetStatement(&s, key))
     90     return false;
     91   s.BindInt64(1, value);
     92   return s.Run();
     93 }
     94 
     95 bool MetaTable::GetValue(const char* key, int64* value) {
     96   Statement s;
     97   if (!PrepareGetStatement(&s, key))
     98     return false;
     99 
    100   *value = s.ColumnInt64(0);
    101   return true;
    102 }
    103 
    104 void MetaTable::SetVersionNumber(int version) {
    105   SetValue(kVersionKey, version);
    106 }
    107 
    108 int MetaTable::GetVersionNumber() {
    109   int version = 0;
    110   if (!GetValue(kVersionKey, &version))
    111     return 0;
    112   return version;
    113 }
    114 
    115 void MetaTable::SetCompatibleVersionNumber(int version) {
    116   SetValue(kCompatibleVersionKey, version);
    117 }
    118 
    119 int MetaTable::GetCompatibleVersionNumber() {
    120   int version = 0;
    121   if (!GetValue(kCompatibleVersionKey, &version))
    122     return 0;
    123   return version;
    124 }
    125 
    126 bool MetaTable::PrepareSetStatement(Statement* statement, const char* key) {
    127   DCHECK(db_ && statement);
    128   statement->Assign(db_->GetCachedStatement(SQL_FROM_HERE,
    129       "INSERT OR REPLACE INTO meta (key,value) VALUES (?,?)"));
    130   if (!statement->is_valid()) {
    131     NOTREACHED() << db_->GetErrorMessage();
    132     return false;
    133   }
    134   statement->BindCString(0, key);
    135   return true;
    136 }
    137 
    138 bool MetaTable::PrepareGetStatement(Statement* statement, const char* key) {
    139   DCHECK(db_ && statement);
    140   statement->Assign(db_->GetCachedStatement(SQL_FROM_HERE,
    141       "SELECT value FROM meta WHERE key=?"));
    142   if (!statement->is_valid()) {
    143     NOTREACHED() << db_->GetErrorMessage();
    144     return false;
    145   }
    146   statement->BindCString(0, key);
    147   if (!statement->Step())
    148     return false;
    149   return true;
    150 }
    151 
    152 }  // namespace sql
    153