You are here

comment_notify.install in Comment Notify 7

Installation/uninstallation for comment notify.

File

comment_notify.install
View source
<?php

/**
 * @file
 * Installation/uninstallation for comment notify.
 */

/**
 * Implements hook_install().
 */
function comment_notify_install() {

  // Create entries for existing comments.
  $comments_select = db_select('comment', 'c');
  $comments_select
    ->join('users', 'u', 'c.uid = u.uid');
  $comments_select
    ->addField('c', 'cid');
  $comments_select
    ->addExpression('0', 'notify');

  // Mix in a random string to all values.
  $salt = uniqid(mt_rand(), TRUE);
  if (db_driver() == 'pgsql') {
    $comments_select
      ->addExpression("MD5(:salt || c.mail || COALESCE(u.mail, u.init) || c.uid || c.name || c.nid || c.hostname || c.cid)", 'notify_hash', array(
      ':salt' => $salt,
    ));
  }
  else {

    // Use CONCAT_WS instead of CONCAT because it can handle NULL values.
    $comments_select
      ->addExpression("MD5(CONCAT_WS('', :salt, c.mail, COALESCE(u.mail, u.init), c.uid, c.name, c.nid, c.hostname, c.cid))", 'notify_hash', array(
      ':salt' => $salt,
    ));
  }

  // Set module weight low so that other modules act on the comment first.
  db_insert('comment_notify')
    ->from($comments_select)
    ->execute();
  db_update('system')
    ->fields(array(
    'weight' => 10,
  ))
    ->condition('name', 'comment_notify');
}

/**
 * Implements hook_uninstall().
 */
function comment_notify_uninstall() {
  $variables = array(
    'node_notify_default_mailtext',
    'comment_notify_author_subject',
    'comment_notify_node_notify_default_mailtext',
    'comment_notify_watcher_subject',
    'comment_notify_comment_notify_default_mailtext',
    'comment_notify_node_types',
    'comment_notify_available_alerts',
    'comment_notify_default_anon_mailalert',
    'comment_notify_default_registered_mailalert',
    'comment_notify_node_notify_default_mailalert',
    'comment_notify_comment_notify_default_mailtext',
    'comment_notify_node_notify_default_mailtext',
  );
  foreach ($variables as $variable) {
    variable_delete($variable);
  }
}

/**
 * Implements hook_schema().
 */
function comment_notify_schema() {
  $schema['comment_notify'] = array(
    'description' => 'Stores information about which commenters on the site have subscriped to followup emails.',
    'fields' => array(
      'cid' => array(
        'type' => 'int',
        'unsigned' => TRUE,
        'description' => 'The comment id from {comments}.cid',
        'not null' => TRUE,
        'disp-width' => '11',
      ),
      'notify' => array(
        'type' => 'int',
        'description' => 'An integer indicating the type of subscription: 0 means not subscribed, 1 means subscribed to all comments, and 2 means only subscribed to replies of this comment.',
        'size' => 'tiny',
        'not null' => TRUE,
        'disp-width' => '11',
      ),
      'notify_hash' => array(
        'type' => 'varchar',
        'description' => 'A hash of unique information about the commenter.  Used for unsubscribing users.',
        'length' => '128',
        'not null' => TRUE,
        'default' => '',
      ),
      'notified' => array(
        'type' => 'int',
        'description' => 'A boolean indicator for whether or not a notification for the comment has been sent: 1 means yes, 0 means no.',
        'size' => 'tiny',
        'not null' => TRUE,
        'default' => 0,
        'disp-width' => '11',
      ),
    ),
    'primary key' => array(
      'cid',
    ),
    'indexes' => array(
      'notify_hash' => array(
        'notify_hash',
      ),
    ),
  );
  $schema['comment_notify_user_settings'] = array(
    'fields' => array(
      'uid' => array(
        'type' => 'int',
        'unsigned' => TRUE,
        'description' => 'The user id from {users}.cid',
        'not null' => TRUE,
        'disp-width' => '11',
      ),
      'node_notify' => array(
        'type' => 'int',
        'description' => 'An integer indicating the default type of subscription: 0 means not subscribed, 1 means subscribed to all comments, and 2 means only subscribed to replies of this comment.',
        'size' => 'tiny',
        'not null' => TRUE,
        'default' => 0,
        'disp-width' => '11',
      ),
      'comment_notify' => array(
        'type' => 'int',
        'description' => 'An integer indicating the default type of subscription: 0 means not subscribed, 1 means subscribed to all comments, and 2 means only subscribed to replies of this comment.',
        'size' => 'tiny',
        'not null' => TRUE,
        'default' => 0,
        'disp-width' => '11',
      ),
    ),
    'primary key' => array(
      'uid',
    ),
  );
  return $schema;
}

