Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / modules / webdatabase / SQLStatementBackend.cpp
index 47984d3..f1603c5 100644 (file)
@@ -29,7 +29,6 @@
 #include "modules/webdatabase/SQLStatementBackend.h"
 
 #include "platform/Logging.h"
-#include "modules/webdatabase/sqlite/SQLValue.h"
 #include "modules/webdatabase/sqlite/SQLiteDatabase.h"
 #include "modules/webdatabase/sqlite/SQLiteStatement.h"
 #include "modules/webdatabase/AbstractSQLStatement.h"
 
 namespace WebCore {
 
-PassRefPtr<SQLStatementBackend> SQLStatementBackend::create(PassOwnPtr<AbstractSQLStatement> frontend,
+PassRefPtrWillBeRawPtr<SQLStatementBackend> SQLStatementBackend::create(PassOwnPtr<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,
@@ -85,29 +84,36 @@ SQLStatementBackend::SQLStatementBackend(PassOwnPtr<AbstractSQLStatement> fronte
     , 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_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();
@@ -125,11 +131,11 @@ bool SQLStatementBackend::execute(DatabaseBackend* db)
     int result = statement.prepare();
 
     if (result != SQLResultOk) {
-        LOG(StorageAPI, "Unable to verify correctness of statement %s - error %i (%s)", m_statement.ascii().data(), result, database->lastErrorMsg());
+        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,8 +143,8 @@ bool SQLStatementBackend::execute(DatabaseBackend* db)
     // FIXME: If the statement uses the ?### syntax supported by sqlite, the bind parameter count is very likely off from the number of question marks.
     // If this is the case, they might be trying to do something fishy or malicious
     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");
+        WTF_LOG(StorageAPI, "Bind parameter count doesn't match number of question marks");
+        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;
     }
@@ -151,20 +157,18 @@ bool SQLStatementBackend::execute(DatabaseBackend* db)
         }
 
         if (result != SQLResultOk) {
-            LOG(StorageAPI, "Failed to bind value index %i to statement for query '%s'", i + 1, m_statement.ascii().data());
+            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));
@@ -178,62 +182,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::setDatabaseDeletedError(DatabaseBackend* 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 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