GCC Code Coverage Report
Directory: cvmfs/ Exec Total Coverage
File: cvmfs/swissknife_assistant.cc Lines: 0 50 0.0 %
Date: 2019-02-03 02:48:13 Branches: 0 30 0.0 %

Line Branch Exec Source
1
/**
2
 * This file is part of the CernVM File System
3
 */
4
#include "cvmfs_config.h"
5
#include "swissknife_assistant.h"
6
7
#include <unistd.h>
8
9
#include <cassert>
10
#include <cstdlib>
11
12
#include "catalog.h"
13
#include "catalog_rw.h"
14
#include "download.h"
15
#include "history.h"
16
#include "history_sqlite.h"
17
#include "logging.h"
18
#include "manifest.h"
19
#include "util/posix.h"
20
21
using namespace std;  // NOLINT
22
23
namespace swissknife {
24
25
catalog::Catalog *Assistant::GetCatalog(
26
  const shash::Any &catalog_hash,
27
  OpenMode open_mode)
28
{
29
  assert(shash::kSuffixCatalog == catalog_hash.suffix);
30
  string local_path = CreateTempPath(tmp_dir_ + "/catalog", 0600);
31
  assert(!local_path.empty());
32
33
  if (!FetchObject(catalog_hash, local_path)) {
34
    return NULL;
35
  }
36
37
  const std::string catalog_root_path = "";
38
  catalog::Catalog *catalog;
39
  switch (open_mode) {
40
    case kOpenReadWrite:
41
      catalog = catalog::WritableCatalog::AttachFreely(catalog_root_path,
42
                                                      local_path,
43
                                                      catalog_hash);
44
      break;
45
    case kOpenReadOnly:
46
      catalog = catalog::Catalog::AttachFreely(catalog_root_path,
47
                                               local_path,
48
                                               catalog_hash);
49
      break;
50
    default:
51
      abort();
52
  }
53
  assert(catalog != NULL);
54
  catalog->TakeDatabaseFileOwnership();
55
  return catalog;
56
}
57
58
59
history::History *Assistant::GetHistory(OpenMode open_mode) {
60
  const shash::Any history_hash = manifest_->history();
61
  history::History *history;
62
63
  string local_path = CreateTempPath(tmp_dir_ + "/history", 0600);
64
  assert(!local_path.empty());
65
66
  if (history_hash.IsNull()) {
67
    history = history::SqliteHistory::Create(local_path,
68
                                             manifest_->repository_name());
69
    if (NULL == history) {
70
      LogCvmfs(kLogCvmfs, kLogStderr, "failed to create history database");
71
      return NULL;
72
    }
73
    return history;
74
  }
75
76
  if (!FetchObject(history_hash, local_path))
77
    return NULL;
78
79
  switch (open_mode) {
80
    case kOpenReadWrite:
81
      history = history::SqliteHistory::OpenWritable(local_path);
82
      break;
83
    case kOpenReadOnly:
84
      history = history::SqliteHistory::Open(local_path);
85
      break;
86
    default:
87
      abort();
88
  }
89
90
  if (history == NULL) {
91
    LogCvmfs(kLogCvmfs, kLogStderr, "failed to open history database (%s)",
92
             local_path.c_str());
93
    unlink(local_path.c_str());
94
    return NULL;
95
  }
96
  assert(history->fqrn() == manifest_->repository_name());
97
  history->TakeDatabaseFileOwnership();
98
  return history;
99
}
100
101
102
bool Assistant::FetchObject(const shash::Any &id, const string &local_path) {
103
  assert(!id.IsNull());
104
105
  download::Failures dl_retval;
106
  const std::string url = repository_url_ + "/data/" + id.MakePath();
107
  download::JobInfo download_info(&url, true, false, &local_path, &id);
108
  dl_retval = download_mgr_->Fetch(&download_info);
109
110
  if (dl_retval != download::kFailOk) {
111
    LogCvmfs(kLogCvmfs, kLogStderr, "failed to download object '%s' (%d - %s)",
112
             id.ToStringWithSuffix().c_str(),
113
             dl_retval, download::Code2Ascii(dl_retval));
114
    return false;
115
  }
116
  return true;
117
}
118
119
}  // namespace swissknife