1/* 2 * Copyright (C) 2013 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef IDBTransactionBackendOperations_h 27#define IDBTransactionBackendOperations_h 28 29#include "IDBDatabaseBackend.h" 30#include "IDBOperation.h" 31#include "IDBTransactionBackend.h" 32 33#if ENABLE(INDEXED_DATABASE) 34 35namespace WebCore { 36 37class IDBServerConnection; 38 39class CreateObjectStoreOperation : public IDBOperation { 40public: 41 static PassRefPtr<IDBOperation> create(IDBTransactionBackend* transaction, const IDBObjectStoreMetadata& objectStoreMetadata) 42 { 43 return adoptRef(new CreateObjectStoreOperation(transaction, objectStoreMetadata)); 44 } 45 virtual void perform(std::function<void()> successCallback) override final; 46 47 const IDBObjectStoreMetadata& objectStoreMetadata() const { return m_objectStoreMetadata; } 48 49private: 50 CreateObjectStoreOperation(IDBTransactionBackend* transaction, const IDBObjectStoreMetadata& objectStoreMetadata) 51 : m_transaction(transaction) 52 , m_objectStoreMetadata(objectStoreMetadata) 53 { 54 } 55 56 RefPtr<IDBTransactionBackend> m_transaction; 57 const IDBObjectStoreMetadata m_objectStoreMetadata; 58}; 59 60class DeleteObjectStoreOperation : public IDBOperation { 61public: 62 static PassRefPtr<IDBOperation> create(IDBTransactionBackend* transaction, const IDBObjectStoreMetadata& objectStoreMetadata) 63 { 64 return adoptRef(new DeleteObjectStoreOperation(transaction, objectStoreMetadata)); 65 } 66 virtual void perform(std::function<void()> successCallback) override final; 67 68 IDBTransactionBackend* transaction() const { return m_transaction.get(); } 69 const IDBObjectStoreMetadata& objectStoreMetadata() const { return m_objectStoreMetadata; } 70 71private: 72 DeleteObjectStoreOperation(IDBTransactionBackend* transaction, const IDBObjectStoreMetadata& objectStoreMetadata) 73 : m_transaction(transaction) 74 , m_objectStoreMetadata(objectStoreMetadata) 75 { 76 } 77 78 RefPtr<IDBTransactionBackend> m_transaction; 79 const IDBObjectStoreMetadata m_objectStoreMetadata; 80}; 81 82class IDBDatabaseBackend::VersionChangeOperation : public IDBOperation { 83public: 84 static PassRefPtr<IDBOperation> create(IDBTransactionBackend* transaction, int64_t version, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBDatabaseCallbacks> databaseCallbacks) 85 { 86 return adoptRef(new VersionChangeOperation(transaction, version, callbacks, databaseCallbacks)); 87 } 88 virtual void perform(std::function<void()> successCallback) override final; 89 90 IDBTransactionBackend* transaction() const { return m_transaction.get(); } 91 int64_t version() const { return m_version; } 92 IDBDatabaseCallbacks* databaseCallbacks() const { return m_databaseCallbacks.get(); } 93 94private: 95 VersionChangeOperation(IDBTransactionBackend* transaction, int64_t version, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBDatabaseCallbacks> databaseCallbacks) 96 : m_transaction(transaction) 97 , m_version(version) 98 , m_callbacks(callbacks) 99 , m_databaseCallbacks(databaseCallbacks) 100 { 101 } 102 103 RefPtr<IDBTransactionBackend> m_transaction; 104 int64_t m_version; 105 RefPtr<IDBCallbacks> m_callbacks; 106 RefPtr<IDBDatabaseCallbacks> m_databaseCallbacks; 107}; 108 109class CreateObjectStoreAbortOperation : public IDBSynchronousOperation { 110public: 111 static PassRefPtr<IDBSynchronousOperation> create(IDBTransactionBackend* transaction, int64_t objectStoreId) 112 { 113 return adoptRef(new CreateObjectStoreAbortOperation(transaction, objectStoreId)); 114 } 115 virtual void perform() override final; 116private: 117 CreateObjectStoreAbortOperation(IDBTransactionBackend* transaction, int64_t objectStoreId) 118 : m_transaction(transaction) 119 , m_objectStoreID(objectStoreId) 120 { 121 } 122 123 RefPtr<IDBTransactionBackend> m_transaction; 124 const int64_t m_objectStoreID; 125}; 126 127class DeleteObjectStoreAbortOperation : public IDBSynchronousOperation { 128public: 129 static PassRefPtr<IDBSynchronousOperation> create(IDBTransactionBackend* transaction, const IDBObjectStoreMetadata& objectStore) 130 { 131 return adoptRef(new DeleteObjectStoreAbortOperation(transaction, objectStore)); 132 } 133 virtual void perform() override final; 134private: 135 DeleteObjectStoreAbortOperation(IDBTransactionBackend* transaction, const IDBObjectStoreMetadata& objectStoreMetadata) 136 : m_transaction(transaction) 137 , m_objectStoreMetadata(objectStoreMetadata) 138 { 139 } 140 141 RefPtr<IDBTransactionBackend> m_transaction; 142 IDBObjectStoreMetadata m_objectStoreMetadata; 143}; 144 145class IDBDatabaseBackend::VersionChangeAbortOperation : public IDBSynchronousOperation { 146public: 147 static PassRefPtr<IDBSynchronousOperation> create(IDBTransactionBackend* transaction, const String& previousVersion, int64_t previousIntVersion) 148 { 149 return adoptRef(new VersionChangeAbortOperation(transaction, previousVersion, previousIntVersion)); 150 } 151 virtual void perform() override final; 152private: 153 VersionChangeAbortOperation(IDBTransactionBackend* transaction, const String& previousVersion, int64_t previousIntVersion) 154 : m_transaction(transaction) 155 , m_previousVersion(previousVersion) 156 , m_previousIntVersion(previousIntVersion) 157 { 158 } 159 160 RefPtr<IDBTransactionBackend> m_transaction; 161 String m_previousVersion; 162 int64_t m_previousIntVersion; 163}; 164 165class CreateIndexOperation : public IDBOperation { 166public: 167 static PassRefPtr<IDBOperation> create(IDBTransactionBackend* transaction, int64_t objectStoreId, const IDBIndexMetadata& indexMetadata) 168 { 169 return adoptRef(new CreateIndexOperation(transaction, objectStoreId, indexMetadata)); 170 } 171 virtual void perform(std::function<void()> successCallback) override final; 172 173 int64_t objectStoreID() const { return m_objectStoreID; } 174 const IDBIndexMetadata& idbIndexMetadata() const { return m_indexMetadata; } 175 176private: 177 CreateIndexOperation(IDBTransactionBackend* transaction, int64_t objectStoreId, const IDBIndexMetadata& indexMetadata) 178 : m_transaction(transaction) 179 , m_objectStoreID(objectStoreId) 180 , m_indexMetadata(indexMetadata) 181 { 182 } 183 184 RefPtr<IDBTransactionBackend> m_transaction; 185 const int64_t m_objectStoreID; 186 const IDBIndexMetadata m_indexMetadata; 187}; 188 189class CreateIndexAbortOperation : public IDBSynchronousOperation { 190public: 191 static PassRefPtr<IDBSynchronousOperation> create(IDBTransactionBackend* transaction, int64_t objectStoreId, int64_t indexId) 192 { 193 return adoptRef(new CreateIndexAbortOperation(transaction, objectStoreId, indexId)); 194 } 195 virtual void perform() override final; 196private: 197 CreateIndexAbortOperation(IDBTransactionBackend* transaction, int64_t objectStoreId, int64_t indexId) 198 : m_transaction(transaction) 199 , m_objectStoreID(objectStoreId) 200 , m_indexID(indexId) 201 { 202 } 203 204 const RefPtr<IDBTransactionBackend> m_transaction; 205 const int64_t m_objectStoreID; 206 const int64_t m_indexID; 207}; 208 209class DeleteIndexOperation : public IDBOperation { 210public: 211 static PassRefPtr<IDBOperation> create(IDBTransactionBackend* transaction, int64_t objectStoreId, const IDBIndexMetadata& indexMetadata) 212 { 213 return adoptRef(new DeleteIndexOperation(transaction, objectStoreId, indexMetadata)); 214 } 215 virtual void perform(std::function<void()> successCallback) override final; 216 217 int64_t objectStoreID() const { return m_objectStoreID; } 218 const IDBIndexMetadata& idbIndexMetadata() const { return m_indexMetadata; } 219 220private: 221 DeleteIndexOperation(IDBTransactionBackend* transaction, int64_t objectStoreId, const IDBIndexMetadata& indexMetadata) 222 : m_transaction(transaction) 223 , m_objectStoreID(objectStoreId) 224 , m_indexMetadata(indexMetadata) 225 { 226 } 227 228 RefPtr<IDBTransactionBackend> m_transaction; 229 const int64_t m_objectStoreID; 230 const IDBIndexMetadata m_indexMetadata; 231}; 232 233class DeleteIndexAbortOperation : public IDBSynchronousOperation { 234public: 235 static PassRefPtr<IDBSynchronousOperation> create(IDBTransactionBackend* transaction, int64_t objectStoreId, const IDBIndexMetadata& indexMetadata) 236 { 237 return adoptRef(new DeleteIndexAbortOperation(transaction, objectStoreId, indexMetadata)); 238 } 239 virtual void perform() override final; 240private: 241 DeleteIndexAbortOperation(IDBTransactionBackend* transaction, int64_t objectStoreId, const IDBIndexMetadata& indexMetadata) 242 : m_transaction(transaction) 243 , m_objectStoreID(objectStoreId) 244 , m_indexMetadata(indexMetadata) 245 { 246 } 247 248 RefPtr<IDBTransactionBackend> m_transaction; 249 const int64_t m_objectStoreID; 250 const IDBIndexMetadata m_indexMetadata; 251}; 252 253class GetOperation : public IDBOperation { 254public: 255 static PassRefPtr<IDBOperation> create(IDBTransactionBackend* transaction, const IDBDatabaseMetadata& metadata, int64_t objectStoreId, int64_t indexId, PassRefPtr<IDBKeyRange> keyRange, IndexedDB::CursorType cursorType, PassRefPtr<IDBCallbacks> callbacks) 256 { 257 return adoptRef(new GetOperation(transaction, metadata, objectStoreId, indexId, keyRange, cursorType, callbacks)); 258 } 259 virtual void perform(std::function<void()> successCallback) override final; 260 261 int64_t objectStoreID() const { return m_objectStoreID; } 262 int64_t indexID() const { return m_indexID; } 263 IndexedDB::CursorType cursorType() const { return m_cursorType; } 264 IDBKeyRange* keyRange() const { return m_keyRange.get(); } 265 bool autoIncrement() const { return m_autoIncrement; } 266 IDBKeyPath keyPath() const { return m_keyPath; } 267 268private: 269 GetOperation(IDBTransactionBackend* transaction, const IDBDatabaseMetadata& metadata, int64_t objectStoreId, int64_t indexId, PassRefPtr<IDBKeyRange> keyRange, IndexedDB::CursorType cursorType, PassRefPtr<IDBCallbacks> callbacks) 270 : m_transaction(transaction) 271 , m_objectStoreID(objectStoreId) 272 , m_indexID(indexId) 273 , m_keyPath(metadata.objectStores.get(objectStoreId).keyPath) 274 , m_autoIncrement(metadata.objectStores.get(objectStoreId).autoIncrement) 275 , m_keyRange(keyRange) 276 , m_cursorType(cursorType) 277 , m_callbacks(callbacks) 278 { 279 ASSERT(metadata.objectStores.contains(objectStoreId)); 280 ASSERT(metadata.objectStores.get(objectStoreId).id == objectStoreId); 281 } 282 283 RefPtr<IDBTransactionBackend> m_transaction; 284 const int64_t m_objectStoreID; 285 const int64_t m_indexID; 286 const IDBKeyPath m_keyPath; 287 const bool m_autoIncrement; 288 const RefPtr<IDBKeyRange> m_keyRange; 289 const IndexedDB::CursorType m_cursorType; 290 const RefPtr<IDBCallbacks> m_callbacks; 291}; 292 293class PutOperation : public IDBOperation { 294public: 295 static PassRefPtr<IDBOperation> create(IDBTransactionBackend* transaction, const IDBObjectStoreMetadata& objectStore, PassRefPtr<SharedBuffer> value, PassRefPtr<IDBKey> key, IDBDatabaseBackend::PutMode putMode, PassRefPtr<IDBCallbacks> callbacks, const Vector<int64_t>& indexIds, const Vector<IndexKeys>& indexKeys) 296 { 297 return adoptRef(new PutOperation(transaction, objectStore, value, key, putMode, callbacks, indexIds, indexKeys)); 298 } 299 virtual void perform(std::function<void()> successCallback) override final; 300 301 IDBDatabaseBackend::PutMode putMode() const { return m_putMode; } 302 const IDBObjectStoreMetadata& objectStore() const { return m_objectStore; } 303 IDBKey* key() const { return m_key.get(); } 304 const Vector<int64_t>& indexIDs() const { return m_indexIDs; } 305 const Vector<IndexKeys>& indexKeys() const { return m_indexKeys; } 306 SharedBuffer* value() const { return m_value.get(); } 307 308private: 309 PutOperation(IDBTransactionBackend* transaction, const IDBObjectStoreMetadata& objectStore, PassRefPtr<SharedBuffer>& value, PassRefPtr<IDBKey> key, IDBDatabaseBackend::PutMode putMode, PassRefPtr<IDBCallbacks> callbacks, const Vector<int64_t>& indexIds, const Vector<IndexKeys>& indexKeys) 310 : m_transaction(transaction) 311 , m_objectStore(objectStore) 312 , m_value(value) 313 , m_key(key) 314 , m_putMode(putMode) 315 , m_callbacks(callbacks) 316 , m_indexIDs(indexIds) 317 , m_indexKeys(indexKeys) 318 { 319 } 320 321 RefPtr<IDBTransactionBackend> m_transaction; 322 const IDBObjectStoreMetadata m_objectStore; 323 const RefPtr<SharedBuffer> m_value; 324 const RefPtr<IDBKey> m_key; 325 const IDBDatabaseBackend::PutMode m_putMode; 326 const RefPtr<IDBCallbacks> m_callbacks; 327 const Vector<int64_t> m_indexIDs; 328 const Vector<IndexKeys> m_indexKeys; 329}; 330 331class SetIndexesReadyOperation : public IDBOperation { 332public: 333 static PassRefPtr<IDBOperation> create(IDBTransactionBackend* transaction, size_t indexCount) 334 { 335 return adoptRef(new SetIndexesReadyOperation(transaction, indexCount)); 336 } 337 virtual void perform(std::function<void()> successCallback) override final; 338private: 339 SetIndexesReadyOperation(IDBTransactionBackend* transaction, size_t indexCount) 340 : m_transaction(transaction) 341 , m_indexCount(indexCount) 342 { 343 } 344 345 RefPtr<IDBTransactionBackend> m_transaction; 346 const size_t m_indexCount; 347}; 348 349class OpenCursorOperation : public IDBOperation { 350public: 351 static PassRefPtr<IDBOperation> create(IDBTransactionBackend* transaction, int64_t objectStoreId, int64_t indexId, PassRefPtr<IDBKeyRange> keyRange, IndexedDB::CursorDirection direction, IndexedDB::CursorType cursorType, IDBDatabaseBackend::TaskType taskType, PassRefPtr<IDBCallbacks> callbacks) 352 { 353 return adoptRef(new OpenCursorOperation(transaction, objectStoreId, indexId, keyRange, direction, cursorType, taskType, callbacks)); 354 } 355 virtual void perform(std::function<void()> successCallback) override final; 356 357 int64_t transactionID() const { return m_transaction->id(); } 358 int64_t objectStoreID() const { return m_objectStoreID; } 359 int64_t indexID() const { return m_indexID; } 360 IndexedDB::CursorDirection direction() const { return m_direction; } 361 IndexedDB::CursorType cursorType() const { return m_cursorType; } 362 IDBDatabaseBackend::TaskType taskType() const { return m_taskType; } 363 IDBKeyRange* keyRange() const { return m_keyRange.get(); } 364 IndexedDB::CursorDirection cursorDirection() const { return m_direction; } 365 366private: 367 OpenCursorOperation(IDBTransactionBackend* transaction, int64_t objectStoreId, int64_t indexId, PassRefPtr<IDBKeyRange> keyRange, IndexedDB::CursorDirection direction, IndexedDB::CursorType cursorType, IDBDatabaseBackend::TaskType taskType, PassRefPtr<IDBCallbacks> callbacks) 368 : m_transaction(transaction) 369 , m_objectStoreID(objectStoreId) 370 , m_indexID(indexId) 371 , m_keyRange(keyRange) 372 , m_direction(direction) 373 , m_cursorType(cursorType) 374 , m_taskType(taskType) 375 , m_callbacks(callbacks) 376 { 377 } 378 379 RefPtr<IDBTransactionBackend> m_transaction; 380 const int64_t m_objectStoreID; 381 const int64_t m_indexID; 382 const PassRefPtr<IDBKeyRange> m_keyRange; 383 const IndexedDB::CursorDirection m_direction; 384 const IndexedDB::CursorType m_cursorType; 385 const IDBDatabaseBackend::TaskType m_taskType; 386 const RefPtr<IDBCallbacks> m_callbacks; 387}; 388 389class CountOperation : public IDBOperation { 390public: 391 static PassRefPtr<IDBOperation> create(IDBTransactionBackend* transaction, int64_t objectStoreId, int64_t indexId, PassRefPtr<IDBKeyRange> keyRange, PassRefPtr<IDBCallbacks> callbacks) 392 { 393 return adoptRef(new CountOperation(transaction, objectStoreId, indexId, keyRange, callbacks)); 394 } 395 virtual void perform(std::function<void()> successCallback) override final; 396 397 int64_t objectStoreID() const { return m_objectStoreID; } 398 int64_t indexID() const { return m_indexID; } 399 IDBKeyRange* keyRange() const { return m_keyRange.get(); } 400 401private: 402 CountOperation(IDBTransactionBackend* transaction, int64_t objectStoreId, int64_t indexId, PassRefPtr<IDBKeyRange> keyRange, PassRefPtr<IDBCallbacks> callbacks) 403 : m_transaction(transaction) 404 , m_objectStoreID(objectStoreId) 405 , m_indexID(indexId) 406 , m_keyRange(keyRange) 407 , m_callbacks(callbacks) 408 { 409 } 410 411 RefPtr<IDBTransactionBackend> m_transaction; 412 const int64_t m_objectStoreID; 413 const int64_t m_indexID; 414 const RefPtr<IDBKeyRange> m_keyRange; 415 const RefPtr<IDBCallbacks> m_callbacks; 416}; 417 418class DeleteRangeOperation : public IDBOperation { 419public: 420 static PassRefPtr<IDBOperation> create(IDBTransactionBackend* transaction, int64_t objectStoreId, PassRefPtr<IDBKeyRange> keyRange, PassRefPtr<IDBCallbacks> callbacks) 421 { 422 return adoptRef(new DeleteRangeOperation(transaction, objectStoreId, keyRange, callbacks)); 423 } 424 virtual void perform(std::function<void()> successCallback) override final; 425 426 int64_t objectStoreID() const { return m_objectStoreID; } 427 IDBKeyRange* keyRange() const { return m_keyRange.get(); } 428 429private: 430 DeleteRangeOperation(IDBTransactionBackend* transaction, int64_t objectStoreId, PassRefPtr<IDBKeyRange> keyRange, PassRefPtr<IDBCallbacks> callbacks) 431 : m_transaction(transaction) 432 , m_objectStoreID(objectStoreId) 433 , m_keyRange(keyRange) 434 , m_callbacks(callbacks) 435 { 436 } 437 438 RefPtr<IDBTransactionBackend> m_transaction; 439 const int64_t m_objectStoreID; 440 const RefPtr<IDBKeyRange> m_keyRange; 441 const RefPtr<IDBCallbacks> m_callbacks; 442}; 443 444class ClearObjectStoreOperation : public IDBOperation { 445public: 446 static PassRefPtr<IDBOperation> create(IDBTransactionBackend* transaction, int64_t objectStoreId, PassRefPtr<IDBCallbacks> callbacks) 447 { 448 return adoptRef(new ClearObjectStoreOperation(transaction, objectStoreId, callbacks)); 449 } 450 virtual void perform(std::function<void()> successCallback) override final; 451 452 IDBTransactionBackend* transaction() const { return m_transaction.get(); } 453 int64_t objectStoreID() const { return m_objectStoreID; } 454 455private: 456 ClearObjectStoreOperation(IDBTransactionBackend* transaction, int64_t objectStoreId, PassRefPtr<IDBCallbacks> callbacks) 457 : m_transaction(transaction) 458 , m_objectStoreID(objectStoreId) 459 , m_callbacks(callbacks) 460 { 461 } 462 463 RefPtr<IDBTransactionBackend> m_transaction; 464 const int64_t m_objectStoreID; 465 const RefPtr<IDBCallbacks> m_callbacks; 466}; 467 468} // namespace WebCore 469 470#endif // ENABLE(INDEXED_DATABASE) 471#endif // IDBTransactionBackendOperations_h 472