/**
 * Head 2 head update for the new size of the hash field.
 */
function comment_notify_update_7002() {
  $new_spec = array(
    'type' => 'varchar',
    'description' => 'A hash of unique information about the commenter.  Used for unsubscribing users.',
    'length' => '128',
    'not null' => TRUE,
    'default' => '',
  );
  $keys = array(
    'indexes' => array(
      'notify_hash' => array(
        'notify_hash',
      ),
    ),
  );
  db_drop_index('comment_notify', 'notify_hash');
  db_change_field('comment_notify', 'notify_hash', 'notify_hash', $new_spec, $keys);
}

/**
 * Fix tokens in comment subscriber e-mail template.
 */
function comment_notify_update_7003() {
  $variables = array(
    'comment_notify_author_subject' => 'author',
    'comment_notify_node_notify_default_mailtext' => 'author',
    'comment_notify_watcher_subject' => 'commenter',
    'comment_notify_comment_notify_default_mailtext' => 'commenter',
  );
  foreach ($variables as $variable => $context) {

    // If the variable is using the default value, this will return NULL and we
    // can skip it.
    if ($text = variable_get($variable)) {
      $replacements = array(
        // Replace all node tokens with comment:node.
        '[comment:unsubscribe-url]' => '[comment-subscribed:unsubscribe-url]',
        '[comment:name]' => '[comment:author]',
        '[node:' => '[comment:node:',
      );
      if ($context == 'author') {
        $replacements['[user:name]'] = '[comment:node:author]';
        $replacements['[user:'] = '[comment:node:author:';
      }
      elseif ($context == 'commenter') {
        $replacements['[user:name]'] = '[comment-subscribed:author]';
        $replacements['[user:'] = '[comment-subscribed:author:';
      }
      $text = strtr($text, $replacements);
      variable_set($variable, $text);
    }
  }
  return 'Comment Notify token strings updated.';
}

/**
 * Fix a missing default causes warnings for Postgresql and some MySQL.
 */
function comment_notify_update_7004() {
  db_change_field('comment_notify', 'notified', 'notified', array(
    'type' => 'int',
    'size' => 'small',
    'unsigned' => TRUE,
    'not null' => TRUE,
    'default' => 0,
  ));
}

/**
 * Fix minor schema inconsistencies caused by the last update.
 */
function comment_notify_update_7005() {

  // Previous update altered size and unsigned unnecessarily.
  $notified_field = array(
    'type' => 'int',
    'description' => 'A boolean indicator for whether or not a notification for the comment has been sent: 1 means yes, 0 means no.',
    'size' => 'tiny',
    'not null' => TRUE,
    'default' => 0,
    'disp-width' => '11',
  );
  db_change_field('comment_notify', 'notified', 'notified', $notified_field);
}

Functions

Namesort descending Description
comment_notify_install Implements hook_install().
comment_notify_schema Implements hook_schema().
comment_notify_uninstall Implements hook_uninstall().
comment_notify_update_7002 Head 2 head update for the new size of the hash field.
comment_notify_update_7003 Fix tokens in comment subscriber e-mail template.
comment_notify_update_7004 Fix a missing default causes warnings for Postgresql and some MySQL.
comment_notify_update_7005 Fix minor schema inconsistencies caused by the last update.