Coverage Report

Created: 2026-09-13 06:38

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/leveldb/util/env.cc
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
88
RandomAccessFile::~RandomAccessFile() = default;
34
35
494
WritableFile::~WritableFile() = default;
36
37
108
Logger::~Logger() = default;
38
39
108
FileLock::~FileLock() = default;
40
41
494
void Log(Logger* info_log, const char* format, ...) {
42
494
  if (info_log != nullptr) {
43
494
    std::va_list ap;
44
494
    va_start(ap, format);
45
494
    info_log->Logv(format, ap);
46
494
    va_end(ap);
47
494
  }
48
494
}
49
50
static Status DoWriteStringToFile(Env* env, const Slice& data,
51
157
                                  const std::string& fname, bool should_sync) {
52
157
  WritableFile* file;
53
157
  Status s = env->NewWritableFile(fname, &file);
54
157
  if (!s.ok()) {
55
0
    return s;
56
0
  }
57
157
  s = file->Append(data);
58
157
  if (s.ok() && should_sync) {
59
157
    s = file->Sync();
60
157
  }
61
157
  if (s.ok()) {
62
157
    s = file->Close();
63
157
  }
64
157
  delete file;  // Will auto-close if we did not close above
65
157
  if (!s.ok()) {
66
0
    env->RemoveFile(fname);
67
0
  }
68
157
  return s;
69
157
}
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
157
                             const std::string& fname) {
78
157
  return DoWriteStringToFile(env, data, fname, true);
79
157
}
80
81
108
Status ReadFileToString(Env* env, const std::string& fname, std::string* data) {
82
108
  data->clear();
83
108
  SequentialFile* file;
84
108
  Status s = env->NewSequentialFile(fname, &file);
85
108
  if (!s.ok()) {
86
0
    return s;
87
0
  }
88
108
  static const int kBufferSize = 8192;
89
108
  char* space = new char[kBufferSize];
90
216
  while (true) {
91
216
    Slice fragment;
92
216
    s = file->Read(kBufferSize, &fragment, space);
93
216
    if (!s.ok()) {
94
0
      break;
95
0
    }
96
216
    data->append(fragment.data(), fragment.size());
97
216
    if (fragment.empty()) {
98
108
      break;
99
108
    }
100
216
  }
101
108
  delete[] space;
102
108
  delete file;
103
108
  return s;
104
108
}
105
106
EnvWrapper::~EnvWrapper() {}
107
108
}  // namespace leveldb