Home | History | Annotate | Download | only in util
      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
     97