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