2002-03-10 00:27:24 +00:00
< ? php
2005-04-09 12:26:45 +00:00
/**
*
* @ package phpBB3
* @ version $Id $
* @ copyright ( c ) 2005 phpBB Group
* @ license http :// opensource . org / licenses / gpl - license . php GNU Public License
*
*/
2005-10-04 21:39:47 +00:00
/**
* Recalculate Binary Tree
*/
2005-10-19 18:00:10 +00:00
function recalc_btree ( $sql_id , $sql_table , $module_class = '' )
2005-10-04 21:39:47 +00:00
{
global $db ;
/* Init table , id ' s , etc ...
$sql_id = 'module_id' ; // 'forum_id'
$sql_table = MODULES_TABLE ; // FORUMS_TABLE
*/
if ( ! $sql_id || ! $sql_table )
{
return ;
}
2005-10-19 18:00:10 +00:00
$sql_where = ( $module_class ) ? " WHERE module_class = ' " . $db -> sql_escape ( $module_class ) . " ' " : ' WHERE 1 ' ;
// Reset to minimum possible left and right id
$sql = " SELECT MIN(left_id) as min_left_id, MIN(right_id) as min_right_id
FROM $sql_table
$sql_where " ;
$result = $db -> sql_query ( $sql );
$row = $db -> sql_fetchrow ( $result );
$db -> sql_freeresult ( $result );
$substract = ( int ) ( min ( $row [ 'min_left_id' ], $row [ 'min_right_id' ]) - 1 );
if ( $substract > 0 )
{
$sql = " UPDATE $sql_table
SET left_id = left_id - $substract , right_id = right_id - $substract
$sql_where " ;
$db -> sql_query ( $sql );
}
2005-10-04 21:39:47 +00:00
$sql = " SELECT $sql_id , parent_id, left_id, right_id
FROM $sql_table
2005-10-19 18:00:10 +00:00
$sql_where
2005-10-04 21:39:47 +00:00
ORDER BY left_id ASC , parent_id ASC , $sql_id ASC " ;
$f_result = $db -> sql_query ( $sql );
while ( $item_data = $db -> sql_fetchrow ( $f_result ))
{
if ( $item_data [ 'parent_id' ])
{
$sql = " SELECT left_id, right_id
FROM $sql_table
2005-10-19 18:00:10 +00:00
$sql_where
AND $sql_id = { $item_data [ 'parent_id' ]} " ;
2005-10-04 21:39:47 +00:00
$result = $db -> sql_query ( $sql );
if ( ! $row = $db -> sql_fetchrow ( $result ))
{
$sql = " UPDATE $sql_table SET parent_id = 0 WHERE $sql_id = " . $item_data [ $sql_id ];
$db -> sql_query ( $sql );
}
$db -> sql_freeresult ( $result );
$sql = " UPDATE $sql_table
SET left_id = left_id + 2 , right_id = right_id + 2
2005-10-19 18:00:10 +00:00
$sql_where
AND left_id > { $row [ 'right_id' ]} " ;
2005-10-04 21:39:47 +00:00
$db -> sql_query ( $sql );
$sql = " UPDATE $sql_table
SET right_id = right_id + 2
2005-10-19 18:00:10 +00:00
$sql_where
AND { $row [ 'left_id' ]} BETWEEN left_id AND right_id " ;
2005-10-04 21:39:47 +00:00
$db -> sql_query ( $sql );
$item_data [ 'left_id' ] = $row [ 'right_id' ];
$item_data [ 'right_id' ] = $row [ 'right_id' ] + 1 ;
}
else
{
$sql = " SELECT MAX(right_id) AS right_id
2005-10-19 18:00:10 +00:00
FROM $sql_table
$sql_where " ;
2005-10-04 21:39:47 +00:00
$result = $db -> sql_query ( $sql );
$row = $db -> sql_fetchrow ( $result );
$db -> sql_freeresult ( $result );
$item_data [ 'left_id' ] = $row [ 'right_id' ] + 1 ;
$item_data [ 'right_id' ] = $row [ 'right_id' ] + 2 ;
}
$sql = " UPDATE $sql_table
SET left_id = { $item_data [ 'left_id' ]}, right_id = { $item_data [ 'right_id' ]}
WHERE $sql_id = " . $item_data[$sql_id] ;
$db -> sql_query ( $sql );
}
$db -> sql_freeresult ( $f_result );
}
2005-04-09 12:26:45 +00:00
/**
* Simple version of jumpbox , just lists authed forums
*/
2003-05-02 15:50:11 +00:00
function make_forum_select ( $select_id = false , $ignore_id = false , $ignore_acl = false , $ignore_nonpost = false , $ignore_emptycat = true )
2002-03-10 00:27:24 +00:00
{
2002-11-26 00:50:16 +00:00
global $db , $user , $auth ;
2002-03-10 00:27:24 +00:00
2003-05-02 15:50:11 +00:00
$acl = ( $ignore_acl ) ? '' : array ( 'f_list' , 'a_forum' , 'a_forumadd' , 'a_forumdel' );
2003-04-15 17:33:07 +00:00
2005-04-09 12:26:45 +00:00
// This query is identical to the jumpbox one
$sql = ' SELECT forum_id , parent_id , forum_name , forum_type , left_id , right_id
FROM ' . FORUMS_TABLE . '
ORDER BY left_id ASC ' ;
$result = $db -> sql_query ( $sql );
$right = $iteration = 0 ;
2003-05-04 15:09:16 +00:00
$padding_store = array ( '0' => '' );
2005-04-09 12:26:45 +00:00
$forum_list = $padding = '' ;
2004-02-08 14:27:59 +00:00
2005-04-09 12:26:45 +00:00
// Sometimes it could happen that forums will be displayed here not be displayed within the index page
// This is the result of forums not displayed at index, having list permissions and a parent of a forum with no permissions.
// If this happens, the padding could be "broken"
2002-11-26 00:50:16 +00:00
2005-04-09 12:26:45 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
{
2002-11-26 00:50:16 +00:00
if ( $row [ 'left_id' ] < $right )
{
2005-04-09 12:26:45 +00:00
$padding .= ' ' ;
2003-05-04 15:09:16 +00:00
$padding_store [ $row [ 'parent_id' ]] = $padding ;
2002-11-26 00:50:16 +00:00
}
else if ( $row [ 'left_id' ] > $right + 1 )
2002-10-08 21:01:25 +00:00
{
2004-05-26 20:32:51 +00:00
$padding = ( isset ( $padding_store [ $row [ 'parent_id' ]])) ? $padding_store [ $row [ 'parent_id' ]] : '' ;
2002-10-08 21:01:25 +00:00
}
2002-10-08 20:06:55 +00:00
2002-10-08 21:01:25 +00:00
$right = $row [ 'right_id' ];
2002-10-08 20:06:55 +00:00
2005-04-09 12:26:45 +00:00
if ( $acl && ! $auth -> acl_gets ( $acl , $row [ 'forum_id' ]))
2002-10-08 21:01:25 +00:00
{
2005-04-09 12:26:45 +00:00
continue ;
2002-03-10 00:27:24 +00:00
}
2002-10-08 20:06:55 +00:00
2005-04-09 12:26:45 +00:00
if (( is_array ( $ignore_id ) && in_array ( $row [ 'forum_id' ], $ignore_id )) || $row [ 'forum_id' ] == $ignore_id )
2002-11-26 00:50:16 +00:00
{
2005-04-09 12:26:45 +00:00
continue ;
}
2002-11-26 00:50:16 +00:00
2005-04-09 12:26:45 +00:00
if ( $row [ 'forum_type' ] == FORUM_CAT && ( $row [ 'left_id' ] + 1 == $row [ 'right_id' ]) && $ignore_emptycat )
{
// Non-postable forum with no subforums, don't display
continue ;
2002-11-26 00:50:16 +00:00
}
2005-04-09 12:26:45 +00:00
if ( $row [ 'forum_type' ] != FORUM_POST && $ignore_nonpost )
2002-11-26 00:50:16 +00:00
{
2005-04-09 12:26:45 +00:00
continue ;
2002-11-26 00:50:16 +00:00
}
2005-04-09 12:26:45 +00:00
$selected = ( is_array ( $select_id )) ? (( in_array ( $row [ 'forum_id' ], $select_id )) ? ' selected="selected"' : '' ) : (( $row [ 'forum_id' ] == $select_id ) ? ' selected="selected"' : '' );
$forum_list .= '<option value="' . $row [ 'forum_id' ] . '"' . $selected . '>' . $padding . $row [ 'forum_name' ] . '</option>' ;
$iteration ++ ;
2002-03-10 00:27:24 +00:00
}
2005-04-09 12:26:45 +00:00
unset ( $padding_store );
2002-11-26 00:50:16 +00:00
return $forum_list ;
2002-03-10 00:27:24 +00:00
}
2005-04-09 12:26:45 +00:00
/**
* Generate size select form
*/
2003-11-01 16:10:21 +00:00
function size_select ( $select_name , $size_compare )
{
global $user ;
$size_types_text = array ( $user -> lang [ 'BYTES' ], $user -> lang [ 'KB' ], $user -> lang [ 'MB' ]);
$size_types = array ( 'b' , 'kb' , 'mb' );
$select_field = '<select name="' . $select_name . '">' ;
2004-09-16 18:33:22 +00:00
for ( $i = 0 , $size = sizeof ( $size_types_text ); $i < $size ; $i ++ )
2003-11-01 16:10:21 +00:00
{
$selected = ( $size_compare == $size_types [ $i ]) ? ' selected="selected"' : '' ;
$select_field .= '<option value="' . $size_types [ $i ] . '"' . $selected . '>' . $size_types_text [ $i ] . '</option>' ;
}
$select_field .= '</select>' ;
return ( $select_field );
}
2005-04-09 12:26:45 +00:00
/**
* Obtain authed forums list
*/
2005-11-28 18:38:49 +00:00
function get_forum_list ( $acl_list = 'f_list' , $id_only = true , $postable_only = false , $no_cache = false )
2003-04-02 23:21:17 +00:00
{
global $db , $auth ;
2003-04-15 17:33:07 +00:00
static $forum_rows ;
2003-04-02 23:21:17 +00:00
if ( ! isset ( $forum_rows ))
{
// This query is identical to the jumpbox one
$expire_time = ( $no_cache ) ? 0 : 120 ;
2003-05-04 15:09:16 +00:00
$sql = ' SELECT forum_id , parent_id , forum_name , forum_type , left_id , right_id
2003-04-02 23:21:17 +00:00
FROM ' . FORUMS_TABLE . '
ORDER BY left_id ASC ' ;
$result = $db -> sql_query ( $sql , $expire_time );
2004-02-08 14:27:59 +00:00
2003-04-02 23:21:17 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
{
$forum_rows [] = $row ;
}
2003-04-09 22:17:55 +00:00
$db -> sql_freeresult ();
2003-04-02 23:21:17 +00:00
}
$rowset = array ();
foreach ( $forum_rows as $row )
{
2003-11-16 23:01:24 +00:00
if ( $postable_only && $row [ 'forum_type' ] != FORUM_POST )
2003-04-02 23:21:17 +00:00
{
continue ;
}
2003-04-15 17:33:07 +00:00
if ( $acl_list == '' || ( $acl_list != '' && $auth -> acl_gets ( $acl_list , $row [ 'forum_id' ])))
2003-04-02 23:21:17 +00:00
{
$rowset [] = ( $id_only ) ? $row [ 'forum_id' ] : $row ;
}
}
return $rowset ;
}
2005-04-09 12:26:45 +00:00
/**
* Get forum branch
*/
2005-11-28 18:38:49 +00:00
function get_forum_branch ( $forum_id , $type = 'all' , $order = 'descending' , $include_forum = true )
2003-05-21 19:06:16 +00:00
{
global $db ;
switch ( $type )
{
case 'parents' :
$condition = 'f1.left_id BETWEEN f2.left_id AND f2.right_id' ;
break ;
case 'children' :
$condition = 'f2.left_id BETWEEN f1.left_id AND f1.right_id' ;
break ;
default :
$condition = 'f2.left_id BETWEEN f1.left_id AND f1.right_id OR f1.left_id BETWEEN f2.left_id AND f2.right_id' ;
}
$rows = array ();
$sql = ' SELECT f2 .*
2005-11-28 18:38:49 +00:00
FROM ' . FORUMS_TABLE . ' f1
LEFT JOIN ' . FORUMS_TABLE . " f2 ON ( $condition )
2003-05-21 19:06:16 +00:00
WHERE f1 . forum_id = $forum_id
ORDER BY f2 . left_id " . (( $order == 'descending') ? 'ASC' : 'DESC');
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
{
if ( ! $include_forum && $row [ 'forum_id' ] == $forum_id )
{
continue ;
}
$rows [] = $row ;
}
$db -> sql_freeresult ( $result );
return $rows ;
}
2005-04-09 12:26:45 +00:00
/**
* Get physical file listing
*/
2003-06-06 15:23:50 +00:00
function filelist ( $rootdir , $dir = '' , $type = 'gif|jpg|jpeg|png' )
2003-07-24 13:59:35 +00:00
{
$matches = array ();
2003-06-06 15:23:50 +00:00
2003-08-09 11:18:05 +00:00
// Remove initial / if present
$rootdir = ( substr ( $rootdir , 0 , 1 ) == '/' ) ? substr ( $rootdir , 1 ) : $rootdir ;
// Add closing / if present
$rootdir = ( $rootdir && substr ( $rootdir , - 1 ) != '/' ) ? $rootdir . '/' : $rootdir ;
// Remove initial / if present
$dir = ( substr ( $dir , 0 , 1 ) == '/' ) ? substr ( $dir , 1 ) : $dir ;
// Add closing / if present
$dir = ( $dir && substr ( $dir , - 1 ) != '/' ) ? $dir . '/' : $dir ;
2003-06-06 15:23:50 +00:00
2005-11-30 17:48:06 +00:00
if ( ! is_dir ( $rootdir . $dir ))
{
return false ;
}
2003-08-09 11:18:05 +00:00
$dh = opendir ( $rootdir . $dir );
2003-08-25 01:38:49 +00:00
while (( $fname = readdir ( $dh )) !== false )
2003-06-06 15:23:50 +00:00
{
2003-08-09 11:18:05 +00:00
if ( is_file ( " $rootdir $dir $fname " ))
2003-06-06 15:23:50 +00:00
{
2003-08-09 11:18:05 +00:00
if ( filesize ( " $rootdir $dir $fname " ) && preg_match ( '#\.' . $type . '$#i' , $fname ))
{
$matches [ $dir ][] = $fname ;
}
2003-06-06 15:23:50 +00:00
}
2003-08-09 11:18:05 +00:00
else if ( $fname { 0 } != '.' && is_dir ( " $rootdir $dir $fname " ))
2003-06-06 15:23:50 +00:00
{
2003-08-09 11:18:05 +00:00
$matches += filelist ( $rootdir , " $dir $fname " , $type );
2003-06-06 15:23:50 +00:00
}
}
closedir ( $dh );
return $matches ;
2003-11-05 18:57:09 +00:00
}
2005-04-09 12:26:45 +00:00
/*
* Move topic ( s )
*/
2004-07-08 22:41:04 +00:00
function move_topics ( $topic_ids , $forum_id , $auto_sync = true )
2002-03-10 00:27:24 +00:00
{
global $db ;
2003-03-28 00:41:16 +00:00
$forum_ids = array ( $forum_id );
2003-05-02 15:50:11 +00:00
$sql_where = ( is_array ( $topic_ids )) ? 'IN (' . implode ( ', ' , $topic_ids ) . ')' : '= ' . $topic_ids ;
$sql = 'DELETE FROM ' . TOPICS_TABLE . "
WHERE topic_moved_id $sql_where
AND forum_id = " . $forum_id ;
$db -> sql_query ( $sql );
2003-03-28 00:41:16 +00:00
if ( $auto_sync )
{
$sql = ' SELECT DISTINCT forum_id
FROM ' . TOPICS_TABLE . '
2003-05-02 15:50:11 +00:00
WHERE topic_id ' . $sql_where ;
2003-03-28 00:41:16 +00:00
$result = $db -> sql_query ( $sql );
2003-05-02 15:50:11 +00:00
2003-03-28 00:41:16 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
{
$forum_ids [] = $row [ 'forum_id' ];
}
2003-05-02 15:50:11 +00:00
$db -> sql_freeresult ( $result );
2004-07-08 22:41:04 +00:00
}
$table_ary = array ( TOPICS_TABLE , POSTS_TABLE , LOG_TABLE );
foreach ( $table_ary as $table )
{
$sql = " UPDATE $table
SET forum_id = $forum_id
WHERE topic_id " . $sql_where ;
$db -> sql_query ( $sql );
}
unset ( $table_ary );
2003-03-28 00:41:16 +00:00
2004-07-08 22:41:04 +00:00
if ( $auto_sync )
{
sync ( 'forum' , 'forum_id' , $forum_ids , true );
2003-05-02 15:50:11 +00:00
unset ( $forum_ids );
2003-03-28 00:41:16 +00:00
}
}
2005-04-09 12:26:45 +00:00
/**
* Move post ( s )
*/
2004-07-09 12:31:33 +00:00
function move_posts ( $post_ids , $topic_id , $auto_sync = true )
2003-03-28 00:41:16 +00:00
{
global $db ;
2003-05-02 15:50:11 +00:00
2003-03-28 00:41:16 +00:00
if ( ! is_array ( $post_ids ))
{
$post_ids = array ( $post_ids );
}
if ( $auto_sync )
{
$forum_ids = array ();
$topic_ids = array ( $topic_id );
$sql = ' SELECT DISTINCT topic_id , forum_id
FROM ' . POSTS_TABLE . '
WHERE post_id IN ( ' . implode(' , ', $post_ids) . ' ) ' ;
$result = $db -> sql_query ( $sql );
2003-05-02 15:50:11 +00:00
2003-03-28 00:41:16 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
{
$forum_ids [] = $row [ 'forum_id' ];
$topic_ids [] = $row [ 'topic_id' ];
}
2003-05-02 15:50:11 +00:00
$db -> sql_freeresult ( $result );
2003-03-28 00:41:16 +00:00
}
2003-11-16 23:01:24 +00:00
$sql = ' SELECT forum_id
2003-05-02 15:50:11 +00:00
FROM ' . TOPICS_TABLE . '
WHERE topic_id = ' . $topic_id ;
2003-03-28 00:41:16 +00:00
$result = $db -> sql_query ( $sql );
2003-05-02 15:50:11 +00:00
2003-11-16 23:01:24 +00:00
if ( ! $row = $db -> sql_fetchrow ( $result ))
2003-03-28 00:41:16 +00:00
{
2003-05-02 15:50:11 +00:00
trigger_error ( 'NO_TOPIC' );
2003-03-28 00:41:16 +00:00
}
2003-05-02 15:50:11 +00:00
$db -> sql_freeresult ( $result );
2003-03-28 00:41:16 +00:00
$sql = 'UPDATE ' . POSTS_TABLE . '
SET forum_id = ' . $row[' forum_id ' ] . " , topic_id = $topic_id
WHERE post_id IN ( " . implode(', ', $post_ids ) . ')';
$db -> sql_query ( $sql );
2003-11-22 12:43:31 +00:00
$sql = 'UPDATE ' . ATTACHMENTS_TABLE . "
SET topic_id = $topic_id
2004-05-02 13:06:57 +00:00
AND in_message = 0
WHERE post_msg_id IN ( " . implode(', ', $post_ids ) . ')';
2003-11-22 12:43:31 +00:00
$db -> sql_query ( $sql );
2003-03-28 00:41:16 +00:00
if ( $auto_sync )
{
$forum_ids [] = $row [ 'forum_id' ];
sync ( 'reported' , 'topic_id' , $topic_ids );
2004-07-09 12:31:33 +00:00
sync ( 'topic' , 'topic_id' , $topic_ids , true );
sync ( 'forum' , 'forum_id' , $forum_ids , true );
2003-03-28 00:41:16 +00:00
}
}
2005-04-09 12:26:45 +00:00
/**
* Remove topic ( s )
*/
2005-11-28 18:38:49 +00:00
function delete_topics ( $where_type , $where_ids , $auto_sync = true )
2003-03-28 00:41:16 +00:00
{
global $db ;
$forum_ids = $topic_ids = array ();
if ( is_array ( $where_ids ))
{
$where_ids = array_unique ( $where_ids );
}
2003-05-02 15:50:11 +00:00
2004-12-15 18:30:50 +00:00
if ( ! sizeof ( $where_ids ))
2003-03-28 00:41:16 +00:00
{
2004-07-08 22:41:04 +00:00
return array ( 'topics' => 0 , 'posts' => 0 );
2003-03-28 00:41:16 +00:00
}
$return = array (
2004-07-08 22:41:04 +00:00
'posts' => delete_posts ( $where_type , $where_ids , false )
2003-03-28 00:41:16 +00:00
);
$sql = ' SELECT topic_id , forum_id
FROM ' . TOPICS_TABLE . "
WHERE $where_type " . ((!is_array( $where_ids )) ? " = $where_ids " : 'IN (' . implode(', ', $where_ids ) . ')');
$result = $db -> sql_query ( $sql );
2003-05-02 15:50:11 +00:00
2003-03-28 00:41:16 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
{
$forum_ids [] = $row [ 'forum_id' ];
$topic_ids [] = $row [ 'topic_id' ];
}
$db -> sql_freeresult ();
2004-07-08 22:41:04 +00:00
$return [ 'topics' ] = sizeof ( $topic_ids );
2003-03-28 00:41:16 +00:00
2004-07-08 22:41:04 +00:00
if ( ! sizeof ( $topic_ids ))
2003-03-28 00:41:16 +00:00
{
return $return ;
}
2003-05-02 15:50:11 +00:00
// TODO: probably some other stuff too
2003-03-28 00:41:16 +00:00
2003-05-02 15:50:11 +00:00
$sql_where = ' IN (' . implode ( ', ' , $topic_ids ) . ')' ;
2003-03-28 00:41:16 +00:00
$db -> sql_transaction ( 'begin' );
2003-05-02 15:50:11 +00:00
2005-10-19 18:00:10 +00:00
$table_ary = array ( TOPICS_TRACK_TABLE , TOPICS_POSTED_TABLE , POLL_VOTES_TABLE , POLL_OPTIONS_TABLE , TOPICS_WATCH_TABLE , TOPICS_TABLE );
2003-05-02 15:50:11 +00:00
foreach ( $table_ary as $table )
{
$sql = " DELETE FROM $table
WHERE topic_id $sql_where " ;
$db -> sql_query ( $sql );
}
unset ( $table_ary );
$sql = 'DELETE FROM ' . TOPICS_TABLE . '
WHERE topic_moved_id ' . $sql_where ;
$db -> sql_query ( $sql );
2003-03-28 00:41:16 +00:00
$db -> sql_transaction ( 'commit' );
if ( $auto_sync )
{
2004-07-08 22:41:04 +00:00
sync ( 'forum' , 'forum_id' , $forum_ids , true );
2003-04-23 21:57:53 +00:00
sync ( 'topic_reported' , $where_type , $where_ids );
2003-03-28 00:41:16 +00:00
}
return $return ;
}
2005-04-09 12:26:45 +00:00
/**
* Remove post ( s )
*/
2005-11-28 18:38:49 +00:00
function delete_posts ( $where_type , $where_ids , $auto_sync = true )
2003-03-28 00:41:16 +00:00
{
global $db ;
if ( is_array ( $where_ids ))
{
$where_ids = array_unique ( $where_ids );
}
2003-11-16 23:01:24 +00:00
if ( empty ( $where_ids ))
2003-03-28 00:41:16 +00:00
{
2003-04-18 13:07:19 +00:00
return false ;
2003-03-28 00:41:16 +00:00
}
$post_ids = $topic_ids = $forum_ids = array ();
$sql = ' SELECT post_id , topic_id , forum_id
FROM ' . POSTS_TABLE . "
WHERE $where_type " . ((!is_array( $where_ids )) ? " = $where_ids " : 'IN (' . implode(', ', $where_ids ) . ')');
$result = $db -> sql_query ( $sql );
2004-02-08 14:27:59 +00:00
2003-03-28 00:41:16 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
{
$post_ids [] = $row [ 'post_id' ];
$topic_ids [] = $row [ 'topic_id' ];
$forum_ids [] = $row [ 'forum_id' ];
}
2004-12-15 18:30:50 +00:00
if ( ! sizeof ( $post_ids ))
2003-03-28 00:41:16 +00:00
{
2003-04-18 13:07:19 +00:00
return false ;
2003-03-28 00:41:16 +00:00
}
2003-05-02 15:50:11 +00:00
$sql_where = implode ( ', ' , $post_ids );
2003-03-28 00:41:16 +00:00
$db -> sql_transaction ( 'begin' );
2003-05-02 15:50:11 +00:00
2005-05-09 09:03:53 +00:00
$table_ary = array ( POSTS_TABLE , REPORTS_TABLE , SEARCH_MATCH_TABLE );
2004-02-08 14:27:59 +00:00
2003-05-02 15:50:11 +00:00
foreach ( $table_ary as $table )
{
$sql = " DELETE FROM $table
WHERE post_id IN ( $sql_where ) " ;
$db -> sql_query ( $sql );
}
unset ( $table_ary );
2004-07-08 22:41:04 +00:00
delete_attachments ( 'post' , $post_ids , false );
2003-03-28 00:41:16 +00:00
2003-09-07 17:16:12 +00:00
$db -> sql_transaction ( 'commit' );
2003-04-18 13:07:19 +00:00
2003-03-28 00:41:16 +00:00
if ( $auto_sync )
{
sync ( 'reported' , 'topic_id' , $topic_ids );
2004-07-08 22:41:04 +00:00
sync ( 'topic' , 'topic_id' , $topic_ids , true );
sync ( 'forum' , 'forum_id' , $forum_ids , true );
2003-05-02 15:50:11 +00:00
}
2004-07-08 22:41:04 +00:00
return sizeof ( $post_ids );
2003-03-28 00:41:16 +00:00
}
2005-04-09 12:26:45 +00:00
/**
* Delete Attachments
* mode => ( post , topic , attach , user )
* ids => ( post_ids , topic_ids , attach_ids , user_ids )
* resync => set this to false if you are deleting posts or topics ...
*/
2005-11-28 18:38:49 +00:00
function delete_attachments ( $mode , $ids , $resync = true )
2003-09-07 17:16:12 +00:00
{
2003-11-16 21:53:56 +00:00
global $db , $config ;
2003-09-07 17:16:12 +00:00
2003-11-04 22:05:38 +00:00
if ( is_array ( $ids ))
2003-09-07 17:16:12 +00:00
{
2003-11-04 22:05:38 +00:00
$ids = array_unique ( $ids );
2003-09-07 17:16:12 +00:00
}
2003-11-04 22:05:38 +00:00
if ( ! sizeof ( $ids ))
2003-09-07 17:16:12 +00:00
{
2003-11-04 22:05:38 +00:00
return false ;
}
2003-09-07 17:16:12 +00:00
2004-05-02 13:06:57 +00:00
$sql_id = ( $mode == 'user' ) ? 'poster_id' : (( $mode == 'post' ) ? 'post_msg_id' : (( $mode == 'topic' ) ? 'topic_id' : 'attach_id' ));
2003-09-07 17:16:12 +00:00
2003-11-04 22:05:38 +00:00
$post_ids = $topic_ids = $physical = array ();
// Collect post and topics ids for later use
if ( $mode == 'attach' || $mode == 'user' || ( $mode == 'topic' && $resync ))
{
2004-05-02 13:06:57 +00:00
$sql = ' SELECT post_msg_id as post_id , topic_id , physical_filename , thumbnail , filesize
2003-11-04 22:05:38 +00:00
FROM ' . ATTACHMENTS_TABLE . '
WHERE ' . $sql_id . ' IN ( ' . implode(' , ', $ids) . ' ) ' ;
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
2003-09-07 17:16:12 +00:00
{
2003-11-04 22:05:38 +00:00
$post_ids [] = $row [ 'post_id' ];
$topic_ids [] = $row [ 'topic_id' ];
2003-11-16 21:53:56 +00:00
$physical [] = array ( 'filename' => $row [ 'physical_filename' ], 'thumbnail' => $row [ 'thumbnail' ], 'filesize' => $row [ 'filesize' ]);
2003-09-07 17:16:12 +00:00
}
2003-11-04 22:05:38 +00:00
$db -> sql_freeresult ( $result );
}
2003-09-07 17:16:12 +00:00
2003-11-04 22:05:38 +00:00
if ( $mode == 'post' )
{
2003-11-16 21:53:56 +00:00
$sql = ' SELECT topic_id , physical_filename , thumbnail , filesize
2003-11-04 22:05:38 +00:00
FROM ' . ATTACHMENTS_TABLE . '
2004-05-02 13:06:57 +00:00
WHERE post_msg_id IN ( ' . implode(' , ', $ids) . ' )
AND in_message = 0 ' ;
2003-11-04 22:05:38 +00:00
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
2003-09-07 17:16:12 +00:00
{
2003-11-04 22:05:38 +00:00
$topic_ids [] = $row [ 'topic_id' ];
2003-11-16 21:53:56 +00:00
$physical [] = array ( 'filename' => $row [ 'physical_filename' ], 'thumbnail' => $row [ 'thumbnail' ], 'filesize' => $row [ 'filesize' ]);
2003-09-07 17:16:12 +00:00
}
$db -> sql_freeresult ( $result );
}
2003-11-04 22:05:38 +00:00
// Delete attachments
$db -> sql_query ( 'DELETE FROM ' . ATTACHMENTS_TABLE . ' WHERE ' . $sql_id . ' IN (' . implode ( ', ' , $ids ) . ')' );
$num_deleted = $db -> sql_affectedrows ();
2003-11-22 12:43:31 +00:00
if ( ! $num_deleted )
{
return 0 ;
}
2003-11-04 22:05:38 +00:00
// Delete attachments from filesystem
2003-11-16 21:53:56 +00:00
$space_removed = $files_removed = 0 ;
2003-11-04 22:05:38 +00:00
foreach ( $physical as $file_ary )
2003-09-07 17:16:12 +00:00
{
2003-11-16 21:53:56 +00:00
if ( phpbb_unlink ( $file_ary [ 'filename' ], 'file' ))
{
$space_removed += $file_ary [ 'filesize' ];
$files_removed ++ ;
}
2003-11-04 22:05:38 +00:00
if ( $file_ary [ 'thumbnail' ])
2003-09-07 17:16:12 +00:00
{
2003-11-04 22:05:38 +00:00
phpbb_unlink ( $file_ary [ 'filename' ], 'thumbnail' );
2003-09-07 17:16:12 +00:00
}
2003-11-04 22:05:38 +00:00
}
2003-11-16 21:53:56 +00:00
set_config ( 'upload_dir_size' , $config [ 'upload_dir_size' ] - $space_removed , true );
set_config ( 'num_files' , $config [ 'num_files' ] - $files_removed , true );
2003-11-04 22:05:38 +00:00
if ( $mode == 'topic' && ! $resync )
{
return $num_deleted ;
}
2003-09-07 17:16:12 +00:00
2003-11-04 22:05:38 +00:00
if ( $mode == 'post' )
{
$post_ids = $ids ;
2003-09-07 17:16:12 +00:00
}
2003-11-04 22:05:38 +00:00
unset ( $ids );
$post_ids = array_unique ( $post_ids );
$topic_ids = array_unique ( $topic_ids );
// Update post indicators
2003-11-13 12:39:11 +00:00
if ( sizeof ( $post_ids ))
2003-09-07 17:16:12 +00:00
{
2003-11-13 12:39:11 +00:00
if ( $mode == 'post' || $mode == 'topic' )
{
$db -> sql_query ( 'UPDATE ' . POSTS_TABLE . '
2003-11-04 22:05:38 +00:00
SET post_attachment = 0
WHERE post_id IN ( ' . implode(' , ', $post_ids) . ' ) ' );
2003-11-13 12:39:11 +00:00
}
2003-09-07 17:16:12 +00:00
2003-11-13 12:39:11 +00:00
if ( $mode == 'user' || $mode == 'attach' )
{
$remaining = array ();
2003-09-07 17:16:12 +00:00
2004-05-02 13:06:57 +00:00
$sql = ' SELECT post_msg_id
2003-11-13 12:39:11 +00:00
FROM ' . ATTACHMENTS_TABLE . '
2004-05-02 13:06:57 +00:00
WHERE post_msg_id IN ( ' . implode(' , ', $post_ids) . ' )
AND in_message = 0 ' ;
2003-11-13 12:39:11 +00:00
$result = $db -> sql_query ( $sql );
2003-11-04 22:05:38 +00:00
2003-11-13 12:39:11 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
{
2004-05-02 13:06:57 +00:00
$remaining [] = $row [ 'post_msg_id' ];
2003-11-13 12:39:11 +00:00
}
2003-11-13 12:43:25 +00:00
$db -> sql_freeresult ( $result );
2003-09-07 17:16:12 +00:00
2003-11-13 12:39:11 +00:00
$unset_ids = array_diff ( $post_ids , $remaining );
if ( sizeof ( $unset_ids ))
{
$db -> sql_query ( 'UPDATE ' . POSTS_TABLE . '
SET post_attachment = 0
WHERE post_id IN ( ' . implode(' , ', $unset_ids) . ' ) ' );
2004-05-02 13:06:57 +00:00
}
$remaining = array ();
$sql = ' SELECT post_msg_id
FROM ' . ATTACHMENTS_TABLE . '
WHERE post_msg_id IN ( ' . implode(' , ', $post_ids) . ' )
AND in_message = 1 ' ;
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
{
$remaining [] = $row [ 'post_msg_id' ];
}
$db -> sql_freeresult ( $result );
$unset_ids = array_diff ( $post_ids , $remaining );
if ( sizeof ( $unset_ids ))
{
$db -> sql_query ( 'UPDATE ' . PRIVMSGS_TABLE . '
SET message_attachment = 0
WHERE msg_id IN ( ' . implode(' , ', $unset_ids) . ' ) ' );
2003-11-13 12:39:11 +00:00
}
2003-09-07 17:16:12 +00:00
}
}
2003-11-13 12:39:11 +00:00
if ( sizeof ( $topic_ids ))
2003-09-07 17:16:12 +00:00
{
2003-11-13 12:39:11 +00:00
// Update topic indicator
if ( $mode == 'topic' )
2003-09-07 17:16:12 +00:00
{
2003-11-13 12:39:11 +00:00
$db -> sql_query ( 'UPDATE ' . TOPICS_TABLE . '
SET topic_attachment = 0
WHERE topic_id IN ( ' . implode(' , ', $topic_ids) . ' ) ' );
2003-11-04 22:05:38 +00:00
}
2003-09-07 17:16:12 +00:00
2003-11-13 12:39:11 +00:00
if ( $mode == 'post' || $mode == 'user' || $mode == 'attach' )
2003-11-04 22:05:38 +00:00
{
2003-11-13 12:39:11 +00:00
$remaining = array ();
$sql = ' SELECT topic_id
FROM ' . ATTACHMENTS_TABLE . '
WHERE topic_id IN ( ' . implode(' , ', $topic_ids) . ' ) ' ;
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
{
$remaining [] = $row [ 'topic_id' ];
}
2003-11-13 12:43:25 +00:00
$db -> sql_freeresult ( $result );
2003-11-13 12:39:11 +00:00
$unset_ids = array_diff ( $topic_ids , $remaining );
if ( sizeof ( $unset_ids ))
{
$db -> sql_query ( 'UPDATE ' . TOPICS_TABLE . '
SET topic_attachment = 0
WHERE topic_id IN ( ' . implode(' , ', $unset_ids) . ' ) ' );
}
2003-09-07 17:16:12 +00:00
}
}
2003-11-13 12:39:11 +00:00
2003-11-04 22:05:38 +00:00
return $num_deleted ;
2003-09-07 17:16:12 +00:00
}
2005-04-09 12:26:45 +00:00
/**
* Remove topic shadows
*/
2005-11-28 18:38:49 +00:00
function delete_topic_shadows ( $max_age , $forum_id = '' , $auto_sync = true )
2003-10-05 20:11:58 +00:00
{
$where = ( is_array ( $forum_id )) ? 'AND t.forum_id IN (' . implode ( ', ' , $forum_id ) . ')' : (( $forum_id ) ? " AND t.forum_id = $forum_id " : '' );
switch ( SQL_LAYER )
{
case 'mysql4' :
2005-04-30 14:24:13 +00:00
case 'mysqli' :
2003-10-05 20:11:58 +00:00
$sql = ' DELETE t .*
FROM ' . TOPICS_TABLE . ' t , ' . TOPICS_TABLE . ' t2
WHERE t . topic_moved_id = t2 . topic_id
AND t . topic_time < ' . ( time () - $max_age )
. $where ;
$db -> sql_query ( $sql );
break ;
default :
$sql = ' SELECT t . topic_id
FROM ' . TOPICS_TABLE . ' t , ' . TOPICS_TABLE . ' t2
WHERE t . topic_moved_id = t2 . topic_id
AND t . topic_time < ' . ( time () - $max_age )
. $where ;
$result = $db -> sql_query ( $sql );
$topic_ids = array ();
while ( $row = $db -> sql_fetchrow ( $result ))
{
$topic_ids [] = $row [ 'topic_id' ];
}
2004-12-15 18:30:50 +00:00
if ( sizeof ( $topic_ids ))
2003-10-05 20:11:58 +00:00
{
$sql = 'DELETE FROM ' . TOPICS_TABLE . '
WHERE topic_id IN ( ' . implode(' , ', $topic_ids) . ' ) ' ;
$db -> sql_query ( $sql );
}
}
if ( $auto_sync )
{
$where_type = ( $forum_id ) ? 'forum_id' : '' ;
2005-11-28 18:38:49 +00:00
sync ( 'forum' , $where_type , $forum_id , true );
2003-10-05 20:11:58 +00:00
}
}
2005-04-09 12:26:45 +00:00
/**
* Delete File
*/
2003-10-12 09:11:33 +00:00
function phpbb_unlink ( $filename , $mode = 'file' )
{
2003-10-19 15:36:45 +00:00
global $config , $user , $phpbb_root_path ;
2003-10-12 09:11:33 +00:00
2005-03-21 23:10:11 +00:00
$filename = ( $mode == 'thumbnail' ) ? $phpbb_root_path . $config [ 'upload_path' ] . '/thumb_' . basename ( $filename ) : $phpbb_root_path . $config [ 'upload_path' ] . '/' . basename ( $filename );
return @ unlink ( $filename );
2003-10-12 09:11:33 +00:00
}
2005-04-09 12:26:45 +00:00
/**
* All - encompasing sync function
*
* Usage :
* sync ( 'topic' , 'topic_id' , 123 ); <= resync topic #123
* sync ( 'topic' , 'forum_id' , array ( 2 , 3 )); <= resync topics from forum #2 and #3
* sync ( 'topic' ); <= resync all topics
* sync ( 'topic' , 'range' , 'topic_id BETWEEN 1 AND 60' ); <= resync a range of topics / forums ( only available for 'topic' and 'forum' modes )
*
* Modes :
* - topic_moved Removes topic shadows that would be in the same forum as the topic they link to
* - topic_approved Resyncs the topic_approved flag according to the status of the first post
* - post_reported Resyncs the post_reported flag , relying on actual reports
* - topic_reported Resyncs the topic_reported flag , relying on post_reported flags
* - post_attachement Same as post_reported , thanks to a quick Search / Replace
* - topic_attachement Same as topic_reported , thanks to a quick Search / Replace
*/
2005-11-28 18:38:49 +00:00
function sync ( $mode , $where_type = '' , $where_ids = '' , $resync_parents = false , $sync_extra = false )
2003-03-28 00:41:16 +00:00
{
2003-05-02 15:50:11 +00:00
global $db ;
2003-03-28 00:41:16 +00:00
if ( is_array ( $where_ids ))
{
$where_ids = array_unique ( $where_ids );
}
2005-11-28 18:38:49 +00:00
else if ( $where_type != 'range' )
2003-03-28 00:41:16 +00:00
{
2003-09-17 20:11:56 +00:00
$where_ids = ( $where_ids ) ? array ( $where_ids ) : array ();
2003-03-28 00:41:16 +00:00
}
2003-04-23 21:57:53 +00:00
if ( $mode == 'forum' || $mode == 'topic' )
2003-03-28 00:41:16 +00:00
{
if ( ! $where_type )
{
2004-12-15 18:30:50 +00:00
$where_sql = '' ;
$where_sql_and = 'WHERE' ;
2003-03-28 00:41:16 +00:00
}
2005-11-28 18:38:49 +00:00
else if ( $where_type == 'range' )
2003-09-17 20:11:56 +00:00
{
2004-11-10 14:15:16 +00:00
// Only check a range of topics/forums. For instance: 'topic_id BETWEEN 1 AND 60'
2003-09-17 20:11:56 +00:00
$where_sql = 'WHERE (' . $mode { 0 } . " . $where_ids ) " ;
2003-11-16 23:01:24 +00:00
$where_sql_and = $where_sql . " \n \t AND " ;
2003-09-17 20:11:56 +00:00
}
2003-03-28 00:41:16 +00:00
else
{
2004-05-30 19:24:53 +00:00
if ( ! sizeof ( $where_ids ))
{
2004-11-10 14:15:16 +00:00
// Empty array with IDs. This means that we don't have any work to do. Just return.
2004-05-30 19:24:53 +00:00
return ;
}
2004-11-10 14:15:16 +00:00
// Limit the topics/forums we are syncing, use specific topic/forum IDs.
2004-12-15 18:30:50 +00:00
// $where_type contains the field for the where clause (forum_id, topic_id)
2003-03-28 00:41:16 +00:00
$where_sql = 'WHERE ' . $mode { 0 } . " . $where_type IN ( " . implode ( ', ' , $where_ids ) . ')' ;
2003-11-16 23:01:24 +00:00
$where_sql_and = $where_sql . " \n \t AND " ;
2003-03-28 00:41:16 +00:00
}
}
2003-04-23 21:57:53 +00:00
else
{
2004-05-30 19:24:53 +00:00
if ( ! sizeof ( $where_ids ))
{
return ;
}
2004-12-15 18:30:50 +00:00
2004-11-10 14:15:16 +00:00
// $where_type contains the field for the where clause (forum_id, topic_id)
2003-11-16 23:01:24 +00:00
$where_sql = 'WHERE ' . $mode { 0 } . " . $where_type IN ( " . implode ( ', ' , $where_ids ) . ')' ;
$where_sql_and = $where_sql . " \n \t AND " ;
2003-04-23 21:57:53 +00:00
}
2003-03-28 00:41:16 +00:00
switch ( $mode )
2002-03-10 00:27:24 +00:00
{
2003-09-17 20:11:56 +00:00
case 'topic_moved' :
switch ( SQL_LAYER )
{
case 'mysql4' :
2005-04-30 14:24:13 +00:00
case 'mysqli' :
2003-09-17 20:11:56 +00:00
$sql = 'DELETE FROM ' . TOPICS_TABLE . '
USING ' . TOPICS_TABLE . ' t1 , ' . TOPICS_TABLE . " t2
WHERE t1 . topic_moved_id = t2 . topic_id
AND t1 . forum_id = t2 . forum_id " ;
$db -> sql_query ( $sql );
break ;
default :
$sql = ' SELECT t1 . topic_id
FROM ' .TOPICS_TABLE . ' t1 , ' . TOPICS_TABLE . " t2
WHERE t1 . topic_moved_id = t2 . topic_id
AND t1 . forum_id = t2 . forum_id " ;
2004-05-30 19:24:53 +00:00
$result = $db -> sql_query ( $sql );
2003-09-17 20:11:56 +00:00
if ( $row = $db -> sql_fetchrow ( $result ))
{
$topic_id_ary = array ();
do
{
$topic_id_ary [] = $row [ 'topic_id' ];
}
while ( $row = $db -> sql_fetchrow ( $result ));
$sql = 'DELETE FROM ' . TOPICS_TABLE . '
WHERE topic_id IN ( ' . implode(' , ', $topic_id_ary) . ' ) ' ;
$db -> sql_query ( $sql );
unset ( $topic_id_ary );
}
2005-10-09 17:59:27 +00:00
$db -> sql_freeresult ( $result );
2003-09-17 20:11:56 +00:00
}
break ;
2003-04-23 21:57:53 +00:00
case 'topic_approved' :
2003-11-16 23:01:24 +00:00
switch ( SQL_LAYER )
2002-03-10 00:27:24 +00:00
{
2003-11-16 23:01:24 +00:00
case 'mysql4' :
2005-04-30 14:24:13 +00:00
case 'mysqli' :
2003-11-16 23:01:24 +00:00
$sql = 'UPDATE ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p
SET t . topic_approved = p . post_approved
$where_sql_and t . topic_first_post_id = p . post_id " ;
$db -> sql_query ( $sql );
break ;
default :
$sql = ' SELECT t . topic_id , p . post_approved
FROM ' . TOPICS_TABLE . ' t , ' . POSTS_TABLE . " p
$where_sql_and p . post_id = t . topic_first_post_id
AND p . post_approved <> t . topic_approved " ;
$result = $db -> sql_query ( $sql );
$topic_ids = array ();
while ( $row = $db -> sql_fetchrow ( $result ))
{
$topic_ids [] = $row [ 'topic_id' ];
}
$db -> sql_freeresult ();
2002-03-10 00:27:24 +00:00
2004-12-15 18:30:50 +00:00
if ( ! sizeof ( $topic_ids ))
2003-11-16 23:01:24 +00:00
{
return ;
}
2003-03-30 20:58:58 +00:00
2003-11-16 23:01:24 +00:00
$sql = 'UPDATE ' . TOPICS_TABLE . '
SET topic_approved = 1 - topic_approved
WHERE topic_id IN ( ' . implode(' , ', $topic_ids) . ' ) ' ;
$db -> sql_query ( $sql );
}
2003-05-02 15:50:11 +00:00
break ;
2003-03-28 00:41:16 +00:00
2003-11-16 23:01:24 +00:00
case 'post_reported' :
$post_ids = $post_reported = array ();
2003-04-23 21:57:53 +00:00
2003-11-16 23:01:24 +00:00
$sql = ' SELECT p . post_id , p . post_reported
FROM ' . POSTS_TABLE . " p
$where_sql
GROUP BY p . post_id , p . post_reported " ;
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
2003-04-23 21:57:53 +00:00
{
2003-11-16 23:01:24 +00:00
$post_ids [ $row [ 'post_id' ]] = $row [ 'post_id' ];
if ( $row [ 'post_reported' ])
{
$post_reported [ $row [ 'post_id' ]] = 1 ;
}
2003-05-02 15:50:11 +00:00
}
2003-11-16 23:01:24 +00:00
$sql = ' SELECT DISTINCT ( post_id )
FROM ' . REPORTS_TABLE . '
WHERE post_id IN ( ' . implode(' , ', $post_ids) . ' ) ' ;
2003-05-02 15:50:11 +00:00
$result = $db -> sql_query ( $sql );
2003-04-23 21:57:53 +00:00
2003-11-16 23:01:24 +00:00
$post_ids = array ();
2003-05-02 15:50:11 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
{
2003-11-16 23:01:24 +00:00
if ( ! isset ( $post_reported [ $row [ 'post_id' ]]))
2003-05-02 15:50:11 +00:00
{
$post_ids [] = $row [ 'post_id' ];
}
2003-11-16 23:01:24 +00:00
else
{
unset ( $post_reported [ $row [ 'post_id' ]]);
}
2003-04-23 21:57:53 +00:00
}
2003-11-16 23:01:24 +00:00
// $post_reported should be empty by now, if it's not it contains
// posts that are falsely flagged as reported
foreach ( $post_reported as $post_id => $void )
2003-04-23 21:57:53 +00:00
{
2003-11-16 23:01:24 +00:00
$post_ids [] = $post_id ;
2003-04-23 21:57:53 +00:00
}
2004-12-15 18:30:50 +00:00
if ( sizeof ( $post_ids ))
2003-11-16 23:01:24 +00:00
{
$sql = 'UPDATE ' . POSTS_TABLE . '
SET post_reported = 1 - post_reported
WHERE post_id IN ( ' . implode(' , ', $post_ids) . ' ) ' ;
$db -> sql_query ( $sql );
}
2003-05-02 15:50:11 +00:00
break ;
2003-04-23 21:57:53 +00:00
2003-11-16 23:01:24 +00:00
case 'topic_reported' :
if ( $sync_extra )
2003-04-23 21:57:53 +00:00
{
2003-11-16 23:01:24 +00:00
sync ( 'post_reported' , $where_type , $where_ids );
2003-05-02 15:50:11 +00:00
}
2003-11-16 23:01:24 +00:00
$topic_ids = $topic_reported = array ();
$sql = ' SELECT DISTINCT ( t . topic_id )
FROM ' . POSTS_TABLE . " t
$where_sql_and t . post_reported = 1 " ;
2003-05-02 15:50:11 +00:00
$result = $db -> sql_query ( $sql );
2003-11-16 23:01:24 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
{
$topic_reported [ $row [ 'topic_id' ]] = 1 ;
}
2003-04-23 21:57:53 +00:00
2003-11-16 23:01:24 +00:00
$sql = ' SELECT t . topic_id , t . topic_reported
FROM ' . TOPICS_TABLE . " t
$where_sql " ;
$result = $db -> sql_query ( $sql );
2003-05-02 15:50:11 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
{
2003-11-16 23:01:24 +00:00
if ( $row [ 'topic_reported' ] ^ isset ( $topic_reported [ $row [ 'topic_id' ]]))
{
2003-05-02 15:50:11 +00:00
$topic_ids [] = $row [ 'topic_id' ];
2003-11-16 23:01:24 +00:00
}
2003-04-23 21:57:53 +00:00
}
2004-12-15 18:30:50 +00:00
if ( sizeof ( $topic_ids ))
2003-04-23 21:57:53 +00:00
{
2003-11-16 23:01:24 +00:00
$sql = 'UPDATE ' . TOPICS_TABLE . '
SET topic_reported = 1 - topic_reported
WHERE topic_id IN ( ' . implode(' , ', $topic_ids) . ' ) ' ;
$db -> sql_query ( $sql );
2003-04-23 21:57:53 +00:00
}
2003-05-02 15:50:11 +00:00
break ;
2003-04-23 21:57:53 +00:00
2003-11-16 23:01:24 +00:00
case 'post_attachment' :
$post_ids = $post_attachment = array ();
2003-03-30 20:58:58 +00:00
2003-11-16 23:01:24 +00:00
$sql = ' SELECT p . post_id , p . post_attachment
FROM ' . POSTS_TABLE . " p
$where_sql
GROUP BY p . post_id , p . post_attachment " ;
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
2003-03-30 20:58:58 +00:00
{
2003-11-16 23:01:24 +00:00
$post_ids [ $row [ 'post_id' ]] = $row [ 'post_id' ];
if ( $row [ 'post_attachment' ])
2003-03-30 20:58:58 +00:00
{
2003-11-16 23:01:24 +00:00
$post_attachment [ $row [ 'post_id' ]] = 1 ;
2003-03-30 20:58:58 +00:00
}
}
2004-06-15 17:56:37 +00:00
$sql = ' SELECT DISTINCT ( post_msg_id )
2003-11-16 23:01:24 +00:00
FROM ' . ATTACHMENTS_TABLE . '
2004-06-15 17:56:37 +00:00
WHERE post_msg_id IN ( ' . implode(' , ', $post_ids) . ' )
AND in_message = 0 ' ;
2003-05-02 15:50:11 +00:00
2003-11-16 23:01:24 +00:00
$post_ids = array ();
2002-07-14 14:34:34 +00:00
$result = $db -> sql_query ( $sql );
2003-11-16 23:01:24 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
2002-03-10 00:27:24 +00:00
{
2003-11-16 23:01:24 +00:00
if ( ! isset ( $post_attachment [ $row [ 'post_id' ]]))
2003-03-28 00:41:16 +00:00
{
2003-11-16 23:01:24 +00:00
$post_ids [] = $row [ 'post_id' ];
2003-03-28 00:41:16 +00:00
}
2003-11-16 23:01:24 +00:00
else
2003-03-30 20:58:58 +00:00
{
2003-11-16 23:01:24 +00:00
unset ( $post_attachment [ $row [ 'post_id' ]]);
2003-03-30 20:58:58 +00:00
}
2003-11-16 23:01:24 +00:00
}
2003-03-30 20:58:58 +00:00
2003-11-16 23:01:24 +00:00
// $post_attachment should be empty by now, if it's not it contains
// posts that are falsely flagged as having attachments
foreach ( $post_attachment as $post_id => $void )
{
$post_ids [] = $post_id ;
2002-03-10 00:27:24 +00:00
}
2003-05-02 15:50:11 +00:00
2004-12-15 18:30:50 +00:00
if ( sizeof ( $post_ids ))
2003-11-16 23:01:24 +00:00
{
$sql = 'UPDATE ' . POSTS_TABLE . '
SET post_attachment = 1 - post_attachment
WHERE post_id IN ( ' . implode(' , ', $post_ids) . ' ) ' ;
$db -> sql_query ( $sql );
}
2003-05-02 15:50:11 +00:00
break ;
2002-03-10 00:27:24 +00:00
2003-11-16 23:01:24 +00:00
case 'topic_attachment' :
if ( $sync_extra )
2003-03-28 00:41:16 +00:00
{
2003-11-16 23:01:24 +00:00
sync ( 'post_attachment' , $where_type , $where_ids );
}
2003-03-28 00:41:16 +00:00
2003-11-16 23:01:24 +00:00
$topic_ids = $topic_attachment = array ();
2003-05-02 15:50:11 +00:00
2003-11-16 23:01:24 +00:00
$sql = ' SELECT DISTINCT ( t . topic_id )
FROM ' . POSTS_TABLE . " t
$where_sql_and t . post_attachment = 1 " ;
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
{
$topic_attachment [ $row [ 'topic_id' ]] = 1 ;
}
$sql = ' SELECT t . topic_id , t . topic_attachment
FROM ' . TOPICS_TABLE . " t
$where_sql " ;
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
{
if ( $row [ 'topic_attachment' ] ^ isset ( $topic_attachment [ $row [ 'topic_id' ]]))
{
$topic_ids [] = $row [ 'topic_id' ];
2003-03-28 00:41:16 +00:00
}
2003-11-16 23:01:24 +00:00
}
2003-03-28 00:41:16 +00:00
2004-12-15 18:30:50 +00:00
if ( sizeof ( $topic_ids ))
2003-11-16 23:01:24 +00:00
{
$sql = 'UPDATE ' . TOPICS_TABLE . '
SET topic_attachment = 1 - topic_attachment
WHERE topic_id IN ( ' . implode(' , ', $topic_ids) . ' ) ' ;
$db -> sql_query ( $sql );
2003-03-28 00:41:16 +00:00
}
2003-11-16 23:01:24 +00:00
break ;
2003-03-28 00:41:16 +00:00
2003-11-16 23:01:24 +00:00
case 'forum' :
2004-11-10 14:15:16 +00:00
// 1: Get the list of all forums
2003-10-05 20:11:58 +00:00
$sql = ' SELECT f .*
FROM ' . FORUMS_TABLE . " f
$where_sql " ;
2003-05-02 15:50:11 +00:00
$result = $db -> sql_query ( $sql );
2003-03-28 00:41:16 +00:00
2003-10-05 20:11:58 +00:00
$forum_data = $forum_ids = $post_ids = $last_post_id = $post_info = array ();
2003-03-28 00:41:16 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
{
2003-05-02 15:50:11 +00:00
if ( $row [ 'forum_type' ] == FORUM_LINK )
{
continue ;
}
2003-10-05 20:11:58 +00:00
$forum_id = ( int ) $row [ 'forum_id' ];
$forum_ids [ $forum_id ] = $forum_id ;
$forum_data [ $forum_id ] = $row ;
$forum_data [ $forum_id ][ 'posts' ] = 0 ;
$forum_data [ $forum_id ][ 'topics' ] = 0 ;
$forum_data [ $forum_id ][ 'topics_real' ] = 0 ;
$forum_data [ $forum_id ][ 'last_post_id' ] = 0 ;
$forum_data [ $forum_id ][ 'last_post_time' ] = 0 ;
$forum_data [ $forum_id ][ 'last_poster_id' ] = 0 ;
$forum_data [ $forum_id ][ 'last_poster_name' ] = '' ;
2003-03-28 00:41:16 +00:00
}
2002-03-10 00:27:24 +00:00
2004-11-10 14:15:16 +00:00
// 2: Get topic counts for each forum
2003-03-28 00:41:16 +00:00
$sql = ' SELECT forum_id , topic_approved , COUNT ( topic_id ) AS forum_topics
FROM ' . TOPICS_TABLE . '
WHERE forum_id IN ( ' . implode(' , ', $forum_ids) . ' )
GROUP BY forum_id , topic_approved ' ;
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
2002-03-10 00:27:24 +00:00
{
2003-10-05 20:11:58 +00:00
$forum_id = ( int ) $row [ 'forum_id' ];
$forum_data [ $forum_id ][ 'topics_real' ] += $row [ 'forum_topics' ];
2003-05-02 15:50:11 +00:00
2003-03-28 00:41:16 +00:00
if ( $row [ 'topic_approved' ])
{
2003-10-05 20:11:58 +00:00
$forum_data [ $forum_id ][ 'topics' ] = $row [ 'forum_topics' ];
2003-03-28 00:41:16 +00:00
}
2002-03-10 00:27:24 +00:00
}
2004-11-10 14:15:16 +00:00
// 3: Get post count and last_post_id for each forum
2003-03-30 20:58:58 +00:00
$sql = ' SELECT forum_id , COUNT ( post_id ) AS forum_posts , MAX ( post_id ) AS last_post_id
2003-03-28 00:41:16 +00:00
FROM ' . POSTS_TABLE . '
WHERE forum_id IN ( ' . implode(' , ', $forum_ids) . ' )
2003-10-05 20:11:58 +00:00
AND post_approved = 1
2003-03-30 20:58:58 +00:00
GROUP BY forum_id ' ;
2003-03-28 00:41:16 +00:00
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
{
2003-10-05 20:11:58 +00:00
$forum_id = ( int ) $row [ 'forum_id' ];
2002-07-14 14:34:34 +00:00
2003-10-05 20:11:58 +00:00
$forum_data [ $forum_id ][ 'posts' ] = intval ( $row [ 'forum_posts' ]);
$forum_data [ $forum_id ][ 'last_post_id' ] = intval ( $row [ 'last_post_id' ]);
2003-05-02 15:50:11 +00:00
2003-10-05 20:11:58 +00:00
$post_ids [] = $row [ 'last_post_id' ];
2003-03-28 00:41:16 +00:00
}
2003-05-02 15:50:11 +00:00
2004-11-10 14:15:16 +00:00
// 4: Retrieve last_post infos
2004-12-15 18:30:50 +00:00
if ( sizeof ( $post_ids ))
2003-03-28 00:41:16 +00:00
{
2003-10-05 20:11:58 +00:00
$sql = ' SELECT p . post_id , p . poster_id , p . post_time , p . post_username , u . username
2003-03-28 00:41:16 +00:00
FROM ' . POSTS_TABLE . ' p , ' . USERS_TABLE . ' u
WHERE p . post_id IN ( ' . implode(' , ', $post_ids) . ' )
AND p . poster_id = u . user_id ' ;
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
{
2003-10-05 20:11:58 +00:00
$post_info [ intval ( $row [ 'post_id' ])] = $row ;
2003-03-28 00:41:16 +00:00
}
2003-04-15 17:33:07 +00:00
$db -> sql_freeresult ( $result );
2003-03-28 00:41:16 +00:00
foreach ( $forum_data as $forum_id => $data )
{
if ( $data [ 'last_post_id' ])
{
2003-10-05 20:11:58 +00:00
if ( isset ( $post_info [ $data [ 'last_post_id' ]]))
{
$forum_data [ $forum_id ][ 'last_post_time' ] = $post_info [ $data [ 'last_post_id' ]][ 'post_time' ];
$forum_data [ $forum_id ][ 'last_poster_id' ] = $post_info [ $data [ 'last_post_id' ]][ 'poster_id' ];
$forum_data [ $forum_id ][ 'last_poster_name' ] = ( $post_info [ $data [ 'last_post_id' ]][ 'poster_id' ] != ANONYMOUS ) ? $post_info [ $data [ 'last_post_id' ]][ 'username' ] : $post_info [ $data [ 'last_post_id' ]][ 'post_username' ];
}
else
{
// For some reason we did not find the post in the db
$forum_data [ $forum_id ][ 'last_post_id' ] = 0 ;
$forum_data [ $forum_id ][ 'last_post_time' ] = 0 ;
$forum_data [ $forum_id ][ 'last_poster_id' ] = 0 ;
$forum_data [ $forum_id ][ 'last_poster_name' ] = '' ;
}
2003-03-28 00:41:16 +00:00
}
}
2003-10-05 20:11:58 +00:00
unset ( $post_info );
2003-03-28 00:41:16 +00:00
}
2002-03-10 00:27:24 +00:00
2004-11-10 14:15:16 +00:00
// 5: Now do that thing
2003-03-28 00:41:16 +00:00
$fieldnames = array ( 'posts' , 'topics' , 'topics_real' , 'last_post_id' , 'last_post_time' , 'last_poster_id' , 'last_poster_name' );
2002-07-14 14:34:34 +00:00
2003-03-28 00:41:16 +00:00
foreach ( $forum_data as $forum_id => $row )
{
2003-10-05 20:11:58 +00:00
$sql = array ();
2003-03-28 00:41:16 +00:00
foreach ( $fieldnames as $fieldname )
{
2003-10-05 20:11:58 +00:00
if ( $row [ 'forum_' . $fieldname ] != $row [ $fieldname ])
2003-03-28 00:41:16 +00:00
{
2003-04-15 17:33:07 +00:00
if ( preg_match ( '#name$#' , $fieldname ))
2003-03-28 00:41:16 +00:00
{
2003-10-05 20:11:58 +00:00
$sql [ 'forum_' . $fieldname ] = ( string ) $row [ $fieldname ];
2003-03-28 00:41:16 +00:00
}
else
{
2003-10-05 20:11:58 +00:00
$sql [ 'forum_' . $fieldname ] = ( int ) $row [ $fieldname ];
2003-03-28 00:41:16 +00:00
}
}
2003-10-05 20:11:58 +00:00
}
2003-03-28 00:41:16 +00:00
2004-12-15 18:30:50 +00:00
if ( sizeof ( $sql ))
2003-10-05 20:11:58 +00:00
{
$sql = 'UPDATE ' . FORUMS_TABLE . '
SET ' . $db->sql_build_array(' UPDATE ', $sql) . '
WHERE forum_id = ' . $forum_id ;
2003-03-28 00:41:16 +00:00
$db -> sql_query ( $sql );
}
}
2003-05-02 15:50:11 +00:00
break ;
2002-07-14 14:34:34 +00:00
2003-03-28 00:41:16 +00:00
case 'topic' :
2003-10-05 20:11:58 +00:00
$topic_data = $post_ids = $approved_unapproved_ids = $resync_forums = $delete_topics = $delete_posts = array ();
2002-10-08 20:06:55 +00:00
2003-10-05 20:11:58 +00:00
$sql = 'SELECT t.topic_id, t.forum_id, t.topic_approved, ' . (( $sync_extra ) ? 't.topic_attachment, t.topic_reported, ' : '' ) . ' t . topic_poster , t . topic_time , t . topic_replies , t . topic_replies_real , t . topic_first_post_id , t . topic_first_poster_name , t . topic_last_post_id , t . topic_last_poster_id , t . topic_last_poster_name , t . topic_last_post_time
FROM ' . TOPICS_TABLE . " t
$where_sql " ;
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
{
$topic_id = ( int ) $row [ 'topic_id' ];
$topic_data [ $topic_id ] = $row ;
$topic_data [ $topic_id ][ 'replies_real' ] = - 1 ;
$topic_data [ $topic_id ][ 'first_post_id' ] = 0 ;
$topic_data [ $topic_id ][ 'last_post_id' ] = 0 ;
unset ( $topic_data [ $topic_id ][ 'topic_id' ]);
2003-11-16 23:01:24 +00:00
// This array holds all topic_ids
$delete_topics [ $topic_id ] = '' ;
2003-10-05 20:11:58 +00:00
if ( $sync_extra )
{
$topic_data [ $topic_id ][ 'reported' ] = 0 ;
$topic_data [ $topic_id ][ 'attachment' ] = 0 ;
}
}
$db -> sql_freeresult ( $result );
// Use "t" as table alias because of the $where_sql clause
2004-12-15 18:30:50 +00:00
// NOTE: 't.post_approved' in the GROUP BY is causing a major slowdown.
2003-10-05 20:11:58 +00:00
$sql = ' SELECT t . topic_id , t . post_approved , COUNT ( t . post_id ) AS total_posts , MIN ( t . post_id ) AS first_post_id , MAX ( t . post_id ) AS last_post_id
FROM ' . POSTS_TABLE . " t
$where_sql
2004-12-15 18:30:50 +00:00
GROUP BY t . topic_id " ; //, t.post_approved " ;
2003-03-28 00:41:16 +00:00
$result = $db -> sql_query ( $sql );
2003-05-02 15:50:11 +00:00
2003-03-28 00:41:16 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
{
2003-10-05 20:11:58 +00:00
$topic_id = ( int ) $row [ 'topic_id' ];
2003-03-28 00:41:16 +00:00
2003-10-05 20:11:58 +00:00
$row [ 'first_post_id' ] = ( int ) $row [ 'first_post_id' ];
$row [ 'last_post_id' ] = ( int ) $row [ 'last_post_id' ];
if ( ! isset ( $topic_data [ $topic_id ]))
2003-03-28 00:41:16 +00:00
{
2003-10-05 20:11:58 +00:00
// Hey, these posts come from a topic that does not exist
$delete_posts [ $topic_id ] = '' ;
2003-03-28 00:41:16 +00:00
}
else
{
2003-10-05 20:11:58 +00:00
// Unset the corresponding entry in $delete_topics
// When we'll be done, only topics with no posts will remain
unset ( $delete_topics [ $topic_id ]);
2003-03-28 00:41:16 +00:00
2003-10-05 20:11:58 +00:00
$topic_data [ $topic_id ][ 'replies_real' ] += $row [ 'total_posts' ];
$topic_data [ $topic_id ][ 'first_post_id' ] = ( ! $topic_data [ $topic_id ][ 'first_post_id' ]) ? $row [ 'first_post_id' ] : min ( $topic_data [ $topic_id ][ 'first_post_id' ], $row [ 'first_post_id' ]);
if ( $row [ 'post_approved' ] || ! $topic_data [ $topic_id ][ 'last_post_id' ])
2003-03-28 00:41:16 +00:00
{
2003-10-05 20:11:58 +00:00
$topic_data [ $topic_id ][ 'replies' ] = $row [ 'total_posts' ] - 1 ;
$topic_data [ $topic_id ][ 'last_post_id' ] = $row [ 'last_post_id' ];
2003-03-28 00:41:16 +00:00
}
}
}
2003-09-17 20:11:56 +00:00
$db -> sql_freeresult ( $result );
2002-07-14 14:34:34 +00:00
2003-03-28 00:41:16 +00:00
foreach ( $topic_data as $topic_id => $row )
{
$post_ids [] = $row [ 'first_post_id' ];
if ( $row [ 'first_post_id' ] != $row [ 'last_post_id' ])
{
$post_ids [] = $row [ 'last_post_id' ];
}
}
2002-07-14 14:34:34 +00:00
2003-10-05 20:11:58 +00:00
// Now we delete empty topics and orphan posts
2004-12-15 18:30:50 +00:00
if ( sizeof ( $delete_posts ))
2003-03-28 00:41:16 +00:00
{
2005-11-28 18:38:49 +00:00
delete_posts ( 'topic_id' , array_keys ( $delete_posts ), false );
2003-10-05 20:11:58 +00:00
unset ( $delete_posts );
2003-03-28 00:41:16 +00:00
}
2004-12-15 18:30:50 +00:00
if ( ! sizeof ( $topic_data ))
2003-03-28 00:41:16 +00:00
{
2003-10-05 20:11:58 +00:00
// If we get there, topic ids were invalid or topics did not contain any posts
2005-11-28 18:38:49 +00:00
delete_topics ( $where_type , $where_ids , true );
2003-10-05 20:11:58 +00:00
return ;
2003-03-28 00:41:16 +00:00
}
2004-12-15 18:30:50 +00:00
if ( sizeof ( $delete_topics ))
2003-03-28 00:41:16 +00:00
{
2003-11-16 23:01:24 +00:00
$delete_topic_ids = array ();
foreach ( $delete_topics as $topic_id => $void )
{
unset ( $topic_data [ $topic_id ]);
$delete_topic_ids [] = $topic_id ;
}
2005-11-28 18:38:49 +00:00
delete_topics ( 'topic_id' , $delete_topic_ids , false );
2003-11-16 23:01:24 +00:00
unset ( $delete_topics , $delete_topic_ids );
2003-03-28 00:41:16 +00:00
}
2002-07-14 14:34:34 +00:00
2003-03-28 00:41:16 +00:00
$sql = ' SELECT p . post_id , p . topic_id , p . post_approved , p . poster_id , p . post_username , p . post_time , u . username
FROM ' . POSTS_TABLE . ' p , ' . USERS_TABLE . ' u
2003-10-05 20:11:58 +00:00
WHERE p . post_id IN ( ' . implode(' , ', $post_ids) . ' )
2003-03-28 00:41:16 +00:00
AND u . user_id = p . poster_id ' ;
2003-05-02 15:50:11 +00:00
$result = $db -> sql_query ( $sql );
2003-03-30 20:58:58 +00:00
$post_ids = array ();
2003-03-28 00:41:16 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
{
2003-10-05 20:11:58 +00:00
$topic_id = intval ( $row [ 'topic_id' ]);
if ( $row [ 'post_id' ] == $topic_data [ $topic_id ][ 'first_post_id' ])
2003-03-28 00:41:16 +00:00
{
2003-10-05 20:11:58 +00:00
if ( $topic_data [ $topic_id ][ 'topic_approved' ] != $row [ 'post_approved' ])
2003-03-28 00:41:16 +00:00
{
2003-10-05 20:11:58 +00:00
$approved_unapproved_ids [] = $topic_id ;
2003-03-28 00:41:16 +00:00
}
2003-10-05 20:11:58 +00:00
$topic_data [ $topic_id ][ 'time' ] = $row [ 'post_time' ];
$topic_data [ $topic_id ][ 'poster' ] = $row [ 'poster_id' ];
$topic_data [ $topic_id ][ 'first_poster_name' ] = ( $row [ 'poster_id' ] == ANONYMOUS ) ? $row [ 'post_username' ] : $row [ 'username' ];
2003-03-28 00:41:16 +00:00
}
2003-10-05 20:11:58 +00:00
if ( $row [ 'post_id' ] == $topic_data [ $topic_id ][ 'last_post_id' ])
2003-03-28 00:41:16 +00:00
{
2003-10-05 20:11:58 +00:00
$topic_data [ $topic_id ][ 'last_poster_id' ] = $row [ 'poster_id' ];
$topic_data [ $topic_id ][ 'last_post_time' ] = $row [ 'post_time' ];
$topic_data [ $topic_id ][ 'last_poster_name' ] = ( $row [ 'poster_id' ] == ANONYMOUS ) ? $row [ 'post_username' ] : $row [ 'username' ];
2003-03-28 00:41:16 +00:00
}
}
2003-09-17 20:11:56 +00:00
$db -> sql_freeresult ( $result );
2002-07-14 14:34:34 +00:00
2003-03-30 20:58:58 +00:00
// approved becomes unapproved, and vice-versa
2004-12-15 18:30:50 +00:00
if ( sizeof ( $approved_unapproved_ids ))
2003-03-28 00:41:16 +00:00
{
$sql = 'UPDATE ' . TOPICS_TABLE . '
2003-03-30 20:58:58 +00:00
SET topic_approved = 1 - topic_approved
WHERE topic_id IN ( ' . implode(' , ', $approved_unapproved_ids) . ' ) ' ;
2003-03-28 00:41:16 +00:00
$db -> sql_query ( $sql );
}
2003-09-17 20:11:56 +00:00
unset ( $approved_unapproved_ids );
2002-07-14 14:34:34 +00:00
2004-11-10 14:15:16 +00:00
// These are fields that will be synchronised
2003-03-28 00:41:16 +00:00
$fieldnames = array ( 'time' , 'replies' , 'replies_real' , 'poster' , 'first_post_id' , 'first_poster_name' , 'last_post_id' , 'last_post_time' , 'last_poster_id' , 'last_poster_name' );
2002-07-14 14:34:34 +00:00
2003-03-30 20:58:58 +00:00
if ( $sync_extra )
{
// This routine assumes that post_reported values are correct
2003-11-16 23:01:24 +00:00
// if they are not, use sync('post_reported') first
2003-03-30 20:58:58 +00:00
$sql = ' SELECT t . topic_id , p . post_id
FROM ' . TOPICS_TABLE . ' t , ' . POSTS_TABLE . " p
$where_sql_and p . topic_id = t . topic_id
AND p . post_reported = 1
2003-10-05 20:11:58 +00:00
GROUP BY t . topic_id " ;
2003-03-30 20:58:58 +00:00
$result = $db -> sql_query ( $sql );
2003-05-02 15:50:11 +00:00
$fieldnames [] = 'reported' ;
2003-03-30 20:58:58 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
{
2003-10-05 20:11:58 +00:00
$topic_data [ intval ( $row [ 'topic_id' ])][ 'reported' ] = 1 ;
2003-03-30 20:58:58 +00:00
}
2003-05-02 15:50:11 +00:00
$db -> sql_freeresult ( $result );
2003-03-30 20:58:58 +00:00
2003-04-23 21:57:53 +00:00
// This routine assumes that post_attachment values are correct
2003-11-16 23:01:24 +00:00
// if they are not, use sync('post_attachment') first
2003-04-23 21:57:53 +00:00
$sql = ' SELECT t . topic_id , p . post_id
FROM ' . TOPICS_TABLE . ' t , ' . POSTS_TABLE . " p
$where_sql_and p . topic_id = t . topic_id
AND p . post_attachment = 1
2003-10-05 20:11:58 +00:00
GROUP BY t . topic_id " ;
2003-04-23 21:57:53 +00:00
$result = $db -> sql_query ( $sql );
2003-05-02 15:50:11 +00:00
$fieldnames [] = 'attachment' ;
2003-04-23 21:57:53 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
{
2003-10-05 20:11:58 +00:00
$topic_data [ intval ( $row [ 'topic_id' ])][ 'attachment' ] = 1 ;
2003-04-23 21:57:53 +00:00
}
2003-05-02 15:50:11 +00:00
$db -> sql_freeresult ( $result );
2003-03-30 20:58:58 +00:00
}
2003-03-28 00:41:16 +00:00
foreach ( $topic_data as $topic_id => $row )
{
2003-10-05 20:11:58 +00:00
$sql = array ();
2003-03-28 00:41:16 +00:00
foreach ( $fieldnames as $fieldname )
{
2003-10-05 20:11:58 +00:00
if ( $row [ 'topic_' . $fieldname ] != $row [ $fieldname ])
2003-03-28 00:41:16 +00:00
{
2003-10-05 20:11:58 +00:00
$sql [ 'topic_' . $fieldname ] = $row [ $fieldname ];
2003-03-28 00:41:16 +00:00
}
2003-10-05 20:11:58 +00:00
}
2003-03-28 00:41:16 +00:00
2004-12-15 18:30:50 +00:00
if ( sizeof ( $sql ))
2003-10-05 20:11:58 +00:00
{
2003-03-28 00:41:16 +00:00
$sql = 'UPDATE ' . TOPICS_TABLE . '
2003-05-02 15:50:11 +00:00
SET ' . $db->sql_build_array(' UPDATE ', $sql) . '
WHERE topic_id = ' . $topic_id ;
2003-03-28 00:41:16 +00:00
$db -> sql_query ( $sql );
2003-10-05 20:11:58 +00:00
$resync_forums [ $row [ 'forum_id' ]] = $row [ 'forum_id' ];
2003-03-28 00:41:16 +00:00
}
}
2003-03-30 20:58:58 +00:00
unset ( $topic_data );
2002-07-14 14:34:34 +00:00
2003-03-28 00:41:16 +00:00
// if some topics have been resync'ed then resync parent forums
2005-11-28 18:38:49 +00:00
// except when we're only syncing a range, we don't want to sync forums during
// batch processing.
2005-01-24 13:14:31 +00:00
if ( $resync_parents && sizeof ( $resync_forums ) && $where_type != 'range' )
2003-03-28 00:41:16 +00:00
{
2005-11-28 18:38:49 +00:00
sync ( 'forum' , 'forum_id' , $resync_forums , true );
2003-03-28 00:41:16 +00:00
}
2003-05-02 15:50:11 +00:00
break ;
2003-03-28 00:41:16 +00:00
}
}
2002-07-14 14:34:34 +00:00
2005-04-09 12:26:45 +00:00
/**
* Prune function
*/
2003-09-07 17:16:12 +00:00
function prune ( $forum_id , $prune_mode , $prune_date , $prune_flags = 0 , $auto_sync = true )
2002-07-14 14:34:34 +00:00
{
2003-03-28 00:41:16 +00:00
global $db ;
2002-07-14 14:34:34 +00:00
2003-05-08 12:49:16 +00:00
$sql_forum = ( is_array ( $forum_id )) ? ' IN (' . implode ( ',' , $forum_id ) . ')' : " = $forum_id " ;
2003-05-08 01:14:14 +00:00
$sql_and = '' ;
if ( ! ( $prune_flags & 4 ))
{
$sql_and .= ' AND topic_type <> ' . POST_ANNOUNCE ;
}
2005-12-10 23:20:21 +00:00
2003-05-08 01:14:14 +00:00
if ( ! ( $prune_flags & 8 ))
2003-03-28 00:41:16 +00:00
{
2003-05-08 01:14:14 +00:00
$sql_and .= ' AND topic_type <> ' . POST_STICKY ;
2003-03-28 00:41:16 +00:00
}
2003-05-08 01:14:14 +00:00
2003-09-07 17:16:12 +00:00
if ( $prune_mode == 'posted' )
{
$sql_and .= " AND topic_last_post_time < $prune_date " ;
}
2005-12-10 23:20:21 +00:00
2003-09-07 17:16:12 +00:00
if ( $prune_mode == 'viewed' )
{
$sql_and .= " AND topic_last_view_time < $prune_date " ;
}
2003-05-08 01:14:14 +00:00
$sql = ' SELECT topic_id
FROM ' . TOPICS_TABLE . "
2003-05-08 12:49:16 +00:00
WHERE forum_id $sql_forum
2003-05-08 01:14:14 +00:00
AND poll_start = 0
$sql_and " ;
2002-07-14 14:34:34 +00:00
$result = $db -> sql_query ( $sql );
2003-03-28 00:41:16 +00:00
$topic_list = array ();
while ( $row = $db -> sql_fetchrow ( $result ))
2002-07-14 14:34:34 +00:00
{
2003-03-28 00:41:16 +00:00
$topic_list [] = $row [ 'topic_id' ];
}
$db -> sql_freeresult ( $result );
2002-07-14 14:34:34 +00:00
2003-05-08 01:14:14 +00:00
if ( $prune_flags & 2 )
{
$sql = ' SELECT topic_id
FROM ' . TOPICS_TABLE . "
2003-05-08 12:49:16 +00:00
WHERE forum_id $sql_forum
2003-05-08 01:14:14 +00:00
AND poll_start > 0
AND poll_last_vote < $prune_date
$sql_and " ;
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
{
$topic_list [] = $row [ 'topic_id' ];
}
$db -> sql_freeresult ( $result );
$topic_list = array_unique ( $topic_list );
}
2003-05-02 15:50:11 +00:00
return delete_topics ( 'topic_id' , $topic_list , $auto_sync );
2003-03-28 00:41:16 +00:00
}
2002-07-14 14:34:34 +00:00
2005-04-09 12:26:45 +00:00
/**
* Function auto_prune (), this function now relies on passed vars
*/
2003-09-07 17:16:12 +00:00
function auto_prune ( $forum_id , $prune_mode , $prune_flags , $prune_days , $prune_freq )
2003-03-28 00:41:16 +00:00
{
2003-05-08 01:14:14 +00:00
global $db ;
2003-05-08 12:49:16 +00:00
$sql = ' SELECT forum_name
FROM ' . FORUMS_TABLE . "
WHERE forum_id = $forum_id " ;
$result = $db -> sql_query ( $sql );
2003-03-28 00:41:16 +00:00
2003-05-08 12:49:16 +00:00
if ( $row = $db -> sql_fetchrow ( $result ))
{
$prune_date = time () - ( $prune_days * 86400 );
$next_prune = time () + ( $prune_freq * 86400 );
2003-03-28 00:41:16 +00:00
2003-09-07 17:16:12 +00:00
prune ( $forum_id , $prune_mode , $prune_date , $prune_flags , true );
2003-05-08 12:49:16 +00:00
$sql = 'UPDATE ' . FORUMS_TABLE . "
SET prune_next = $next_prune
WHERE forum_id = $forum_id " ;
$db -> sql_query ( $sql );
add_log ( 'admin' , 'LOG_AUTO_PRUNE' , $row [ 'forum_name' ]);
}
$db -> sql_freeresult ( $result );
2002-07-14 14:34:34 +00:00
return ;
}
2005-04-09 12:26:45 +00:00
/**
* remove_comments will strip the sql comment lines out of an uploaded sql file
* specifically for mssql and postgres type files in the install ....
*/
2002-07-14 14:34:34 +00:00
function remove_comments ( & $output )
{
$lines = explode ( " \n " , $output );
$output = '' ;
// try to keep mem. use down
2004-12-15 18:30:50 +00:00
$linecount = sizeof ( $lines );
2002-07-14 14:34:34 +00:00
$in_comment = false ;
2005-05-05 16:55:05 +00:00
for ( $i = 0 ; $i < $linecount ; $i ++ )
2002-07-14 14:34:34 +00:00
{
2005-05-05 16:55:05 +00:00
if ( trim ( $lines [ $i ]) == '/*' )
2002-07-14 14:34:34 +00:00
{
$in_comment = true ;
}
2003-01-08 18:27:16 +00:00
if ( ! $in_comment )
2002-07-14 14:34:34 +00:00
{
$output .= $lines [ $i ] . " \n " ;
}
2005-05-05 16:55:05 +00:00
if ( trim ( $lines [ $i ]) == '*/' )
2002-07-14 14:34:34 +00:00
{
$in_comment = false ;
}
}
unset ( $lines );
return $output ;
}
2005-04-09 12:26:45 +00:00
/**
* remove_remarks will strip the sql comment lines out of an uploaded sql file
*/
2004-09-16 18:33:22 +00:00
function remove_remarks ( & $sql )
2002-07-14 14:34:34 +00:00
{
2004-09-26 13:50:08 +00:00
$sql = preg_replace ( '/(\n){2,}/' , " \n " , preg_replace ( '/^#.*/m' , " \n " , $sql ));
2002-07-14 14:34:34 +00:00
}
2005-04-09 12:26:45 +00:00
/**
* split_sql_file will split an uploaded sql file into single sql statements .
* Note : expects trim () to have already been run on $sql .
*/
2002-07-14 14:34:34 +00:00
function split_sql_file ( $sql , $delimiter )
{
// Split up our string into "possible" SQL statements.
$tokens = explode ( $delimiter , $sql );
// try to save mem.
$sql = '' ;
$output = array ();
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +00:00
// we don't actually care about the matches preg gives us.
$matches = array ();
2002-10-08 20:06:55 +00:00
2005-11-28 18:38:49 +00:00
// this is faster than calling sizeof($oktens) every time thru the loop.
for ( $i = 0 , $token_count = sizeof ( $tokens ); $i < $token_count ; $i ++ )
2002-07-14 14:34:34 +00:00
{
// Don't wanna add an empty string as the last thing in the array.
2005-01-09 20:01:20 +00:00
if ( $i != $token_count - 1 )
2002-07-14 14:34:34 +00:00
{
// This is the total number of single quotes in the token.
2003-05-02 15:50:11 +00:00
$total_quotes = preg_match_all ( " #'# " , $tokens [ $i ], $matches );
2002-10-08 20:06:55 +00:00
// Counts single quotes that are preceded by an odd number of backslashes,
2002-07-14 14:34:34 +00:00
// which means they're escaped quotes.
2003-05-02 15:50:11 +00:00
$escaped_quotes = preg_match_all ( " #(?<! \\ \\ )( \\ \\ \\ \\ )* \\ \\ '# " , $tokens [ $i ], $matches );
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +00:00
$unescaped_quotes = $total_quotes - $escaped_quotes ;
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +00:00
// If the number of unescaped quotes is even, then the delimiter did NOT occur inside a string literal.
2003-01-08 18:27:16 +00:00
if ( ! ( $unescaped_quotes % 2 ))
2002-07-14 14:34:34 +00:00
{
// It's a complete sql statement.
$output [] = $tokens [ $i ];
// save memory.
$tokens [ $i ] = '' ;
}
else
{
// incomplete sql statement. keep adding tokens until we have a complete one.
// $temp will hold what we have so far.
$temp = $tokens [ $i ] . $delimiter ;
// save memory..
$tokens [ $i ] = '' ;
2002-10-08 20:06:55 +00:00
// Do we have a complete statement yet?
2002-07-14 14:34:34 +00:00
$complete_stmt = false ;
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +00:00
for ( $j = $i + 1 ; ( ! $complete_stmt && ( $j < $token_count )); $j ++ )
{
// This is the total number of single quotes in the token.
2003-05-02 15:50:11 +00:00
$total_quotes = preg_match_all ( " #'# " , $tokens [ $j ], $matches );
2002-10-08 20:06:55 +00:00
// Counts single quotes that are preceded by an odd number of backslashes,
2002-07-14 14:34:34 +00:00
// which means they're escaped quotes.
2003-05-02 15:50:11 +00:00
$escaped_quotes = preg_match_all ( " #(?<! \\ \\ )( \\ \\ \\ \\ )* \\ \\ '# " , $tokens [ $j ], $matches );
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +00:00
$unescaped_quotes = $total_quotes - $escaped_quotes ;
2002-10-08 20:06:55 +00:00
2003-01-08 18:27:16 +00:00
if (( $unescaped_quotes % 2 ) == 1 )
2002-07-14 14:34:34 +00:00
{
// odd number of unescaped quotes. In combination with the previous incomplete
// statement(s), we now have a complete statement. (2 odds always make an even)
$output [] = $temp . $tokens [ $j ];
// save memory.
$tokens [ $j ] = '' ;
$temp = '' ;
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +00:00
// exit the loop.
$complete_stmt = true ;
// make sure the outer loop continues at the right point.
$i = $j ;
}
else
{
2002-10-08 20:06:55 +00:00
// even number of unescaped quotes. We still don't have a complete statement.
2002-07-14 14:34:34 +00:00
// (1 odd and 1 even always make an odd)
$temp .= $tokens [ $j ] . $delimiter ;
// save memory.
$tokens [ $j ] = '' ;
}
} // for..
} // else
}
}
return $output ;
}
2005-04-09 12:26:45 +00:00
/**
* Cache moderators , called whenever permissions are changed via admin_permissions . Changes of username
* and group names must be carried through for the moderators table
*/
2002-11-19 23:12:11 +00:00
function cache_moderators ()
2002-11-18 21:04:45 +00:00
{
2003-08-27 16:31:54 +00:00
global $db , $cache ;
2002-11-18 21:04:45 +00:00
// Clear table
2003-07-04 17:17:37 +00:00
$sql = ( SQL_LAYER != 'sqlite' ) ? 'TRUNCATE ' . MODERATOR_TABLE : 'DELETE FROM ' . MODERATOR_TABLE ;
$db -> sql_query ( $sql );
2002-11-18 21:04:45 +00:00
// Holding array
$m_sql = array ();
$user_id_sql = '' ;
2003-07-04 17:17:37 +00:00
$sql = ' SELECT a . forum_id , u . user_id , u . username
FROM ' . ACL_OPTIONS_TABLE . ' o , ' . ACL_USERS_TABLE . ' a , ' . USERS_TABLE . " u
2003-04-15 17:33:07 +00:00
WHERE o . auth_option = 'm_'
2002-11-18 21:04:45 +00:00
AND a . auth_option_id = o . auth_option_id
2003-07-04 17:17:37 +00:00
AND a . auth_setting = " . ACL_YES . '
AND u . user_id = a . user_id ' ;
2002-11-18 21:04:45 +00:00
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
{
2003-04-15 17:33:07 +00:00
$m_sql [ 'f_' . $row [ 'forum_id' ] . '_u_' . $row [ 'user_id' ]] = $row [ 'forum_id' ] . ', ' . $row [ 'user_id' ] . " , ' " . $row [ 'username' ] . " ', NULL, NULL " ;
2002-11-18 21:04:45 +00:00
$user_id_sql .= (( $user_id_sql ) ? ', ' : '' ) . $row [ 'user_id' ];
}
$db -> sql_freeresult ( $result );
// Remove users who have group memberships with DENY moderator permissions
if ( $user_id_sql )
{
2003-07-04 17:17:37 +00:00
$sql = ' SELECT a . forum_id , ug . user_id
FROM ' . ACL_OPTIONS_TABLE . ' o , ' . ACL_GROUPS_TABLE . ' a , ' . USER_GROUP_TABLE . " ug
2003-04-15 17:33:07 +00:00
WHERE o . auth_option = 'm_'
2002-11-18 21:04:45 +00:00
AND a . auth_option_id = o . auth_option_id
2003-04-15 17:33:07 +00:00
AND a . auth_setting = " . ACL_NO . "
2002-11-18 21:04:45 +00:00
AND a . group_id = ug . group_id
2002-11-19 23:12:11 +00:00
AND ug . user_id IN ( $user_id_sql ) " ;
2002-11-18 21:04:45 +00:00
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
{
unset ( $m_sql [ 'f_' . $row [ 'forum_id' ] . '_u_' . $row [ 'user_id' ]]);
}
$db -> sql_freeresult ( $result );
}
2003-07-04 17:17:37 +00:00
$sql = ' SELECT a . forum_id , g . group_name , g . group_id
FROM ' . ACL_OPTIONS_TABLE . ' o , ' . ACL_GROUPS_TABLE . ' a , ' . GROUPS_TABLE . " g
2003-04-15 17:33:07 +00:00
WHERE o . auth_option = 'm_'
2002-11-18 21:04:45 +00:00
AND a . auth_option_id = o . auth_option_id
2003-07-04 17:17:37 +00:00
AND a . auth_setting = " . ACL_YES . '
2002-11-18 21:04:45 +00:00
AND g . group_id = a . group_id
2003-07-04 17:17:37 +00:00
AND g . group_type NOT IN ( ' . GROUP_HIDDEN . ' , ' . GROUP_SPECIAL . ' ) ' ;
2002-11-18 21:04:45 +00:00
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
{
2003-04-15 17:33:07 +00:00
$m_sql [ 'f_' . $row [ 'forum_id' ] . '_g_' . $row [ 'group_id' ]] = $row [ 'forum_id' ] . ', NULL, NULL, ' . $row [ 'group_id' ] . " , ' " . $row [ 'group_name' ] . " ' " ;
2002-11-18 21:04:45 +00:00
}
$db -> sql_freeresult ( $result );
if ( sizeof ( $m_sql ))
{
switch ( SQL_LAYER )
{
case 'mysql' :
2003-04-01 00:06:11 +00:00
$sql = 'INSERT INTO ' . MODERATOR_TABLE . ' ( forum_id , user_id , username , group_id , groupname )
VALUES ' . implode(' , ', preg_replace(' #^(.*)$#', '(\1)', $m_sql));
2003-07-04 17:17:37 +00:00
$db -> sql_query ( $sql );
2002-11-18 21:04:45 +00:00
break ;
2005-01-09 20:01:20 +00:00
case 'mysql4' :
2005-04-30 14:24:13 +00:00
case 'mysqli' :
2002-11-18 21:04:45 +00:00
case 'mssql' :
2005-10-09 17:59:27 +00:00
case 'mssql_odbc' :
2003-07-07 23:43:27 +00:00
case 'sqlite' :
2002-11-18 21:04:45 +00:00
$sql = 'INSERT INTO ' . MODERATOR_TABLE . ' ( forum_id , user_id , username , group_id , groupname )
2003-07-07 23:43:27 +00:00
' . implode(' UNION ALL ', preg_replace(' #^(.*)$#', 'SELECT \1', $m_sql));
2003-07-04 17:17:37 +00:00
$db -> sql_query ( $sql );
2002-11-18 21:04:45 +00:00
break ;
default :
foreach ( $m_sql as $k => $sql )
{
2003-07-04 17:17:37 +00:00
$sql = 'INSERT INTO ' . MODERATOR_TABLE . " (forum_id, user_id, username, group_id, groupname)
VALUES ( $sql ) " ;
$db -> sql_query ( $sql );
2002-11-18 21:04:45 +00:00
}
}
}
}
2005-04-09 12:26:45 +00:00
/**
* Add log event
*/
2003-01-29 17:44:22 +00:00
function add_log ()
{
global $db , $user ;
$args = func_get_args ();
2004-02-11 18:27:00 +00:00
$mode = array_shift ( $args );
$reportee_id = ( $mode == 'user' ) ? intval ( array_shift ( $args )) : '' ;
$forum_id = ( $mode == 'mod' ) ? intval ( array_shift ( $args )) : '' ;
$topic_id = ( $mode == 'mod' ) ? intval ( array_shift ( $args )) : '' ;
$action = array_shift ( $args );
$data = ( ! sizeof ( $args )) ? '' : $db -> sql_escape ( serialize ( $args ));
2003-01-29 17:44:22 +00:00
2003-07-06 18:48:33 +00:00
switch ( $mode )
2003-02-24 23:51:26 +00:00
{
2003-07-06 18:48:33 +00:00
case 'admin' :
2003-10-12 11:59:23 +00:00
$sql = 'INSERT INTO ' . LOG_TABLE . ' ( log_type , user_id , log_ip , log_time , log_operation , log_data )
VALUES ( ' . LOG_ADMIN . ' , ' . $user->data[' user_id '] . ", ' $user -> ip ', " . time() . ", ' $action ', ' $data ' ) " ;
2003-07-06 18:48:33 +00:00
break ;
case 'mod' :
2003-10-12 11:59:23 +00:00
$sql = 'INSERT INTO ' . LOG_TABLE . ' ( log_type , user_id , forum_id , topic_id , log_ip , log_time , log_operation , log_data )
VALUES ( ' . LOG_MOD . ' , ' . $user->data[' user_id '] . ", $forum_id, $topic_id, ' $user -> ip ', " . time() . ", ' $action ', ' $data ' ) " ;
2003-07-06 18:48:33 +00:00
break ;
2004-02-11 18:27:00 +00:00
case 'user' :
$sql = 'INSERT INTO ' . LOG_TABLE . ' ( log_type , user_id , reportee_id , log_ip , log_time , log_operation , log_data )
VALUES ( ' . LOG_USERS . ' , ' . $user->data[' user_id '] . ", $reportee_id, ' $user -> ip ', " . time() . ", ' $action ', ' $data ' ) " ;
break ;
2003-07-06 18:48:33 +00:00
case 'critical' :
2003-10-12 11:59:23 +00:00
$sql = 'INSERT INTO ' . LOG_TABLE . ' ( log_type , user_id , log_ip , log_time , log_operation , log_data )
VALUES ( ' . LOG_CRITICAL . ' , ' . $user->data[' user_id '] . ", ' $user -> ip ', " . time() . ", ' $action ', ' $data ' ) " ;
2003-07-06 18:48:33 +00:00
break ;
default :
return ;
2003-02-24 23:51:26 +00:00
}
2003-01-29 17:44:22 +00:00
2003-02-24 23:51:26 +00:00
$db -> sql_query ( $sql );
2003-01-29 17:44:22 +00:00
return ;
}
2005-04-09 12:26:45 +00:00
/**
* View log
*/
2004-02-11 18:27:00 +00:00
function view_log ( $mode , & $log , & $log_count , $limit = 0 , $offset = 0 , $forum_id = 0 , $topic_id = 0 , $user_id = 0 , $limit_days = 0 , $sort_by = 'l.log_time DESC' )
2003-01-29 17:44:22 +00:00
{
2003-04-02 23:21:17 +00:00
global $db , $user , $auth , $phpEx , $SID ;
2003-04-15 17:33:07 +00:00
2003-04-02 23:21:17 +00:00
$topic_id_list = $is_auth = $is_mod = array ();
2003-04-15 17:33:07 +00:00
2003-04-02 23:21:17 +00:00
$profile_url = ( defined ( 'IN_ADMIN' )) ? " admin_users. $phpEx $SID " : " memberlist. $phpEx $SID &mode=viewprofile " ;
2003-01-29 17:44:22 +00:00
2003-07-06 18:48:33 +00:00
switch ( $mode )
2003-04-02 23:21:17 +00:00
{
2003-07-06 18:48:33 +00:00
case 'admin' :
$log_type = LOG_ADMIN ;
$sql_forum = '' ;
break ;
case 'mod' :
$log_type = LOG_MOD ;
2003-01-29 17:44:22 +00:00
2003-07-06 18:48:33 +00:00
if ( $topic_id )
{
$sql_forum = 'AND l.topic_id = ' . intval ( $topic_id );
}
else if ( is_array ( $forum_id ))
{
$sql_forum = 'AND l.forum_id IN (' . implode ( ', ' , array_map ( 'intval' , $forum_id )) . ')' ;
}
else
{
$sql_forum = ( $forum_id ) ? 'AND l.forum_id = ' . intval ( $forum_id ) : '' ;
}
break ;
2004-02-11 18:27:00 +00:00
case 'user' :
$log_type = LOG_USERS ;
$sql_forum = 'AND l.reportee_id = ' . intval ( $user_id );
break ;
2003-07-06 18:48:33 +00:00
case 'critical' :
$log_type = LOG_CRITICAL ;
$sql_forum = '' ;
break ;
default :
return ;
2003-04-02 23:21:17 +00:00
}
$sql = " SELECT l.*, u.username
2003-07-06 18:48:33 +00:00
FROM " . LOG_TABLE . " l , " . USERS_TABLE . " u
WHERE l . log_type = $log_type
AND u . user_id = l . user_id
2003-04-02 23:21:17 +00:00
" . (( $limit_days ) ? " AND l . log_time >= $limit_days " : '') . "
2003-04-15 17:33:07 +00:00
$sql_forum
2003-04-02 23:21:17 +00:00
ORDER BY $sort_by " ;
$result = $db -> sql_query_limit ( $sql , $limit , $offset );
2003-01-29 17:44:22 +00:00
2003-04-02 23:21:17 +00:00
$i = 0 ;
2003-01-29 17:44:22 +00:00
$log = array ();
2003-04-02 23:21:17 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
2003-01-29 17:44:22 +00:00
{
2003-04-02 23:21:17 +00:00
if ( $row [ 'topic_id' ])
{
$topic_id_list [] = $row [ 'topic_id' ];
}
$log [ $i ][ 'id' ] = $row [ 'log_id' ];
$log [ $i ][ 'username' ] = '<a href="' . $profile_url . '&u=' . $row [ 'user_id' ] . '">' . $row [ 'username' ] . '</a>' ;
$log [ $i ][ 'ip' ] = $row [ 'log_ip' ];
$log [ $i ][ 'time' ] = $row [ 'log_time' ];
$log [ $i ][ 'forum_id' ] = $row [ 'forum_id' ];
$log [ $i ][ 'topic_id' ] = $row [ 'topic_id' ];
2004-07-08 22:41:04 +00:00
$log [ $i ][ 'viewforum' ] = ( $row [ 'forum_id' ] && $auth -> acl_get ( 'f_read' , $row [ 'forum_id' ])) ? (( defined ( 'IN_ADMIN' )) ? '../' : '' ) . " viewforum. $phpEx $SID &f= " . $row [ 'forum_id' ] : '' ;
2003-04-02 23:21:17 +00:00
2005-04-09 12:26:45 +00:00
$log [ $i ][ 'action' ] = ( isset ( $user -> lang [ $row [ 'log_operation' ]])) ? $user -> lang [ $row [ 'log_operation' ]] : '{' . ucfirst ( str_replace ( '_' , ' ' , $row [ 'log_operation' ])) . '}' ;
2003-04-02 23:21:17 +00:00
if ( ! empty ( $row [ 'log_data' ]))
2003-01-29 17:44:22 +00:00
{
2003-04-02 23:21:17 +00:00
$log_data_ary = unserialize ( stripslashes ( $row [ 'log_data' ]));
2005-04-09 12:26:45 +00:00
if ( isset ( $user -> lang [ $row [ 'log_operation' ]]))
2003-07-06 18:48:33 +00:00
{
foreach ( $log_data_ary as $log_data )
{
2004-02-21 12:47:35 +00:00
$log_data = str_replace ( " \n " , '<br />' , censor_text ( $log_data ));
2004-02-11 18:27:00 +00:00
2003-07-06 18:48:33 +00:00
$log [ $i ][ 'action' ] = preg_replace ( '#%s#' , $log_data , $log [ $i ][ 'action' ], 1 );
}
}
else
2003-04-02 23:21:17 +00:00
{
2005-04-09 12:26:45 +00:00
$log [ $i ][ 'action' ] .= '<br />' . implode ( '' , $log_data_ary );
2003-04-02 23:21:17 +00:00
}
}
2003-01-29 17:44:22 +00:00
2003-04-02 23:21:17 +00:00
$i ++ ;
}
$db -> sql_freeresult ( $result );
2003-01-29 17:44:22 +00:00
2004-12-15 18:30:50 +00:00
if ( sizeof ( $topic_id_list ))
2003-04-02 23:21:17 +00:00
{
2003-04-09 22:17:55 +00:00
$topic_id_list = array_unique ( $topic_id_list );
2003-04-15 17:33:07 +00:00
// This query is not really needed if move_topics() updates the forum_id field,
// altough it's also used to determine if the topic still exists in the database
2003-04-02 23:21:17 +00:00
$sql = ' SELECT topic_id , forum_id
FROM ' . TOPICS_TABLE . '
2003-04-15 17:33:07 +00:00
WHERE topic_id IN ( ' . implode(' , ', array_map(' intval ', $topic_id_list)) . ' ) ' ;
2003-04-02 23:21:17 +00:00
$result = $db -> sql_query ( $sql );
2003-04-15 17:33:07 +00:00
2003-04-02 23:21:17 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
{
if ( $auth -> acl_get ( 'f_read' , $row [ 'forum_id' ]))
2003-01-29 17:44:22 +00:00
{
2004-12-15 18:30:50 +00:00
// DEBUG!! - global topic
2003-04-02 23:21:17 +00:00
$config [ 'default_forum_id' ] = 2 ;
$is_auth [ $row [ 'topic_id' ]] = ( $row [ 'forum_id' ]) ? $row [ 'forum_id' ] : $config [ 'default_forum_id' ];
}
2003-01-29 17:44:22 +00:00
2003-04-15 17:33:07 +00:00
if ( $auth -> acl_gets ( 'a_' , 'm_' , $row [ 'forum_id' ]))
2003-04-02 23:21:17 +00:00
{
$is_mod [ $row [ 'topic_id' ]] = $row [ 'forum_id' ];
2003-01-29 17:44:22 +00:00
}
2003-04-02 23:21:17 +00:00
}
2003-01-29 17:44:22 +00:00
2003-04-02 23:21:17 +00:00
foreach ( $log as $key => $row )
{
$log [ $key ][ 'viewtopic' ] = ( isset ( $is_auth [ $row [ 'topic_id' ]])) ? (( defined ( 'IN_ADMIN' )) ? '../' : '' ) . " viewtopic. $phpEx $SID &f= " . $is_auth [ $row [ 'topic_id' ]] . '&t=' . $row [ 'topic_id' ] : '' ;
2004-07-08 22:41:04 +00:00
$log [ $key ][ 'viewlogs' ] = ( isset ( $is_mod [ $row [ 'topic_id' ]])) ? (( defined ( 'IN_ADMIN' )) ? '../' : '' ) . " mcp. $phpEx $SID &mode=topic_view&action=viewlogs&t= " . $row [ 'topic_id' ] : '' ;
2003-01-29 17:44:22 +00:00
}
}
2004-12-15 18:30:50 +00:00
$sql = ' SELECT COUNT ( l . log_id ) AS total_entries
FROM ' . LOG_TABLE . " l
2003-07-06 18:48:33 +00:00
WHERE l . log_type = $log_type
AND l . log_time >= $limit_days
2003-04-15 17:33:07 +00:00
$sql_forum " ;
2003-01-29 17:44:22 +00:00
$result = $db -> sql_query ( $sql );
$row = $db -> sql_fetchrow ( $result );
$db -> sql_freeresult ( $result );
$log_count = $row [ 'total_entries' ];
return ;
}
2005-12-12 21:58:14 +00:00
/**
* Lists warned users
*/
2005-12-14 20:54:54 +00:00
function view_warned_users ( & $users , & $user_count , $limit = 0 , $offset = 0 , $limit_days = 0 , $sort_by = 'user_warnings DESC' )
2005-12-12 21:58:14 +00:00
{
global $db ;
2005-12-14 20:54:54 +00:00
$sql = ' SELECT user_id , username , user_warnings , user_last_warning
FROM ' . USERS_TABLE . '
2005-12-12 21:58:14 +00:00
WHERE user_warnings > 0
2005-12-14 20:54:54 +00:00
' . (($limit_days) ? "AND user_last_warning >= $limit_days" : ' ' ) . "
ORDER BY $sort_by " ;
2005-12-12 21:58:14 +00:00
$result = $db -> sql_query_limit ( $sql , $limit , $offset );
$users = $db -> sql_fetchrowset ( $result );
$db -> sql_freeresult ( $result );
$sql = ' SELECT count ( user_id ) AS user_count
FROM ' . USERS_TABLE . '
2005-12-14 20:54:54 +00:00
WHERE user_warnings > 0
' . (($limit_days) ? "AND user_last_warning >= $limit_days" : ' ' );
2005-12-12 21:58:14 +00:00
$result = $db -> sql_query ( $sql );
$row = $db -> sql_fetchrow ( $result );
$db -> sql_freeresult ( $result );
2005-12-14 20:54:54 +00:00
$user_count = $row [ 'user_count' ];
2005-12-12 21:58:14 +00:00
return ;
}
2003-04-24 18:24:53 +00:00
if ( class_exists ( 'auth' ))
2003-03-20 00:30:47 +00:00
{
2005-04-09 12:26:45 +00:00
/**
* @ package phpBB3
* Extension of auth class for changing permissions
*/
2003-04-15 17:33:07 +00:00
class auth_admin extends auth
2003-03-20 00:30:47 +00:00
{
2003-04-15 17:33:07 +00:00
// Set a user or group ACL record
function acl_set ( $ug_type , & $forum_id , & $ug_id , & $auth )
{
global $db ;
2003-03-20 00:30:47 +00:00
2003-04-15 17:33:07 +00:00
// One or more forums
if ( ! is_array ( $forum_id ))
{
$forum_id = array ( $forum_id );
}
2003-03-20 00:30:47 +00:00
2003-04-15 17:33:07 +00:00
// Set any flags as required
foreach ( $auth as $auth_option => $setting )
2003-03-20 00:30:47 +00:00
{
2003-04-15 17:33:07 +00:00
$flag = substr ( $auth_option , 0 , strpos ( $auth_option , '_' ) + 1 );
if ( empty ( $auth [ $flag ]))
2003-03-20 00:30:47 +00:00
{
2003-04-15 17:33:07 +00:00
$auth [ $flag ] = $setting ;
2003-03-20 00:30:47 +00:00
}
}
2003-04-15 17:33:07 +00:00
2003-07-04 17:17:37 +00:00
$sql = ' SELECT auth_option_id , auth_option
FROM ' . ACL_OPTIONS_TABLE ;
2003-04-15 17:33:07 +00:00
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
{
$option_ids [ $row [ 'auth_option' ]] = $row [ 'auth_option_id' ];
}
$db -> sql_freeresult ( $result );
$sql_forum = 'AND a.forum_id IN (' . implode ( ', ' , array_map ( 'intval' , $forum_id )) . ')' ;
2003-07-04 17:17:37 +00:00
$sql = ( $ug_type == 'user' ) ? 'SELECT o.auth_option_id, o.auth_option, a.forum_id, a.auth_setting FROM ' . ACL_USERS_TABLE . ' a, ' . ACL_OPTIONS_TABLE . " o WHERE a.auth_option_id = o.auth_option_id $sql_forum AND a.user_id = $ug_id " : 'SELECT o.auth_option_id, o.auth_option, a.forum_id, a.auth_setting FROM ' . ACL_GROUPS_TABLE . ' a, ' . ACL_OPTIONS_TABLE . " o WHERE a.auth_option_id = o.auth_option_id $sql_forum AND a.group_id = $ug_id " ;
2003-04-15 17:33:07 +00:00
$result = $db -> sql_query ( $sql );
$cur_auth = array ();
while ( $row = $db -> sql_fetchrow ( $result ))
{
$cur_auth [ $row [ 'forum_id' ]][ $row [ 'auth_option_id' ]] = $row [ 'auth_setting' ];
}
$db -> sql_freeresult ( $result );
$table = ( $ug_type == 'user' ) ? ACL_USERS_TABLE : ACL_GROUPS_TABLE ;
$id_field = $ug_type . '_id' ;
2003-04-17 21:43:39 +00:00
$sql_ary = array ();
2003-04-15 17:33:07 +00:00
foreach ( $forum_id as $forum )
{
foreach ( $auth as $auth_option => $setting )
{
$auth_option_id = $option_ids [ $auth_option ];
2003-04-17 21:43:39 +00:00
switch ( $setting )
2003-04-15 17:33:07 +00:00
{
2003-04-17 21:43:39 +00:00
case ACL_UNSET :
2003-04-17 22:59:51 +00:00
if ( isset ( $cur_auth [ $forum ][ $auth_option_id ]))
{
$sql_ary [ 'delete' ][] = " DELETE FROM $table
WHERE forum_id = $forum
AND auth_option_id = $auth_option_id
AND $id_field = $ug_id " ;
}
2003-04-17 21:43:39 +00:00
break ;
default :
2003-04-17 22:59:51 +00:00
if ( ! isset ( $cur_auth [ $forum ][ $auth_option_id ]))
2003-04-17 21:43:39 +00:00
{
2003-04-17 22:59:51 +00:00
$sql_ary [ 'insert' ][] = " $ug_id , $forum , $auth_option_id , $setting " ;
}
else if ( $cur_auth [ $forum ][ $auth_option_id ] != $setting )
{
$sql_ary [ 'update' ][] = " UPDATE " . $table . "
2003-04-17 21:43:39 +00:00
SET auth_setting = $setting
WHERE $id_field = $ug_id
AND forum_id = $forum
AND auth_option_id = $auth_option_id " ;
}
2003-04-15 17:33:07 +00:00
}
}
}
2003-04-17 21:43:39 +00:00
unset ( $cur_auth );
2003-04-15 17:33:07 +00:00
2003-04-17 22:59:51 +00:00
$sql = '' ;
foreach ( $sql_ary as $sql_type => $sql_subary )
2003-04-15 17:33:07 +00:00
{
2003-04-17 22:59:51 +00:00
switch ( $sql_type )
{
case 'insert' :
switch ( SQL_LAYER )
{
case 'mysql' :
2003-07-04 17:17:37 +00:00
$sql = 'VALUES ' . implode ( ', ' , preg_replace ( '#^(.*?)$#' , '(\1)' , $sql_subary ));
2003-04-17 22:59:51 +00:00
break ;
2005-01-09 20:01:20 +00:00
case 'mysql4' :
2005-04-30 14:24:13 +00:00
case 'mysqli' :
2003-04-17 22:59:51 +00:00
case 'mssql' :
2005-10-09 17:59:27 +00:00
case 'mssql_odbc' :
2003-07-04 17:17:37 +00:00
case 'sqlite' :
2003-04-17 22:59:51 +00:00
$sql = implode ( ' UNION ALL ' , preg_replace ( '#^(.*?)$#' , 'SELECT \1' , $sql_subary ));
break ;
default :
foreach ( $sql_subary as $sql )
{
$sql = " INSERT INTO $table ( $id_field , forum_id, auth_option_id, auth_setting) VALUES ( $sql ) " ;
$db -> sql_query ( $sql );
$sql = '' ;
}
}
if ( $sql != '' )
{
2003-07-04 17:17:37 +00:00
$sql = " INSERT INTO $table ( $id_field , forum_id, auth_option_id, auth_setting) $sql " ;
2003-04-17 22:59:51 +00:00
$db -> sql_query ( $sql );
}
break ;
case 'update' :
case 'delete' :
foreach ( $sql_subary as $sql )
{
$result = $db -> sql_query ( $sql );
$sql = '' ;
}
break ;
}
unset ( $sql_ary [ $sql_type ]);
2003-04-15 17:33:07 +00:00
}
unset ( $sql_ary );
$this -> acl_clear_prefetch ();
2003-03-20 00:30:47 +00:00
}
2003-04-15 17:33:07 +00:00
function acl_delete ( $mode , & $forum_id , & $ug_id , $auth_ids = false )
2003-03-20 00:30:47 +00:00
{
2003-04-15 17:33:07 +00:00
global $db ;
// One or more forums
if ( ! is_array ( $forum_id ))
{
$forum_id = array ( $forum_id );
}
$auth_sql = ( $auth_ids ) ? ' AND auth_option_id IN (' . implode ( ', ' , array_map ( 'intval' , $auth_ids )) . ')' : '' ;
$table = ( $mode == 'user' ) ? ACL_USERS_TABLE : ACL_GROUPS_TABLE ;
$id_field = $mode . '_id' ;
foreach ( $forum_id as $forum )
{
$sql = " DELETE FROM $table
WHERE $id_field = $ug_id
AND forum_id = $forum
$auth_sql " ;
$db -> sql_query ( $sql );
}
$this -> acl_clear_prefetch ();
2003-03-20 00:30:47 +00:00
}
2004-08-04 19:10:15 +00:00
// NOTE: this function is not in use atm
2003-04-15 17:33:07 +00:00
// Add a new option to the list ... $options is a hash of form ->
// $options = array(
// 'local' => array('option1', 'option2', ...),
// 'global' => array('optionA', 'optionB', ...)
//);
function acl_add_option ( $options )
2003-03-20 00:30:47 +00:00
{
2004-08-04 19:10:15 +00:00
global $db , $cache ;
2003-04-15 17:33:07 +00:00
2004-08-04 19:10:15 +00:00
if ( ! is_array ( $options ))
2003-03-20 00:30:47 +00:00
{
2003-04-15 17:33:07 +00:00
trigger_error ( 'Incorrect parameter for acl_add_option' , E_USER_ERROR );
2003-03-20 00:30:47 +00:00
}
2003-04-15 17:33:07 +00:00
$cur_options = array ();
2003-03-20 00:30:47 +00:00
2003-04-15 17:33:07 +00:00
$sql = " SELECT auth_option, is_global, is_local
FROM " . ACL_OPTIONS_TABLE . "
ORDER BY auth_option_id " ;
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
{
if ( ! empty ( $row [ 'is_global' ]))
{
$cur_options [ 'global' ][] = $row [ 'auth_option' ];
}
2003-03-20 00:30:47 +00:00
2003-04-15 17:33:07 +00:00
if ( ! empty ( $row [ 'is_local' ]))
{
$cur_options [ 'local' ][] = $row [ 'auth_option' ];
}
}
$db -> sql_freeresult ( $result );
2003-03-20 00:30:47 +00:00
2003-04-15 17:33:07 +00:00
// Here we need to insert new options ... this requires discovering whether
// an options is global, local or both and whether we need to add an option
// type flag (x_)
2004-08-04 19:10:15 +00:00
$new_options = array ( 'local' => array (), 'global' => array ());
2003-04-15 17:33:07 +00:00
foreach ( $options as $type => $option_ary )
{
$option_ary = array_unique ( $option_ary );
foreach ( $option_ary as $option_value )
{
if ( ! in_array ( $option_value , $cur_options [ $type ]))
{
$new_options [ $type ][] = $option_value ;
}
$flag = substr ( $option_value , 0 , strpos ( $option_value , '_' ) + 1 );
if ( ! in_array ( $flag , $cur_options [ $type ]) && ! in_array ( $flag , $new_options [ $type ]))
{
$new_options [ $type ][] = $flag ;
}
}
}
unset ( $options );
$options = array ();
$options [ 'local' ] = array_diff ( $new_options [ 'local' ], $new_options [ 'global' ]);
$options [ 'global' ] = array_diff ( $new_options [ 'global' ], $new_options [ 'local' ]);
$options [ 'local_global' ] = array_intersect ( $new_options [ 'local' ], $new_options [ 'global' ]);
$type_sql = array ( 'local' => '0, 1' , 'global' => '1, 0' , 'local_global' => '1, 1' );
$sql = '' ;
foreach ( $options as $type => $option_ary )
{
foreach ( $option_ary as $option )
{
switch ( SQL_LAYER )
{
case 'mysql' :
$sql .= (( $sql != '' ) ? ', ' : '' ) . " (' $option ', " . $type_sql [ $type ] . " ) " ;
break ;
2005-01-09 20:01:20 +00:00
case 'mysql4' :
2005-04-30 14:24:13 +00:00
case 'mysqli' :
2003-04-15 17:33:07 +00:00
case 'mssql' :
2005-10-09 17:59:27 +00:00
case 'mssql_odbc' :
2005-01-09 20:01:20 +00:00
case 'sqlite' :
2003-04-15 17:33:07 +00:00
$sql .= (( $sql != '' ) ? ' UNION ALL ' : '' ) . " SELECT ' $option ', " . $type_sql [ $type ];
break ;
2005-01-09 20:01:20 +00:00
2003-04-15 17:33:07 +00:00
default :
2003-07-04 17:17:37 +00:00
$sql = 'INSERT INTO ' . ACL_OPTIONS_TABLE . " (auth_option, is_global, is_local)
2003-04-15 17:33:07 +00:00
VALUES ( $option , " . $type_sql[$type] . " ) " ;
2003-07-04 17:17:37 +00:00
$db -> sql_query ( $sql );
2003-04-15 17:33:07 +00:00
$sql = '' ;
}
}
}
if ( $sql != '' )
{
2003-07-04 17:17:37 +00:00
$sql = 'INSERT INTO ' . ACL_OPTIONS_TABLE . " (auth_option, is_global, is_local)
2003-04-15 17:33:07 +00:00
VALUES $sql " ;
2003-07-04 17:17:37 +00:00
$db -> sql_query ( $sql );
2003-04-15 17:33:07 +00:00
}
$cache -> destroy ( 'acl_options' );
}
2003-03-20 00:30:47 +00:00
}
2003-04-15 17:33:07 +00:00
}
2003-03-20 00:30:47 +00:00
2005-04-09 12:26:45 +00:00
/**
* Update Post Informations ( First / Last Post in topic / forum )
* Should be used instead of sync () if only the last post informations are out of sync ... faster
*/
2004-07-19 20:13:18 +00:00
function update_post_information ( $type , $ids )
{
global $db ;
if ( ! is_array ( $ids ))
{
$ids = array ( $ids );
}
$update_sql = $empty_forums = array ();
2003-03-20 00:30:47 +00:00
2004-07-19 20:13:18 +00:00
$sql = 'SELECT ' . $type . ' _id , MAX ( post_id ) as last_post_id
FROM ' . POSTS_TABLE . "
WHERE post_approved = 1
AND { $type } _id IN ( " . implode(', ', $ids ) . " )
GROUP BY { $type } _id " ;
$result = $db -> sql_query ( $sql );
$last_post_ids = array ();
while ( $row = $db -> sql_fetchrow ( $result ))
{
if ( $type == 'forum' )
{
$empty_forums [] = $row [ 'forum_id' ];
}
$last_post_ids [] = $row [ 'last_post_id' ];
}
$db -> sql_freeresult ( $result );
if ( $type == 'forum' )
{
$empty_forums = array_diff ( $ids , $empty_forums );
foreach ( $empty_forums as $void => $forum_id )
{
$update_sql [ $forum_id ][] = 'forum_last_post_id = 0' ;
$update_sql [ $forum_id ][] = 'forum_last_post_time = 0' ;
$update_sql [ $forum_id ][] = 'forum_last_poster_id = 0' ;
$update_sql [ $forum_id ][] = " forum_last_poster_name = '' " ;
}
}
if ( sizeof ( $last_post_ids ))
{
$sql = 'SELECT p.' . $type . ' _id , p . post_id , p . post_time , p . poster_id , p . post_username , u . user_id , u . username
FROM ' . POSTS_TABLE . ' p , ' . USERS_TABLE . ' u
WHERE p . poster_id = u . user_id
AND p . post_id IN ( ' . implode(' , ', $last_post_ids) . ' ) ' ;
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
{
$update_sql [ $row [ " { $type } _id " ]][] = $type . '_last_post_id = ' . ( int ) $row [ 'post_id' ];
$update_sql [ $row [ " { $type } _id " ]][] = $type . '_last_post_time = ' . ( int ) $row [ 'post_time' ];
$update_sql [ $row [ " { $type } _id " ]][] = $type . '_last_poster_id = ' . ( int ) $row [ 'poster_id' ];
$update_sql [ $row [ " { $type } _id " ]][] = " { $type } _last_poster_name = ' " . (( $row [ 'poster_id' ] == ANONYMOUS ) ? $db -> sql_escape ( $row [ 'post_username' ]) : $db -> sql_escape ( $row [ 'username' ])) . " ' " ;
}
$db -> sql_freeresult ( $result );
}
unset ( $empty_forums , $ids , $last_post_ids );
if ( ! sizeof ( $update_sql ))
{
return ;
}
$table = ( $type == 'forum' ) ? FORUMS_TABLE : TOPICS_TABLE ;
foreach ( $update_sql as $update_id => $update_sql_ary )
{
$sql = " UPDATE $table
SET " . implode(', ', $update_sql_ary ) . "
WHERE { $type } _id = $update_id " ;
$db -> sql_query ( $sql );
}
}
2003-04-15 17:33:07 +00:00
2005-11-17 17:32:25 +00:00
/**
* Get database size
* Currently only mysql and mssql are supported
*/
function get_database_size ()
{
global $db , $user , $table_prefix ;
// This code is heavily influenced by a similar routine
// in phpMyAdmin 2.2.0
if ( preg_match ( '#^mysql#' , SQL_LAYER ))
{
$result = $db -> sql_query ( 'SELECT VERSION() AS mysql_version' );
if ( $row = $db -> sql_fetchrow ( $result ))
{
$version = $row [ 'mysql_version' ];
if ( preg_match ( '#^(3\.23|4\.|5\.)#' , $version ))
{
$db_name = ( preg_match ( '#^(3\.23\.[6-9])|(3\.23\.[1-9][1-9])|(4\.)|(5\.)#' , $version )) ? " ` { $db -> dbname } ` " : $db -> dbname ;
$sql = " SHOW TABLE STATUS
FROM " . $db_name ;
$result = $db -> sql_query ( $sql );
$dbsize = 0 ;
while ( $row = $db -> sql_fetchrow ( $result ))
{
if (( isset ( $row [ 'Type' ]) && $row [ 'Type' ] != 'MRG_MyISAM' ) || ( isset ( $row [ 'Engine' ]) && $row [ 'Engine' ] == 'MyISAM' ))
{
if ( $table_prefix != '' )
{
if ( strstr ( $row [ 'Name' ], $table_prefix ))
{
$dbsize += $row [ 'Data_length' ] + $row [ 'Index_length' ];
}
}
else
{
$dbsize += $row [ 'Data_length' ] + $row [ 'Index_length' ];
}
}
}
$db -> sql_freeresult ( $result );
}
else
{
$dbsize = $user -> lang [ 'NOT_AVAILABLE' ];
}
}
else
{
$dbsize = $user -> lang [ 'NOT_AVAILABLE' ];
}
}
else if ( preg_match ( '#^mssql#' , SQL_LAYER ))
{
$sql = ' SELECT (( SUM ( size ) * 8.0 ) * 1024.0 ) as dbsize
FROM sysfiles ' ;
$result = $db -> sql_query ( $sql );
$dbsize = ( $row = $db -> sql_fetchrow ( $result )) ? intval ( $row [ 'dbsize' ]) : $user -> lang [ 'NOT_AVAILABLE' ];
$db -> sql_freeresult ( $result );
}
else
{
$dbsize = $user -> lang [ 'NOT_AVAILABLE' ];
}
if ( is_int ( $dbsize ))
{
$dbsize = ( $dbsize >= 1048576 ) ? sprintf ( '%.2f ' . $user -> lang [ 'MB' ], ( $dbsize / 1048576 )) : (( $dbsize >= 1024 ) ? sprintf ( '%.2f ' . $user -> lang [ 'KB' ], ( $dbsize / 1024 )) : sprintf ( '%.2f ' . $user -> lang [ 'BYTES' ], $dbsize ));
}
return $dbsize ;
}
2005-04-30 14:24:13 +00:00
/**
2005-10-19 18:00:10 +00:00
* Tidy database
2005-04-30 14:24:13 +00:00
* Removes all tracking rows older than 6 months , including mark_posted informations
*/
function tidy_database ()
{
global $db ;
2005-10-19 18:00:10 +00:00
/*
2005-04-30 14:24:13 +00:00
$remove_date = time () - ( 3 * 62 * 24 * 3600 );
$sql = 'DELETE FROM ' . FORUMS_TRACK_TABLE . '
WHERE mark_time < ' . $remove_date ;
$db -> sql_query ( $sql );
$sql = 'DELETE FROM ' . TOPICS_TRACK_TABLE . '
WHERE mark_time < ' . $remove_date ;
$db -> sql_query ( $sql );
2005-10-19 18:00:10 +00:00
*/
2005-04-30 14:24:13 +00:00
set_config ( 'database_last_gc' , time (), true );
}
2002-03-10 00:27:24 +00:00
?>