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 
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 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 
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:
298  DirectoryEntry GetDirent(const Catalog *catalog,
299  const bool expand_symlink = true) const;
300 
306  shash::Md5 GetPathHash() const;
307 
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 
366  public:
367  explicit SqlLookupDanglingMountpoints(const CatalogDatabase &database);
368 };
369 
370 
371 //------------------------------------------------------------------------------
372 
373 
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 
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 
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 
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 
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 
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 
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 
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);
595 };
596 
597 } // namespace catalog
598 
599 #endif // CVMFS_CATALOG_SQL_H_
bool BindSearchPath(const PathString &path)
Definition: catalog_sql.cc:957
static const int kFlagDirNestedMountpoint
Definition: catalog_sql.h:180
bool BindCounter(const std::string &counter)
shash::Any GetHash() const
Definition: catalog_sql.cc:655
SqlAllChunks(const CatalogDatabase &database)
bool IsNull() const
Definition: hash.h:383
shash::Md5 GetPathHash() const
Definition: catalog_sql.cc:722
SqlListing(const CatalogDatabase &database)
Definition: catalog_sql.cc:807
static const int kFlagPosCompression
Definition: catalog_sql.h:202
SqlIncLinkcount(const CatalogDatabase &database)
bool BindDirentBase(const DirectoryEntryBase &entry)
Definition: catalog_sql.cc:883
const std::string & filename() const
Definition: sql.h:148
shash::Algorithms RetrieveHashAlgorithm(const unsigned flags) const
Definition: catalog_sql.cc:483
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:822
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:842
SqlCreateCounter(const CatalogDatabase &database)
const void * RetrieveBlob(const int idx_column) const
Definition: sql.h:436
bool BindDirentFields(const int hash_idx, const int hardlinks_idx, const int size_idx, const int mode_idx, const int mtime_idx, const int mtimens_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:585
bool BindFileChunk(const FileChunk &chunk)
SqlUpdateCounter(const CatalogDatabase &database)
bool BindPathHash(const shash::Md5 &hash)
Definition: catalog_sql.cc:902
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:735
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:836
bool BindPathHash(const shash::Md5 &hash)
uint32_t Hardlinks2HardlinkGroup(const uint64_t hardlinks) const
Definition: catalog_sql.cc:507
SqlListContentHashes(const CatalogDatabase &database)
Definition: catalog_sql.cc:628
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:978
shash::Any GetContentHash() const
Definition: catalog_sql.cc:962
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:463
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:907
Algorithms
Definition: hash.h:41
zlib::Algorithms RetrieveCompressionAlgorithm(const unsigned flags) const
Definition: catalog_sql.cc:492
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)
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:869
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:283
SqlNestedCatalogLookup(const CatalogDatabase &database)
Definition: catalog_sql.cc:925
sqlite3_int64 RetrieveInt64(const int idx_column) const
Definition: sql.h:450
bool BindBlob(const int index, const void *value, const unsigned size)
Definition: sql.h:355
bool SetVOMSAuthz(const std::string &)
Definition: catalog_sql.cc:381
uint64_t MakeHardlinks(const uint32_t hardlink_group, const uint32_t linkcount) const
Definition: catalog_sql.cc:512
bool BindPathHash(const shash::Md5 &hash)
bool BindPathHash(const struct shash::Md5 &hash)
Definition: catalog_sql.cc:828
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:814
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:416
const unsigned char * RetrieveText(const int idx_column) const
Definition: sql.h:453
SqlLookupDanglingMountpoints(const CatalogDatabase &database)
Definition: catalog_sql.cc:850
shash::Any GetContentHash() const
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:502
shash::Md5 GetParentPathHash() const
Definition: catalog_sql.cc:727
static const float kLatestSupportedSchema
Definition: catalog_sql.h:44
double GetRowIdWasteRatio() const
Definition: catalog_sql.cc:386
unsigned CreateDatabaseFlags(const DirectoryEntry &entry) const
Definition: catalog_sql.cc:437
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:474
void ExpandSymlink(LinkString *raw_symlink) const
Definition: catalog_sql.cc:524