<?php
/**
 * File containing the ezcQueryInsert class.
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 * @package Database
 * @version //autogentag//
 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 */

/**
 * Class to create select database independent INSERT queries.
 *
 * Note that this class creates queries that are syntactically independant
 * of database. Semantically the queries still differ and so the same
 * query may produce different results on different databases. Such
 * differences are noted throughout the documentation of this class.
 *
 * This class implements SQL92. If your database differs from the SQL92
 * implementation extend this class and reimplement the methods that produce
 * different results. Some methods implemented in ezcQuery are not defined by SQL92.
 * These methods are marked and ezcQuery will return MySQL syntax for these cases.
 *
 * The examples show the SQL generated by this class.
 * Database specific implementations may produce different results.
 *
 * Example:
 * <code>
 * $q = ezcDbInstance::get()->createInsertQuery();
 * $q->insertInto( 'legends' )
 *        ->set( 'name', $q->bindValue( 'Gretzky' ) )
 *        ->set( 'year', $q->bindValue( 1961 ) );
 * $stmt = $q->prepare();
 * $stmt->execute();
 * </code>
 *
 * @package Database
 * @version //autogentag//
 * @mainclass
 */
class ezcQueryInsert extends ezcQuery
{
    /**
     * Holds the columns and the values that should inserted into the the table.
     *
     * Format array('column'=>value)
     * @var array(string=>mixed)
     */
    protected $values = array();

    /**
     * The target table for the insert query.
     *
     * @var string
     */
    private $table = null;

    /**
     * Constructs a new ezcQueryInsert that works on the database $db and with the aliases $aliases.
     *
     * The parameters are passed directly to ezcQuery.
     * @param PDO $db
     * @param array(string=>string) $aliases
     */
    public function __construct( PDO $db, array $aliases = array() )
    {
        parent::__construct( $db, $aliases );
    }

    /**
     * Opens the query and sets the target table to $table.
     *
     * insertInto() returns a pointer to $this.
     *
     * @param string $table
     * @return ezcQueryInsert
     */
    public function insertInto( $table )
    {
        $table = $this->getIdentifier( $table );
        $this->table = $table;
        return $this;
    }

    /**
     * The insert query will set the column $column to the value $expression.
     *
     * set() returns a pointer to $this.
     *
     * @param string $column
     * @param string $expression
     * @return ezcQueryInsert
     */
    public function set( $column, $expression )
    {
        $column = $this->getIdentifier( $column );
        $expression = $this->getIdentifier( $expression );

        if ( $this->db->getName() == 'oracle' )
        {
            // This is "quick fix" for the case of setting sequence value in Oracle.
            // Assume that set( 'columnName', "nextval('sequenceName')") was called.
            // Converting sequence SQL "nextval('sequenceName')" that valid for PostgreSQL
            // to "sequenceName.nextval" that valid for Oracle.
            
            if ( preg_match( "/nextval\('(.*)'\)/", $expression, $matches ) )
            {
                $sequenceName = $matches[1];
                $expression = $sequenceName.'.nextval';
                $this->values[$column] = $expression;

                return $this;
            }
        }

        $this->values[$column] = $expression;
        return $this;
    }

    /**
     * Returns the query string for this query object.
     *
     * @throws ezcQueryInvalidException if no table or no values have been set.
     * @return string
     */
    public function getQuery()
    {
        if ( $this->table == null || empty( $this->values ) )
        {
            $problem = $this->table == null ? 'table' : 'values';
            throw new ezcQueryInvalidException( "INSERT", "No " . $problem . " set." );
        }
        $query = "INSERT INTO {$this->table}";
        $columns = implode( ', ', array_keys( $this->values ) );
        $values = implode( ', ', array_values( $this->values ) );
        $query .= " ( {$columns} ) VALUES ( {$values} )";
        return $query;
    }
}
?>
