/ src / leveldb / util / env.cc
env.cc
 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