Line | Count | Source |
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 | | #include <cstdarg> |
8 | | |
9 | | // This workaround can be removed when leveldb::Env::DeleteFile is removed. |
10 | | // See env.h for justification. |
11 | | #if defined(_WIN32) && defined(LEVELDB_DELETEFILE_UNDEFINED) |
12 | | #undef DeleteFile |
13 | | #endif |
14 | | |
15 | | namespace leveldb { |
16 | | |
17 | 1 | Env::Env() = default; |
18 | | |
19 | 0 | Env::~Env() = default; |
20 | | |
21 | 0 | Status Env::NewAppendableFile(const std::string& fname, WritableFile** result) { |
22 | 0 | return Status::NotSupported("NewAppendableFile", fname); |
23 | 0 | } |
24 | | |
25 | 0 | Status Env::RemoveDir(const std::string& dirname) { return DeleteDir(dirname); } |
26 | 0 | Status Env::DeleteDir(const std::string& dirname) { return RemoveDir(dirname); } |
27 | | |
28 | 0 | Status Env::RemoveFile(const std::string& fname) { return DeleteFile(fname); } |
29 | 0 | Status Env::DeleteFile(const std::string& fname) { return RemoveFile(fname); } |
30 | | |
31 | 276 | SequentialFile::~SequentialFile() = default; |
32 | | |
33 | 79 | RandomAccessFile::~RandomAccessFile() = default; |
34 | | |
35 | 529 | WritableFile::~WritableFile() = default; |
36 | | |
37 | 113 | Logger::~Logger() = default; |
38 | | |
39 | 113 | FileLock::~FileLock() = default; |
40 | | |
41 | 477 | void Log(Logger* info_log, const char* format, ...) { |
42 | 477 | if (info_log != nullptr) { |
43 | 477 | std::va_list ap; |
44 | 477 | va_start(ap, format); |
45 | 477 | info_log->Logv(format, ap); |
46 | 477 | va_end(ap); |
47 | 477 | } |
48 | 477 | } |
49 | | |
50 | | static Status DoWriteStringToFile(Env* env, const Slice& data, |
51 | 177 | const std::string& fname, bool should_sync) { |
52 | 177 | WritableFile* file; |
53 | 177 | Status s = env->NewWritableFile(fname, &file); |
54 | 177 | if (!s.ok()) { |
55 | 0 | return s; |
56 | 0 | } |
57 | 177 | s = file->Append(data); |
58 | 177 | if (s.ok() && should_sync) { |
59 | 177 | s = file->Sync(); |
60 | 177 | } |
61 | 177 | if (s.ok()) { |
62 | 177 | s = file->Close(); |
63 | 177 | } |
64 | 177 | delete file; // Will auto-close if we did not close above |
65 | 177 | if (!s.ok()) { |
66 | 0 | env->RemoveFile(fname); |
67 | 0 | } |
68 | 177 | return s; |
69 | 177 | } |
70 | | |
71 | | Status WriteStringToFile(Env* env, const Slice& data, |
72 | 0 | const std::string& fname) { |
73 | 0 | return DoWriteStringToFile(env, data, fname, false); |
74 | 0 | } |
75 | | |
76 | | Status WriteStringToFileSync(Env* env, const Slice& data, |
77 | 177 | const std::string& fname) { |
78 | 177 | return DoWriteStringToFile(env, data, fname, true); |
79 | 177 | } |
80 | | |
81 | 113 | Status ReadFileToString(Env* env, const std::string& fname, std::string* data) { |
82 | 113 | data->clear(); |
83 | 113 | SequentialFile* file; |
84 | 113 | Status s = env->NewSequentialFile(fname, &file); |
85 | 113 | if (!s.ok()) { |
86 | 0 | return s; |
87 | 0 | } |
88 | 113 | static const int kBufferSize = 8192; |
89 | 113 | char* space = new char[kBufferSize]; |
90 | 226 | while (true) { |
91 | 226 | Slice fragment; |
92 | 226 | s = file->Read(kBufferSize, &fragment, space); |
93 | 226 | if (!s.ok()) { |
94 | 0 | break; |
95 | 0 | } |
96 | 226 | data->append(fragment.data(), fragment.size()); |
97 | 226 | if (fragment.empty()) { |
98 | 113 | break; |
99 | 113 | } |
100 | 226 | } |
101 | 113 | delete[] space; |
102 | 113 | delete file; |
103 | 113 | return s; |
104 | 113 | } |
105 | | |
106 | | EnvWrapper::~EnvWrapper() {} |
107 | | |
108 | | } // namespace leveldb |