Coverage Report

Created: 2025-11-16 07:04

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
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