[development] Restricting hook_db_rewrite_sql

Rob Thorne rob at torenware.com
Sun Apr 16 19:56:36 UTC 2006


Moshe,

In general,  I don't know who writes these queries, nor can I control 
them:  I am only using hook_db_rewrite_sql so that queries that list my 
nodes will omit them.  A good example is the query that generates the 
default front page (*/node).

There does not appear to be anything specific in the calling conventions 
to hook_db_rewrite_sql for this purpose.  If there is, tell me and I 
will use it.

Thanks,
Rob

Moshe Weitzman wrote:
> 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