[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/includes/ -> prune.php (source)

   1  <?php
   2  /***************************************************************************
   3  *                                 prune.php
   4  *                            -------------------
   5  *   begin                : Thursday, June 14, 2001
   6  *   copyright            : (C) 2001 The phpBB Group
   7  *   email                : support@phpbb.com
   8  *
   9  *   $Id: prune.php 5508 2006-01-29 17:31:16Z grahamje $
  10  *
  11  *
  12  ***************************************************************************/
  13  
  14  /***************************************************************************
  15   *
  16   *   This program is free software; you can redistribute it and/or modify
  17   *   it under the terms of the GNU General Public License as published by
  18   *   the Free Software Foundation; either version 2 of the License, or
  19   *   (at your option) any later version.
  20   *
  21   ***************************************************************************/
  22  
  23  if ( !defined('IN_PHPBB') )
  24  {
  25     die("Hacking attempt");
  26  }
  27  
  28  require($phpbb_root_path . 'includes/functions_search.'.$phpEx);
  29  
  30  function prune($forum_id, $prune_date, $prune_all = false)
  31  {
  32      global $db, $lang;
  33  
  34      // Before pruning, lets try to clean up the invalid topic entries
  35      $sql = 'SELECT topic_id FROM ' . TOPICS_TABLE . '
  36          WHERE topic_last_post_id = 0';
  37      if ( !($result = $db->sql_query($sql)) )
  38      {
  39          message_die(GENERAL_ERROR, 'Could not obtain lists of topics to sync', '', __LINE__, __FILE__, $sql);
  40      }
  41  
  42      while( $row = $db->sql_fetchrow($result) )
  43      {
  44          sync('topic', $row['topic_id']);
  45      }
  46  
  47      $db->sql_freeresult($result);
  48  
  49      $prune_all = ($prune_all) ? '' : 'AND t.topic_vote = 0 AND t.topic_type <> ' . POST_ANNOUNCE;
  50      //
  51      // Those without polls and announcements ... unless told otherwise!
  52      //
  53      $sql = "SELECT t.topic_id 
  54          FROM " . POSTS_TABLE . " p, " . TOPICS_TABLE . " t
  55          WHERE t.forum_id = $forum_id
  56              $prune_all 
  57              AND p.post_id = t.topic_last_post_id";
  58      if ( $prune_date != '' )
  59      {
  60          $sql .= " AND p.post_time < $prune_date";
  61      }
  62  
  63      if ( !($result = $db->sql_query($sql)) )
  64      {
  65          message_die(GENERAL_ERROR, 'Could not obtain lists of topics to prune', '', __LINE__, __FILE__, $sql);
  66      }
  67  
  68      $sql_topics = '';
  69      while( $row = $db->sql_fetchrow($result) )
  70      {
  71          $sql_topics .= ( ( $sql_topics != '' ) ? ', ' : '' ) . $row['topic_id'];
  72      }
  73      $db->sql_freeresult($result);
  74          
  75      if( $sql_topics != '' )
  76      {
  77          $sql = "SELECT post_id
  78              FROM " . POSTS_TABLE . " 
  79              WHERE forum_id = $forum_id 
  80                  AND topic_id IN ($sql_topics)";
  81          if ( !($result = $db->sql_query($sql)) )
  82          {
  83              message_die(GENERAL_ERROR, 'Could not obtain list of posts to prune', '', __LINE__, __FILE__, $sql);
  84          }
  85  
  86          $sql_post = '';
  87          while ( $row = $db->sql_fetchrow($result) )
  88          {
  89              $sql_post .= ( ( $sql_post != '' ) ? ', ' : '' ) . $row['post_id'];
  90          }
  91          $db->sql_freeresult($result);
  92  
  93          if ( $sql_post != '' )
  94          {
  95              $sql = "DELETE FROM " . TOPICS_WATCH_TABLE . " 
  96                  WHERE topic_id IN ($sql_topics)";
  97              if ( !$db->sql_query($sql, BEGIN_TRANSACTION) )
  98              {
  99                  message_die(GENERAL_ERROR, 'Could not delete watched topics during prune', '', __LINE__, __FILE__, $sql);
 100              }
 101  
 102              $sql = "DELETE FROM " . TOPICS_TABLE . " 
 103                  WHERE topic_id IN ($sql_topics)";
 104              if ( !$db->sql_query($sql) )
 105              {
 106                  message_die(GENERAL_ERROR, 'Could not delete topics during prune', '', __LINE__, __FILE__, $sql);
 107              }
 108  
 109              $pruned_topics = $db->sql_affectedrows();
 110  
 111              $sql = "DELETE FROM " . POSTS_TABLE . " 
 112                  WHERE post_id IN ($sql_post)";
 113              if ( !$db->sql_query($sql) )
 114              {
 115                  message_die(GENERAL_ERROR, 'Could not delete post_text during prune', '', __LINE__, __FILE__, $sql);
 116              }
 117  
 118              $pruned_posts = $db->sql_affectedrows();
 119  
 120              $sql = "DELETE FROM " . POSTS_TEXT_TABLE . " 
 121                  WHERE post_id IN ($sql_post)";
 122              if ( !$db->sql_query($sql) )
 123              {
 124                  message_die(GENERAL_ERROR, 'Could not delete post during prune', '', __LINE__, __FILE__, $sql);
 125              }
 126  
 127              remove_search_post($sql_post);
 128  
 129              return array ('topics' => $pruned_topics, 'posts' => $pruned_posts);
 130          }
 131      }
 132  
 133      return array('topics' => 0, 'posts' => 0);
 134  }
 135  
 136  //
 137  // Function auto_prune(), this function will read the configuration data from
 138  // the auto_prune table and call the prune function with the necessary info.
 139  //
 140  function auto_prune($forum_id = 0)
 141  {
 142      global $db, $lang;
 143  
 144      $sql = "SELECT *
 145          FROM " . PRUNE_TABLE . "
 146          WHERE forum_id = $forum_id";
 147      if ( !($result = $db->sql_query($sql)) )
 148      {
 149          message_die(GENERAL_ERROR, 'Could not read auto_prune table', '', __LINE__, __FILE__, $sql);
 150      }
 151  
 152      if ( $row = $db->sql_fetchrow($result) )
 153      {
 154          if ( $row['prune_freq'] && $row['prune_days'] )
 155          {
 156              $prune_date = time() - ( $row['prune_days'] * 86400 );
 157              $next_prune = time() + ( $row['prune_freq'] * 86400 );
 158  
 159              prune($forum_id, $prune_date);
 160              sync('forum', $forum_id);
 161  
 162              $sql = "UPDATE " . FORUMS_TABLE . " 
 163                  SET prune_next = $next_prune 
 164                  WHERE forum_id = $forum_id";
 165              if ( !$db->sql_query($sql) )
 166              {
 167                  message_die(GENERAL_ERROR, 'Could not update forum table', '', __LINE__, __FILE__, $sql);
 168              }
 169          }
 170      }
 171  
 172      return;
 173  }
 174  
 175  ?>


Generated: Mon Jan 14 19:21:40 2013 Cross-referenced by PHPXref 0.7.1