Index: chrome/browser/value_store/value_store.h |
diff --git a/chrome/browser/value_store/value_store.h b/chrome/browser/value_store/value_store.h |
index 4a25786112c7cacdf360058613b2b780cfa8d016..2b203ea57b779297a647e991b0825b64e64de9ae 100644 |
--- a/chrome/browser/value_store/value_store.h |
+++ b/chrome/browser/value_store/value_store.h |
@@ -15,30 +15,85 @@ |
// Interface for a storage area for Value objects. |
class ValueStore { |
public: |
+ // Error codes returned from storage methods. |
+ enum ErrorCode { |
+ 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, |
+ }; |
+ |
+ // Bundles an ErrorCode with further metadata. |
+ struct Error { |
+ Error(ErrorCode code, |
+ const std::string& message, |
+ scoped_ptr<std::string> key); |
+ ~Error(); |
+ |
+ static scoped_ptr<Error> Create(ErrorCode code, |
+ const std::string& message, |
+ scoped_ptr<std::string> key) { |
+ return make_scoped_ptr(new Error(code, message, key.Pass())); |
+ } |
+ |
+ // The error code. |
+ const ErrorCode code; |
+ |
+ // Message associated with the error. |
+ const std::string message; |
+ |
+ // The key associated with the error, if any. Use a scoped_ptr here |
+ // because empty-string is a valid key. |
+ // |
+ // TODO(kalman): add test(s) for an empty key. |
+ const scoped_ptr<std::string> key; |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(Error); |
+ }; |
+ |
// The result of a read operation (Get). |
class ReadResultType { |
public: |
- // Ownership of |settings| taken. |
- explicit ReadResultType(base::DictionaryValue* settings); |
- explicit ReadResultType(const std::string& error); |
+ explicit ReadResultType(scoped_ptr<base::DictionaryValue> settings); |
+ explicit ReadResultType(scoped_ptr<Error> error); |
~ReadResultType(); |
+ bool HasError() const { return error_; } |
+ |
// 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 HasError() is false. |
- scoped_ptr<base::DictionaryValue>& settings(); |
- |
- // Gets whether the operation failed. |
- bool HasError() const; |
- |
- // Gets the error message describing the failure. |
- // Must only be called if HasError() is true. |
- const std::string& error() const; |
+ // be in |settings|.|foo|. |
+ // |
+ // Must only be called if there is no error. |
+ base::DictionaryValue& settings() { return *settings_; } |
+ scoped_ptr<base::DictionaryValue> PassSettings() { |
+ return settings_.Pass(); |
+ } |
+ |
+ // Only call if HasError is true. |
+ const Error& error() const { return *error_; } |
+ scoped_ptr<Error> PassError() { return error_.Pass(); } |
private: |
scoped_ptr<base::DictionaryValue> settings_; |
- const std::string error_; |
+ scoped_ptr<Error> error_; |
DISALLOW_COPY_AND_ASSIGN(ReadResultType); |
}; |
@@ -47,25 +102,25 @@ class ValueStore { |
// The result of a write operation (Set/Remove/Clear). |
class WriteResultType { |
public: |
- // Ownership of |changes| taken. |
- explicit WriteResultType(ValueStoreChangeList* changes); |
- explicit WriteResultType(const std::string& error); |
+ explicit WriteResultType(scoped_ptr<ValueStoreChangeList> changes); |
+ explicit WriteResultType(scoped_ptr<Error> error); |
~WriteResultType(); |
- // Gets the list of changes to the settings which resulted from the write. |
- // Must only be called if HasError() is false. |
- const ValueStoreChangeList& changes() const; |
+ bool HasError() const { return error_; } |
- // Gets whether the operation failed. |
- bool HasError() const; |
+ // 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 HasError is false. |
+ ValueStoreChangeList& changes() { return *changes_; } |
+ scoped_ptr<ValueStoreChangeList> PassChanges() { return changes_.Pass(); } |
- // Gets the error message describing the failure. |
- // Must only be called if HasError() is true. |
- const std::string& error() const; |
+ // Only call if HasError is true. |
+ const Error& error() const { return *error_; } |
+ scoped_ptr<Error> PassError() { return error_.Pass(); } |
private: |
- const scoped_ptr<ValueStoreChangeList> changes_; |
- const std::string error_; |
+ scoped_ptr<ValueStoreChangeList> changes_; |
+ scoped_ptr<Error> error_; |
DISALLOW_COPY_AND_ASSIGN(WriteResultType); |
}; |
@@ -81,10 +136,6 @@ class ValueStore { |
// Don't generate the changes for a WriteResult. |
NO_GENERATE_CHANGES = 1<<2, |
- |
- // Don't check the old value before writing a new value. This will also |
- // result in an empty |old_value| in the WriteResult::changes list. |
- NO_CHECK_OLD_VALUE = 1<<3 |
}; |
typedef int WriteOptions; |
@@ -92,13 +143,13 @@ class ValueStore { |
// Helpers for making a Read/WriteResult. |
template<typename T> |
- static ReadResult MakeReadResult(T arg) { |
- return ReadResult(new ReadResultType(arg)); |
+ static ReadResult MakeReadResult(scoped_ptr<T> arg) { |
+ return ReadResult(new ReadResultType(arg.Pass())); |
} |
template<typename T> |
- static WriteResult MakeWriteResult(T arg) { |
- return WriteResult(new WriteResultType(arg)); |
+ static WriteResult MakeWriteResult(scoped_ptr<T> arg) { |
+ return WriteResult(new WriteResultType(arg.Pass())); |
} |
// Gets the amount of space being used by a single value, in bytes. |