CernVM-FS  2.12.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
history_sql.h
Go to the documentation of this file.
1 
5 #ifndef CVMFS_HISTORY_SQL_H_
6 #define CVMFS_HISTORY_SQL_H_
7 
8 #include <string>
9 
10 #include "history.h"
11 #include "sql.h"
12 
13 namespace history {
14 
20 class HistoryDatabase : public sqlite::Database<HistoryDatabase> {
21  public:
22  static const float kLatestSchema;
23  static const float kLatestSupportedSchema;
24  // backwards-compatible schema changes
25  static const unsigned kLatestSchemaRevision;
26 
27  static const std::string kFqrnKey;
28 
29  bool CreateEmptyDatabase();
30  bool InsertInitialValues(const std::string &repository_name);
31 
32  bool ContainsRecycleBin() const;
33 
36  bool CompactDatabase() const { return true; } // no implementation specific
37  // database compaction.
38  protected:
39  // TODO(rmeusel): C++11 - constructor inheritance
41  HistoryDatabase(const std::string &filename,
42  const OpenMode open_mode) :
43  sqlite::Database<HistoryDatabase>(filename, open_mode) {}
44 
45  private:
46  bool CreateTagsTable();
47  bool CreateRecycleBinTable();
48  bool CreateBranchesTable();
49 
53 };
54 
55 
56 //------------------------------------------------------------------------------
57 
58 
59 class SqlHistory : public sqlite::Sql {};
60 
61 
95 template <class MixinT>
96 class SqlRetrieveTag : public MixinT {
97  public:
105  History::Tag result;
106  result.name = MixinT::RetrieveString(0);
108  shash::HexPtr(MixinT::RetrieveString(1)),
110  result.revision = MixinT::RetrieveInt64(2);
111  result.timestamp = MixinT::RetrieveInt64(3);
112  result.description = MixinT::RetrieveString(5);
113  result.size = MixinT::RetrieveInt64(6);
114  result.branch = MixinT::RetrieveString(7);
115  return result;
116  }
117 };
118 
119 
120 class SqlInsertTag : public SqlHistory {
121  private:
122  static const std::string db_placeholders;
123 
124  public:
125  explicit SqlInsertTag(const HistoryDatabase *database);
126  bool BindTag(const History::Tag &tag);
127 };
128 
129 
130 class SqlRemoveTag : public SqlHistory {
131  public:
132  explicit SqlRemoveTag(const HistoryDatabase *database);
133  bool BindName(const std::string &name);
134 };
135 
136 
137 class SqlFindTag : public SqlRetrieveTag<SqlHistory> {
138  public:
139  explicit SqlFindTag(const HistoryDatabase *database);
140  bool BindName(const std::string &name);
141 };
142 
143 
144 class SqlFindTagByDate : public SqlRetrieveTag<SqlHistory> {
145  public:
146  explicit SqlFindTagByDate(const HistoryDatabase *database);
147  bool BindTimestamp(const time_t timestamp);
148 };
149 
150 
151 class SqlFindBranchHead : public SqlRetrieveTag<SqlHistory> {
152  public:
153  explicit SqlFindBranchHead(const HistoryDatabase *database);
154  bool BindBranchName(const std::string &branch_name);
155 };
156 
157 
158 class SqlCountTags : public SqlHistory {
159  public:
160  explicit SqlCountTags(const HistoryDatabase *database);
161  unsigned RetrieveCount() const;
162 };
163 
164 
165 class SqlListTags : public SqlRetrieveTag<SqlHistory> {
166  public:
167  explicit SqlListTags(const HistoryDatabase *database);
168 };
169 
170 
171 class SqlGetHashes : public SqlHistory {
172  public:
173  explicit SqlGetHashes(const HistoryDatabase *database);
174  shash::Any RetrieveHash() const;
175 };
176 
177 
178 class SqlListBranches : public SqlHistory {
179  public:
180  explicit SqlListBranches(const HistoryDatabase *database);
182 };
183 
184 
185 class SqlInsertBranch : public SqlHistory {
186  public:
187  explicit SqlInsertBranch(const HistoryDatabase *database);
188  bool BindBranch(const History::Branch &branch);
189 };
190 
191 
202 template <class MixinT, int offset = 0>
203 class SqlRollback : public MixinT {
204  public:
205  bool BindTargetTag(const History::Tag &target_tag) {
206  return MixinT::BindInt64(offset + 1, target_tag.revision) &&
207  MixinT::BindText(offset + 2, target_tag.name);
208  }
209 };
210 
211 
212 class SqlRollbackTag : public SqlRollback<SqlHistory> {
213  public:
214  explicit SqlRollbackTag(const HistoryDatabase *database);
215 };
216 
217 
218 class SqlListRollbackTags : public SqlRetrieveTag<SqlRollback<SqlHistory> > {
219  public:
220  explicit SqlListRollbackTags(const HistoryDatabase *database);
221 };
222 
223 
224 class SqlRecycleBin : public SqlHistory {
225  protected:
226  static const unsigned int kFlagCatalog = 1;
227 
228  bool CheckSchema(const HistoryDatabase *database) const;
229 };
230 
231 
233  public:
234  explicit SqlRecycleBinList(const HistoryDatabase *database);
236 };
237 
238 
240  public:
241  explicit SqlRecycleBinFlush(const HistoryDatabase *database);
242 };
243 
244 } // namespace history
245 
246 #endif // CVMFS_HISTORY_SQL_H_
History::Tag RetrieveTag() const
Definition: history_sql.h:104
bool BindTimestamp(const time_t timestamp)
Definition: history_sql.cc:297
static const float kLatestSchema
Definition: history_sql.h:22
unsigned RetrieveCount() const
Definition: history_sql.cc:326
SqlFindTag(const HistoryDatabase *database)
Definition: history_sql.cc:272
const std::string & filename() const
Definition: sql.h:148
bool CheckSchema(const HistoryDatabase *database) const
Definition: history_sql.cc:419
static const float kLatestSupportedSchema
Definition: history_sql.h:23
std::string name
Definition: history.h:88
static const std::string db_placeholders
Definition: history_sql.h:122
SqlFindTagByDate(const HistoryDatabase *database)
Definition: history_sql.cc:285
const history::History * history() const
shash::Any RetrieveHash() const
Definition: history_sql.cc:351
Database(const std::string &filename, const OpenMode open_mode)
SqlInsertTag(const HistoryDatabase *database)
Definition: history_sql.cc:235
SqlCountTags(const HistoryDatabase *database)
Definition: history_sql.cc:322
SqlListRollbackTags(const HistoryDatabase *database)
Definition: history_sql.cc:369
bool CompactDatabase() const
Definition: history_sql.h:36
SqlFindBranchHead(const HistoryDatabase *database)
Definition: history_sql.cc:305
bool InsertInitialValues(const std::string &repository_name)
Definition: history_sql.cc:87
std::string description
Definition: history.h:93
bool BindBranchName(const std::string &branch_name)
Definition: history_sql.cc:314
SqlRecycleBinFlush(const HistoryDatabase *database)
Definition: history_sql.cc:448
static const unsigned int kFlagCatalog
Definition: history_sql.h:226
bool BindName(const std::string &name)
Definition: history_sql.cc:277
bool BindTargetTag(const History::Tag &target_tag)
Definition: history_sql.h:205
const char kSuffixCatalog
Definition: hash.h:54
bool BindTag(const History::Tag &tag)
Definition: history_sql.cc:241
SqlListTags(const HistoryDatabase *database)
Definition: history_sql.cc:336
bool BindBranch(const History::Branch &branch)
Definition: history_sql.cc:408
SqlInsertBranch(const HistoryDatabase *database)
Definition: history_sql.cc:401
static const unsigned kLatestSchemaRevision
Definition: history_sql.h:25
SqlGetHashes(const HistoryDatabase *database)
Definition: history_sql.cc:346
HistoryDatabase(const std::string &filename, const OpenMode open_mode)
Definition: history_sql.h:41
static const std::string kFqrnKey
Definition: history_sql.h:27
bool BindName(const std::string &name)
Definition: history_sql.cc:264
shash::Any root_hash
Definition: history.h:89
std::string branch
Definition: history.h:97
Any MkFromHexPtr(const HexPtr hex, const char suffix)
Definition: hash.cc:83
SqlRemoveTag(const HistoryDatabase *database)
Definition: history_sql.cc:260
bool ContainsRecycleBin() const
Definition: history_sql.cc:93
uint64_t revision
Definition: history.h:91
History::Branch RetrieveBranch() const
Definition: history_sql.cc:389
SqlRecycleBinList(const HistoryDatabase *database)
Definition: history_sql.cc:428
SqlRollbackTag(const HistoryDatabase *database)
Definition: history_sql.cc:360
SqlListBranches(const HistoryDatabase *database)
Definition: history_sql.cc:380