WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
reportError
dbHist2.2.txt (text/plain), 39.25 KB, created by
Michael Nordman
on 2011-11-29 13:59:14 PST
(
hide
)
Description:
reportError
Filename:
MIME Type:
Creator:
Michael Nordman
Created:
2011-11-29 13:59:14 PST
Size:
39.25 KB
patch
obsolete
>Index: Source/WebCore/ChangeLog >=================================================================== >--- Source/WebCore/ChangeLog (revision 101285) >+++ Source/WebCore/ChangeLog (working copy) >@@ -1,3 +1,52 @@ >+2011-11-28 Michael Nordman <michaeln@google.co> >+ >+ [chromium] WebSQLDatabase could use some better error reporting. >+ Instruments the database classes to report errors to a DatabaseObserver. >+ https://bugs.webkit.org/show_bug.cgi?id=73258 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ No new tests, no content observable artifacts. >+ >+ * storage/AbstractDatabase.cpp: >+ (WebCore::AbstractDatabase::AbstractDatabase): >+ (WebCore::AbstractDatabase::performOpenAndVerify): >+ (WebCore::AbstractDatabase::incrementalVacuumIfNeeded): >+ (WebCore::AbstractDatabase::reportOpenDatabaseResult): >+ (WebCore::AbstractDatabase::reportChangeVersionResult): >+ (WebCore::AbstractDatabase::reportStartTransactionResult): >+ (WebCore::AbstractDatabase::reportCommitTransactionResult): >+ (WebCore::AbstractDatabase::reportExecuteStatementResult): >+ (WebCore::AbstractDatabase::reportVacuumDatabaseResult): >+ * storage/AbstractDatabase.h: >+ (WebCore::AbstractDatabase::isSyncDatabase): >+ * storage/ChangeVersionWrapper.cpp: >+ (WebCore::ChangeVersionWrapper::performPreflight): >+ (WebCore::ChangeVersionWrapper::performPostflight): >+ * storage/Database.cpp: >+ (WebCore::Database::Database): >+ * storage/DatabaseSync.cpp: >+ (WebCore::DatabaseSync::DatabaseSync): >+ (WebCore::DatabaseSync::changeVersion): >+ * storage/SQLStatement.cpp: >+ (WebCore::SQLStatement::execute): >+ (WebCore::SQLStatement::setDatabaseDeletedError): >+ (WebCore::SQLStatement::setVersionMismatchedError): >+ (WebCore::SQLStatement::setFailureDueToQuota): >+ * storage/SQLStatement.h: >+ * storage/SQLTransaction.cpp: >+ (WebCore::SQLTransaction::executeSQL): >+ (WebCore::SQLTransaction::openTransactionAndPreflight): >+ (WebCore::SQLTransaction::deliverTransactionCallback): >+ (WebCore::SQLTransaction::runCurrentStatement): >+ (WebCore::SQLTransaction::handleCurrentStatementError): >+ (WebCore::SQLTransaction::deliverStatementCallback): >+ (WebCore::SQLTransaction::postflightAndCommit): >+ * storage/SQLTransactionSync.cpp: >+ (WebCore::SQLTransactionSync::begin): >+ (WebCore::SQLTransactionSync::commit): >+ * storage/chromium/DatabaseObserver.h: >+ > 2011-11-28 Fady Samuel <fsamuel@chromium.org> > > Fix Aspect Ratio Property Inheritance And Make the Computed Value Equal the Specified Value >Index: Source/WebCore/storage/AbstractDatabase.cpp >=================================================================== >--- Source/WebCore/storage/AbstractDatabase.cpp (revision 101272) >+++ Source/WebCore/storage/AbstractDatabase.cpp (working copy) >@@ -48,6 +48,10 @@ > #include <wtf/text/CString.h> > #include <wtf/text/StringHash.h> > >+#if PLATFORM(CHROMIUM) >+#include "DatabaseObserver.h" // For error reporting. >+#endif >+ > namespace WebCore { > > static const char versionKey[] = "WebKitDatabaseVersionKey"; >@@ -182,7 +186,7 @@ const char* AbstractDatabase::databaseIn > } > > AbstractDatabase::AbstractDatabase(ScriptExecutionContext* context, const String& name, const String& expectedVersion, >- const String& displayName, unsigned long estimatedSize) >+ const String& displayName, unsigned long estimatedSize, DatabaseType databaseType) > : m_scriptExecutionContext(context) > , m_name(name.isolatedCopy()) > , m_expectedVersion(expectedVersion.isolatedCopy()) >@@ -191,6 +195,7 @@ AbstractDatabase::AbstractDatabase(Scrip > , m_guid(0) > , m_opened(false) > , m_new(false) >+ , m_isSyncDatabase(databaseType == SyncDatabase) > { > ASSERT(context->isContextThread()); > m_contextThreadSecurityOrigin = m_scriptExecutionContext->securityOrigin(); >@@ -257,6 +262,7 @@ bool AbstractDatabase::performOpenAndVer > const int maxSqliteBusyWaitTime = 30000; > > if (!m_sqliteDatabase.open(m_filename, true)) { >+ reportOpenDatabaseResult(1, INVALID_STATE_ERR, m_sqliteDatabase.lastError()); > errorMessage = formatErrorMessage("unable to open database", m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg()); > ec = INVALID_STATE_ERR; > return false; >@@ -298,6 +304,7 @@ bool AbstractDatabase::performOpenAndVer > SQLiteTransaction transaction(m_sqliteDatabase); > transaction.begin(); > if (!transaction.inProgress()) { >+ reportOpenDatabaseResult(2, INVALID_STATE_ERR, m_sqliteDatabase.lastError()); > errorMessage = formatErrorMessage("unable to open database, failed to start transaction", m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg()); > ec = INVALID_STATE_ERR; > m_sqliteDatabase.close(); >@@ -309,6 +316,7 @@ bool AbstractDatabase::performOpenAndVer > m_new = true; > > if (!m_sqliteDatabase.executeCommand("CREATE TABLE " + tableName + " (key TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT REPLACE,value TEXT NOT NULL ON CONFLICT FAIL);")) { >+ reportOpenDatabaseResult(3, INVALID_STATE_ERR, m_sqliteDatabase.lastError()); > errorMessage = formatErrorMessage("unable to open database, failed to create 'info' table", m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg()); > ec = INVALID_STATE_ERR; > transaction.rollback(); >@@ -316,6 +324,7 @@ bool AbstractDatabase::performOpenAndVer > return false; > } > } else if (!getVersionFromDatabase(currentVersion, false)) { >+ reportOpenDatabaseResult(4, INVALID_STATE_ERR, m_sqliteDatabase.lastError()); > errorMessage = formatErrorMessage("unable to open database, failed to read current version", m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg()); > ec = INVALID_STATE_ERR; > transaction.rollback(); >@@ -328,6 +337,7 @@ bool AbstractDatabase::performOpenAndVer > } else if (!m_new || shouldSetVersionInNewDatabase) { > LOG(StorageAPI, "Setting version %s in database %s that was just created", m_expectedVersion.ascii().data(), databaseDebugName().ascii().data()); > if (!setVersionInDatabase(m_expectedVersion, false)) { >+ reportOpenDatabaseResult(5, INVALID_STATE_ERR, m_sqliteDatabase.lastError()); > errorMessage = formatErrorMessage("unable to open database, failed to write current version", m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg()); > ec = INVALID_STATE_ERR; > transaction.rollback(); >@@ -349,6 +359,7 @@ bool AbstractDatabase::performOpenAndVer > // If the expected version isn't the empty string, ensure that the current database version we have matches that version. Otherwise, set an exception. > // If the expected version is the empty string, then we always return with whatever version of the database we have. > if ((!m_new || shouldSetVersionInNewDatabase) && m_expectedVersion.length() && m_expectedVersion != currentVersion) { >+ reportOpenDatabaseResult(6, INVALID_STATE_ERR, 0); > errorMessage = "unable to open database, version mismatch, '" + m_expectedVersion + "' does not match the currentVersion of '" + currentVersion + "'"; > ec = INVALID_STATE_ERR; > m_sqliteDatabase.close(); >@@ -363,6 +374,7 @@ bool AbstractDatabase::performOpenAndVer > if (m_new && !shouldSetVersionInNewDatabase) > m_expectedVersion = ""; // The caller provided a creationCallback which will set the expected version. > >+ reportOpenDatabaseResult(0, -1, 0); // OK > return true; > } > >@@ -533,6 +545,7 @@ void AbstractDatabase::incrementalVacuum > int64_t totalSize = m_sqliteDatabase.totalSize(); > if (totalSize <= 10 * freeSpaceSize) { > int result = m_sqliteDatabase.runIncrementalVacuumCommand(); >+ reportVacuumDatabaseResult(result); > if (result != SQLResultOk) > logErrorMessage(formatErrorMessage("error vacuuming database", result, m_sqliteDatabase.lastErrorMsg())); > } >@@ -554,6 +567,48 @@ void AbstractDatabase::logErrorMessage(c > m_scriptExecutionContext->addMessage(OtherMessageSource, LogMessageType, ErrorMessageLevel, message, 0, String(), 0); > } > >+#if PLATFORM(CHROMIUM) >+// These are used to generate histograms of errors seen with websql. >+// See about:histograms in chromium. >+void AbstractDatabase::reportOpenDatabaseResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode) >+{ >+ DatabaseObserver::reportOpenDatabaseResult(this, errorSite, webSqlErrorCode, sqliteErrorCode); >+} >+ >+void AbstractDatabase::reportChangeVersionResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode) >+{ >+ DatabaseObserver::reportChangeVersionResult(this, errorSite, webSqlErrorCode, sqliteErrorCode); >+} >+ >+void AbstractDatabase::reportStartTransactionResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode) >+{ >+ DatabaseObserver::reportStartTransactionResult(this, errorSite, webSqlErrorCode, sqliteErrorCode); >+} >+ >+void AbstractDatabase::reportCommitTransactionResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode) >+{ >+ DatabaseObserver::reportCommitTransactionResult(this, errorSite, webSqlErrorCode, sqliteErrorCode); >+} >+ >+void AbstractDatabase::reportExecuteStatementResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode) >+{ >+ DatabaseObserver::reportExecuteStatementResult(this, errorSite, webSqlErrorCode, sqliteErrorCode); >+} >+ >+void AbstractDatabase::reportVacuumDatabaseResult(int sqliteErrorCode) >+{ >+ DatabaseObserver::reportVacuumDatabaseResult(this, sqliteErrorCode); >+} >+ >+#else >+void AbstractDatabase::reportOpenDatabaseResult(int, int, int) { } >+void AbstractDatabase::reportChangeVersionResult(int, int, int) { } >+void AbstractDatabase::reportStartTransactionResult(int, int, int) { } >+void AbstractDatabase::reportCommitTransactionResult(int, int, int) { } >+void AbstractDatabase::reportExecuteStatementResult(int, int, int) { } >+void AbstractDatabase::reportVacuumDatabaseResult(int) { } >+#endif // PLATFORM(CHROMIUM) >+ > } // namespace WebCore > > #endif // ENABLE(SQL_DATABASE) >Index: Source/WebCore/storage/AbstractDatabase.h >=================================================================== >--- Source/WebCore/storage/AbstractDatabase.h (revision 101272) >+++ Source/WebCore/storage/AbstractDatabase.h (working copy) >@@ -58,6 +58,7 @@ public: > > bool opened() const { return m_opened; } > bool isNew() const { return m_new; } >+ bool isSyncDatabase() const { return m_isSyncDatabase; } > > virtual ScriptExecutionContext* scriptExecutionContext() const; > virtual SecurityOrigin* securityOrigin() const; >@@ -86,12 +87,19 @@ public: > virtual void closeImmediately() = 0; > > protected: >+ friend class ChangeVersionWrapper; >+ friend class SQLStatement; >+ friend class SQLStatementSync; > friend class SQLTransactionSync; > friend class SQLTransaction; >- friend class ChangeVersionWrapper; >+ >+ enum DatabaseType { >+ AsyncDatabase, >+ SyncDatabase >+ }; > > AbstractDatabase(ScriptExecutionContext*, const String& name, const String& expectedVersion, >- const String& displayName, unsigned long estimatedSize); >+ const String& displayName, unsigned long estimatedSize, DatabaseType); > > void closeDatabase(); > >@@ -107,6 +115,13 @@ protected: > > void logErrorMessage(const String& message); > >+ void reportOpenDatabaseResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode); >+ void reportChangeVersionResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode); >+ void reportStartTransactionResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode); >+ void reportCommitTransactionResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode); >+ void reportExecuteStatementResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode); >+ void reportVacuumDatabaseResult(int sqliteErrorCode); >+ > static const char* databaseInfoTableName(); > > RefPtr<ScriptExecutionContext> m_scriptExecutionContext; >@@ -126,6 +141,7 @@ private: > int m_guid; > bool m_opened; > bool m_new; >+ const bool m_isSyncDatabase; > > SQLiteDatabase m_sqliteDatabase; > >Index: Source/WebCore/storage/ChangeVersionWrapper.cpp >=================================================================== >--- Source/WebCore/storage/ChangeVersionWrapper.cpp (revision 101272) >+++ Source/WebCore/storage/ChangeVersionWrapper.cpp (working copy) >@@ -51,13 +51,15 @@ bool ChangeVersionWrapper::performPrefli > > String actualVersion; > if (!database->getVersionFromDatabase(actualVersion)) { >+ int sqliteError = database->sqliteDatabase().lastError(); >+ database->reportChangeVersionResult(1, SQLError::UNKNOWN_ERR, sqliteError); > m_sqlError = SQLError::create(SQLError::UNKNOWN_ERR, "unable to read the current version", >- database->sqliteDatabase().lastError(), >- database->sqliteDatabase().lastErrorMsg()); >+ sqliteError, database->sqliteDatabase().lastErrorMsg()); > return false; > } > > if (actualVersion != m_oldVersion) { >+ database->reportChangeVersionResult(2, SQLError::VERSION_ERR, 0); > m_sqlError = SQLError::create(SQLError::VERSION_ERR, "current version of the database and `oldVersion` argument do not match"); > return false; > } >@@ -72,14 +74,16 @@ bool ChangeVersionWrapper::performPostfl > Database* database = transaction->database(); > > if (!database->setVersionInDatabase(m_newVersion)) { >+ int sqliteError = database->sqliteDatabase().lastError(); >+ database->reportChangeVersionResult(3, SQLError::UNKNOWN_ERR, sqliteError); > m_sqlError = SQLError::create(SQLError::UNKNOWN_ERR, "unable to set new version in database", >- database->sqliteDatabase().lastError(), >- database->sqliteDatabase().lastErrorMsg()); >+ sqliteError, database->sqliteDatabase().lastErrorMsg()); > return false; > } > > database->setExpectedVersion(m_newVersion); > >+ database->reportChangeVersionResult(0, -1, 0); // OK > return true; > } > >Index: Source/WebCore/storage/Database.cpp >=================================================================== >--- Source/WebCore/storage/Database.cpp (revision 101272) >+++ Source/WebCore/storage/Database.cpp (working copy) >@@ -120,7 +120,7 @@ PassRefPtr<Database> Database::openDatab > } > > Database::Database(ScriptExecutionContext* context, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize) >- : AbstractDatabase(context, name, expectedVersion, displayName, estimatedSize) >+ : AbstractDatabase(context, name, expectedVersion, displayName, estimatedSize, AsyncDatabase) > , m_transactionInProgress(false) > , m_isTransactionQueueEnabled(true) > , m_deleted(false) >Index: Source/WebCore/storage/DatabaseSync.cpp >=================================================================== >--- Source/WebCore/storage/DatabaseSync.cpp (revision 101272) >+++ Source/WebCore/storage/DatabaseSync.cpp (working copy) >@@ -78,7 +78,7 @@ PassRefPtr<DatabaseSync> DatabaseSync::o > > DatabaseSync::DatabaseSync(ScriptExecutionContext* context, const String& name, const String& expectedVersion, > const String& displayName, unsigned long estimatedSize) >- : AbstractDatabase(context, name, expectedVersion, displayName, estimatedSize) >+ : AbstractDatabase(context, name, expectedVersion, displayName, estimatedSize, SyncDatabase) > { > } > >@@ -97,6 +97,7 @@ void DatabaseSync::changeVersion(const S > ASSERT(m_scriptExecutionContext->isContextThread()); > > if (sqliteDatabase().transactionInProgress()) { >+ reportChangeVersionResult(1, SQLException::DATABASE_ERR, 0); > setLastErrorMessage("unable to changeVersion from within a transaction"); > ec = SQLException::DATABASE_ERR; > return; >@@ -110,12 +111,14 @@ void DatabaseSync::changeVersion(const S > > String actualVersion; > if (!getVersionFromDatabase(actualVersion)) { >+ reportChangeVersionResult(2, SQLException::UNKNOWN_ERR, sqliteDatabase().lastError()); > setLastErrorMessage("unable to read the current version", sqliteDatabase().lastError(), sqliteDatabase().lastErrorMsg()); > ec = SQLException::UNKNOWN_ERR; > return; > } > > if (actualVersion != oldVersion) { >+ reportChangeVersionResult(3, SQLException::VERSION_ERR, 0); > setLastErrorMessage("current version of the database and `oldVersion` argument do not match"); > ec = SQLException::VERSION_ERR; > return; >@@ -127,6 +130,7 @@ void DatabaseSync::changeVersion(const S > } > > if (!setVersionInDatabase(newVersion)) { >+ reportChangeVersionResult(4, SQLException::UNKNOWN_ERR, sqliteDatabase().lastError()); > setLastErrorMessage("unable to set the new version", sqliteDatabase().lastError(), sqliteDatabase().lastErrorMsg()); > ec = SQLException::UNKNOWN_ERR; > return; >@@ -138,6 +142,8 @@ void DatabaseSync::changeVersion(const S > return; > } > >+ reportChangeVersionResult(0, -1, 0); // OK >+ > setExpectedVersion(newVersion); > setLastErrorMessage(""); > } >Index: Source/WebCore/storage/SQLStatement.cpp >=================================================================== >--- Source/WebCore/storage/SQLStatement.cpp (revision 101272) >+++ Source/WebCore/storage/SQLStatement.cpp (working copy) >@@ -82,6 +82,7 @@ bool SQLStatement::execute(Database* db) > m_error = SQLError::create(SQLError::DATABASE_ERR, "could not prepare statement", result, "interrupted"); > else > m_error = SQLError::create(SQLError::SYNTAX_ERR, "could not prepare statement", result, database->lastErrorMsg()); >+ db->reportExecuteStatementResult(1, m_error->code(), result); > return false; > } > >@@ -90,18 +91,20 @@ bool SQLStatement::execute(Database* db) > if (statement.bindParameterCount() != m_arguments.size()) { > LOG(StorageAPI, "Bind parameter count doesn't match number of question marks"); > m_error = SQLError::create(db->isInterrupted() ? SQLError::DATABASE_ERR : SQLError::SYNTAX_ERR, "number of '?'s in statement string does not match argument count"); >+ db->reportExecuteStatementResult(2, m_error->code(), 0); > return false; > } > > for (unsigned i = 0; i < m_arguments.size(); ++i) { > result = statement.bindValue(i + 1, m_arguments[i]); > if (result == SQLResultFull) { >- setFailureDueToQuota(); >+ setFailureDueToQuota(db); > return false; > } > > if (result != SQLResultOk) { > LOG(StorageAPI, "Failed to bind value index %i to statement for query '%s'", i + 1, m_statement.ascii().data()); >+ db->reportExecuteStatementResult(3, SQLError::DATABASE_ERR, result); > m_error = SQLError::create(SQLError::DATABASE_ERR, "could not bind value", result, database->lastErrorMsg()); > return false; > } >@@ -126,6 +129,7 @@ bool SQLStatement::execute(Database* db) > } while (result == SQLResultRow); > > if (result != SQLResultDone) { >+ db->reportExecuteStatementResult(4, SQLError::DATABASE_ERR, result); > m_error = SQLError::create(SQLError::DATABASE_ERR, "could not iterate results", result, database->lastErrorMsg()); > return false; > } >@@ -135,9 +139,10 @@ bool SQLStatement::execute(Database* db) > resultSet->setInsertId(database->lastInsertRowID()); > } else if (result == SQLResultFull) { > // Return the Quota error - the delegate will be asked for more space and this statement might be re-run >- setFailureDueToQuota(); >+ setFailureDueToQuota(db); > return false; > } else { >+ db->reportExecuteStatementResult(5, SQLError::DATABASE_ERR, result); > m_error = SQLError::create(SQLError::DATABASE_ERR, "could not execute statement", result, database->lastErrorMsg()); > return false; > } >@@ -148,18 +153,21 @@ bool SQLStatement::execute(Database* db) > resultSet->setRowsAffected(database->lastChanges()); > > m_resultSet = resultSet; >+ db->reportExecuteStatementResult(0, -1, 0); // OK > return true; > } > >-void SQLStatement::setDatabaseDeletedError() >+void SQLStatement::setDatabaseDeletedError(Database* database) > { > ASSERT(!m_error && !m_resultSet); >+ database->reportExecuteStatementResult(6, SQLError::UNKNOWN_ERR, 0); > m_error = SQLError::create(SQLError::UNKNOWN_ERR, "unable to execute statement, because the user deleted the database"); > } > >-void SQLStatement::setVersionMismatchedError() >+void SQLStatement::setVersionMismatchedError(Database* database) > { > ASSERT(!m_error && !m_resultSet); >+ database->reportExecuteStatementResult(7, SQLError::VERSION_ERR, 0); > m_error = SQLError::create(SQLError::VERSION_ERR, "current version of the database and `oldVersion` argument do not match"); > } > >@@ -183,9 +191,10 @@ bool SQLStatement::performCallback(SQLTr > return callbackError; > } > >-void SQLStatement::setFailureDueToQuota() >+void SQLStatement::setFailureDueToQuota(Database* database) > { > ASSERT(!m_error && !m_resultSet); >+ database->reportExecuteStatementResult(8, SQLError::QUOTA_ERR, 0); > m_error = SQLError::create(SQLError::QUOTA_ERR, "there was not enough remaining storage space, or the storage quota was reached and the user declined to allow more space"); > } > >Index: Source/WebCore/storage/SQLStatement.h >=================================================================== >--- Source/WebCore/storage/SQLStatement.h (revision 101272) >+++ Source/WebCore/storage/SQLStatement.h (working copy) >@@ -55,8 +55,8 @@ public: > bool hasStatementCallback() const { return m_statementCallbackWrapper.hasCallback(); } > bool hasStatementErrorCallback() const { return m_statementErrorCallbackWrapper.hasCallback(); } > >- void setDatabaseDeletedError(); >- void setVersionMismatchedError(); >+ void setDatabaseDeletedError(Database*); >+ void setVersionMismatchedError(Database*); > > bool performCallback(SQLTransaction*); > >@@ -64,7 +64,7 @@ public: > private: > SQLStatement(Database*, const String& statement, const Vector<SQLValue>& arguments, PassRefPtr<SQLStatementCallback>, PassRefPtr<SQLStatementErrorCallback>, int permissions); > >- void setFailureDueToQuota(); >+ void setFailureDueToQuota(Database*); > void clearFailureDueToQuota(); > > String m_statement; >Index: Source/WebCore/storage/SQLTransaction.cpp >=================================================================== >--- Source/WebCore/storage/SQLTransaction.cpp (revision 101272) >+++ Source/WebCore/storage/SQLTransaction.cpp (working copy) >@@ -105,7 +105,7 @@ void SQLTransaction::executeSQL(const St > RefPtr<SQLStatement> statement = SQLStatement::create(m_database.get(), sqlStatement, arguments, callback, callbackError, permissions); > > if (m_database->deleted()) >- statement->setDatabaseDeletedError(); >+ statement->setDatabaseDeletedError(m_database.get()); > > enqueueStatement(statement); > } >@@ -245,6 +245,7 @@ void SQLTransaction::openTransactionAndP > > // If the database was deleted, jump to the error callback > if (m_database->deleted()) { >+ m_database->reportStartTransactionResult(1, SQLError::UNKNOWN_ERR, 0); > m_transactionError = SQLError::create(SQLError::UNKNOWN_ERR, "unable to open a transaction, because the user deleted the database"); > handleTransactionError(false); > return; >@@ -265,6 +266,7 @@ void SQLTransaction::openTransactionAndP > // Transaction Steps 1+2 - Open a transaction to the database, jumping to the error callback if that fails > if (!m_sqliteTransaction->inProgress()) { > ASSERT(!m_database->sqliteDatabase().transactionInProgress()); >+ m_database->reportStartTransactionResult(2, SQLError::DATABASE_ERR, m_database->sqliteDatabase().lastError()); > m_transactionError = SQLError::create(SQLError::DATABASE_ERR, "unable to begin transaction", > m_database->sqliteDatabase().lastError(), m_database->sqliteDatabase().lastErrorMsg()); > m_sqliteTransaction.clear(); >@@ -277,6 +279,7 @@ void SQLTransaction::openTransactionAndP > // the actual version. In single-process browsers, this is just a map lookup. > String actualVersion; > if (!m_database->getActualVersionForTransaction(actualVersion)) { >+ m_database->reportStartTransactionResult(3, SQLError::DATABASE_ERR, m_database->sqliteDatabase().lastError()); > m_transactionError = SQLError::create(SQLError::DATABASE_ERR, "unable to read version", > m_database->sqliteDatabase().lastError(), m_database->sqliteDatabase().lastErrorMsg()); > m_database->disableAuthorizer(); >@@ -294,8 +297,10 @@ void SQLTransaction::openTransactionAndP > m_sqliteTransaction.clear(); > m_database->enableAuthorizer(); > m_transactionError = m_wrapper->sqlError(); >- if (!m_transactionError) >+ if (!m_transactionError) { >+ m_database->reportStartTransactionResult(4, SQLError::UNKNOWN_ERR, 0); > m_transactionError = SQLError::create(SQLError::UNKNOWN_ERR, "unknown error occured during transaction preflight"); >+ } > handleTransactionError(false); > return; > } >@@ -319,10 +324,13 @@ void SQLTransaction::deliverTransactionC > > // Transaction Step 5 - If the transaction callback was null or raised an exception, jump to the error callback > if (shouldDeliverErrorCallback) { >+ m_database->reportStartTransactionResult(5, SQLError::UNKNOWN_ERR, 0); > m_transactionError = SQLError::create(SQLError::UNKNOWN_ERR, "the SQLTransactionCallback was null or threw an exception"); > deliverTransactionErrorCallback(); > } else > scheduleToRunStatements(); >+ >+ m_database->reportStartTransactionResult(0, -1, 0); // OK > } > > void SQLTransaction::scheduleToRunStatements() >@@ -387,7 +395,7 @@ bool SQLTransaction::runCurrentStatement > m_database->resetAuthorizer(); > > if (m_hasVersionMismatch) >- m_currentStatement->setVersionMismatchedError(); >+ m_currentStatement->setVersionMismatchedError(m_database.get()); > > if (m_currentStatement->execute(m_database.get())) { > if (m_database->lastActionChangedDatabase()) { >@@ -428,8 +436,10 @@ void SQLTransaction::handleCurrentStatem > m_database->scheduleTransactionCallback(this); > } else { > m_transactionError = m_currentStatement->sqlError(); >- if (!m_transactionError) >+ if (!m_transactionError) { >+ m_database->reportCommitTransactionResult(1, SQLError::DATABASE_ERR, 0); > m_transactionError = SQLError::create(SQLError::DATABASE_ERR, "the statement failed to execute"); >+ } > handleTransactionError(false); > } > } >@@ -445,6 +455,7 @@ void SQLTransaction::deliverStatementCal > m_executeSqlAllowed = false; > > if (result) { >+ m_database->reportCommitTransactionResult(2, SQLError::UNKNOWN_ERR, 0); > m_transactionError = SQLError::create(SQLError::UNKNOWN_ERR, "the statement callback raised an exception or statement error callback did not return false"); > handleTransactionError(true); > } else >@@ -470,8 +481,10 @@ void SQLTransaction::postflightAndCommit > // Transaction Step 7 - Peform postflight steps, jumping to the error callback if they fail > if (m_wrapper && !m_wrapper->performPostflight(this)) { > m_transactionError = m_wrapper->sqlError(); >- if (!m_transactionError) >+ if (!m_transactionError) { >+ m_database->reportCommitTransactionResult(3, SQLError::UNKNOWN_ERR, 0); > m_transactionError = SQLError::create(SQLError::UNKNOWN_ERR, "unknown error occured during transaction postflight"); >+ } > handleTransactionError(false); > return; > } >@@ -488,12 +501,15 @@ void SQLTransaction::postflightAndCommit > if (m_wrapper) > m_wrapper->handleCommitFailedAfterPostflight(this); > m_successCallbackWrapper.clear(); >+ m_database->reportCommitTransactionResult(4, SQLError::DATABASE_ERR, m_database->sqliteDatabase().lastError()); > m_transactionError = SQLError::create(SQLError::DATABASE_ERR, "unable to commit transaction", > m_database->sqliteDatabase().lastError(), m_database->sqliteDatabase().lastErrorMsg()); > handleTransactionError(false); > return; > } > >+ m_database->reportCommitTransactionResult(0, -1, 0); // OK >+ > // Vacuum the database if anything was deleted. > if (m_database->hadDeletes()) > m_database->incrementalVacuumIfNeeded(); >Index: Source/WebCore/storage/SQLTransactionSync.cpp >=================================================================== >--- Source/WebCore/storage/SQLTransactionSync.cpp (revision 101272) >+++ Source/WebCore/storage/SQLTransactionSync.cpp (working copy) >@@ -135,6 +135,7 @@ ExceptionCode SQLTransactionSync::begin( > { > ASSERT(m_database->scriptExecutionContext()->isContextThread()); > if (!m_database->opened()) { >+ m_database->reportStartTransactionResult(1, SQLException::UNKNOWN_ERR, 0); > m_database->setLastErrorMessage("cannot begin transaction because the database is not open"); > return SQLException::UNKNOWN_ERR; > } >@@ -156,6 +157,7 @@ ExceptionCode SQLTransactionSync::begin( > // Check if begin() succeeded. > if (!m_sqliteTransaction->inProgress()) { > ASSERT(!m_database->sqliteDatabase().transactionInProgress()); >+ m_database->reportStartTransactionResult(2, SQLException::DATABASE_ERR, m_database->sqliteDatabase().lastError()); > m_database->setLastErrorMessage("unable to begin transaction", > m_database->sqliteDatabase().lastError(), m_database->sqliteDatabase().lastErrorMsg()); > m_sqliteTransaction.clear(); >@@ -167,6 +169,7 @@ ExceptionCode SQLTransactionSync::begin( > // the actual version. In single-process browsers, this is just a map lookup. > String actualVersion; > if (!m_database->getActualVersionForTransaction(actualVersion)) { >+ m_database->reportStartTransactionResult(3, SQLException::DATABASE_ERR, m_database->sqliteDatabase().lastError()); > m_database->setLastErrorMessage("unable to read version", > m_database->sqliteDatabase().lastError(), m_database->sqliteDatabase().lastErrorMsg()); > rollback(); >@@ -174,6 +177,7 @@ ExceptionCode SQLTransactionSync::begin( > } > m_hasVersionMismatch = !m_database->expectedVersion().isEmpty() > && (m_database->expectedVersion() != actualVersion); >+ m_database->reportStartTransactionResult(0, -1, 0); // OK > return 0; > } > >@@ -195,6 +199,7 @@ ExceptionCode SQLTransactionSync::commit > { > ASSERT(m_database->scriptExecutionContext()->isContextThread()); > if (!m_database->opened()) { >+ m_database->reportCommitTransactionResult(1, SQLException::UNKNOWN_ERR, 0); > m_database->setLastErrorMessage("unable to commit transaction because the database is not open."); > return SQLException::UNKNOWN_ERR; > } >@@ -207,6 +212,7 @@ ExceptionCode SQLTransactionSync::commit > > // If the commit failed, the transaction will still be marked as "in progress" > if (m_sqliteTransaction->inProgress()) { >+ m_database->reportCommitTransactionResult(2, SQLException::DATABASE_ERR, m_database->sqliteDatabase().lastError()); > m_database->setLastErrorMessage("unable to commit transaction", > m_database->sqliteDatabase().lastError(), m_database->sqliteDatabase().lastErrorMsg()); > return SQLException::DATABASE_ERR; >@@ -222,6 +228,7 @@ ExceptionCode SQLTransactionSync::commit > if (m_modifiedDatabase) > m_transactionClient->didCommitWriteTransaction(database()); > >+ m_database->reportCommitTransactionResult(0, -1, 0); // OK > return 0; > } > >Index: Source/WebCore/storage/chromium/DatabaseObserver.h >=================================================================== >--- Source/WebCore/storage/chromium/DatabaseObserver.h (revision 101272) >+++ Source/WebCore/storage/chromium/DatabaseObserver.h (working copy) >@@ -48,6 +48,13 @@ public: > static void databaseOpened(AbstractDatabase*); > static void databaseModified(AbstractDatabase*); > static void databaseClosed(AbstractDatabase*); >+ >+ static void reportOpenDatabaseResult(AbstractDatabase*, int callsite, int webSqlErrorCode, int sqliteErrorCode); >+ static void reportChangeVersionResult(AbstractDatabase*, int callsite, int webSqlErrorCode, int sqliteErrorCode); >+ static void reportStartTransactionResult(AbstractDatabase*, int callsite, int webSqlErrorCode, int sqliteErrorCode); >+ static void reportCommitTransactionResult(AbstractDatabase*, int callsite, int webSqlErrorCode, int sqliteErrorCode); >+ static void reportExecuteStatementResult(AbstractDatabase*, int callsite, int webSqlErrorCode, int sqliteErrorCode); >+ static void reportVacuumDatabaseResult(AbstractDatabase*, int sqliteErrorCode); > }; > > } >Index: Source/WebKit/chromium/ChangeLog >=================================================================== >--- Source/WebKit/chromium/ChangeLog (revision 101284) >+++ Source/WebKit/chromium/ChangeLog (working copy) >@@ -1,3 +1,29 @@ >+2011-11-28 Michael Nordman <michaeln@google.com> >+ >+ [chromium] WebSQLDatabase could use some better error reporting. >+ Instruments the database classes to report errors a the DatabaseObserver. >+ https://bugs.webkit.org/show_bug.cgi?id=73258 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * public/WebDatabase.h: >+ * public/WebDatabaseObserver.h: >+ (WebKit::WebDatabaseObserver::reportOpenDatabaseResult): >+ (WebKit::WebDatabaseObserver::reportChangeVersionResult): >+ (WebKit::WebDatabaseObserver::reportStartTransactionResult): >+ (WebKit::WebDatabaseObserver::reportCommitTransactionResult): >+ (WebKit::WebDatabaseObserver::reportExecuteStatementResult): >+ (WebKit::WebDatabaseObserver::reportVacuumDatabaseResult): >+ * src/DatabaseObserver.cpp: >+ (WebCore::DatabaseObserver::reportOpenDatabaseResult): >+ (WebCore::DatabaseObserver::reportChangeVersionResult): >+ (WebCore::DatabaseObserver::reportStartTransactionResult): >+ (WebCore::DatabaseObserver::reportCommitTransactionResult): >+ (WebCore::DatabaseObserver::reportExecuteStatementResult): >+ (WebCore::DatabaseObserver::reportVacuumDatabaseResult): >+ * src/WebDatabase.cpp: >+ (WebKit::WebDatabase::isSyncDatabase): >+ > 2011-11-28 Sheriff Bot <webkit.review.bot@gmail.com> > > Unreviewed, rolling out r101273. >Index: Source/WebKit/chromium/public/WebDatabase.h >=================================================================== >--- Source/WebKit/chromium/public/WebDatabase.h (revision 101272) >+++ Source/WebKit/chromium/public/WebDatabase.h (working copy) >@@ -47,6 +47,7 @@ public: > WEBKIT_EXPORT WebString displayName() const; > WEBKIT_EXPORT unsigned long estimatedSize() const; > WEBKIT_EXPORT WebSecurityOrigin securityOrigin() const; >+ WEBKIT_EXPORT bool isSyncDatabase() const; > > WEBKIT_EXPORT static void setObserver(WebDatabaseObserver*); > WEBKIT_EXPORT static WebDatabaseObserver* observer(); >Index: Source/WebKit/chromium/public/WebDatabaseObserver.h >=================================================================== >--- Source/WebKit/chromium/public/WebDatabaseObserver.h (revision 101272) >+++ Source/WebKit/chromium/public/WebDatabaseObserver.h (working copy) >@@ -39,6 +39,14 @@ public: > virtual void databaseOpened(const WebDatabase&) = 0; > virtual void databaseModified(const WebDatabase&) = 0; > virtual void databaseClosed(const WebDatabase&) = 0; >+ >+ virtual void reportOpenDatabaseResult(const WebDatabase&, int errorSite, int webSqlErrorCode, int sqliteErrorCode) { } >+ virtual void reportChangeVersionResult(const WebDatabase&, int errorSite, int webSqlErrorCode, int sqliteErrorCode) { } >+ virtual void reportStartTransactionResult(const WebDatabase&, int errorSite, int webSqlErrorCode, int sqliteErrorCode) { } >+ virtual void reportCommitTransactionResult(const WebDatabase&, int errorSite, int webSqlErrorCode, int sqliteErrorCode) { } >+ virtual void reportExecuteStatementResult(const WebDatabase&, int errorSite, int webSqlErrorCode, int sqliteErrorCode) { } >+ virtual void reportVacuumDatabaseResult(const WebDatabase&, int sqliteErrorCode) { } >+ > protected: > ~WebDatabaseObserver() {} > }; >Index: Source/WebKit/chromium/src/DatabaseObserver.cpp >=================================================================== >--- Source/WebKit/chromium/src/DatabaseObserver.cpp (revision 101272) >+++ Source/WebKit/chromium/src/DatabaseObserver.cpp (working copy) >@@ -197,6 +197,36 @@ void DatabaseObserver::databaseClosed(Ab > WebDatabase::observer()->databaseClosed(WebDatabase(database)); > } > >+void DatabaseObserver::reportOpenDatabaseResult(AbstractDatabase* database, int errorSite, int webSqlErrorCode, int sqliteErrorCode) >+{ >+ WebDatabase::observer()->reportOpenDatabaseResult(WebDatabase(database), errorSite, webSqlErrorCode, sqliteErrorCode); >+} >+ >+void DatabaseObserver::reportChangeVersionResult(AbstractDatabase* database, int errorSite, int webSqlErrorCode, int sqliteErrorCode) >+{ >+ WebDatabase::observer()->reportChangeVersionResult(WebDatabase(database), errorSite, webSqlErrorCode, sqliteErrorCode); >+} >+ >+void DatabaseObserver::reportStartTransactionResult(AbstractDatabase* database, int errorSite, int webSqlErrorCode, int sqliteErrorCode) >+{ >+ WebDatabase::observer()->reportStartTransactionResult(WebDatabase(database), errorSite, webSqlErrorCode, sqliteErrorCode); >+} >+ >+void DatabaseObserver::reportCommitTransactionResult(AbstractDatabase* database, int errorSite, int webSqlErrorCode, int sqliteErrorCode) >+{ >+ WebDatabase::observer()->reportCommitTransactionResult(WebDatabase(database), errorSite, webSqlErrorCode, sqliteErrorCode); >+} >+ >+void DatabaseObserver::reportExecuteStatementResult(AbstractDatabase* database, int errorSite, int webSqlErrorCode, int sqliteErrorCode) >+{ >+ WebDatabase::observer()->reportExecuteStatementResult(WebDatabase(database), errorSite, webSqlErrorCode, sqliteErrorCode); >+} >+ >+void DatabaseObserver::reportVacuumDatabaseResult(AbstractDatabase* database, int sqliteErrorCode) >+{ >+ WebDatabase::observer()->reportVacuumDatabaseResult(WebDatabase(database), sqliteErrorCode); >+} >+ > } // namespace WebCore > > #endif // ENABLE(SQL_DATABASE) >Index: Source/WebKit/chromium/src/WebDatabase.cpp >=================================================================== >--- Source/WebKit/chromium/src/WebDatabase.cpp (revision 101272) >+++ Source/WebKit/chromium/src/WebDatabase.cpp (working copy) >@@ -82,6 +82,12 @@ WebSecurityOrigin WebDatabase::securityO > return WebSecurityOrigin(m_database->securityOrigin()); > } > >+bool WebDatabase::isSyncDatabase() const >+{ >+ ASSERT(m_database); >+ return m_database->isSyncDatabase(); >+} >+ > void WebDatabase::setObserver(WebDatabaseObserver* observer) > { > databaseObserver = observer;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 73258
:
116830
| 117043