From a26744388df96cc6808c107e197a345784cca15a Mon Sep 17 00:00:00 2001 From: David Grudl Date: Sun, 22 Feb 2009 18:35:18 +0000 Subject: [PATCH] - substitution is performed by DibiTranslator - fixed bug in DibiTranslator --- dibi/dibi.php | 56 ++++++------------------------------ dibi/libs/DibiTranslator.php | 37 ++++++++++++++++++++---- 2 files changed, 41 insertions(+), 52 deletions(-) diff --git a/dibi/dibi.php b/dibi/dibi.php index 8431549d..25f84799 100644 --- a/dibi/dibi.php +++ b/dibi/dibi.php @@ -131,10 +131,10 @@ class dibi private static $connection; /** @var array Substitutions for identifiers */ - private static $substs = array(); + public static $substs = array(); /** @var callback Substitution fallback */ - private static $substFallBack; + public static $substFallBack; /** @var array @see addHandler */ private static $handlers = array(); @@ -590,22 +590,6 @@ class dibi - /** - * Sets substitution fallback handler. - * @param callback - * @return void - */ - public static function setSubstFallback($callback) - { - if (!is_callable($callback)) { - throw new InvalidArgumentException("Invalid callback."); - } - - self::$substFallBack = $callback; - } - - - /** * Remove substitution pair. * @param mixed from or TRUE @@ -623,39 +607,17 @@ class dibi /** - * Provides substitution. - * @param string - * @return string + * Sets substitution fallback handler. + * @param callback + * @return void */ - public static function substitute($value) + public static function setSubstFallback($callback) { - if (strpos($value, ':') === FALSE) { - return $value; - - } else { - return preg_replace_callback('#:(.*):#U', array('dibi', 'subCb'), $value); + if (!is_callable($callback)) { + throw new InvalidArgumentException("Invalid callback."); } - } - - - /** - * Substitution callback. - * @param array - * @return string - */ - private static function subCb($m) - { - $m = $m[1]; - if (isset(self::$substs[$m])) { - return self::$substs[$m]; - - } elseif (self::$substFallBack) { - return self::$substs[$m] = call_user_func(self::$substFallBack, $m); - - } else { - return $m; - } + self::$substFallBack = $callback; } diff --git a/dibi/libs/DibiTranslator.php b/dibi/libs/DibiTranslator.php index 1dd6bc04..ca9cdc22 100644 --- a/dibi/libs/DibiTranslator.php +++ b/dibi/libs/DibiTranslator.php @@ -123,8 +123,8 @@ final class DibiTranslator extends DibiObject \[(.+?)\]| ## 2) [identifier] (\')((?:\'\'|[^\'])*)\'| ## 3,4) string (")((?:""|[^"])*)"| ## 5,6) "string" - (\'|") ## 7) lone-quote - %([a-zA-Z]{1,4})(?![a-zA-Z])|## 8) modifier + (\'|")| ## 7) lone quote + %([a-zA-Z]{1,4})(?![a-zA-Z]) ## 8) modifier )/xs', */ // note: this can change $this->args & $this->cursor & ... . preg_replace_callback('/(?=`|\[|\'|"|%)(?:`(.+?)`|\[(.+?)\]|(\')((?:\'\'|[^\'])*)\'|(")((?:""|[^"])*)"|(\'|")|%([a-zA-Z]{1,4})(?![a-zA-Z]))/s', @@ -351,7 +351,7 @@ final class DibiTranslator extends DibiObject return $value; } else { return substr($value, 0, $toSkip) - . preg_replace_callback('/(?=`|\[|\'|")(?:`(.+?)`|\[(.+?)\]|(\')((?:\'\'|[^\'])*)\'|(")((?:""|[^"])*)"(\'|"))/s', + . preg_replace_callback('/(?=`|\[|\'|")(?:`(.+?)`|\[(.+?)\]|(\')((?:\'\'|[^\'])*)\'|(")((?:""|[^"])*)"|(\'|"))/s', array($this, 'cb'), substr($value, $toSkip) ); @@ -505,8 +505,35 @@ final class DibiTranslator extends DibiObject */ private function delimite($value) { - return $value === '*' ? '*' : $this->driver->escape(dibi::substitute($value), dibi::IDENTIFIER); + if ($value === '*') { + return '*'; + + } elseif (strpos($value, ':') !== FALSE) { // provide substitution + $value = preg_replace_callback('#:(.*):#U', array(__CLASS__, 'subCb'), $value); + } + + return $this->driver->escape($value, dibi::IDENTIFIER); } -} // class DibiTranslator + + /** + * Substitution callback. + * @param array + * @return string + */ + private static function subCb($m) + { + $m = $m[1]; + if (isset(dibi::$substs[$m])) { + return dibi::$substs[$m]; + + } elseif (dibi::$substFallBack) { + return dibi::$substs[$m] = call_user_func(dibi::$substFallBack, $m); + + } else { + return $m; + } + } + +}