/** * Escapes given value. * @param mixed|array|Traversable $value * @param string|array|null $type * @return mixed|array */ protected function escapeValue($value, $type = null) { if (!$type) { // NULL type if ($value === null) { return 'NULL'; } elseif (is_array($value)) { foreach ($value as $k => $v) { $value[$k] = $this->escapeValue($v); } return $value; } else { if ($value instanceof DateTime) { return $this->escapeValue($value, Manager::DATETIME); } elseif ($value instanceof Literal) { return $value->value; } else { return is_numeric($value) ? +$value : $this->stmt->getConnection()->getDriver()->escape($value, Manager::TEXT); } } } elseif (is_array($type)) { foreach ($value as $k => $v) { $value[$k] = $this->escapeValue($v, $type[$k]); } return $value; } elseif ($type !== null) { if ($type === Manager::INT) { return (int) $value; } elseif ($type === Manager::FLOAT) { return (double) $value; } elseif ($type === Manager::SUBQUERY && $value instanceof Result) { return "(\n\t" . implode("\n\t", explode("\n", $value)) . "\n)"; } elseif ($type === Manager::ARR) { $arr = $value instanceof Traversable ? iterator_to_array($value) : (array) $value; return '(' . implode(', ', $this->escapeValue($arr)) . ')'; } elseif ($type === Manager::LITERAL) { return $value instanceof Literal ? $value->value : $value; } else { return $this->stmt->getConnection()->getDriver()->escape($value, $type); } } }