| Index: chrome/browser/policy/resource_cache.cc
|
| diff --git a/chrome/browser/policy/resource_cache.cc b/chrome/browser/policy/resource_cache.cc
|
| deleted file mode 100644
|
| index a0125c3bbbc625321b59488ff0b43b068190a775..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/policy/resource_cache.cc
|
| +++ /dev/null
|
| @@ -1,188 +0,0 @@
|
| -// Copyright (c) 2013 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 "chrome/browser/policy/resource_cache.h"
|
| -
|
| -#include <string.h>
|
| -
|
| -#include "base/file_util.h"
|
| -#include "base/files/file_path.h"
|
| -#include "base/logging.h"
|
| -#include "base/string_util.h"
|
| -#include "base/strings/string_number_conversions.h"
|
| -#include "base/threading/thread_restrictions.h"
|
| -#include "third_party/leveldatabase/src/include/leveldb/db.h"
|
| -#include "third_party/leveldatabase/src/include/leveldb/iterator.h"
|
| -#include "third_party/leveldatabase/src/include/leveldb/options.h"
|
| -#include "third_party/leveldatabase/src/include/leveldb/slice.h"
|
| -#include "third_party/leveldatabase/src/include/leveldb/status.h"
|
| -#include "third_party/leveldatabase/src/include/leveldb/write_batch.h"
|
| -
|
| -namespace policy {
|
| -
|
| -ResourceCache::ResourceCache(const base::FilePath& cache_path) {
|
| - // Allow the cache to be created in a different thread than the thread that's
|
| - // going to use it.
|
| - DetachFromThread();
|
| -
|
| - file_util::CreateDirectory(cache_path.DirName());
|
| - leveldb::Options options;
|
| - options.create_if_missing = true;
|
| - leveldb::DB* db = NULL;
|
| - leveldb::Status status =
|
| - leveldb::DB::Open(options, cache_path.AsUTF8Unsafe(), &db);
|
| - if (!status.ok()) {
|
| - LOG(WARNING) << "Failed to open leveldb at " << cache_path.AsUTF8Unsafe()
|
| - << ": " << status.ToString();
|
| - // Maybe the database is busted; drop everything and try to create it again.
|
| - file_util::Delete(cache_path, true);
|
| - status = leveldb::DB::Open(options, cache_path.AsUTF8Unsafe(), &db);
|
| -
|
| - if (!status.ok())
|
| - LOG(WARNING) << "Failed to open a new leveldb after wiping: "
|
| - << status.ToString();
|
| - }
|
| - db_.reset(db);
|
| -}
|
| -
|
| -ResourceCache::~ResourceCache() {
|
| - DCHECK(CalledOnValidThread());
|
| -}
|
| -
|
| -bool ResourceCache::Store(const std::string& key,
|
| - const std::string& subkey,
|
| - const std::string& data) {
|
| - DCHECK(CalledOnValidThread());
|
| - base::ThreadRestrictions::AssertIOAllowed();
|
| -
|
| - if (!IsOpen())
|
| - return false;
|
| -
|
| - std::string path(CreatePath(key, subkey));
|
| - return db_->Put(leveldb::WriteOptions(), path, data).ok();
|
| -}
|
| -
|
| -bool ResourceCache::Load(const std::string& key,
|
| - const std::string& subkey,
|
| - std::string* data) {
|
| - DCHECK(CalledOnValidThread());
|
| - base::ThreadRestrictions::AssertIOAllowed();
|
| - if (!IsOpen())
|
| - return false;
|
| -
|
| - leveldb::ReadOptions options;
|
| - options.fill_cache = false;
|
| - std::string path(CreatePath(key, subkey));
|
| - return db_->Get(options, path, data).ok();
|
| -}
|
| -
|
| -void ResourceCache::LoadAllSubkeys(
|
| - const std::string& key,
|
| - std::map<std::string, std::string>* contents) {
|
| - DCHECK(CalledOnValidThread());
|
| - base::ThreadRestrictions::AssertIOAllowed();
|
| - if (!IsOpen())
|
| - return;
|
| -
|
| - contents->clear();
|
| -
|
| - const std::string prefix(CreatePathPrefix(key));
|
| - leveldb::ReadOptions options;
|
| - options.fill_cache = false;
|
| - scoped_ptr<leveldb::Iterator> it(db_->NewIterator(options));
|
| - for (it->Seek(prefix); it->Valid(); it->Next()) {
|
| - if (!it->key().starts_with(prefix))
|
| - break;
|
| - const std::string subkey(GetSubkey(it->key().ToString()));
|
| - leveldb::Slice slice = it->value();
|
| - (*contents)[subkey].assign(slice.data(), slice.size());
|
| - }
|
| -}
|
| -
|
| -void ResourceCache::Delete(const std::string& key, const std::string& subkey) {
|
| - DCHECK(CalledOnValidThread());
|
| - base::ThreadRestrictions::AssertIOAllowed();
|
| - if (!IsOpen())
|
| - return;
|
| -
|
| - const std::string path(CreatePath(key, subkey));
|
| - leveldb::Status status = db_->Delete(leveldb::WriteOptions(), path);
|
| - if (!status.ok()) {
|
| - LOG(WARNING) << "Failed to Delete \"" << path << "\" from leveldb: "
|
| - << status.ToString();
|
| - }
|
| -}
|
| -
|
| -void ResourceCache::PurgeOtherSubkeys(
|
| - const std::string& key,
|
| - const std::set<std::string>& subkeys_to_keep) {
|
| - DCHECK(CalledOnValidThread());
|
| - base::ThreadRestrictions::AssertIOAllowed();
|
| - if (!IsOpen())
|
| - return;
|
| -
|
| - leveldb::WriteBatch batch;
|
| - const std::string prefix(CreatePathPrefix(key));
|
| - leveldb::ReadOptions options;
|
| - options.fill_cache = false;
|
| - scoped_ptr<leveldb::Iterator> it(db_->NewIterator(options));
|
| - for (it->Seek(prefix); it->Valid(); it->Next()) {
|
| - if (!it->key().starts_with(prefix))
|
| - break;
|
| - const std::string subkey(GetSubkey(it->key().ToString()));
|
| - if (subkeys_to_keep.find(subkey) == subkeys_to_keep.end())
|
| - batch.Delete(it->key());
|
| - }
|
| -
|
| - leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch);
|
| - if (!status.ok()) {
|
| - LOG(WARNING) << "Purge of leveldb subkeys of " << key << " failed: "
|
| - << status.ToString();
|
| - }
|
| -}
|
| -
|
| -std::string ResourceCache::GetStringWithPrefix(const std::string& s) {
|
| - char buffer[sizeof(size_t)];
|
| - size_t size = s.size();
|
| - memcpy(buffer, &size, sizeof(size_t));
|
| - return std::string(buffer, sizeof(size_t)) + s;
|
| -}
|
| -
|
| -std::string ResourceCache::CreatePathPrefix(const std::string& key) {
|
| - return GetStringWithPrefix(key);
|
| -}
|
| -
|
| -std::string ResourceCache::CreatePath(const std::string& key,
|
| - const std::string& subkey) {
|
| - return GetStringWithPrefix(key) + GetStringWithPrefix(subkey);
|
| -}
|
| -
|
| -std::string ResourceCache::GetSubkey(const std::string& path) {
|
| - // |path| was produced by CreatePath(). Skip the first key, then skip the
|
| - // size of the subkey.
|
| - if (path.size() < sizeof(size_t)) {
|
| - NOTREACHED();
|
| - return EmptyString();
|
| - }
|
| -
|
| - // Skip the first string. |offset| is the start of the second string,
|
| - // immediately preceded by its size.
|
| - const size_t* size = reinterpret_cast<const size_t*>(path.data());
|
| - size_t offset = sizeof(size_t) + *size + sizeof(size_t);
|
| - if (path.size() < offset) {
|
| - NOTREACHED();
|
| - return EmptyString();
|
| - }
|
| -
|
| - // Skip the size of the second string.
|
| - size = reinterpret_cast<const size_t*>(path.data() + offset - sizeof(size_t));
|
| - if (*size != path.size() - offset) {
|
| - NOTREACHED();
|
| - return EmptyString();
|
| - }
|
| -
|
| - return path.substr(offset, *size);
|
| -}
|
| -
|
| -} // namespace policy
|
|
|