11 namespace SWC {
namespace FS {
15 std::this_thread::sleep_for(std::chrono::microseconds(10000));
21 m_fs(use_filesystem(settings)),
34 #if defined (BUILTIN_FS_LOCAL) || defined (BUILTIN_FS_ALL)
37 fs_name.append(
"local");
42 #if defined (BUILTIN_FS_BROKER) || defined (BUILTIN_FS_ALL)
45 fs_name.append(
"broker");
50 #if defined (BUILTIN_FS_HADOOP) || defined (BUILTIN_FS_ALL)
53 fs_name.append(
"hadoop");
58 #if defined (BUILTIN_FS_HADOOP_JVM) || defined (BUILTIN_FS_ALL)
61 fs_name.append(
"hadoop_jvm");
66 #if defined (BUILTIN_FS_CEPH) || defined (BUILTIN_FS_ALL)
69 fs_name.append(
"ceph");
74 fs_name.append(
"custom");
80 "Not implemented FileSystem name=%s type=%d",
81 fs_name.c_str(),
int(
m_type));
84 std::string cfg_lib(
"swc.fs.lib." + fs_name);
86 if(settings->has(cfg_lib.c_str())) {
87 fs_lib = settings->get_str(cfg_lib.c_str());
89 fs_lib.reserve(settings->install_path.length() + 20 + fs_name.length());
90 fs_lib.append(settings->install_path);
91 fs_lib.append(
"/lib/libswcdb_fs_");
92 fs_lib.append(fs_name);
96 const char* err = dlerror();
97 void* handle = dlopen(fs_lib.c_str(), RTLD_NOW | RTLD_LAZY | RTLD_LOCAL);
100 "Shared Lib %s, open fail: %s\n",
101 fs_lib.c_str(), err);
104 std::string handler_name(
"fs_make_new_" + fs_name);
105 void* f_new_ptr = dlsym(handle, handler_name.c_str());
106 if (err || !f_new_ptr)
108 "Shared Lib %s, link(%s) fail: %s handle=%p\n",
109 fs_lib.c_str(), handler_name.c_str(), err, handle);
125 return m_fs->get_type_underlying();
129 return format(
"FS::Interface(type=%d, details=%s)",
134 return m_fs->need_fds();
143 const std::string& base_id) {
152 for(
auto& entry : dirs) {
153 if(!entry.is_dir)
continue;
156 id_name.reserve(base_id.length() + entry.name.length());
157 id_name.append(base_id);
159 id_name.append(entry.name.substr(0, entry.name.length()-1));
169 std::string new_base_path;
170 new_base_path.reserve(base_path.length() + 1 + entry.name.length());
171 new_base_path.append(base_path);
172 new_base_path.append(
"/");
173 new_base_path.append(entry.name);
174 id_name.append(entry.name);
217 const std::string& name) {
218 m_fs->exists([name, cb=std::move(cb),
ptr=
ptr()]
219 (
int err,
bool state)
mutable {
223 ptr->exists(std::move(cb), name);
262 const std::string& up_to) {
267 const char* p=name.data();
268 std::string base_path;
269 for(
const char* c=p+name.length(); c>p; --c) {
272 base_path = std::string(p, c-p);
277 readdir(err, base_path, entrs);
278 if(!err && !entrs.
size()) {
279 rmdir(err, base_path);
306 const std::string& name) {
307 m_fs->remove([name, cb=std::move(cb),
ptr=
ptr()]
318 ptr->remove(std::move(cb), name);
327 const std::string& to) {
376 for(buffer.
own=
false;;) {
421 if(smartfd->valid()) {
423 m_fs->close(tmperr, smartfd);
438 if(smartfd->valid()) {
440 m_fs->close(tmperr, smartfd);
447 while(smartfd->valid()) {
469 [cb=std::move(cb), _smartfd=smartfd,
ptr=
ptr()] (
int err)
mutable {
480 if(!_smartfd->valid())
485 ptr->close(std::move(cb), _smartfd);
495 auto it = number.cbegin();
503 s.append(it, number.cend());
520 : m_interface(new FS::Interface(settings ,typ)) {