diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/modules/webdatabase/SQLStatementBackend.cpp')
-rw-r--r-- | chromium/third_party/WebKit/Source/modules/webdatabase/SQLStatementBackend.cpp | 57 |
1 files changed, 31 insertions, 26 deletions
diff --git a/chromium/third_party/WebKit/Source/modules/webdatabase/SQLStatementBackend.cpp b/chromium/third_party/WebKit/Source/modules/webdatabase/SQLStatementBackend.cpp index 266be180365..239f404fa5f 100644 --- a/chromium/third_party/WebKit/Source/modules/webdatabase/SQLStatementBackend.cpp +++ b/chromium/third_party/WebKit/Source/modules/webdatabase/SQLStatementBackend.cpp @@ -71,42 +71,50 @@ namespace WebCore { -PassRefPtr<SQLStatementBackend> SQLStatementBackend::create(PassOwnPtr<AbstractSQLStatement> frontend, +PassRefPtrWillBeRawPtr<SQLStatementBackend> SQLStatementBackend::create(PassOwnPtrWillBeRawPtr<AbstractSQLStatement> frontend, const String& statement, const Vector<SQLValue>& arguments, int permissions) { - return adoptRef(new SQLStatementBackend(frontend, statement, arguments, permissions)); + return adoptRefWillBeNoop(new SQLStatementBackend(frontend, statement, arguments, permissions)); } -SQLStatementBackend::SQLStatementBackend(PassOwnPtr<AbstractSQLStatement> frontend, +SQLStatementBackend::SQLStatementBackend(PassOwnPtrWillBeRawPtr<AbstractSQLStatement> frontend, const String& statement, const Vector<SQLValue>& arguments, int permissions) : m_frontend(frontend) , m_statement(statement.isolatedCopy()) , m_arguments(arguments) , m_hasCallback(m_frontend->hasCallback()) , m_hasErrorCallback(m_frontend->hasErrorCallback()) + , m_resultSet(SQLResultSet::create()) , m_permissions(permissions) { m_frontend->setBackend(this); } +void SQLStatementBackend::trace(Visitor* visitor) +{ + visitor->trace(m_frontend); + visitor->trace(m_resultSet); + AbstractSQLStatementBackend::trace(visitor); +} + AbstractSQLStatement* SQLStatementBackend::frontend() { return m_frontend.get(); } -PassRefPtr<SQLError> SQLStatementBackend::sqlError() const +SQLErrorData* SQLStatementBackend::sqlError() const { - return m_error; + return m_error.get(); } -PassRefPtr<SQLResultSet> SQLStatementBackend::sqlResultSet() const +SQLResultSet* SQLStatementBackend::sqlResultSet() const { - return m_resultSet; + return m_resultSet->isValid() ? m_resultSet.get() : 0; } bool SQLStatementBackend::execute(DatabaseBackend* db) { - ASSERT(!m_resultSet); + ASSERT(!m_resultSet->isValid()); // If we're re-running this statement after a quota violation, we need to clear that error now clearFailureDueToQuota(); @@ -126,9 +134,9 @@ bool SQLStatementBackend::execute(DatabaseBackend* db) if (result != SQLResultOk) { WTF_LOG(StorageAPI, "Unable to verify correctness of statement %s - error %i (%s)", m_statement.ascii().data(), result, database->lastErrorMsg()); if (result == SQLResultInterrupt) - m_error = SQLError::create(SQLError::DATABASE_ERR, "could not prepare statement", result, "interrupted"); + m_error = SQLErrorData::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()); + m_error = SQLErrorData::create(SQLError::SYNTAX_ERR, "could not prepare statement", result, database->lastErrorMsg()); db->reportExecuteStatementResult(1, m_error->code(), result); return false; } @@ -137,7 +145,7 @@ bool SQLStatementBackend::execute(DatabaseBackend* db) // If this is the case, they might be trying to do something fishy or malicious if (statement.bindParameterCount() != m_arguments.size()) { WTF_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"); + m_error = SQLErrorData::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; } @@ -152,18 +160,16 @@ bool SQLStatementBackend::execute(DatabaseBackend* db) if (result != SQLResultOk) { WTF_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()); + m_error = SQLErrorData::create(SQLError::DATABASE_ERR, "could not bind value", result, database->lastErrorMsg()); return false; } } - RefPtr<SQLResultSet> resultSet = SQLResultSet::create(); - // Step so we can fetch the column names. result = statement.step(); if (result == SQLResultRow) { int columnCount = statement.columnCount(); - SQLResultSetRowList* rows = resultSet->rows(); + SQLResultSetRowList* rows = m_resultSet->rows(); for (int i = 0; i < columnCount; i++) rows->addColumn(statement.getColumnName(i)); @@ -177,55 +183,54 @@ bool SQLStatementBackend::execute(DatabaseBackend* db) if (result != SQLResultDone) { db->reportExecuteStatementResult(4, SQLError::DATABASE_ERR, result); - m_error = SQLError::create(SQLError::DATABASE_ERR, "could not iterate results", result, database->lastErrorMsg()); + m_error = SQLErrorData::create(SQLError::DATABASE_ERR, "could not iterate results", result, database->lastErrorMsg()); return false; } } else if (result == SQLResultDone) { // Didn't find anything, or was an insert if (db->lastActionWasInsert()) - resultSet->setInsertId(database->lastInsertRowID()); + m_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(db); return false; } else if (result == SQLResultConstraint) { db->reportExecuteStatementResult(6, SQLError::CONSTRAINT_ERR, result); - m_error = SQLError::create(SQLError::CONSTRAINT_ERR, "could not execute statement due to a constaint failure", result, database->lastErrorMsg()); + m_error = SQLErrorData::create(SQLError::CONSTRAINT_ERR, "could not execute statement due to a constaint failure", result, database->lastErrorMsg()); return false; } else { db->reportExecuteStatementResult(5, SQLError::DATABASE_ERR, result); - m_error = SQLError::create(SQLError::DATABASE_ERR, "could not execute statement", result, database->lastErrorMsg()); + m_error = SQLErrorData::create(SQLError::DATABASE_ERR, "could not execute statement", result, database->lastErrorMsg()); return false; } // FIXME: If the spec allows triggers, and we want to be "accurate" in a different way, we'd use // sqlite3_total_changes() here instead of sqlite3_changed, because that includes rows modified from within a trigger // For now, this seems sufficient - resultSet->setRowsAffected(database->lastChanges()); + m_resultSet->setRowsAffected(database->lastChanges()); - m_resultSet = resultSet; db->reportExecuteStatementResult(0, -1, 0); // OK return true; } void SQLStatementBackend::setVersionMismatchedError(DatabaseBackend* database) { - ASSERT(!m_error && !m_resultSet); + ASSERT(!m_error && !m_resultSet->isValid()); 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"); + m_error = SQLErrorData::create(SQLError::VERSION_ERR, "current version of the database and `oldVersion` argument do not match"); } void SQLStatementBackend::setFailureDueToQuota(DatabaseBackend* database) { - ASSERT(!m_error && !m_resultSet); + ASSERT(!m_error && !m_resultSet->isValid()); 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"); + m_error = SQLErrorData::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"); } void SQLStatementBackend::clearFailureDueToQuota() { if (lastExecutionFailedDueToQuota()) - m_error = 0; + m_error = nullptr; } bool SQLStatementBackend::lastExecutionFailedDueToQuota() const |