From f02ad22cc4ef38313f1a93dc4a894703c18b5878 Mon Sep 17 00:00:00 2001 From: zYne Date: Sat, 25 Nov 2006 10:59:33 +0000 Subject: [PATCH] updated firebird and mysql drivers --- lib/Doctrine/DataDict/Firebird.php | 22 ++++++++++ lib/Doctrine/DataDict/Mysql.php | 65 ++++++++++++++++++++++++++++ lib/Doctrine/Expression/Firebird.php | 6 +-- lib/Doctrine/Expression/Mysql.php | 64 +++++++++++++++++++++++---- 4 files changed, 146 insertions(+), 11 deletions(-) diff --git a/lib/Doctrine/DataDict/Firebird.php b/lib/Doctrine/DataDict/Firebird.php index 8105a799c..3d2874be2 100644 --- a/lib/Doctrine/DataDict/Firebird.php +++ b/lib/Doctrine/DataDict/Firebird.php @@ -165,6 +165,28 @@ class Doctrine_DataDict_Firebird extends Doctrine_DataDict { return array($type, $length, $unsigned, $fixed); } + /** + * Obtain DBMS specific SQL code portion needed to set the CHARACTER SET + * of a field declaration to be used in statements like CREATE TABLE. + * + * @param string $charset name of the charset + * @return string DBMS specific SQL code portion needed to set the CHARACTER SET + * of a field declaration. + */ + public function getCharsetFieldDeclaration($charset) { + return 'CHARACTER SET '.$charset; + } + /** + * Obtain DBMS specific SQL code portion needed to set the COLLATION + * of a field declaration to be used in statements like CREATE TABLE. + * + * @param string $collation name of the collation + * @return string DBMS specific SQL code portion needed to set the COLLATION + * of a field declaration. + */ + public function getCollationFieldDeclaration($collation) { + return 'COLLATE '.$collation; + } /** * list all tables in the current database * diff --git a/lib/Doctrine/DataDict/Mysql.php b/lib/Doctrine/DataDict/Mysql.php index ef18a508b..b51d725f9 100644 --- a/lib/Doctrine/DataDict/Mysql.php +++ b/lib/Doctrine/DataDict/Mysql.php @@ -266,6 +266,71 @@ class Doctrine_DataDict_Mysql extends Doctrine_DataDict { return array($type, $length, $unsigned, $fixed); } + /** + * Obtain DBMS specific SQL code portion needed to set the CHARACTER SET + * of a field declaration to be used in statements like CREATE TABLE. + * + * @param string $charset name of the charset + * @return string DBMS specific SQL code portion needed to set the CHARACTER SET + * of a field declaration. + */ + public function getCharsetFieldDeclaration($charset) { + return 'CHARACTER SET '.$charset; + } + /** + * Obtain DBMS specific SQL code portion needed to set the COLLATION + * of a field declaration to be used in statements like CREATE TABLE. + * + * @param string $collation name of the collation + * @return string DBMS specific SQL code portion needed to set the COLLATION + * of a field declaration. + */ + public function getCollationFieldDeclaration($collation) { + return 'COLLATE '.$collation; + } + /** + * Obtain DBMS specific SQL code portion needed to declare an integer type + * field to be used in statements like CREATE TABLE. + * + * @param string $name name the field to be declared. + * @param string $field associative array with the name of the properties + * of the field being declared as array indexes. + * Currently, the types of supported field + * properties are as follows: + * + * unsigned + * Boolean flag that indicates whether the field + * should be declared as unsigned integer if + * possible. + * + * default + * Integer value to be used as default for this + * field. + * + * notnull + * Boolean flag that indicates whether this field is + * constrained to not be set to null. + * @return string DBMS specific SQL code portion that should be used to + * declare the specified field. + */ + public function getIntegerDeclaration($name, $field) { + $default = $autoinc = ''; + if (!empty($field['autoincrement'])) { + $autoinc = ' AUTO_INCREMENT PRIMARY KEY'; + } elseif (array_key_exists('default', $field)) { + if ($field['default'] === '') { + $field['default'] = empty($field['notnull']) ? null : 0; + } + $default = ' DEFAULT '.$this->conn->getDbh()->quote($field['default']); + } elseif (empty($field['notnull'])) { + $default = ' DEFAULT NULL'; + } + + $notnull = empty($field['notnull']) ? '' : ' NOT NULL'; + $unsigned = empty($field['unsigned']) ? '' : ' UNSIGNED'; + $name = $this->conn->quoteIdentifier($name, true); + return $name . ' ' . $this->getTypeDeclaration($field) . $unsigned . $default . $notnull . $autoinc; + } /** * lists all databases * diff --git a/lib/Doctrine/Expression/Firebird.php b/lib/Doctrine/Expression/Firebird.php index 14058f649..904cc360e 100644 --- a/lib/Doctrine/Expression/Firebird.php +++ b/lib/Doctrine/Expression/Firebird.php @@ -44,10 +44,10 @@ class Doctrine_Expression_Firebird extends Doctrine_Expression { } /** * build string to define escape pattern string - * + * * @return string define escape pattern */ - public function patternEscapeString() { - return " ESCAPE '". $db->escape_pattern ."'"; + function patternEscapeString() { + return " ESCAPE '". $this->conn->string_quoting['escape_pattern'] ."'"; } } diff --git a/lib/Doctrine/Expression/Mysql.php b/lib/Doctrine/Expression/Mysql.php index 7acc92df0..50f30fadf 100644 --- a/lib/Doctrine/Expression/Mysql.php +++ b/lib/Doctrine/Expression/Mysql.php @@ -22,14 +22,14 @@ Doctrine::autoload('Doctrine_Expression'); /** * Doctrine_Expression_Mysql * - * @package Doctrine - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @category Object Relational Mapping - * @link www.phpdoctrine.com - * @since 1.0 - * @version $Revision$ - * @author Konsta Vesterinen - */ + * @package Doctrine + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @category Object Relational Mapping + * @link www.phpdoctrine.com + * @since 1.0 + * @version $Revision$ + * @author Konsta Vesterinen + */ class Doctrine_Expression_Mysql extends Doctrine_Expression { /** * returns the regular expression operator @@ -38,5 +38,53 @@ class Doctrine_Expression_Mysql extends Doctrine_Expression { */ public function regexp() { return 'RLIKE'; + } + /** + * build a pattern matching string + * + * EXPERIMENTAL + * + * WARNING: this function is experimental and may change signature at + * any time until labelled as non-experimental + * + * @access public + * + * @param array $pattern even keys are strings, odd are patterns (% and _) + * @param string $operator optional pattern operator (LIKE, ILIKE and maybe others in the future) + * @param string $field optional field name that is being matched against + * (might be required when emulating ILIKE) + * + * @return string SQL pattern + */ + public function matchPattern($pattern, $operator = null, $field = null) { + $match = ''; + if (!is_null($operator)) { + $field = is_null($field) ? '' : $field.' '; + $operator = strtoupper($operator); + switch ($operator) { + // case insensitive + case 'ILIKE': + $match = $field.'LIKE '; + break; + // case sensitive + case 'LIKE': + $match = $field.'LIKE BINARY '; + break; + default: + return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, + 'not a supported operator type:'. $operator, __FUNCTION__); + } + } + $match.= "'"; + foreach ($pattern as $key => $value) { + if ($key % 2) { + $match.= $value; + } else { + $match.= $db->escapePattern($db->escape($value)); + } + } + $match.= "'"; + $match.= $this->patternEscapeString(); + return $match; } }