1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef EXTENSIONS_BROWSER_VALUE_STORE_VALUE_STORE_H_
6 #define EXTENSIONS_BROWSER_VALUE_STORE_VALUE_STORE_H_
11 #include "base/memory/scoped_ptr.h"
12 #include "base/values.h"
13 #include "extensions/browser/value_store/value_store_change.h"
15 // Interface for a storage area for Value objects.
18 // Error codes returned from storage methods.
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.
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.
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.
32 // The failure was due to the store being read-only (for example, policy).
35 // The failure was due to the store running out of space.
42 // Bundles an ErrorCode with further metadata.
45 const std::string
& message
,
46 scoped_ptr
<std::string
> key
);
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()));
58 // Message associated with the error.
59 const std::string message
;
61 // The key associated with the error, if any. Use a scoped_ptr here
62 // because empty-string is a valid key.
64 // TODO(kalman): add test(s) for an empty key.
65 const scoped_ptr
<std::string
> key
;
68 DISALLOW_COPY_AND_ASSIGN(Error
);
71 // The result of a read operation (Get).
72 class ReadResultType
{
74 explicit ReadResultType(scoped_ptr
<base::DictionaryValue
> settings
);
75 explicit ReadResultType(scoped_ptr
<Error
> error
);
78 bool HasError() const { return error_
; }
80 bool IsCorrupted() const {
81 return error_
.get() && error_
->code
== CORRUPTION
;
84 // Gets the settings read from the storage. Note that this represents
85 // the root object. If you request the value for key "foo", that value will
86 // be in |settings|.|foo|.
88 // Must only be called if there is no error.
89 base::DictionaryValue
& settings() { return *settings_
; }
90 scoped_ptr
<base::DictionaryValue
> PassSettings() {
91 return settings_
.Pass();
94 // Only call if HasError is true.
95 const Error
& error() const { return *error_
; }
96 scoped_ptr
<Error
> PassError() { return error_
.Pass(); }
99 scoped_ptr
<base::DictionaryValue
> settings_
;
100 scoped_ptr
<Error
> error_
;
102 DISALLOW_COPY_AND_ASSIGN(ReadResultType
);
104 typedef scoped_ptr
<ReadResultType
> ReadResult
;
106 // The result of a write operation (Set/Remove/Clear).
107 class WriteResultType
{
109 explicit WriteResultType(scoped_ptr
<ValueStoreChangeList
> changes
);
110 explicit WriteResultType(scoped_ptr
<Error
> error
);
113 bool HasError() const { return error_
; }
115 // Gets the list of changes to the settings which resulted from the write.
116 // Won't be present if the NO_GENERATE_CHANGES WriteOptions was given.
117 // Only call if HasError is false.
118 ValueStoreChangeList
& changes() { return *changes_
; }
119 scoped_ptr
<ValueStoreChangeList
> PassChanges() { return changes_
.Pass(); }
121 // Only call if HasError is true.
122 const Error
& error() const { return *error_
; }
123 scoped_ptr
<Error
> PassError() { return error_
.Pass(); }
126 scoped_ptr
<ValueStoreChangeList
> changes_
;
127 scoped_ptr
<Error
> error_
;
129 DISALLOW_COPY_AND_ASSIGN(WriteResultType
);
131 typedef scoped_ptr
<WriteResultType
> WriteResult
;
133 // Options for write operations.
134 enum WriteOptionsValues
{
135 // Callers should usually use this.
138 // Ignore any quota restrictions.
141 // Don't generate the changes for a WriteResult.
142 NO_GENERATE_CHANGES
= 1<<2,
144 typedef int WriteOptions
;
146 virtual ~ValueStore() {}
148 // Helpers for making a Read/WriteResult.
150 static ReadResult
MakeReadResult(scoped_ptr
<T
> arg
) {
151 return ReadResult(new ReadResultType(arg
.Pass()));
155 static WriteResult
MakeWriteResult(scoped_ptr
<T
> arg
) {
156 return WriteResult(new WriteResultType(arg
.Pass()));
159 // Gets the amount of space being used by a single value, in bytes.
160 // Note: The GetBytesInUse methods are only used by extension settings at the
161 // moment. If these become more generally useful, the
162 // SettingsStorageQuotaEnforcer and WeakUnlimitedSettingsStorage classes
163 // should be moved to the value_store directory.
164 virtual size_t GetBytesInUse(const std::string
& key
) = 0;
166 // Gets the total amount of space being used by multiple values, in bytes.
167 virtual size_t GetBytesInUse(const std::vector
<std::string
>& keys
) = 0;
169 // Gets the total amount of space being used by this storage area, in bytes.
170 virtual size_t GetBytesInUse() = 0;
172 // Gets a single value from storage.
173 virtual ReadResult
Get(const std::string
& key
) = 0;
175 // Gets multiple values from storage.
176 virtual ReadResult
Get(const std::vector
<std::string
>& keys
) = 0;
178 // Gets all values from storage.
179 virtual ReadResult
Get() = 0;
181 // Sets a single key to a new value.
182 virtual WriteResult
Set(WriteOptions options
,
183 const std::string
& key
,
184 const base::Value
& value
) = 0;
186 // Sets multiple keys to new values.
187 virtual WriteResult
Set(
188 WriteOptions options
, const base::DictionaryValue
& values
) = 0;
190 // Removes a key from the storage.
191 virtual WriteResult
Remove(const std::string
& key
) = 0;
193 // Removes multiple keys from the storage.
194 virtual WriteResult
Remove(const std::vector
<std::string
>& keys
) = 0;
196 // Clears the storage.
197 virtual WriteResult
Clear() = 0;
199 // In the event of corruption, the ValueStore should be able to restore
200 // itself. This means deleting local corrupted files. If only a few keys are
201 // corrupted, then some of the database may be saved. If the full database is
202 // corrupted, this will erase it in its entirety.
203 // Returns true on success, false on failure. The only way this will fail is
204 // if we also cannot delete the database file.
205 // Note: This method may be expensive; some implementations may need to read
206 // the entire database to restore. Use sparingly.
207 // Note: This method (and the following RestoreKey()) are rude, and do not
208 // make any logs, track changes, or other generally polite things. Please do
209 // not use these as substitutes for Clear() and Remove().
210 virtual bool Restore() = 0;
212 // Similar to Restore(), but for only a particular key. If the key is corrupt,
213 // this will forcefully remove the key. It does not look at the database on
214 // the whole, which makes it faster, but does not guarantee there is no
215 // additional corruption.
216 // Returns true on success, and false on failure. If false, the next step is
217 // probably to Restore() the whole database.
218 virtual bool RestoreKey(const std::string
& key
) = 0;
221 #endif // EXTENSIONS_BROWSER_VALUE_STORE_VALUE_STORE_H_