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

Side by Side Diff: Source/WebCore/storage/SQLTransaction.cpp

Issue 7563014: Merge 92155 - [Chromium] WebSQLDatabase version handling is broken in multi-process browsers. (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/835/
Patch Set: Created 9 years, 4 months 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
« no previous file with comments | « Source/WebCore/storage/SQLTransaction.h ('k') | Source/WebCore/storage/SQLTransactionSync.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. 2 * Copyright (C) 2007, 2008 Apple 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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 , m_executeSqlAllowed(false) 71 , m_executeSqlAllowed(false)
72 , m_database(db) 72 , m_database(db)
73 , m_wrapper(wrapper) 73 , m_wrapper(wrapper)
74 , m_callbackWrapper(callback, db->scriptExecutionContext()) 74 , m_callbackWrapper(callback, db->scriptExecutionContext())
75 , m_successCallbackWrapper(successCallback, db->scriptExecutionContext()) 75 , m_successCallbackWrapper(successCallback, db->scriptExecutionContext())
76 , m_errorCallbackWrapper(errorCallback, db->scriptExecutionContext()) 76 , m_errorCallbackWrapper(errorCallback, db->scriptExecutionContext())
77 , m_shouldRetryCurrentStatement(false) 77 , m_shouldRetryCurrentStatement(false)
78 , m_modifiedDatabase(false) 78 , m_modifiedDatabase(false)
79 , m_lockAcquired(false) 79 , m_lockAcquired(false)
80 , m_readOnly(readOnly) 80 , m_readOnly(readOnly)
81 , m_hasVersionMismatch(false)
81 { 82 {
82 ASSERT(m_database); 83 ASSERT(m_database);
83 } 84 }
84 85
85 SQLTransaction::~SQLTransaction() 86 SQLTransaction::~SQLTransaction()
86 { 87 {
87 ASSERT(!m_sqliteTransaction); 88 ASSERT(!m_sqliteTransaction);
88 } 89 }
89 90
90 void SQLTransaction::executeSQL(const String& sqlStatement, const Vector<SQLValu e>& arguments, PassRefPtr<SQLStatementCallback> callback, PassRefPtr<SQLStatemen tErrorCallback> callbackError, ExceptionCode& e) 91 void SQLTransaction::executeSQL(const String& sqlStatement, const Vector<SQLValu e>& arguments, PassRefPtr<SQLStatementCallback> callback, PassRefPtr<SQLStatemen tErrorCallback> callbackError, ExceptionCode& e)
91 { 92 {
92 if (!m_executeSqlAllowed || !m_database->opened()) { 93 if (!m_executeSqlAllowed || !m_database->opened()) {
93 e = INVALID_STATE_ERR; 94 e = INVALID_STATE_ERR;
94 return; 95 return;
95 } 96 }
96 97
97 int permissions = DatabaseAuthorizer::ReadWriteMask; 98 int permissions = DatabaseAuthorizer::ReadWriteMask;
98 if (!m_database->scriptExecutionContext()->allowDatabaseAccess()) 99 if (!m_database->scriptExecutionContext()->allowDatabaseAccess())
99 permissions |= DatabaseAuthorizer::NoAccessMask; 100 permissions |= DatabaseAuthorizer::NoAccessMask;
100 else if (m_readOnly) 101 else if (m_readOnly)
101 permissions |= DatabaseAuthorizer::ReadOnlyMask; 102 permissions |= DatabaseAuthorizer::ReadOnlyMask;
102 103
103 RefPtr<SQLStatement> statement = SQLStatement::create(m_database.get(), sqlS tatement, arguments, callback, callbackError, permissions); 104 RefPtr<SQLStatement> statement = SQLStatement::create(m_database.get(), sqlS tatement, arguments, callback, callbackError, permissions);
104 105
105 if (m_database->deleted()) 106 if (m_database->deleted())
106 statement->setDatabaseDeletedError(); 107 statement->setDatabaseDeletedError();
107 108
108 if (!m_database->versionMatchesExpected())
109 statement->setVersionMismatchedError();
110
111 enqueueStatement(statement); 109 enqueueStatement(statement);
112 } 110 }
113 111
114 void SQLTransaction::enqueueStatement(PassRefPtr<SQLStatement> statement) 112 void SQLTransaction::enqueueStatement(PassRefPtr<SQLStatement> statement)
115 { 113 {
116 MutexLocker locker(m_statementMutex); 114 MutexLocker locker(m_statementMutex);
117 m_statementQueue.append(statement); 115 m_statementQueue.append(statement);
118 } 116 }
119 117
120 #if !LOG_DISABLED 118 #if !LOG_DISABLED
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 263
266 // Transaction Steps 1+2 - Open a transaction to the database, jumping to th e error callback if that fails 264 // Transaction Steps 1+2 - Open a transaction to the database, jumping to th e error callback if that fails
267 if (!m_sqliteTransaction->inProgress()) { 265 if (!m_sqliteTransaction->inProgress()) {
268 ASSERT(!m_database->sqliteDatabase().transactionInProgress()); 266 ASSERT(!m_database->sqliteDatabase().transactionInProgress());
269 m_sqliteTransaction.clear(); 267 m_sqliteTransaction.clear();
270 m_transactionError = SQLError::create(SQLError::DATABASE_ERR, "unable to open a transaction to the database"); 268 m_transactionError = SQLError::create(SQLError::DATABASE_ERR, "unable to open a transaction to the database");
271 handleTransactionError(false); 269 handleTransactionError(false);
272 return; 270 return;
273 } 271 }
274 272
273 // Note: We intentionally retrieve the actual version even with an empty exp ected version.
274 // In multi-process browsers, we take this opportinutiy to update the cached value for
275 // the actual version. In single-process browsers, this is just a map lookup .
276 String actualVersion;
277 if (!m_database->getActualVersionForTransaction(actualVersion)) {
278 m_database->disableAuthorizer();
279 m_sqliteTransaction.clear();
280 m_database->enableAuthorizer();
281 m_transactionError = SQLError::create(SQLError::DATABASE_ERR, "unable to read version");
282 handleTransactionError(false);
283 return;
284 }
285 m_hasVersionMismatch = !m_database->expectedVersion().isEmpty()
286 && (m_database->expectedVersion() != actualVersion);
287
275 // Transaction Steps 3 - Peform preflight steps, jumping to the error callba ck if they fail 288 // Transaction Steps 3 - Peform preflight steps, jumping to the error callba ck if they fail
276 if (m_wrapper && !m_wrapper->performPreflight(this)) { 289 if (m_wrapper && !m_wrapper->performPreflight(this)) {
290 m_database->disableAuthorizer();
277 m_sqliteTransaction.clear(); 291 m_sqliteTransaction.clear();
292 m_database->enableAuthorizer();
278 m_transactionError = m_wrapper->sqlError(); 293 m_transactionError = m_wrapper->sqlError();
279 if (!m_transactionError) 294 if (!m_transactionError)
280 m_transactionError = SQLError::create(SQLError::UNKNOWN_ERR, "unknow n error occured setting up transaction"); 295 m_transactionError = SQLError::create(SQLError::UNKNOWN_ERR, "unknow n error occured setting up transaction");
281 296
282 handleTransactionError(false); 297 handleTransactionError(false);
283 return; 298 return;
284 } 299 }
285 300
286 // Transaction Step 4 - Invoke the transaction callback with the new SQLTran saction object 301 // Transaction Step 4 - Invoke the transaction callback with the new SQLTran saction object
287 m_nextStep = &SQLTransaction::deliverTransactionCallback; 302 m_nextStep = &SQLTransaction::deliverTransactionCallback;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 } 377 }
363 } 378 }
364 379
365 bool SQLTransaction::runCurrentStatement() 380 bool SQLTransaction::runCurrentStatement()
366 { 381 {
367 if (!m_currentStatement) 382 if (!m_currentStatement)
368 return false; 383 return false;
369 384
370 m_database->resetAuthorizer(); 385 m_database->resetAuthorizer();
371 386
387 if (m_hasVersionMismatch)
388 m_currentStatement->setVersionMismatchedError();
389
372 if (m_currentStatement->execute(m_database.get())) { 390 if (m_currentStatement->execute(m_database.get())) {
373 if (m_database->lastActionChangedDatabase()) { 391 if (m_database->lastActionChangedDatabase()) {
374 // Flag this transaction as having changed the database for later de legate notification 392 // Flag this transaction as having changed the database for later de legate notification
375 m_modifiedDatabase = true; 393 m_modifiedDatabase = true;
376 // Also dirty the size of this database file for calculating quota u sage 394 // Also dirty the size of this database file for calculating quota u sage
377 m_database->transactionClient()->didExecuteStatement(database()); 395 m_database->transactionClient()->didExecuteStatement(database());
378 } 396 }
379 397
380 if (m_currentStatement->hasStatementCallback()) { 398 if (m_currentStatement->hasStatementCallback()) {
381 m_nextStep = &SQLTransaction::deliverStatementCallback; 399 m_nextStep = &SQLTransaction::deliverStatementCallback;
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 476
459 // Transacton Step 8+9 - Commit the transaction, jumping to the error callba ck if that fails 477 // Transacton Step 8+9 - Commit the transaction, jumping to the error callba ck if that fails
460 ASSERT(m_sqliteTransaction); 478 ASSERT(m_sqliteTransaction);
461 479
462 m_database->disableAuthorizer(); 480 m_database->disableAuthorizer();
463 m_sqliteTransaction->commit(); 481 m_sqliteTransaction->commit();
464 m_database->enableAuthorizer(); 482 m_database->enableAuthorizer();
465 483
466 // If the commit failed, the transaction will still be marked as "in progres s" 484 // If the commit failed, the transaction will still be marked as "in progres s"
467 if (m_sqliteTransaction->inProgress()) { 485 if (m_sqliteTransaction->inProgress()) {
486 if (m_wrapper)
487 m_wrapper->handleCommitFailedAfterPostflight(this);
468 m_successCallbackWrapper.clear(); 488 m_successCallbackWrapper.clear();
469 m_transactionError = SQLError::create(SQLError::DATABASE_ERR, "failed to commit the transaction"); 489 m_transactionError = SQLError::create(SQLError::DATABASE_ERR, "failed to commit the transaction");
470 handleTransactionError(false); 490 handleTransactionError(false);
471 return; 491 return;
472 } 492 }
473 493
474 // Vacuum the database if anything was deleted. 494 // Vacuum the database if anything was deleted.
475 if (m_database->hadDeletes()) 495 if (m_database->hadDeletes())
476 m_database->incrementalVacuumIfNeeded(); 496 m_database->incrementalVacuumIfNeeded();
477 497
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 ASSERT(!m_database->sqliteDatabase().transactionInProgress()); 604 ASSERT(!m_database->sqliteDatabase().transactionInProgress());
585 m_nextStep = 0; 605 m_nextStep = 0;
586 606
587 // Now release the lock on this database 607 // Now release the lock on this database
588 m_database->transactionCoordinator()->releaseLock(this); 608 m_database->transactionCoordinator()->releaseLock(this);
589 } 609 }
590 610
591 } // namespace WebCore 611 } // namespace WebCore
592 612
593 #endif // ENABLE(DATABASE) 613 #endif // ENABLE(DATABASE)
OLDNEW
« no previous file with comments | « Source/WebCore/storage/SQLTransaction.h ('k') | Source/WebCore/storage/SQLTransactionSync.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698