Add Google's LevelDB support
[novacoin.git] / src / leveldb / util / env.cc
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 namespace leveldb {
8
9 Env::~Env() {
10 }
11
12 SequentialFile::~SequentialFile() {
13 }
14
15 RandomAccessFile::~RandomAccessFile() {
16 }
17
18 WritableFile::~WritableFile() {
19 }
20
21 Logger::~Logger() {
22 }
23
24 FileLock::~FileLock() {
25 }
26
27 void Log(Logger* info_log, const char* format, ...) {
28   if (info_log != NULL) {
29     va_list ap;
30     va_start(ap, format);
31     info_log->Logv(format, ap);
32     va_end(ap);
33   }
34 }
35
36 static Status DoWriteStringToFile(Env* env, const Slice& data,
37                                   const std::string& fname,
38                                   bool should_sync) {
39   WritableFile* file;
40   Status s = env->NewWritableFile(fname, &file);
41   if (!s.ok()) {
42     return s;
43   }
44   s = file->Append(data);
45   if (s.ok() && should_sync) {
46     s = file->Sync();
47   }
48   if (s.ok()) {
49     s = file->Close();
50   }
51   delete file;  // Will auto-close if we did not close above
52   if (!s.ok()) {
53     env->DeleteFile(fname);
54   }
55   return s;
56 }
57
58 Status WriteStringToFile(Env* env, const Slice& data,
59                          const std::string& fname) {
60   return DoWriteStringToFile(env, data, fname, false);
61 }
62
63 Status WriteStringToFileSync(Env* env, const Slice& data,
64                              const std::string& fname) {
65   return DoWriteStringToFile(env, data, fname, true);
66 }
67
68 Status ReadFileToString(Env* env, const std::string& fname, std::string* data) {
69   data->clear();
70   SequentialFile* file;
71   Status s = env->NewSequentialFile(fname, &file);
72   if (!s.ok()) {
73     return s;
74   }
75   static const int kBufferSize = 8192;
76   char* space = new char[kBufferSize];
77   while (true) {
78     Slice fragment;
79     s = file->Read(kBufferSize, &fragment, space);
80     if (!s.ok()) {
81       break;
82     }
83     data->append(fragment.data(), fragment.size());
84     if (fragment.empty()) {
85       break;
86     }
87   }
88   delete[] space;
89   delete file;
90   return s;
91 }
92
93 EnvWrapper::~EnvWrapper() {
94 }
95
96 }  // namespace leveldb