View source
<?php
function notifications_schema() {
$schema['notifications'] = array(
'description' => 'The base table for subscriptions',
'fields' => array(
'sid' => array(
'description' => 'Unique Subscription id',
'type' => 'serial',
'unsigned' => TRUE,
'not null' => TRUE,
'disp-width' => '10',
),
'uid' => array(
'description' => 'User id this subscription belongs to.',
'type' => 'int',
'not null' => TRUE,
'disp-width' => '11',
),
'mdid' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'Unique destination id.',
),
'type' => array(
'description' => 'Subscription type, will depend on subscription modules enabled.',
'type' => 'varchar',
'length' => '255',
'not null' => TRUE,
'default' => '',
),
'event_type' => array(
'description' => 'Type of event that triggers this subscription.',
'type' => 'varchar',
'length' => '255',
'not null' => TRUE,
'default' => '',
),
'conditions' => array(
'description' => 'Number of conditions this subscription has, for query convenience.',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'disp-width' => '10',
),
'send_interval' => array(
'description' => 'Sending interval for notifications of this subscription.',
'type' => 'int',
'not null' => TRUE,
'default' => 0,
'disp-width' => '11',
),
'language' => array(
'description' => 'Language',
'type' => 'varchar',
'length' => '255',
'not null' => TRUE,
'default' => '',
),
'send_method' => array(
'description' => 'Sending method key, see Messaging module.',
'type' => 'varchar',
'length' => '255',
'not null' => TRUE,
'default' => '',
),
'cron' => array(
'description' => '1 if this subscription will generate notifications to be processed on cron.',
'type' => 'int',
'unsigned' => TRUE,
'size' => 'tiny',
'not null' => TRUE,
'default' => 0,
'disp-width' => '3',
),
'module' => array(
'description' => 'Alternate module name to handle notifications from this subscription',
'type' => 'varchar',
'length' => '255',
'not null' => FALSE,
),
'status' => array(
'description' => 'Subscription status: 0 = blocked, 1 = active, 2 = inactive',
'type' => 'int',
'not null' => TRUE,
'default' => 1,
'disp-width' => '11',
),
'destination' => array(
'description' => 'Alternate destination field for anonymous subscriptions, may be an email',
'type' => 'varchar',
'length' => '255',
'not null' => TRUE,
'default' => '',
),
),
'primary key' => array(
'sid',
),
);
$schema['notifications_fields'] = array(
'description' => 'Conditions for subscriptions, there may be none or many for each subscription.',
'fields' => array(
'sid' => array(
'description' => 'The {notifications}.sid, subscription this condition belongs to.',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'disp-width' => '10',
),
'field' => array(
'description' => 'The field type for this condition, will depend on subscription type and defined fields.',
'type' => 'varchar',
'length' => '255',
'not null' => TRUE,
),
'value' => array(
'description' => 'Matching value for the field, just for string values',
'type' => 'varchar',
'length' => '255',
'not null' => TRUE,
),
'intval' => array(
'description' => 'Matching value for the field, just for integer values',
'type' => 'int',
'not null' => TRUE,
'default' => 0,
'disp-width' => '11',
),
),
'primary key' => array(
'sid',
'field',
),
);
$schema['notifications_event'] = array(
'description' => 'Storage table for event parameters.',
'fields' => array(
'eid' => array(
'description' => 'Unique event id',
'type' => 'serial',
'unsigned' => TRUE,
'not null' => TRUE,
'disp-width' => '11',
),
'module' => array(
'description' => 'Module producing the event',
'type' => 'varchar',
'length' => '255',
'not null' => FALSE,
),
'type' => array(
'description' => 'Event type: node, feed, etc..',
'type' => 'varchar',
'length' => '255',
'not null' => FALSE,
),
'action' => array(
'description' => 'Event action: insert, update, etc.',
'type' => 'varchar',
'length' => '255',
'not null' => FALSE,
),
'typekey' => array(
'description' => 'Event key, will depend on type and action.',
'type' => 'varchar',
'length' => '255',
'not null' => TRUE,
'default' => '',
),
'oid' => array(
'description' => 'Object id of the primary object for the event. I.e. for node events it will be nid',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
'disp-width' => '11',
),
'language' => array(
'description' => 'Language.',
'type' => 'varchar',
'length' => '255',
'not null' => TRUE,
'default' => '',
),
'uid' => array(
'description' => 'Id of the user causing the event.',
'type' => 'int',
'not null' => FALSE,
'disp-width' => '11',
),
'params' => array(
'description' => 'Serialized event parameters.',
'type' => 'text',
'not null' => FALSE,
'serialize' => TRUE,
),
'created' => array(
'description' => 'Unix timestamp, when it was created.',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
'disp-width' => '11',
),
'counter' => array(
'description' => 'Keeps a count of the notifications queued for this event.',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
'disp-width' => '11',
),
),
'primary key' => array(
'eid',
),
);
$schema['notifications_queue'] = array(
'description' => 'Table to store notifications produced by subscriptions, to be processed on cron.',
'fields' => array(
'sqid' => array(
'description' => 'Unique row id',
'type' => 'serial',
'unsigned' => TRUE,
'not null' => TRUE,
'disp-width' => '10',
),
'eid' => array(
'description' => 'The {notifications_event}.eid of the Event producing this notification.',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
'disp-width' => '11',
),
'sid' => array(
'description' => 'The {notifications}.sid of the Subscription producing this notification.',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
'disp-width' => '11',
),
'uid' => array(
'description' => 'The {user}.uid of the user this notification is for.',
'type' => 'int',
'not null' => FALSE,
'disp-width' => '11',
),
'language' => array(
'description' => 'Language, currently unused.',
'type' => 'varchar',
'length' => '255',
'not null' => TRUE,
'default' => '',
),
'type' => array(
'description' => 'The {notifications}.type of the Subscription producing this notification.',
'type' => 'varchar',
'length' => '255',
'not null' => FALSE,
),
'send_interval' => array(
'description' => 'Send interval for digesting notifications.',
'type' => 'int',
'not null' => FALSE,
'disp-width' => '11',
),
'send_method' => array(
'description' => 'Messaging send method',
'type' => 'varchar',
'length' => '255',
'not null' => FALSE,
),
'send_time' => array(
'description' => 'Unix timestamp, when this notification is to be sent, for scheduled notifications.',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
'disp-width' => '10',
),
'sent' => array(
'description' => 'Unix timestamp, when this notification was actually sent for rows kept as logs.',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
'disp-width' => '10',
),
'created' => array(
'description' => 'Unix timestamp, when this notification was created.',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
'disp-width' => '10',
),
'cron' => array(
'description' => 'Will be 1 for rows to be processed on cron.',
'type' => 'int',
'unsigned' => TRUE,
'size' => 'tiny',
'not null' => TRUE,
'default' => 0,
'disp-width' => '3',
),
'conditions' => array(
'description' => 'The {notifications}.conditions counter, just for query convenience.',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
'disp-width' => '10',
),
'module' => array(
'description' => 'Optional module to process this notification.',
'type' => 'varchar',
'length' => '255',
'not null' => FALSE,
),
'destination' => array(
'description' => 'Optional destination for anonymous subscriptions.',
'type' => 'varchar',
'length' => '255',
'not null' => FALSE,
),
'mdid' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'Unique destination id.',
),
),
'primary key' => array(
'sqid',
),
);
$schema['notifications_sent'] = array(
'description' => 'Keeps track of when the last notification was sent for a user, method, interval.',
'fields' => array(
'mdid' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'Unique destination id.',
),
'uid' => array(
'description' => 'The {user}.uid this row belongs to.',
'type' => 'int',
'not null' => TRUE,
'default' => 0,
'disp-width' => '11',
),
'send_interval' => array(
'description' => 'The Notifications send interval.',
'type' => 'int',
'not null' => TRUE,
'default' => 0,
'disp-width' => '10',
),
'sent' => array(
'description' => 'Unix timestamp, when the last notification was sent.',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
'disp-width' => '10',
),
'counter' => array(
'description' => 'Keeps a count of the notifications sent.',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
'disp-width' => '11',
),
),
'primary key' => array(
'mdid',
'send_interval',
),
);
return $schema;
}
function notifications_install() {
drupal_install_schema('notifications');
}
function notifications_enable() {
autoload_flush_caches();
}
function notifications_uninstall() {
drupal_uninstall_schema('notifications');
foreach (array(
'event_enabled',
'send_intervals',
'sender',
'sendself',
'send_immediate',
) as $name) {
variable_del("notifications_{$name}");
}
}
function notifications_update_1() {
$ret = array();
$ret[] = update_sql("ALTER TABLE {notifications} ADD COLUMN `cron` TINYINT UNSIGNED NOT NULL DEFAULT 0");
$ret[] = update_sql("ALTER TABLE {notifications_queue} ADD COLUMN `cron` TINYINT UNSIGNED NOT NULL DEFAULT 0");
$ret[] = update_sql("UPDATE {notifications} SET cron = 1");
$ret[] = update_sql("UPDATE {notifications_queue} SET cron = 1");
return $ret;
}
function notifications_update_2() {
$ret = array();
$ret[] = update_sql("DROP TABLE {notifications_user}");
$ret[] = update_sql("ALTER TABLE {notifications_queue} DROP COLUMN `name`;");
$ret[] = update_sql("ALTER TABLE {notifications_queue} DROP COLUMN `field`;");
$ret[] = update_sql("ALTER TABLE {notifications_queue} DROP COLUMN `value`;");
$ret[] = update_sql("ALTER TABLE {notifications_queue} DROP COLUMN `author`;");
$ret[] = update_sql("ALTER TABLE {notifications_queue} ADD COLUMN `conditions` INTEGER UNSIGNED NOT NULL DEFAULT 0 AFTER `cron`");
variable_set('notifications_default_auto', variable_get('notifications_autoset', 0));
variable_del('notifications_autoset');
return $ret;
}
function notifications_update_3() {
$ret[] = update_sql("ALTER TABLE {notifications} ADD COLUMN `module` VARCHAR(255) AFTER `cron`;");
$ret[] = update_sql("ALTER TABLE {notifications} ADD COLUMN `status` INT NOT NULL DEFAULT 1 AFTER `module`;");
$ret[] = update_sql("ALTER TABLE {notifications_queue} ADD COLUMN `module` VARCHAR(255);");
$ret[] = update_sql("UPDATE {notifications} SET module = 'notifications'");
$ret[] = update_sql("UPDATE {notifications_queue} SET module = 'notifications'");
return $ret;
}
function notifications_update_4() {
$ret[] = update_sql("UPDATE {system} SET weight = 100 WHERE name = 'notifications_content' AND type = 'module'");
return $ret;
}
function notifications_update_5() {
$ret = array();
if ($omitted = variable_get('notifications_omitted_content_types', array())) {
$allowed = array();
$types = node_get_types();
foreach ($types as $type => $info) {
if (!isset($omitted[$type])) {
$allowed[$type] = $type;
}
}
variable_set('notifications_content_types', $allowed);
}
if ($omitted = variable_get('notifications_omitted_taxa', array())) {
$vocabularies = taxonomy_get_vocabularies();
foreach ($omitted as $vid) {
unset($vocabularies[$vid]);
}
variable_set('notifications_tags_vocabularies', array_combine(array_keys($vocabularies), array_keys($vocabularies)));
}
return $ret;
}
function notifications_update_6() {
$ret = array();
foreach (node_get_types() as $type => $info) {
$option = variable_get('notifications_node_ui_' . $type, 0);
if ($option && !is_array($option)) {
variable_set('notifications_node_ui_' . $type, array(
$option,
));
}
}
return $ret;
}
function notifications_update_6001() {
$ret = array();
variable_set('notifications_send_immediate', variable_get('notifications_send_inmediate', 0));
variable_del('notifications_send_inmediate');
return $ret;
}
function notifications_update_6002() {
$ret = array();
db_add_field($ret, 'notifications_event', 'counter', array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
'disp-width' => '11',
));
db_add_field($ret, 'notifications', 'destination', array(
'type' => 'varchar',
'length' => '255',
'not null' => FALSE,
));
db_add_field($ret, 'notifications_queue', 'destination', array(
'type' => 'varchar',
'length' => '255',
'not null' => FALSE,
));
$ret[] = update_sql("UPDATE {notifications_event} e SET counter = (SELECT COUNT(*) FROM {notifications_queue} q WHERE q.eid = e.eid)");
return $ret;
}
function notifications_update_6003() {
$ret = array();
db_add_field($ret, 'notifications_fields', 'intval', array(
'type' => 'int',
'not null' => TRUE,
'default' => 0,
'disp-width' => '11',
));
switch ($GLOBALS['db_type']) {
case 'mysql':
case 'mysqli':
$ret[] = update_sql('UPDATE {notifications_fields} SET intval = CAST(value AS UNSIGNED) WHERE value REGEXP \'^-?[0-9]+$\'');
break;
case 'pgsql':
$ret[] = update_sql('UPDATE {notifications_fields} SET intval = CAST(value AS INTEGER) WHERE value SIMILAR TO \'^-?[0-9]+$\'');
break;
}
return $ret;
}
function notifications_update_6004() {
drupal_get_schema(NULL, TRUE);
return array();
}
function notifications_update_6005() {
$ret = array();
$field_mdid = array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => FALSE,
);
db_add_field($ret, 'notifications', 'mdid', $field_mdid);
db_add_field($ret, 'notifications_queue', 'mdid', $field_mdid);
db_add_field($ret, 'notifications_sent', 'mdid', $field_mdid);
db_drop_primary_key($ret, 'notifications_sent');
return $ret;
}
function notifications_update_6006() {
return _notifications_update_queue_clean();
}
function notifications_update_6007() {
return _notifications_update_fix_destinations('create');
}
function notifications_update_6008() {
return array();
}
function notifications_update_6009() {
$ret = array();
db_add_primary_key($ret, 'notifications_sent', array(
'mdid',
'send_interval',
));
return $ret;
}
function notifications_update_6010() {
return array();
}
function notifications_update_6011() {
$ret = array();
$language_field = array(
'type' => 'varchar',
'length' => 12,
'not null' => TRUE,
'default' => '',
);
$language_default = language_default('language');
if (!variable_get('notifications_update_destinations', 0)) {
$ret = _notifications_update_queue_clean();
}
db_change_field($ret, 'notifications_queue', 'language', 'language', $language_field);
db_add_field($ret, 'notifications', 'language', $language_field);
$ret[] = update_sql("UPDATE {notifications} n SET language = (SELECT language FROM {users} u WHERE n.uid = u.uid AND u.language <> '')");
$ret[] = update_sql("UPDATE {notifications} SET language = '{$language_default}' WHERE language = '' OR language IS NULL");
return $ret;
}
function notifications_update_6012() {
$ret = array();
db_add_field($ret, 'notifications_event', 'typekey', array(
'type' => 'varchar',
'length' => '255',
'not null' => TRUE,
'default' => '',
));
return $ret;
}
function notifications_update_6013() {
return _notifications_update_queue_clean();
}
function notifications_update_6014() {
return array();
}
function notifications_update_6015() {
module_load_install('messaging');
return _messaging_update_duplicate_destinations();
}
function notifications_update_6016() {
return _notifications_update_fix_destinations('update');
}
function notifications_update_6017() {
$ret = array();
if (db_column_exists('notifications_sent', 'send_method')) {
db_drop_field($ret, 'notifications_sent', 'send_method');
}
db_add_field($ret, 'notifications_sent', 'counter', array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
));
db_add_field($ret, 'notifications_queue', 'send_time', array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
));
return $ret;
}
function _notifications_update_queue_clean() {
$ret = array();
$ret[] = update_sql("DELETE FROM {notifications_queue}");
$ret[] = update_sql("DELETE FROM {notifications_event}");
$ret[] = update_sql("DELETE FROM {notifications_sent}");
return $ret;
}
function _notifications_update_fix_destinations($op) {
$ret = array();
$methods = $addresses = array();
foreach (messaging_method_info() as $method => $info) {
$type = isset($info['address_type']) ? $info['address_type'] : $info['group'];
$type_method[$type][] = $method;
$method_type[$method] = $type;
}
if ($op == 'create') {
foreach ($type_method as $type => $methods) {
$ret[] = update_sql("INSERT INTO {messaging_destination} (uid, type, address) SELECT DISTINCT uid, '{$type}', destination FROM {notifications} WHERE send_method IN ('" . implode("','", $methods) . "')");
}
}
elseif ($op == 'update') {
foreach ($method_type as $method => $type) {
$ret[] = update_sql("UPDATE {notifications} n INNER JOIN {messaging_destination} d ON n.uid = d.uid AND d.type = '{$type}' SET n.mdid = d.mdid WHERE n.uid > 0 AND n.send_method = '{$method}'");
$ret[] = update_sql("UPDATE {notifications} n INNER JOIN {messaging_destination} d ON d.uid = 0 AND d.type = '{$type}' AND n.destination = d.address SET n.mdid = d.mdid WHERE n.uid = 0 AND n.send_method = '{$method}'");
}
}
return $ret;
}