Fixing conditions quoting in DboSource, closes #4508

git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@6714 3807eeeb-6ff5-0310-8944-8be069107fe0
This commit is contained in:
nate 2008-04-23 15:24:57 +00:00
parent 7f6e54ea3a
commit 358a613243
2 changed files with 27 additions and 25 deletions

View file

@ -26,7 +26,7 @@
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
uses('set');
App::import('Core', 'Set');
/**
* DboSource
@ -1723,17 +1723,28 @@ class DboSource extends DataSource {
$match['2'] = str_replace('-!', '', $match['2']);
$data = $this->name($key) . ' ' . $match['1'] . ' ' . $match['2'];
} else {
$op = substr(trim($match[1]), 0, 1);
$op = substr(trim($match[1]), 0, 1);
$isOp = (
strpos('!=<>', trim($op)) !== false ||
strpos('!=<>', trim($match[1])) !== false ||
in_array(strtolower(trim($match[1])), $this->__sqlOps)
);
if (!empty($match['2']) && $quoteValues) {
if (!in_array($op, str_split('!=<>')) && !in_array(strtolower(trim($match[1])), $this->__sqlOps)) {
if (!$isOp) {
$match['1'] = ' = ';
$match['2'] = $this->value($match['0']);
} elseif (preg_match('/^(?:' . join('\\x20)|(?:', $this->__sqlOps) . '\\x20)/i', $match['1'])) {
} elseif (preg_match('/^(?:' . join('\\x20)|(?:', $this->__sqlOps) . '\s*\\x20)/i', $match['1'])) {
$match['2'] = str_replace(' AND ', "' AND '", $this->value($match['2']));
} else {
$match['2'] = $this->value($match['2']);
}
} elseif ($isOp) {
$match['1'] = trim($match['1']);
$match['2'] = $this->value($match['2']);
} else {
$match['2'] = $this->value($match['1']);
$match['1'] = ' = ';
}
$data = $this->__quoteFields($key);
if ($data === $key) {
@ -1878,8 +1889,7 @@ class DboSource extends DataSource {
$keys = preg_replace('/ORDER\\x20BY/i', '', $keys);
if (strpos($keys, '.')) {
preg_match_all('/([a-zA-Z0-9_]{1,})\\.([a-zA-Z0-9_]{1,})/', $keys, $result,
PREG_PATTERN_ORDER);
preg_match_all('/([a-zA-Z0-9_]{1,})\\.([a-zA-Z0-9_]{1,})/', $keys, $result, PREG_PATTERN_ORDER);
$pregCount = count($result['0']);
for ($i = 0; $i < $pregCount; $i++) {
@ -1963,30 +1973,14 @@ class DboSource extends DataSource {
}
}
/**
* Inserts multiple values into a join table
*
* @param string $table
* @param string $fields
* @param array $values
* @return bool True on success, false on failure
*/
function insertMulti($table, $fields, $values) {
$table = $this->fullTableName($table);
if (is_array($fields)) {
$fields = join(', ', array_map(array(&$this, 'name'), $fields));
}
$values = implode(', ', $values);
return $this->execute("INSERT INTO {$table} ({$fields}) VALUES {$values}");
}
/**
* Inserts multiple values into a join table
* Inserts multiple values into a table
*
* @param string $table
* @param string $fields
* @param array $values
* @access protected
*/
function __insertMulti($table, $fields, $values) {
function insertMulti($table, $fields, $values) {
if (is_object($table)) {
$table = $this->fullTableName($table);
}

View file

@ -1683,7 +1683,7 @@ class DboSourceTest extends CakeTestCase {
'NOT' => array('Course.id' => null, 'Course.vet' => 'N', 'level_of_education_id' => array(912,999)),
'Enrollment.yearcompleted' => '> 0')
);
$this->assertPattern('/^\s*WHERE\s+NOT\s+\(\(`Course`\.`id` IS NULL\)\s+AND NOT\s+\(`Course`\.`vet`\s+=\s+\'N\'\)\s+AND NOT\s+\(`level_of_education_id` IN \(912, 999\)\s*\)\)\s+AND\s+`Enrollment`\.`yearcompleted`\s+>\s+0\s*$/', $result);
$this->assertPattern('/^\s*WHERE\s+NOT\s+\(\(`Course`\.`id` IS NULL\)\s+AND NOT\s+\(`Course`\.`vet`\s+=\s+\'N\'\)\s+AND NOT\s+\(`level_of_education_id` IN \(912, 999\)\s*\)\)\s+AND\s+`Enrollment`\.`yearcompleted`\s+>\s+\'0\'\s*$/', $result);
$result = $this->db->conditions(array('id' => '<> 8'));
$this->assertPattern('/^\s*WHERE\s+`id`\s+<>\s+8\s*$/', $result);
@ -1728,6 +1728,14 @@ class DboSourceTest extends CakeTestCase {
$result = $this->db->conditions($conditions);
$expected = " WHERE `title` = 'user(s,arg) data'";
$this->assertEqual($result, $expected);
$result = $this->db->conditions(array("Book.book_name" => 'Java(TM)'));
$expected = " WHERE `Book`.`book_name` = 'Java(TM)'";
$this->assertEqual($result, $expected);
$result = $this->db->conditions(array("Book.book_name" => 'Java(TM) '));
$expected = " WHERE `Book`.`book_name` = 'Java(TM) '";
$this->assertEqual($result, $expected);
}
function testMixedConditionsParsing() {