1 // Copyright 2014 The Chromium 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.
5 #include "components/leveldb_proto/leveldb_database.h"
10 #include "base/files/file_path.h"
11 #include "base/files/file_util.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/strings/string_split.h"
14 #include "base/threading/thread_checker.h"
15 #include "third_party/leveldatabase/src/include/leveldb/db.h"
16 #include "third_party/leveldatabase/src/include/leveldb/iterator.h"
17 #include "third_party/leveldatabase/src/include/leveldb/options.h"
18 #include "third_party/leveldatabase/src/include/leveldb/slice.h"
19 #include "third_party/leveldatabase/src/include/leveldb/status.h"
20 #include "third_party/leveldatabase/src/include/leveldb/write_batch.h"
22 namespace leveldb_proto
{
27 DFAKE_SCOPED_LOCK(thread_checker_
);
30 bool LevelDB::InitWithOptions(const base::FilePath
& database_dir
,
31 const leveldb::Options
& options
) {
32 DFAKE_SCOPED_LOCK(thread_checker_
);
34 std::string path
= database_dir
.AsUTF8Unsafe();
36 leveldb::DB
* db
= NULL
;
37 leveldb::Status status
= leveldb::DB::Open(options
, path
, &db
);
38 if (status
.IsCorruption()) {
39 base::DeleteFile(database_dir
, true);
40 status
= leveldb::DB::Open(options
, path
, &db
);
49 LOG(WARNING
) << "Unable to open " << database_dir
.value() << ": "
54 bool LevelDB::Init(const base::FilePath
& database_dir
) {
55 leveldb::Options options
;
56 options
.create_if_missing
= true;
57 options
.max_open_files
= 0; // Use minimum.
58 return InitWithOptions(database_dir
, options
);
61 bool LevelDB::Save(const base::StringPairs
& entries_to_save
,
62 const std::vector
<std::string
>& keys_to_remove
) {
63 DFAKE_SCOPED_LOCK(thread_checker_
);
68 leveldb::WriteBatch updates
;
69 for (base::StringPairs::const_iterator it
= entries_to_save
.begin();
70 it
!= entries_to_save
.end();
72 updates
.Put(leveldb::Slice(it
->first
), leveldb::Slice(it
->second
));
74 for (std::vector
<std::string
>::const_iterator it
= keys_to_remove
.begin();
75 it
!= keys_to_remove
.end(); ++it
) {
76 updates
.Delete(leveldb::Slice(*it
));
79 leveldb::WriteOptions options
;
81 leveldb::Status status
= db_
->Write(options
, &updates
);
82 if (status
.ok()) return true;
84 DLOG(WARNING
) << "Failed writing leveldb_proto entries: "
89 bool LevelDB::Load(std::vector
<std::string
>* entries
) {
90 DFAKE_SCOPED_LOCK(thread_checker_
);
95 leveldb::ReadOptions options
;
96 scoped_ptr
<leveldb::Iterator
> db_iterator(db_
->NewIterator(options
));
97 for (db_iterator
->SeekToFirst(); db_iterator
->Valid(); db_iterator
->Next()) {
98 leveldb::Slice value_slice
= db_iterator
->value();
99 std::string
entry(value_slice
.data(), value_slice
.size());
100 entries
->push_back(entry
);
105 } // namespace leveldb_proto