Optimize PM deletion, just keep them around instead of aggressively deleting

This commit is contained in:
Daniel Winzen
2016-10-30 19:40:10 +01:00
parent 6023afa1e7
commit 5abfb9c9d6

View File

@ -1000,13 +1000,14 @@ function send_admin($arg=''){
echo ' (!)'; echo ' (!)';
}elseif($member[2]==2){ }elseif($member[2]==2){
echo ' (G)'; echo ' (G)';
}elseif($member[2]==3){
}elseif($member[2]==5){ }elseif($member[2]==5){
echo ' (M)'; echo ' (M)';
}elseif($member[2]==6){ }elseif($member[2]==6){
echo ' (SM)'; echo ' (SM)';
}elseif($member[2]==7){ }elseif($member[2]==7){
echo ' (A)'; echo ' (A)';
}elseif($member[2]==8){ }else{
echo ' (SA)'; echo ' (SA)';
} }
echo '</option>'; echo '</option>';
@ -2352,13 +2353,8 @@ function kill_session(){
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'sessions WHERE session=?;'); $stmt=$db->prepare('DELETE FROM ' . PREFIX . 'sessions WHERE session=?;');
$stmt->execute(array($U['session'])); $stmt->execute(array($U['session']));
if($U['status']==1){ if($U['status']==1){
$stmt=$db->prepare('UPDATE ' . PREFIX . "messages SET poster='' WHERE poster=? AND poststatus=9;");
$stmt->execute(array($U['nickname']));
$stmt=$db->prepare('UPDATE ' . PREFIX . "messages SET recipient='' WHERE recipient=? AND poststatus=9;");
$stmt->execute(array($U['nickname']));
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'ignored WHERE ign=? OR ignby=?;'); $stmt=$db->prepare('DELETE FROM ' . PREFIX . 'ignored WHERE ign=? OR ignby=?;');
$stmt->execute(array($U['nickname'], $U['nickname'])); $stmt->execute(array($U['nickname'], $U['nickname']));
$db->exec('DELETE FROM ' . PREFIX . "messages WHERE poster='' AND recipient='' AND poststatus=9;");
$db->exec('DELETE FROM ' . PREFIX . 'files WHERE postid NOT IN (SELECT id FROM ' . PREFIX . 'messages) AND postid NOT IN (SELECT postid FROM ' . PREFIX . 'inbox);'); $db->exec('DELETE FROM ' . PREFIX . 'files WHERE postid NOT IN (SELECT id FROM ' . PREFIX . 'messages) AND postid NOT IN (SELECT postid FROM ' . PREFIX . 'inbox);');
}elseif($U['status']>=3 && !$U['incognito']){ }elseif($U['status']>=3 && !$U['incognito']){
add_system_message(sprintf(get_setting('msgexit'), style_this(htmlspecialchars($U['nickname']), $U['style']))); add_system_message(sprintf(get_setting('msgexit'), style_this(htmlspecialchars($U['nickname']), $U['style'])));
@ -2412,9 +2408,7 @@ function logout_chatter($names){
global $U, $db; global $U, $db;
$check=$db->prepare('SELECT status FROM ' . PREFIX . 'sessions WHERE nickname=? AND status<?;'); $check=$db->prepare('SELECT status FROM ' . PREFIX . 'sessions WHERE nickname=? AND status<?;');
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'sessions WHERE nickname=?;'); $stmt=$db->prepare('DELETE FROM ' . PREFIX . 'sessions WHERE nickname=?;');
$stmt1=$db->prepare('UPDATE ' . PREFIX . "messages SET poster='' WHERE poster=? AND poststatus=9;"); $stmt1=$db->prepare('DELETE FROM ' . PREFIX . 'ignored WHERE ign=? OR ignby=?;');
$stmt2=$db->prepare('UPDATE ' . PREFIX . "messages SET recipient='' WHERE recipient=? AND poststatus=9;");
$stmt3=$db->prepare('DELETE FROM ' . PREFIX . 'ignored WHERE ign=? OR ignby=?;');
if($names[0]==='s &'){ if($names[0]==='s &'){
$tmp=$db->query('SELECT nickname FROM ' . PREFIX . 'sessions WHERE status=1;'); $tmp=$db->query('SELECT nickname FROM ' . PREFIX . 'sessions WHERE status=1;');
$names=[]; $names=[];
@ -2427,13 +2421,10 @@ function logout_chatter($names){
if($temp=$check->fetch(PDO::FETCH_NUM)){ if($temp=$check->fetch(PDO::FETCH_NUM)){
$stmt->execute([$name]); $stmt->execute([$name]);
if($temp[0]==1){ if($temp[0]==1){
$stmt1->execute([$name]); $stmt1->execute([$name, $name]);
$stmt2->execute([$name]);
$stmt3->execute([$name, $name]);
} }
} }
} }
$db->exec('DELETE FROM ' . PREFIX . "messages WHERE poster='' AND recipient='' AND poststatus=9;");
$db->exec('DELETE FROM ' . PREFIX . 'files WHERE postid NOT IN (SELECT id FROM ' . PREFIX . 'messages) AND postid NOT IN (SELECT postid FROM ' . PREFIX . 'inbox);'); $db->exec('DELETE FROM ' . PREFIX . 'files WHERE postid NOT IN (SELECT id FROM ' . PREFIX . 'messages) AND postid NOT IN (SELECT postid FROM ' . PREFIX . 'inbox);');
} }
@ -2492,18 +2483,13 @@ function parse_sessions(){
$result->execute(array($time, $time)); $result->execute(array($time, $time));
if($tmp=$result->fetchAll(PDO::FETCH_ASSOC)){ if($tmp=$result->fetchAll(PDO::FETCH_ASSOC)){
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'sessions WHERE nickname=?;'); $stmt=$db->prepare('DELETE FROM ' . PREFIX . 'sessions WHERE nickname=?;');
$stmt1=$db->prepare('UPDATE ' . PREFIX . "messages SET poster='' WHERE poster=? AND poststatus=9;"); $stmt1=$db->prepare('DELETE FROM ' . PREFIX . 'ignored WHERE ign=? OR ignby=?;');
$stmt2=$db->prepare('UPDATE ' . PREFIX . "messages SET recipient='' WHERE recipient=? AND poststatus=9;");
$stmt3=$db->prepare('DELETE FROM ' . PREFIX . 'ignored WHERE ign=? OR ignby=?;');
foreach($tmp as $temp){ foreach($tmp as $temp){
$stmt->execute(array($temp['nickname'])); $stmt->execute([$temp['nickname']]);
if($temp['status']<=1){ if($temp['status']<=1){
$stmt1->execute(array($temp['nickname'])); $stmt1->execute([$temp['nickname'], $temp['nickname']]);
$stmt2->execute(array($temp['nickname']));
$stmt3->execute(array($temp['nickname'], $temp['nickname']));
} }
} }
$db->exec('DELETE FROM ' . PREFIX . "messages WHERE poster='' AND recipient='' AND poststatus=9;");
$db->exec('DELETE FROM ' . PREFIX . 'files WHERE postid NOT IN (SELECT id FROM ' . PREFIX . 'messages) AND postid NOT IN (SELECT postid FROM ' . PREFIX . 'inbox);'); $db->exec('DELETE FROM ' . PREFIX . 'files WHERE postid NOT IN (SELECT id FROM ' . PREFIX . 'messages) AND postid NOT IN (SELECT postid FROM ' . PREFIX . 'inbox);');
} }
// look for our session // look for our session
@ -2937,7 +2923,7 @@ function validate_input(){
$U['lastpost']=time(); $U['lastpost']=time();
$stmt=$db->prepare('UPDATE ' . PREFIX . 'sessions SET lastpost=?, postid=? WHERE session=?;'); $stmt=$db->prepare('UPDATE ' . PREFIX . 'sessions SET lastpost=?, postid=? WHERE session=?;');
$stmt->execute(array($U['lastpost'], $_REQUEST['postid'], $U['session'])); $stmt->execute(array($U['lastpost'], $_REQUEST['postid'], $U['session']));
$stmt=$db->prepare('SELECT id FROM ' . PREFIX . "messages WHERE poster=? ORDER BY id DESC LIMIT 1"); $stmt=$db->prepare('SELECT id FROM ' . PREFIX . 'messages WHERE poster=? ORDER BY id DESC LIMIT 1;');
$stmt->execute(array($U['nickname'])); $stmt->execute(array($U['nickname']));
$id=$stmt->fetch(PDO::FETCH_NUM); $id=$stmt->fetch(PDO::FETCH_NUM);
if($inbox && $id){ if($inbox && $id){
@ -3141,10 +3127,10 @@ function write_message($message){
$stmt=$db->prepare('INSERT INTO ' . PREFIX . 'messages (postdate, poststatus, poster, recipient, text, delstatus) VALUES (?, ?, ?, ?, ?, ?);'); $stmt=$db->prepare('INSERT INTO ' . PREFIX . 'messages (postdate, poststatus, poster, recipient, text, delstatus) VALUES (?, ?, ?, ?, ?, ?);');
$stmt->execute(array($message['postdate'], $message['poststatus'], $message['poster'], $message['recipient'], $message['text'], $message['delstatus'])); $stmt->execute(array($message['postdate'], $message['poststatus'], $message['poster'], $message['recipient'], $message['text'], $message['delstatus']));
$limit=get_setting('messagelimit'); $limit=get_setting('messagelimit');
$stmt=$db->query('SELECT id FROM ' . PREFIX . "messages WHERE poststatus=1 ORDER BY id DESC LIMIT 1 OFFSET $limit"); $stmt=$db->query('SELECT id FROM ' . PREFIX . "messages WHERE poststatus=1 ORDER BY id DESC LIMIT 1 OFFSET $limit;");
if($id=$stmt->fetch(PDO::FETCH_NUM)){ if($id=$stmt->fetch(PDO::FETCH_NUM)){
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'messages WHERE id<=?;'); $stmt=$db->prepare('DELETE FROM ' . PREFIX . 'messages WHERE id<=?;');
$stmt->execute(array($id[0])); $stmt->execute($id);
$db->exec('DELETE FROM ' . PREFIX . 'files WHERE postid NOT IN (SELECT id FROM ' . PREFIX . 'messages) AND postid NOT IN (SELECT postid FROM ' . PREFIX . 'inbox);'); $db->exec('DELETE FROM ' . PREFIX . 'files WHERE postid NOT IN (SELECT id FROM ' . PREFIX . 'messages) AND postid NOT IN (SELECT postid FROM ' . PREFIX . 'inbox);');
} }
if($message['poststatus']<9 && get_setting('sendmail')){ if($message['poststatus']<9 && get_setting('sendmail')){
@ -3192,7 +3178,7 @@ function del_all_messages($nick, $entry){
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'messages WHERE poster=? AND postdate>=?;'); $stmt=$db->prepare('DELETE FROM ' . PREFIX . 'messages WHERE poster=? AND postdate>=?;');
$stmt->execute([$nick, $entry]); $stmt->execute([$nick, $entry]);
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'inbox WHERE poster=? AND postdate>=?;'); $stmt=$db->prepare('DELETE FROM ' . PREFIX . 'inbox WHERE poster=? AND postdate>=?;');
$stmt->execute([$nick, $entry, $entry]); $stmt->execute([$nick, $entry]);
$db->exec('DELETE FROM ' . PREFIX . 'files WHERE postid NOT IN (SELECT id FROM ' . PREFIX . 'messages) AND postid NOT IN (SELECT postid FROM ' . PREFIX . 'inbox);'); $db->exec('DELETE FROM ' . PREFIX . 'files WHERE postid NOT IN (SELECT id FROM ' . PREFIX . 'messages) AND postid NOT IN (SELECT postid FROM ' . PREFIX . 'inbox);');
} }
@ -3203,15 +3189,15 @@ function del_last_message(){
}else{ }else{
$entry=$U['entry']; $entry=$U['entry'];
} }
$stmt=$db->prepare('SELECT id FROM ' . PREFIX . 'messages WHERE poster=? AND postdate>? ORDER BY id DESC LIMIT 1;'); $stmt=$db->prepare('SELECT id FROM ' . PREFIX . 'messages WHERE poster=? AND postdate>=? ORDER BY id DESC LIMIT 1;');
$stmt->execute(array($U['nickname'], $entry)); $stmt->execute([$U['nickname'], $entry]);
if($id=$stmt->fetch(PDO::FETCH_NUM)){ if($id=$stmt->fetch(PDO::FETCH_NUM)){
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'messages WHERE id=?;'); $stmt=$db->prepare('DELETE FROM ' . PREFIX . 'messages WHERE id=?;');
$stmt->execute(array($id[0])); $stmt->execute($id);
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'inbox WHERE postid=?;'); $stmt=$db->prepare('DELETE FROM ' . PREFIX . 'inbox WHERE postid=?;');
$stmt->execute(array($id[0])); $stmt->execute($id);
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'files WHERE postid=?;'); $stmt=$db->prepare('DELETE FROM ' . PREFIX . 'files WHERE postid=?;');
$stmt->execute(array($id[0])); $stmt->execute($id);
} }
} }
@ -3239,6 +3225,11 @@ function print_messages($delstatus=0){
}else{ }else{
$direction='DESC'; $direction='DESC';
} }
if($U['status']>1){
$entry=0;
}else{
$entry=$U['entry'];
}
$time=time(); $time=time();
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'messages WHERE id IN (SELECT * FROM (SELECT id FROM ' . PREFIX . 'messages WHERE postdate<(?-60*(SELECT value FROM ' . PREFIX . "settings WHERE setting='messageexpire'))) AS t);"); $stmt=$db->prepare('DELETE FROM ' . PREFIX . 'messages WHERE id IN (SELECT * FROM (SELECT id FROM ' . PREFIX . 'messages WHERE postdate<(?-60*(SELECT value FROM ' . PREFIX . "settings WHERE setting='messageexpire'))) AS t);");
$stmt->execute([$time]); $stmt->execute([$time]);
@ -3246,8 +3237,8 @@ function print_messages($delstatus=0){
echo '<div id="messages">'; echo '<div id="messages">';
if($delstatus>0){ if($delstatus>0){
$stmt=$db->prepare('SELECT postdate, id, text FROM ' . PREFIX . 'messages WHERE '. $stmt=$db->prepare('SELECT postdate, id, text FROM ' . PREFIX . 'messages WHERE '.
"(poststatus<? AND delstatus<?) OR poster=? OR recipient=? ORDER BY id $direction;"); "(poststatus<? AND delstatus<?) OR ((poster=? OR recipient=?) AND postdate>=?) ORDER BY id $direction;");
$stmt->execute(array($U['status'], $delstatus, $U['nickname'], $U['nickname'])); $stmt->execute([$U['status'], $delstatus, $U['nickname'], $U['nickname'], $entry]);
while($message=$stmt->fetch(PDO::FETCH_ASSOC)){ while($message=$stmt->fetch(PDO::FETCH_ASSOC)){
prepare_message_print($message, $removeEmbed); prepare_message_print($message, $removeEmbed);
echo "<div class=\"msg\"><input type=\"checkbox\" name=\"mid[]\" id=\"$message[id]\" value=\"$message[id]\"><label for=\"$message[id]\">"; echo "<div class=\"msg\"><input type=\"checkbox\" name=\"mid[]\" id=\"$message[id]\" value=\"$message[id]\"><label for=\"$message[id]\">";
@ -3258,9 +3249,9 @@ function print_messages($delstatus=0){
} }
}else{ }else{
$stmt=$db->prepare('SELECT id, postdate, text FROM ' . PREFIX . 'messages WHERE (poststatus<=? OR '. $stmt=$db->prepare('SELECT id, postdate, text FROM ' . PREFIX . 'messages WHERE (poststatus<=? OR '.
'(poststatus=9 AND ( (poster=? AND recipient NOT IN (SELECT ign FROM ' . PREFIX . 'ignored WHERE ignby=?) ) OR recipient=?) )'. '(poststatus=9 AND ( (poster=? AND recipient NOT IN (SELECT ign FROM ' . PREFIX . 'ignored WHERE ignby=?) ) OR recipient=?) AND postdate>=?)'.
') AND poster NOT IN (SELECT ign FROM ' . PREFIX . "ignored WHERE ignby=?) ORDER BY id $direction;"); ') AND poster NOT IN (SELECT ign FROM ' . PREFIX . "ignored WHERE ignby=?) ORDER BY id $direction;");
$stmt->execute(array($U['status'], $U['nickname'], $U['nickname'], $U['nickname'], $U['nickname'])); $stmt->execute([$U['status'], $U['nickname'], $U['nickname'], $U['nickname'], $entry, $U['nickname']]);
while($message=$stmt->fetch(PDO::FETCH_ASSOC)){ while($message=$stmt->fetch(PDO::FETCH_ASSOC)){
prepare_message_print($message, $removeEmbed); prepare_message_print($message, $removeEmbed);
echo '<div class="msg">'; echo '<div class="msg">';