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