GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/reflog_sql.cc
Date: 2025-07-27 02:42:09
Exec Total Coverage
Lines: 72 74 97.3%
Branches: 66 142 46.5%

Line Branch Exec Source
1 /**
2 * This file is part of the CernVM File System.
3 */
4
5 #include "reflog_sql.h"
6
7 #include <cassert>
8 #include <limits>
9
10 #include "util/string.h"
11
12 const float ReflogDatabase::kLatestSchema = 1.0;
13 const float ReflogDatabase::kLatestSupportedSchema = 1.0;
14 const unsigned ReflogDatabase::kLatestSchemaRevision = 0;
15
16 /**
17 * Database Schema ChangeLog:
18 *
19 * Schema Version 1.0
20 * -> Revision 0: initial revision
21 */
22
23
24 const std::string ReflogDatabase::kFqrnKey = "fqrn";
25
26 560 bool ReflogDatabase::CreateEmptyDatabase() {
27
3/6
✓ Branch 2 taken 560 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 560 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 560 times.
✗ Branch 9 not taken.
1120 return sqlite::Sql(sqlite_db(),
28 "CREATE TABLE refs (hash TEXT, type INTEGER, "
29 "timestamp INTEGER, "
30 "CONSTRAINT pk_refs PRIMARY KEY (hash));")
31
1/2
✓ Branch 1 taken 560 times.
✗ Branch 2 not taken.
1120 .Execute();
32 }
33
34
35 248 bool ReflogDatabase::CheckSchemaCompatibility() {
36
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 248 times.
248 assert(IsEqualSchema(schema_version(), kLatestSupportedSchema));
37 248 return true; // only one schema version at the moment
38 }
39
40
41 248 bool ReflogDatabase::LiveSchemaUpgradeIfNecessary() {
42
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 248 times.
248 assert(schema_revision() == kLatestSchemaRevision);
43 248 return true; // only one schema revision at the moment, i.e. no migration...
44 }
45
46
47 560 bool ReflogDatabase::InsertInitialValues(const std::string &repo_name) {
48
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 560 times.
560 assert(read_write());
49
1/2
✓ Branch 2 taken 560 times.
✗ Branch 3 not taken.
560 return this->SetProperty(kFqrnKey, repo_name);
50 }
51
52
53 //------------------------------------------------------------------------------
54
55 #define DB_FIELDS_V1R0 "hash, type, timestamp"
56 #define DB_PLACEHOLDERS ":hash, :type, :timestamp"
57
58 #define MAKE_STATEMENT(STMT_TMPL, REV) \
59 static const std::string REV = ReplaceAll( \
60 ReplaceAll(STMT_TMPL, "@DB_FIELDS@", DB_FIELDS_##REV), \
61 "@DB_PLACEHOLDERS@", DB_PLACEHOLDERS)
62
63 #define MAKE_STATEMENTS(STMT_TMPL) MAKE_STATEMENT(STMT_TMPL, V1R0)
64
65 #define DEFERRED_INIT(DB, REV) DeferredInit((DB)->sqlite_db(), (REV).c_str())
66
67 #define DEFERRED_INITS(DB) DEFERRED_INIT((DB), V1R0)
68
69
70 4844 shash::Suffix SqlReflog::ToSuffix(const ReferenceType type) {
71
4/5
✓ Branch 0 taken 4044 times.
✓ Branch 1 taken 280 times.
✓ Branch 2 taken 200 times.
✓ Branch 3 taken 320 times.
✗ Branch 4 not taken.
4844 switch (type) {
72 4044 case kRefCatalog:
73 4044 return shash::kSuffixCatalog;
74 280 case kRefCertificate:
75 280 return shash::kSuffixCertificate;
76 200 case kRefHistory:
77 200 return shash::kSuffixHistory;
78 320 case kRefMetainfo:
79 320 return shash::kSuffixMetainfo;
80 default:
81 assert(false && "unknown reference type");
82 }
83 }
84
85
86 //------------------------------------------------------------------------------
87
88
89 808 SqlInsertReference::SqlInsertReference(const ReflogDatabase *database) {
90
10/20
✓ Branch 0 taken 40 times.
✓ Branch 1 taken 768 times.
✓ Branch 3 taken 40 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 40 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 40 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 40 times.
✗ Branch 16 not taken.
✓ Branch 19 taken 40 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 40 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 40 times.
✗ Branch 27 not taken.
✓ Branch 29 taken 40 times.
✗ Branch 30 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
808 MAKE_STATEMENTS("INSERT OR REPLACE INTO refs (@DB_FIELDS@) "
91 "VALUES (@DB_PLACEHOLDERS@);");
92
2/4
✓ Branch 2 taken 808 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 808 times.
✗ Branch 6 not taken.
808 DEFERRED_INITS(database);
93 808 }
94
95 1120 bool SqlInsertReference::BindReference(const shash::Any &reference_hash,
96 const ReferenceType type) {
97
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
1120 return BindTextTransient(1, reference_hash.ToString())
98
2/4
✓ Branch 1 taken 1120 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1120 times.
✗ Branch 4 not taken.
1120 && BindInt64(2, static_cast<uint64_t>(type))
99
6/15
✓ Branch 1 taken 1120 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1120 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1120 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 1120 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1120 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1120 times.
✗ Branch 15 not taken.
3360 && BindInt64(3, static_cast<uint64_t>(time(NULL)));
100 }
101
102
103 //------------------------------------------------------------------------------
104
105
106 808 SqlCountReferences::SqlCountReferences(const ReflogDatabase *database) {
107
2/4
✓ Branch 1 taken 808 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 808 times.
✗ Branch 5 not taken.
808 DeferredInit(database->sqlite_db(), "SELECT count(*) as count FROM refs;");
108 808 }
109
110 320 uint64_t SqlCountReferences::RetrieveCount() {
111 320 return static_cast<uint64_t>(RetrieveInt64(0));
112 }
113
114
115 //------------------------------------------------------------------------------
116
117
118 808 SqlListReferences::SqlListReferences(const ReflogDatabase *database) {
119
2/4
✓ Branch 1 taken 808 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 808 times.
✗ Branch 5 not taken.
808 DeferredInit(database->sqlite_db(), "SELECT hash, type FROM refs "
120 "WHERE type = :type AND "
121 "timestamp < :timestamp "
122 "ORDER BY timestamp DESC;");
123 808 }
124
125 280 bool SqlListReferences::BindType(const ReferenceType type) {
126 280 return BindInt64(1, static_cast<uint64_t>(type));
127 }
128
129 280 bool SqlListReferences::BindOlderThan(const uint64_t timestamp) {
130 280 int64_t sqlite_timestamp = static_cast<uint64_t>(timestamp);
131
2/2
✓ Branch 0 taken 200 times.
✓ Branch 1 taken 80 times.
280 if (sqlite_timestamp < 0) {
132 200 sqlite_timestamp = std::numeric_limits<int64_t>::max();
133 }
134 280 return BindInt64(2, sqlite_timestamp);
135 }
136
137 520 shash::Any SqlListReferences::RetrieveHash() const {
138 520 const ReferenceType type = static_cast<ReferenceType>(RetrieveInt64(1));
139 520 const shash::Suffix suffix = ToSuffix(type);
140
1/2
✓ Branch 3 taken 520 times.
✗ Branch 4 not taken.
520 return shash::MkFromHexPtr(shash::HexPtr(RetrieveString(0)), suffix);
141 }
142
143
144 //------------------------------------------------------------------------------
145
146
147 808 SqlRemoveReference::SqlRemoveReference(const ReflogDatabase *database) {
148
2/4
✓ Branch 1 taken 808 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 808 times.
✗ Branch 5 not taken.
808 DeferredInit(database->sqlite_db(), "DELETE FROM refs WHERE hash = :hash "
149 "AND type = :type;");
150 808 }
151
152 160 bool SqlRemoveReference::BindReference(const shash::Any &reference_hash,
153 const ReferenceType type) {
154
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
160 return BindTextTransient(1, reference_hash.ToString())
155
6/14
✓ Branch 1 taken 160 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 160 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 160 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 160 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 160 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 160 times.
✗ Branch 14 not taken.
320 && BindInt64(2, static_cast<uint64_t>(type));
156 }
157
158
159 //------------------------------------------------------------------------------
160
161
162 808 SqlContainsReference::SqlContainsReference(const ReflogDatabase *database) {
163
2/4
✓ Branch 1 taken 808 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 808 times.
✗ Branch 5 not taken.
808 DeferredInit(database->sqlite_db(), "SELECT count(*) as answer FROM refs "
164 "WHERE type = :type "
165 " AND hash = :hash");
166 808 }
167
168 640 bool SqlContainsReference::BindReference(const shash::Any &reference_hash,
169 const ReferenceType type) {
170 1280 return BindInt64(1, static_cast<uint64_t>(type))
171
6/16
✓ Branch 1 taken 640 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 640 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 640 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 640 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 640 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 640 times.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
640 && BindTextTransient(2, reference_hash.ToString());
172 }
173
174 640 bool SqlContainsReference::RetrieveAnswer() {
175 640 const int64_t count = RetrieveInt64(0);
176
3/4
✓ Branch 0 taken 320 times.
✓ Branch 1 taken 320 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 320 times.
640 assert(count == 0 || count == 1);
177 640 return count > 0;
178 }
179
180
181 //------------------------------------------------------------------------------
182
183
184 808 SqlGetTimestamp::SqlGetTimestamp(const ReflogDatabase *database) {
185
2/4
✓ Branch 1 taken 808 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 808 times.
✗ Branch 5 not taken.
808 DeferredInit(database->sqlite_db(), "SELECT timestamp FROM refs "
186 "WHERE type = :type "
187 " AND hash = :hash");
188 808 }
189
190 80 bool SqlGetTimestamp::BindReference(const shash::Any &reference_hash,
191 const ReferenceType type) {
192 160 return BindInt64(1, static_cast<uint64_t>(type))
193
6/16
✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 80 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 80 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 80 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 80 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 80 times.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
80 && BindTextTransient(2, reference_hash.ToString());
194 }
195
196 40 uint64_t SqlGetTimestamp::RetrieveTimestamp() { return RetrieveInt64(0); }
197