}
}
-void split(const std::string &fn, std::string *dir, std::string *file)
+std::pair<std::string_view, std::string_view>
+split(const std::string &fn)
{
size_t slash = fn.rfind('/');
- *file = fn.substr(slash + 1);
- while (slash && fn[slash-1] == '/')
+ assert(slash != fn.npos);
+ size_t file_begin = slash + 1;
+ while (slash && fn[slash - 1] == '/')
--slash;
- *dir = fn.substr(0, slash);
+ return {string_view(fn.data(), slash),
+ string_view(fn.data() + file_begin,
+ fn.size() - file_begin)};
}
}
{
if (fname[0] == '/')
return target()->NewSequentialFile(fname, result, options);
- std::string dir, file;
- split(fname, &dir, &file);
+ auto [dir, file] = split(fname);
BlueFS::FileReader *h;
int r = fs->open_for_read(dir, file, &h, false);
if (r < 0)
std::unique_ptr<rocksdb::RandomAccessFile>* result,
const rocksdb::EnvOptions& options)
{
- std::string dir, file;
- split(fname, &dir, &file);
+ auto [dir, file] = split(fname);
BlueFS::FileReader *h;
int r = fs->open_for_read(dir, file, &h, true);
if (r < 0)
std::unique_ptr<rocksdb::WritableFile>* result,
const rocksdb::EnvOptions& options)
{
- std::string dir, file;
- split(fname, &dir, &file);
+ auto [dir, file] = split(fname);
BlueFS::FileWriter *h;
int r = fs->open_for_write(dir, file, &h, false);
if (r < 0)
std::unique_ptr<rocksdb::WritableFile>* result,
const rocksdb::EnvOptions& options)
{
- std::string old_dir, old_file;
- split(old_fname, &old_dir, &old_file);
- std::string new_dir, new_file;
- split(new_fname, &new_dir, &new_file);
+ auto [old_dir, old_file] = split(old_fname);
+ auto [new_dir, new_file] = split(new_fname);
int r = fs->rename(old_dir, old_file, new_dir, new_file);
if (r < 0)
{
if (fname[0] == '/')
return target()->FileExists(fname);
- std::string dir, file;
- split(fname, &dir, &file);
+ auto [dir, file] = split(fname);
if (fs->stat(dir, file, NULL, NULL) == 0)
return rocksdb::Status::OK();
return err_to_status(-ENOENT);
rocksdb::Status BlueRocksEnv::DeleteFile(const std::string& fname)
{
- std::string dir, file;
- split(fname, &dir, &file);
+ auto [dir, file] = split(fname);
int r = fs->unlink(dir, file);
if (r < 0)
return err_to_status(r);
const std::string& fname,
uint64_t* file_size)
{
- std::string dir, file;
- split(fname, &dir, &file);
+ auto [dir, file] = split(fname);
int r = fs->stat(dir, file, file_size, NULL);
if (r < 0)
return err_to_status(r);
rocksdb::Status BlueRocksEnv::GetFileModificationTime(const std::string& fname,
uint64_t* file_mtime)
{
- std::string dir, file;
- split(fname, &dir, &file);
+ auto [dir, file] = split(fname);
utime_t mtime;
int r = fs->stat(dir, file, NULL, &mtime);
if (r < 0)
const std::string& src,
const std::string& target)
{
- std::string old_dir, old_file;
- split(src, &old_dir, &old_file);
- std::string new_dir, new_file;
- split(target, &new_dir, &new_file);
+ auto [old_dir, old_file] = split(src);
+ auto [new_dir, new_file] = split(target);
int r = fs->rename(old_dir, old_file, new_dir, new_file);
if (r < 0)
if (fs->dir_exists(path)) {
continue;
}
- std::string dir, file;
- split(path, &dir, &file);
+ auto [dir, file] = split(path);
int r = fs->stat(dir, file, nullptr, nullptr);
if (!r) {
continue;
const std::string& fname,
rocksdb::FileLock** lock)
{
- std::string dir, file;
- split(fname, &dir, &file);
+ auto [dir, file] = split(fname);
BlueFS::FileLock *l = NULL;
int r = fs->lock_file(dir, file, &l);
if (r < 0)