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