function coder_upgrade_parse_select_query_string in Coder 7
Same name and namespace in other branches
- 7.2 coder_upgrade/conversions/db.inc \coder_upgrade_parse_select_query_string()
Replaces D6 database API call with D7 equivalent.
@todo Fill in this with unhandled items.
Parameters
PGPNode $node: The node containing the function call object to be replaced.
string $sql: The SQL query string to parse.
array $values: List of replacement values passed to db_query().
1 call to coder_upgrade_parse_select_query_string()
- coder_upgrade_parse_query_string in coder_upgrade/
conversions/ db.inc - Replaces D6 database API call with D7 equivalent.
File
- coder_upgrade/
conversions/ db.inc, line 271 - Provides conversion routines applied to database API function calls and hooks.
Code
function coder_upgrade_parse_select_query_string($node, $sql, $values, $delimiter) {
// Create helper objects.
$editor = PGPEditor::getInstance();
// Get the function call object.
$item =& $node->data;
$find = '@^(SELECT.*?WHERE\\s+)(.*?)$@s';
preg_match($find, $sql, $matches);
cdp($matches, '$matches');
if (empty($matches)) {
cdp($sql, '$sql');
clp('ERROR: could not parse sql SELECT statement.');
return array(
'NULL',
);
// $new;
}
// Convert conditions to use named placeholders (i.e., from field = '%s' to
// field = :field).
// TODO handle more complex conditions
// if (isset($matches[2]) && $matches[2]) {
preg_match_all('/
(\\S*)\\s*([!=<>]+)\\s*[\'"]?%[sdfb][\'"]? # Match field = %d
|
(\\S*)\\s*([!=<>]+)\\s*([\'"].*?[\'"]|\\S*) # Match field literals
|
(\\S*)\\s+IN\\s?\\([\'"]%s[\'"]?\\) # Match field IN(%s)
/x', $matches[2], $conditions);
cdp($conditions, '$conditions');
$condition_keys = array();
foreach ($conditions[0] as $key => $condition) {
if ($conditions[1][$key]) {
// field = %d condition
$condition_keys[] = ':' . $conditions[1][$key];
$sql = str_replace($condition, $conditions[1][$key] . ' ' . $conditions[2][$key] . ' :' . $conditions[1][$key], $sql);
}
elseif ($conditions[3][$key]) {
// field = literal condition
$condition_keys[] = ':' . $conditions[3][$key];
$sql = str_replace($condition, $conditions[3][$key] . ' ' . $conditions[4][$key] . ' :' . $conditions[3][$key], $sql);
$item
->insertParameter($key + 1, $editor
->expressionToStatement($conditions[5][$key]));
}
elseif ($conditions[6][$key]) {
// field IN (%s) condition
$condition_keys[] = ':' . $conditions[6][$key];
$sql = str_replace($condition, $conditions[6][$key] . ' IN (:' . $conditions[6][$key] . ')', $sql);
// D6 convention was to use implode(",", $array). Now we can just pass in the array.
$param = $item
->getParameter($key + 1)
->getElement()
->getParameter(1);
$item
->setParameter($key + 1, $param);
}
}
// Replace the $sql parameter.
$editor
->setParameter($item, 0, $delimiter . $sql . $delimiter);
if (empty($condition_keys)) {
// Parsing of conditions failed.
clp("ERROR: Could not parse the conditions to select query '{$sql}' in " . __FUNCTION__);
$item
->insertStatementBefore($editor
->commentToStatement('// TODO Please convert this statement to the D7 database API syntax.'));
return;
}
// Arrayitize the values array.
$string = $editor
->arrayitize($item, 1, $condition_keys, array_fill(0, count($condition_keys), "'XXX_YYY'"));
cdp($string, '$string');
$temp = $editor
->expressionToStatement($string);
$temp
->getElement(0)->multiline = 0;
$item
->setParameter(1, $temp);
// }
}