Directory: | cvmfs/ |
---|---|
File: | cvmfs/catalog_sql.h |
Date: | 2025-02-09 02:34:19 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 19 | 21 | 90.5% |
Branches: | 11 | 18 | 61.1% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | /** | ||
2 | * This file is part of the CernVM file system. | ||
3 | * | ||
4 | * This file provides classes to wrap often used catalog SQL statements. | ||
5 | * In particular, it wraps around sqlite3 prepared statement syntax. | ||
6 | * | ||
7 | * Usage example: | ||
8 | * SqlLookup statement(<database>); | ||
9 | * statement.BindPathHash(<hash>); | ||
10 | * if (statement.FetchRow()) { | ||
11 | * statement.GetDirectoryEntry(<catalog>); | ||
12 | * } | ||
13 | * statement.Reset(); | ||
14 | */ | ||
15 | |||
16 | #ifndef CVMFS_CATALOG_SQL_H_ | ||
17 | #define CVMFS_CATALOG_SQL_H_ | ||
18 | |||
19 | #ifndef __STDC_FORMAT_MACROS | ||
20 | #define __STDC_FORMAT_MACROS | ||
21 | #endif | ||
22 | |||
23 | #include <inttypes.h> | ||
24 | |||
25 | #include <string> | ||
26 | |||
27 | #include "compression/compression.h" | ||
28 | #include "crypto/hash.h" | ||
29 | #include "directory_entry.h" | ||
30 | #include "file_chunk.h" | ||
31 | #include "shortstring.h" | ||
32 | #include "sql.h" | ||
33 | |||
34 | class XattrList; | ||
35 | |||
36 | namespace catalog { | ||
37 | |||
38 | class Catalog; | ||
39 | |||
40 | |||
41 | class CatalogDatabase : public sqlite::Database<CatalogDatabase> { | ||
42 | public: | ||
43 | static const float kLatestSchema; | ||
44 | static const float kLatestSupportedSchema; // + 1.X catalogs (r/o) | ||
45 | // Backwards-compatible schema changes | ||
46 | static const unsigned kLatestSchemaRevision; | ||
47 | |||
48 | bool CreateEmptyDatabase(); | ||
49 | bool InsertInitialValues(const std::string &root_path, | ||
50 | const bool volatile_content, | ||
51 | const std::string &voms_authz, | ||
52 | const DirectoryEntry &root_entry | ||
53 | = DirectoryEntry(kDirentNegative)); | ||
54 | |||
55 | bool CheckSchemaCompatibility(); | ||
56 | bool LiveSchemaUpgradeIfNecessary(); | ||
57 | bool CompactDatabase() const; | ||
58 | |||
59 | double GetRowIdWasteRatio() const; | ||
60 | bool SetVOMSAuthz(const std::string&); | ||
61 | |||
62 | protected: | ||
63 | // TODO(rmeusel): C++11 - constructor inheritance | ||
64 | friend class sqlite::Database<CatalogDatabase>; | ||
65 | 241 | CatalogDatabase(const std::string &filename, | |
66 | const OpenMode open_mode) | ||
67 | 241 | : sqlite::Database<CatalogDatabase>(filename, open_mode) { } | |
68 | }; | ||
69 | |||
70 | |||
71 | //------------------------------------------------------------------------------ | ||
72 | |||
73 | |||
74 | /** | ||
75 | * Base class for all SQL statement classes. It wraps a single SQL statement | ||
76 | * and all necessary calls of the sqlite3 API to deal with this statement. | ||
77 | */ | ||
78 | class SqlCatalog : public sqlite::Sql { | ||
79 | public: | ||
80 | /** | ||
81 | * Basic constructor to use this class for a specific statement. | ||
82 | * @param database the database to use the query on | ||
83 | * @param statement the statement to prepare | ||
84 | */ | ||
85 | 1007 | SqlCatalog(const CatalogDatabase &database, const std::string &statement) { | |
86 |
2/4✓ Branch 1 taken 1007 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1007 times.
✗ Branch 5 not taken.
|
1007 | Init(database.sqlite_db(), statement); |
87 | 1007 | } | |
88 | |||
89 | /** | ||
90 | * Wrapper for retrieving MD5-ified path names. | ||
91 | * @param idx_high offset of most significant bits in database query | ||
92 | * @param idx_low offset of least significant bits in database query | ||
93 | * @result the retrieved MD5 hash | ||
94 | */ | ||
95 | ✗ | inline shash::Md5 RetrieveMd5(const int idx_high, const int idx_low) const { | |
96 | ✗ | return shash::Md5(RetrieveInt64(idx_high), RetrieveInt64(idx_low)); | |
97 | } | ||
98 | |||
99 | /** | ||
100 | * Wrapper for retrieving a cryptographic hash from a blob field. | ||
101 | */ | ||
102 | 733 | inline shash::Any RetrieveHashBlob( | |
103 | const int idx_column, | ||
104 | const shash::Algorithms hash_algo, | ||
105 | const char hash_suffix = shash::kSuffixNone) const | ||
106 | { | ||
107 | // Note: SQLite documentation advises to first define the data type of BLOB | ||
108 | // by calling sqlite3_column_XXX() on the column and _afterwards_ get | ||
109 | // the number of bytes using sqlite3_column_bytes(). | ||
110 | // | ||
111 | // See: https://www.sqlite.org/c3ref/column_blob.html | ||
112 | const unsigned char *buffer = static_cast<const unsigned char *>( | ||
113 | 733 | RetrieveBlob(idx_column)); | |
114 | 733 | const int byte_count = RetrieveBytes(idx_column); | |
115 | return (byte_count > 0) ? shash::Any(hash_algo, buffer, hash_suffix) | ||
116 |
2/2✓ Branch 0 taken 228 times.
✓ Branch 1 taken 505 times.
|
733 | : shash::Any(hash_algo); |
117 | } | ||
118 | |||
119 | /** | ||
120 | * Wrapper for retrieving a cryptographic hash from a text field. | ||
121 | */ | ||
122 | inline shash::Any RetrieveHashHex( | ||
123 | const int idx_column, | ||
124 | const char hash_suffix = shash::kSuffixNone) const | ||
125 | { | ||
126 | const std::string hash_string = std::string(reinterpret_cast<const char *>( | ||
127 | RetrieveText(idx_column))); | ||
128 | return shash::MkFromHexPtr(shash::HexPtr(hash_string), hash_suffix); | ||
129 | } | ||
130 | |||
131 | /** | ||
132 | * Wrapper for binding a MD5-ified path name. | ||
133 | * @param idx_high offset of most significant bits in database query | ||
134 | * @param idx_low offset of least significant bits in database query | ||
135 | * @param hash the hash to bind in the query | ||
136 | * @result true on success, false otherwise | ||
137 | */ | ||
138 | 2022 | inline bool BindMd5(const int idx_high, const int idx_low, | |
139 | const shash::Md5 &hash) | ||
140 | { | ||
141 | uint64_t high, low; | ||
142 |
1/2✓ Branch 1 taken 2022 times.
✗ Branch 2 not taken.
|
2022 | hash.ToIntPair(&high, &low); |
143 |
2/4✓ Branch 1 taken 2022 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2022 times.
✗ Branch 4 not taken.
|
4044 | const bool retval = BindInt64(idx_high, static_cast<int64_t>(high)) && |
144 |
2/4✓ Branch 1 taken 2022 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2022 times.
✗ Branch 4 not taken.
|
2022 | BindInt64(idx_low, static_cast<int64_t>(low)); |
145 | 2022 | return retval; | |
146 | } | ||
147 | |||
148 | /** | ||
149 | * Wrapper for binding a cryptographic hash. Algorithm of hash has to be | ||
150 | * elsewhere (in flags). | ||
151 | * @param idx_column offset of the blob field in database query | ||
152 | * @param hash the hash to bind in the query | ||
153 | * @result true on success, false otherwise | ||
154 | */ | ||
155 | 723 | inline bool BindHashBlob(const int idx_column, const shash::Any &hash) { | |
156 |
2/2✓ Branch 1 taken 446 times.
✓ Branch 2 taken 277 times.
|
723 | if (hash.IsNull()) { |
157 | 446 | return BindNull(idx_column); | |
158 | } else { | ||
159 | 277 | return BindBlob(idx_column, hash.digest, hash.GetDigestSize()); | |
160 | } | ||
161 | } | ||
162 | |||
163 | protected: | ||
164 | 2412 | SqlCatalog() : sqlite::Sql() {} | |
165 | }; | ||
166 | |||
167 | |||
168 | //------------------------------------------------------------------------------ | ||
169 | |||
170 | |||
171 | /** | ||
172 | * Common ancestor of SQL statements that deal with directory entries. | ||
173 | */ | ||
174 | class SqlDirent : public SqlCatalog { | ||
175 | public: | ||
176 | // Definition of bit positions for the flags field of a DirectoryEntry | ||
177 | // All other bit positions are unused | ||
178 | static const int kFlagDir = 1; | ||
179 | // Link in the parent catalog | ||
180 | static const int kFlagDirNestedMountpoint = 2; | ||
181 | // Link in the child catalog | ||
182 | static const int kFlagDirNestedRoot = 32; | ||
183 | static const int kFlagFile = 4; | ||
184 | static const int kFlagLink = 8; | ||
185 | static const int kFlagFileSpecial = 16; | ||
186 | static const int kFlagFileChunk = 64; | ||
187 | /** | ||
188 | * The file is not natively stored in cvmfs but on a different storage system, | ||
189 | * for instance on HTTPS data federation services. | ||
190 | * NOTE: used as magic number in SqlListContentHashes::SqlListContentHashes | ||
191 | */ | ||
192 | static const int kFlagFileExternal = 128; | ||
193 | // as of 2^8: 3 bit for hashes | ||
194 | // - 0: SHA-1 | ||
195 | // - 1: RIPEMD-160 | ||
196 | // - ... | ||
197 | // Corresponds to shash::algorithms with offset in order to support future | ||
198 | // hashes | ||
199 | static const int kFlagPosHash = 8; | ||
200 | // Compression methods, 3 bits starting at 2^11 | ||
201 | // Corresponds to zlib::Algorithms | ||
202 | static const int kFlagPosCompression = 11; | ||
203 | /** | ||
204 | * A transition point to a root catalog (instead of a nested catalog). Used | ||
205 | * to link previous snapshots into the catalog structure. | ||
206 | */ | ||
207 | static const int kFlagDirBindMountpoint = 0x4000; // 2^14 | ||
208 | /** | ||
209 | * An entry that should not appear in listings. Used for the /.cvmfs | ||
210 | * directory. | ||
211 | */ | ||
212 | static const int kFlagHidden = 0x8000; // 2^15 | ||
213 | /** | ||
214 | * For regular files, indicates that the file should be opened with direct I/O | ||
215 | */ | ||
216 | static const int kFlagDirectIo = 0x10000; // 2^16 | ||
217 | |||
218 | |||
219 | protected: | ||
220 | /** | ||
221 | * Take the meta data from the DirectoryEntry and transform it | ||
222 | * into a valid flags field ready to be saved in the database. | ||
223 | * @param entry the DirectoryEntry to encode | ||
224 | * @return an integer containing the bitmap of the flags field | ||
225 | */ | ||
226 | unsigned CreateDatabaseFlags(const DirectoryEntry &entry) const; | ||
227 | void StoreHashAlgorithm(const shash::Algorithms algo, unsigned *flags) const; | ||
228 | shash::Algorithms RetrieveHashAlgorithm(const unsigned flags) const; | ||
229 | zlib::Algorithms RetrieveCompressionAlgorithm(const unsigned flags) const; | ||
230 | |||
231 | /** | ||
232 | * The hardlink information (hardlink group ID and linkcount) is saved in one | ||
233 | * uint_64t field in the CVMFS Catalogs. Therefore we need to do bitshifting | ||
234 | * in these helper methods. | ||
235 | */ | ||
236 | uint32_t Hardlinks2Linkcount(const uint64_t hardlinks) const; | ||
237 | uint32_t Hardlinks2HardlinkGroup(const uint64_t hardlinks) const; | ||
238 | uint64_t MakeHardlinks(const uint32_t hardlink_group, | ||
239 | const uint32_t linkcount) const; | ||
240 | |||
241 | /** | ||
242 | * Replaces place holder variables in a symbolic link by actual path elements. | ||
243 | * @param raw_symlink the raw symlink path (may) containing place holders | ||
244 | * @return the expanded symlink | ||
245 | */ | ||
246 | void ExpandSymlink(LinkString *raw_symlink) const; | ||
247 | }; | ||
248 | |||
249 | |||
250 | //------------------------------------------------------------------------------ | ||
251 | |||
252 | |||
253 | class SqlDirentWrite : public SqlDirent { | ||
254 | public: | ||
255 | /** | ||
256 | * To bind an entire DirectoryEntry | ||
257 | * @param entry the DirectoryEntry to bind in the SQL statement | ||
258 | * @return true on success, false otherwise | ||
259 | */ | ||
260 | virtual bool BindDirent(const DirectoryEntry &entry) = 0; | ||
261 | |||
262 | protected: | ||
263 | bool BindDirentFields(const int hash_idx, | ||
264 | const int hardlinks_idx, | ||
265 | const int size_idx, | ||
266 | const int mode_idx, | ||
267 | const int mtime_idx, | ||
268 | const int mtimens_idx, | ||
269 | const int flags_idx, | ||
270 | const int name_idx, | ||
271 | const int symlink_idx, | ||
272 | const int uid_idx, | ||
273 | const int gid_idx, | ||
274 | const DirectoryEntry &entry); | ||
275 | }; | ||
276 | |||
277 | |||
278 | //------------------------------------------------------------------------------ | ||
279 | |||
280 | |||
281 | class SqlListContentHashes : public SqlDirent { | ||
282 | public: | ||
283 | explicit SqlListContentHashes(const CatalogDatabase &database); | ||
284 | shash::Any GetHash() const; | ||
285 | }; | ||
286 | |||
287 | |||
288 | //------------------------------------------------------------------------------ | ||
289 | |||
290 | |||
291 | class SqlLookup : public SqlDirent { | ||
292 | public: | ||
293 | /** | ||
294 | * Retrieves a DirectoryEntry from a freshly performed SqlLookup statement. | ||
295 | * @param catalog the catalog in which the DirectoryEntry resides | ||
296 | * @return the retrieved DirectoryEntry | ||
297 | */ | ||
298 | DirectoryEntry GetDirent(const Catalog *catalog, | ||
299 | const bool expand_symlink = true) const; | ||
300 | |||
301 | /** | ||
302 | * DirectoryEntrys do not contain their path hash. | ||
303 | * This method retrieves the saved path hash from the database | ||
304 | * @return the MD5 path hash of a freshly performed lookup | ||
305 | */ | ||
306 | shash::Md5 GetPathHash() const; | ||
307 | |||
308 | /** | ||
309 | * DirectoryEntries do not contain their parent path hash. | ||
310 | * This method retrieves the saved parent path hash from the database | ||
311 | * @return the MD5 parent path hash of a freshly performed lookup | ||
312 | */ | ||
313 | shash::Md5 GetParentPathHash() const; | ||
314 | }; | ||
315 | |||
316 | |||
317 | //------------------------------------------------------------------------------ | ||
318 | |||
319 | |||
320 | class SqlListing : public SqlLookup { | ||
321 | public: | ||
322 | explicit SqlListing(const CatalogDatabase &database); | ||
323 | bool BindPathHash(const struct shash::Md5 &hash); | ||
324 | }; | ||
325 | |||
326 | |||
327 | //------------------------------------------------------------------------------ | ||
328 | |||
329 | |||
330 | class SqlLookupPathHash : public SqlLookup { | ||
331 | public: | ||
332 | explicit SqlLookupPathHash(const CatalogDatabase &database); | ||
333 | bool BindPathHash(const struct shash::Md5 &hash); | ||
334 | }; | ||
335 | |||
336 | |||
337 | //------------------------------------------------------------------------------ | ||
338 | |||
339 | |||
340 | class SqlLookupInode : public SqlLookup { | ||
341 | public: | ||
342 | explicit SqlLookupInode(const CatalogDatabase &database); | ||
343 | bool BindRowId(const uint64_t inode); | ||
344 | }; | ||
345 | |||
346 | |||
347 | //------------------------------------------------------------------------------ | ||
348 | |||
349 | |||
350 | /** | ||
351 | * This SQL statement is only used for legacy catalog migrations and has been | ||
352 | * moved here as it needs to use a locally defined macro inside catalog_sql.cc | ||
353 | * | ||
354 | * Queries a single catalog and looks for DirectoryEntrys that have direct | ||
355 | * children in the same catalog but are marked as 'nested catalog mountpoints'. | ||
356 | * This is an inconsistent situation, since a mountpoint is supposed to be empty | ||
357 | * and it's children are stored in the corresponding referenced nested catalog. | ||
358 | * | ||
359 | * Note: the user code needs to check if there is a corresponding nested catalog | ||
360 | * reference for the found dangling mountpoints. If so, we also have a | ||
361 | * bogus state, but it is not reliably fixable automatically. The child- | ||
362 | * DirectoryEntrys would be masked by the mounting nested catalog but it | ||
363 | * is not clear if we can simply delete them or if this would destroy data. | ||
364 | */ | ||
365 | class SqlLookupDanglingMountpoints : public catalog::SqlLookup { | ||
366 | public: | ||
367 | explicit SqlLookupDanglingMountpoints(const CatalogDatabase &database); | ||
368 | }; | ||
369 | |||
370 | |||
371 | //------------------------------------------------------------------------------ | ||
372 | |||
373 | |||
374 | /** | ||
375 | * Filesystem like _touch_ of a DirectoryEntry. Only file system specific meta | ||
376 | * data will be modified. All CVMFS-specific administrative data stays | ||
377 | * unchanged. | ||
378 | * NOTE: This is not a subclass of SqlDirent since it works on | ||
379 | * DirectoryEntryBase objects, which are restricted to file system meta | ||
380 | * data. | ||
381 | */ | ||
382 | class SqlDirentTouch : public SqlCatalog { | ||
383 | public: | ||
384 | explicit SqlDirentTouch(const CatalogDatabase &database); | ||
385 | |||
386 | bool BindDirentBase(const DirectoryEntryBase &entry); | ||
387 | bool BindPathHash(const shash::Md5 &hash); | ||
388 | bool BindXattr(const XattrList &xattrs); | ||
389 | bool BindXattrEmpty(); | ||
390 | }; | ||
391 | |||
392 | |||
393 | //------------------------------------------------------------------------------ | ||
394 | |||
395 | |||
396 | /** | ||
397 | * Nested catalogs and bind mountpoints. | ||
398 | */ | ||
399 | class SqlNestedCatalogLookup : public SqlCatalog { | ||
400 | public: | ||
401 | explicit SqlNestedCatalogLookup(const CatalogDatabase &database); | ||
402 | bool BindSearchPath(const PathString &path); | ||
403 | shash::Any GetContentHash() const; | ||
404 | uint64_t GetSize() const; | ||
405 | }; | ||
406 | |||
407 | |||
408 | //------------------------------------------------------------------------------ | ||
409 | |||
410 | |||
411 | /** | ||
412 | * Nested catalogs and bind mountpoints. | ||
413 | */ | ||
414 | class SqlNestedCatalogListing : public SqlCatalog { | ||
415 | public: | ||
416 | explicit SqlNestedCatalogListing(const CatalogDatabase &database); | ||
417 | PathString GetPath() const; | ||
418 | shash::Any GetContentHash() const; | ||
419 | uint64_t GetSize() const; | ||
420 | }; | ||
421 | |||
422 | |||
423 | //------------------------------------------------------------------------------ | ||
424 | |||
425 | |||
426 | /** | ||
427 | * Only nested catalogs, no bind mountpoints. Used for replication and GC. | ||
428 | */ | ||
429 | class SqlOwnNestedCatalogListing : public SqlCatalog { | ||
430 | public: | ||
431 | explicit SqlOwnNestedCatalogListing(const CatalogDatabase &database); | ||
432 | PathString GetPath() const; | ||
433 | shash::Any GetContentHash() const; | ||
434 | uint64_t GetSize() const; | ||
435 | }; | ||
436 | |||
437 | |||
438 | //------------------------------------------------------------------------------ | ||
439 | |||
440 | |||
441 | class SqlDirentInsert : public SqlDirentWrite { | ||
442 | public: | ||
443 | explicit SqlDirentInsert(const CatalogDatabase &database); | ||
444 | bool BindPathHash(const shash::Md5 &hash); | ||
445 | bool BindParentPathHash(const shash::Md5 &hash); | ||
446 | bool BindDirent(const DirectoryEntry &entry); | ||
447 | bool BindXattr(const XattrList &xattrs); | ||
448 | bool BindXattrEmpty(); | ||
449 | }; | ||
450 | |||
451 | |||
452 | //------------------------------------------------------------------------------ | ||
453 | |||
454 | |||
455 | class SqlDirentUpdate : public SqlDirentWrite { | ||
456 | public: | ||
457 | explicit SqlDirentUpdate(const CatalogDatabase &database); | ||
458 | bool BindPathHash(const shash::Md5 &hash); | ||
459 | bool BindDirent(const DirectoryEntry &entry); | ||
460 | }; | ||
461 | |||
462 | |||
463 | //------------------------------------------------------------------------------ | ||
464 | |||
465 | |||
466 | class SqlDirentUnlink : public SqlCatalog { | ||
467 | public: | ||
468 | explicit SqlDirentUnlink(const CatalogDatabase &database); | ||
469 | bool BindPathHash(const shash::Md5 &hash); | ||
470 | }; | ||
471 | |||
472 | |||
473 | //------------------------------------------------------------------------------ | ||
474 | |||
475 | |||
476 | /** | ||
477 | * Changes the linkcount for all files in a hardlink group. | ||
478 | */ | ||
479 | class SqlIncLinkcount : public SqlCatalog { | ||
480 | public: | ||
481 | explicit SqlIncLinkcount(const CatalogDatabase &database); | ||
482 | bool BindPathHash(const shash::Md5 &hash); | ||
483 | bool BindDelta(const int delta); | ||
484 | }; | ||
485 | |||
486 | |||
487 | //------------------------------------------------------------------------------ | ||
488 | |||
489 | |||
490 | class SqlChunkInsert : public SqlCatalog { | ||
491 | public: | ||
492 | explicit SqlChunkInsert(const CatalogDatabase &database); | ||
493 | bool BindPathHash(const shash::Md5 &hash); | ||
494 | bool BindFileChunk(const FileChunk &chunk); | ||
495 | }; | ||
496 | |||
497 | |||
498 | //------------------------------------------------------------------------------ | ||
499 | |||
500 | |||
501 | class SqlChunksRemove : public SqlCatalog { | ||
502 | public: | ||
503 | explicit SqlChunksRemove(const CatalogDatabase &database); | ||
504 | bool BindPathHash(const shash::Md5 &hash); | ||
505 | }; | ||
506 | |||
507 | |||
508 | //------------------------------------------------------------------------------ | ||
509 | |||
510 | |||
511 | class SqlChunksListing : public SqlCatalog { | ||
512 | public: | ||
513 | explicit SqlChunksListing(const CatalogDatabase &database); | ||
514 | bool BindPathHash(const shash::Md5 &hash); | ||
515 | FileChunk GetFileChunk(const shash::Algorithms interpret_hash_as) const; | ||
516 | }; | ||
517 | |||
518 | |||
519 | //------------------------------------------------------------------------------ | ||
520 | |||
521 | |||
522 | class SqlChunksCount : public SqlCatalog { | ||
523 | public: | ||
524 | explicit SqlChunksCount(const CatalogDatabase &database); | ||
525 | bool BindPathHash(const shash::Md5 &hash); | ||
526 | int GetChunkCount() const; | ||
527 | }; | ||
528 | |||
529 | |||
530 | //------------------------------------------------------------------------------ | ||
531 | |||
532 | |||
533 | class SqlMaxHardlinkGroup : public SqlCatalog { | ||
534 | public: | ||
535 | explicit SqlMaxHardlinkGroup(const CatalogDatabase &database); | ||
536 | uint32_t GetMaxGroupId() const; | ||
537 | }; | ||
538 | |||
539 | |||
540 | //------------------------------------------------------------------------------ | ||
541 | |||
542 | |||
543 | class SqlGetCounter : public SqlCatalog { | ||
544 | public: | ||
545 | explicit SqlGetCounter(const CatalogDatabase &database); | ||
546 | bool BindCounter(const std::string &counter); | ||
547 | uint64_t GetCounter() const; | ||
548 | private: | ||
549 | bool compat_; | ||
550 | }; | ||
551 | |||
552 | |||
553 | //------------------------------------------------------------------------------ | ||
554 | |||
555 | |||
556 | class SqlUpdateCounter : public SqlCatalog { | ||
557 | public: | ||
558 | explicit SqlUpdateCounter(const CatalogDatabase &database); | ||
559 | bool BindCounter(const std::string &counter); | ||
560 | bool BindDelta(const int64_t delta); | ||
561 | }; | ||
562 | |||
563 | |||
564 | //------------------------------------------------------------------------------ | ||
565 | |||
566 | |||
567 | class SqlCreateCounter : public SqlCatalog { | ||
568 | public: | ||
569 | explicit SqlCreateCounter(const CatalogDatabase &database); | ||
570 | bool BindCounter(const std::string &counter); | ||
571 | bool BindInitialValue(const int64_t value); | ||
572 | }; | ||
573 | |||
574 | |||
575 | //------------------------------------------------------------------------------ | ||
576 | |||
577 | |||
578 | class SqlAllChunks : public SqlCatalog { | ||
579 | public: | ||
580 | explicit SqlAllChunks(const CatalogDatabase &database); | ||
581 | bool Open(); | ||
582 | bool Next(shash::Any *hash, zlib::Algorithms *compression_alg); | ||
583 | bool Close(); | ||
584 | }; | ||
585 | |||
586 | |||
587 | //------------------------------------------------------------------------------ | ||
588 | |||
589 | |||
590 | class SqlLookupXattrs : public SqlCatalog { | ||
591 | public: | ||
592 | explicit SqlLookupXattrs(const CatalogDatabase &database); | ||
593 | bool BindPathHash(const shash::Md5 &hash); | ||
594 | XattrList GetXattrs(); | ||
595 | }; | ||
596 | |||
597 | } // namespace catalog | ||
598 | |||
599 | #endif // CVMFS_CATALOG_SQL_H_ | ||
600 |