<?php

/**
* OptimiTable.php
*
* @version 1.2
* @copyright 2009 by Winjet Pour XNova
*/

define('INSIDE'  , true);
define('INSTALL' , false);
define('IN_ADMIN', true);

$xnova_root_path = './../';
include($xnova_root_path . 'extension.inc');
include($xnova_root_path . 'common.' . $phpEx);

    if ($user['authlevel'] >= "3") {
        
        includeLang('admin');        
        $parse     = $lang;
        
        // Nombre de jours max avant suppression d'un message non lu
        define('MAX_DAY'      , 7);
        // Activer ou non la suppression automatique des messages après un certain temps
        define('AUTH_DELETE_AFTER_MAX_DAY'      , 1);
        
        $Rapport = "Rapport<br><br>";
        
/******************************************************
* Suppression des rapports de combats qui ont été lus *    
******************************************************/
    
        // On récupère les rapports de combat qui ont été lu
        if ( AUTH_DELETE_AFTER_MAX_DAY )
            $RW = doquery("SELECT message_text, message_time FROM {{table}} WHERE `message_type` = '3' AND (`AccLecture` = '1' OR `message_time` <".(time() - MAX_DAY * 24 * 60 * 60).");", 'messages');
        else
            $RW = doquery("SELECT message_text, message_time FROM {{table}} WHERE `message_type` = '3' AND `AccLecture` = '1';", 'messages');
            
        $Str = "";
        $nb = 0;
        
        // Boucle sur les rapports de combats
        while ($RapportRW = mysql_fetch_array($RW))
        {        
            // $IndexRapport contient l'id du rapport
            // Exemple : f9fcb1659f7f14be44567f1c8cf49578
            $IndexRapport = substr( $RapportRW['message_text'] , 37, 32);
        
            $Str .= "`rid` = '";
            $Str .= $IndexRapport;
            $Str .= "' OR ";
            
            $nb++;
        }
        
        // Vrai si le serveur MySQL nous a retourné au moins 1 enregistrement
        if (strlen($Str) > 0)
        {
            // On supprime la dernière virgule
            $Str = substr($Str, 0, strlen($Str) - 4);
            $Str .= ';';
            
            // Debut de la requête
            $QueryDeleteRapport = "DELETE FROM {{table}} WHERE " . $Str;
            
            // Envoi de la requête, tous les rapports de combat lus
            // sont supprimés
            //
            //
            doquery($QueryDeleteRapport, 'rw');
                
                $Rapport .= "Nombres de rapports de combats supprim&eacute;s : ";
                $Rapport .= $nb."<br>";
        }
        else
        {
            $Rapport .= "Nombres de rapports de combats supprim&eacute;s : 0 <br>";
        }
    
/*****************************************************
*      Suppression des messages qui ont été lus      *    
*****************************************************/
    
        // Suppression de tous les messages qui ont été lus et les rapports de constructions
        // Pour les rapports de constructions, sur mon Xnova, ils les lisent pas et ils les collectionnent
        // plus de 500 messages pour certains membres ^^

        if ( AUTH_DELETE_AFTER_MAX_DAY )
            $nb = doquery("SELECT COUNT(*) FROM {{table}} WHERE `AccLecture` = '1' OR `message_type` = '99' OR `message_time` <".(time() - 10080).";", 'messages');
        else
            $nb = doquery("SELECT COUNT(*) FROM {{table}} WHERE `AccLecture` = '1' OR `message_type` = '99';", 'messages');
        
        $nbre=mysql_fetch_row($nb);
        $Rapport .= "Nombres de messages qui ont &eacute;t&eacute; supprim&eacute;es : " . $nbre[0] . '<br>';
        
		// On envoie la requête seulement si on a quelque chose a effacer
		if ( $nbre[0] != 0)
		{
			if ( AUTH_DELETE_AFTER_MAX_DAY )
				doquery("DELETE FROM {{table}} WHERE `AccLecture` = '1' OR `message_type` = '99' OR `message_time` <".(time() - 10080).";", 'messages');
			else
				doquery("DELETE FROM {{table}} WHERE `AccLecture` = '1' OR `message_type` = '99';", 'messages');
		}
        
/*************************************************
* Suppression des planètes qui ont été détruites *
*************************************************/
        
        // Liste des planètes sans propriétaire ( = planètes détruites )        
        $PlanetsWithoutOwners = doquery("SELECT galaxy, system, planet FROM {{table}} WHERE `id_owner` = '0';", 'planets');
        
        $Str = "";
        $nb = 0;
        // Boucle sur les planètes sans propriétaire
        while ($PlanetDestroyed = mysql_fetch_array($PlanetsWithoutOwners)) {
            $Str .= "`galaxy` = '".$PlanetDestroyed['galaxy']."' AND `system` = '".$PlanetDestroyed['system']."' AND `planet` = '".$PlanetDestroyed['planet']."' OR ";
            $nb++;
        }
        
        // Vrai si le serveur MySQL nous a retourné au moins 1 enregistrement
        if (strlen($Str) != 0)
        {
            // On supprime le dernier OR
            $Str = substr($Str, 0, strlen($Str) - 4);
            $Str .= ';';
            
            $QueryDeletePlanet = "DELETE FROM {{table}} WHERE " + $Str;
            doquery($QueryDeletePlanet, 'galaxy');
        
            $Rapport .= "Nombres de plan&egrave;tes d&eacute;truites qui ont &eacute;t&eacute; supprim&eacute;es : ";
            $Rapport .= $nb.'<br>';
			
			// On efface toutes les planètes sans propriétaire dans {{prefix}}planets
			doquery("DELETE FROM {{table}} WHERE `id_owner` = '0';", 'planets');
        }
        else
        {
            $Rapport .= "Nombres de plan&egrave;tes d&eacute;truites qui ont &eacute;t&eacute; supprim&eacute;es : 0<br>";
        }

/**********************************************
* Suppression des lunes qui ont été détruites *
**********************************************/
        
        $nb = doquery("SELECT COUNT(*) FROM {{table}} WHERE `destruyed` = '1';", 'lunas');
        $nbre=mysql_fetch_row($nb);
        $Rapport .= "Nombres de lunes d&eacute;truites qui ont &eacute;t&eacute; supprim&eacute;es : " . $nbre[0] . '<br>';
        
		// On envoie la requête seulement si on a quelque chose a effacer
		if ( $nbre[0] != 0)
		{ 
			doquery("DELETE FROM {{table}} WHERE `destruyed` = '1';", 'lunas');
		}
        
/*********************************************
* Suppression des conversations dans le chat *
*********************************************/
        
        $nb = doquery("SELECT COUNT(*) FROM {{table}}", 'chat');
        $nbre=mysql_fetch_row($nb);        
        $Rapport .= "Nombres de messages du Chat supprim&eacute;s : " . $nbre[0] . '<br>';
        
		// On envoie la requête seulement si on a quelque chose a effacer
		if ( $nbre[0] != 0)
		{
			doquery("TRUNCATE TABLE {{table}}", 'chat');
		}
        
/*********************************************
*  Suppression des erreurs SQL enregistrées  *
*********************************************/
        
        $nb = doquery("SELECT COUNT(*) FROM {{table}}", 'errors');
        $nbre=mysql_fetch_row($nb);        
        $Rapport .= "Nombres d'erreurs SQL supprim&eacute;es : " . $nbre[0] . '<br><br>';
        
		// On envoie la requête seulement si on a quelque chose a effacer
		if ( $nbre[0] != 0)
		{
			doquery("TRUNCATE TABLE {{table}}", 'errors');
		}
        
/**********************************************
*  Optimisation des tables qui en ont besoin  *
**********************************************/
        
         $sql = "OPTIMIZE TABLE ";
        
         $Rapport .= "Tables optimis&eacute;es :<br><br>";
         $optimize = false;

        // Optimisation des tables
        $req = mysql_query('SHOW TABLE STATUS');
        while($data = mysql_fetch_assoc($req))
        {
            // Seulement celles qui en ont besoin
            if($data['Data_free'] > 0)
            {
                $optimize = true;
                $sql .= '`'.$data['Name'].'`, ';
                $Rapport .= $data['Name'] . ", ";
            }
            
        }
        $sql = substr($sql, 0, (strlen($sql)-2));
        mysql_query($sql);
        
        if ($optimize == false)
            $Rapport .= "Aucune optimisation est n&eacute;cessaire...";
        
        $Rapport = substr($Rapport, 0, (strlen($Rapport)-2));
        
            AdminMessage ( $Rapport, $lang['opti_db1'] );
            
    } else {
        AdminMessage ( $lang['sys_noalloaw'], $lang['sys_noaccess'] );
    }
	
// Version 1.0
// - Supression des planètes sans propriétaire
// - Suppression des messages lus
// - Suppression des rapports de combats
// - Suppression des messages dans le chat
// - Suppression des erreurs SQL enregistré

// Version 1.1
// - [Modif] Diminution du nombre de requêtes SQL (14 requêtes MAX)
// - [Modif] Amélioration de la suppression des rapports de combats dans {{prefix}}_rw
//           Suppression des rapports de combats qui ont été lus seulement
// - [Ajout] Suppression des lunes qui ont été détruites
// - [Ajout] Affichage d'un rapport à la fin de l'optimisation

// Version 1.2
// - [Ajout] Suppression des messages non lus au bout de 7 jours (durée avant suppression ajustable avec une constante)
// - [Ajout] Activation ou non de la suppression automatique des messages après un certain temps

// Version 1.3
// - [Modif] Envoi des requêtes pour supprimer certains enregistrements ou vider la table seulement s'il y a quelque chose
//			 à supprimer
?>