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

Side by Side Diff: Source/WebCore/Modules/indexeddb/IDBObjectStore.cpp

Issue 11336016: Revert 128379 - IndexedDB: Use ScriptValue instead of SerializedScriptValue when possible (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/1271/
Patch Set: Created 8 years, 1 month 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
Property Changes:
Added: svn:mergeinfo
Merged /trunk/WebCore/Modules/indexeddb/IDBObjectStore.cpp:r53455
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2010 Google Inc. All rights reserved. 2 * Copyright (C) 2010 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 PassRefPtr<IDBRequest> IDBObjectStore::get(ScriptExecutionContext* context, Pass RefPtr<IDBKey> key, ExceptionCode& ec) 98 PassRefPtr<IDBRequest> IDBObjectStore::get(ScriptExecutionContext* context, Pass RefPtr<IDBKey> key, ExceptionCode& ec)
99 { 99 {
100 IDB_TRACE("IDBObjectStore::get"); 100 IDB_TRACE("IDBObjectStore::get");
101 RefPtr<IDBKeyRange> keyRange = IDBKeyRange::only(key, ec); 101 RefPtr<IDBKeyRange> keyRange = IDBKeyRange::only(key, ec);
102 if (ec) 102 if (ec)
103 return 0; 103 return 0;
104 return get(context, keyRange.release(), ec); 104 return get(context, keyRange.release(), ec);
105 } 105 }
106 106
107 static void generateIndexKeysForValue(const IDBIndexMetadata& indexMetadata, 107 static void generateIndexKeysForValue(const IDBIndexMetadata& indexMetadata,
108 const ScriptValue& objectValue, 108 PassRefPtr<SerializedScriptValue> objectVa lue,
109 IDBObjectStore::IndexKeys* indexKeys) 109 IDBObjectStore::IndexKeys* indexKeys)
110 { 110 {
111 ASSERT(indexKeys); 111 ASSERT(indexKeys);
112 RefPtr<IDBKey> indexKey = createIDBKeyFromScriptValueAndKeyPath(objectValue, indexMetadata.keyPath); 112 RefPtr<IDBKey> indexKey = createIDBKeyFromSerializedValueAndKeyPath(objectVa lue, indexMetadata.keyPath);
113 113
114 if (!indexKey) 114 if (!indexKey)
115 return; 115 return;
116 116
117 if (!indexMetadata.multiEntry || indexKey->type() != IDBKey::ArrayType) { 117 if (!indexMetadata.multiEntry || indexKey->type() != IDBKey::ArrayType) {
118 if (!indexKey->isValid()) 118 if (!indexKey->isValid())
119 return; 119 return;
120 120
121 indexKeys->append(indexKey); 121 indexKeys->append(indexKey);
122 } else { 122 } else {
123 ASSERT(indexMetadata.multiEntry); 123 ASSERT(indexMetadata.multiEntry);
124 ASSERT(indexKey->type() == IDBKey::ArrayType); 124 ASSERT(indexKey->type() == IDBKey::ArrayType);
125 indexKey = IDBKey::createMultiEntryArray(indexKey->array()); 125 indexKey = IDBKey::createMultiEntryArray(indexKey->array());
126 126
127 for (size_t i = 0; i < indexKey->array().size(); ++i) 127 for (size_t i = 0; i < indexKey->array().size(); ++i)
128 indexKeys->append(indexKey->array()[i]); 128 indexKeys->append(indexKey->array()[i]);
129 } 129 }
130 } 130 }
131 131
132 PassRefPtr<IDBRequest> IDBObjectStore::add(ScriptExecutionContext* context, Scri ptValue& value, PassRefPtr<IDBKey> key, ExceptionCode& ec) 132 PassRefPtr<IDBRequest> IDBObjectStore::add(ScriptExecutionContext* context, Pass RefPtr<SerializedScriptValue> value, PassRefPtr<IDBKey> key, ExceptionCode& ec)
133 { 133 {
134 IDB_TRACE("IDBObjectStore::add"); 134 IDB_TRACE("IDBObjectStore::add");
135 return put(IDBObjectStoreBackendInterface::AddOnly, IDBAny::create(this), co ntext, value, key, ec); 135 return put(IDBObjectStoreBackendInterface::AddOnly, IDBAny::create(this), co ntext, value, key, ec);
136 } 136 }
137 137
138 PassRefPtr<IDBRequest> IDBObjectStore::put(ScriptExecutionContext* context, Scri ptValue& value, PassRefPtr<IDBKey> key, ExceptionCode& ec) 138 PassRefPtr<IDBRequest> IDBObjectStore::put(ScriptExecutionContext* context, Pass RefPtr<SerializedScriptValue> value, PassRefPtr<IDBKey> key, ExceptionCode& ec)
139 { 139 {
140 IDB_TRACE("IDBObjectStore::put"); 140 IDB_TRACE("IDBObjectStore::put");
141 return put(IDBObjectStoreBackendInterface::AddOrUpdate, IDBAny::create(this) , context, value, key, ec); 141 return put(IDBObjectStoreBackendInterface::AddOrUpdate, IDBAny::create(this) , context, value, key, ec);
142 } 142 }
143 143
144 PassRefPtr<IDBRequest> IDBObjectStore::put(IDBObjectStoreBackendInterface::PutMo de putMode, PassRefPtr<IDBAny> source, ScriptExecutionContext* context, ScriptVa lue& value, PassRefPtr<IDBKey> prpKey, ExceptionCode& ec) 144 PassRefPtr<IDBRequest> IDBObjectStore::put(IDBObjectStoreBackendInterface::PutMo de putMode, PassRefPtr<IDBAny> source, ScriptExecutionContext* context, PassRefP tr<SerializedScriptValue> prpValue, PassRefPtr<IDBKey> prpKey, ExceptionCode& ec )
145 { 145 {
146 IDB_TRACE("IDBObjectStore::put"); 146 IDB_TRACE("IDBObjectStore::put");
147 RefPtr<SerializedScriptValue> value = prpValue;
147 RefPtr<IDBKey> key = prpKey; 148 RefPtr<IDBKey> key = prpKey;
148 if (m_deleted) { 149 if (m_deleted) {
149 ec = IDBDatabaseException::IDB_INVALID_STATE_ERR; 150 ec = IDBDatabaseException::IDB_INVALID_STATE_ERR;
150 return 0; 151 return 0;
151 } 152 }
152 if (!m_transaction->isActive()) { 153 if (!m_transaction->isActive()) {
153 ec = IDBDatabaseException::TRANSACTION_INACTIVE_ERR; 154 ec = IDBDatabaseException::TRANSACTION_INACTIVE_ERR;
154 return 0; 155 return 0;
155 } 156 }
156 if (m_transaction->isReadOnly()) { 157 if (m_transaction->isReadOnly()) {
157 ec = IDBDatabaseException::READ_ONLY_ERR; 158 ec = IDBDatabaseException::READ_ONLY_ERR;
158 return 0; 159 return 0;
159 } 160 }
160 161 if (value->blobURLs().size() > 0) {
161 ScriptState* state = ScriptState::current();
162 RefPtr<SerializedScriptValue> serializedValue = value.serialize(state);
163 if (state->hadException()) {
164 ec = IDBDatabaseException::IDB_DATA_CLONE_ERR;
165 return 0;
166 }
167
168 if (serializedValue->blobURLs().size() > 0) {
169 // FIXME: Add Blob/File/FileList support 162 // FIXME: Add Blob/File/FileList support
170 ec = IDBDatabaseException::IDB_DATA_CLONE_ERR; 163 ec = IDBDatabaseException::IDB_DATA_CLONE_ERR;
171 return 0; 164 return 0;
172 } 165 }
173 166
174 const IDBKeyPath& keyPath = m_metadata.keyPath; 167 const IDBKeyPath& keyPath = m_metadata.keyPath;
175 const bool usesInLineKeys = !keyPath.isNull(); 168 const bool usesInLineKeys = !keyPath.isNull();
176 const bool hasKeyGenerator = autoIncrement(); 169 const bool hasKeyGenerator = autoIncrement();
177 170
178 if (putMode != IDBObjectStoreBackendInterface::CursorUpdate && usesInLineKey s && key) { 171 if (putMode != IDBObjectStoreBackendInterface::CursorUpdate && usesInLineKey s && key) {
179 ec = IDBDatabaseException::DATA_ERR; 172 ec = IDBDatabaseException::DATA_ERR;
180 return 0; 173 return 0;
181 } 174 }
182 if (!usesInLineKeys && !hasKeyGenerator && !key) { 175 if (!usesInLineKeys && !hasKeyGenerator && !key) {
183 ec = IDBDatabaseException::DATA_ERR; 176 ec = IDBDatabaseException::DATA_ERR;
184 return 0; 177 return 0;
185 } 178 }
186 if (usesInLineKeys) { 179 if (usesInLineKeys) {
187 RefPtr<IDBKey> keyPathKey = createIDBKeyFromScriptValueAndKeyPath(value, keyPath); 180 RefPtr<IDBKey> keyPathKey = createIDBKeyFromSerializedValueAndKeyPath(va lue, keyPath);
188 if (keyPathKey && !keyPathKey->isValid()) { 181 if (keyPathKey && !keyPathKey->isValid()) {
189 ec = IDBDatabaseException::DATA_ERR; 182 ec = IDBDatabaseException::DATA_ERR;
190 return 0; 183 return 0;
191 } 184 }
192 if (!hasKeyGenerator && !keyPathKey) { 185 if (!hasKeyGenerator && !keyPathKey) {
193 ec = IDBDatabaseException::DATA_ERR; 186 ec = IDBDatabaseException::DATA_ERR;
194 return 0; 187 return 0;
195 } 188 }
196 if (hasKeyGenerator && !keyPathKey) { 189 if (hasKeyGenerator && !keyPathKey) {
197 if (!canInjectIDBKeyIntoScriptValue(value, keyPath)) { 190 RefPtr<IDBKey> dummyKey = IDBKey::createNumber(-1);
191 RefPtr<SerializedScriptValue> valueAfterInjection = injectIDBKeyInto SerializedValue(dummyKey, value, keyPath);
192 if (!valueAfterInjection) {
198 ec = IDBDatabaseException::DATA_ERR; 193 ec = IDBDatabaseException::DATA_ERR;
199 return 0; 194 return 0;
200 } 195 }
201 } 196 }
202 if (keyPathKey) 197 if (keyPathKey)
203 key = keyPathKey; 198 key = keyPathKey;
204 } 199 }
205 if (key && !key->isValid()) { 200 if (key && !key->isValid()) {
206 ec = IDBDatabaseException::DATA_ERR; 201 ec = IDBDatabaseException::DATA_ERR;
207 return 0; 202 return 0;
208 } 203 }
209 204
210 Vector<String> indexNames; 205 Vector<String> indexNames;
211 Vector<IndexKeys> indexKeys; 206 Vector<IndexKeys> indexKeys;
212 for (IDBObjectStoreMetadata::IndexMap::const_iterator it = m_metadata.indexe s.begin(); it != m_metadata.indexes.end(); ++it) { 207 for (IDBObjectStoreMetadata::IndexMap::const_iterator it = m_metadata.indexe s.begin(); it != m_metadata.indexes.end(); ++it) {
213 IndexKeys keys; 208 IndexKeys keys;
214 generateIndexKeysForValue(it->second, value, &keys); 209 generateIndexKeysForValue(it->second, value, &keys);
215 indexNames.append(it->first); 210 indexNames.append(it->first);
216 indexKeys.append(keys); 211 indexKeys.append(keys);
217 } 212 }
218 ASSERT(indexKeys.size() == indexNames.size()); 213 ASSERT(indexKeys.size() == indexNames.size());
219 214
220 RefPtr<IDBRequest> request = IDBRequest::create(context, source, m_transacti on.get()); 215 RefPtr<IDBRequest> request = IDBRequest::create(context, source, m_transacti on.get());
221 m_backend->putWithIndexKeys(serializedValue.release(), key.release(), putMod e, request, m_transaction->backend(), indexNames, indexKeys, ec); 216 m_backend->putWithIndexKeys(value.release(), key.release(), putMode, request , m_transaction->backend(), indexNames, indexKeys, ec);
222 if (ec) { 217 if (ec) {
223 request->markEarlyDeath(); 218 request->markEarlyDeath();
224 return 0; 219 return 0;
225 } 220 }
226 return request.release(); 221 return request.release();
227 } 222 }
228 223
229 PassRefPtr<IDBRequest> IDBObjectStore::deleteFunction(ScriptExecutionContext* co ntext, PassRefPtr<IDBKeyRange> keyRange, ExceptionCode& ec) 224 PassRefPtr<IDBRequest> IDBObjectStore::deleteFunction(ScriptExecutionContext* co ntext, PassRefPtr<IDBKeyRange> keyRange, ExceptionCode& ec)
230 { 225 {
231 IDB_TRACE("IDBObjectStore::delete"); 226 IDB_TRACE("IDBObjectStore::delete");
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 IndexPopulator(PassRefPtr<IDBObjectStoreBackendInterface> backend, 306 IndexPopulator(PassRefPtr<IDBObjectStoreBackendInterface> backend,
312 PassRefPtr<IDBTransactionBackendInterface> transaction, 307 PassRefPtr<IDBTransactionBackendInterface> transaction,
313 const IDBIndexMetadata& indexMetadata) 308 const IDBIndexMetadata& indexMetadata)
314 : EventListener(CPPEventListenerType) 309 : EventListener(CPPEventListenerType)
315 , m_objectStoreBackend(backend) 310 , m_objectStoreBackend(backend)
316 , m_transaction(transaction) 311 , m_transaction(transaction)
317 , m_indexMetadata(indexMetadata) 312 , m_indexMetadata(indexMetadata)
318 { 313 {
319 } 314 }
320 315
321 virtual void handleEvent(ScriptExecutionContext* context, Event* event) 316 virtual void handleEvent(ScriptExecutionContext*, Event* event)
322 { 317 {
323 ASSERT(event->type() == eventNames().successEvent); 318 ASSERT(event->type() == eventNames().successEvent);
324 EventTarget* target = event->target(); 319 EventTarget* target = event->target();
325 IDBRequest* request = static_cast<IDBRequest*>(target); 320 IDBRequest* request = static_cast<IDBRequest*>(target);
326 321
327 ExceptionCode ec = 0; 322 ExceptionCode ec = 0;
328 RefPtr<IDBAny> cursorAny = request->result(ec); 323 RefPtr<IDBAny> cursorAny = request->result(ec);
329 ASSERT(!ec); 324 ASSERT(!ec);
330 RefPtr<IDBCursorWithValue> cursor; 325 RefPtr<IDBCursorWithValue> cursor;
331 if (cursorAny->type() == IDBAny::IDBCursorWithValueType) 326 if (cursorAny->type() == IDBAny::IDBCursorWithValueType)
332 cursor = cursorAny->idbCursorWithValue(); 327 cursor = cursorAny->idbCursorWithValue();
333 328
334 Vector<String, 1> indexNames; 329 Vector<String, 1> indexNames;
335 indexNames.append(m_indexMetadata.name); 330 indexNames.append(m_indexMetadata.name);
336 if (cursor) { 331 if (cursor) {
337 cursor->continueFunction(ec); 332 cursor->continueFunction(ec);
338 ASSERT(!ec); 333 ASSERT(!ec);
339 334
340 RefPtr<IDBKey> primaryKey = cursor->primaryKey(); 335 RefPtr<IDBKey> primaryKey = cursor->primaryKey();
341 RefPtr<IDBAny> valueAny = cursor->value(); 336 RefPtr<IDBAny> valueAny = cursor->value();
342 337
343 ASSERT(valueAny->type() == IDBAny::SerializedScriptValueType); 338 ASSERT(valueAny->type() == IDBAny::SerializedScriptValueType);
344 RefPtr<SerializedScriptValue> serializedValue = valueAny->serialized ScriptValue(); 339 RefPtr<SerializedScriptValue> value = valueAny->serializedScriptValu e();
345 ScriptValue value(deserializeIDBValue(context, serializedValue));
346 340
347 IDBObjectStore::IndexKeys indexKeys; 341 IDBObjectStore::IndexKeys indexKeys;
348 generateIndexKeysForValue(m_indexMetadata, value, &indexKeys); 342 generateIndexKeysForValue(m_indexMetadata, value, &indexKeys);
349 343
350 Vector<IDBObjectStore::IndexKeys, 1> indexKeysList; 344 Vector<IDBObjectStore::IndexKeys, 1> indexKeysList;
351 indexKeysList.append(indexKeys); 345 indexKeysList.append(indexKeys);
352 346
353 m_objectStoreBackend->setIndexKeys(primaryKey, indexNames, indexKeys List, m_transaction.get()); 347 m_objectStoreBackend->setIndexKeys(primaryKey, indexNames, indexKeys List, m_transaction.get());
354 348
355 } else { 349 } else {
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 ASSERT(m_transaction->isFinished()); 580 ASSERT(m_transaction->isFinished());
587 581
588 // Break reference cycles. 582 // Break reference cycles.
589 m_indexMap.clear(); 583 m_indexMap.clear();
590 } 584 }
591 585
592 586
593 } // namespace WebCore 587 } // namespace WebCore
594 588
595 #endif // ENABLE(INDEXED_DATABASE) 589 #endif // ENABLE(INDEXED_DATABASE)
OLDNEW
« no previous file with comments | « Source/WebCore/Modules/indexeddb/IDBObjectStore.h ('k') | Source/WebCore/Modules/indexeddb/IDBObjectStore.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698