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