function notifications_queue in Notifications 6
Same name and namespace in other branches
- 5 notifications.module \notifications_queue()
- 6.4 notifications.module \notifications_queue()
- 6.2 notifications.module \notifications_queue()
- 6.3 notifications.module \notifications_queue()
Queue events for notifications adding query conditions from plug-ins
This is an example of the resulting query
INSERT INTO {notifications_queue} (uid, sid, module, eid, send_interval, send_method, cron, created, conditions) SELECT DISTINCT s.uid, s.sid, s.module, 34, s.send_interval, s.send_method, s.cron, 1230578161, s.conditions FROM notifications s INNER JOIN notifications_fields f ON s.sid = f.sid WHERE s.status = 1 AND s.event_type = 'node' AND s.send_interval >= 0 AND ((f.field = 'nid' AND f.value = '2') OR (f.field = 'type' AND f.value = 'story') OR (f.field = 'author' AND f.value = '1')) GROUP BY s.uid, s.sid, s.module, s.send_interval, s.send_method, s.cron, s.conditions HAVING s.conditions = count(f.sid)
Parameters
$event: Event array.
1 call to notifications_queue()
- notifications_event in ./
notifications.module - Process subscriptions events
5 string references to 'notifications_queue'
- notifications_delete_subscription in ./
notifications.module - Delete subscription and clean up related data.
- notifications_delete_subscriptions in ./
notifications.module - Delete multiple subscriptions and clean up related data (pending notifications, fields).
- notifications_queue_query in ./
notifications.cron.inc - Build query conditions for queue queries
- notifications_queue_update in ./
notifications.cron.inc - Update queue rows with defined values
- notifications_update_6002 in ./
notifications.install - Add some fields
File
- ./
notifications.module, line 405 - Notifications module
Code
function notifications_queue($event) {
global $notifications_send_immediate;
$query = array();
// Build big insert query using the query builder. The fields for this event type will be added by the plug-ins.
// If no arguments retrieved, skip this step
if ($query_args = notifications_module_information('query', 'event', $event->type, $event)) {
$query['insert'] = array(
'uid',
'sid',
'module',
'eid',
'send_interval',
'send_method',
'cron',
'created',
'conditions',
);
$query['into'] = '{notifications_queue}';
$query['distinct'] = TRUE;
$query['select'] = array(
's.uid',
's.sid',
's.module',
'%d',
's.send_interval',
's.send_method',
's.cron',
'%d',
's.conditions',
);
$query['from'] = array(
'{notifications} s',
);
$query['select args'] = array(
$event->eid,
$event->created,
);
$query['join'] = array(
'INNER JOIN {notifications_fields} f ON s.sid = f.sid',
);
$query['where'] = array(
's.status = 1',
"s.event_type = '%s'",
's.send_interval >= 0',
);
$query['where args'] = array(
$event->type,
);
// Add one more condition if we don't send notifications on own posts
if (!variable_get('notifications_sendself', 0) && !empty($event->uid)) {
$query['where'][] = 's.uid <> %d';
$query['where args'][] = $event->uid;
}
// Some group by fields are not really needed but added for pgsql compatibility
$query['group'] = array(
's.uid',
's.sid',
's.module',
's.send_interval',
's.send_method',
's.cron',
's.conditions',
);
// We throw in all the conditions and check the number of matching conditions
// that must be equal to the subscription conditions number
$query['having'] = array(
's.conditions = count(f.sid)',
);
// We add parameters for each module separately
foreach ($query_args as $query_params) {
$query = notifications_query_build($query_params, $query);
}
// Give a chance to other modules to alter the query or empty it so we don't throw it
drupal_alter('notifications_query', $query);
// Finally we build the SELECT part of the query and glue it to the INSERT
if ($query) {
list($sql, $args) = notifications_query_sql($query);
db_query($sql, $args);
}
}
// Modules can do cleanup operations or modify the queue
notifications_module_invoke('event queued', $event, $query);
// Now update event counter with rows in notifications_queue or delete if no rows
if ($count = db_result(db_query('SELECT COUNT(*) FROM {notifications_queue} WHERE eid = %d', $event->eid))) {
db_query('UPDATE {notifications_event} SET counter = %d WHERE eid = %d', $count, $event->eid);
// If immediate sending enabled, store eid for sending on page exit.
if (variable_get('notifications_send_immediate', 0)) {
$notifications_send_immediate[] = $event->eid;
}
}
else {
db_query('DELETE FROM {notifications_event} WHERE eid = %d', $event->eid);
}
}