15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 2926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2007, 2013 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * its contributors may be used to endorse or promote products derived 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * from this software without specific prior written permission. 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/webdatabase/SQLStatement.h" 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/webdatabase/Database.h" 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/webdatabase/DatabaseManager.h" 337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "modules/webdatabase/SQLError.h" 347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "modules/webdatabase/SQLStatementBackend.h" 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/webdatabase/SQLStatementCallback.h" 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/webdatabase/SQLStatementErrorCallback.h" 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/webdatabase/SQLTransaction.h" 387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "modules/webdatabase/sqlite/SQLiteDatabase.h" 397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "modules/webdatabase/sqlite/SQLiteStatement.h" 407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/Logging.h" 4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/text/CString.h" 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)PassOwnPtrWillBeRawPtr<SQLStatement> SQLStatement::create(Database* database, 467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci SQLStatementCallback* callback, SQLStatementErrorCallback* errorCallback) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 48f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return adoptPtrWillBeNoop(new SQLStatement(database, callback, errorCallback)); 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciSQLStatement::SQLStatement(Database* database, SQLStatementCallback* callback, 527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci SQLStatementErrorCallback* errorCallback) 537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci : m_statementCallback(callback) 547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci , m_statementErrorCallback(errorCallback) 557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciSQLStatement::~SQLStatement() 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 62f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void SQLStatement::trace(Visitor* visitor) 63f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){ 64f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) visitor->trace(m_backend); 657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci visitor->trace(m_statementCallback); 667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci visitor->trace(m_statementErrorCallback); 67f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)} 68f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid SQLStatement::setBackend(SQLStatementBackend* backend) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_backend = backend; 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool SQLStatement::hasCallback() 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return m_statementCallback; 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool SQLStatement::hasErrorCallback() 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return m_statementErrorCallback; 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool SQLStatement::performCallback(SQLTransaction* transaction) 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(transaction); 87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(m_backend); 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool callbackError = false; 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci SQLStatementCallback* callback = m_statementCallback.release(); 927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci SQLStatementErrorCallback* errorCallback = m_statementErrorCallback.release(); 9307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch SQLErrorData* error = m_backend->sqlError(); 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Call the appropriate statement callback and track if it resulted in an error, 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // because then we need to jump to the transaction error callback. 97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (error) { 9807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (errorCallback) { 9907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch RefPtrWillBeRawPtr<SQLError> sqlError = SQLError::create(*error); 10007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch callbackError = errorCallback->handleEvent(transaction, sqlError.get()); 10107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } else if (callback) { 10307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch RefPtrWillBeRawPtr<SQLResultSet> resultSet = m_backend->sqlResultSet(); 104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) callbackError = !callback->handleEvent(transaction, resultSet.get()); 105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return callbackError; 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 110c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 111