2002-03-10 00:27:24 +00:00
< ? php
2003-08-27 16:31:54 +00:00
// -------------------------------------------------------------
//
// $Id$
//
// FILENAME : functions_admin.php
// STARTED : Sat Feb 13, 2001
// COPYRIGHT : <20> 2001,2003 phpBB Group
// WWW : http://www.phpbb.com/
// LICENCE : GPL vs2.0 [ see /docs/COPYING ]
//
// -------------------------------------------------------------
2002-03-10 00:27:24 +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' );
$rowset = get_forum_list ( $acl , false , $ignore_nonpost , true );
2003-04-15 17:33:07 +00:00
2003-05-04 15:09:16 +00:00
$right = $cat_right = 0 ;
$forum_list = $padding = $holding = '' ;
$padding_store = array ( '0' => '' );
2003-04-02 23:21:17 +00:00
foreach ( $rowset as $row )
2002-03-10 00:27:24 +00:00
{
2003-05-02 15:50:11 +00:00
if (( is_array ( $ignore_id ) && in_array ( $row [ 'forum_id' ], $ignore_id )) ||
$row [ 'forum_id' ] == $ignore_id )
2002-03-10 00:27:24 +00:00
{
2002-11-26 00:50:16 +00:00
continue ;
2002-10-08 21:01:25 +00:00
}
2002-11-26 00:50:16 +00:00
if ( $row [ 'left_id' ] < $right )
{
2003-05-04 15:09:16 +00:00
$padding .= ' ' ;
$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
{
2003-05-04 15:09:16 +00:00
$padding = $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
2003-04-17 17:47:41 +00:00
$selected = ( is_array ( $select_id )) ? (( in_array ( $row [ 'forum_id' ], $select_id )) ? ' selected="selected"' : '' ) : (( $row [ 'forum_id' ] == $select_id ) ? ' selected="selected"' : '' );
2002-11-26 00:50:16 +00:00
if ( $row [ 'left_id' ] > $cat_right )
2002-10-08 21:01:25 +00:00
{
2002-11-26 00:50:16 +00:00
$holding = '' ;
2002-03-10 00:27:24 +00:00
}
2002-10-08 20:06:55 +00:00
2003-05-02 15:50:11 +00:00
if ( $row [ 'right_id' ] - $row [ 'left_id' ] > 1 && $ignore_emptycat )
2002-11-26 00:50:16 +00:00
{
$cat_right = max ( $cat_right , $row [ 'right_id' ]);
2003-05-04 15:09:16 +00:00
$holding .= '<option value="' . $row [ 'forum_id' ] . '"' . $selected . '>' . $padding . $row [ 'forum_name' ] . '</option>' ;
2002-11-26 00:50:16 +00:00
}
else
{
2003-05-04 15:09:16 +00:00
$forum_list .= $holding . '<option value="' . $row [ 'forum_id' ] . '"' . $selected . '>' . $padding . $row [ 'forum_name' ] . '</option>' ;
2002-11-26 00:50:16 +00:00
$holding = '' ;
}
}
if ( ! $right )
{
2003-03-12 23:22:14 +00:00
$forum_list .= '<option value="-1">' . $user -> lang [ 'NO_FORUMS' ] . '</option>' ;
2002-03-10 00:27:24 +00:00
}
2002-11-26 00:50:16 +00:00
return $forum_list ;
2002-03-10 00:27:24 +00:00
}
2003-11-01 16:10:21 +00:00
// Generate size select form
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 . '">' ;
for ( $i = 0 ; $i < count ( $size_types_text ); $i ++ )
{
$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 );
}
2003-04-02 23:21:17 +00:00
// Obtain authed forums list
function get_forum_list ( $acl_list = 'f_list' , $id_only = TRUE , $postable_only = FALSE , $no_cache = FALSE )
{
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 );
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-05-02 15:50:11 +00:00
if ( $postable_only && $row [ 'forum_type' ] == FORUM_CAT )
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 ;
}
2003-05-21 19:06:16 +00:00
function get_forum_branch ( $forum_id , $type = 'all' , $order = 'descending' , $include_forum = TRUE )
{
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 .*
FROM ( ' . FORUMS_TABLE . ' f1
LEFT JOIN ' . FORUMS_TABLE . " f2 ON $condition )
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 ;
}
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
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-03-28 00:41:16 +00:00
// Posts and topics manipulation
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 );
$table_ary = array ( TOPICS_TABLE , POSTS_TABLE , LOG_MOD_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
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 );
2003-03-28 00:41:16 +00:00
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
}
}
function move_posts ( $post_ids , $topic_id , $auto_sync = TRUE )
{
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-05-02 15:50:11 +00:00
$sql = ' SELECT *
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
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 );
if ( $auto_sync )
{
$forum_ids [] = $row [ 'forum_id' ];
sync ( 'reported' , 'topic_id' , $topic_ids );
sync ( 'topic' , 'topic_id' , $topic_ids , TRUE );
sync ( 'forum' , 'forum_id' , $forum_ids , TRUE );
}
}
function delete_topics ( $where_type , $where_ids , $auto_sync = TRUE )
{
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
2003-03-28 00:41:16 +00:00
if ( ! count ( $where_ids ))
{
return array ( 'topics' => 0 , 'posts' => '0' );
}
$return = array (
'posts' => delete_posts ( $where_type , $where_ids , FALSE )
);
$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 ();
$return [ 'topics' ] = count ( $topic_ids );
if ( ! count ( $topic_ids ))
{
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
$table_ary = array ( TOPICS_TRACK_TABLE , POLL_VOTES_TABLE , POLL_OPTIONS_TABLE , TOPICS_WATCH_TABLE , TOPICS_TABLE );
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 )
{
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
}
2003-10-12 09:11:33 +00:00
// Not an option here, deleting one post takes > 200 seconds for me (only this query)
/*
2003-05-02 15:50:11 +00:00
// Optimize/vacuum tables
switch ( SQL_LAYER )
{
case 'mysql' :
case 'mysql4' :
$table_ary = array ( TOPICS_TRACK_TABLE , POLL_VOTES_TABLE , POLL_OPTIONS_TABLE , TOPICS_WATCH_TABLE , TOPICS_TABLE );
$sql = 'OPTIMIZE TABLE ' . implode ( ', ' , $table_ary );
$db -> sql_query ( $sql );
unset ( $table_ary );
break ;
case 'postgresql' :
$db -> sql_query ( 'VACUUM' );
break ;
}
2003-10-12 09:11:33 +00:00
*/
2003-05-02 15:50:11 +00:00
2003-03-28 00:41:16 +00:00
return $return ;
}
function delete_posts ( $where_type , $where_ids , $auto_sync = TRUE )
{
global $db ;
if ( is_array ( $where_ids ))
{
$where_ids = array_unique ( $where_ids );
}
if ( ! count ( $where_ids ))
{
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 );
while ( $row = $db -> sql_fetchrow ( $result ))
{
$post_ids [] = $row [ 'post_id' ];
$topic_ids [] = $row [ 'topic_id' ];
$forum_ids [] = $row [ 'forum_id' ];
}
if ( ! count ( $post_ids ))
{
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
$table_ary = array ( POSTS_TABLE , RATINGS_TABLE , REPORTS_TABLE , SEARCH_MATCH_TABLE );
foreach ( $table_ary as $table )
{
$sql = " DELETE FROM $table
WHERE post_id IN ( $sql_where ) " ;
$db -> sql_query ( $sql );
}
unset ( $table_ary );
2003-09-07 17:16:12 +00:00
delete_attachments ( $post_ids );
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 );
sync ( 'topic' , 'topic_id' , $topic_ids , TRUE );
sync ( 'forum' , 'forum_id' , $forum_ids , TRUE );
}
2003-10-12 09:11:33 +00:00
// Not an option here, deleting one post takes > 200 seconds for me (only this query)
/*
2003-05-02 15:50:11 +00:00
// Optimize/vacuum tables
switch ( SQL_LAYER )
{
case 'mysql' :
case 'mysql4' :
$table_ary = array ( POSTS_TABLE , RATINGS_TABLE , REPORTS_TABLE , SEARCH_MATCH_TABLE );
$sql = 'OPTIMIZE TABLE ' . implode ( ', ' , $table_ary );
$db -> sql_query ( $sql );
unset ( $table_ary );
break ;
case 'postgresql' :
$db -> sql_query ( 'VACUUM' );
break ;
}
2003-10-12 09:11:33 +00:00
*/
2003-05-02 15:50:11 +00:00
2003-03-28 00:41:16 +00:00
return count ( $post_ids );
}
2003-09-07 17:16:12 +00:00
// Delete Attachments
function delete_attachments ( $post_id_array = - 1 , $attach_id_array = - 1 , $page = 'post' , $user_id = - 1 )
{
global $db ;
if ( $post_id_array == - 1 && $attach_id_array == - 1 && $page == - 1 )
{
return ;
}
// Generate Array, if it's not an array
if ( $post_id_array == - 1 && $attach_id_array != - 1 )
{
$post_id_array = array ();
if ( ! is_array ( $attach_id_array ))
{
$attach_id_array = ( strstr ( $attach_id_array , ',' )) ? explode ( ',' , str_replace ( ', ' , ',' , $attach_id_array )) : array (( int ) $attach_id_array );
}
// Get the post_ids to fill the array
$sql = 'SELECT ' . (( $page == 'privmsgs' ) ? 'privmsgs_id' : 'post_id' ) . ' as id
FROM ' . ATTACHMENTS_TABLE . '
WHERE attach_id IN ( ' . implode(' , ', $attach_id_array) . ' )
GROUP BY id ' ;
$result = $db -> sql_query ( $sql );
if ( ! ( $row = $db -> sql_fetchrow ( $result )))
{
return ;
}
do
{
$post_id_array [] = $row [ 'id' ];
}
while ( $row = $db -> sql_fetchrow ( $result ));
$db -> sql_freeresult ( $result );
}
if ( ! is_array ( $post_id_array ))
{
if ( trim ( $post_id_array ) == '' )
{
return ;
}
$post_id_array = ( strstr ( $post_id_array , ',' )) ? explode ( ',' , str_replace ( ', ' , ',' , $attach_id_array )) : array (( int ) $post_id_array );
}
if ( ! count ( $post_id_array ))
{
return ;
}
// First of all, determine the post id and attach_id
if ( $attach_id_array == - 1 )
{
$attach_id_array = array ();
// Get the attach_ids to fill the array
$sql = ' SELECT attach_id
FROM ' . ATTACHMENTS_TABLE . '
WHERE ' . (($page == ' privmsgs ') ? ' privmsgs_id ' : ' post_id ') . ' IN ( ' . implode(' , ', $post_id_array) . ' )
GROUP BY attach_id ' ;
$result = $db -> sql_query ( $sql );
if ( ! ( $row = $db -> sql_fetchrow ( $result )))
{
return ;
}
do
{
$attach_id_array [] = $row [ 'attach_id' ];
}
while ( $row = $db -> sql_fetchrow ( $result ));
$db -> sql_freeresult ( $result );
}
if ( ! is_array ( $attach_id_array ))
{
$attach_id_array = ( strstr ( $post_id_array , ',' )) ? explode ( ',' , str_replace ( ', ' , ',' , $attach_id_array )) : array (( int ) $attach_id_array );
}
if ( ! count ( $attach_id_array ))
{
return ;
}
$sql = 'DELETE FROM ' . ATTACHMENTS_TABLE . '
WHERE attach_id IN ( ' . implode(' , ', $attach_id_array) . ' )
AND post_id IN ( ' . implode(' , ', $post_id_array) . ' ) ' ;
$db -> sql_query ( $sql );
foreach ( $attach_id_array as $attach_id )
{
$sql = ' SELECT attach_id
FROM ' . ATTACHMENTS_TABLE . "
WHERE attach_id = $attach_id " ;
$select_result = $db -> sql_query ( $sql );
if ( ! is_array ( $db -> sql_fetchrow ( $select_result )))
{
$sql = ' SELECT attach_id , physical_filename , thumbnail
FROM ' . ATTACHMENTS_DESC_TABLE . "
WHERE attach_id = $attach_id " ;
$result = $db -> sql_query ( $sql );
// delete attachments
while ( $row = $db -> sql_fetchrow ( $result ))
{
2003-09-15 21:02:10 +00:00
phpbb_unlink ( $row [ 'physical_filename' ], 'file' );
2003-09-07 17:16:12 +00:00
if ( $row [ 'thumbnail' ])
{
2003-09-15 21:02:10 +00:00
phpbb_unlink ( $row [ 'physical_filename' ], 'thumbnail' );
2003-09-07 17:16:12 +00:00
}
$sql = 'DELETE FROM ' . ATTACHMENTS_DESC_TABLE . '
WHERE attach_id = ' . $row[' attach_id ' ];
$db -> sql_query ( $sql );
}
$db -> sql_freeresult ( $result );
}
$db -> sql_freeresult ( $select_result );
}
// Now Sync the Topic/PM
if ( $page == 'privmsgs' )
{
foreach ( $post_id_array as $privmsgs_id )
{
$sql = ' SELECT attach_id
FROM ' . ATTACHMENTS_TABLE . '
WHERE privmsgs_id = ' . $privmsgs_id ;
$select_result = $db -> sql_query ( $sql );
if ( ! is_array ( $db -> sql_fetchrow ( $select_result )))
{
$sql = 'UPDATE ' . PRIVMSGS_TABLE . '
SET privmsgs_attachment = 0
WHERE privmsgs_id = ' . $privmsgs_id ;
$db -> sql_query ( $sql );
}
$db -> sql_freeresult ( $select_result );
}
}
else
{
$sql = ' SELECT topic_id
FROM ' . POSTS_TABLE . '
WHERE post_id IN ( ' . implode(' , ', $post_id_array) . ' )
GROUP BY topic_id ' ;
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
{
$topic_id = $row [ 'topic_id' ];
$sql = ' SELECT post_id
FROM ' . POSTS_TABLE . "
WHERE topic_id = $topic_id
GROUP BY post_id " ;
$result2 = $db -> sql_query ( $sql );
$post_ids = array ();
while ( $post_row = $db -> sql_fetchrow ( $result2 ))
{
$post_ids [] = $post_row [ 'post_id' ];
}
$db -> sql_freeresult ( $result2 );
if ( count ( $post_ids ))
{
$post_id_sql = implode ( ', ' , $post_ids );
$sql = ' SELECT attach_id
FROM ' . ATTACHMENTS_TABLE . "
WHERE post_id IN ( $post_id_sql ) " ;
$select_result = $db -> sql_query_limit ( $sql , 1 );
$set_id = ( ! is_array ( $db -> sql_fetchrow ( $select_result ))) ? 0 : 1 ;
$db -> sql_freeresult ( $select_result );
$sql = 'UPDATE ' . TOPICS_TABLE . "
SET topic_attachment = $set_id
WHERE topic_id = $topic_id " ;
$db -> sql_query ( $sql );
foreach ( $post_ids as $post_id )
{
$sql = ' SELECT attach_id
FROM ' . ATTACHMENTS_TABLE . "
WHERE post_id = $post_id " ;
$select_result = $db -> sql_query_limit ( $sql , 1 );
$set_id = ( ! is_array ( $db -> sql_fetchrow ( $select_result ))) ? 0 : 1 ;
$db -> sql_freeresult ( $select_result );
$sql = 'UPDATE ' . POSTS_TABLE . "
SET post_attachment = $set_id
WHERE post_id = $post_id " ;
$db -> sql_query ( $sql );
}
}
}
$db -> sql_freeresult ( $result );
}
2003-10-19 15:36:45 +00:00
// TODO
// Return number of deleted attachments
2003-09-07 17:16:12 +00:00
}
2003-10-05 20:11:58 +00:00
function delete_topic_shadows ( $max_age , $forum_id = '' , $auto_sync = TRUE )
{
$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' :
$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' ];
}
if ( count ( $topic_ids ))
{
$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' : '' ;
sync ( 'forum' , $where_type , $forum_id , TRUE );
}
}
2003-10-12 09:11:33 +00:00
// Delete File
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
2003-10-19 15:36:45 +00:00
$upload_dir = ( $config [ 'upload_dir' ][ 0 ] == '/' || ( $config [ 'upload_dir' ][ 0 ] != '/' && $config [ 'upload_dir' ][ 1 ] == ':' )) ? $config [ 'upload_dir' ] : $phpbb_root_path . $config [ 'upload_dir' ];
$filename = ( $mode == 'thumbnail' ) ? $upload_dir . '/thumbs/t_' . $filename : $upload_dir . '/' . $filename ;
2003-10-12 09:11:33 +00:00
$deleted = @ unlink ( $filename );
if ( file_exists ( $filename ))
{
$filesys = str_replace ( '/' , '\\' , $filename );
$deleted = @ system ( " del $filesys " );
if ( file_exists ( $filename ))
{
@ chmod ( $filename , 0777 );
if ( ! ( $deleted = @ unlink ( $filename )))
{
$deleted = @ system ( " del $filename " );
}
}
}
return $deleted ;
}
2003-05-02 15:50:11 +00:00
// All-encompasing sync function
2003-03-28 00:41:16 +00:00
//
// Usage:
2003-09-17 20:11:56 +00:00
// 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
2003-10-05 20:11:58 +00:00
// sync('topic', 'range', 'topic_id BETWEEN 1 AND 60'); <= resync a range of topics/forums (only available for 'topic' and 'forum' modes)
2003-03-28 00:41:16 +00:00
function sync ( $mode , $where_type = '' , $where_ids = '' , $resync_parents = FALSE , $sync_extra = FALSE )
{
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 );
}
2003-09-17 20:11:56 +00:00
elseif ( $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 )
{
2003-03-30 20:58:58 +00:00
$where_sql = '' ;
$where_sql_and = 'WHERE' ;
2003-03-28 00:41:16 +00:00
}
2003-09-17 20:11:56 +00:00
elseif ( $where_type == 'range' )
{
$where_sql = 'WHERE (' . $mode { 0 } . " . $where_ids ) " ;
$where_sql_and = $where_sql . ' AND' ;
}
2003-03-28 00:41:16 +00:00
else
{
$where_sql = 'WHERE ' . $mode { 0 } . " . $where_type IN ( " . implode ( ', ' , $where_ids ) . ')' ;
2003-05-02 15:50:11 +00:00
$where_sql_and = $where_sql . ' AND' ;
2003-03-28 00:41:16 +00:00
}
}
2003-04-23 21:57:53 +00:00
else
{
$where_sql = " WHERE t. $where_type IN ( " . implode ( ', ' , $where_ids ) . ')' ;
2003-05-02 15:50:11 +00:00
$where_sql_and = $where_sql . ' 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' :
$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 " ;
$result = $db -> sql_query ( $result );
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 );
}
$db -> sql_freeresult ( $result );
}
break ;
2003-04-23 21:57:53 +00:00
case 'topic_approved' :
2003-03-28 00:41:16 +00:00
$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 " ;
2002-07-14 14:34:34 +00:00
$result = $db -> sql_query ( $sql );
2002-03-10 00:27:24 +00:00
2003-03-30 20:58:58 +00:00
$topic_ids = $approved_unapproved_ids = array ();
2003-03-28 00:41:16 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
2002-03-10 00:27:24 +00:00
{
2003-03-30 20:58:58 +00:00
$approved_unapproved_ids [] = $row [ 'topic_id' ];
2002-03-10 00:27:24 +00:00
}
2003-03-30 20:58:58 +00:00
$db -> sql_freeresult ();
2002-03-10 00:27:24 +00:00
2003-03-30 20:58:58 +00:00
if ( ! count ( $approved_unapproved_ids ))
2003-03-28 00:41:16 +00:00
{
2003-03-30 20:58:58 +00:00
return ;
2003-03-28 00:41:16 +00:00
}
2003-03-30 20:58:58 +00:00
$sql = 'UPDATE ' . TOPICS_TABLE . '
SET topic_approved = 1 - topic_approved
WHERE topic_id IN ( ' . implode(' , ', $approved_unapproved_ids) . ' ) ' ;
$db -> sql_query ( $sql );
2003-05-02 15:50:11 +00:00
break ;
2003-03-28 00:41:16 +00:00
2003-04-23 21:57:53 +00:00
case 'post_attachment' :
$post_ids = array ();
2003-05-02 15:50:11 +00:00
switch ( SQL_LAYER )
2003-04-23 21:57:53 +00:00
{
2003-05-02 15:50:11 +00:00
case 'oracle' :
//TODO
break ;
2003-04-23 21:57:53 +00:00
default :
2003-06-19 22:06:53 +00:00
$sql = ' SELECT t . post_id , t . post_attachment , COUNT ( a . attach_id ) AS attachments
2003-04-23 21:57:53 +00:00
FROM ' . POSTS_TABLE . ' t
LEFT JOIN ' . ATTACHMENTS_TABLE . " a ON t.post_id = a.post_id
$where_sql
GROUP BY t . post_id " ;
2003-05-02 15:50:11 +00:00
}
$result = $db -> sql_query ( $sql );
2003-04-23 21:57:53 +00:00
2003-05-02 15:50:11 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
{
if (( $row [ 'post_attachment' ] && ! $row [ 'attachments' ]) || ( $row [ 'attachments' ] && ! $row [ 'post_attachment' ]))
{
$post_ids [] = $row [ 'post_id' ];
}
2003-04-23 21:57:53 +00:00
}
2003-05-02 15:50:11 +00:00
$db -> sql_freeresult ( $result );
2003-04-23 21:57:53 +00:00
if ( ! count ( $post_ids ))
{
return ;
}
$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 ;
2003-04-23 21:57:53 +00:00
case 'topic_attachment' :
2003-05-02 15:50:11 +00:00
switch ( SQL_LAYER )
2003-04-23 21:57:53 +00:00
{
2003-05-02 15:50:11 +00:00
case 'oracle' :
//TODO
break ;
2003-04-23 21:57:53 +00:00
default :
2003-06-19 22:06:53 +00:00
$sql = ' SELECT t . topic_id , t . topic_attachment , a . attach_id
2003-04-23 21:57:53 +00:00
FROM ' . TOPICS_TABLE . ' t , ' . POSTS_TABLE . ' p
LEFT JOIN ' . ATTACHMENTS_TABLE . " a ON p.post_id = a.post_id
$where_sql_and t . topic_id = p . topic_id
2003-06-19 22:06:53 +00:00
AND (( t . topic_attachment = 1 AND a . attach_id IS NULL )
OR ( t . topic_attachment = 0 AND a . attach_id > 0 ))
GROUP BY p . topic_id " ;
2003-05-02 15:50:11 +00:00
}
$result = $db -> sql_query ( $sql );
2003-04-23 21:57:53 +00:00
2003-05-02 15:50:11 +00:00
$topic_ids = array ();
while ( $row = $db -> sql_fetchrow ( $result ))
{
$topic_ids [] = $row [ 'topic_id' ];
2003-04-23 21:57:53 +00:00
}
2003-05-02 15:50:11 +00:00
$db -> sql_freeresult ( $result );
2003-04-23 21:57:53 +00:00
2003-06-19 22:06:53 +00:00
if ( ! count ( $topic_ids ))
2003-04-23 21:57:53 +00:00
{
return ;
}
$sql = 'UPDATE ' . TOPICS_TABLE . '
SET topic_attachment = 1 - topic_attachment
WHERE topic_id IN ( ' . implode(' , ', $topic_ids) . ' ) ' ;
$db -> sql_query ( $sql );
2003-05-02 15:50:11 +00:00
break ;
2003-04-23 21:57:53 +00:00
2003-03-28 00:41:16 +00:00
case 'reported' :
2003-03-30 20:58:58 +00:00
$topic_data = $topic_ids = $post_ids = array ();
if ( $sync_extra )
{
2003-05-02 15:50:11 +00:00
switch ( SQL_LAYER )
2003-03-30 20:58:58 +00:00
{
2003-05-02 15:50:11 +00:00
case 'oracle' :
//TODO
break ;
default :
$sql = ' SELECT p . post_id
FROM ' . POSTS_TABLE . ' t
LEFT JOIN ' . REPORTS_TABLE . " r ON r.post_id = t.post_id
$where_sql
AND (( t . post_reported = 1 AND r . post_id IS NULL )
OR ( t . post_reported = 0 AND r . post_id > 0 ))
GROUP p . post_id " ;
2003-03-30 20:58:58 +00:00
}
2003-05-02 15:50:11 +00:00
$result = $db -> sql_query ( $sql );
2003-03-30 20:58:58 +00:00
2003-05-02 15:50:11 +00:00
if ( $row = $db -> sql_fetchrow ( $result ))
2003-03-30 20:58:58 +00:00
{
2003-05-02 15:50:11 +00:00
do
{
$post_ids [] = $row [ 'post_id' ];
}
while ( $row = $db -> sql_fetchrow ( $result ));
2003-03-30 20:58:58 +00:00
$sql = 'UPDATE ' . POSTS_TABLE . '
SET post_reported = 1 - post_reported
WHERE post_id IN ( ' . implode(' , ', $post_ids) . ' ) ' ;
$db -> sql_query ( $sql );
unset ( $post_ids );
}
2003-05-02 15:50:11 +00:00
$db -> sql_freeresult ();
2003-03-30 20:58:58 +00:00
}
2003-05-02 15:50:11 +00:00
switch ( SQL_LAYER )
{
case 'oracle' :
//TODO
break ;
default :
$sql = ' SELECT t . topic_id , t . topic_reported , p . post_reported
FROM ' . TOPICS_TABLE . ' t
LEFT JOIN ' . POSTS_TABLE . " p ON p.topic_id = t.topic_id
$where_sql
GROUP BY p . topic_id , p . post_reported " ;
}
2002-07-14 14:34:34 +00:00
$result = $db -> sql_query ( $sql );
2002-03-10 00:27:24 +00:00
2003-05-02 15:50:11 +00:00
if ( $row = $db -> sql_fetchrow ( $result ))
2002-03-10 00:27:24 +00:00
{
2003-05-02 15:50:11 +00:00
do
2003-03-28 00:41:16 +00:00
{
2003-05-02 15:50:11 +00:00
if ( ! isset ( $topic_data [ $row [ 'topic_id' ]]))
{
$topic_data [ $row [ 'topic_id' ]] = array (
'topic_reported' => $row [ 'topic_reported' ],
'post_reported' => $row [ 'post_reported' ]
);
}
else
{
$topic_data [ $row [ 'topic_id' ]][ 'post_reported' ] |= $row [ 'post_reported' ];
}
2003-03-28 00:41:16 +00:00
}
2003-05-02 15:50:11 +00:00
while ( $row = $db -> sql_fetchrow ( $result ));
2002-03-10 00:27:24 +00:00
2003-05-02 15:50:11 +00:00
foreach ( $topic_data as $topic_id => $row )
2003-03-30 20:58:58 +00:00
{
2003-05-02 15:50:11 +00:00
if ( $row [ 'post_reported' ] != $row [ 'topic_reported' ])
{
$topic_ids [] = $topic_id ;
}
2003-03-30 20:58:58 +00:00
}
2003-06-19 15:29:53 +00:00
if ( count ( $topic_ids ))
{
$sql = 'UPDATE ' . TOPICS_TABLE . '
SET topic_reported = 1 - topic_reported
WHERE topic_id IN ( ' . implode(' , ', $topic_ids) . ' ) ' ;
$db -> sql_query ( $sql );
}
2002-03-10 00:27:24 +00:00
}
2003-05-02 15:50:11 +00:00
$db -> sql_freeresult ( $result );
2003-03-28 00:41:16 +00:00
return ;
2003-05-02 15:50:11 +00:00
break ;
2002-03-10 00:27:24 +00:00
2003-03-28 00:41:16 +00:00
case 'forum' :
if ( $resync_parents )
{
$sql = ' SELECT f2 . forum_id
FROM ' . FORUMS_TABLE . ' f , ' . FORUMS_TABLE . " f2
$where_sql_and f . left_id BETWEEN f2 . left_id AND f2 . right_id " ;
$result = $db -> sql_query ( $sql );
2003-05-02 15:50:11 +00:00
if ( $row = $db -> sql_fetchrow ( $result ))
2003-03-28 00:41:16 +00:00
{
2003-05-02 15:50:11 +00:00
$forum_ids = array ();
do
{
2003-10-05 20:11:58 +00:00
$forum_ids [] = intval ( $row [ 'forum_id' ]);
2003-05-02 15:50:11 +00:00
}
while ( $row = $db -> sql_fetchrow ( $result ));
2003-09-17 20:11:56 +00:00
$db -> sql_freeresult ( $result );
2003-05-02 15:50:11 +00:00
2003-03-28 00:41:16 +00:00
sync ( 'forum' , 'forum_id' , $forum_ids , FALSE );
2003-05-02 15:50:11 +00:00
unset ( $forum_ids );
2003-03-28 00:41:16 +00:00
}
return ;
}
2003-10-05 20:11:58 +00:00
// 1<> Get the list of all forums
$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
2003-03-28 00:41:16 +00:00
// 2<> Get topic counts for each forum
$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
}
2003-10-05 20:11:58 +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
2003-10-05 20:11:58 +00:00
// 4<> Retrieve last_post infos
2003-03-28 00:41:16 +00:00
if ( count ( $post_ids ))
{
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
2003-10-05 20:11:58 +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
2003-10-05 20:11:58 +00:00
if ( count ( $sql ))
{
$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' ]);
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
$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
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
if ( count ( $delete_posts ))
2003-03-28 00:41:16 +00:00
{
2003-10-05 20:11:58 +00:00
delete_posts ( 'topic_id' , array_keys ( $delete_posts ), FALSE );
unset ( $delete_posts );
2003-03-28 00:41:16 +00:00
}
2003-10-05 20:11:58 +00:00
if ( ! count ( $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
delete_topics ( $where_type , $where_ids , TRUE );
return ;
2003-03-28 00:41:16 +00:00
}
2003-10-05 20:11:58 +00:00
if ( count ( $delete_topics ))
2003-03-28 00:41:16 +00:00
{
2003-10-05 20:11:58 +00:00
delete_topics ( 'topic_id' , array_keys ( $delete_topics ), FALSE );
unset ( $delete_topics );
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
if ( count ( $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
2003-03-30 20:58:58 +00:00
// These are field 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
// if they are not, use sync('reported') instead
$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
// if they are not, use sync('post_attachment') instead
$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
2003-10-05 20:11:58 +00:00
if ( count ( $sql ))
{
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
if ( $resync_parents && count ( $resync_forums ))
{
2003-10-05 20:11:58 +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
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 ;
}
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 " ;
}
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
2003-03-28 00:41:16 +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 ;
}
// remove_comments will strip the sql comment lines out of an uploaded sql file
// specifically for mssql and postgres type files in the install....
function remove_comments ( & $output )
{
$lines = explode ( " \n " , $output );
$output = '' ;
// try to keep mem. use down
$linecount = count ( $lines );
$in_comment = false ;
for ( $i = 0 ; $i < $linecount ; $i ++ )
{
2003-05-02 15:50:11 +00:00
if ( preg_match ( '#^\/\*#' , preg_quote ( $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 " ;
}
2003-05-02 15:50:11 +00:00
if ( preg_match ( '#\*\/$#' , preg_quote ( $lines [ $i ])))
2002-07-14 14:34:34 +00:00
{
$in_comment = false ;
}
}
unset ( $lines );
return $output ;
}
// remove_remarks will strip the sql comment lines out of an uploaded sql file
function remove_remarks ( $sql )
{
2003-09-17 20:11:56 +00:00
// NOTE: isn't this function actually doing
2003-10-05 20:11:58 +00:00
// return preg_replace('/\n{2,}/', "\n", preg_replace('/^#.*/', "\n", $sql));
2003-09-17 20:11:56 +00:00
// ?
2002-07-14 14:34:34 +00:00
$lines = explode ( " \n " , $sql );
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +00:00
// try to keep mem. use down
$sql = '' ;
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +00:00
$linecount = count ( $lines );
$output = '' ;
for ( $i = 0 ; $i < $linecount ; $i ++ )
{
2003-01-08 18:27:16 +00:00
if ( $i != $linecount - 1 || strlen ( $lines [ $i ]) > 0 )
2002-07-14 14:34:34 +00:00
{
2003-02-24 23:51:26 +00:00
$output .= ( $lines [ $i ]{ 0 } != '#' ) ? $lines [ $i ] . " \n " : " \n " ;
2002-07-14 14:34:34 +00:00
// Trading a bit of speed for lower mem. use here.
$lines [ $i ] = '' ;
}
}
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +00:00
return $output ;
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +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.
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
2002-07-14 14:34:34 +00:00
// this is faster than calling count($oktens) every time thru the loop.
$token_count = count ( $tokens );
for ( $i = 0 ; $i < $token_count ; $i ++ )
{
// Don't wanna add an empty string as the last thing in the array.
2003-01-08 18:27:16 +00:00
if ( $i != $token_count - 1 || strlen ( $tokens [ $i ] > 0 ))
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 ;
}
2003-05-02 15:50:11 +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' :
case 'mysql4' :
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 ;
case 'mssql' :
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
}
}
}
2003-08-27 16:31:54 +00:00
$cache -> destroy ( MODERATOR_TABLE );
2002-11-18 21:04:45 +00:00
}
2003-01-29 17:44:22 +00:00
// Logging functions
function add_log ()
{
global $db , $user ;
$args = func_get_args ();
$mode = array_shift ( $args );
$forum_id = ( $mode == 'mod' ) ? intval ( array_shift ( $args )) : '' ;
2003-02-24 23:51:26 +00:00
$topic_id = ( $mode == 'mod' ) ? intval ( array_shift ( $args )) : '' ;
2003-01-29 17:44:22 +00:00
$action = array_shift ( $args );
$data = ( ! sizeof ( $args )) ? '' : addslashes ( serialize ( $args ));
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 ;
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 ;
}
2003-04-02 23:21:17 +00:00
function view_log ( $mode , & $log , & $log_count , $limit = 0 , $offset = 0 , $forum_id = 0 , $topic_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 ;
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' ];
$log [ $i ][ 'action' ] = ( ! empty ( $user -> lang [ $row [ 'log_operation' ]])) ? $user -> lang [ $row [ 'log_operation' ]] : ucfirst ( str_replace ( '_' , ' ' , $row [ 'log_operation' ]));
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' ]));
2003-07-06 18:48:33 +00:00
if ( ! empty ( $user -> lang [ $row [ 'log_operation' ]]))
{
foreach ( $log_data_ary as $log_data )
{
$log [ $i ][ 'action' ] = preg_replace ( '#%s#' , $log_data , $log [ $i ][ 'action' ], 1 );
}
}
else
2003-04-02 23:21:17 +00:00
{
2003-07-06 18:48:33 +00:00
$log [ $i ][ 'action' ] = 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
2003-04-02 23:21:17 +00:00
if ( count ( $topic_id_list ))
{
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
{
2003-04-02 23:21:17 +00:00
// DEBUG!!
$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' ] : '' ;
$log [ $key ][ 'viewlogs' ] = ( isset ( $is_mod [ $row [ 'topic_id' ]])) ? (( defined ( 'IN_ADMIN' )) ? '../' : '' ) . " mcp. $phpEx $SID &mode=viewlogs&t= " . $row [ 'topic_id' ] : '' ;
2003-01-29 17:44:22 +00:00
}
}
$sql = " SELECT COUNT(*) AS total_entries
2003-07-06 18:48:33 +00:00
FROM " . LOG_TABLE . " l
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 ;
}
2003-04-15 17:33:07 +00:00
// Extension of auth class for changing permissions
2003-04-24 18:24:53 +00:00
if ( class_exists ( 'auth' ))
2003-03-20 00:30:47 +00:00
{
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' :
case 'mysql4' :
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 ;
case 'mssql' :
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
}
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
{
2003-04-15 17:33:07 +00:00
global $db ;
if ( ! is_array ( $new_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
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
// 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_)
$new_options = array ();
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' :
case 'mysql4' :
$sql .= (( $sql != '' ) ? ', ' : '' ) . " (' $option ', " . $type_sql [ $type ] . " ) " ;
break ;
case 'mssql' :
$sql .= (( $sql != '' ) ? ' UNION ALL ' : '' ) . " SELECT ' $option ', " . $type_sql [ $type ];
break ;
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
2003-04-15 17:33:07 +00:00
2002-03-10 00:27:24 +00:00
?>