Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: third_party/WebKit/Source/modules/indexeddb/IDBRequestQueue.cpp

Issue 2822453003: Wrap large IndexedDB values into Blobs before writing to LevelDB. (Closed)
Patch Set: Fixed compilation errors on Windows and no-DCHECKs. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1
2 // Copyright 2017 The Chromium Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5
6 #include "modules/indexeddb/IDBRequestQueue.h"
7
8 #include "core/dom/DOMException.h"
9 #include "modules/indexeddb/IDBKey.h"
10 #include "modules/indexeddb/IDBRequest.h"
11 #include "modules/indexeddb/IDBRequestLoader.h"
12 #include "modules/indexeddb/IDBValue.h"
13 #include "public/platform/modules/indexeddb/WebIDBCursor.h"
14
15 namespace blink {
16
17 IDBRequestQueueItem::IDBRequestQueueItem(IDBRequest* request,
18 DOMException* error)
19 : request_(request), error_(error), mode_(kError) {}
20
21 IDBRequestQueueItem::IDBRequestQueueItem(IDBRequest* request, IDBKey* key)
22 : request_(request), key_(key), mode_(kKey) {}
23
24 IDBRequestQueueItem::IDBRequestQueueItem(IDBRequest* request,
25 PassRefPtr<IDBValue> value)
26 : request_(request), mode_(kValue) {
27 values_.push_back(std::move(value));
28 }
29
30 IDBRequestQueueItem::IDBRequestQueueItem(IDBRequest* request,
31 const Vector<RefPtr<IDBValue>>& values)
32 : request_(request), values_(values), mode_(kValueArray) {}
33
34 IDBRequestQueueItem::IDBRequestQueueItem(IDBRequest* request,
35 IDBKey* key,
36 IDBKey* primary_key,
37 PassRefPtr<IDBValue> value)
38 : request_(request),
39 key_(key),
40 primary_key_(primary_key),
41 mode_(kKeyPrimaryKeyValue) {
42 values_.push_back(std::move(value));
43 }
44
45 IDBRequestQueueItem::IDBRequestQueueItem(IDBRequest* request,
46 std::unique_ptr<WebIDBCursor> backend,
47 IDBKey* key,
48 IDBKey* primary_key,
49 PassRefPtr<IDBValue> value)
50 : request_(request),
51 key_(key),
52 primary_key_(primary_key),
53 backend_(std::move(backend)),
54 mode_(kBackendKeyPrimaryKeyValue) {
55 values_.push_back(std::move(value));
56 }
57
58 void IDBRequestQueueItem::MarkReady() {
59 DCHECK(!ready_);
60 ready_ = true;
61
62 request_->transaction()->OnResultReady();
63 }
64
65 void IDBRequestQueueItem::MarkReady(DOMException* error) {
66 DCHECK(!ready_);
67 DCHECK(mode_ != kError);
68
69 mode_ = kError;
70 error_ = error;
71
72 // This is not necessary, but releases non-trivial amounts of memory early.
73 values_.clear();
74
75 MarkReady();
76 }
77
78 void IDBRequestQueueItem::AttachLoader() {
79 DCHECK(!loader_);
80 DCHECK(!values_.IsEmpty());
81 DCHECK(IDBRequestLoader::NeedUnwrapping(values_));
82
83 ready_ = false;
84 loader_ = new IDBRequestLoader(this, &values_);
dmurph 2017/05/04 22:27:07 The loader will definitely be only loading one blo
pwnall 2017/05/11 23:54:24 IDBObjectStore.getAll() returns an array of IDBVal
85 }
86
87 void IDBRequestQueueItem::StartLoading() {
88 if (loader_) {
89 DCHECK(!ready_);
90 loader_->Start();
91 }
92 }
93
94 void IDBRequestQueueItem::FireCallback() {
95 #if DCHECK_IS_ON()
96 DCHECK(ready_);
97 DCHECK(!callback_fired_);
98 callback_fired_ = true;
99 #endif // DCHECK_IS_ON()
100
101 switch (mode_) {
102 case kError:
103 DCHECK(error_);
104 request_->OnError(error_);
105 break;
106
107 case kBackendKeyPrimaryKeyValue:
108 DCHECK_EQ(values_.size(), 1U);
109 request_->OnSuccess(std::move(backend_), key_, primary_key_,
110 std::move(values_.front()));
111 break;
112
113 case kKeyPrimaryKeyValue:
114 DCHECK_EQ(values_.size(), 1U);
115 request_->OnSuccess(key_, primary_key_, std::move(values_.front()));
116 break;
117
118 case kKey:
119 request_->OnSuccess(key_);
120 break;
121
122 case kValue:
123 DCHECK_EQ(values_.size(), 1U);
124 request_->OnSuccess(std::move(values_.front()));
125 break;
126
127 case kValueArray:
128 request_->OnSuccess(values_);
129 break;
130 }
131 }
132
133 DEFINE_TRACE(IDBRequestQueueItem) {
134 visitor->Trace(error_);
135 visitor->Trace(loader_);
136 visitor->Trace(request_);
137 visitor->Trace(key_);
138 visitor->Trace(primary_key_);
139 }
140
141 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698