| OLD | NEW | 
|    1 /* |    1 /* | 
|    2  * Copyright (C) 2011 Google Inc. All rights reserved. |    2  * Copyright (C) 2011 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 91 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  102 } |  102 } | 
|  103  |  103  | 
|  104 IDBDatabaseBackendImpl::IDBDatabaseBackendImpl(const String& name, IDBBackingSto
     re* backingStore, IDBTransactionCoordinator* coordinator, IDBFactoryBackendImpl*
      factory, const String& uniqueIdentifier) |  104 IDBDatabaseBackendImpl::IDBDatabaseBackendImpl(const String& name, IDBBackingSto
     re* backingStore, IDBTransactionCoordinator* coordinator, IDBFactoryBackendImpl*
      factory, const String& uniqueIdentifier) | 
|  105     : m_backingStore(backingStore) |  105     : m_backingStore(backingStore) | 
|  106     , m_id(InvalidId) |  106     , m_id(InvalidId) | 
|  107     , m_name(name) |  107     , m_name(name) | 
|  108     , m_version("") |  108     , m_version("") | 
|  109     , m_identifier(uniqueIdentifier) |  109     , m_identifier(uniqueIdentifier) | 
|  110     , m_factory(factory) |  110     , m_factory(factory) | 
|  111     , m_transactionCoordinator(coordinator) |  111     , m_transactionCoordinator(coordinator) | 
 |  112     , m_pendingConnectionCount(0) | 
|  112 { |  113 { | 
|  113     ASSERT(!m_name.isNull()); |  114     ASSERT(!m_name.isNull()); | 
|  114 } |  115 } | 
|  115  |  116  | 
|  116 bool IDBDatabaseBackendImpl::openInternal() |  117 bool IDBDatabaseBackendImpl::openInternal() | 
|  117 { |  118 { | 
|  118     bool success = m_backingStore->getIDBDatabaseMetaData(m_name, m_version, m_i
     d); |  119     bool success = m_backingStore->getIDBDatabaseMetaData(m_name, m_version, m_i
     d); | 
|  119     ASSERT(success == (m_id != InvalidId)); |  120     ASSERT(success == (m_id != InvalidId)); | 
|  120     if (success) { |  121     if (success) { | 
|  121         loadObjectStores(); |  122         loadObjectStores(); | 
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  215         callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::IDB_AB
     ORT_ERR, "Connection was closed before set version transaction was created")); |  216         callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::IDB_AB
     ORT_ERR, "Connection was closed before set version transaction was created")); | 
|  216         return; |  217         return; | 
|  217     } |  218     } | 
|  218     for (DatabaseCallbacksSet::const_iterator it = m_databaseCallbacksSet.begin(
     ); it != m_databaseCallbacksSet.end(); ++it) { |  219     for (DatabaseCallbacksSet::const_iterator it = m_databaseCallbacksSet.begin(
     ); it != m_databaseCallbacksSet.end(); ++it) { | 
|  219         if (*it != databaseCallbacks) |  220         if (*it != databaseCallbacks) | 
|  220             (*it)->onVersionChange(version); |  221             (*it)->onVersionChange(version); | 
|  221     } |  222     } | 
|  222     // FIXME: Only fire onBlocked if there are open connections after the |  223     // FIXME: Only fire onBlocked if there are open connections after the | 
|  223     // VersionChangeEvents are received, not just set up to fire. |  224     // VersionChangeEvents are received, not just set up to fire. | 
|  224     // https://bugs.webkit.org/show_bug.cgi?id=71130 |  225     // https://bugs.webkit.org/show_bug.cgi?id=71130 | 
|  225     if (m_databaseCallbacksSet.size() > 1) { |  226     if (connectionCount() > 1) { | 
|  226         callbacks->onBlocked(); |  227         callbacks->onBlocked(); | 
|  227         RefPtr<PendingSetVersionCall> pendingSetVersionCall = PendingSetVersionC
     all::create(version, callbacks, databaseCallbacks); |  228         RefPtr<PendingSetVersionCall> pendingSetVersionCall = PendingSetVersionC
     all::create(version, callbacks, databaseCallbacks); | 
|  228         m_pendingSetVersionCalls.append(pendingSetVersionCall); |  229         m_pendingSetVersionCalls.append(pendingSetVersionCall); | 
|  229         return; |  230         return; | 
|  230     } |  231     } | 
|  231     if (m_runningVersionChangeTransaction) { |  232     if (m_runningVersionChangeTransaction) { | 
|  232         RefPtr<PendingSetVersionCall> pendingSetVersionCall = PendingSetVersionC
     all::create(version, callbacks, databaseCallbacks); |  233         RefPtr<PendingSetVersionCall> pendingSetVersionCall = PendingSetVersionC
     all::create(version, callbacks, databaseCallbacks); | 
|  233         m_pendingSetVersionCalls.append(pendingSetVersionCall); |  234         m_pendingSetVersionCalls.append(pendingSetVersionCall); | 
|  234         return; |  235         return; | 
|  235     } |  236     } | 
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  271     RefPtr<IDBTransactionBackendInterface> transaction = prpTransaction; |  272     RefPtr<IDBTransactionBackendInterface> transaction = prpTransaction; | 
|  272     ASSERT(m_transactions.contains(transaction.get())); |  273     ASSERT(m_transactions.contains(transaction.get())); | 
|  273     m_transactions.remove(transaction.get()); |  274     m_transactions.remove(transaction.get()); | 
|  274     if (transaction->mode() == IDBTransaction::VERSION_CHANGE) { |  275     if (transaction->mode() == IDBTransaction::VERSION_CHANGE) { | 
|  275         ASSERT(transaction.get() == m_runningVersionChangeTransaction.get()); |  276         ASSERT(transaction.get() == m_runningVersionChangeTransaction.get()); | 
|  276         m_runningVersionChangeTransaction.clear(); |  277         m_runningVersionChangeTransaction.clear(); | 
|  277         processPendingCalls(); |  278         processPendingCalls(); | 
|  278     } |  279     } | 
|  279 } |  280 } | 
|  280  |  281  | 
 |  282 int32_t IDBDatabaseBackendImpl::connectionCount() | 
 |  283 { | 
 |  284     return m_databaseCallbacksSet.size() + m_pendingConnectionCount; | 
 |  285 } | 
 |  286  | 
|  281 void IDBDatabaseBackendImpl::processPendingCalls() |  287 void IDBDatabaseBackendImpl::processPendingCalls() | 
|  282 { |  288 { | 
|  283     ASSERT(m_databaseCallbacksSet.size() <= 1); |  289     ASSERT(connectionCount() <= 1); | 
|  284  |  290  | 
|  285     // Pending calls may be requeued or aborted |  291     // Pending calls may be requeued or aborted | 
|  286     Deque<RefPtr<PendingSetVersionCall> > pendingSetVersionCalls; |  292     Deque<RefPtr<PendingSetVersionCall> > pendingSetVersionCalls; | 
|  287     m_pendingSetVersionCalls.swap(pendingSetVersionCalls); |  293     m_pendingSetVersionCalls.swap(pendingSetVersionCalls); | 
|  288     while (!pendingSetVersionCalls.isEmpty()) { |  294     while (!pendingSetVersionCalls.isEmpty()) { | 
|  289         ExceptionCode ec = 0; |  295         ExceptionCode ec = 0; | 
|  290         RefPtr<PendingSetVersionCall> pendingSetVersionCall = pendingSetVersionC
     alls.takeFirst(); |  296         RefPtr<PendingSetVersionCall> pendingSetVersionCall = pendingSetVersionC
     alls.takeFirst(); | 
|  291         setVersion(pendingSetVersionCall->version(), pendingSetVersionCall->call
     backs(), pendingSetVersionCall->databaseCallbacks(), ec); |  297         setVersion(pendingSetVersionCall->version(), pendingSetVersionCall->call
     backs(), pendingSetVersionCall->databaseCallbacks(), ec); | 
|  292         ASSERT(!ec); |  298         ASSERT(!ec); | 
|  293     } |  299     } | 
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  338         } |  344         } | 
|  339     } |  345     } | 
|  340  |  346  | 
|  341     RefPtr<IDBTransactionBackendInterface> transaction = IDBTransactionBackendIm
     pl::create(objectStoreNames, mode, this); |  347     RefPtr<IDBTransactionBackendInterface> transaction = IDBTransactionBackendIm
     pl::create(objectStoreNames, mode, this); | 
|  342     m_transactions.add(transaction.get()); |  348     m_transactions.add(transaction.get()); | 
|  343     return transaction.release(); |  349     return transaction.release(); | 
|  344 } |  350 } | 
|  345  |  351  | 
|  346 void IDBDatabaseBackendImpl::registerFrontendCallbacks(PassRefPtr<IDBDatabaseCal
     lbacks> callbacks) |  352 void IDBDatabaseBackendImpl::registerFrontendCallbacks(PassRefPtr<IDBDatabaseCal
     lbacks> callbacks) | 
|  347 { |  353 { | 
 |  354     ASSERT(m_backingStore.get()); | 
 |  355     ASSERT(m_pendingConnectionCount); | 
 |  356     --m_pendingConnectionCount; | 
|  348     m_databaseCallbacksSet.add(RefPtr<IDBDatabaseCallbacks>(callbacks)); |  357     m_databaseCallbacksSet.add(RefPtr<IDBDatabaseCallbacks>(callbacks)); | 
|  349 } |  358 } | 
|  350  |  359  | 
|  351 void IDBDatabaseBackendImpl::openConnection(PassRefPtr<IDBCallbacks> callbacks) |  360 void IDBDatabaseBackendImpl::openConnection(PassRefPtr<IDBCallbacks> callbacks) | 
|  352 { |  361 { | 
 |  362     ASSERT(m_backingStore.get()); | 
|  353     if (!m_pendingDeleteCalls.isEmpty() || m_runningVersionChangeTransaction || 
     !m_pendingSetVersionCalls.isEmpty()) |  363     if (!m_pendingDeleteCalls.isEmpty() || m_runningVersionChangeTransaction || 
     !m_pendingSetVersionCalls.isEmpty()) | 
|  354         m_pendingOpenCalls.append(PendingOpenCall::create(callbacks)); |  364         m_pendingOpenCalls.append(PendingOpenCall::create(callbacks)); | 
|  355     else { |  365     else { | 
|  356         if (m_id == InvalidId && !openInternal()) |  366         if (m_id == InvalidId && !openInternal()) | 
|  357             callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UN
     KNOWN_ERR, "Internal error.")); |  367             callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UN
     KNOWN_ERR, "Internal error.")); | 
|  358         else |  368         else { | 
 |  369             ++m_pendingConnectionCount; | 
|  359             callbacks->onSuccess(this); |  370             callbacks->onSuccess(this); | 
 |  371         } | 
|  360     } |  372     } | 
|  361 } |  373 } | 
|  362  |  374  | 
|  363 void IDBDatabaseBackendImpl::deleteDatabase(PassRefPtr<IDBCallbacks> prpCallback
     s) |  375 void IDBDatabaseBackendImpl::deleteDatabase(PassRefPtr<IDBCallbacks> prpCallback
     s) | 
|  364 { |  376 { | 
|  365     if (m_runningVersionChangeTransaction || !m_pendingSetVersionCalls.isEmpty()
     ) { |  377     if (m_runningVersionChangeTransaction || !m_pendingSetVersionCalls.isEmpty()
     ) { | 
|  366         m_pendingDeleteCalls.append(PendingDeleteCall::create(prpCallbacks)); |  378         m_pendingDeleteCalls.append(PendingDeleteCall::create(prpCallbacks)); | 
|  367         return; |  379         return; | 
|  368     } |  380     } | 
|  369     RefPtr<IDBCallbacks> callbacks = prpCallbacks; |  381     RefPtr<IDBCallbacks> callbacks = prpCallbacks; | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
|  388     m_id = InvalidId; |  400     m_id = InvalidId; | 
|  389     m_objectStores.clear(); |  401     m_objectStores.clear(); | 
|  390     callbacks->onSuccess(SerializedScriptValue::nullValue()); |  402     callbacks->onSuccess(SerializedScriptValue::nullValue()); | 
|  391 } |  403 } | 
|  392  |  404  | 
|  393 void IDBDatabaseBackendImpl::close(PassRefPtr<IDBDatabaseCallbacks> prpCallbacks
     ) |  405 void IDBDatabaseBackendImpl::close(PassRefPtr<IDBDatabaseCallbacks> prpCallbacks
     ) | 
|  394 { |  406 { | 
|  395     RefPtr<IDBDatabaseCallbacks> callbacks = prpCallbacks; |  407     RefPtr<IDBDatabaseCallbacks> callbacks = prpCallbacks; | 
|  396     ASSERT(m_databaseCallbacksSet.contains(callbacks)); |  408     ASSERT(m_databaseCallbacksSet.contains(callbacks)); | 
|  397     m_databaseCallbacksSet.remove(callbacks); |  409     m_databaseCallbacksSet.remove(callbacks); | 
|  398     if (m_databaseCallbacksSet.size() > 1) |  410     if (connectionCount() > 1) | 
|  399         return; |  411         return; | 
|  400  |  412  | 
|  401     processPendingCalls(); |  413     processPendingCalls(); | 
|  402  |  414  | 
|  403     if (!m_databaseCallbacksSet.size()) { |  415     if (!connectionCount()) { | 
|  404         TransactionSet transactions(m_transactions); |  416         TransactionSet transactions(m_transactions); | 
|  405         for (TransactionSet::const_iterator it = transactions.begin(); it != tra
     nsactions.end(); ++it) |  417         for (TransactionSet::const_iterator it = transactions.begin(); it != tra
     nsactions.end(); ++it) | 
|  406             (*it)->abort(); |  418             (*it)->abort(); | 
|  407         ASSERT(m_transactions.isEmpty()); |  419         ASSERT(m_transactions.isEmpty()); | 
|  408  |  420  | 
|  409         m_backingStore.clear(); |  421         m_backingStore.clear(); | 
|  410         // This check should only be false in tests. |  422         // This check should only be false in tests. | 
|  411         if (m_factory) |  423         if (m_factory) | 
|  412             m_factory->removeIDBDatabaseBackend(m_identifier); |  424             m_factory->removeIDBDatabaseBackend(m_identifier); | 
|  413     } |  425     } | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  445  |  457  | 
|  446 void IDBDatabaseBackendImpl::resetVersion(ScriptExecutionContext*, PassRefPtr<ID
     BDatabaseBackendImpl> database, const String& version) |  458 void IDBDatabaseBackendImpl::resetVersion(ScriptExecutionContext*, PassRefPtr<ID
     BDatabaseBackendImpl> database, const String& version) | 
|  447 { |  459 { | 
|  448     database->m_version = version; |  460     database->m_version = version; | 
|  449 } |  461 } | 
|  450  |  462  | 
|  451  |  463  | 
|  452 } // namespace WebCore |  464 } // namespace WebCore | 
|  453  |  465  | 
|  454 #endif // ENABLE(INDEXED_DATABASE) |  466 #endif // ENABLE(INDEXED_DATABASE) | 
| OLD | NEW |