CernVM-FS  2.12.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
catalog_sql.h
Go to the documentation of this file.
1 
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.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
54 
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
65  CatalogDatabase(const std::string &filename,
66  const OpenMode open_mode)
67  : sqlite::Database<CatalogDatabase>(filename, open_mode) { }
68 };
69 
70 
71 //------------------------------------------------------------------------------
72 
73 
78 class SqlCatalog : public sqlite::Sql {
79  public:
85  SqlCatalog(const CatalogDatabase &database, const std::string &statement) {
86  Init(database.sqlite_db(), statement);
87  }
88 
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 
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  RetrieveBlob(idx_column));
114  const int byte_count = RetrieveBytes(idx_column);
115  return (byte_count > 0) ? shash::Any(hash_algo, buffer, hash_suffix)
116  : shash::Any(hash_algo);
117  }
118 
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 
138  inline bool BindMd5(const int idx_high, const int idx_low,
139  const shash::Md5 &hash)
140  {
141  uint64_t high, low;
142  hash.ToIntPair(&high, &low);
143  const bool retval = BindInt64(idx_high, static_cast<int64_t>(high)) &&
144  BindInt64(idx_low, static_cast<int64_t>(low));
145  return retval;
146  }
147 
155  inline bool BindHashBlob(const int idx_column, const shash::Any &hash) {
156  if (hash.IsNull()) {
157  return BindNull(idx_column);
158  } else {
159  return BindBlob(idx_column, hash.digest, hash.GetDigestSize());
160  }
161  }
162 
163  protected:
164  SqlCatalog() : sqlite::Sql() {}
165 };
166 
167 
168 //------------------------------------------------------------------------------
169 
170 
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;
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;
207  static const int kFlagDirBindMountpoint = 0x4000; // 2^14
212  static const int kFlagHidden = 0x8000; // 2^15
216  static const int kFlagDirectIo = 0x10000; // 2^16
217 
218 
219  protected:
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 
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 
246  void ExpandSymlink(LinkString *raw_symlink) const;
247 };
248 
249 
250 //------------------------------------------------------------------------------
251 
252 
253 class SqlDirentWrite : public SqlDirent {
254  public:
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 flags_idx,
269  const int name_idx,
270  const int symlink_idx,
271  const int uid_idx,
272  const int gid_idx,
273  const DirectoryEntry &entry);
274 };
275 
276 
277 //------------------------------------------------------------------------------
278 
279 
281  public:
282  explicit SqlListContentHashes(const CatalogDatabase &database);
283  shash::Any GetHash() const;
284 };
285 
286 
287 //------------------------------------------------------------------------------
288 
289 
290 class SqlLookup : public SqlDirent {
291  public:
297  DirectoryEntry GetDirent(const Catalog *catalog,
298  const bool expand_symlink = true) const;
299 
305  shash::Md5 GetPathHash() const;
306 
313 };
314 
315 
316 //------------------------------------------------------------------------------
317 
318 
319 class SqlListing : public SqlLookup {
320  public:
321  explicit SqlListing(const CatalogDatabase &database);
322  bool BindPathHash(const struct shash::Md5 &hash);
323 };
324 
325 
326 //------------------------------------------------------------------------------
327 
328 
329 class SqlLookupPathHash : public SqlLookup {
330  public:
331  explicit SqlLookupPathHash(const CatalogDatabase &database);
332  bool BindPathHash(const struct shash::Md5 &hash);
333 };
334 
335 
336 //------------------------------------------------------------------------------
337 
338 
339 class SqlLookupInode : public SqlLookup {
340  public:
341  explicit SqlLookupInode(const CatalogDatabase &database);
342  bool BindRowId(const uint64_t inode);
343 };
344 
345 
346 //------------------------------------------------------------------------------
347 
348 
365  public:
366  explicit SqlLookupDanglingMountpoints(const CatalogDatabase &database);
367 };
368 
369 
370 //------------------------------------------------------------------------------
371 
372 
381 class SqlDirentTouch : public SqlCatalog {
382  public:
383  explicit SqlDirentTouch(const CatalogDatabase &database);
384 
385  bool BindDirentBase(const DirectoryEntryBase &entry);
386  bool BindPathHash(const shash::Md5 &hash);
387  bool BindXattr(const XattrList &xattrs);
388  bool BindXattrEmpty();
389 };
390 
391 
392 //------------------------------------------------------------------------------
393 
394 
399  public:
400  explicit SqlNestedCatalogLookup(const CatalogDatabase &database);
401  bool BindSearchPath(const PathString &path);
402  shash::Any GetContentHash() const;
403  uint64_t GetSize() const;
404 };
405 
406 
407 //------------------------------------------------------------------------------
408 
409 
414  public:
415  explicit SqlNestedCatalogListing(const CatalogDatabase &database);
416  PathString GetPath() const;
417  shash::Any GetContentHash() const;
418  uint64_t GetSize() const;
419 };
420 
421 
422 //------------------------------------------------------------------------------
423 
424 
429  public:
430  explicit SqlOwnNestedCatalogListing(const CatalogDatabase &database);
431  PathString GetPath() const;
432  shash::Any GetContentHash() const;
433  uint64_t GetSize() const;
434 };
435 
436 
437 //------------------------------------------------------------------------------
438 
439 
441  public:
442  explicit SqlDirentInsert(const CatalogDatabase &database);
443  bool BindPathHash(const shash::Md5 &hash);
444  bool BindParentPathHash(const shash::Md5 &hash);
445  bool BindDirent(const DirectoryEntry &entry);
446  bool BindXattr(const XattrList &xattrs);
447  bool BindXattrEmpty();
448 };
449 
450 
451 //------------------------------------------------------------------------------
452 
453 
455  public:
456  explicit SqlDirentUpdate(const CatalogDatabase &database);
457  bool BindPathHash(const shash::Md5 &hash);
458  bool BindDirent(const DirectoryEntry &entry);
459 };
460 
461 
462 //------------------------------------------------------------------------------
463 
464 
465 class SqlDirentUnlink : public SqlCatalog {
466  public:
467  explicit SqlDirentUnlink(const CatalogDatabase &database);
468  bool BindPathHash(const shash::Md5 &hash);
469 };
470 
471 
472 //------------------------------------------------------------------------------
473 
474 
478 class SqlIncLinkcount : public SqlCatalog {
479  public:
480  explicit SqlIncLinkcount(const CatalogDatabase &database);
481  bool BindPathHash(const shash::Md5 &hash);
482  bool BindDelta(const int delta);
483 };
484 
485 
486 //------------------------------------------------------------------------------
487 
488 
489 class SqlChunkInsert : public SqlCatalog {
490  public:
491  explicit SqlChunkInsert(const CatalogDatabase &database);
492  bool BindPathHash(const shash::Md5 &hash);
493  bool BindFileChunk(const FileChunk &chunk);
494 };
495 
496 
497 //------------------------------------------------------------------------------
498 
499 
500 class SqlChunksRemove : public SqlCatalog {
501  public:
502  explicit SqlChunksRemove(const CatalogDatabase &database);
503  bool BindPathHash(const shash::Md5 &hash);
504 };
505 
506 
507 //------------------------------------------------------------------------------
508 
509 
510 class SqlChunksListing : public SqlCatalog {
511  public:
512  explicit SqlChunksListing(const CatalogDatabase &database);
513  bool BindPathHash(const shash::Md5 &hash);
514  FileChunk GetFileChunk(const shash::Algorithms interpret_hash_as) const;
515 };
516 
517 
518 //------------------------------------------------------------------------------
519 
520 
521 class SqlChunksCount : public SqlCatalog {
522  public:
523  explicit SqlChunksCount(const CatalogDatabase &database);
524  bool BindPathHash(const shash::Md5 &hash);
525  int GetChunkCount() const;
526 };
527 
528 
529 //------------------------------------------------------------------------------
530 
531 
533  public:
534  explicit SqlMaxHardlinkGroup(const CatalogDatabase &database);
535  uint32_t GetMaxGroupId() const;
536 };
537 
538 
539 //------------------------------------------------------------------------------
540 
541 
542 class SqlGetCounter : public SqlCatalog {
543  public:
544  explicit SqlGetCounter(const CatalogDatabase &database);
545  bool BindCounter(const std::string &counter);
546  uint64_t GetCounter() const;
547  private:
548  bool compat_;
549 };
550 
551 
552 //------------------------------------------------------------------------------
553 
554 
555 class SqlUpdateCounter : public SqlCatalog {
556  public:
557  explicit SqlUpdateCounter(const CatalogDatabase &database);
558  bool BindCounter(const std::string &counter);
559  bool BindDelta(const int64_t delta);
560 };
561 
562 
563 //------------------------------------------------------------------------------
564 
565 
566 class SqlCreateCounter : public SqlCatalog {
567  public:
568  explicit SqlCreateCounter(const CatalogDatabase &database);
569  bool BindCounter(const std::string &counter);
570  bool BindInitialValue(const int64_t value);
571 };
572 
573 
574 //------------------------------------------------------------------------------
575 
576 
577 class SqlAllChunks : public SqlCatalog {
578  public:
579  explicit SqlAllChunks(const CatalogDatabase &database);
580  bool Open();
581  bool Next(shash::Any *hash, zlib::Algorithms *compression_alg);
582  bool Close();
583 };
584 
585 
586 //------------------------------------------------------------------------------
587 
588 
589 class SqlLookupXattrs : public SqlCatalog {
590  public:
591  explicit SqlLookupXattrs(const CatalogDatabase &database);
592  bool BindPathHash(const shash::Md5 &hash);
594 };
595 
596 } // namespace catalog
597 
598 #endif // CVMFS_CATALOG_SQL_H_
bool BindSearchPath(const PathString &path)
Definition: catalog_sql.cc:909
static const int kFlagDirNestedMountpoint
Definition: catalog_sql.h:180
bool BindCounter(const std::string &counter)
shash::Any GetHash() const
Definition: catalog_sql.cc:626
SqlAllChunks(const CatalogDatabase &database)
bool IsNull() const
Definition: hash.h:383
shash::Md5 GetPathHash() const
Definition: catalog_sql.cc:683
SqlListing(const CatalogDatabase &database)
Definition: catalog_sql.cc:767
static const int kFlagPosCompression
Definition: catalog_sql.h:202
SqlIncLinkcount(const CatalogDatabase &database)
bool BindDirentBase(const DirectoryEntryBase &entry)
Definition: catalog_sql.cc:841
const std::string & filename() const
Definition: sql.h:148
shash::Algorithms RetrieveHashAlgorithm(const unsigned flags) const
Definition: catalog_sql.cc:463
bool Init(const sqlite3 *database, const std::string &statement)
Definition: sql.cc:132
static const int kFlagDirNestedRoot
Definition: catalog_sql.h:182
bool BindPathHash(const shash::Md5 &hash)
SqlLookupPathHash(const CatalogDatabase &database)
Definition: catalog_sql.cc:782
bool BindDirent(const DirectoryEntry &entry)
void ToIntPair(uint64_t *lo, uint64_t *hi) const
Definition: hash.cc:385
bool BindRowId(const uint64_t inode)
Definition: catalog_sql.cc:802
SqlCreateCounter(const CatalogDatabase &database)
const void * RetrieveBlob(const int idx_column) const
Definition: sql.h:436
bool BindFileChunk(const FileChunk &chunk)
SqlUpdateCounter(const CatalogDatabase &database)
bool BindPathHash(const shash::Md5 &hash)
Definition: catalog_sql.cc:854
static const int kFlagPosHash
Definition: catalog_sql.h:199
SqlGetCounter(const CatalogDatabase &database)
SqlCatalog(const CatalogDatabase &database, const std::string &statement)
Definition: catalog_sql.h:85
DirectoryEntry GetDirent(const Catalog *catalog, const bool expand_symlink=true) const
Definition: catalog_sql.cc:696
shash::Md5 RetrieveMd5(const int idx_high, const int idx_low) const
Definition: catalog_sql.h:95
SqlDirentInsert(const CatalogDatabase &database)
SqlLookupInode(const CatalogDatabase &database)
Definition: catalog_sql.cc:796
bool BindPathHash(const shash::Md5 &hash)
uint32_t Hardlinks2HardlinkGroup(const uint64_t hardlinks) const
Definition: catalog_sql.cc:487
SqlListContentHashes(const CatalogDatabase &database)
Definition: catalog_sql.cc:599
Database(const std::string &filename, const OpenMode open_mode)
Definition: sql_impl.h:21
static const int kFlagFileChunk
Definition: catalog_sql.h:186
SqlNestedCatalogListing(const CatalogDatabase &database)
Definition: catalog_sql.cc:930
shash::Any GetContentHash() const
Definition: catalog_sql.cc:914
bool BindPathHash(const shash::Md5 &hash)
SqlChunksListing(const CatalogDatabase &database)
int GetChunkCount() const
static const int kFlagFile
Definition: catalog_sql.h:183
uint64_t GetCounter() const
unsigned char digest[digest_size_]
Definition: hash.h:124
Sql()
Definition: sql.h:458
static const int kFlagLink
Definition: catalog_sql.h:184
bool BindCounter(const std::string &counter)
bool BindPathHash(const shash::Md5 &hash)
bool BindXattr(const XattrList &xattrs)
Definition: catalog_sql.cc:859
Algorithms
Definition: hash.h:41
zlib::Algorithms RetrieveCompressionAlgorithm(const unsigned flags) const
Definition: catalog_sql.cc:472
bool BindCounter(const std::string &counter)
bool BindDelta(const int delta)
Algorithms
Definition: compression.h:44
unsigned GetDigestSize() const
Definition: hash.h:168
static const int kFlagDirBindMountpoint
Definition: catalog_sql.h:207
bool BindPathHash(const shash::Md5 &hash)
SqlChunksRemove(const CatalogDatabase &database)
bool Next(shash::Any *hash, zlib::Algorithms *compression_alg)
SqlOwnNestedCatalogListing(const CatalogDatabase &database)
Definition: catalog_sql.cc:985
static const int kFlagFileSpecial
Definition: catalog_sql.h:185
static const int kFlagFileExternal
Definition: catalog_sql.h:192
SqlDirentTouch(const CatalogDatabase &database)
Definition: catalog_sql.cc:829
bool BindHashBlob(const int idx_column, const shash::Any &hash)
Definition: catalog_sql.h:155
bool BindXattr(const XattrList &xattrs)
bool InsertInitialValues(const std::string &root_path, const bool volatile_content, const std::string &voms_authz, const DirectoryEntry &root_entry=DirectoryEntry(kDirentNegative))
Definition: catalog_sql.cc:263
SqlNestedCatalogLookup(const CatalogDatabase &database)
Definition: catalog_sql.cc:877
sqlite3_int64 RetrieveInt64(const int idx_column) const
Definition: sql.h:445
bool BindBlob(const int index, const void *value, const unsigned size)
Definition: sql.h:355
bool SetVOMSAuthz(const std::string &)
Definition: catalog_sql.cc:361
uint64_t MakeHardlinks(const uint32_t hardlink_group, const uint32_t linkcount) const
Definition: catalog_sql.cc:492
bool BindPathHash(const shash::Md5 &hash)
bool BindPathHash(const struct shash::Md5 &hash)
Definition: catalog_sql.cc:788
static const int kFlagDirectIo
Definition: catalog_sql.h:216
SqlDirentUpdate(const CatalogDatabase &database)
sqlite3 * sqlite_db() const
Definition: sql.h:147
static const float kLatestSchema
Definition: catalog_sql.h:43
bool BindInt64(const int index, const sqlite3_int64 value)
Definition: sql.h:381
bool BindPathHash(const struct shash::Md5 &hash)
Definition: catalog_sql.cc:774
shash::Any RetrieveHashBlob(const int idx_column, const shash::Algorithms hash_algo, const char hash_suffix=shash::kSuffixNone) const
Definition: catalog_sql.h:102
shash::Any RetrieveHashHex(const int idx_column, const char hash_suffix=shash::kSuffixNone) const
Definition: catalog_sql.h:122
bool CompactDatabase() const
Definition: catalog_sql.cc:396
bool BindDirentFields(const int hash_idx, const int hardlinks_idx, const int size_idx, const int mode_idx, const int mtime_idx, const int flags_idx, const int name_idx, const int symlink_idx, const int uid_idx, const int gid_idx, const DirectoryEntry &entry)
Definition: catalog_sql.cc:565
const unsigned char * RetrieveText(const int idx_column) const
Definition: sql.h:448
SqlLookupDanglingMountpoints(const CatalogDatabase &database)
Definition: catalog_sql.cc:810
shash::Any GetContentHash() const
Definition: catalog_sql.cc:969
FileChunk GetFileChunk(const shash::Algorithms interpret_hash_as) const
virtual bool BindDirent(const DirectoryEntry &entry)=0
SqlLookupXattrs(const CatalogDatabase &database)
SqlChunkInsert(const CatalogDatabase &database)
static const int kFlagHidden
Definition: catalog_sql.h:212
Any MkFromHexPtr(const HexPtr hex, const char suffix)
Definition: hash.cc:83
uint32_t Hardlinks2Linkcount(const uint64_t hardlinks) const
Definition: catalog_sql.cc:482
shash::Md5 GetParentPathHash() const
Definition: catalog_sql.cc:688
static const float kLatestSupportedSchema
Definition: catalog_sql.h:44
double GetRowIdWasteRatio() const
Definition: catalog_sql.cc:366
unsigned CreateDatabaseFlags(const DirectoryEntry &entry) const
Definition: catalog_sql.cc:417
bool BindDelta(const int64_t delta)
bool BindMd5(const int idx_high, const int idx_low, const shash::Md5 &hash)
Definition: catalog_sql.h:138
bool BindNull(const int index)
Definition: sql.h:386
bool BindParentPathHash(const shash::Md5 &hash)
static const unsigned kLatestSchemaRevision
Definition: catalog_sql.h:46
static const int kFlagDir
Definition: catalog_sql.h:178
CatalogDatabase(const std::string &filename, const OpenMode open_mode)
Definition: catalog_sql.h:65
const char kSuffixNone
Definition: hash.h:53
bool BindInitialValue(const int64_t value)
bool BindPathHash(const shash::Md5 &hash)
SqlChunksCount(const CatalogDatabase &database)
int RetrieveBytes(const int idx_column) const
Definition: sql.h:433
bool BindPathHash(const shash::Md5 &hash)
bool BindDirent(const DirectoryEntry &entry)
void StoreHashAlgorithm(const shash::Algorithms algo, unsigned *flags) const
Definition: catalog_sql.cc:454
void ExpandSymlink(LinkString *raw_symlink) const
Definition: catalog_sql.cc:504