blob: b6aa0bab5d7b296eb75b960467d74340b9b00402 [file] [log] [blame]
// Copyright 2014 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.
#ifndef EXTENSIONS_BROWSER_VALUE_STORE_VALUE_STORE_H_
#define EXTENSIONS_BROWSER_VALUE_STORE_VALUE_STORE_H_
#include <stddef.h>
#include <string>
#include <utility>
#include <vector>
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "base/values.h"
#include "extensions/browser/value_store/value_store_change.h"
// Interface for a storage area for Value objects.
class ValueStore {
public:
// Status codes returned from storage methods.
enum StatusCode {
OK,
// The failure was due to some kind of database corruption. Depending on
// what is corrupted, some part of the database may be recoverable.
//
// For example, if the on-disk representation of leveldb is corrupted, it's
// likely the whole database will need to be wiped and started again.
//
// If a single key has been committed with an invalid JSON representation,
// just that key can be deleted without affecting the rest of the database.
CORRUPTION,
// The failure was due to the store being read-only (for example, policy).
READ_ONLY,
// The failure was due to the store running out of space.
QUOTA_EXCEEDED,
// Any other error.
OTHER_ERROR,
};
enum BackingStoreRestoreStatus {
// No restore attempted.
RESTORE_NONE,
// Corrupted backing store successfully deleted.
DB_RESTORE_DELETE_SUCCESS,
// Corrupted backing store cannot be deleted.
DB_RESTORE_DELETE_FAILURE,
// Corrupted backing store successfully repaired.
DB_RESTORE_REPAIR_SUCCESS,
// Corrupted value successfully deleted.
VALUE_RESTORE_DELETE_SUCCESS,
// Corrupted value cannot be deleted.
VALUE_RESTORE_DELETE_FAILURE,
};
// The status (result) of an operation on a ValueStore.
struct Status {
Status();
Status(StatusCode code,
BackingStoreRestoreStatus restore_status,
const std::string& message);
Status(StatusCode code, const std::string& message);
~Status();
bool ok() const { return code == OK; }
bool IsCorrupted() const { return code == CORRUPTION; }
// Merge |status| into this object. Any members (either |code|,
// |restore_status|, or |message| in |status| will be used, but only if this
// object's members are at their default value.
void Merge(const Status& status);
// The status code.
StatusCode code;
BackingStoreRestoreStatus restore_status;
// Message associated with the status (error) if there is one.
std::string message;
};
// The result of a read operation (Get).
class ReadResultType {
public:
ReadResultType(scoped_ptr<base::DictionaryValue> settings,
const Status& status);
explicit ReadResultType(const Status& status);
~ReadResultType();
// Gets the settings read from the storage. Note that this represents
// the root object. If you request the value for key "foo", that value will
// be in |settings|.|foo|.
//
// Must only be called if there is no error.
base::DictionaryValue& settings() { return *settings_; }
scoped_ptr<base::DictionaryValue> PassSettings() {
return std::move(settings_);
}
const Status& status() const { return status_; }
private:
scoped_ptr<base::DictionaryValue> settings_;
Status status_;
DISALLOW_COPY_AND_ASSIGN(ReadResultType);
};
typedef scoped_ptr<ReadResultType> ReadResult;
// The result of a write operation (Set/Remove/Clear).
class WriteResultType {
public:
WriteResultType(scoped_ptr<ValueStoreChangeList> changes,
const Status& status);
explicit WriteResultType(const Status& status);
~WriteResultType();
// Gets the list of changes to the settings which resulted from the write.
// Won't be present if the NO_GENERATE_CHANGES WriteOptions was given.
// Only call if no error.
ValueStoreChangeList& changes() { return *changes_; }
scoped_ptr<ValueStoreChangeList> PassChanges() {
return std::move(changes_);
}
const Status& status() const { return status_; }
private:
scoped_ptr<ValueStoreChangeList> changes_;
Status status_;
DISALLOW_COPY_AND_ASSIGN(WriteResultType);
};
typedef scoped_ptr<WriteResultType> WriteResult;
// Options for write operations.
enum WriteOptionsValues {
// Callers should usually use this.
DEFAULTS = 0,
// Ignore any quota restrictions.
IGNORE_QUOTA = 1<<1,
// Don't generate the changes for a WriteResult.
NO_GENERATE_CHANGES = 1<<2,
};
typedef int WriteOptions;
virtual ~ValueStore() {}
// Helpers for making a Read/WriteResult.
template <typename T>
static ReadResult MakeReadResult(scoped_ptr<T> arg, const Status& status) {
return ReadResult(new ReadResultType(std::move(arg), status));
}
static ReadResult MakeReadResult(const Status& status) {
return ReadResult(new ReadResultType(status));
}
template <typename T>
static WriteResult MakeWriteResult(scoped_ptr<T> arg, const Status& status) {
return WriteResult(new WriteResultType(std::move(arg), status));
}
static WriteResult MakeWriteResult(const Status& status) {
return WriteResult(new WriteResultType(status));
}
// Gets the amount of space being used by a single value, in bytes.
// Note: The GetBytesInUse methods are only used by extension settings at the
// moment. If these become more generally useful, the
// SettingsStorageQuotaEnforcer and WeakUnlimitedSettingsStorage classes
// should be moved to the value_store directory.
virtual size_t GetBytesInUse(const std::string& key) = 0;
// Gets the total amount of space being used by multiple values, in bytes.
virtual size_t GetBytesInUse(const std::vector<std::string>& keys) = 0;
// Gets the total amount of space being used by this storage area, in bytes.
virtual size_t GetBytesInUse() = 0;
// Gets a single value from storage.
virtual ReadResult Get(const std::string& key) = 0;
// Gets multiple values from storage.
virtual ReadResult Get(const std::vector<std::string>& keys) = 0;
// Gets all values from storage.
virtual ReadResult Get() = 0;
// Sets a single key to a new value.
virtual WriteResult Set(WriteOptions options,
const std::string& key,
const base::Value& value) = 0;
// Sets multiple keys to new values.
virtual WriteResult Set(
WriteOptions options, const base::DictionaryValue& values) = 0;
// Removes a key from the storage.
virtual WriteResult Remove(const std::string& key) = 0;
// Removes multiple keys from the storage.
virtual WriteResult Remove(const std::vector<std::string>& keys) = 0;
// Clears the storage.
virtual WriteResult Clear() = 0;
};
#endif // EXTENSIONS_BROWSER_VALUE_STORE_VALUE_STORE_H_