| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2006-2008 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 "chrome/browser/meta_table_helper.h" | |
| 6 | |
| 7 #include "base/logging.h" | |
| 8 #include "base/string_util.h" | |
| 9 #include "chrome/common/sqlite_utils.h" | |
| 10 | |
| 11 // Key used in our meta table for version numbers. | |
| 12 static const char kVersionKey[] = "version"; | |
| 13 static const char kCompatibleVersionKey[] = "last_compatible_version"; | |
| 14 | |
| 15 MetaTableHelper::MetaTableHelper() : db_(NULL) { | |
| 16 } | |
| 17 | |
| 18 MetaTableHelper::~MetaTableHelper() { | |
| 19 } | |
| 20 | |
| 21 bool MetaTableHelper::Init(const std::string& db_name, | |
| 22 int version, | |
| 23 int compatible_version, | |
| 24 sqlite3* db) { | |
| 25 DCHECK(!db_ && db); | |
| 26 db_ = db; | |
| 27 db_name_ = db_name; | |
| 28 if (!DoesSqliteTableExist(db_, db_name.c_str(), "meta")) { | |
| 29 // Build the sql. | |
| 30 std::string sql("CREATE TABLE "); | |
| 31 appendMetaTableName(db_name, &sql); | |
| 32 sql.append("(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY," | |
| 33 "value LONGVARCHAR)"); | |
| 34 | |
| 35 if (sqlite3_exec(db_, sql.c_str(), NULL, NULL, NULL) != SQLITE_OK) | |
| 36 return false; | |
| 37 | |
| 38 // Note: there is no index over the meta table. We currently only have a | |
| 39 // couple of keys, so it doesn't matter. If we start storing more stuff in | |
| 40 // there, we should create an index. | |
| 41 SetVersionNumber(version); | |
| 42 SetCompatibleVersionNumber(compatible_version); | |
| 43 } | |
| 44 return true; | |
| 45 } | |
| 46 | |
| 47 bool MetaTableHelper::SetValue(const std::string& key, | |
| 48 const std::wstring& value) { | |
| 49 SQLStatement s; | |
| 50 if (!PrepareSetStatement(&s, key)) | |
| 51 return false; | |
| 52 s.bind_wstring(1, value); | |
| 53 return s.step() == SQLITE_DONE; | |
| 54 } | |
| 55 | |
| 56 bool MetaTableHelper::GetValue(const std::string& key, | |
| 57 std::wstring* value) { | |
| 58 DCHECK(value); | |
| 59 SQLStatement s; | |
| 60 if (!PrepareGetStatement(&s, key)) | |
| 61 return false; | |
| 62 | |
| 63 s.column_wstring(0, value); | |
| 64 return true; | |
| 65 } | |
| 66 | |
| 67 bool MetaTableHelper::SetValue(const std::string& key, | |
| 68 int value) { | |
| 69 SQLStatement s; | |
| 70 if (!PrepareSetStatement(&s, key)) | |
| 71 return false; | |
| 72 s.bind_int(1, value); | |
| 73 return s.step() == SQLITE_DONE; | |
| 74 } | |
| 75 | |
| 76 bool MetaTableHelper::GetValue(const std::string& key, | |
| 77 int* value) { | |
| 78 DCHECK(value); | |
| 79 SQLStatement s; | |
| 80 if (!PrepareGetStatement(&s, key)) | |
| 81 return false; | |
| 82 | |
| 83 *value = s.column_int(0); | |
| 84 return true; | |
| 85 } | |
| 86 | |
| 87 bool MetaTableHelper::SetValue(const std::string& key, | |
| 88 int64 value) { | |
| 89 SQLStatement s; | |
| 90 if (!PrepareSetStatement(&s, key)) | |
| 91 return false; | |
| 92 s.bind_int64(1, value); | |
| 93 return s.step() == SQLITE_DONE; | |
| 94 } | |
| 95 | |
| 96 bool MetaTableHelper::GetValue(const std::string& key, | |
| 97 int64* value) { | |
| 98 DCHECK(value); | |
| 99 SQLStatement s; | |
| 100 if (!PrepareGetStatement(&s, key)) | |
| 101 return false; | |
| 102 | |
| 103 *value = s.column_int64(0); | |
| 104 return true; | |
| 105 } | |
| 106 | |
| 107 void MetaTableHelper::SetVersionNumber(int version) { | |
| 108 SetValue(kVersionKey, version); | |
| 109 } | |
| 110 | |
| 111 int MetaTableHelper::GetVersionNumber() { | |
| 112 int version = 0; | |
| 113 if (!GetValue(kVersionKey, &version)) | |
| 114 return 0; | |
| 115 return version; | |
| 116 } | |
| 117 | |
| 118 void MetaTableHelper::SetCompatibleVersionNumber(int version) { | |
| 119 SetValue(kCompatibleVersionKey, version); | |
| 120 } | |
| 121 | |
| 122 int MetaTableHelper::GetCompatibleVersionNumber() { | |
| 123 int version = 0; | |
| 124 if (!GetValue(kCompatibleVersionKey, &version)) | |
| 125 return 0; | |
| 126 return version; | |
| 127 } | |
| 128 | |
| 129 // static | |
| 130 void MetaTableHelper::appendMetaTableName(const std::string& db_name, | |
| 131 std::string* sql) { | |
| 132 if (!db_name.empty()) { | |
| 133 sql->append(db_name); | |
| 134 sql->push_back('.'); | |
| 135 } | |
| 136 sql->append("meta"); | |
| 137 } | |
| 138 | |
| 139 bool MetaTableHelper::PrepareSetStatement(SQLStatement* statement, | |
| 140 const std::string& key) { | |
| 141 DCHECK(db_ && statement); | |
| 142 std::string sql("INSERT OR REPLACE INTO "); | |
| 143 appendMetaTableName(db_name_, &sql); | |
| 144 sql.append("(key,value) VALUES(?,?)"); | |
| 145 if (statement->prepare(db_, sql.c_str()) != SQLITE_OK) { | |
| 146 NOTREACHED() << sqlite3_errmsg(db_); | |
| 147 return false; | |
| 148 } | |
| 149 statement->bind_text(0, key.c_str()); | |
| 150 return true; | |
| 151 } | |
| 152 | |
| 153 bool MetaTableHelper::PrepareGetStatement(SQLStatement* statement, | |
| 154 const std::string& key) { | |
| 155 DCHECK(db_ && statement); | |
| 156 std::string sql("SELECT value FROM "); | |
| 157 appendMetaTableName(db_name_, &sql); | |
| 158 sql.append(" WHERE key = ?"); | |
| 159 if (statement->prepare(db_, sql.c_str()) != SQLITE_OK) { | |
| 160 NOTREACHED() << sqlite3_errmsg(db_); | |
| 161 return false; | |
| 162 } | |
| 163 statement->bind_string(0, key); | |
| 164 if (statement->step() != SQLITE_ROW) | |
| 165 return false; | |
| 166 return true; | |
| 167 } | |
| OLD | NEW |