Exemplo n.º 1
0
 protected function processExpression(ExpressionInterface $expression, PlatformInterface $platform, Driver\DriverInterface $driver = null, $namedParameterPrefix = null, Parameters $parameters = null)
 {
     // static counter for the number of times this method was invoked across the PHP runtime
     static $runtimeExpressionPrefix = 0;
     if ($driver && (!is_string($namedParameterPrefix) || $namedParameterPrefix == '')) {
         $namedParameterPrefix = sprintf('expr%04dParam', ++$runtimeExpressionPrefix);
     }
     $sql = '';
     // initialize variables
     $parts = $expression->getExpressionData();
     if (!isset($this->instanceParameterIndex[$namedParameterPrefix])) {
         $this->instanceParameterIndex[$namedParameterPrefix] = 1;
     }
     $expressionParamIndex =& $this->instanceParameterIndex[$namedParameterPrefix];
     foreach ($parts as $part) {
         // if it is a string, simply tack it onto the return sql "specification" string
         if (is_string($part)) {
             $sql .= $part;
             continue;
         }
         if (!is_array($part)) {
             throw new Exception\RuntimeException('Elements returned from getExpressionData() array must be a string or array.');
         }
         // process values and types (the middle and last position of the expression data)
         $values = $part[1];
         $types = isset($part[2]) ? $part[2] : array();
         foreach ($values as $vIndex => $value) {
             if (isset($types[$vIndex]) && $types[$vIndex] == ExpressionInterface::TYPE_IDENTIFIER) {
                 $values[$vIndex] = $platform->quoteIdentifierInFragment($value);
             } elseif (isset($types[$vIndex]) && $types[$vIndex] == ExpressionInterface::TYPE_VALUE && $value instanceof Select) {
                 // process sub-select
                 if ($driver) {
                     $values[$vIndex] = '(' . $this->processSubSelect($value, $platform, $driver, $parameters) . ')';
                 } else {
                     $values[$vIndex] = '(' . $this->processSubSelect($value, $platform) . ')';
                 }
             } elseif (isset($types[$vIndex]) && $types[$vIndex] == ExpressionInterface::TYPE_VALUE && $value instanceof ExpressionInterface) {
                 $sql = $this->processExpression($value, $platform, $driver, $namedParameterPrefix . $vIndex . 'subpart', $parameters);
                 $values[$vIndex] = $sql;
             } elseif (isset($types[$vIndex]) && $types[$vIndex] == ExpressionInterface::TYPE_VALUE) {
                 if ($driver) {
                     $name = $namedParameterPrefix . $expressionParamIndex++;
                     $parameters->offsetSet($name, $value);
                     $values[$vIndex] = $driver->formatParameterName($name);
                     continue;
                 }
                 // if not a preparable statement, simply quote the value and move on
                 $values[$vIndex] = $platform->quoteValue($value);
             } elseif (isset($types[$vIndex]) && $types[$vIndex] == ExpressionInterface::TYPE_LITERAL) {
                 $values[$vIndex] = $value;
             }
         }
         // after looping the values, interpolate them into the sql string (they might be placeholder names, or values)
         $sql .= vsprintf($part[0], $values);
     }
     return $sql;
 }
Exemplo n.º 2
0
 protected function processOffset(PlatformInterface $platform, DriverInterface $driver = null, Parameters $parameters = null)
 {
     if ($this->offset === null) {
         return null;
     }
     if ($driver) {
         $parameters->offsetSet('offset', $this->offset, Parameters::TYPE_INTEGER);
         return array($driver->formatParameterName('offset'));
     }
     return array($platform->quoteLimitOffset($this->offset));
 }