Abstract.php 3.58 KB
Newer Older
guilhermeblanco's avatar
guilhermeblanco committed
1
<?php
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
/*
 *  $Id$
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * This software consists of voluntary contributions made by many individuals
 * and is licensed under the LGPL. For more information, see
 * <http://www.phpdoctrine.org>.
 */

/**
 * Doctrine_Query_QueryResult
 *
 * @author      Roman Borschel <roman@code-factory.org>
 * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
 * @link        http://www.phpdoctrine.org
 * @since       2.0
 * @version     $Revision$
 */
abstract class Doctrine_Query_SqlExecutor_Abstract implements Serializable
{
    // [TODO] Remove me later!
romanb's avatar
romanb committed
34
    //public $AST;
35 36 37

    protected $_sqlStatements;

guilhermeblanco's avatar
guilhermeblanco committed
38
    public function __construct(Doctrine_Query_AST $AST)
39 40
    {
        // [TODO] Remove me later!
romanb's avatar
romanb committed
41
        //$this->AST = $AST;
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
    }

    /**
     * Gets the SQL statements that are executed by the executor.
     *
     * @return array  All the SQL update statements.
     */
    public function getSqlStatements()
    {
        return $this->_sqlStatements;
    }

    /**
     * Executes all sql statements.
     *
     * @param Doctrine_Connection $conn  The database connection that is used to execute the queries.
     * @param array $params  The parameters.
     */
    abstract public function execute(Doctrine_Connection $conn, array $params);

    /**
     * Factory method.
     * Creates an appropriate sql executor for the given AST.
     *
     * @param Doctrine_Query_Production $AST  The root node of the AST.
     * @return Doctrine_Query_SqlExecutor_Abstract  The executor that is suitable for the given AST.
     */
guilhermeblanco's avatar
guilhermeblanco committed
69
    public static function create(Doctrine_Query_AST $AST)
70
    {
guilhermeblanco's avatar
guilhermeblanco committed
71 72
        $isDeleteStatement = $AST instanceof Doctrine_Query_AST_DeleteStatement;
        $isUpdateStatement = $AST instanceof Doctrine_Query_AST_UpdateStatement;
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110

        if ($isUpdateStatement || $isDeleteStatement) {
            // TODO: Inspect the $AST and create the proper executor like so (pseudo-code):
            /*
            if (primaryClassInFromClause->isMultiTable()) {
                   if ($isDeleteStatement) {
                       return new Doctrine_Query_SqlExecutor_MultiTableDelete($AST);
                   } else {
                       return new Doctrine_Query_SqlExecutor_MultiTableUpdate($AST);
                   }
            } else ...
            */
            return new Doctrine_Query_SqlExecutor_SingleTableDeleteUpdate($AST);
        } else {
            return new Doctrine_Query_SqlExecutor_SingleSelect($AST);
        }
    }


    /**
     * Serializes the sql statements of the executor.
     *
     * @return string
     */
    public function serialize()
    {
        return serialize($this->_sqlStatements);
    }


    /**
     * Reconstructs the executor with it's sql statements.
     */
    public function unserialize($serialized)
    {
        $this->_sqlStatements = unserialize($serialized);
    }
}