function db_rewrite_sql in Drupal 6
Same name and namespace in other branches
- 4 includes/database.inc \db_rewrite_sql()
- 5 includes/database.inc \db_rewrite_sql()
Rewrites node, taxonomy and comment queries. Use it for listing queries. Do not use FROM table1, table2 syntax, use JOIN instead.
Parameters
$query: Query to be rewritten.
$primary_table: Name or alias of the table which has the primary key field for this query. Typical table names would be: {blocks}, {comments}, {forum}, {node}, {menu}, {term_data} or {vocabulary}. However, it is more common to use the the usual table aliases: b, c, f, n, m, t or v.
$primary_field: Name of the primary field.
$args: An array of arguments, passed to the implementations of hook_db_rewrite_sql.
Return value
The original query with JOIN and WHERE statements inserted from hook_db_rewrite_sql implementations. nid is rewritten if needed.
Related topics
42 calls to db_rewrite_sql()
- block_list in modules/
block/ block.module - Return all blocks in the specified region for the current user.
- blogapi_mt_validate_terms in modules/
blogapi/ blogapi.module - Blogging API helper - find allowed taxonomy terms for a node type.
- blog_block in modules/
blog/ blog.module - Implementation of hook_block().
- blog_feed_last in modules/
blog/ blog.pages.inc - Menu callback; displays an RSS feed containing recent blog entries of all users.
- blog_feed_user in modules/
blog/ blog.pages.inc - Menu callback; displays an RSS feed containing recent blog entries of a given user.
File
- includes/
database.inc, line 328 - Wrapper for database interface code.
Code
function db_rewrite_sql($query, $primary_table = 'n', $primary_field = 'nid', $args = array()) {
list($join, $where, $distinct) = _db_rewrite_sql($query, $primary_table, $primary_field, $args);
if ($distinct) {
$query = db_distinct_field($primary_table, $primary_field, $query);
}
if (!empty($where) || !empty($join)) {
$pattern = '{
# Beginning of the string
^
((?P<anonymous_view>
# Everything within this set of parentheses is named "anonymous view"
(?:
[^()]++ # anything not parentheses
|
\\( (?P>anonymous_view) \\) # an open parenthesis, more "anonymous view" and finally a close parenthesis.
)*
)[^()]+WHERE)
}x';
preg_match($pattern, $query, $matches);
if (!$where) {
$where = '1 = 1';
}
if ($matches) {
$n = strlen($matches[1]);
$second_part = substr($query, $n);
$first_part = substr($matches[1], 0, $n - 5) . " {$join} WHERE {$where} AND ( ";
// PHP 4 does not support strrpos for strings. We emulate it.
$haystack_reverse = strrev($second_part);
}
else {
$haystack_reverse = strrev($query);
}
// No need to use strrev on the needle, we supply GROUP, ORDER, LIMIT
// reversed.
foreach (array(
'PUORG',
'REDRO',
'TIMIL',
) as $needle_reverse) {
$pos = strpos($haystack_reverse, $needle_reverse);
if ($pos !== FALSE) {
// All needles are five characters long.
$pos += 5;
break;
}
}
if ($matches) {
if ($pos === FALSE) {
$query = $first_part . $second_part . ')';
}
else {
$query = $first_part . substr($second_part, 0, -$pos) . ')' . substr($second_part, -$pos);
}
}
elseif ($pos === FALSE) {
$query .= " {$join} WHERE {$where}";
}
else {
$query = substr($query, 0, -$pos) . " {$join} WHERE {$where} " . substr($query, -$pos);
}
}
return $query;
}