XRootD
XrdOssMirageXAttr.cc
Go to the documentation of this file.
1 #include "XrdOssMirageXAttr.hh"
2 #include "XrdVersion.hh"
3 
4 #include <algorithm>
5 #include <stdexcept>
6 #include <string_view>
7 
8 using namespace std::literals;
9 
11 
12 extern "C"
13 {
14  XrdSysXAttr* XrdSysGetXAttrObject(XrdSysError *errP, const char *config_fn, const char *parms)
15  {
16  return new XrdOssMirageXAttr();
17  }
18 }
19 
20 int XrdOssMirageXAttr::Del(const char *Aname, const char *Path, int fd)
21 {
22  if (this->oss == nullptr)
23  return -ENOTSUP;
24 
25  const auto opt = oss->get_entry_write(Path);
26  if (!opt.has_value())
27  return -EINVAL;
28 
29  auto entry = opt.value();
30 
31  const std::string_view name{Aname};
32 
33  if (name == "U.open.return_code"sv)
34  entry->open.return_code = {};
35  else if (name == "U.read.return_code"sv)
36  entry->read.return_code = {};
37  else if (name == "U.read.return_position"sv)
38  entry->read.return_position = {};
39  else if (name == "U.write.return_code"sv)
40  entry->write.return_code = {};
41  else if (name == "U.write.return_position"sv)
42  entry->write.return_position = {};
43  else if (name == "U.pattern"sv)
44  entry->pattern = {};
45  else
46  return -EINVAL;
47 
48  return 0;
49 }
50 
52 {
53 }
54 
55 int XrdOssMirageXAttr::Get(const char *Aname, void *Aval, int Avsz, const char *Path, int fd)
56 {
57  if (this->oss == nullptr)
58  return -ENOTSUP;
59 
60  const auto opt = oss->get_entry_read(Path);
61  if (!opt.has_value())
62  return -EINVAL;
63 
64  const auto entry = opt.value();
65 
66  const std::string_view name{Aname};
67  std::string value{};
68 
69  if (name == "U.open.return_code"sv)
70  value = std::to_string(entry.open.return_code);
71  else if (name == "U.read.return_code"sv)
72  value = std::to_string(entry.read.return_code);
73  else if (name == "U.read.return_position"sv)
74  value = std::to_string(entry.read.return_position);
75  else if (name == "U.write.return_code"sv)
76  value = std::to_string(entry.write.return_code);
77  else if (name == "U.write.return_position"sv)
78  value = std::to_string(entry.write.return_position);
79  else if (name == "U.pattern"sv)
80  value = entry.pattern;
81  else
82  return -EINVAL;
83 
84  const int num_bytes = std::min(static_cast<std::size_t>(Avsz), value.size());
85  std::copy_n(value.begin(), num_bytes, static_cast<char *>(Aval));
86 
87  return num_bytes;
88 }
89 
90 int XrdOssMirageXAttr::List(AList **aPL, const char *Path, int fd, int getSz)
91 {
92  return -ENOTSUP;
93 }
94 
95 int XrdOssMirageXAttr::Set(const char *Aname, const void *Aval, int Avsz, const char *Path, int fd, int isNew)
96 {
97  if (this->oss == nullptr)
98  return -ENOTSUP;
99 
100  const auto opt = oss->get_entry_write(Path);
101  if (!opt.has_value())
102  return -EINVAL;
103 
104  auto entry = opt.value();
105 
106  const std::string_view name{Aname};
107  const std::string value(static_cast<const char *>(Aval), Avsz);
108 
109  try
110  {
111  if (name == "U.open.return_code"sv)
112  entry->open.return_code = std::stoi(value);
113  else if (name == "U.read.return_code"sv)
114  entry->read.return_code = std::stoi(value);
115  else if (name == "U.read.return_position"sv)
116  entry->read.return_position = std::stoll(value);
117  else if (name == "U.write.return_code"sv)
118  entry->write.return_code = std::stoi(value);
119  else if (name == "U.write.return_position"sv)
120  entry->write.return_position = std::stoll(value);
121  else if (name == "U.pattern"sv)
122  entry->pattern = value;
123  else
124  return -EINVAL;
125  }
126  catch(std::out_of_range &)
127  {
128  return -EINVAL;
129  }
130 
131  return 0;
132 }
133 
135 {
136  if (this->oss == nullptr)
137  this->oss = &oss;
138 }
XrdVERSIONINFO(XrdSysGetXAttrObject, XrdOssMirageXAttr)
XrdSysXAttr * XrdSysGetXAttrObject(XrdSysError *errP, const char *config_fn, const char *parms)
XrdOucString Path
void setOss(XrdOssMirage &oss)
virtual int Get(const char *Aname, void *Aval, int Avsz, const char *Path, int fd=-1) override
virtual int Del(const char *Aname, const char *Path, int fd=-1) override
virtual void Free(AList *aPL) override
virtual int List(AList **aPL, const char *Path, int fd=-1, int getSz=0) override
virtual int Set(const char *Aname, const void *Aval, int Avsz, const char *Path, int fd=-1, int isNew=0) override