GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/catalog_counters_impl.h
Date: 2026-10-25 02:40:14
Exec Total Coverage
Lines: 75 109 68.8%
Branches: 57 159 35.8%

Line Branch Exec Source
1 /**
2 * This file is part of the CernVM File System.
3 */
4
5 #ifndef CVMFS_CATALOG_COUNTERS_IMPL_H_
6 #define CVMFS_CATALOG_COUNTERS_IMPL_H_
7
8 #include <map>
9 #include <string>
10
11 #include "catalog_counters.h"
12 #include "catalog_sql.h"
13 #include "util/string.h"
14
15 namespace catalog {
16
17 template<typename FieldT>
18 ✗ FieldT TreeCountersBase<FieldT>::Get(const std::string &key) const {
19 ✗ FieldsMap map = GetFieldsMap();
20 ✗ if (map.find(key) != map.end())
21 ✗ return *map[key];
22 ✗ return FieldT(0);
23 }
24
25
26 template<typename FieldT>
27 typename TreeCountersBase<FieldT>::FieldsMap
28 11345 TreeCountersBase<FieldT>::GetFieldsMap() const {
29 11345 FieldsMap map;
30
2/4
✓ Branch 2 taken 11345 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 11345 times.
✗ Branch 6 not taken.
11345 self.FillFieldsMap("self_", &map);
31
2/4
✓ Branch 2 taken 11345 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 11345 times.
✗ Branch 6 not taken.
11345 subtree.FillFieldsMap("subtree_", &map);
32 11345 return map;
33 }
34
35 template<typename FieldT>
36 78 std::map<std::string, FieldT> TreeCountersBase<FieldT>::GetValues() const {
37 78 FieldsMap map_self;
38 78 FieldsMap map_subtree;
39
2/4
✓ Branch 2 taken 78 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 78 times.
✗ Branch 6 not taken.
78 self.FillFieldsMap("", &map_self);
40
2/4
✓ Branch 2 taken 78 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 78 times.
✗ Branch 6 not taken.
78 subtree.FillFieldsMap("", &map_subtree);
41
42 78 std::map<std::string, FieldT> map_summed;
43
44 78 typename FieldsMap::const_iterator i = map_self.begin();
45 78 typename FieldsMap::const_iterator const iend = map_self.end();
46
2/2
✓ Branch 1 taken 936 times.
✓ Branch 2 taken 78 times.
1014 for (; i != iend; ++i) {
47
3/6
✓ Branch 2 taken 936 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 936 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 936 times.
✗ Branch 11 not taken.
936 map_summed[i->first] = *(map_self[i->first]) + *(map_subtree[i->first]);
48 }
49
50 156 return map_summed;
51 78 }
52
53 template<typename FieldT>
54 48 std::string TreeCountersBase<FieldT>::GetCsvMap() const {
55
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 std::map<std::string, FieldT> map_summed = GetValues();
56
57 48 std::string result;
58 48 typename std::map<std::string, FieldT>::const_iterator j = map_summed.begin();
59 48 typename std::map<std::string, FieldT>::const_iterator const jend = map_summed
60 48 .end();
61
2/2
✓ Branch 1 taken 576 times.
✓ Branch 2 taken 48 times.
624 for (; j != jend; ++j) {
62
5/10
✓ Branch 2 taken 576 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 576 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 576 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 576 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 576 times.
✗ Branch 16 not taken.
576 result += j->first + "," + StringifyInt(j->second) + "\n";
63 }
64 96 return result;
65 48 }
66
67
68 template<typename FieldT>
69 6487 bool TreeCountersBase<FieldT>::ReadFromDatabase(const CatalogDatabase &database,
70 const LegacyMode::Type legacy) {
71 6487 bool retval = true;
72
73
1/2
✓ Branch 1 taken 6487 times.
✗ Branch 2 not taken.
6487 FieldsMap map = GetFieldsMap();
74
1/2
✓ Branch 1 taken 6487 times.
✗ Branch 2 not taken.
6487 SqlGetCounter sql_counter(database);
75
76 6487 typename FieldsMap::const_iterator i = map.begin();
77 6487 typename FieldsMap::const_iterator const iend = map.end();
78
2/2
✓ Branch 1 taken 155688 times.
✓ Branch 2 taken 6487 times.
162175 for (; i != iend; ++i) {
79
1/2
✓ Branch 2 taken 155688 times.
✗ Branch 3 not taken.
155688 bool current_retval = sql_counter.BindCounter(i->first)
80
3/6
✓ Branch 0 taken 155688 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 155688 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 155688 times.
✗ Branch 6 not taken.
155688 && sql_counter.FetchRow();
81
82 // TODO(jblomer): nicify this
83
1/2
✓ Branch 0 taken 155688 times.
✗ Branch 1 not taken.
155688 if (current_retval) {
84 155688 *(const_cast<FieldT *>(i->second)) = static_cast<FieldT>(
85
1/2
✓ Branch 1 taken 155688 times.
✗ Branch 2 not taken.
155688 sql_counter.GetCounter());
86 ✗ } else if (
87 (legacy == LegacyMode::kNoSpecials)
88 ✗ && ((i->first == "self_special")
89 ✗ || (i->first
90 ✗ == "subtree_special"))) { // NOLINT(bugprone-branch-clone)
91 ✗ *(const_cast<FieldT *>(i->second)) = FieldT(0);
92 ✗ current_retval = true;
93 ✗ } else if ((legacy == LegacyMode::kNoExternals)
94 ✗ && ((i->first == "self_special")
95 ✗ || (i->first == "subtree_special")
96 ✗ || (i->first == "self_external")
97 ✗ || (i->first == "subtree_external")
98 ✗ || (i->first == "self_external_file_size")
99 ✗ || (i->first == "subtree_external_file_size"))) {
100 ✗ *(const_cast<FieldT *>(i->second)) = FieldT(0);
101 ✗ current_retval = true;
102 ✗ } else if ((legacy == LegacyMode::kNoXattrs)
103 ✗ && ((i->first == "self_special")
104 ✗ || (i->first == "subtree_special")
105 ✗ || (i->first == "self_external")
106 ✗ || (i->first == "subtree_external")
107 ✗ || (i->first == "self_external_file_size")
108 ✗ || (i->first == "subtree_external_file_size")
109 ✗ || (i->first == "self_xattr")
110 ✗ || (i->first == "subtree_xattr"))) {
111 ✗ *(const_cast<FieldT *>(i->second)) = FieldT(0);
112 ✗ current_retval = true;
113 ✗ } else if (legacy == LegacyMode::kLegacy) {
114 ✗ *(const_cast<FieldT *>(i->second)) = FieldT(0);
115 ✗ current_retval = true;
116 }
117
118
1/2
✓ Branch 1 taken 155688 times.
✗ Branch 2 not taken.
155688 sql_counter.Reset();
119
1/2
✓ Branch 0 taken 155688 times.
✗ Branch 1 not taken.
311376 retval = (retval) ? current_retval : false;
120 }
121
122 6487 return retval;
123 162175 }
124
125
126 template<typename FieldT>
127 1969 bool TreeCountersBase<FieldT>::WriteToDatabase(
128 const CatalogDatabase &database) const {
129 1969 bool retval = true;
130
131
1/2
✓ Branch 1 taken 1969 times.
✗ Branch 2 not taken.
1969 const FieldsMap map = GetFieldsMap();
132
1/2
✓ Branch 1 taken 1969 times.
✗ Branch 2 not taken.
1969 SqlUpdateCounter sql_counter(database);
133
134 1969 typename FieldsMap::const_iterator i = map.begin();
135 1969 typename FieldsMap::const_iterator const iend = map.end();
136
2/2
✓ Branch 1 taken 47256 times.
✓ Branch 2 taken 1969 times.
49225 for (; i != iend; ++i) {
137
1/2
✓ Branch 2 taken 47256 times.
✗ Branch 3 not taken.
47256 const bool current_retval = sql_counter.BindCounter(i->first)
138
2/4
✓ Branch 2 taken 47256 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 47256 times.
✗ Branch 5 not taken.
47256 && sql_counter.BindDelta(*(i->second))
139
3/6
✓ Branch 0 taken 47256 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 47256 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 47256 times.
✗ Branch 6 not taken.
94512 && sql_counter.Execute();
140
1/2
✓ Branch 1 taken 47256 times.
✗ Branch 2 not taken.
47256 sql_counter.Reset();
141
142
1/2
✓ Branch 0 taken 47256 times.
✗ Branch 1 not taken.
47256 retval = (retval) ? current_retval : false;
143 }
144
145 1969 return retval;
146 1969 }
147
148
149 template<typename FieldT>
150 2553 bool TreeCountersBase<FieldT>::InsertIntoDatabase(
151 const CatalogDatabase &database) const {
152 2553 bool retval = true;
153
154
1/2
✓ Branch 1 taken 2553 times.
✗ Branch 2 not taken.
2553 const FieldsMap map = GetFieldsMap();
155
1/2
✓ Branch 1 taken 2553 times.
✗ Branch 2 not taken.
2553 SqlCreateCounter sql_counter(database);
156
157 2553 typename FieldsMap::const_iterator i = map.begin();
158 2553 typename FieldsMap::const_iterator const iend = map.end();
159
2/2
✓ Branch 1 taken 61272 times.
✓ Branch 2 taken 2553 times.
63825 for (; i != iend; ++i) {
160
1/2
✓ Branch 2 taken 61272 times.
✗ Branch 3 not taken.
61272 const bool current_retval = sql_counter.BindCounter(i->first)
161
2/4
✓ Branch 2 taken 61272 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 61272 times.
✗ Branch 5 not taken.
61272 && sql_counter.BindInitialValue(*(i->second))
162
3/6
✓ Branch 0 taken 61272 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 61272 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 61272 times.
✗ Branch 6 not taken.
122544 && sql_counter.Execute();
163
1/2
✓ Branch 1 taken 61272 times.
✗ Branch 2 not taken.
61272 sql_counter.Reset();
164
165
1/2
✓ Branch 0 taken 61272 times.
✗ Branch 1 not taken.
61272 retval = (retval) ? current_retval : false;
166 }
167
168 2553 return retval;
169 2553 }
170
171
172 template<typename FieldT>
173 581 void TreeCountersBase<FieldT>::SetZero() {
174 581 self.Subtract(self);
175 581 subtree.Subtract(subtree);
176 581 }
177
178 } // namespace catalog
179
180 #endif // CVMFS_CATALOG_COUNTERS_IMPL_H_
181