1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file. 4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/leveldb_proto/leveldb_database.h" 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <string> 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <vector> 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/files/file_path.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/string_split.h" 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/threading/thread_checker.h" 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "third_party/leveldatabase/src/include/leveldb/db.h" 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "third_party/leveldatabase/src/include/leveldb/iterator.h" 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "third_party/leveldatabase/src/include/leveldb/options.h" 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "third_party/leveldatabase/src/include/leveldb/slice.h" 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "third_party/leveldatabase/src/include/leveldb/status.h" 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "third_party/leveldatabase/src/include/leveldb/write_batch.h" 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace leveldb_proto { 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)LevelDB::LevelDB() {} 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)LevelDB::~LevelDB() { DFAKE_SCOPED_LOCK(thread_checker_); } 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool LevelDB::Init(const base::FilePath& database_dir) { 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DFAKE_SCOPED_LOCK(thread_checker_); 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) leveldb::Options options; 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) options.create_if_missing = true; 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) options.max_open_files = 0; // Use minimum. 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string path = database_dir.AsUTF8Unsafe(); 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) leveldb::DB* db = NULL; 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) leveldb::Status status = leveldb::DB::Open(options, path, &db); 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (status.IsCorruption()) { 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::DeleteFile(database_dir, true); 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) status = leveldb::DB::Open(options, path, &db); 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (status.ok()) { 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CHECK(db); 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) db_.reset(db); 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LOG(WARNING) << "Unable to open " << database_dir.value() << ": " 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) << status.ToString(); 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool LevelDB::Save(const base::StringPairs& entries_to_save, 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<std::string>& keys_to_remove) { 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DFAKE_SCOPED_LOCK(thread_checker_); 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) leveldb::WriteBatch updates; 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (base::StringPairs::const_iterator it = entries_to_save.begin(); 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci it != entries_to_save.end(); 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++it) { 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) updates.Put(leveldb::Slice(it->first), leveldb::Slice(it->second)); 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (std::vector<std::string>::const_iterator it = keys_to_remove.begin(); 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) it != keys_to_remove.end(); ++it) { 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) updates.Delete(leveldb::Slice(*it)); 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) leveldb::WriteOptions options; 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) options.sync = true; 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) leveldb::Status status = db_->Write(options, &updates); 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (status.ok()) return true; 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DLOG(WARNING) << "Failed writing leveldb_proto entries: " 76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) << status.ToString(); 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool LevelDB::Load(std::vector<std::string>* entries) { 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DFAKE_SCOPED_LOCK(thread_checker_); 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) leveldb::ReadOptions options; 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<leveldb::Iterator> db_iterator(db_->NewIterator(options)); 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (db_iterator->SeekToFirst(); db_iterator->Valid(); db_iterator->Next()) { 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) leveldb::Slice value_slice = db_iterator->value(); 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string entry(value_slice.data(), value_slice.size()); 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) entries->push_back(entry); 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace leveldb_proto 94