File: leveldb_service_impl.cc

package info (click to toggle)
chromium-browser 57.0.2987.98-1~deb8u1
  • links: PTS, VCS
  • area: main
  • in suites: jessie
  • size: 2,637,852 kB
  • ctags: 2,544,394
  • sloc: cpp: 12,815,961; ansic: 3,676,222; python: 1,147,112; asm: 526,608; java: 523,212; xml: 286,794; perl: 92,654; sh: 86,408; objc: 73,271; makefile: 27,698; cs: 18,487; yacc: 13,031; tcl: 12,957; pascal: 4,875; ml: 4,716; lex: 3,904; sql: 3,862; ruby: 1,982; lisp: 1,508; php: 1,368; exp: 404; awk: 325; csh: 117; jsp: 39; sed: 37
file content (109 lines) | stat: -rw-r--r-- 4,071 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/leveldb/leveldb_service_impl.h"

#include <memory>

#include "base/memory/ptr_util.h"
#include "components/leveldb/env_mojo.h"
#include "components/leveldb/leveldb_database_impl.h"
#include "components/leveldb/public/cpp/util.h"
#include "mojo/public/cpp/bindings/strong_associated_binding.h"
#include "third_party/leveldatabase/env_chromium.h"
#include "third_party/leveldatabase/src/helpers/memenv/memenv.h"
#include "third_party/leveldatabase/src/include/leveldb/db.h"
#include "third_party/leveldatabase/src/include/leveldb/env.h"
#include "third_party/leveldatabase/src/include/leveldb/filter_policy.h"
#include "third_party/leveldatabase/src/include/leveldb/slice.h"

namespace leveldb {

LevelDBServiceImpl::LevelDBServiceImpl(
    scoped_refptr<base::SingleThreadTaskRunner> task_runner)
    : thread_(new LevelDBMojoProxy(std::move(task_runner))) {}

LevelDBServiceImpl::~LevelDBServiceImpl() {}

void LevelDBServiceImpl::Open(
    filesystem::mojom::DirectoryPtr directory,
    const std::string& dbname,
    leveldb::mojom::LevelDBDatabaseAssociatedRequest database,
    const OpenCallback& callback) {
  OpenWithOptions(leveldb::mojom::OpenOptions::New(), std::move(directory),
                  dbname, std::move(database), callback);
}

void LevelDBServiceImpl::OpenWithOptions(
    leveldb::mojom::OpenOptionsPtr open_options,
    filesystem::mojom::DirectoryPtr directory,
    const std::string& dbname,
    leveldb::mojom::LevelDBDatabaseAssociatedRequest database,
    const OpenCallback& callback) {
  leveldb::Options options;
  options.create_if_missing = open_options->create_if_missing;
  options.error_if_exists = open_options->error_if_exists;
  options.paranoid_checks = open_options->paranoid_checks;
  options.write_buffer_size = open_options->write_buffer_size;
  options.max_open_files = open_options->max_open_files;

  options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue;
  options.compression = leveldb::kSnappyCompression;

  // Register our directory with the file thread.
  LevelDBMojoProxy::OpaqueDir* dir =
      thread_->RegisterDirectory(std::move(directory));

  std::unique_ptr<MojoEnv> env_mojo(new MojoEnv(thread_, dir));
  options.env = env_mojo.get();

  leveldb::DB* db = nullptr;
  leveldb::Status s = leveldb::DB::Open(options, dbname, &db);

  if (s.ok()) {
    mojo::MakeStrongAssociatedBinding(
        base::MakeUnique<LevelDBDatabaseImpl>(std::move(env_mojo),
                                              base::WrapUnique(db)),
        std::move(database));
  }

  callback.Run(LeveldbStatusToError(s));
}

void LevelDBServiceImpl::OpenInMemory(
    leveldb::mojom::LevelDBDatabaseAssociatedRequest database,
    const OpenCallback& callback) {
  leveldb::Options options;
  options.create_if_missing = true;
  options.max_open_files = 0;  // Use minimum.

  std::unique_ptr<leveldb::Env> env(
      leveldb::NewMemEnv(leveldb::Env::Default()));
  options.env = env.get();

  leveldb::DB* db = nullptr;
  leveldb::Status s = leveldb::DB::Open(options, "", &db);

  if (s.ok()) {
    mojo::MakeStrongAssociatedBinding(base::MakeUnique<LevelDBDatabaseImpl>(
                                          std::move(env), base::WrapUnique(db)),
                                      std::move(database));
  }

  callback.Run(LeveldbStatusToError(s));
}

void LevelDBServiceImpl::Destroy(filesystem::mojom::DirectoryPtr directory,
                                 const std::string& dbname,
                                 const DestroyCallback& callback) {
  leveldb::Options options;
  // Register our directory with the file thread.
  LevelDBMojoProxy::OpaqueDir* dir =
      thread_->RegisterDirectory(std::move(directory));
  std::unique_ptr<MojoEnv> env_mojo(new MojoEnv(thread_, dir));
  options.env = env_mojo.get();
  callback.Run(LeveldbStatusToError(leveldb::DestroyDB(dbname, options)));
}

}  // namespace leveldb