You are here

function auto_expire_cron in Auto Expire 5

Same name and namespace in other branches
  1. 7 auto_expire.module \auto_expire_cron()

File

./auto_expire.module, line 243

Code

function auto_expire_cron() {
  foreach (node_get_types() as $type => $name) {
    $code = AUTO_EXPIRE_NODE_TYPE . $type;
    if (variable_get($code . '_e', 0)) {
      $days = variable_get($code . '_d', AUTO_EXPIRE_DAYS);
      $warn = variable_get($code . '_w', AUTO_EXPIRE_WARN);
      $purge = variable_get($code . '_p', AUTO_EXPIRE_PURGE);

      // Send out expiration warnings
      if ($warn > 0) {
        $subject = variable_get(AUTO_EXPIRE_EMAIL . 'warn_subject', '');
        $body = variable_get(AUTO_EXPIRE_EMAIL . 'warn_body', '');
        switch ($GLOBALS['db_type']) {
          case 'mysql':
          case 'mysqli':
            $result = db_query('SELECT n.nid, n.title FROM {auto_expire} e, {node} n WHERE n.nid = e.nid AND n.status = 1 AND e.warned = 0 AND (FROM_UNIXTIME(e.expire) - INTERVAL %d DAY) <= NOW()', $warn);
            break;
          case 'pgsql':
            $result = db_query('SELECT n.nid, n.title FROM {auto_expire} e, {node} n WHERE n.nid = e.nid AND n.status = 1 AND e.warned = 0 AND ((e.expire::ABSTIME::TIMESTAMP) - INTERVAL \'%d DAYS\') <= NOW()', $warn);
            break;
        }
        while ($node = db_fetch_object($result)) {
          _auto_expire_notify_warning($node->nid, $node->title, $name->name, $days, $subject, $body);
          db_query('UPDATE {auto_expire} SET warned = 1 WHERE nid = %d', $node->nid);
          watchdog('auto_expire', 'Auto expire warning for node ' . $node->nid, WATCHDOG_NOTICE);
        }
      }

      // Expire
      $subject = variable_get(AUTO_EXPIRE_EMAIL . 'expired_subject', '');
      $body = variable_get(AUTO_EXPIRE_EMAIL . 'expired_body', '');
      switch ($GLOBALS['db_type']) {
        case 'mysql':
        case 'mysqli':
          $result = db_query('SELECT n.nid, n.title FROM {auto_expire} e, {node} n WHERE n.nid = e.nid AND n.status = 1 AND FROM_UNIXTIME(e.expire) <= NOW()');
          break;
        case 'pgsql':
          $result = db_query('SELECT n.nid, n.title FROM {auto_expire} e, {node} n WHERE n.nid = e.nid AND n.status = 1 AND (e.expire::ABSTIME::TIMESTAMP) <= NOW()');
          break;
      }
      while ($node = db_fetch_object($result)) {
        db_query('UPDATE {node} SET status = 0 WHERE nid = %d', $node->nid);
        _auto_expire_notify_expired($node->nid, $node->title, $name->name, $subject, $body);
        watchdog('auto_expire', 'Unpublishing node ' . $node->nid, WATCHDOG_NOTICE);
      }

      // Purge
      if ($purge > 0) {
        switch ($GLOBALS['db_type']) {
          case 'mysql':
          case 'mysqli':
            $result = db_query('SELECT e.nid FROM {auto_expire} e, {node} n WHERE n.nid = e.nid AND n.status = 0 AND (FROM_UNIXTIME(e.expire) + INTERVAL %d DAY) <= NOW()', $purge);
            break;
          case 'pgsql':
            $result = db_query('SELECT e.nid FROM {auto_expire} e, {node} n WHERE n.nid = e.nid AND n.status = 0 AND ((e.expire::ABSTIME::TIMESTAMP) + INTERVAL \'%d DAYS\') <= NOW()', $purge);
            break;
        }
        $cntPurged = 0;
        while ($nid = db_result($result)) {
          $node = node_load($nid);

          /* copied from node_delete - to bypass node_access - cache_clear_all moved outside the loop */
          db_query('DELETE FROM {node} WHERE nid = %d', $nid);
          db_query('DELETE FROM {node_revisions} WHERE nid = %d', $nid);

          // Call the node-specific callback (if any):
          node_invoke($node, 'delete');
          node_invoke_nodeapi($node, 'delete');

          // Remove this node from the search index if needed.
          if (function_exists('search_wipe')) {
            search_wipe($nid, 'node');
          }

          /* end of copy */
          watchdog('auto_expire', "Auto expire purged node: {$nid}", WATCHDOG_NOTICE);
          $cntPurged++;
        }
        if ($cntPurged > 0) {

          // Clear the cache so an anonymous poster can see the node being deleted.
          cache_clear_all();
          watchdog('auto_expire', "Auto expire purged {$cntPurged} node(s).", WATCHDOG_NOTICE);
        }
      }
    }
  }
}