Coverage Report

Created: 2026-01-09 06:22

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