* @license http://www.contenido.org/license/LIZENZ.txt * @link http://www.4fb.de * @link http://www.contenido.org * * {@internal * created 2006-05-10 * modified 2008-05-23 Added Debug_DevNull and Debug_VisibleAdv * * $Id$ * }} * */ if (!defined('CON_FRAMEWORK')) { die('Illegal call'); } class gdbMySQL extends gdbDriver { function buildJoinQuery($destinationTable, $destinationClass, $destinationPrimaryKey, $sourceClass, $primaryKey) { // Build a regular LEFT JOIN $field = "$destinationClass.$destinationPrimaryKey"; $tables = ""; $join = "LEFT JOIN $destinationTable AS $destinationClass ON " . Contenido_Security::toString($sourceClass . "." . $primaryKey) . " = " . Contenido_Security::toString($destinationClass . "." . $primaryKey); $where = ""; return array("field" => $field, "table" => $tables, "join" => $join, "where" => $where); } function buildOperator($sField, $sOperator, $sRestriction) { $sOperator = strtolower($sOperator); $sWhereStatement = ""; switch ($sOperator) { case "matchbool": $sqlStatement = "MATCH (%s) AGAINST ('%s' IN BOOLEAN MODE)"; $sWhereStatement = sprintf($sqlStatement, $sField, $this->_oItemClassInstance->_inFilter($sRestriction)); break; case "match": $sqlStatement = "MATCH (%s) AGAINST ('%s')"; $sWhereStatement = sprintf($sqlStatement, $sField, $this->_oItemClassInstance->_inFilter($sRestriction)); break; case "like": $sqlStatement = "%s LIKE '%%%s%%'"; $sWhereStatement = sprintf($sqlStatement, Contenido_Security::toString($sField), $this->_oItemClassInstance->_inFilter($sRestriction)); break; case "likeleft": $sqlStatement = "%s LIKE '%s%%'"; $sWhereStatement = sprintf($sqlStatement, Contenido_Security::toString($sField), $this->_oItemClassInstance->_inFilter($sRestriction)); break; case "likeright": $sqlStatement = "%s LIKE '%%%s'"; $sWhereStatement = sprintf($sqlStatement, Contenido_Security::toString($sField), $this->_oItemClassInstance->_inFilter($sRestriction)); break; case "notlike": $sqlStatement = "%s NOT LIKE '%%%s%%'"; $sWhereStatement = sprintf($sqlStatement, Contenido_Security::toString($sField), $this->_oItemClassInstance->_inFilter($sRestriction)); break; case "notlikeleft": $sqlStatement = "%s NOT LIKE '%s%%'"; $sWhereStatement = sprintf($sqlStatement, Contenido_Security::toString($sField), $this->_oItemClassInstance->_inFilter($sRestriction)); break; case "notlikeright": $sqlStatement = "%s NOT LIKE '%%%s'"; $sWhereStatement = sprintf($sqlStatement, Contenido_Security::toString($sField), $this->_oItemClassInstance->_inFilter($sRestriction)); break; case "diacritics": if (!is_object($GLOBALS["_cCharTable"])) { $GLOBALS["_cCharTable"] = new cCharacterConverter; } $aliasSearch = array(); $metaCharacters = array("*", "[", "]", "^", '$', "\\", "*", "'", '"', '+'); for ($i = 0; $i < strlen($sRestriction); $i ++) { $char = substr($sRestriction, $i, 1); $aliases = array(); $aliases = array_merge($aliases, $GLOBALS["_cCharTable"]->fetchDiacriticCharactersForNormalizedChar($this->_sEncoding, $char)); $normalizedChars = $GLOBALS["_cCharTable"]->fetchNormalizedCharsForDiacriticCharacter($this->_sEncoding, $char); foreach ($normalizedChars as $normalizedChar) { $aliases = array_merge($aliases, $GLOBALS["_cCharTable"]->fetchDiacriticCharactersForNormalizedChar($this->_sEncoding, $normalizedChar)); } $aliases = array_merge($aliases, $normalizedChars); if (count($aliases) > 0) { $aliases[] = $char; $allAliases = array(); foreach ($aliases as $alias) { $alias1 = $this->_oItemClassInstance->_inFilter($alias); $allAliases[] = $alias1; $allAliases[] = $alias; } $allAliases = array_unique($allAliases); $aliasSearch[] = "(" . implode("|", $allAliases) . ")"; } else { $addChars = array(); if (in_array($char, $metaCharacters)) { $addChars[] = "\\\\" . $char; } else { $addChars[] = $char; $vChar = $this->_oItemClassInstance->_inFilter($char); if ($char != $vChar) { if (in_array($vChar, $metaCharacters)) { $addChars[] = "\\\\" . $vChar; } else { $addChars[] = $vChar; } } } $aliasSearch[] = "(" . implode("|", $addChars) . ")"; } } $restriction = "'" . implode("", $aliasSearch) . "'"; $sWhereStatement = implode(" ", array($sField, "REGEXP", $restriction)); break; case "fulltext": break; case "in": if (is_array($sRestriction)) { $items = array(); foreach ($sRestriction as $key => $sRestrictionItem) { $items[] = "'" . $this->_oItemClassInstance->_inFilter($sRestrictionItem) . "'"; } $sRestriction = implode(", ", $items); } else { $sRestriction = "'" . $sRestriction . "'"; } $sWhereStatement = implode(" ", array($sField, "IN (", $sRestriction, ")")); break; case "notin": if (is_array($sRestriction)) { $items = array(); foreach ($sRestriction as $key => $sRestrictionItem) { $items[] = "'" . $this->_oItemClassInstance->_inFilter($sRestrictionItem) . "'"; } $sRestriction = implode(", ", $items); } else { $sRestriction = "'" . $sRestriction . "'"; } $sWhereStatement = implode(" ", array($sField, "NOT IN (", $sRestriction, ")")); break; default : $sRestriction = "'" . $this->_oItemClassInstance->_inFilter($sRestriction) . "'"; $sWhereStatement = implode(" ", array($sField, $sOperator, $sRestriction)); } return $sWhereStatement; } } ?>