env.cc raw

   1  // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
   2  // Use of this source code is governed by a BSD-style license that can be
   3  // found in the LICENSE file. See the AUTHORS file for names of contributors.
   4  
   5  #include "leveldb/env.h"
   6  
   7  namespace leveldb {
   8  
   9  Env::~Env() = default;
  10  
  11  Status Env::NewAppendableFile(const std::string& fname, WritableFile** result) {
  12    return Status::NotSupported("NewAppendableFile", fname);
  13  }
  14  
  15  SequentialFile::~SequentialFile() = default;
  16  
  17  RandomAccessFile::~RandomAccessFile() = default;
  18  
  19  WritableFile::~WritableFile() = default;
  20  
  21  Logger::~Logger() = default;
  22  
  23  FileLock::~FileLock() = default;
  24  
  25  void Log(Logger* info_log, const char* format, ...) {
  26    if (info_log != nullptr) {
  27      va_list ap;
  28      va_start(ap, format);
  29      info_log->Logv(format, ap);
  30      va_end(ap);
  31    }
  32  }
  33  
  34  static Status DoWriteStringToFile(Env* env, const Slice& data,
  35                                    const std::string& fname, bool should_sync) {
  36    WritableFile* file;
  37    Status s = env->NewWritableFile(fname, &file);
  38    if (!s.ok()) {
  39      return s;
  40    }
  41    s = file->Append(data);
  42    if (s.ok() && should_sync) {
  43      s = file->Sync();
  44    }
  45    if (s.ok()) {
  46      s = file->Close();
  47    }
  48    delete file;  // Will auto-close if we did not close above
  49    if (!s.ok()) {
  50      env->DeleteFile(fname);
  51    }
  52    return s;
  53  }
  54  
  55  Status WriteStringToFile(Env* env, const Slice& data,
  56                           const std::string& fname) {
  57    return DoWriteStringToFile(env, data, fname, false);
  58  }
  59  
  60  Status WriteStringToFileSync(Env* env, const Slice& data,
  61                               const std::string& fname) {
  62    return DoWriteStringToFile(env, data, fname, true);
  63  }
  64  
  65  Status ReadFileToString(Env* env, const std::string& fname, std::string* data) {
  66    data->clear();
  67    SequentialFile* file;
  68    Status s = env->NewSequentialFile(fname, &file);
  69    if (!s.ok()) {
  70      return s;
  71    }
  72    static const int kBufferSize = 8192;
  73    char* space = new char[kBufferSize];
  74    while (true) {
  75      Slice fragment;
  76      s = file->Read(kBufferSize, &fragment, space);
  77      if (!s.ok()) {
  78        break;
  79      }
  80      data->append(fragment.data(), fragment.size());
  81      if (fragment.empty()) {
  82        break;
  83      }
  84    }
  85    delete[] space;
  86    delete file;
  87    return s;
  88  }
  89  
  90  EnvWrapper::~EnvWrapper() {}
  91  
  92  }  // namespace leveldb
  93