Looking at this function which raps db_query calls and allows modules to alter the query, I was wondering how a hook_db_rewrite_sql is supposed to distinguish the queries that it wants to alter from the queries that it wants to leave alone? This is something that still needs some work IMO. Right now you can access the primary table (i.e. 'n' for node, but I always hated how it didn't use the full pre-prefixed table name) and field (i.e. 'nid'). This is pretty scary considering we now have such clean implementations for other drupal_alter()isms.
I know I have participated in a discussion like this before, but couldn't find the issue. So here it is again: What about passing a unique identifier along with every call of db_rewrite_sql? Instead of just wrapping db_rewrite_sql() we could also pass $module and $key so we have accurate namespaces for each query. (Or, we could just do it like hook_mail_alter(), but I think there could be namespace conflicts if a module named foo_module's foo_module_key screws with a module named foo's foo_module_key :P) I know we have $args, but that is already being used for actual args IIRC. What about replacing db_rewrite_sql('SELECT * FROM ...', 'node_query_select_foo', 'n', 'nid', $args) with some form of drupal_alter() call function db_rewrite_sql(...) { $query = 'SELECT * FROM ...'; drupal_alter('query', $query, 'node_query_select_foo', 'node', 'nid', $args) return $query; } I feel like this is much cleaner so you know exactly which query you are rewriting as opposed to just analyzing the query, primary table/field. If we made this really clean and precise maybe we could open to door to writing even better access modules. But then again...code is gold. Rob Roy Barreca Founder and COO Electronic Insight Corporation http://www.electronicinsight.com rob@electronicinsight.com Ashraf Amayreh wrote:
Looking at this function which raps db_query calls and allows modules to alter the query, I was wondering how a hook_db_rewrite_sql is supposed to distinguish the queries that it wants to alter from the queries that it wants to leave alone?
Only way I can think of is to do a string match on large parts of the original query, but isn't this quite messy, or am I missing something? Could someone please shed the light on this issue?