GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/history_sql.cc
Date: 2026-09-27 02:40:09
Exec Total Coverage
Lines: 163 179 91.1%
Branches: 489 1012 48.3%

Line Branch Exec Source
1 /**
2 * This file is part of the CernVM File System.
3 */
4
5 #include "history_sql.h"
6
7 #include <cassert>
8
9 #include "util/string.h"
10
11 namespace history {
12
13 const float HistoryDatabase::kLatestSchema = 1.0;
14 const float HistoryDatabase::kLatestSupportedSchema = 1.0;
15 const unsigned HistoryDatabase::kLatestSchemaRevision = 3;
16
17 /**
18 * Database Schema ChangeLog:
19 *
20 * Schema Version 1.0
21 * -> Revision 3: deprecate (flush) table 'recycle_bin'
22 * add table 'branches'
23 * add column 'branch' to table tags
24 * -> Revision 2: add table 'recycle_bin'
25 * -> Revision 1: add field 'size'
26 *
27 */
28
29 const std::string HistoryDatabase::kFqrnKey = "fqrn";
30
31
32 /**
33 * This method creates a new database file and initializes the database schema.
34 */
35 1804 bool HistoryDatabase::CreateEmptyDatabase() {
36
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1804 times.
1804 assert(read_write());
37
38
3/6
✓ Branch 2 taken 1804 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1804 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1804 times.
✗ Branch 9 not taken.
3608 sqlite::Sql sql_foreign_keys(sqlite_db(), "PRAGMA foreign_keys = ON;");
39
2/4
✓ Branch 1 taken 1804 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1804 times.
1804 if (!sql_foreign_keys.Execute())
40 ✗ return false;
41
42
6/13
✓ Branch 1 taken 1804 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1804 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 1804 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1804 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1804 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1804 times.
✗ Branch 14 not taken.
1804 return CreateBranchesTable() && CreateTagsTable() && CreateRecycleBinTable();
43 1804 }
44
45
46 1804 bool HistoryDatabase::CreateTagsTable() {
47
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1804 times.
1804 assert(read_write());
48
3/6
✓ Branch 2 taken 1804 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1804 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1804 times.
✗ Branch 9 not taken.
3608 return sqlite::Sql(
49 sqlite_db(),
50 "CREATE TABLE tags (name TEXT, hash TEXT, revision INTEGER, "
51 " timestamp INTEGER, channel INTEGER, description TEXT, size "
52 "INTEGER, "
53 " branch TEXT, CONSTRAINT pk_tags PRIMARY KEY (name), "
54 " FOREIGN KEY (branch) REFERENCES branches (branch));")
55
1/2
✓ Branch 1 taken 1804 times.
✗ Branch 2 not taken.
3608 .Execute();
56 }
57
58
59 1870 bool HistoryDatabase::CreateRecycleBinTable() {
60
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1870 times.
1870 assert(read_write());
61
3/6
✓ Branch 2 taken 1870 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1870 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1870 times.
✗ Branch 9 not taken.
3740 return sqlite::Sql(sqlite_db(),
62 "CREATE TABLE recycle_bin (hash TEXT, flags INTEGER, "
63 " CONSTRAINT pk_hash PRIMARY KEY (hash))")
64
1/2
✓ Branch 1 taken 1870 times.
✗ Branch 2 not taken.
3740 .Execute();
65 }
66
67
68 1903 bool HistoryDatabase::CreateBranchesTable() {
69
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1903 times.
1903 assert(read_write());
70
71 sqlite::Sql sql_create(sqlite_db(),
72 "CREATE TABLE branches (branch TEXT, parent TEXT, "
73 "initial_revision INTEGER,"
74 " CONSTRAINT pk_branch PRIMARY KEY (branch), "
75 " FOREIGN KEY (parent) REFERENCES branches (branch), "
76 " CHECK ((branch <> '') OR (parent IS NULL)), "
77
3/6
✓ Branch 2 taken 1903 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1903 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1903 times.
✗ Branch 9 not taken.
3806 " CHECK ((branch = '') OR (parent IS NOT NULL)));");
78
1/2
✓ Branch 1 taken 1903 times.
✗ Branch 2 not taken.
1903 bool retval = sql_create.Execute();
79
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1903 times.
1903 if (!retval)
80 ✗ return false;
81
82 sqlite::Sql sql_init(
83 sqlite_db(),
84 "INSERT INTO branches (branch, parent, initial_revision) "
85
3/6
✓ Branch 2 taken 1903 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1903 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1903 times.
✗ Branch 9 not taken.
3806 "VALUES ('', NULL, 0);");
86
1/2
✓ Branch 1 taken 1903 times.
✗ Branch 2 not taken.
1903 retval = sql_init.Execute();
87 1903 return retval;
88 1903 }
89
90
91 1804 bool HistoryDatabase::InsertInitialValues(const std::string &repository_name) {
92
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1804 times.
1804 assert(read_write());
93
1/2
✓ Branch 2 taken 1804 times.
✗ Branch 3 not taken.
1804 return this->SetProperty(kFqrnKey, repository_name);
94 }
95
96
97 2964 bool HistoryDatabase::ContainsRecycleBin() const {
98
3/4
✓ Branch 1 taken 2964 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2832 times.
✓ Branch 5 taken 132 times.
2964 return schema_version() >= 1.0 - kSchemaEpsilon && schema_revision() >= 2;
99 }
100
101
102 731 bool HistoryDatabase::CheckSchemaCompatibility() {
103
1/2
✓ Branch 1 taken 731 times.
✗ Branch 2 not taken.
1462 return !((schema_version() < kLatestSupportedSchema - kSchemaEpsilon)
104
1/2
✓ Branch 1 taken 731 times.
✗ Branch 2 not taken.
1462 || (schema_version() > kLatestSchema + kSchemaEpsilon));
105 }
106
107
108 264 bool HistoryDatabase::LiveSchemaUpgradeIfNecessary() {
109
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 264 times.
264 assert(read_write());
110
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 264 times.
264 assert(IsEqualSchema(schema_version(), 1.0));
111
112
3/6
✓ Branch 2 taken 264 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 264 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 264 times.
✗ Branch 9 not taken.
528 sqlite::Sql sql_foreign_keys(sqlite_db(), "PRAGMA foreign_keys = ON;");
113
2/4
✓ Branch 1 taken 264 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 264 times.
264 if (!sql_foreign_keys.Execute())
114 ✗ return false;
115
2/2
✓ Branch 1 taken 165 times.
✓ Branch 2 taken 99 times.
264 if (schema_revision() == kLatestSchemaRevision) {
116 165 return true;
117 }
118
119
1/2
✓ Branch 2 taken 99 times.
✗ Branch 3 not taken.
198 LogCvmfs(kLogHistory, kLogDebug,
120 "upgrading history schema revision "
121 "%.2f (Rev: %d) to %.2f (Rev: %d)",
122 99 schema_version(), schema_revision(), kLatestSchema,
123 kLatestSchemaRevision);
124
125
1/2
✓ Branch 1 taken 99 times.
✗ Branch 2 not taken.
99 const bool success = UpgradeSchemaRevision_10_1()
126
2/4
✓ Branch 1 taken 99 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 99 times.
✗ Branch 4 not taken.
99 && UpgradeSchemaRevision_10_2()
127
3/6
✓ Branch 0 taken 99 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 99 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 99 times.
✗ Branch 6 not taken.
198 && UpgradeSchemaRevision_10_3();
128
129
3/6
✓ Branch 0 taken 99 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 99 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 99 times.
✗ Branch 6 not taken.
99 return success && StoreSchemaRevision();
130 264 }
131
132
133 99 bool HistoryDatabase::UpgradeSchemaRevision_10_1() {
134
2/2
✓ Branch 1 taken 66 times.
✓ Branch 2 taken 33 times.
99 if (schema_revision() > 0) {
135 66 return true;
136 }
137
138
3/6
✓ Branch 2 taken 33 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 33 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 33 times.
✗ Branch 9 not taken.
66 sqlite::Sql sql_upgrade(sqlite_db(), "ALTER TABLE tags ADD size INTEGER;");
139
2/4
✓ Branch 1 taken 33 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 33 times.
33 if (!sql_upgrade.Execute()) {
140 ✗ LogCvmfs(kLogHistory, kLogStderr, "failed to upgrade tags table");
141 ✗ return false;
142 }
143
144 33 set_schema_revision(1);
145 33 return true;
146 33 }
147
148
149 99 bool HistoryDatabase::UpgradeSchemaRevision_10_2() {
150
2/2
✓ Branch 1 taken 33 times.
✓ Branch 2 taken 66 times.
99 if (schema_revision() > 1) {
151 33 return true;
152 }
153
154
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 66 times.
66 if (!CreateRecycleBinTable()) {
155 ✗ LogCvmfs(kLogHistory, kLogStderr, "failed to upgrade history database");
156 ✗ return false;
157 }
158
159 66 set_schema_revision(2);
160 66 return true;
161 }
162
163
164 99 bool HistoryDatabase::UpgradeSchemaRevision_10_3() {
165
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 99 times.
99 if (schema_revision() > 2) {
166 ✗ return true;
167 }
168
169
2/4
✓ Branch 1 taken 99 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 99 times.
99 if (!CreateBranchesTable()) {
170 ✗ LogCvmfs(kLogHistory, kLogStderr, "failed to create branches table");
171 ✗ return false;
172 }
173
174 sqlite::Sql sql_upgrade(
175 sqlite_db(),
176
3/6
✓ Branch 2 taken 99 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 99 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 99 times.
✗ Branch 9 not taken.
198 "ALTER TABLE tags ADD branch TEXT REFERENCES branches (branch);");
177
2/4
✓ Branch 1 taken 99 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 99 times.
99 if (!sql_upgrade.Execute()) {
178 ✗ LogCvmfs(kLogHistory, kLogStderr, "failed to upgrade tags table");
179 ✗ return false;
180 }
181
182
3/6
✓ Branch 2 taken 99 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 99 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 99 times.
✗ Branch 9 not taken.
198 sqlite::Sql sql_fill(sqlite_db(), "UPDATE tags SET branch = '';");
183
2/4
✓ Branch 1 taken 99 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 99 times.
99 if (!sql_fill.Execute()) {
184 ✗ LogCvmfs(kLogHistory, kLogStderr, "failed to set branch default value");
185 ✗ return false;
186 }
187
188 // We keep the table in the schema for backwards compatibility
189
3/6
✓ Branch 2 taken 99 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 99 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 99 times.
✗ Branch 9 not taken.
198 sqlite::Sql sql_flush(sqlite_db(), "DELETE FROM recycle_bin; VACUUM;");
190
2/4
✓ Branch 1 taken 99 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 99 times.
99 if (!sql_flush.Execute()) {
191 ✗ LogCvmfs(kLogHistory, kLogStderr, "failed to flush recycle bin table");
192 ✗ return false;
193 }
194
195 99 set_schema_revision(3);
196 99 return true;
197 99 }
198
199
200 //------------------------------------------------------------------------------
201
202 #define DB_FIELDS_V1R0 \
203 "name, hash, revision, timestamp, channel, " \
204 "description, 0, ''"
205 #define DB_FIELDS_V1R1 \
206 "name, hash, revision, timestamp, channel, " \
207 "description, size, ''"
208 #define DB_FIELDS_V1R3 \
209 "name, hash, revision, timestamp, channel, " \
210 "description, size, branch"
211 #define DB_PLACEHOLDERS \
212 ":name, :hash, :revision, :timestamp, :channel, " \
213 ":description, :size, :branch"
214 #define ROLLBACK_COND \
215 "(revision > :target_rev OR " \
216 " name = :target_name) " \
217 "AND branch = ''"
218
219 #define MAKE_STATEMENT(STMT_TMPL, REV) \
220 static const std::string REV = ReplaceAll( \
221 ReplaceAll(ReplaceAll(STMT_TMPL, "@DB_FIELDS@", DB_FIELDS_##REV), \
222 "@DB_PLACEHOLDERS@", DB_PLACEHOLDERS), \
223 "@ROLLBACK_COND@", ROLLBACK_COND)
224
225 #define MAKE_STATEMENTS(STMT_TMPL) \
226 MAKE_STATEMENT(STMT_TMPL, V1R0); \
227 MAKE_STATEMENT(STMT_TMPL, V1R1); \
228 MAKE_STATEMENT(STMT_TMPL, V1R3)
229
230 #define DEFERRED_INIT(DB, REV) DeferredInit((DB)->sqlite_db(), (REV).c_str())
231
232 #define DEFERRED_INITS(DB) \
233 if ((DB)->IsEqualSchema((DB)->schema_version(), 1.0f) \
234 && (DB)->schema_revision() == 0) { \
235 DEFERRED_INIT((DB), V1R0); \
236 } else if ((DB)->schema_revision() < 3) { \
237 DEFERRED_INIT((DB), V1R1); \
238 } else { \
239 DEFERRED_INIT((DB), V1R3); \
240 }
241
242 2068 SqlInsertTag::SqlInsertTag(const HistoryDatabase *database) {
243
39/81
✓ Branch 0 taken 49 times.
✓ Branch 1 taken 2019 times.
✓ Branch 3 taken 49 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 49 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 49 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 49 times.
✗ Branch 16 not taken.
✓ Branch 19 taken 49 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 49 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 49 times.
✗ Branch 28 not taken.
✓ Branch 31 taken 49 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 49 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 49 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 49 times.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 60 taken 49 times.
✓ Branch 61 taken 2019 times.
✓ Branch 63 taken 49 times.
✗ Branch 64 not taken.
✓ Branch 67 taken 49 times.
✗ Branch 68 not taken.
✓ Branch 71 taken 49 times.
✗ Branch 72 not taken.
✓ Branch 75 taken 49 times.
✗ Branch 76 not taken.
✓ Branch 79 taken 49 times.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✓ Branch 83 taken 49 times.
✗ Branch 84 not taken.
✓ Branch 87 taken 49 times.
✗ Branch 88 not taken.
✓ Branch 91 taken 49 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 49 times.
✗ Branch 95 not taken.
✓ Branch 97 taken 49 times.
✗ Branch 98 not taken.
✓ Branch 100 taken 49 times.
✗ Branch 101 not taken.
✓ Branch 120 taken 49 times.
✓ Branch 121 taken 2019 times.
✓ Branch 123 taken 49 times.
✗ Branch 124 not taken.
✓ Branch 127 taken 49 times.
✗ Branch 128 not taken.
✓ Branch 131 taken 49 times.
✗ Branch 132 not taken.
✓ Branch 135 taken 49 times.
✗ Branch 136 not taken.
✓ Branch 139 taken 49 times.
✗ Branch 140 not taken.
✓ Branch 143 taken 49 times.
✗ Branch 144 not taken.
✓ Branch 147 taken 49 times.
✗ Branch 148 not taken.
✓ Branch 151 taken 49 times.
✗ Branch 152 not taken.
✓ Branch 154 taken 49 times.
✗ Branch 155 not taken.
✓ Branch 157 taken 49 times.
✗ Branch 158 not taken.
✓ Branch 160 taken 49 times.
✗ Branch 161 not taken.
✗ Branch 196 not taken.
✗ Branch 197 not taken.
✗ Branch 215 not taken.
✗ Branch 216 not taken.
✗ Branch 234 not taken.
✗ Branch 235 not taken.
2068 MAKE_STATEMENTS("INSERT INTO tags (@DB_FIELDS@) VALUES (@DB_PLACEHOLDERS@);");
244
6/21
✓ Branch 2 taken 2068 times.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 2068 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2068 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 2068 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✓ Branch 28 taken 2068 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 2068 times.
✗ Branch 32 not taken.
2068 DEFERRED_INITS(database);
245 2068 }
246
247
248 140475 bool SqlInsertTag::BindTag(const History::Tag &tag) {
249
3/9
✓ Branch 1 taken 140475 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 140475 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 140475 times.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
280950 return BindText(1, tag.name) && BindTextTransient(2, tag.root_hash.ToString())
250
0/2
✗ Branch 0 not taken.
✗ Branch 1 not taken.
140475 && // temporary (ToString)
251
4/9
✓ Branch 1 taken 140475 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 140475 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 140475 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 140475 times.
✗ Branch 9 not taken.
140475 BindInt64(3, tag.revision) && BindInt64(4, tag.timestamp) &&
252 // Channels are no longer supported: store 0 (i.e. kChannelTrunk)
253 // for backwards compatibility with existing databases
254 //
255
4/8
✓ Branch 1 taken 140475 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 140475 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 140475 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 140475 times.
✗ Branch 9 not taken.
140475 BindInt64(5, 0) && BindText(6, tag.description)
256
7/16
✓ Branch 1 taken 140475 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 140475 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 140475 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 140475 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 140475 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 140475 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 140475 times.
✗ Branch 16 not taken.
421425 && BindInt64(7, tag.size) && BindText(8, tag.branch);
257 }
258
259
260 //------------------------------------------------------------------------------
261
262
263 2068 SqlRemoveTag::SqlRemoveTag(const HistoryDatabase *database) {
264
2/4
✓ Branch 1 taken 2068 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2068 times.
✗ Branch 5 not taken.
2068 DeferredInit(database->sqlite_db(), "DELETE FROM tags WHERE name = :name;");
265 2068 }
266
267 396 bool SqlRemoveTag::BindName(const std::string &name) {
268 396 return BindText(1, name);
269 }
270
271
272 //------------------------------------------------------------------------------
273
274
275 2535 SqlFindTag::SqlFindTag(const HistoryDatabase *database) {
276
39/81
✓ Branch 0 taken 49 times.
✓ Branch 1 taken 2486 times.
✓ Branch 3 taken 49 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 49 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 49 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 49 times.
✗ Branch 16 not taken.
✓ Branch 19 taken 49 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 49 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 49 times.
✗ Branch 28 not taken.
✓ Branch 31 taken 49 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 49 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 49 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 49 times.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 60 taken 49 times.
✓ Branch 61 taken 2486 times.
✓ Branch 63 taken 49 times.
✗ Branch 64 not taken.
✓ Branch 67 taken 49 times.
✗ Branch 68 not taken.
✓ Branch 71 taken 49 times.
✗ Branch 72 not taken.
✓ Branch 75 taken 49 times.
✗ Branch 76 not taken.
✓ Branch 79 taken 49 times.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✓ Branch 83 taken 49 times.
✗ Branch 84 not taken.
✓ Branch 87 taken 49 times.
✗ Branch 88 not taken.
✓ Branch 91 taken 49 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 49 times.
✗ Branch 95 not taken.
✓ Branch 97 taken 49 times.
✗ Branch 98 not taken.
✓ Branch 100 taken 49 times.
✗ Branch 101 not taken.
✓ Branch 120 taken 49 times.
✓ Branch 121 taken 2486 times.
✓ Branch 123 taken 49 times.
✗ Branch 124 not taken.
✓ Branch 127 taken 49 times.
✗ Branch 128 not taken.
✓ Branch 131 taken 49 times.
✗ Branch 132 not taken.
✓ Branch 135 taken 49 times.
✗ Branch 136 not taken.
✓ Branch 139 taken 49 times.
✗ Branch 140 not taken.
✓ Branch 143 taken 49 times.
✗ Branch 144 not taken.
✓ Branch 147 taken 49 times.
✗ Branch 148 not taken.
✓ Branch 151 taken 49 times.
✗ Branch 152 not taken.
✓ Branch 154 taken 49 times.
✗ Branch 155 not taken.
✓ Branch 157 taken 49 times.
✗ Branch 158 not taken.
✓ Branch 160 taken 49 times.
✗ Branch 161 not taken.
✗ Branch 196 not taken.
✗ Branch 197 not taken.
✗ Branch 215 not taken.
✗ Branch 216 not taken.
✗ Branch 234 not taken.
✗ Branch 235 not taken.
2535 MAKE_STATEMENTS("SELECT @DB_FIELDS@ FROM tags WHERE name = :name;");
277
13/21
✓ Branch 2 taken 2535 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 33 times.
✓ Branch 6 taken 2502 times.
✓ Branch 7 taken 33 times.
✓ Branch 8 taken 2502 times.
✓ Branch 11 taken 33 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 33 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 66 times.
✓ Branch 18 taken 2436 times.
✓ Branch 21 taken 66 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 66 times.
✗ Branch 25 not taken.
✓ Branch 28 taken 2436 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 2436 times.
✗ Branch 32 not taken.
2535 DEFERRED_INITS(database);
278 2535 }
279
280 2012 bool SqlFindTag::BindName(const std::string &name) { return BindText(1, name); }
281
282
283 //------------------------------------------------------------------------------
284
285
286 2535 SqlFindTagByDate::SqlFindTagByDate(const HistoryDatabase *database) {
287 // figure out the tag that was HEAD to a given point in time
288 //
289 // conceptually goes back in the revision history | ORDER BY revision DESC
290 // and picks the first tag | LIMIT 1
291 // that is older than the given timestamp | WHICH timestamp <= :ts
292
39/81
✓ Branch 0 taken 49 times.
✓ Branch 1 taken 2486 times.
✓ Branch 3 taken 49 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 49 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 49 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 49 times.
✗ Branch 16 not taken.
✓ Branch 19 taken 49 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 49 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 49 times.
✗ Branch 28 not taken.
✓ Branch 31 taken 49 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 49 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 49 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 49 times.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 60 taken 49 times.
✓ Branch 61 taken 2486 times.
✓ Branch 63 taken 49 times.
✗ Branch 64 not taken.
✓ Branch 67 taken 49 times.
✗ Branch 68 not taken.
✓ Branch 71 taken 49 times.
✗ Branch 72 not taken.
✓ Branch 75 taken 49 times.
✗ Branch 76 not taken.
✓ Branch 79 taken 49 times.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✓ Branch 83 taken 49 times.
✗ Branch 84 not taken.
✓ Branch 87 taken 49 times.
✗ Branch 88 not taken.
✓ Branch 91 taken 49 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 49 times.
✗ Branch 95 not taken.
✓ Branch 97 taken 49 times.
✗ Branch 98 not taken.
✓ Branch 100 taken 49 times.
✗ Branch 101 not taken.
✓ Branch 120 taken 49 times.
✓ Branch 121 taken 2486 times.
✓ Branch 123 taken 49 times.
✗ Branch 124 not taken.
✓ Branch 127 taken 49 times.
✗ Branch 128 not taken.
✓ Branch 131 taken 49 times.
✗ Branch 132 not taken.
✓ Branch 135 taken 49 times.
✗ Branch 136 not taken.
✓ Branch 139 taken 49 times.
✗ Branch 140 not taken.
✓ Branch 143 taken 49 times.
✗ Branch 144 not taken.
✓ Branch 147 taken 49 times.
✗ Branch 148 not taken.
✓ Branch 151 taken 49 times.
✗ Branch 152 not taken.
✓ Branch 154 taken 49 times.
✗ Branch 155 not taken.
✓ Branch 157 taken 49 times.
✗ Branch 158 not taken.
✓ Branch 160 taken 49 times.
✗ Branch 161 not taken.
✗ Branch 196 not taken.
✗ Branch 197 not taken.
✗ Branch 215 not taken.
✗ Branch 216 not taken.
✗ Branch 234 not taken.
✗ Branch 235 not taken.
2535 MAKE_STATEMENTS("SELECT @DB_FIELDS@ FROM tags "
293 "WHERE (branch = '') AND (timestamp <= :timestamp) "
294 "ORDER BY revision DESC LIMIT 1;");
295
13/21
✓ Branch 2 taken 2535 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 33 times.
✓ Branch 6 taken 2502 times.
✓ Branch 7 taken 33 times.
✓ Branch 8 taken 2502 times.
✓ Branch 11 taken 33 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 33 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 66 times.
✓ Branch 18 taken 2436 times.
✓ Branch 21 taken 66 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 66 times.
✗ Branch 25 not taken.
✓ Branch 28 taken 2436 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 2436 times.
✗ Branch 32 not taken.
2535 DEFERRED_INITS(database);
296 2535 }
297
298 230 bool SqlFindTagByDate::BindTimestamp(const time_t timestamp) {
299 230 return BindInt64(1, timestamp);
300 }
301
302
303 //------------------------------------------------------------------------------
304
305
306 2068 SqlFindBranchHead::SqlFindBranchHead(const HistoryDatabase *database) {
307 // One of the tags with the highest revision on a given branch
308 // Doesn't work on older database revisions
309
39/81
✓ Branch 0 taken 49 times.
✓ Branch 1 taken 2019 times.
✓ Branch 3 taken 49 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 49 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 49 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 49 times.
✗ Branch 16 not taken.
✓ Branch 19 taken 49 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 49 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 49 times.
✗ Branch 28 not taken.
✓ Branch 31 taken 49 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 49 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 49 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 49 times.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 60 taken 49 times.
✓ Branch 61 taken 2019 times.
✓ Branch 63 taken 49 times.
✗ Branch 64 not taken.
✓ Branch 67 taken 49 times.
✗ Branch 68 not taken.
✓ Branch 71 taken 49 times.
✗ Branch 72 not taken.
✓ Branch 75 taken 49 times.
✗ Branch 76 not taken.
✓ Branch 79 taken 49 times.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✓ Branch 83 taken 49 times.
✗ Branch 84 not taken.
✓ Branch 87 taken 49 times.
✗ Branch 88 not taken.
✓ Branch 91 taken 49 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 49 times.
✗ Branch 95 not taken.
✓ Branch 97 taken 49 times.
✗ Branch 98 not taken.
✓ Branch 100 taken 49 times.
✗ Branch 101 not taken.
✓ Branch 120 taken 49 times.
✓ Branch 121 taken 2019 times.
✓ Branch 123 taken 49 times.
✗ Branch 124 not taken.
✓ Branch 127 taken 49 times.
✗ Branch 128 not taken.
✓ Branch 131 taken 49 times.
✗ Branch 132 not taken.
✓ Branch 135 taken 49 times.
✗ Branch 136 not taken.
✓ Branch 139 taken 49 times.
✗ Branch 140 not taken.
✓ Branch 143 taken 49 times.
✗ Branch 144 not taken.
✓ Branch 147 taken 49 times.
✗ Branch 148 not taken.
✓ Branch 151 taken 49 times.
✗ Branch 152 not taken.
✓ Branch 154 taken 49 times.
✗ Branch 155 not taken.
✓ Branch 157 taken 49 times.
✗ Branch 158 not taken.
✓ Branch 160 taken 49 times.
✗ Branch 161 not taken.
✗ Branch 196 not taken.
✗ Branch 197 not taken.
✗ Branch 215 not taken.
✗ Branch 216 not taken.
✗ Branch 234 not taken.
✗ Branch 235 not taken.
2068 MAKE_STATEMENTS("SELECT @DB_FIELDS@ FROM tags "
310 "WHERE (branch = :branch) "
311 "ORDER BY revision DESC LIMIT 1;");
312
6/21
✓ Branch 2 taken 2068 times.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 2068 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2068 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 2068 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✓ Branch 28 taken 2068 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 2068 times.
✗ Branch 32 not taken.
2068 DEFERRED_INITS(database);
313 2068 }
314
315 99 bool SqlFindBranchHead::BindBranchName(const std::string &branch_name) {
316 99 return BindText(1, branch_name);
317 }
318
319
320 //------------------------------------------------------------------------------
321
322
323 2535 SqlCountTags::SqlCountTags(const HistoryDatabase *database) {
324
2/4
✓ Branch 1 taken 2535 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2535 times.
✗ Branch 5 not taken.
2535 DeferredInit(database->sqlite_db(), "SELECT count(*) FROM tags;");
325 2535 }
326
327 957 unsigned SqlCountTags::RetrieveCount() const {
328 957 const int64_t count = RetrieveInt64(0);
329
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 957 times.
957 assert(count >= 0);
330 957 return static_cast<uint64_t>(count);
331 }
332
333
334 //------------------------------------------------------------------------------
335
336
337 2535 SqlListTags::SqlListTags(const HistoryDatabase *database) {
338
39/81
✓ Branch 0 taken 49 times.
✓ Branch 1 taken 2486 times.
✓ Branch 3 taken 49 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 49 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 49 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 49 times.
✗ Branch 16 not taken.
✓ Branch 19 taken 49 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 49 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 49 times.
✗ Branch 28 not taken.
✓ Branch 31 taken 49 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 49 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 49 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 49 times.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 60 taken 49 times.
✓ Branch 61 taken 2486 times.
✓ Branch 63 taken 49 times.
✗ Branch 64 not taken.
✓ Branch 67 taken 49 times.
✗ Branch 68 not taken.
✓ Branch 71 taken 49 times.
✗ Branch 72 not taken.
✓ Branch 75 taken 49 times.
✗ Branch 76 not taken.
✓ Branch 79 taken 49 times.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✓ Branch 83 taken 49 times.
✗ Branch 84 not taken.
✓ Branch 87 taken 49 times.
✗ Branch 88 not taken.
✓ Branch 91 taken 49 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 49 times.
✗ Branch 95 not taken.
✓ Branch 97 taken 49 times.
✗ Branch 98 not taken.
✓ Branch 100 taken 49 times.
✗ Branch 101 not taken.
✓ Branch 120 taken 49 times.
✓ Branch 121 taken 2486 times.
✓ Branch 123 taken 49 times.
✗ Branch 124 not taken.
✓ Branch 127 taken 49 times.
✗ Branch 128 not taken.
✓ Branch 131 taken 49 times.
✗ Branch 132 not taken.
✓ Branch 135 taken 49 times.
✗ Branch 136 not taken.
✓ Branch 139 taken 49 times.
✗ Branch 140 not taken.
✓ Branch 143 taken 49 times.
✗ Branch 144 not taken.
✓ Branch 147 taken 49 times.
✗ Branch 148 not taken.
✓ Branch 151 taken 49 times.
✗ Branch 152 not taken.
✓ Branch 154 taken 49 times.
✗ Branch 155 not taken.
✓ Branch 157 taken 49 times.
✗ Branch 158 not taken.
✓ Branch 160 taken 49 times.
✗ Branch 161 not taken.
✗ Branch 196 not taken.
✗ Branch 197 not taken.
✗ Branch 215 not taken.
✗ Branch 216 not taken.
✗ Branch 234 not taken.
✗ Branch 235 not taken.
2535 MAKE_STATEMENTS(
339 "SELECT @DB_FIELDS@ FROM tags ORDER BY timestamp DESC, revision DESC;");
340
13/21
✓ Branch 2 taken 2535 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 33 times.
✓ Branch 6 taken 2502 times.
✓ Branch 7 taken 33 times.
✓ Branch 8 taken 2502 times.
✓ Branch 11 taken 33 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 33 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 66 times.
✓ Branch 18 taken 2436 times.
✓ Branch 21 taken 66 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 66 times.
✗ Branch 25 not taken.
✓ Branch 28 taken 2436 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 2436 times.
✗ Branch 32 not taken.
2535 DEFERRED_INITS(database);
341 2535 }
342
343
344 //------------------------------------------------------------------------------
345
346
347 2535 SqlGetHashes::SqlGetHashes(const HistoryDatabase *database) {
348
2/4
✓ Branch 1 taken 2535 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2535 times.
✗ Branch 5 not taken.
2535 DeferredInit(database->sqlite_db(), "SELECT DISTINCT hash FROM tags "
349 "ORDER BY timestamp, revision ASC");
350 2535 }
351
352 66033 shash::Any SqlGetHashes::RetrieveHash() const {
353
1/2
✓ Branch 3 taken 66033 times.
✗ Branch 4 not taken.
132066 return shash::MkFromHexPtr(shash::HexPtr(RetrieveString(0)),
354 132066 shash::kSuffixCatalog);
355 }
356
357
358 //------------------------------------------------------------------------------
359
360
361 2068 SqlRollbackTag::SqlRollbackTag(const HistoryDatabase *database) {
362
39/81
✓ Branch 0 taken 49 times.
✓ Branch 1 taken 2019 times.
✓ Branch 3 taken 49 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 49 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 49 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 49 times.
✗ Branch 16 not taken.
✓ Branch 19 taken 49 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 49 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 49 times.
✗ Branch 28 not taken.
✓ Branch 31 taken 49 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 49 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 49 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 49 times.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 60 taken 49 times.
✓ Branch 61 taken 2019 times.
✓ Branch 63 taken 49 times.
✗ Branch 64 not taken.
✓ Branch 67 taken 49 times.
✗ Branch 68 not taken.
✓ Branch 71 taken 49 times.
✗ Branch 72 not taken.
✓ Branch 75 taken 49 times.
✗ Branch 76 not taken.
✓ Branch 79 taken 49 times.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✓ Branch 83 taken 49 times.
✗ Branch 84 not taken.
✓ Branch 87 taken 49 times.
✗ Branch 88 not taken.
✓ Branch 91 taken 49 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 49 times.
✗ Branch 95 not taken.
✓ Branch 97 taken 49 times.
✗ Branch 98 not taken.
✓ Branch 100 taken 49 times.
✗ Branch 101 not taken.
✓ Branch 120 taken 49 times.
✓ Branch 121 taken 2019 times.
✓ Branch 123 taken 49 times.
✗ Branch 124 not taken.
✓ Branch 127 taken 49 times.
✗ Branch 128 not taken.
✓ Branch 131 taken 49 times.
✗ Branch 132 not taken.
✓ Branch 135 taken 49 times.
✗ Branch 136 not taken.
✓ Branch 139 taken 49 times.
✗ Branch 140 not taken.
✓ Branch 143 taken 49 times.
✗ Branch 144 not taken.
✓ Branch 147 taken 49 times.
✗ Branch 148 not taken.
✓ Branch 151 taken 49 times.
✗ Branch 152 not taken.
✓ Branch 154 taken 49 times.
✗ Branch 155 not taken.
✓ Branch 157 taken 49 times.
✗ Branch 158 not taken.
✓ Branch 160 taken 49 times.
✗ Branch 161 not taken.
✗ Branch 196 not taken.
✗ Branch 197 not taken.
✗ Branch 215 not taken.
✗ Branch 216 not taken.
✗ Branch 234 not taken.
✗ Branch 235 not taken.
2068 MAKE_STATEMENTS("DELETE FROM tags WHERE @ROLLBACK_COND@;");
363
6/21
✓ Branch 2 taken 2068 times.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 2068 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2068 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 2068 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✓ Branch 28 taken 2068 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 2068 times.
✗ Branch 32 not taken.
2068 DEFERRED_INITS(database);
364 2068 }
365
366
367 //------------------------------------------------------------------------------
368
369
370 2535 SqlListRollbackTags::SqlListRollbackTags(const HistoryDatabase *database) {
371
39/81
✓ Branch 0 taken 49 times.
✓ Branch 1 taken 2486 times.
✓ Branch 3 taken 49 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 49 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 49 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 49 times.
✗ Branch 16 not taken.
✓ Branch 19 taken 49 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 49 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 49 times.
✗ Branch 28 not taken.
✓ Branch 31 taken 49 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 49 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 49 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 49 times.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 60 taken 49 times.
✓ Branch 61 taken 2486 times.
✓ Branch 63 taken 49 times.
✗ Branch 64 not taken.
✓ Branch 67 taken 49 times.
✗ Branch 68 not taken.
✓ Branch 71 taken 49 times.
✗ Branch 72 not taken.
✓ Branch 75 taken 49 times.
✗ Branch 76 not taken.
✓ Branch 79 taken 49 times.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✓ Branch 83 taken 49 times.
✗ Branch 84 not taken.
✓ Branch 87 taken 49 times.
✗ Branch 88 not taken.
✓ Branch 91 taken 49 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 49 times.
✗ Branch 95 not taken.
✓ Branch 97 taken 49 times.
✗ Branch 98 not taken.
✓ Branch 100 taken 49 times.
✗ Branch 101 not taken.
✓ Branch 120 taken 49 times.
✓ Branch 121 taken 2486 times.
✓ Branch 123 taken 49 times.
✗ Branch 124 not taken.
✓ Branch 127 taken 49 times.
✗ Branch 128 not taken.
✓ Branch 131 taken 49 times.
✗ Branch 132 not taken.
✓ Branch 135 taken 49 times.
✗ Branch 136 not taken.
✓ Branch 139 taken 49 times.
✗ Branch 140 not taken.
✓ Branch 143 taken 49 times.
✗ Branch 144 not taken.
✓ Branch 147 taken 49 times.
✗ Branch 148 not taken.
✓ Branch 151 taken 49 times.
✗ Branch 152 not taken.
✓ Branch 154 taken 49 times.
✗ Branch 155 not taken.
✓ Branch 157 taken 49 times.
✗ Branch 158 not taken.
✓ Branch 160 taken 49 times.
✗ Branch 161 not taken.
✗ Branch 196 not taken.
✗ Branch 197 not taken.
✗ Branch 215 not taken.
✗ Branch 216 not taken.
✗ Branch 234 not taken.
✗ Branch 235 not taken.
2535 MAKE_STATEMENTS("SELECT @DB_FIELDS@ FROM tags "
372 "WHERE @ROLLBACK_COND@ "
373 "ORDER BY revision DESC;");
374
13/21
✓ Branch 2 taken 2535 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 33 times.
✓ Branch 6 taken 2502 times.
✓ Branch 7 taken 33 times.
✓ Branch 8 taken 2502 times.
✓ Branch 11 taken 33 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 33 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 66 times.
✓ Branch 18 taken 2436 times.
✓ Branch 21 taken 66 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 66 times.
✗ Branch 25 not taken.
✓ Branch 28 taken 2436 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 2436 times.
✗ Branch 32 not taken.
2535 DEFERRED_INITS(database);
375 2535 }
376
377
378 //------------------------------------------------------------------------------
379
380
381 2535 SqlListBranches::SqlListBranches(const HistoryDatabase *database) {
382
2/2
✓ Branch 1 taken 99 times.
✓ Branch 2 taken 2436 times.
2535 if (database->schema_revision() < 3)
383
2/4
✓ Branch 1 taken 99 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 99 times.
✗ Branch 5 not taken.
99 DeferredInit(database->sqlite_db(), "SELECT '', NULL, 0;");
384 else
385
2/4
✓ Branch 1 taken 2436 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2436 times.
✗ Branch 5 not taken.
2436 DeferredInit(database->sqlite_db(),
386 "SELECT branch, parent, initial_revision FROM branches;");
387 2535 }
388
389
390 891 History::Branch SqlListBranches::RetrieveBranch() const {
391
1/2
✓ Branch 1 taken 891 times.
✗ Branch 2 not taken.
891 const std::string branch = RetrieveString(0);
392
1/2
✓ Branch 1 taken 891 times.
✗ Branch 2 not taken.
891 const std::string parent = (RetrieveType(1) == SQLITE_NULL)
393 ? ""
394
6/11
✓ Branch 0 taken 330 times.
✓ Branch 1 taken 561 times.
✓ Branch 4 taken 330 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 561 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 330 times.
✓ Branch 10 taken 561 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
891 : RetrieveString(1);
395
1/2
✓ Branch 1 taken 891 times.
✗ Branch 2 not taken.
891 const unsigned initial_revision = RetrieveInt64(2);
396
1/2
✓ Branch 1 taken 891 times.
✗ Branch 2 not taken.
1782 return History::Branch(branch, parent, initial_revision);
397 891 }
398
399
400 //------------------------------------------------------------------------------
401
402
403 2068 SqlInsertBranch::SqlInsertBranch(const HistoryDatabase *database) {
404
2/4
✓ Branch 1 taken 2068 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2068 times.
✗ Branch 5 not taken.
2068 DeferredInit(database->sqlite_db(),
405 "INSERT INTO branches (branch, parent, initial_revision) "
406 "VALUES (:branch, :parent, :initial_revision);");
407 2068 }
408
409
410 594 bool SqlInsertBranch::BindBranch(const History::Branch &branch) {
411
1/2
✓ Branch 2 taken 561 times.
✗ Branch 3 not taken.
1155 return BindText(1, branch.branch) && BindText(2, branch.parent)
412
3/4
✓ Branch 0 taken 561 times.
✓ Branch 1 taken 33 times.
✓ Branch 3 taken 561 times.
✗ Branch 4 not taken.
1155 && BindInt64(3, branch.initial_revision);
413 }
414
415
416 //------------------------------------------------------------------------------
417
418
419 4537 bool SqlRecycleBin::CheckSchema(const HistoryDatabase *database) const {
420 4537 return (database->IsEqualSchema(database->schema_version(), 1.0))
421
2/4
✓ Branch 0 taken 4537 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 4537 times.
✗ Branch 4 not taken.
4537 && (database->schema_revision() >= 2);
422 }
423
424
425 //------------------------------------------------------------------------------
426
427
428 2469 SqlRecycleBinList::SqlRecycleBinList(const HistoryDatabase *database) {
429
2/4
✓ Branch 1 taken 2469 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2469 times.
2469 assert(CheckSchema(database));
430
2/4
✓ Branch 1 taken 2469 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2469 times.
✗ Branch 5 not taken.
2469 DeferredInit(database->sqlite_db(), "SELECT hash, flags FROM recycle_bin;");
431 2469 }
432
433
434 33 shash::Any SqlRecycleBinList::RetrieveHash() {
435 33 const unsigned int flags = RetrieveInt64(1);
436 33 shash::Suffix suffix = shash::kSuffixNone;
437
1/2
✓ Branch 0 taken 33 times.
✗ Branch 1 not taken.
33 if (flags & SqlRecycleBin::kFlagCatalog) {
438 33 suffix = shash::kSuffixCatalog;
439 }
440
441
1/2
✓ Branch 3 taken 33 times.
✗ Branch 4 not taken.
33 return shash::MkFromHexPtr(shash::HexPtr(RetrieveString(0)), suffix);
442 }
443
444
445 //------------------------------------------------------------------------------
446
447
448 2068 SqlRecycleBinFlush::SqlRecycleBinFlush(const HistoryDatabase *database) {
449
2/4
✓ Branch 1 taken 2068 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2068 times.
2068 assert(CheckSchema(database));
450
2/4
✓ Branch 1 taken 2068 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2068 times.
✗ Branch 5 not taken.
2068 DeferredInit(database->sqlite_db(), "DELETE FROM recycle_bin;");
451 2068 }
452
453
454 }; /* namespace history */
455