Esempio n. 1
0
nsresult
IDBTransaction::CommitOrRollback()
{
    NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");

    if (!IndexedDatabaseManager::IsMainProcess()) {
        NS_ASSERTION(mActorChild, "Must have an actor!");

        mActorChild->SendAllRequestsFinished();

        return NS_OK;
    }

    nsRefPtr<CommitHelper> helper =
        new CommitHelper(this, mListener, mCreatedObjectStores);

    TransactionThreadPool* pool = TransactionThreadPool::GetOrCreate();
    NS_ENSURE_STATE(pool);

    mCachedStatements.Enumerate(DoomCachedStatements, helper);
    NS_ASSERTION(!mCachedStatements.Count(), "Statements left!");

    nsresult rv = pool->Dispatch(this, helper, true, helper);
    NS_ENSURE_SUCCESS(rv, rv);

    return NS_OK;
}
NS_IMETHODIMP
TransactionPoolEventTarget::Dispatch(nsIRunnable* aRunnable,
                                     PRUint32 aFlags)
{
  NS_ASSERTION(aRunnable, "Null pointer!");
  NS_ASSERTION(aFlags == NS_DISPATCH_NORMAL, "Unsupported!");

  TransactionThreadPool* pool = TransactionThreadPool::GetOrCreate();
  return pool->Dispatch(mTransaction, aRunnable, false, nsnull);
}
NS_IMETHODIMP
TransactionPoolEventTarget::Dispatch(nsIRunnable* aRunnable,
                                     uint32_t aFlags)
{
  NS_ASSERTION(aRunnable, "Null pointer!");
  NS_ASSERTION(aFlags == NS_DISPATCH_NORMAL, "Unsupported!");

  TransactionThreadPool* pool = TransactionThreadPool::GetOrCreate();
  NS_ENSURE_TRUE(pool, NS_ERROR_UNEXPECTED);

  nsresult rv = pool->Dispatch(mTransaction, aRunnable, false, nullptr);
  NS_ENSURE_SUCCESS(rv, rv);

  return NS_OK;
}
Esempio n. 4
0
// static
already_AddRefed<IDBTransaction>
IDBTransaction::Create(IDBDatabase* aDatabase,
                       nsTArray<nsString>& aObjectStoreNames,
                       Mode aMode,
                       bool aDispatchDelayed)
{
  NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");

  nsRefPtr<IDBTransaction> transaction = new IDBTransaction();

  transaction->BindToOwner(aDatabase);
  if (!transaction->SetScriptOwner(aDatabase->GetScriptOwner())) {
    return nsnull;
  }

  transaction->mDatabase = aDatabase;
  transaction->mMode = aMode;
  
  transaction->mDatabaseInfo = aDatabase->Info();

  if (!transaction->mObjectStoreNames.AppendElements(aObjectStoreNames)) {
    NS_ERROR("Out of memory!");
    return nsnull;
  }

  if (!transaction->mCachedStatements.Init()) {
    NS_ERROR("Failed to initialize hash!");
    return nsnull;
  }

  if (!aDispatchDelayed) {
    nsCOMPtr<nsIAppShell> appShell = do_GetService(kAppShellCID);
    NS_ENSURE_TRUE(appShell, nsnull);

    nsresult rv = appShell->RunBeforeNextEvent(transaction);
    NS_ENSURE_SUCCESS(rv, nsnull);

    transaction->mCreating = true;
  }

  if (aMode != IDBTransaction::VERSION_CHANGE) {
    TransactionThreadPool* pool = TransactionThreadPool::GetOrCreate();
    pool->Dispatch(transaction, &gStartTransactionRunnable, false, nsnull);
  }

  return transaction.forget();
}
Esempio n. 5
0
NS_IMETHODIMP
IDBCursor::Continue(const jsval &aKey,
                    JSContext* aCx,
                    PRUint8 aOptionalArgCount,
                    PRBool* _retval)
{
  NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");

  if (!mObjectStore->TransactionIsOpen()) {
    return NS_ERROR_UNEXPECTED;
  }

  if (mContinueCalled) {
    return NS_ERROR_NOT_AVAILABLE;
  }

  Key key;
  nsresult rv = IDBObjectStore::GetKeyFromJSVal(aKey, key);
  NS_ENSURE_SUCCESS(rv, rv);

  if (key.IsNull()) {
    if (aOptionalArgCount) {
      return NS_ERROR_INVALID_ARG;
    }
    else {
      key = Key::UNSETKEY;
    }
  }

  TransactionThreadPool* pool = TransactionThreadPool::GetOrCreate();
  NS_ENSURE_TRUE(pool, NS_ERROR_FAILURE);

  nsRefPtr<ContinueRunnable> runnable(new ContinueRunnable(this, key));

  rv = pool->Dispatch(mTransaction, runnable, false, nsnull);
  NS_ENSURE_SUCCESS(rv, rv);

  mTransaction->OnNewRequest();

  mContinueCalled = true;

  *_retval = PR_TRUE;
  return NS_OK;
}
Esempio n. 6
0
nsresult
IDBTransaction::CommitOrRollback()
{
  NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");

  TransactionThreadPool* pool = TransactionThreadPool::GetOrCreate();
  NS_ENSURE_STATE(pool);

  nsRefPtr<CommitHelper> helper(new CommitHelper(this, mListener,
                                                 mCreatedObjectStores));

  mCachedStatements.Enumerate(DoomCachedStatements, helper);
  NS_ASSERTION(!mCachedStatements.Count(), "Statements left!");

  nsresult rv = pool->Dispatch(this, helper, true, helper);
  NS_ENSURE_SUCCESS(rv, rv);

  return NS_OK;
}
Esempio n. 7
0
// static
already_AddRefed<IDBTransaction>
IDBTransaction::CreateInternal(IDBDatabase* aDatabase,
                               nsTArray<nsString>& aObjectStoreNames,
                               Mode aMode,
                               bool aDispatchDelayed,
                               bool aIsVersionChangeTransactionChild)
{
    NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
    NS_ASSERTION(IndexedDatabaseManager::IsMainProcess() || !aDispatchDelayed,
                 "No support for delayed-dispatch transactions in child "
                 "process!");
    NS_ASSERTION(!aIsVersionChangeTransactionChild ||
                 (!IndexedDatabaseManager::IsMainProcess() &&
                  aMode == IDBTransaction::VERSION_CHANGE),
                 "Busted logic!");

    nsRefPtr<IDBTransaction> transaction = new IDBTransaction();

    transaction->BindToOwner(aDatabase);
    if (!transaction->SetScriptOwner(aDatabase->GetScriptOwner())) {
        return nsnull;
    }

    transaction->mDatabase = aDatabase;
    transaction->mMode = aMode;
    transaction->mDatabaseInfo = aDatabase->Info();
    transaction->mObjectStoreNames.AppendElements(aObjectStoreNames);
    transaction->mObjectStoreNames.Sort();

    IndexedDBTransactionChild* actor = nsnull;

    transaction->mCreatedFileInfos.Init();

    if (IndexedDatabaseManager::IsMainProcess()) {
        transaction->mCachedStatements.Init();

        if (aMode != IDBTransaction::VERSION_CHANGE) {
            TransactionThreadPool* pool = TransactionThreadPool::GetOrCreate();
            NS_ENSURE_TRUE(pool, nsnull);

            pool->Dispatch(transaction, &gStartTransactionRunnable, false, nsnull);
        }
    }
    else if (!aIsVersionChangeTransactionChild) {
        IndexedDBDatabaseChild* dbActor = aDatabase->GetActorChild();
        NS_ASSERTION(dbActor, "Must have an actor here!");

        ipc::NormalTransactionParams params;
        params.names().AppendElements(aObjectStoreNames);
        params.mode() = aMode;

        actor = new IndexedDBTransactionChild();

        dbActor->SendPIndexedDBTransactionConstructor(actor, params);
    }

    if (!aDispatchDelayed) {
        nsCOMPtr<nsIAppShell> appShell = do_GetService(kAppShellCID);
        NS_ENSURE_TRUE(appShell, nsnull);

        nsresult rv = appShell->RunBeforeNextEvent(transaction);
        NS_ENSURE_SUCCESS(rv, nsnull);

        transaction->mCreating = true;
    }

    if (actor) {
        NS_ASSERTION(!IndexedDatabaseManager::IsMainProcess(), "Wrong process!");
        actor->SetTransaction(transaction);
    }

    return transaction.forget();
}