1179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org// Use of this source code is governed by a BSD-style license that can be
3179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org// found in the LICENSE file. See the AUTHORS file for names of contributors.
4179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org
5fbd97aa4c5325eace57d24b89845b9581bac9324jorlow@chromium.org#include "leveldb/env.h"
6179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org
7179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgnamespace leveldb {
8179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org
9179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgEnv::~Env() {
10179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org}
11179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org
12179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgSequentialFile::~SequentialFile() {
13179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org}
14179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org
15179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgRandomAccessFile::~RandomAccessFile() {
16179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org}
17179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org
18179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgWritableFile::~WritableFile() {
19179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org}
20179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org
21f65a55c8d0744b95be29a65d06b59b22b012f37bgabor@google.comLogger::~Logger() {
22f65a55c8d0744b95be29a65d06b59b22b012f37bgabor@google.com}
23f65a55c8d0744b95be29a65d06b59b22b012f37bgabor@google.com
24179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgFileLock::~FileLock() {
25179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org}
26179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org
27f65a55c8d0744b95be29a65d06b59b22b012f37bgabor@google.comvoid Log(Logger* info_log, const char* format, ...) {
28f65a55c8d0744b95be29a65d06b59b22b012f37bgabor@google.com  if (info_log != NULL) {
29f65a55c8d0744b95be29a65d06b59b22b012f37bgabor@google.com    va_list ap;
30f65a55c8d0744b95be29a65d06b59b22b012f37bgabor@google.com    va_start(ap, format);
31f65a55c8d0744b95be29a65d06b59b22b012f37bgabor@google.com    info_log->Logv(format, ap);
32f65a55c8d0744b95be29a65d06b59b22b012f37bgabor@google.com    va_end(ap);
33f65a55c8d0744b95be29a65d06b59b22b012f37bgabor@google.com  }
34179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org}
35179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org
36e05bd5cade19e5de0f763f4f122eef9f35de3d9csanjay@google.comstatic Status DoWriteStringToFile(Env* env, const Slice& data,
37e05bd5cade19e5de0f763f4f122eef9f35de3d9csanjay@google.com                                  const std::string& fname,
38e05bd5cade19e5de0f763f4f122eef9f35de3d9csanjay@google.com                                  bool should_sync) {
39179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  WritableFile* file;
40179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  Status s = env->NewWritableFile(fname, &file);
41179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  if (!s.ok()) {
42179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org    return s;
43179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  }
44179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  s = file->Append(data);
45e05bd5cade19e5de0f763f4f122eef9f35de3d9csanjay@google.com  if (s.ok() && should_sync) {
46e05bd5cade19e5de0f763f4f122eef9f35de3d9csanjay@google.com    s = file->Sync();
47e05bd5cade19e5de0f763f4f122eef9f35de3d9csanjay@google.com  }
48179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  if (s.ok()) {
49179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org    s = file->Close();
50179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  }
51179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  delete file;  // Will auto-close if we did not close above
52179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  if (!s.ok()) {
53179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org    env->DeleteFile(fname);
54179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  }
55179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  return s;
56179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org}
57179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org
58e05bd5cade19e5de0f763f4f122eef9f35de3d9csanjay@google.comStatus WriteStringToFile(Env* env, const Slice& data,
59e05bd5cade19e5de0f763f4f122eef9f35de3d9csanjay@google.com                         const std::string& fname) {
60e05bd5cade19e5de0f763f4f122eef9f35de3d9csanjay@google.com  return DoWriteStringToFile(env, data, fname, false);
61e05bd5cade19e5de0f763f4f122eef9f35de3d9csanjay@google.com}
62e05bd5cade19e5de0f763f4f122eef9f35de3d9csanjay@google.com
63e05bd5cade19e5de0f763f4f122eef9f35de3d9csanjay@google.comStatus WriteStringToFileSync(Env* env, const Slice& data,
64e05bd5cade19e5de0f763f4f122eef9f35de3d9csanjay@google.com                             const std::string& fname) {
65e05bd5cade19e5de0f763f4f122eef9f35de3d9csanjay@google.com  return DoWriteStringToFile(env, data, fname, true);
66e05bd5cade19e5de0f763f4f122eef9f35de3d9csanjay@google.com}
67e05bd5cade19e5de0f763f4f122eef9f35de3d9csanjay@google.com
68179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgStatus ReadFileToString(Env* env, const std::string& fname, std::string* data) {
69179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  data->clear();
70179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  SequentialFile* file;
71179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  Status s = env->NewSequentialFile(fname, &file);
72179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  if (!s.ok()) {
73179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org    return s;
74179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  }
75179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  static const int kBufferSize = 8192;
76179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  char* space = new char[kBufferSize];
77179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  while (true) {
78179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org    Slice fragment;
79179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org    s = file->Read(kBufferSize, &fragment, space);
80179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org    if (!s.ok()) {
81179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org      break;
82179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org    }
83179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org    data->append(fragment.data(), fragment.size());
84179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org    if (fragment.empty()) {
85179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org      break;
86179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org    }
87179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  }
88179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  delete[] space;
89179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  delete file;
90179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org  return s;
91179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org}
92179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org
93179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgEnvWrapper::~EnvWrapper() {
94179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org}
95179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org
9645b9940be332834440bd5299419f396e38085ebehans@chromium.org}  // namespace leveldb
97