Coverage Report

Created: 2026-07-16 07:01

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