OLD | NEW |
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 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
75 indexNames->append(it->value.name); | 75 indexNames->append(it->value.name); |
76 indexNames->sort(); | 76 indexNames->sort(); |
77 return indexNames.release(); | 77 return indexNames.release(); |
78 } | 78 } |
79 | 79 |
80 PassRefPtr<IDBRequest> IDBObjectStore::get(ExecutionContext* context, const Scri
ptValue& key, ExceptionState& exceptionState) | 80 PassRefPtr<IDBRequest> IDBObjectStore::get(ExecutionContext* context, const Scri
ptValue& key, ExceptionState& exceptionState) |
81 { | 81 { |
82 IDB_TRACE("IDBObjectStore::get"); | 82 IDB_TRACE("IDBObjectStore::get"); |
83 if (isDeleted()) { | 83 if (isDeleted()) { |
84 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS
toreDeletedErrorMessage); | 84 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS
toreDeletedErrorMessage); |
85 return 0; | 85 return nullptr; |
86 } | 86 } |
87 if (m_transaction->isFinished()) { | 87 if (m_transaction->isFinished()) { |
88 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionFinishedErrorMessage); | 88 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionFinishedErrorMessage); |
89 return 0; | 89 return nullptr; |
90 } | 90 } |
91 if (!m_transaction->isActive()) { | 91 if (!m_transaction->isActive()) { |
92 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionInactiveErrorMessage); | 92 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionInactiveErrorMessage); |
93 return 0; | 93 return nullptr; |
94 } | 94 } |
95 RefPtr<IDBKeyRange> keyRange = IDBKeyRange::fromScriptValue(context, key, ex
ceptionState); | 95 RefPtr<IDBKeyRange> keyRange = IDBKeyRange::fromScriptValue(context, key, ex
ceptionState); |
96 if (exceptionState.hadException()) | 96 if (exceptionState.hadException()) |
97 return 0; | 97 return nullptr; |
98 if (!keyRange) { | 98 if (!keyRange) { |
99 exceptionState.throwDOMException(DataError, IDBDatabase::noKeyOrKeyRange
ErrorMessage); | 99 exceptionState.throwDOMException(DataError, IDBDatabase::noKeyOrKeyRange
ErrorMessage); |
100 return 0; | 100 return nullptr; |
101 } | 101 } |
102 | 102 |
103 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this
), m_transaction.get()); | 103 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this
), m_transaction.get()); |
104 backendDB()->get(m_transaction->id(), id(), IDBIndexMetadata::InvalidId, key
Range.release(), false, WebIDBCallbacksImpl::create(request).leakPtr()); | 104 backendDB()->get(m_transaction->id(), id(), IDBIndexMetadata::InvalidId, key
Range.release(), false, WebIDBCallbacksImpl::create(request).leakPtr()); |
105 return request.release(); | 105 return request.release(); |
106 } | 106 } |
107 | 107 |
108 static void generateIndexKeysForValue(DOMRequestState* requestState, const IDBIn
dexMetadata& indexMetadata, const ScriptValue& objectValue, IDBObjectStore::Inde
xKeys* indexKeys) | 108 static void generateIndexKeysForValue(DOMRequestState* requestState, const IDBIn
dexMetadata& indexMetadata, const ScriptValue& objectValue, IDBObjectStore::Inde
xKeys* indexKeys) |
109 { | 109 { |
110 ASSERT(indexKeys); | 110 ASSERT(indexKeys); |
(...skipping 26 matching lines...) Expand all Loading... |
137 PassRefPtr<IDBRequest> IDBObjectStore::put(ScriptState* state, ScriptValue& valu
e, const ScriptValue& key, ExceptionState& exceptionState) | 137 PassRefPtr<IDBRequest> IDBObjectStore::put(ScriptState* state, ScriptValue& valu
e, const ScriptValue& key, ExceptionState& exceptionState) |
138 { | 138 { |
139 IDB_TRACE("IDBObjectStore::put"); | 139 IDB_TRACE("IDBObjectStore::put"); |
140 return put(WebIDBDatabase::AddOrUpdate, IDBAny::create(this), state, value,
key, exceptionState); | 140 return put(WebIDBDatabase::AddOrUpdate, IDBAny::create(this), state, value,
key, exceptionState); |
141 } | 141 } |
142 | 142 |
143 PassRefPtr<IDBRequest> IDBObjectStore::put(WebIDBDatabase::PutMode putMode, Pass
RefPtr<IDBAny> source, ScriptState* state, ScriptValue& value, const ScriptValue
& keyValue, ExceptionState& exceptionState) | 143 PassRefPtr<IDBRequest> IDBObjectStore::put(WebIDBDatabase::PutMode putMode, Pass
RefPtr<IDBAny> source, ScriptState* state, ScriptValue& value, const ScriptValue
& keyValue, ExceptionState& exceptionState) |
144 { | 144 { |
145 ExecutionContext* context = state->executionContext(); | 145 ExecutionContext* context = state->executionContext(); |
146 DOMRequestState requestState(context); | 146 DOMRequestState requestState(context); |
147 RefPtr<IDBKey> key = keyValue.isUndefined() ? 0 : scriptValueToIDBKey(&reque
stState, keyValue); | 147 RefPtr<IDBKey> key = keyValue.isUndefined() ? nullptr : scriptValueToIDBKey(
&requestState, keyValue); |
148 return put(putMode, source, state, value, key.release(), exceptionState); | 148 return put(putMode, source, state, value, key.release(), exceptionState); |
149 } | 149 } |
150 | 150 |
151 PassRefPtr<IDBRequest> IDBObjectStore::put(WebIDBDatabase::PutMode putMode, Pass
RefPtr<IDBAny> source, ScriptState* state, ScriptValue& value, PassRefPtr<IDBKey
> prpKey, ExceptionState& exceptionState) | 151 PassRefPtr<IDBRequest> IDBObjectStore::put(WebIDBDatabase::PutMode putMode, Pass
RefPtr<IDBAny> source, ScriptState* state, ScriptValue& value, PassRefPtr<IDBKey
> prpKey, ExceptionState& exceptionState) |
152 { | 152 { |
153 RefPtr<IDBKey> key = prpKey; | 153 RefPtr<IDBKey> key = prpKey; |
154 if (isDeleted()) { | 154 if (isDeleted()) { |
155 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS
toreDeletedErrorMessage); | 155 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS
toreDeletedErrorMessage); |
156 return 0; | 156 return nullptr; |
157 } | 157 } |
158 if (m_transaction->isFinished()) { | 158 if (m_transaction->isFinished()) { |
159 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionFinishedErrorMessage); | 159 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionFinishedErrorMessage); |
160 return 0; | 160 return nullptr; |
161 } | 161 } |
162 if (!m_transaction->isActive()) { | 162 if (!m_transaction->isActive()) { |
163 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionInactiveErrorMessage); | 163 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionInactiveErrorMessage); |
164 return 0; | 164 return nullptr; |
165 } | 165 } |
166 if (m_transaction->isReadOnly()) { | 166 if (m_transaction->isReadOnly()) { |
167 exceptionState.throwDOMException(ReadOnlyError, IDBDatabase::transaction
ReadOnlyErrorMessage); | 167 exceptionState.throwDOMException(ReadOnlyError, IDBDatabase::transaction
ReadOnlyErrorMessage); |
168 return 0; | 168 return nullptr; |
169 } | 169 } |
170 | 170 |
171 RefPtr<SerializedScriptValue> serializedValue = SerializedScriptValue::creat
e(value, exceptionState, state); | 171 RefPtr<SerializedScriptValue> serializedValue = SerializedScriptValue::creat
e(value, exceptionState, state); |
172 if (exceptionState.hadException()) | 172 if (exceptionState.hadException()) |
173 return 0; | 173 return nullptr; |
174 | 174 |
175 if (serializedValue->containsBlobs()) { | 175 if (serializedValue->containsBlobs()) { |
176 // FIXME: Add Blob/File/FileList support | 176 // FIXME: Add Blob/File/FileList support |
177 exceptionState.throwDOMException(DataCloneError, "The object store curre
ntly does not support blob values."); | 177 exceptionState.throwDOMException(DataCloneError, "The object store curre
ntly does not support blob values."); |
178 return 0; | 178 return nullptr; |
179 } | 179 } |
180 | 180 |
181 const IDBKeyPath& keyPath = m_metadata.keyPath; | 181 const IDBKeyPath& keyPath = m_metadata.keyPath; |
182 const bool usesInLineKeys = !keyPath.isNull(); | 182 const bool usesInLineKeys = !keyPath.isNull(); |
183 const bool hasKeyGenerator = autoIncrement(); | 183 const bool hasKeyGenerator = autoIncrement(); |
184 | 184 |
185 ExecutionContext* context = state->executionContext(); | 185 ExecutionContext* context = state->executionContext(); |
186 DOMRequestState requestState(context); | 186 DOMRequestState requestState(context); |
187 | 187 |
188 if (putMode != WebIDBDatabase::CursorUpdate && usesInLineKeys && key) { | 188 if (putMode != WebIDBDatabase::CursorUpdate && usesInLineKeys && key) { |
189 exceptionState.throwDOMException(DataError, "The object store uses in-li
ne keys and the key parameter was provided."); | 189 exceptionState.throwDOMException(DataError, "The object store uses in-li
ne keys and the key parameter was provided."); |
190 return 0; | 190 return nullptr; |
191 } | 191 } |
192 if (!usesInLineKeys && !hasKeyGenerator && !key) { | 192 if (!usesInLineKeys && !hasKeyGenerator && !key) { |
193 exceptionState.throwDOMException(DataError, "The object store uses out-o
f-line keys and has no key generator and the key parameter was not provided."); | 193 exceptionState.throwDOMException(DataError, "The object store uses out-o
f-line keys and has no key generator and the key parameter was not provided."); |
194 return 0; | 194 return nullptr; |
195 } | 195 } |
196 if (usesInLineKeys) { | 196 if (usesInLineKeys) { |
197 RefPtr<IDBKey> keyPathKey = createIDBKeyFromScriptValueAndKeyPath(&reque
stState, value, keyPath); | 197 RefPtr<IDBKey> keyPathKey = createIDBKeyFromScriptValueAndKeyPath(&reque
stState, value, keyPath); |
198 if (keyPathKey && !keyPathKey->isValid()) { | 198 if (keyPathKey && !keyPathKey->isValid()) { |
199 exceptionState.throwDOMException(DataError, "Evaluating the object s
tore's key path yielded a value that is not a valid key."); | 199 exceptionState.throwDOMException(DataError, "Evaluating the object s
tore's key path yielded a value that is not a valid key."); |
200 return 0; | 200 return nullptr; |
201 } | 201 } |
202 if (!hasKeyGenerator && !keyPathKey) { | 202 if (!hasKeyGenerator && !keyPathKey) { |
203 exceptionState.throwDOMException(DataError, "Evaluating the object s
tore's key path did not yield a value."); | 203 exceptionState.throwDOMException(DataError, "Evaluating the object s
tore's key path did not yield a value."); |
204 return 0; | 204 return nullptr; |
205 } | 205 } |
206 if (hasKeyGenerator && !keyPathKey) { | 206 if (hasKeyGenerator && !keyPathKey) { |
207 if (!canInjectIDBKeyIntoScriptValue(&requestState, value, keyPath))
{ | 207 if (!canInjectIDBKeyIntoScriptValue(&requestState, value, keyPath))
{ |
208 exceptionState.throwDOMException(DataError, "A generated key cou
ld not be inserted into the value."); | 208 exceptionState.throwDOMException(DataError, "A generated key cou
ld not be inserted into the value."); |
209 return 0; | 209 return nullptr; |
210 } | 210 } |
211 } | 211 } |
212 if (keyPathKey) | 212 if (keyPathKey) |
213 key = keyPathKey; | 213 key = keyPathKey; |
214 } | 214 } |
215 if (key && !key->isValid()) { | 215 if (key && !key->isValid()) { |
216 exceptionState.throwDOMException(DataError, IDBDatabase::notValidKeyErro
rMessage); | 216 exceptionState.throwDOMException(DataError, IDBDatabase::notValidKeyErro
rMessage); |
217 return 0; | 217 return nullptr; |
218 } | 218 } |
219 | 219 |
220 Vector<int64_t> indexIds; | 220 Vector<int64_t> indexIds; |
221 Vector<IndexKeys> indexKeys; | 221 Vector<IndexKeys> indexKeys; |
222 for (IDBObjectStoreMetadata::IndexMap::const_iterator it = m_metadata.indexe
s.begin(); it != m_metadata.indexes.end(); ++it) { | 222 for (IDBObjectStoreMetadata::IndexMap::const_iterator it = m_metadata.indexe
s.begin(); it != m_metadata.indexes.end(); ++it) { |
223 IndexKeys keys; | 223 IndexKeys keys; |
224 generateIndexKeysForValue(&requestState, it->value, value, &keys); | 224 generateIndexKeysForValue(&requestState, it->value, value, &keys); |
225 indexIds.append(it->key); | 225 indexIds.append(it->key); |
226 indexKeys.append(keys); | 226 indexKeys.append(keys); |
227 } | 227 } |
228 | 228 |
229 RefPtr<IDBRequest> request = IDBRequest::create(context, source, m_transacti
on.get()); | 229 RefPtr<IDBRequest> request = IDBRequest::create(context, source, m_transacti
on.get()); |
230 Vector<char> wireBytes; | 230 Vector<char> wireBytes; |
231 serializedValue->toWireBytes(wireBytes); | 231 serializedValue->toWireBytes(wireBytes); |
232 RefPtr<SharedBuffer> valueBuffer = SharedBuffer::adoptVector(wireBytes); | 232 RefPtr<SharedBuffer> valueBuffer = SharedBuffer::adoptVector(wireBytes); |
233 backendDB()->put(m_transaction->id(), id(), blink::WebData(valueBuffer), key
.release(), static_cast<WebIDBDatabase::PutMode>(putMode), WebIDBCallbacksImpl::
create(request).leakPtr(), indexIds, indexKeys); | 233 backendDB()->put(m_transaction->id(), id(), blink::WebData(valueBuffer), key
.release(), static_cast<WebIDBDatabase::PutMode>(putMode), WebIDBCallbacksImpl::
create(request).leakPtr(), indexIds, indexKeys); |
234 return request.release(); | 234 return request.release(); |
235 } | 235 } |
236 | 236 |
237 PassRefPtr<IDBRequest> IDBObjectStore::deleteFunction(ExecutionContext* context,
const ScriptValue& key, ExceptionState& exceptionState) | 237 PassRefPtr<IDBRequest> IDBObjectStore::deleteFunction(ExecutionContext* context,
const ScriptValue& key, ExceptionState& exceptionState) |
238 { | 238 { |
239 IDB_TRACE("IDBObjectStore::delete"); | 239 IDB_TRACE("IDBObjectStore::delete"); |
240 if (isDeleted()) { | 240 if (isDeleted()) { |
241 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS
toreDeletedErrorMessage); | 241 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS
toreDeletedErrorMessage); |
242 return 0; | 242 return nullptr; |
243 } | 243 } |
244 if (m_transaction->isFinished()) { | 244 if (m_transaction->isFinished()) { |
245 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionFinishedErrorMessage); | 245 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionFinishedErrorMessage); |
246 return 0; | 246 return nullptr; |
247 } | 247 } |
248 if (!m_transaction->isActive()) { | 248 if (!m_transaction->isActive()) { |
249 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionInactiveErrorMessage); | 249 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionInactiveErrorMessage); |
250 return 0; | 250 return nullptr; |
251 } | 251 } |
252 if (m_transaction->isReadOnly()) { | 252 if (m_transaction->isReadOnly()) { |
253 exceptionState.throwDOMException(ReadOnlyError, IDBDatabase::transaction
ReadOnlyErrorMessage); | 253 exceptionState.throwDOMException(ReadOnlyError, IDBDatabase::transaction
ReadOnlyErrorMessage); |
254 return 0; | 254 return nullptr; |
255 } | 255 } |
256 | 256 |
257 RefPtr<IDBKeyRange> keyRange = IDBKeyRange::fromScriptValue(context, key, ex
ceptionState); | 257 RefPtr<IDBKeyRange> keyRange = IDBKeyRange::fromScriptValue(context, key, ex
ceptionState); |
258 if (exceptionState.hadException()) | 258 if (exceptionState.hadException()) |
259 return 0; | 259 return nullptr; |
260 if (!keyRange) { | 260 if (!keyRange) { |
261 exceptionState.throwDOMException(DataError, IDBDatabase::noKeyOrKeyRange
ErrorMessage); | 261 exceptionState.throwDOMException(DataError, IDBDatabase::noKeyOrKeyRange
ErrorMessage); |
262 return 0; | 262 return nullptr; |
263 } | 263 } |
264 | 264 |
265 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this
), m_transaction.get()); | 265 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this
), m_transaction.get()); |
266 backendDB()->deleteRange(m_transaction->id(), id(), keyRange.release(), WebI
DBCallbacksImpl::create(request).leakPtr()); | 266 backendDB()->deleteRange(m_transaction->id(), id(), keyRange.release(), WebI
DBCallbacksImpl::create(request).leakPtr()); |
267 return request.release(); | 267 return request.release(); |
268 } | 268 } |
269 | 269 |
270 PassRefPtr<IDBRequest> IDBObjectStore::clear(ExecutionContext* context, Exceptio
nState& exceptionState) | 270 PassRefPtr<IDBRequest> IDBObjectStore::clear(ExecutionContext* context, Exceptio
nState& exceptionState) |
271 { | 271 { |
272 IDB_TRACE("IDBObjectStore::clear"); | 272 IDB_TRACE("IDBObjectStore::clear"); |
273 if (isDeleted()) { | 273 if (isDeleted()) { |
274 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS
toreDeletedErrorMessage); | 274 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS
toreDeletedErrorMessage); |
275 return 0; | 275 return nullptr; |
276 } | 276 } |
277 if (m_transaction->isFinished()) { | 277 if (m_transaction->isFinished()) { |
278 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionFinishedErrorMessage); | 278 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionFinishedErrorMessage); |
279 return 0; | 279 return nullptr; |
280 } | 280 } |
281 if (!m_transaction->isActive()) { | 281 if (!m_transaction->isActive()) { |
282 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionInactiveErrorMessage); | 282 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionInactiveErrorMessage); |
283 return 0; | 283 return nullptr; |
284 } | 284 } |
285 if (m_transaction->isReadOnly()) { | 285 if (m_transaction->isReadOnly()) { |
286 exceptionState.throwDOMException(ReadOnlyError, IDBDatabase::transaction
ReadOnlyErrorMessage); | 286 exceptionState.throwDOMException(ReadOnlyError, IDBDatabase::transaction
ReadOnlyErrorMessage); |
287 return 0; | 287 return nullptr; |
288 } | 288 } |
289 | 289 |
290 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this
), m_transaction.get()); | 290 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this
), m_transaction.get()); |
291 backendDB()->clear(m_transaction->id(), id(), WebIDBCallbacksImpl::create(re
quest).leakPtr()); | 291 backendDB()->clear(m_transaction->id(), id(), WebIDBCallbacksImpl::create(re
quest).leakPtr()); |
292 return request.release(); | 292 return request.release(); |
293 } | 293 } |
294 | 294 |
295 namespace { | 295 namespace { |
296 // This class creates the index keys for a given index by extracting | 296 // This class creates the index keys for a given index by extracting |
297 // them from the SerializedScriptValue, for all the existing values in | 297 // them from the SerializedScriptValue, for all the existing values in |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 options.get("multiEntry", multiEntry); | 371 options.get("multiEntry", multiEntry); |
372 | 372 |
373 return createIndex(context, name, keyPath, unique, multiEntry, exceptionStat
e); | 373 return createIndex(context, name, keyPath, unique, multiEntry, exceptionStat
e); |
374 } | 374 } |
375 | 375 |
376 PassRefPtr<IDBIndex> IDBObjectStore::createIndex(ExecutionContext* context, cons
t String& name, const IDBKeyPath& keyPath, bool unique, bool multiEntry, Excepti
onState& exceptionState) | 376 PassRefPtr<IDBIndex> IDBObjectStore::createIndex(ExecutionContext* context, cons
t String& name, const IDBKeyPath& keyPath, bool unique, bool multiEntry, Excepti
onState& exceptionState) |
377 { | 377 { |
378 IDB_TRACE("IDBObjectStore::createIndex"); | 378 IDB_TRACE("IDBObjectStore::createIndex"); |
379 if (!m_transaction->isVersionChange()) { | 379 if (!m_transaction->isVersionChange()) { |
380 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::notVers
ionChangeTransactionErrorMessage); | 380 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::notVers
ionChangeTransactionErrorMessage); |
381 return 0; | 381 return nullptr; |
382 } | 382 } |
383 if (isDeleted()) { | 383 if (isDeleted()) { |
384 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS
toreDeletedErrorMessage); | 384 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS
toreDeletedErrorMessage); |
385 return 0; | 385 return nullptr; |
386 } | 386 } |
387 if (m_transaction->isFinished()) { | 387 if (m_transaction->isFinished()) { |
388 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionFinishedErrorMessage); | 388 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionFinishedErrorMessage); |
389 return 0; | 389 return nullptr; |
390 } | 390 } |
391 if (!m_transaction->isActive()) { | 391 if (!m_transaction->isActive()) { |
392 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionInactiveErrorMessage); | 392 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionInactiveErrorMessage); |
393 return 0; | 393 return nullptr; |
394 } | 394 } |
395 if (!keyPath.isValid()) { | 395 if (!keyPath.isValid()) { |
396 exceptionState.throwDOMException(SyntaxError, "The keyPath argument cont
ains an invalid key path."); | 396 exceptionState.throwDOMException(SyntaxError, "The keyPath argument cont
ains an invalid key path."); |
397 return 0; | 397 return nullptr; |
398 } | 398 } |
399 if (name.isNull()) { | 399 if (name.isNull()) { |
400 exceptionState.throwTypeError("The name provided is null."); | 400 exceptionState.throwTypeError("The name provided is null."); |
401 return 0; | 401 return nullptr; |
402 } | 402 } |
403 if (containsIndex(name)) { | 403 if (containsIndex(name)) { |
404 exceptionState.throwDOMException(ConstraintError, "An index with the spe
cified name already exists."); | 404 exceptionState.throwDOMException(ConstraintError, "An index with the spe
cified name already exists."); |
405 return 0; | 405 return nullptr; |
406 } | 406 } |
407 | 407 |
408 if (keyPath.type() == IDBKeyPath::ArrayType && multiEntry) { | 408 if (keyPath.type() == IDBKeyPath::ArrayType && multiEntry) { |
409 exceptionState.throwDOMException(InvalidAccessError, "The keyPath argume
nt was an array and the multiEntry option is true."); | 409 exceptionState.throwDOMException(InvalidAccessError, "The keyPath argume
nt was an array and the multiEntry option is true."); |
410 return 0; | 410 return nullptr; |
411 } | 411 } |
412 | 412 |
413 int64_t indexId = m_metadata.maxIndexId + 1; | 413 int64_t indexId = m_metadata.maxIndexId + 1; |
414 backendDB()->createIndex(m_transaction->id(), id(), indexId, name, keyPath,
unique, multiEntry); | 414 backendDB()->createIndex(m_transaction->id(), id(), indexId, name, keyPath,
unique, multiEntry); |
415 | 415 |
416 ++m_metadata.maxIndexId; | 416 ++m_metadata.maxIndexId; |
417 | 417 |
418 IDBIndexMetadata metadata(name, indexId, keyPath, unique, multiEntry); | 418 IDBIndexMetadata metadata(name, indexId, keyPath, unique, multiEntry); |
419 RefPtr<IDBIndex> index = IDBIndex::create(metadata, this, m_transaction.get(
)); | 419 RefPtr<IDBIndex> index = IDBIndex::create(metadata, this, m_transaction.get(
)); |
420 m_indexMap.set(name, index); | 420 m_indexMap.set(name, index); |
421 m_metadata.indexes.set(indexId, metadata); | 421 m_metadata.indexes.set(indexId, metadata); |
422 m_transaction->db()->indexCreated(id(), metadata); | 422 m_transaction->db()->indexCreated(id(), metadata); |
423 | 423 |
424 ASSERT(!exceptionState.hadException()); | 424 ASSERT(!exceptionState.hadException()); |
425 if (exceptionState.hadException()) | 425 if (exceptionState.hadException()) |
426 return 0; | 426 return nullptr; |
427 | 427 |
428 RefPtr<IDBRequest> indexRequest = openCursor(context, static_cast<IDBKeyRang
e*>(0), blink::WebIDBCursor::Next, WebIDBDatabase::PreemptiveTask); | 428 RefPtr<IDBRequest> indexRequest = openCursor(context, static_cast<IDBKeyRang
e*>(0), blink::WebIDBCursor::Next, WebIDBDatabase::PreemptiveTask); |
429 indexRequest->preventPropagation(); | 429 indexRequest->preventPropagation(); |
430 | 430 |
431 // This is kept alive by being the success handler of the request, which is
in turn kept alive by the owning transaction. | 431 // This is kept alive by being the success handler of the request, which is
in turn kept alive by the owning transaction. |
432 RefPtr<IndexPopulator> indexPopulator = IndexPopulator::create(transaction()
->db(), m_transaction->id(), id(), metadata); | 432 RefPtr<IndexPopulator> indexPopulator = IndexPopulator::create(transaction()
->db(), m_transaction->id(), id(), metadata); |
433 indexRequest->setOnsuccess(indexPopulator); | 433 indexRequest->setOnsuccess(indexPopulator); |
434 | 434 |
435 return index.release(); | 435 return index.release(); |
436 } | 436 } |
437 | 437 |
438 PassRefPtr<IDBIndex> IDBObjectStore::index(const String& name, ExceptionState& e
xceptionState) | 438 PassRefPtr<IDBIndex> IDBObjectStore::index(const String& name, ExceptionState& e
xceptionState) |
439 { | 439 { |
440 IDB_TRACE("IDBObjectStore::index"); | 440 IDB_TRACE("IDBObjectStore::index"); |
441 if (isDeleted()) { | 441 if (isDeleted()) { |
442 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS
toreDeletedErrorMessage); | 442 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS
toreDeletedErrorMessage); |
443 return 0; | 443 return nullptr; |
444 } | 444 } |
445 if (m_transaction->isFinished()) { | 445 if (m_transaction->isFinished()) { |
446 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::transac
tionFinishedErrorMessage); | 446 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::transac
tionFinishedErrorMessage); |
447 return 0; | 447 return nullptr; |
448 } | 448 } |
449 | 449 |
450 IDBIndexMap::iterator it = m_indexMap.find(name); | 450 IDBIndexMap::iterator it = m_indexMap.find(name); |
451 if (it != m_indexMap.end()) | 451 if (it != m_indexMap.end()) |
452 return it->value; | 452 return it->value; |
453 | 453 |
454 int64_t indexId = findIndexId(name); | 454 int64_t indexId = findIndexId(name); |
455 if (indexId == IDBIndexMetadata::InvalidId) { | 455 if (indexId == IDBIndexMetadata::InvalidId) { |
456 exceptionState.throwDOMException(NotFoundError, IDBDatabase::noSuchIndex
ErrorMessage); | 456 exceptionState.throwDOMException(NotFoundError, IDBDatabase::noSuchIndex
ErrorMessage); |
457 return 0; | 457 return nullptr; |
458 } | 458 } |
459 | 459 |
460 const IDBIndexMetadata* indexMetadata(0); | 460 const IDBIndexMetadata* indexMetadata(0); |
461 for (IDBObjectStoreMetadata::IndexMap::const_iterator it = m_metadata.indexe
s.begin(); it != m_metadata.indexes.end(); ++it) { | 461 for (IDBObjectStoreMetadata::IndexMap::const_iterator it = m_metadata.indexe
s.begin(); it != m_metadata.indexes.end(); ++it) { |
462 if (it->value.name == name) { | 462 if (it->value.name == name) { |
463 indexMetadata = &it->value; | 463 indexMetadata = &it->value; |
464 break; | 464 break; |
465 } | 465 } |
466 } | 466 } |
467 ASSERT(indexMetadata); | 467 ASSERT(indexMetadata); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
506 it->value->markDeleted(); | 506 it->value->markDeleted(); |
507 m_indexMap.remove(name); | 507 m_indexMap.remove(name); |
508 } | 508 } |
509 } | 509 } |
510 | 510 |
511 PassRefPtr<IDBRequest> IDBObjectStore::openCursor(ExecutionContext* context, con
st ScriptValue& range, const String& directionString, ExceptionState& exceptionS
tate) | 511 PassRefPtr<IDBRequest> IDBObjectStore::openCursor(ExecutionContext* context, con
st ScriptValue& range, const String& directionString, ExceptionState& exceptionS
tate) |
512 { | 512 { |
513 IDB_TRACE("IDBObjectStore::openCursor"); | 513 IDB_TRACE("IDBObjectStore::openCursor"); |
514 if (isDeleted()) { | 514 if (isDeleted()) { |
515 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS
toreDeletedErrorMessage); | 515 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS
toreDeletedErrorMessage); |
516 return 0; | 516 return nullptr; |
517 } | 517 } |
518 if (m_transaction->isFinished()) { | 518 if (m_transaction->isFinished()) { |
519 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionFinishedErrorMessage); | 519 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionFinishedErrorMessage); |
520 return 0; | 520 return nullptr; |
521 } | 521 } |
522 if (!m_transaction->isActive()) { | 522 if (!m_transaction->isActive()) { |
523 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionInactiveErrorMessage); | 523 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionInactiveErrorMessage); |
524 return 0; | 524 return nullptr; |
525 } | 525 } |
526 | 526 |
527 WebIDBCursor::Direction direction = IDBCursor::stringToDirection(directionSt
ring, exceptionState); | 527 WebIDBCursor::Direction direction = IDBCursor::stringToDirection(directionSt
ring, exceptionState); |
528 if (exceptionState.hadException()) | 528 if (exceptionState.hadException()) |
529 return 0; | 529 return nullptr; |
530 | 530 |
531 RefPtr<IDBKeyRange> keyRange = IDBKeyRange::fromScriptValue(context, range,
exceptionState); | 531 RefPtr<IDBKeyRange> keyRange = IDBKeyRange::fromScriptValue(context, range,
exceptionState); |
532 if (exceptionState.hadException()) | 532 if (exceptionState.hadException()) |
533 return 0; | 533 return nullptr; |
534 | 534 |
535 return openCursor(context, keyRange, direction, WebIDBDatabase::NormalTask); | 535 return openCursor(context, keyRange, direction, WebIDBDatabase::NormalTask); |
536 } | 536 } |
537 | 537 |
538 PassRefPtr<IDBRequest> IDBObjectStore::openCursor(ExecutionContext* context, Pas
sRefPtr<IDBKeyRange> range, WebIDBCursor::Direction direction, WebIDBDatabase::T
askType taskType) | 538 PassRefPtr<IDBRequest> IDBObjectStore::openCursor(ExecutionContext* context, Pas
sRefPtr<IDBKeyRange> range, WebIDBCursor::Direction direction, WebIDBDatabase::T
askType taskType) |
539 { | 539 { |
540 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this
), m_transaction.get()); | 540 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this
), m_transaction.get()); |
541 request->setCursorDetails(IndexedDB::CursorKeyAndValue, direction); | 541 request->setCursorDetails(IndexedDB::CursorKeyAndValue, direction); |
542 | 542 |
543 backendDB()->openCursor(m_transaction->id(), id(), IDBIndexMetadata::Invalid
Id, range, direction, false, taskType, WebIDBCallbacksImpl::create(request).leak
Ptr()); | 543 backendDB()->openCursor(m_transaction->id(), id(), IDBIndexMetadata::Invalid
Id, range, direction, false, taskType, WebIDBCallbacksImpl::create(request).leak
Ptr()); |
544 return request.release(); | 544 return request.release(); |
545 } | 545 } |
546 | 546 |
547 PassRefPtr<IDBRequest> IDBObjectStore::openKeyCursor(ExecutionContext* context,
const ScriptValue& range, const String& directionString, ExceptionState& excepti
onState) | 547 PassRefPtr<IDBRequest> IDBObjectStore::openKeyCursor(ExecutionContext* context,
const ScriptValue& range, const String& directionString, ExceptionState& excepti
onState) |
548 { | 548 { |
549 IDB_TRACE("IDBObjectStore::openKeyCursor"); | 549 IDB_TRACE("IDBObjectStore::openKeyCursor"); |
550 if (isDeleted()) { | 550 if (isDeleted()) { |
551 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS
toreDeletedErrorMessage); | 551 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS
toreDeletedErrorMessage); |
552 return 0; | 552 return nullptr; |
553 } | 553 } |
554 if (m_transaction->isFinished()) { | 554 if (m_transaction->isFinished()) { |
555 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionFinishedErrorMessage); | 555 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionFinishedErrorMessage); |
556 return 0; | 556 return nullptr; |
557 } | 557 } |
558 if (!m_transaction->isActive()) { | 558 if (!m_transaction->isActive()) { |
559 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionInactiveErrorMessage); | 559 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionInactiveErrorMessage); |
560 return 0; | 560 return nullptr; |
561 } | 561 } |
562 | 562 |
563 WebIDBCursor::Direction direction = IDBCursor::stringToDirection(directionSt
ring, exceptionState); | 563 WebIDBCursor::Direction direction = IDBCursor::stringToDirection(directionSt
ring, exceptionState); |
564 if (exceptionState.hadException()) | 564 if (exceptionState.hadException()) |
565 return 0; | 565 return nullptr; |
566 | 566 |
567 RefPtr<IDBKeyRange> keyRange = IDBKeyRange::fromScriptValue(context, range,
exceptionState); | 567 RefPtr<IDBKeyRange> keyRange = IDBKeyRange::fromScriptValue(context, range,
exceptionState); |
568 if (exceptionState.hadException()) | 568 if (exceptionState.hadException()) |
569 return 0; | 569 return nullptr; |
570 | 570 |
571 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this
), m_transaction.get()); | 571 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this
), m_transaction.get()); |
572 request->setCursorDetails(IndexedDB::CursorKeyOnly, direction); | 572 request->setCursorDetails(IndexedDB::CursorKeyOnly, direction); |
573 | 573 |
574 backendDB()->openCursor(m_transaction->id(), id(), IDBIndexMetadata::Invalid
Id, keyRange.release(), direction, true, WebIDBDatabase::NormalTask, WebIDBCallb
acksImpl::create(request).leakPtr()); | 574 backendDB()->openCursor(m_transaction->id(), id(), IDBIndexMetadata::Invalid
Id, keyRange.release(), direction, true, WebIDBDatabase::NormalTask, WebIDBCallb
acksImpl::create(request).leakPtr()); |
575 return request.release(); | 575 return request.release(); |
576 } | 576 } |
577 | 577 |
578 PassRefPtr<IDBRequest> IDBObjectStore::count(ExecutionContext* context, const Sc
riptValue& range, ExceptionState& exceptionState) | 578 PassRefPtr<IDBRequest> IDBObjectStore::count(ExecutionContext* context, const Sc
riptValue& range, ExceptionState& exceptionState) |
579 { | 579 { |
580 IDB_TRACE("IDBObjectStore::count"); | 580 IDB_TRACE("IDBObjectStore::count"); |
581 if (isDeleted()) { | 581 if (isDeleted()) { |
582 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS
toreDeletedErrorMessage); | 582 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS
toreDeletedErrorMessage); |
583 return 0; | 583 return nullptr; |
584 } | 584 } |
585 if (m_transaction->isFinished()) { | 585 if (m_transaction->isFinished()) { |
586 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionFinishedErrorMessage); | 586 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionFinishedErrorMessage); |
587 return 0; | 587 return nullptr; |
588 } | 588 } |
589 if (!m_transaction->isActive()) { | 589 if (!m_transaction->isActive()) { |
590 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionInactiveErrorMessage); | 590 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::
transactionInactiveErrorMessage); |
591 return 0; | 591 return nullptr; |
592 } | 592 } |
593 | 593 |
594 RefPtr<IDBKeyRange> keyRange = IDBKeyRange::fromScriptValue(context, range,
exceptionState); | 594 RefPtr<IDBKeyRange> keyRange = IDBKeyRange::fromScriptValue(context, range,
exceptionState); |
595 if (exceptionState.hadException()) | 595 if (exceptionState.hadException()) |
596 return 0; | 596 return nullptr; |
597 | 597 |
598 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this
), m_transaction.get()); | 598 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this
), m_transaction.get()); |
599 backendDB()->count(m_transaction->id(), id(), IDBIndexMetadata::InvalidId, k
eyRange.release(), WebIDBCallbacksImpl::create(request).leakPtr()); | 599 backendDB()->count(m_transaction->id(), id(), IDBIndexMetadata::InvalidId, k
eyRange.release(), WebIDBCallbacksImpl::create(request).leakPtr()); |
600 return request.release(); | 600 return request.release(); |
601 } | 601 } |
602 | 602 |
603 void IDBObjectStore::transactionFinished() | 603 void IDBObjectStore::transactionFinished() |
604 { | 604 { |
605 ASSERT(m_transaction->isFinished()); | 605 ASSERT(m_transaction->isFinished()); |
606 | 606 |
(...skipping 11 matching lines...) Expand all Loading... |
618 } | 618 } |
619 return IDBIndexMetadata::InvalidId; | 619 return IDBIndexMetadata::InvalidId; |
620 } | 620 } |
621 | 621 |
622 WebIDBDatabase* IDBObjectStore::backendDB() const | 622 WebIDBDatabase* IDBObjectStore::backendDB() const |
623 { | 623 { |
624 return m_transaction->backendDB(); | 624 return m_transaction->backendDB(); |
625 } | 625 } |
626 | 626 |
627 } // namespace WebCore | 627 } // namespace WebCore |
OLD | NEW |