| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CHROME_BROWSER_VALUE_STORE_VALUE_STORE_H_ | 5 #ifndef CHROME_BROWSER_VALUE_STORE_VALUE_STORE_H_ |
| 6 #define CHROME_BROWSER_VALUE_STORE_VALUE_STORE_H_ | 6 #define CHROME_BROWSER_VALUE_STORE_VALUE_STORE_H_ |
| 7 | 7 |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
| 12 #include "base/values.h" | 12 #include "base/values.h" |
| 13 #include "chrome/browser/value_store/value_store_change.h" | 13 #include "chrome/browser/value_store/value_store_change.h" |
| 14 | 14 |
| 15 // Interface for a storage area for Value objects. | 15 // Interface for a storage area for Value objects. |
| 16 class ValueStore { | 16 class ValueStore { |
| 17 public: | 17 public: |
| 18 // Error codes returned from storage methods. |
| 19 enum ErrorCode { |
| 20 OK, |
| 21 |
| 22 // The failure was due to some kind of database corruption. Depending on |
| 23 // what is corrupted, some part of the database may be recoverable. |
| 24 // |
| 25 // For example, if the on-disk representation of leveldb is corrupted, it's |
| 26 // likely the whole database will need to be wiped and started again. |
| 27 // |
| 28 // If a single key has been committed with an invalid JSON representation, |
| 29 // just that key can be deleted without affecting the rest of the database. |
| 30 CORRUPTION, |
| 31 |
| 32 // The failure was due to the store being read-only (for example, policy). |
| 33 READ_ONLY, |
| 34 |
| 35 // The failure was due to the store running out of space. |
| 36 QUOTA_EXCEEDED, |
| 37 |
| 38 // Any other error. |
| 39 OTHER_ERROR, |
| 40 }; |
| 41 |
| 42 // Bundles an ErrorCode with further metadata. |
| 43 struct Error { |
| 44 Error(ErrorCode code, |
| 45 const std::string& message, |
| 46 scoped_ptr<std::string> key); |
| 47 ~Error(); |
| 48 |
| 49 static scoped_ptr<Error> Create(ErrorCode code, |
| 50 const std::string& message, |
| 51 scoped_ptr<std::string> key) { |
| 52 return make_scoped_ptr(new Error(code, message, key.Pass())); |
| 53 } |
| 54 |
| 55 // The error code. |
| 56 const ErrorCode code; |
| 57 |
| 58 // Message associated with the error. |
| 59 const std::string message; |
| 60 |
| 61 // The key associated with the error, if any. Use a scoped_ptr here |
| 62 // because empty-string is a valid key. |
| 63 // |
| 64 // TODO(kalman): add test(s) for an empty key. |
| 65 const scoped_ptr<std::string> key; |
| 66 |
| 67 private: |
| 68 DISALLOW_COPY_AND_ASSIGN(Error); |
| 69 }; |
| 70 |
| 18 // The result of a read operation (Get). | 71 // The result of a read operation (Get). |
| 19 class ReadResultType { | 72 class ReadResultType { |
| 20 public: | 73 public: |
| 21 // Ownership of |settings| taken. | 74 explicit ReadResultType(scoped_ptr<base::DictionaryValue> settings); |
| 22 explicit ReadResultType(base::DictionaryValue* settings); | 75 explicit ReadResultType(scoped_ptr<Error> error); |
| 23 explicit ReadResultType(const std::string& error); | |
| 24 ~ReadResultType(); | 76 ~ReadResultType(); |
| 25 | 77 |
| 78 bool HasError() const { return error_; } |
| 79 |
| 26 // Gets the settings read from the storage. Note that this represents | 80 // Gets the settings read from the storage. Note that this represents |
| 27 // the root object. If you request the value for key "foo", that value will | 81 // the root object. If you request the value for key "foo", that value will |
| 28 // be in |settings.foo|. | 82 // be in |settings|.|foo|. |
| 29 // Must only be called if HasError() is false. | 83 // |
| 30 scoped_ptr<base::DictionaryValue>& settings(); | 84 // Must only be called if there is no error. |
| 85 base::DictionaryValue& settings() { return *settings_; } |
| 86 scoped_ptr<base::DictionaryValue> PassSettings() { |
| 87 return settings_.Pass(); |
| 88 } |
| 31 | 89 |
| 32 // Gets whether the operation failed. | 90 // Only call if HasError is true. |
| 33 bool HasError() const; | 91 const Error& error() const { return *error_; } |
| 34 | 92 scoped_ptr<Error> PassError() { return error_.Pass(); } |
| 35 // Gets the error message describing the failure. | |
| 36 // Must only be called if HasError() is true. | |
| 37 const std::string& error() const; | |
| 38 | 93 |
| 39 private: | 94 private: |
| 40 scoped_ptr<base::DictionaryValue> settings_; | 95 scoped_ptr<base::DictionaryValue> settings_; |
| 41 const std::string error_; | 96 scoped_ptr<Error> error_; |
| 42 | 97 |
| 43 DISALLOW_COPY_AND_ASSIGN(ReadResultType); | 98 DISALLOW_COPY_AND_ASSIGN(ReadResultType); |
| 44 }; | 99 }; |
| 45 typedef scoped_ptr<ReadResultType> ReadResult; | 100 typedef scoped_ptr<ReadResultType> ReadResult; |
| 46 | 101 |
| 47 // The result of a write operation (Set/Remove/Clear). | 102 // The result of a write operation (Set/Remove/Clear). |
| 48 class WriteResultType { | 103 class WriteResultType { |
| 49 public: | 104 public: |
| 50 // Ownership of |changes| taken. | 105 explicit WriteResultType(scoped_ptr<ValueStoreChangeList> changes); |
| 51 explicit WriteResultType(ValueStoreChangeList* changes); | 106 explicit WriteResultType(scoped_ptr<Error> error); |
| 52 explicit WriteResultType(const std::string& error); | |
| 53 ~WriteResultType(); | 107 ~WriteResultType(); |
| 54 | 108 |
| 109 bool HasError() const { return error_; } |
| 110 |
| 55 // Gets the list of changes to the settings which resulted from the write. | 111 // Gets the list of changes to the settings which resulted from the write. |
| 56 // Must only be called if HasError() is false. | 112 // Won't be present if the NO_GENERATE_CHANGES WriteOptions was given. |
| 57 const ValueStoreChangeList& changes() const; | 113 // Only call if HasError is false. |
| 114 ValueStoreChangeList& changes() { return *changes_; } |
| 115 scoped_ptr<ValueStoreChangeList> PassChanges() { return changes_.Pass(); } |
| 58 | 116 |
| 59 // Gets whether the operation failed. | 117 // Only call if HasError is true. |
| 60 bool HasError() const; | 118 const Error& error() const { return *error_; } |
| 61 | 119 scoped_ptr<Error> PassError() { return error_.Pass(); } |
| 62 // Gets the error message describing the failure. | |
| 63 // Must only be called if HasError() is true. | |
| 64 const std::string& error() const; | |
| 65 | 120 |
| 66 private: | 121 private: |
| 67 const scoped_ptr<ValueStoreChangeList> changes_; | 122 scoped_ptr<ValueStoreChangeList> changes_; |
| 68 const std::string error_; | 123 scoped_ptr<Error> error_; |
| 69 | 124 |
| 70 DISALLOW_COPY_AND_ASSIGN(WriteResultType); | 125 DISALLOW_COPY_AND_ASSIGN(WriteResultType); |
| 71 }; | 126 }; |
| 72 typedef scoped_ptr<WriteResultType> WriteResult; | 127 typedef scoped_ptr<WriteResultType> WriteResult; |
| 73 | 128 |
| 74 // Options for write operations. | 129 // Options for write operations. |
| 75 enum WriteOptionsValues { | 130 enum WriteOptionsValues { |
| 76 // Callers should usually use this. | 131 // Callers should usually use this. |
| 77 DEFAULTS = 0, | 132 DEFAULTS = 0, |
| 78 | 133 |
| 79 // Ignore any quota restrictions. | 134 // Ignore any quota restrictions. |
| 80 IGNORE_QUOTA = 1<<1, | 135 IGNORE_QUOTA = 1<<1, |
| 81 | 136 |
| 82 // Don't generate the changes for a WriteResult. | 137 // Don't generate the changes for a WriteResult. |
| 83 NO_GENERATE_CHANGES = 1<<2, | 138 NO_GENERATE_CHANGES = 1<<2, |
| 84 | |
| 85 // Don't check the old value before writing a new value. This will also | |
| 86 // result in an empty |old_value| in the WriteResult::changes list. | |
| 87 NO_CHECK_OLD_VALUE = 1<<3 | |
| 88 }; | 139 }; |
| 89 typedef int WriteOptions; | 140 typedef int WriteOptions; |
| 90 | 141 |
| 91 virtual ~ValueStore() {} | 142 virtual ~ValueStore() {} |
| 92 | 143 |
| 93 // Helpers for making a Read/WriteResult. | 144 // Helpers for making a Read/WriteResult. |
| 94 template<typename T> | 145 template<typename T> |
| 95 static ReadResult MakeReadResult(T arg) { | 146 static ReadResult MakeReadResult(scoped_ptr<T> arg) { |
| 96 return ReadResult(new ReadResultType(arg)); | 147 return ReadResult(new ReadResultType(arg.Pass())); |
| 97 } | 148 } |
| 98 | 149 |
| 99 template<typename T> | 150 template<typename T> |
| 100 static WriteResult MakeWriteResult(T arg) { | 151 static WriteResult MakeWriteResult(scoped_ptr<T> arg) { |
| 101 return WriteResult(new WriteResultType(arg)); | 152 return WriteResult(new WriteResultType(arg.Pass())); |
| 102 } | 153 } |
| 103 | 154 |
| 104 // Gets the amount of space being used by a single value, in bytes. | 155 // Gets the amount of space being used by a single value, in bytes. |
| 105 // Note: The GetBytesInUse methods are only used by extension settings at the | 156 // Note: The GetBytesInUse methods are only used by extension settings at the |
| 106 // moment. If these become more generally useful, the | 157 // moment. If these become more generally useful, the |
| 107 // SettingsStorageQuotaEnforcer and WeakUnlimitedSettingsStorage classes | 158 // SettingsStorageQuotaEnforcer and WeakUnlimitedSettingsStorage classes |
| 108 // should be moved to the value_store directory. | 159 // should be moved to the value_store directory. |
| 109 virtual size_t GetBytesInUse(const std::string& key) = 0; | 160 virtual size_t GetBytesInUse(const std::string& key) = 0; |
| 110 | 161 |
| 111 // Gets the total amount of space being used by multiple values, in bytes. | 162 // Gets the total amount of space being used by multiple values, in bytes. |
| (...skipping 24 matching lines...) Expand all Loading... |
| 136 virtual WriteResult Remove(const std::string& key) = 0; | 187 virtual WriteResult Remove(const std::string& key) = 0; |
| 137 | 188 |
| 138 // Removes multiple keys from the storage. | 189 // Removes multiple keys from the storage. |
| 139 virtual WriteResult Remove(const std::vector<std::string>& keys) = 0; | 190 virtual WriteResult Remove(const std::vector<std::string>& keys) = 0; |
| 140 | 191 |
| 141 // Clears the storage. | 192 // Clears the storage. |
| 142 virtual WriteResult Clear() = 0; | 193 virtual WriteResult Clear() = 0; |
| 143 }; | 194 }; |
| 144 | 195 |
| 145 #endif // CHROME_BROWSER_VALUE_STORE_VALUE_STORE_H_ | 196 #endif // CHROME_BROWSER_VALUE_STORE_VALUE_STORE_H_ |
| OLD | NEW |