[development] Restricting hook_db_rewrite_sql

Moshe Weitzman weitzman at tejasa.com
Sun Apr 16 18:17:34 UTC 2006


Do you control the query that needs rewriting? If so, put some hints ikn the
$args parameter to db_rewrite_sql(). If not, you have to find some unique
way of identifying the queries you want to rewrite.


On 4/16/06 2:11 PM, "Rob Thorne" <rob at torenware.com> wrote:

> I'm having problems getting hook_db_rewrite_sql to restrict its actions
> to queries where it has business rewriting, and am having difficulty
> figuring how what to look at in order to do this.
> 
> Here's the use case.  I have two node types  (call them
> "civinode_contact" and "civinode_access")  that I want viewable
> according to a couple of tables that test the current user.  This now
> works (i.e., it makes the right join and does the test I want),  but it
> also tries to rewrite the query that og.module creates to do its own
> listing in www.example.com/og, at least for the anonymous user:
> 
>     Unknown column 'og.type' in 'where clause' query: SELECT og.nid,
>     n.title, r.body, n.uid, u.name, og.description FROM og og INNER JOIN
>     node n ON og.nid = n.nid INNER JOIN node_revisions r ON r.vid =
>     n.vid INNER JOIN users u ON n.uid = u.uid LEFT JOIN node_access cna
>     ON cna.nid = og.nid WHERE ((og.type != 'civinode_access' AND og.type
>     != 'civinode_contact') ) AND og.directory=1 AND n.status=1 ORDER BY
>     n.nid DESC LIMIT 0, 50 in ......./includes/database.mysql.inc on
>     line 120.
> 
> The code looks something like this:
> 
>     function civinode_db_rewrite_sql($query, $primary_table,
>     $primary_field, $args){
>         global $user;
>        
>         if ($primary_field == 'nid') {
>             //check for access to contacts
>             if (user_access('view all contacts') or
>                     user_access('administer CiviCRM'))
>                 return; //no need to screen
>            
>             $result = array();
>             $result['join'] = "LEFT JOIN {node_access} cna ON cna.nid =
>     $primary_table.nid";
>             $contact_limit = "";
>             $accesses = civinode_get_accesses_for_user($user->uid);
>             if ($accesses) {
>                 $contact_limit = " OR cna.gid IN (" .
>                     implode(',', $accesses) . ")";
>             }
>             $result['where'] = "($primary_table.type !=
>     'civinode_access' AND $primary_table.type != 'civinode_contact')
>     $contact_limit";
>             //$result['where'] = $contact_limit;
>             return $result;
>         }
> 
> I've found that need to user $primary_table,  since at the very least,
> not every query aliases the node table to "n" (some alias it to "node",
> or just aren't aliasing it AFAIK).  But I don't want to be picking up
> this particular og query.
> 
> How do I restrict this hook so that it does not interfere with arbitrary
> queries, but picks up cases where it would restrict viewing my nodes (as
> I need it to do)?
> 
> Thanks,
> Rob
> 
> Rob Thorne
> Torenware Networks
> 




More information about the development mailing list