Changeset 143090 in webkit
- Timestamp:
- Feb 15, 2013 7:03:50 PM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 17 edited
- 2 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/CMakeLists.txt
r142957 r143090 958 958 Modules/webdatabase/SQLResultSetRowList.cpp 959 959 Modules/webdatabase/SQLStatement.cpp 960 Modules/webdatabase/SQLStatementBackend.cpp 960 961 Modules/webdatabase/SQLStatementSync.cpp 961 962 Modules/webdatabase/SQLTransaction.cpp -
trunk/Source/WebCore/ChangeLog
r143089 r143090 1 2013-02-15 Mark Lam <mark.lam@apple.com> 2 3 Split SQLStatement work between the frontend and backend. 4 https://bugs.webkit.org/show_bug.cgi?id=104751. 5 6 Reviewed by Geoffrey Garen. 7 8 This is part of the webdatabase refactoring for webkit2. 9 10 1. Copied SQLTransaction to SQLTransactionBackend, and then reduce the 11 2 to only handle frontend and backend work respectively. 12 13 2. Changed how statements are created. 14 15 - SQLTransaction::executeSQL() first creates a SQLStatement frontend 16 which encapsulates the 2 script callbacks. It then passes the 17 SQLStatement to the backend database to create the 18 SQLStatementBackend. 19 - The SQLStatementBackend manages all sqlite work. 20 21 3. Remove the Database::reportExecuteStatementResult() wrapper because 22 it is only needed in the backend now. 23 24 4. Added new files to the build / project files. 25 26 5. Updated / added comments about how the SQLStatement life-cycle works. 27 28 No new tests. 29 30 * CMakeLists.txt: 31 * GNUmakefile.list.am: 32 * Modules/webdatabase/Database.cpp: 33 * Modules/webdatabase/Database.h: 34 (Database): 35 (WebCore::Database::reportCommitTransactionResult): 36 * Modules/webdatabase/DatabaseBackend.h: 37 (DatabaseBackend): 38 * Modules/webdatabase/SQLStatement.cpp: 39 (WebCore::SQLStatement::create): 40 (WebCore::SQLStatement::SQLStatement): 41 (WebCore::SQLStatement::setBackend): 42 (WebCore::SQLStatement::hasCallback): 43 (WebCore::SQLStatement::hasErrorCallback): 44 (WebCore::SQLStatement::performCallback): 45 * Modules/webdatabase/SQLStatement.h: 46 (SQLStatement): 47 * Modules/webdatabase/SQLStatementBackend.cpp: Copied from Source/WebCore/Modules/webdatabase/SQLStatement.cpp. 48 (WebCore::SQLStatementBackend::create): 49 (WebCore::SQLStatementBackend::SQLStatementBackend): 50 (WebCore::SQLStatementBackend::frontend): 51 (WebCore::SQLStatementBackend::sqlError): 52 (WebCore::SQLStatementBackend::sqlResultSet): 53 (WebCore::SQLStatementBackend::execute): 54 (WebCore::SQLStatementBackend::setDatabaseDeletedError): 55 (WebCore::SQLStatementBackend::setVersionMismatchedError): 56 (WebCore::SQLStatementBackend::setFailureDueToQuota): 57 (WebCore::SQLStatementBackend::clearFailureDueToQuota): 58 (WebCore::SQLStatementBackend::lastExecutionFailedDueToQuota): 59 * Modules/webdatabase/SQLStatementBackend.h: Copied from Source/WebCore/Modules/webdatabase/SQLStatement.h. 60 (SQLStatementBackend): 61 (WebCore::SQLStatementBackend::hasStatementCallback): 62 (WebCore::SQLStatementBackend::hasStatementErrorCallback): 63 * Modules/webdatabase/SQLTransaction.cpp: 64 (WebCore::SQLTransaction::deliverStatementCallback): 65 (WebCore::SQLTransaction::deliverQuotaIncreaseCallback): 66 (WebCore::SQLTransaction::executeSQL): 67 * Modules/webdatabase/SQLTransactionBackend.cpp: 68 (WebCore::SQLTransactionBackend::doCleanup): 69 (WebCore::SQLTransactionBackend::currentStatement): 70 (WebCore::SQLTransactionBackend::enqueueStatementBackend): 71 (WebCore::SQLTransactionBackend::executeSQL): 72 (WebCore::SQLTransactionBackend::runStatements): 73 (WebCore::SQLTransactionBackend::getNextStatement): 74 (WebCore::SQLTransactionBackend::runCurrentStatementAndGetNextState): 75 (WebCore::SQLTransactionBackend::nextStateForCurrentStatementError): 76 * Modules/webdatabase/SQLTransactionBackend.h: 77 (SQLTransactionBackend): 78 * Target.pri: 79 * WebCore.gypi: 80 * WebCore.vcproj/WebCore.vcproj: 81 * WebCore.vcxproj/WebCore.vcxproj: 82 * WebCore.vcxproj/WebCore.vcxproj.filters: 83 * WebCore.xcodeproj/project.pbxproj: 84 1 85 2013-02-15 Elliott Sprehn <esprehn@chromium.org> 2 86 -
trunk/Source/WebCore/GNUmakefile.list.am
r142957 r143090 2153 2153 Source/WebCore/Modules/webdatabase/SQLStatementCallback.h \ 2154 2154 Source/WebCore/Modules/webdatabase/SQLStatement.cpp \ 2155 Source/WebCore/Modules/webdatabase/SQLStatement.h \ 2156 Source/WebCore/Modules/webdatabase/SQLStatementBackend.cpp \ 2157 Source/WebCore/Modules/webdatabase/SQLStatementBackend.h \ 2155 2158 Source/WebCore/Modules/webdatabase/SQLStatementErrorCallback.h \ 2156 Source/WebCore/Modules/webdatabase/SQLStatement.h \2157 2159 Source/WebCore/Modules/webdatabase/SQLStatementSync.cpp \ 2158 2160 Source/WebCore/Modules/webdatabase/SQLStatementSync.h \ -
trunk/Source/WebCore/Modules/webdatabase/Database.cpp
r142921 r143090 316 316 } 317 317 318 void Database::reportExecuteStatementResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode)319 {320 backend()->reportExecuteStatementResult(errorSite, webSqlErrorCode, sqliteErrorCode);321 }322 318 #endif 323 319 -
trunk/Source/WebCore/Modules/webdatabase/Database.h
r142921 r143090 94 94 void reportStartTransactionResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode); 95 95 void reportCommitTransactionResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode); 96 void reportExecuteStatementResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode);97 96 #else 98 97 void reportStartTransactionResult(int, int, int) { } 99 98 void reportCommitTransactionResult(int, int, int) { } 100 void reportExecuteStatementResult(int, int, int) { }101 99 #endif 102 100 -
trunk/Source/WebCore/Modules/webdatabase/DatabaseBackend.h
r142921 r143090 94 94 protected: 95 95 friend class ChangeVersionWrapper; 96 friend class SQLStatement ;96 friend class SQLStatementBackend; 97 97 friend class SQLStatementSync; 98 98 friend class SQLTransactionBackend; -
trunk/Source/WebCore/Modules/webdatabase/SQLStatement.cpp
r129886 r143090 1 1 /* 2 * Copyright (C) 2007 Apple Inc. All rights reserved.2 * Copyright (C) 2007, 2013 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 31 31 #if ENABLE(SQL_DATABASE) 32 32 33 #include "AbstractDatabaseServer.h" 33 34 #include "Database.h" 35 #include "DatabaseManager.h" 34 36 #include "Logging.h" 35 37 #include "SQLError.h" 36 #include "SQLiteDatabase.h" 37 #include "SQLiteStatement.h" 38 #include "SQLStatementBackend.h" 38 39 #include "SQLStatementCallback.h" 39 40 #include "SQLStatementErrorCallback.h" 40 41 #include "SQLTransaction.h" 41 42 #include "SQLValue.h" 43 #include "SQLiteDatabase.h" 44 #include "SQLiteStatement.h" 42 45 #include <wtf/text/CString.h> 43 46 44 47 namespace WebCore { 45 48 46 PassRefPtr<SQLStatement> SQLStatement::create(Database* database, const String& statement, const Vector<SQLValue>& arguments, PassRefPtr<SQLStatementCallback> callback, PassRefPtr<SQLStatementErrorCallback> errorCallback, int permissions) 49 PassOwnPtr<SQLStatement> SQLStatement::create(Database* database, 50 PassRefPtr<SQLStatementCallback> callback, PassRefPtr<SQLStatementErrorCallback> errorCallback) 47 51 { 48 return adopt Ref(new SQLStatement(database, statement, arguments, callback, errorCallback, permissions));52 return adoptPtr(new SQLStatement(database, callback, errorCallback)); 49 53 } 50 54 51 SQLStatement::SQLStatement(Database* database, const String& statement, const Vector<SQLValue>& arguments, PassRefPtr<SQLStatementCallback> callback, PassRefPtr<SQLStatementErrorCallback> errorCallback, int permissions) 52 : m_statement(statement.isolatedCopy()) 53 , m_arguments(arguments) 54 , m_statementCallbackWrapper(callback, database->scriptExecutionContext()) 55 SQLStatement::SQLStatement(Database* database, PassRefPtr<SQLStatementCallback> callback, 56 PassRefPtr<SQLStatementErrorCallback> errorCallback) 57 : m_statementCallbackWrapper(callback, database->scriptExecutionContext()) 55 58 , m_statementErrorCallbackWrapper(errorCallback, database->scriptExecutionContext()) 56 , m_permissions(permissions)57 59 { 58 60 } 59 61 60 bool SQLStatement::execute(Database* db)62 void SQLStatement::setBackend(SQLStatementBackend* backend) 61 63 { 62 ASSERT(!m_resultSet); 63 64 // If we're re-running this statement after a quota violation, we need to clear that error now 65 clearFailureDueToQuota(); 66 67 // This transaction might have been marked bad while it was being set up on the main thread, 68 // so if there is still an error, return false. 69 if (m_error) 70 return false; 71 72 db->setAuthorizerPermissions(m_permissions); 73 74 SQLiteDatabase* database = &db->sqliteDatabase(); 75 76 SQLiteStatement statement(*database, m_statement); 77 int result = statement.prepare(); 78 79 if (result != SQLResultOk) { 80 LOG(StorageAPI, "Unable to verify correctness of statement %s - error %i (%s)", m_statement.ascii().data(), result, database->lastErrorMsg()); 81 if (result == SQLResultInterrupt) 82 m_error = SQLError::create(SQLError::DATABASE_ERR, "could not prepare statement", result, "interrupted"); 83 else 84 m_error = SQLError::create(SQLError::SYNTAX_ERR, "could not prepare statement", result, database->lastErrorMsg()); 85 db->reportExecuteStatementResult(1, m_error->code(), result); 86 return false; 87 } 88 89 // FIXME: If the statement uses the ?### syntax supported by sqlite, the bind parameter count is very likely off from the number of question marks. 90 // If this is the case, they might be trying to do something fishy or malicious 91 if (statement.bindParameterCount() != m_arguments.size()) { 92 LOG(StorageAPI, "Bind parameter count doesn't match number of question marks"); 93 m_error = SQLError::create(db->isInterrupted() ? SQLError::DATABASE_ERR : SQLError::SYNTAX_ERR, "number of '?'s in statement string does not match argument count"); 94 db->reportExecuteStatementResult(2, m_error->code(), 0); 95 return false; 96 } 97 98 for (unsigned i = 0; i < m_arguments.size(); ++i) { 99 result = statement.bindValue(i + 1, m_arguments[i]); 100 if (result == SQLResultFull) { 101 setFailureDueToQuota(db); 102 return false; 103 } 104 105 if (result != SQLResultOk) { 106 LOG(StorageAPI, "Failed to bind value index %i to statement for query '%s'", i + 1, m_statement.ascii().data()); 107 db->reportExecuteStatementResult(3, SQLError::DATABASE_ERR, result); 108 m_error = SQLError::create(SQLError::DATABASE_ERR, "could not bind value", result, database->lastErrorMsg()); 109 return false; 110 } 111 } 112 113 RefPtr<SQLResultSet> resultSet = SQLResultSet::create(); 114 115 // Step so we can fetch the column names. 116 result = statement.step(); 117 if (result == SQLResultRow) { 118 int columnCount = statement.columnCount(); 119 SQLResultSetRowList* rows = resultSet->rows(); 120 121 for (int i = 0; i < columnCount; i++) 122 rows->addColumn(statement.getColumnName(i)); 123 124 do { 125 for (int i = 0; i < columnCount; i++) 126 rows->addResult(statement.getColumnValue(i)); 127 128 result = statement.step(); 129 } while (result == SQLResultRow); 130 131 if (result != SQLResultDone) { 132 db->reportExecuteStatementResult(4, SQLError::DATABASE_ERR, result); 133 m_error = SQLError::create(SQLError::DATABASE_ERR, "could not iterate results", result, database->lastErrorMsg()); 134 return false; 135 } 136 } else if (result == SQLResultDone) { 137 // Didn't find anything, or was an insert 138 if (db->lastActionWasInsert()) 139 resultSet->setInsertId(database->lastInsertRowID()); 140 } else if (result == SQLResultFull) { 141 // Return the Quota error - the delegate will be asked for more space and this statement might be re-run 142 setFailureDueToQuota(db); 143 return false; 144 } else if (result == SQLResultConstraint) { 145 db->reportExecuteStatementResult(6, SQLError::CONSTRAINT_ERR, result); 146 m_error = SQLError::create(SQLError::CONSTRAINT_ERR, "could not execute statement due to a constaint failure", result, database->lastErrorMsg()); 147 return false; 148 } else { 149 db->reportExecuteStatementResult(5, SQLError::DATABASE_ERR, result); 150 m_error = SQLError::create(SQLError::DATABASE_ERR, "could not execute statement", result, database->lastErrorMsg()); 151 return false; 152 } 153 154 // FIXME: If the spec allows triggers, and we want to be "accurate" in a different way, we'd use 155 // sqlite3_total_changes() here instead of sqlite3_changed, because that includes rows modified from within a trigger 156 // For now, this seems sufficient 157 resultSet->setRowsAffected(database->lastChanges()); 158 159 m_resultSet = resultSet; 160 db->reportExecuteStatementResult(0, -1, 0); // OK 161 return true; 64 m_backend = backend; 162 65 } 163 66 164 void SQLStatement::setDatabaseDeletedError(Database* database)67 bool SQLStatement::hasCallback() 165 68 { 166 ASSERT(!m_error && !m_resultSet); 167 database->reportExecuteStatementResult(6, SQLError::UNKNOWN_ERR, 0); 168 m_error = SQLError::create(SQLError::UNKNOWN_ERR, "unable to execute statement, because the user deleted the database"); 69 return m_statementCallbackWrapper.hasCallback(); 169 70 } 170 71 171 void SQLStatement::setVersionMismatchedError(Database* database)72 bool SQLStatement::hasErrorCallback() 172 73 { 173 ASSERT(!m_error && !m_resultSet); 174 database->reportExecuteStatementResult(7, SQLError::VERSION_ERR, 0); 175 m_error = SQLError::create(SQLError::VERSION_ERR, "current version of the database and `oldVersion` argument do not match"); 74 return m_statementErrorCallbackWrapper.hasCallback(); 176 75 } 177 76 … … 179 78 { 180 79 ASSERT(transaction); 80 ASSERT(m_backend); 181 81 182 82 bool callbackError = false; … … 184 84 RefPtr<SQLStatementCallback> callback = m_statementCallbackWrapper.unwrap(); 185 85 RefPtr<SQLStatementErrorCallback> errorCallback = m_statementErrorCallbackWrapper.unwrap(); 86 RefPtr<SQLError> error = m_backend->sqlError(); 186 87 187 88 // Call the appropriate statement callback and track if it resulted in an error, 188 89 // because then we need to jump to the transaction error callback. 189 if ( m_error) {90 if (error) { 190 91 ASSERT(errorCallback); 191 callbackError = errorCallback->handleEvent(transaction, m_error.get()); 192 } else if (callback) 193 callbackError = !callback->handleEvent(transaction, m_resultSet.get()); 92 callbackError = errorCallback->handleEvent(transaction, error.get()); 93 } else if (callback) { 94 RefPtr<SQLResultSet> resultSet = m_backend->sqlResultSet(); 95 callbackError = !callback->handleEvent(transaction, resultSet.get()); 96 } 194 97 195 98 return callbackError; 196 }197 198 void SQLStatement::setFailureDueToQuota(Database* database)199 {200 ASSERT(!m_error && !m_resultSet);201 database->reportExecuteStatementResult(8, SQLError::QUOTA_ERR, 0);202 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");203 }204 205 void SQLStatement::clearFailureDueToQuota()206 {207 if (lastExecutionFailedDueToQuota())208 m_error = 0;209 }210 211 bool SQLStatement::lastExecutionFailedDueToQuota() const212 {213 return m_error && m_error->code() == SQLError::QUOTA_ERR;214 99 } 215 100 -
trunk/Source/WebCore/Modules/webdatabase/SQLStatement.h
r127757 r143090 1 1 /* 2 * Copyright (C) 2007 Apple Inc. All rights reserved.2 * Copyright (C) 2007, 2013 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 42 42 class Database; 43 43 class SQLError; 44 class SQLStatementBackend; 44 45 class SQLStatementCallback; 45 46 class SQLStatementErrorCallback; 46 47 class SQLTransaction; 47 48 48 class SQLStatement : public ThreadSafeRefCounted<SQLStatement>{49 class SQLStatement { 49 50 public: 50 static PassRefPtr<SQLStatement> create(Database*, const String&, const Vector<SQLValue>&, PassRefPtr<SQLStatementCallback>, PassRefPtr<SQLStatementErrorCallback>, int permissions); 51 52 bool execute(Database*); 53 bool lastExecutionFailedDueToQuota() const; 54 55 bool hasStatementCallback() const { return m_statementCallbackWrapper.hasCallback(); } 56 bool hasStatementErrorCallback() const { return m_statementErrorCallbackWrapper.hasCallback(); } 57 58 void setDatabaseDeletedError(Database*); 59 void setVersionMismatchedError(Database*); 51 static PassOwnPtr<SQLStatement> create(Database*, 52 PassRefPtr<SQLStatementCallback>, PassRefPtr<SQLStatementErrorCallback>); 60 53 61 54 bool performCallback(SQLTransaction*); 62 55 63 SQLError* sqlError() const { return m_error.get(); } 56 void setBackend(SQLStatementBackend*); 57 58 bool hasCallback(); 59 bool hasErrorCallback(); 60 64 61 private: 65 SQLStatement(Database*, const String& statement, const Vector<SQLValue>& arguments, PassRefPtr<SQLStatementCallback>, PassRefPtr<SQLStatementErrorCallback>, int permissions);62 SQLStatement(Database*, PassRefPtr<SQLStatementCallback>, PassRefPtr<SQLStatementErrorCallback>); 66 63 67 void setFailureDueToQuota(Database*); 68 void clearFailureDueToQuota(); 64 // The SQLStatementBackend owns the SQLStatement. Hence, the backend is 65 // guaranteed to be outlive the SQLStatement, and it is safe for us to refer 66 // to the backend using a raw pointer here. 67 SQLStatementBackend* m_backend; 69 68 70 String m_statement;71 Vector<SQLValue> m_arguments;72 69 SQLCallbackWrapper<SQLStatementCallback> m_statementCallbackWrapper; 73 70 SQLCallbackWrapper<SQLStatementErrorCallback> m_statementErrorCallbackWrapper; 74 75 RefPtr<SQLError> m_error;76 RefPtr<SQLResultSet> m_resultSet;77 78 int m_permissions;79 71 }; 80 72 -
trunk/Source/WebCore/Modules/webdatabase/SQLStatementBackend.cpp
r142922 r143090 1 1 /* 2 * Copyright (C) 2007 Apple Inc. All rights reserved.2 * Copyright (C) 2007, 2013 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 27 27 */ 28 28 #include "config.h" 29 #include "SQLStatement .h"29 #include "SQLStatementBackend.h" 30 30 31 31 #if ENABLE(SQL_DATABASE) 32 32 33 #include "Database .h"33 #include "DatabaseBackendAsync.h" 34 34 #include "Logging.h" 35 35 #include "SQLError.h" 36 #include "SQLStatement.h" 37 #include "SQLStatementCallback.h" 38 #include "SQLStatementErrorCallback.h" 39 #include "SQLValue.h" 36 40 #include "SQLiteDatabase.h" 37 41 #include "SQLiteStatement.h" 38 #include "SQLStatementCallback.h"39 #include "SQLStatementErrorCallback.h"40 #include "SQLTransaction.h"41 #include "SQLValue.h"42 42 #include <wtf/text/CString.h> 43 43 44 45 // The Life-Cycle of a SQLStatement i.e. Who's keeping the SQLStatement alive? 46 // ========================================================================== 47 // The RefPtr chain goes something like this: 48 // 49 // At birth (in SQLTransactionBackend::executeSQL()): 50 // ================================================= 51 // SQLTransactionBackend // Deque<RefPtr<SQLStatementBackend> > m_statementQueue points to ... 52 // --> SQLStatementBackend // OwnPtr<SQLStatement> m_frontend points to ... 53 // --> SQLStatement 54 // 55 // After grabbing the statement for execution (in SQLTransactionBackend::getNextStatement()): 56 // ========================================================================================= 57 // SQLTransactionBackend // RefPtr<SQLStatementBackend> m_currentStatementBackend points to ... 58 // --> SQLStatementBackend // OwnPtr<SQLStatement> m_frontend points to ... 59 // --> SQLStatement 60 // 61 // Then we execute the statement in SQLTransactionBackend::runCurrentStatementAndGetNextState(). 62 // And we callback to the script in SQLTransaction::deliverStatementCallback() if 63 // necessary. 64 // - Inside SQLTransaction::deliverStatementCallback(), we operate on a raw SQLStatement*. 65 // This pointer is valid because it is owned by SQLTransactionBackend's 66 // SQLTransactionBackend::m_currentStatementBackend. 67 // 68 // After we're done executing the statement (in SQLTransactionBackend::getNextStatement()): 69 // ======================================================================================= 70 // When we're done executing, we'll grab the next statement. But before we 71 // do that, getNextStatement() nullify SQLTransactionBackend::m_currentStatementBackend. 72 // This will trigger the deletion of the SQLStatementBackend and SQLStatement. 73 // 74 // Note: unlike with SQLTransaction, there is no JS representation of SQLStatement. 75 // Hence, there is no GC dependency at play here. 76 44 77 namespace WebCore { 45 78 46 PassRefPtr<SQLStatement> SQLStatement::create(Database* database, const String& statement, const Vector<SQLValue>& arguments, PassRefPtr<SQLStatementCallback> callback, PassRefPtr<SQLStatementErrorCallback> errorCallback, int permissions) 47 { 48 return adoptRef(new SQLStatement(database, statement, arguments, callback, errorCallback, permissions)); 49 } 50 51 SQLStatement::SQLStatement(Database* database, const String& statement, const Vector<SQLValue>& arguments, PassRefPtr<SQLStatementCallback> callback, PassRefPtr<SQLStatementErrorCallback> errorCallback, int permissions) 52 : m_statement(statement.isolatedCopy()) 79 PassRefPtr<SQLStatementBackend> SQLStatementBackend::create(PassOwnPtr<SQLStatement> frontend, 80 const String& statement, const Vector<SQLValue>& arguments, int permissions) 81 { 82 return adoptRef(new SQLStatementBackend(frontend, statement, arguments, permissions)); 83 } 84 85 SQLStatementBackend::SQLStatementBackend(PassOwnPtr<SQLStatement> frontend, 86 const String& statement, const Vector<SQLValue>& arguments, int permissions) 87 : m_frontend(frontend) 88 , m_statement(statement.isolatedCopy()) 53 89 , m_arguments(arguments) 54 , m_ statementCallbackWrapper(callback, database->scriptExecutionContext())55 , m_ statementErrorCallbackWrapper(errorCallback, database->scriptExecutionContext())90 , m_hasCallback(m_frontend->hasCallback()) 91 , m_hasErrorCallback(m_frontend->hasErrorCallback()) 56 92 , m_permissions(permissions) 57 93 { 58 } 59 60 bool SQLStatement::execute(Database* db) 94 m_frontend->setBackend(this); 95 } 96 97 SQLStatement* SQLStatementBackend::frontend() 98 { 99 return m_frontend.get(); 100 } 101 102 PassRefPtr<SQLError> SQLStatementBackend::sqlError() const 103 { 104 return m_error; 105 } 106 107 PassRefPtr<SQLResultSet> SQLStatementBackend::sqlResultSet() const 108 { 109 return m_resultSet; 110 } 111 112 bool SQLStatementBackend::execute(DatabaseBackendAsync* db) 61 113 { 62 114 ASSERT(!m_resultSet); … … 87 139 } 88 140 89 // FIXME: 141 // FIXME: If the statement uses the ?### syntax supported by sqlite, the bind parameter count is very likely off from the number of question marks. 90 142 // If this is the case, they might be trying to do something fishy or malicious 91 143 if (statement.bindParameterCount() != m_arguments.size()) { … … 162 214 } 163 215 164 void SQLStatement ::setDatabaseDeletedError(Database* database)216 void SQLStatementBackend::setDatabaseDeletedError(DatabaseBackendAsync* database) 165 217 { 166 218 ASSERT(!m_error && !m_resultSet); … … 169 221 } 170 222 171 void SQLStatement ::setVersionMismatchedError(Database* database)223 void SQLStatementBackend::setVersionMismatchedError(DatabaseBackendAsync* database) 172 224 { 173 225 ASSERT(!m_error && !m_resultSet); … … 176 228 } 177 229 178 bool SQLStatement::performCallback(SQLTransaction* transaction) 179 { 180 ASSERT(transaction); 181 182 bool callbackError = false; 183 184 RefPtr<SQLStatementCallback> callback = m_statementCallbackWrapper.unwrap(); 185 RefPtr<SQLStatementErrorCallback> errorCallback = m_statementErrorCallbackWrapper.unwrap(); 186 187 // Call the appropriate statement callback and track if it resulted in an error, 188 // because then we need to jump to the transaction error callback. 189 if (m_error) { 190 ASSERT(errorCallback); 191 callbackError = errorCallback->handleEvent(transaction, m_error.get()); 192 } else if (callback) 193 callbackError = !callback->handleEvent(transaction, m_resultSet.get()); 194 195 return callbackError; 196 } 197 198 void SQLStatement::setFailureDueToQuota(Database* database) 230 void SQLStatementBackend::setFailureDueToQuota(DatabaseBackendAsync* database) 199 231 { 200 232 ASSERT(!m_error && !m_resultSet); … … 203 235 } 204 236 205 void SQLStatement ::clearFailureDueToQuota()237 void SQLStatementBackend::clearFailureDueToQuota() 206 238 { 207 239 if (lastExecutionFailedDueToQuota()) … … 209 241 } 210 242 211 bool SQLStatement ::lastExecutionFailedDueToQuota() const243 bool SQLStatementBackend::lastExecutionFailedDueToQuota() const 212 244 { 213 245 return m_error && m_error->code() == SQLError::QUOTA_ERR; -
trunk/Source/WebCore/Modules/webdatabase/SQLStatementBackend.h
r142922 r143090 1 1 /* 2 * Copyright (C) 2007 Apple Inc. All rights reserved.2 * Copyright (C) 2007, 2013 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 #ifndef SQLStatement _h29 #define SQLStatement _h28 #ifndef SQLStatementBackend_h 29 #define SQLStatementBackend_h 30 30 31 31 #if ENABLE(SQL_DATABASE) 32 32 33 #include "SQLCallbackWrapper.h"34 33 #include "SQLResultSet.h" 35 34 #include "SQLValue.h" … … 40 39 namespace WebCore { 41 40 42 class Database ;41 class DatabaseBackendAsync; 43 42 class SQLError; 44 class SQLStatementCallback; 45 class SQLStatementErrorCallback; 46 class SQLTransaction; 43 class SQLStatement; 44 class SQLTransactionBackend; 47 45 48 class SQLStatement : public ThreadSafeRefCounted<SQLStatement> {46 class SQLStatementBackend : public ThreadSafeRefCounted<SQLStatementBackend> { 49 47 public: 50 static PassRefPtr<SQLStatement> create(Database*, const String&, const Vector<SQLValue>&, PassRefPtr<SQLStatementCallback>, PassRefPtr<SQLStatementErrorCallback>, int permissions); 48 static PassRefPtr<SQLStatementBackend> create(PassOwnPtr<SQLStatement>, 49 const String& sqlStatement, const Vector<SQLValue>& arguments, int permissions); 51 50 52 bool execute(Database *);51 bool execute(DatabaseBackendAsync*); 53 52 bool lastExecutionFailedDueToQuota() const; 54 53 55 bool hasStatementCallback() const { return m_ statementCallbackWrapper.hasCallback(); }56 bool hasStatementErrorCallback() const { return m_ statementErrorCallbackWrapper.hasCallback(); }54 bool hasStatementCallback() const { return m_hasCallback; } 55 bool hasStatementErrorCallback() const { return m_hasErrorCallback; } 57 56 58 void setDatabaseDeletedError(Database *);59 void setVersionMismatchedError(Database *);57 void setDatabaseDeletedError(DatabaseBackendAsync*); 58 void setVersionMismatchedError(DatabaseBackendAsync*); 60 59 61 bool performCallback(SQLTransaction*); 60 SQLStatement* frontend(); 61 PassRefPtr<SQLError> sqlError() const; 62 PassRefPtr<SQLResultSet> sqlResultSet() const; 62 63 63 SQLError* sqlError() const { return m_error.get(); }64 64 private: 65 SQLStatement(Database*, const String& statement, const Vector<SQLValue>& arguments, PassRefPtr<SQLStatementCallback>, PassRefPtr<SQLStatementErrorCallback>, int permissions); 65 SQLStatementBackend(PassOwnPtr<SQLStatement>, const String& statement, 66 const Vector<SQLValue>& arguments, int permissions); 66 67 67 void setFailureDueToQuota(Database *);68 void setFailureDueToQuota(DatabaseBackendAsync*); 68 69 void clearFailureDueToQuota(); 69 70 71 OwnPtr<SQLStatement> m_frontend; 70 72 String m_statement; 71 73 Vector<SQLValue> m_arguments; 72 SQLCallbackWrapper<SQLStatementCallback> m_statementCallbackWrapper;73 SQLCallbackWrapper<SQLStatementErrorCallback> m_statementErrorCallbackWrapper;74 bool m_hasCallback; 75 bool m_hasErrorCallback; 74 76 75 77 RefPtr<SQLError> m_error; … … 83 85 #endif // ENABLE(SQL_DATABASE) 84 86 85 #endif // SQLStatement _h87 #endif // SQLStatementBackend_h -
trunk/Source/WebCore/Modules/webdatabase/SQLTransaction.cpp
r142921 r143090 171 171 SQLTransactionState SQLTransaction::deliverStatementCallback() 172 172 { 173 ASSERT(m_backend->m_currentStatement);174 175 173 // Spec 4.3.2.6.6 and 4.3.2.6.3: If the statement callback went wrong, jump to the transaction error callback 176 174 // Otherwise, continue to loop through the statement queue 177 175 m_executeSqlAllowed = true; 178 bool result = m_backend->m_currentStatement->performCallback(this); 176 177 SQLStatement* currentStatement = m_backend->currentStatement(); 178 ASSERT(currentStatement); 179 180 bool result = currentStatement->performCallback(this); 181 179 182 m_executeSqlAllowed = false; 180 183 … … 189 192 SQLTransactionState SQLTransaction::deliverQuotaIncreaseCallback() 190 193 { 191 ASSERT(m_backend-> m_currentStatement);194 ASSERT(m_backend->currentStatement()); 192 195 193 196 bool shouldRetryCurrentStatement = m_database->transactionClient()->didExceedQuota(database()); … … 256 259 permissions |= DatabaseAuthorizer::ReadOnlyMask; 257 260 258 RefPtr<SQLStatement> statement = SQLStatement::create(m_database.get(), sqlStatement, arguments, callback, callbackError, permissions); 259 260 if (m_database->deleted()) 261 statement->setDatabaseDeletedError(m_database.get()); 262 263 m_backend->enqueueStatement(statement); 261 OwnPtr<SQLStatement> statement = SQLStatement::create(m_database.get(), callback, callbackError); 262 m_backend->executeSQL(statement.release(), sqlStatement, arguments, permissions); 264 263 } 265 264 -
trunk/Source/WebCore/Modules/webdatabase/SQLTransactionBackend.cpp
r142921 r143090 34 34 #include "Database.h" 35 35 #include "DatabaseAuthorizer.h" 36 #include "DatabaseBackendAsync.h" 36 37 #include "DatabaseBackendContext.h" 37 38 #include "DatabaseThread.h" … … 40 41 #include "SQLError.h" 41 42 #include "SQLStatement.h" 43 #include "SQLStatementBackend.h" 42 44 #include "SQLStatementCallback.h" // FIXME: remove when SQLStatement has been refactored. 43 45 #include "SQLStatementErrorCallback.h" // FIXME: remove when SQLStatement has been refactored. … … 231 233 232 234 233 // The Life-Cycle of a SQLTransaction i.e. Who's keeping the SQLTransaction Alive?234 // ============================================================================= 235 // The Life-Cycle of a SQLTransaction i.e. Who's keeping the SQLTransaction alive? 236 // ============================================================================== 235 237 // The RefPtr chain goes something like this: 236 238 // 237 239 // At birth (in DatabaseBackendAsync::runTransaction()): 238 240 // ==================================================== 239 // DatabaseBackendAsync // inDeque<RefPtr<SQLTransactionBackend> > m_transactionQueue points to ...240 // --> SQLTransactionBackend // inRefPtr<SQLTransaction> m_frontend points to ...241 // --> SQLTransaction // inRefPtr<SQLTransactionBackend> m_backend points to ...241 // DatabaseBackendAsync // Deque<RefPtr<SQLTransactionBackend> > m_transactionQueue points to ... 242 // --> SQLTransactionBackend // RefPtr<SQLTransaction> m_frontend points to ... 243 // --> SQLTransaction // RefPtr<SQLTransactionBackend> m_backend points to ... 242 244 // --> SQLTransactionBackend // which is a circular reference. 243 245 // … … 250 252 // After scheduling the transaction with the DatabaseThread (DatabaseBackendAsync::scheduleTransaction()): 251 253 // ====================================================================================================== 252 // DatabaseThread // inMessageQueue<DatabaseTask> m_queue points to ...253 // --> DatabaseTransactionTask // inRefPtr<SQLTransactionBackend> m_transaction points to ...254 // --> SQLTransactionBackend // inRefPtr<SQLTransaction> m_frontend points to ...255 // --> SQLTransaction // inRefPtr<SQLTransactionBackend> m_backend points to ...254 // DatabaseThread // MessageQueue<DatabaseTask> m_queue points to ... 255 // --> DatabaseTransactionTask // RefPtr<SQLTransactionBackend> m_transaction points to ... 256 // --> SQLTransactionBackend // RefPtr<SQLTransaction> m_frontend points to ... 257 // --> SQLTransaction // RefPtr<SQLTransactionBackend> m_backend points to ... 256 258 // --> SQLTransactionBackend // which is a circular reference. 257 259 // … … 259 261 // ==================================================================== 260 262 // OwnPtr<DatabaseTask> task; // points to ... 261 // --> DatabaseTransactionTask // inRefPtr<SQLTransactionBackend> m_transaction points to ...262 // --> SQLTransactionBackend // in:RefPtr<SQLTransaction> m_frontend;263 // --> SQLTransaction // inRefPtr<SQLTransactionBackend> m_backend points to ...263 // --> DatabaseTransactionTask // RefPtr<SQLTransactionBackend> m_transaction points to ... 264 // --> SQLTransactionBackend // RefPtr<SQLTransaction> m_frontend; 265 // --> SQLTransaction // RefPtr<SQLTransactionBackend> m_backend points to ... 264 266 // --> SQLTransactionBackend // which is a circular reference. 265 267 // … … 371 373 // we've already shut down the transaction. 372 374 373 m_currentStatement = 0;375 m_currentStatementBackend = 0; 374 376 m_wrapper = 0; 375 377 m_transactionError = 0; 378 } 379 380 SQLStatement* SQLTransactionBackend::currentStatement() 381 { 382 return m_currentStatementBackend->frontend(); 376 383 } 377 384 … … 411 418 } 412 419 413 void SQLTransactionBackend::enqueueStatement (PassRefPtr<SQLStatement> statement)420 void SQLTransactionBackend::enqueueStatementBackend(PassRefPtr<SQLStatementBackend> statementBackend) 414 421 { 415 422 MutexLocker locker(m_statementMutex); 416 m_statementQueue.append(statement );423 m_statementQueue.append(statementBackend); 417 424 } 418 425 … … 455 462 checkAndHandleClosedOrInterruptedDatabase(); 456 463 runStateMachine(); 464 } 465 466 void SQLTransactionBackend::executeSQL(PassOwnPtr<SQLStatement> statement, 467 const String& sqlStatement, const Vector<SQLValue>& arguments, int permissions) 468 { 469 RefPtr<SQLStatementBackend> statementBackend; 470 statementBackend = SQLStatementBackend::create(statement, sqlStatement, arguments, permissions); 471 472 if (Database::from(m_database.get())->deleted()) 473 statementBackend->setDatabaseDeletedError(m_database.get()); 474 475 enqueueStatementBackend(statementBackend); 457 476 } 458 477 … … 578 597 // If the current statement has already been run, failed due to quota constraints, and we're not retrying it, 579 598 // that means it ended in an error. Handle it now 580 if (m_currentStatement && m_currentStatement->lastExecutionFailedDueToQuota()) {599 if (m_currentStatementBackend && m_currentStatementBackend->lastExecutionFailedDueToQuota()) { 581 600 return nextStateForCurrentStatementError(); 582 601 } … … 593 612 void SQLTransactionBackend::getNextStatement() 594 613 { 595 m_currentStatement = 0;614 m_currentStatementBackend = 0; 596 615 597 616 MutexLocker locker(m_statementMutex); 598 617 if (!m_statementQueue.isEmpty()) 599 m_currentStatement = m_statementQueue.takeFirst();618 m_currentStatementBackend = m_statementQueue.takeFirst(); 600 619 } 601 620 602 621 SQLTransactionState SQLTransactionBackend::runCurrentStatementAndGetNextState() 603 622 { 604 if (!m_currentStatement ) {623 if (!m_currentStatementBackend) { 605 624 // No more statements to run. So move on to the next state. 606 625 return SQLTransactionState::PostflightAndCommit; … … 610 629 611 630 if (m_hasVersionMismatch) 612 m_currentStatement ->setVersionMismatchedError(Database::from(m_database.get()));613 614 if (m_currentStatement ->execute(Database::from(m_database.get()))) {631 m_currentStatementBackend->setVersionMismatchedError(Database::from(m_database.get())); 632 633 if (m_currentStatementBackend->execute(m_database.get())) { 615 634 if (m_database->lastActionChangedDatabase()) { 616 635 // Flag this transaction as having changed the database for later delegate notification … … 620 639 } 621 640 622 if (m_currentStatement ->hasStatementCallback()) {641 if (m_currentStatementBackend->hasStatementCallback()) { 623 642 return SQLTransactionState::DeliverStatementCallback; 624 643 } … … 629 648 } 630 649 631 if (m_currentStatement ->lastExecutionFailedDueToQuota()) {650 if (m_currentStatementBackend->lastExecutionFailedDueToQuota()) { 632 651 return SQLTransactionState::DeliverQuotaIncreaseCallback; 633 652 } … … 640 659 // Spec 4.3.2.6.6: error - Call the statement's error callback, but if there was no error callback, 641 660 // or the transaction was rolled back, jump to the transaction error callback 642 if (m_currentStatement ->hasStatementErrorCallback() && !m_sqliteTransaction->wasRolledBackBySqlite())661 if (m_currentStatementBackend->hasStatementErrorCallback() && !m_sqliteTransaction->wasRolledBackBySqlite()) 643 662 return SQLTransactionState::DeliverStatementCallback; 644 663 645 m_transactionError = m_currentStatement ->sqlError();664 m_transactionError = m_currentStatementBackend->sqlError(); 646 665 if (!m_transactionError) { 647 666 m_database->reportCommitTransactionResult(1, SQLError::DATABASE_ERR, 0); -
trunk/Source/WebCore/Modules/webdatabase/SQLTransactionBackend.h
r142921 r143090 32 32 33 33 #include "DatabaseBasicTypes.h" 34 #include "SQLStatement.h"35 34 #include "SQLTransactionStateMachine.h" 36 35 #include <wtf/Deque.h> 37 36 #include <wtf/Forward.h> 37 #include <wtf/text/WTFString.h> 38 38 39 39 namespace WebCore { … … 42 42 class SQLError; 43 43 class SQLiteTransaction; 44 class SQLStatement; 45 class SQLStatementBackend; 44 46 class SQLTransaction; 45 47 class SQLTransactionBackend; … … 69 71 void notifyDatabaseThreadIsShuttingDown(); 70 72 73 // APIs for the frontend: 74 SQLStatement* currentStatement(); 71 75 PassRefPtr<SQLError> transactionError(); 72 76 void setShouldRetryCurrentStatement(bool); 77 78 void executeSQL(PassOwnPtr<SQLStatement>, const String& statement, 79 const Vector<SQLValue>& arguments, int permissions); 73 80 74 81 private: … … 78 85 void doCleanup(); 79 86 80 void enqueueStatement (PassRefPtr<SQLStatement>);87 void enqueueStatementBackend(PassRefPtr<SQLStatementBackend>); 81 88 82 89 void checkAndHandleClosedOrInterruptedDatabase(); … … 104 111 105 112 RefPtr<SQLTransaction> m_frontend; 106 RefPtr<SQLStatement > m_currentStatement;113 RefPtr<SQLStatementBackend> m_currentStatementBackend; 107 114 108 115 RefPtr<DatabaseBackendAsync> m_database; … … 120 127 121 128 Mutex m_statementMutex; 122 Deque<RefPtr<SQLStatement > > m_statementQueue;129 Deque<RefPtr<SQLStatementBackend> > m_statementQueue; 123 130 124 131 OwnPtr<SQLiteTransaction> m_sqliteTransaction; -
trunk/Source/WebCore/Target.pri
r142957 r143090 1482 1482 Modules/webdatabase/SQLResultSetRowList.h \ 1483 1483 Modules/webdatabase/SQLStatement.h \ 1484 Modules/webdatabase/SQLStatementBackend.h \ 1484 1485 Modules/webdatabase/SQLStatementSync.h \ 1485 1486 Modules/webdatabase/SQLTransaction.h \ … … 3073 3074 Modules/webdatabase/SQLResultSetRowList.cpp \ 3074 3075 Modules/webdatabase/SQLStatement.cpp \ 3076 Modules/webdatabase/SQLStatementBackend.cpp \ 3075 3077 Modules/webdatabase/SQLStatementSync.cpp \ 3076 3078 Modules/webdatabase/SQLTransaction.cpp \ -
trunk/Source/WebCore/WebCore.gypi
r142957 r143090 1029 1029 'Modules/webdatabase/SQLResultSetRowList.cpp', 1030 1030 'Modules/webdatabase/SQLStatement.cpp', 1031 'Modules/webdatabase/SQLStatement.h', 1032 'Modules/webdatabase/SQLStatementBackend.cpp', 1033 'Modules/webdatabase/SQLStatementBackend.h', 1031 1034 'Modules/webdatabase/SQLStatementSync.cpp', 1032 1035 'Modules/webdatabase/SQLStatementSync.h', -
trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj
r142921 r143090 25579 25579 </File> 25580 25580 <File 25581 RelativePath="..\Modules\webdatabase\SQLStatementBackend.cpp" 25582 > 25583 </File> 25584 <File 25585 RelativePath="..\Modules\webdatabase\SQLStatementBackend.h" 25586 > 25587 </File> 25588 <File 25581 25589 RelativePath="..\Modules\webdatabase\SQLStatementCallback.h" 25582 25590 > -
trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj
r142954 r143090 1875 1875 <ClCompile Include="..\Modules\webdatabase\SQLResultSetRowList.cpp" /> 1876 1876 <ClCompile Include="..\Modules\webdatabase\SQLStatement.cpp" /> 1877 <ClCompile Include="..\Modules\webdatabase\SQLStatementBackend.cpp" /> 1877 1878 <ClCompile Include="..\Modules\webdatabase\SQLStatementSync.cpp" /> 1878 1879 <ClCompile Include="..\Modules\webdatabase\SQLTransaction.cpp" /> … … 6446 6447 <ClInclude Include="..\Modules\webdatabase\SQLResultSetRowList.h" /> 6447 6448 <ClInclude Include="..\Modules\webdatabase\SQLStatement.h" /> 6449 <ClInclude Include="..\Modules\webdatabase\SQLStatementBackend.h" /> 6448 6450 <ClInclude Include="..\Modules\webdatabase\SQLStatementCallback.h" /> 6449 6451 <ClInclude Include="..\Modules\webdatabase\SQLStatementErrorCallback.h" /> -
trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters
r142954 r143090 1894 1894 <Filter>Modules\webdatabase</Filter> 1895 1895 </ClCompile> 1896 <ClCompile Include="..\Modules\webdatabase\SQLStatementBackend.cpp"> 1897 <Filter>Modules\webdatabase</Filter> 1898 </ClCompile> 1896 1899 <ClCompile Include="..\Modules\webdatabase\SQLStatementSync.cpp"> 1897 1900 <Filter>Modules\webdatabase</Filter> … … 8564 8567 </ClInclude> 8565 8568 <ClInclude Include="..\Modules\webdatabase\SQLStatement.h"> 8569 <Filter>Modules\webdatabase</Filter> 8570 </ClInclude> 8571 <ClInclude Include="..\Modules\webdatabase\SQLStatementBackend.h"> 8566 8572 <Filter>Modules\webdatabase</Filter> 8567 8573 </ClInclude> -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r142957 r143090 3743 3743 97BC6A471505F081001B74AC /* SQLStatement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97BC6A051505F081001B74AC /* SQLStatement.cpp */; }; 3744 3744 97BC6A481505F081001B74AC /* SQLStatement.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BC6A061505F081001B74AC /* SQLStatement.h */; }; 3745 FE8A674716CDD19E00930BF8 /* SQLStatementBackend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE8A674516CDD19E00930BF8 /* SQLStatementBackend.cpp */; }; 3746 FE8A674816CDD19E00930BF8 /* SQLStatementBackend.h in Headers */ = {isa = PBXBuildFile; fileRef = FE8A674616CDD19E00930BF8 /* SQLStatementBackend.h */; }; 3745 3747 97BC6A491505F081001B74AC /* SQLStatementCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BC6A071505F081001B74AC /* SQLStatementCallback.h */; }; 3746 3748 97BC6A4B1505F081001B74AC /* SQLStatementErrorCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BC6A091505F081001B74AC /* SQLStatementErrorCallback.h */; }; … … 11211 11213 97BC6A051505F081001B74AC /* SQLStatement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SQLStatement.cpp; path = Modules/webdatabase/SQLStatement.cpp; sourceTree = "<group>"; }; 11212 11214 97BC6A061505F081001B74AC /* SQLStatement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SQLStatement.h; path = Modules/webdatabase/SQLStatement.h; sourceTree = "<group>"; }; 11215 FE8A674516CDD19E00930BF8 /* SQLStatementBackend.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SQLStatementBackend.cpp; path = Modules/webdatabase/SQLStatementBackend.cpp; sourceTree = "<group>"; }; 11216 FE8A674616CDD19E00930BF8 /* SQLStatementBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SQLStatementBackend.h; path = Modules/webdatabase/SQLStatementBackend.h; sourceTree = "<group>"; }; 11213 11217 97BC6A071505F081001B74AC /* SQLStatementCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SQLStatementCallback.h; path = Modules/webdatabase/SQLStatementCallback.h; sourceTree = "<group>"; }; 11214 11218 97BC6A081505F081001B74AC /* SQLStatementCallback.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = SQLStatementCallback.idl; path = Modules/webdatabase/SQLStatementCallback.idl; sourceTree = "<group>"; }; … … 18696 18700 97BC6A051505F081001B74AC /* SQLStatement.cpp */, 18697 18701 97BC6A061505F081001B74AC /* SQLStatement.h */, 18702 FE8A674516CDD19E00930BF8 /* SQLStatementBackend.cpp */, 18703 FE8A674616CDD19E00930BF8 /* SQLStatementBackend.h */, 18698 18704 97BC6A071505F081001B74AC /* SQLStatementCallback.h */, 18699 18705 97BC6A081505F081001B74AC /* SQLStatementCallback.idl */, … … 25946 25952 97BC6A451505F081001B74AC /* SQLResultSetRowList.h in Headers */, 25947 25953 97BC6A481505F081001B74AC /* SQLStatement.h in Headers */, 25954 FE8A674816CDD19E00930BF8 /* SQLStatementBackend.h in Headers */, 25948 25955 97BC6A491505F081001B74AC /* SQLStatementCallback.h in Headers */, 25949 25956 97BC6A4B1505F081001B74AC /* SQLStatementErrorCallback.h in Headers */, … … 29251 29258 97BC6A441505F081001B74AC /* SQLResultSetRowList.cpp in Sources */, 29252 29259 97BC6A471505F081001B74AC /* SQLStatement.cpp in Sources */, 29260 FE8A674716CDD19E00930BF8 /* SQLStatementBackend.cpp in Sources */, 29253 29261 97BC6A4D1505F081001B74AC /* SQLStatementSync.cpp in Sources */, 29254 29262 97BC6A4F1505F081001B74AC /* SQLTransaction.cpp in Sources */,
Note: See TracChangeset
for help on using the changeset viewer.