2016-10-19 17:06:37 -04:00
< ? php
2016-10-21 19:04:04 -04:00
/**
* @ file include / dbclean . php
* @ brief The script is called from time to time to clean the database entries and remove orphaned data .
*/
2017-01-07 04:05:52 -05:00
use \Friendica\Core\Config ;
use \Friendica\Core\PConfig ;
2016-10-19 17:06:37 -04:00
require_once ( " boot.php " );
2016-10-22 00:57:52 -04:00
function dbclean_run ( & $argv , & $argc ) {
global $a , $db ;
2016-10-19 17:06:37 -04:00
2017-01-04 14:13:50 -05:00
if ( is_null ( $a )) {
2016-10-22 00:57:52 -04:00
$a = new App ;
2017-01-04 14:13:50 -05:00
}
2016-10-19 17:06:37 -04:00
2016-10-22 06:14:41 -04:00
if ( is_null ( $db )) {
2016-10-22 00:57:52 -04:00
@ include ( " .htconfig.php " );
require_once ( " include/dba.php " );
$db = new dba ( $db_host , $db_user , $db_pass , $db_data );
unset ( $db_host , $db_user , $db_pass , $db_data );
}
2016-10-19 17:06:37 -04:00
2017-01-18 16:45:32 -05:00
Config :: load ();
2016-10-19 17:06:37 -04:00
2017-01-07 04:05:52 -05:00
if ( ! Config :: get ( 'system' , 'dbclean' , false )) {
2017-01-04 14:13:50 -05:00
return ;
}
2016-10-22 06:14:41 -04:00
if ( $argc == 2 ) {
$stage = intval ( $argv [ 1 ]);
} else {
$stage = 0 ;
}
2016-11-01 17:36:15 -04:00
2017-01-09 04:37:37 -05:00
if ( Config :: get ( " system " , " worker " ) AND ( $stage == 0 )) {
2016-11-01 17:36:15 -04:00
proc_run ( PRIORITY_LOW , 'include/dbclean.php' , 1 );
proc_run ( PRIORITY_LOW , 'include/dbclean.php' , 2 );
proc_run ( PRIORITY_LOW , 'include/dbclean.php' , 3 );
proc_run ( PRIORITY_LOW , 'include/dbclean.php' , 4 );
proc_run ( PRIORITY_LOW , 'include/dbclean.php' , 5 );
proc_run ( PRIORITY_LOW , 'include/dbclean.php' , 6 );
proc_run ( PRIORITY_LOW , 'include/dbclean.php' , 7 );
} else {
remove_orphans ( $stage );
}
2016-10-22 00:57:52 -04:00
}
2016-10-19 17:06:37 -04:00
2016-10-21 19:04:04 -04:00
/**
* @ brief Remove orphaned database entries
*/
2016-10-22 06:14:41 -04:00
function remove_orphans ( $stage = 0 ) {
global $db ;
2016-11-01 17:36:15 -04:00
$count = 0 ;
2017-01-09 04:37:37 -05:00
// With activated worker we split the deletion in many small tasks
if ( Config :: get ( " system " , " worker " )) {
$limit = 1000 ;
} else {
$limit = 10000 ;
}
2016-10-22 06:14:41 -04:00
if (( $stage == 1 ) OR ( $stage == 0 )) {
2016-10-31 17:32:08 -04:00
logger ( " Deleting old global item entries from item table without user copy " );
if ( $db -> q ( " SELECT `id` FROM `item` WHERE `uid` = 0
AND NOT EXISTS ( SELECT `guid` FROM `item` AS `i` WHERE `item` . `guid` = `i` . `guid` AND `i` . `uid` != 0 )
2017-01-09 04:37:37 -05:00
AND `received` < UTC_TIMESTAMP () - INTERVAL 90 DAY LIMIT " .intval( $limit ), true)) {
2016-10-31 17:32:08 -04:00
$count = $db -> num_rows ();
logger ( " found global item orphans: " . $count );
while ( $orphan = $db -> qfetch ()) {
q ( " DELETE FROM `item` WHERE `id` = %d " , intval ( $orphan [ " id " ]));
}
}
$db -> qclose ();
logger ( " Done deleting old global item entries from item table without user copy " );
}
if (( $stage == 2 ) OR ( $stage == 0 )) {
logger ( " Deleting items without parents " );
2017-01-09 04:37:37 -05:00
if ( $db -> q ( " SELECT `id` FROM `item` WHERE NOT EXISTS (SELECT `id` FROM `item` AS `i` WHERE `item`.`parent` = `i`.`id`) LIMIT " . intval ( $limit ), true )) {
2016-10-31 17:32:08 -04:00
$count = $db -> num_rows ();
logger ( " found item orphans without parents: " . $count );
while ( $orphan = $db -> qfetch ()) {
q ( " DELETE FROM `item` WHERE `id` = %d " , intval ( $orphan [ " id " ]));
}
}
$db -> qclose ();
logger ( " Done deleting items without parents " );
}
if (( $stage == 3 ) OR ( $stage == 0 )) {
2016-10-22 06:14:41 -04:00
logger ( " Deleting orphaned data from thread table " );
2017-01-09 04:37:37 -05:00
if ( $db -> q ( " SELECT `iid` FROM `thread` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`parent` = `thread`.`iid`) LIMIT " . intval ( $limit ), true )) {
2016-10-31 17:32:08 -04:00
$count = $db -> num_rows ();
logger ( " found thread orphans: " . $count );
2016-10-22 06:14:41 -04:00
while ( $orphan = $db -> qfetch ()) {
q ( " DELETE FROM `thread` WHERE `iid` = %d " , intval ( $orphan [ " iid " ]));
}
}
$db -> qclose ();
2016-10-31 17:32:08 -04:00
logger ( " Done deleting orphaned data from thread table " );
2016-10-20 18:05:21 -04:00
}
2016-10-19 17:06:37 -04:00
2016-10-31 17:32:08 -04:00
if (( $stage == 4 ) OR ( $stage == 0 )) {
2016-10-22 06:14:41 -04:00
logger ( " Deleting orphaned data from notify table " );
2017-01-09 04:37:37 -05:00
if ( $db -> q ( " SELECT `iid` FROM `notify` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`id` = `notify`.`iid`) LIMIT " . intval ( $limit ), true )) {
2016-10-31 17:32:08 -04:00
$count = $db -> num_rows ();
logger ( " found notify orphans: " . $count );
2016-10-22 06:14:41 -04:00
while ( $orphan = $db -> qfetch ()) {
q ( " DELETE FROM `notify` WHERE `iid` = %d " , intval ( $orphan [ " iid " ]));
}
}
$db -> qclose ();
2016-10-31 17:32:08 -04:00
logger ( " Done deleting orphaned data from notify table " );
2016-10-20 18:05:21 -04:00
}
2016-10-31 17:32:08 -04:00
if (( $stage == 5 ) OR ( $stage == 0 )) {
logger ( " Deleting orphaned data from notify-threads table " );
2017-01-09 04:37:37 -05:00
if ( $db -> q ( " SELECT `id` FROM `notify-threads` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`parent` = `notify-threads`.`master-parent-item`) LIMIT " . intval ( $limit ), true )) {
2016-10-31 17:32:08 -04:00
$count = $db -> num_rows ();
logger ( " found notify-threads orphans: " . $count );
while ( $orphan = $db -> qfetch ()) {
q ( " DELETE FROM `notify-threads` WHERE `id` = %d " , intval ( $orphan [ " id " ]));
}
}
$db -> qclose ();
logger ( " Done deleting orphaned data from notify-threads table " );
}
if (( $stage == 6 ) OR ( $stage == 0 )) {
2016-10-22 06:14:41 -04:00
logger ( " Deleting orphaned data from sign table " );
2017-01-09 04:37:37 -05:00
if ( $db -> q ( " SELECT `iid` FROM `sign` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`id` = `sign`.`iid`) LIMIT " . intval ( $limit ), true )) {
2016-10-31 17:32:08 -04:00
$count = $db -> num_rows ();
logger ( " found sign orphans: " . $count );
2016-10-22 06:14:41 -04:00
while ( $orphan = $db -> qfetch ()) {
q ( " DELETE FROM `sign` WHERE `iid` = %d " , intval ( $orphan [ " iid " ]));
}
}
$db -> qclose ();
2016-10-31 17:32:08 -04:00
logger ( " Done deleting orphaned data from sign table " );
2016-10-20 18:05:21 -04:00
}
2016-10-19 17:06:37 -04:00
2016-10-31 17:32:08 -04:00
if (( $stage == 7 ) OR ( $stage == 0 )) {
2016-10-22 06:14:41 -04:00
logger ( " Deleting orphaned data from term table " );
2017-01-09 04:37:37 -05:00
if ( $db -> q ( " SELECT `oid` FROM `term` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`id` = `term`.`oid`) LIMIT " . intval ( $limit ), true )) {
2016-10-31 17:32:08 -04:00
$count = $db -> num_rows ();
logger ( " found term orphans: " . $count );
2016-10-22 06:14:41 -04:00
while ( $orphan = $db -> qfetch ()) {
q ( " DELETE FROM `term` WHERE `oid` = %d " , intval ( $orphan [ " oid " ]));
}
}
$db -> qclose ();
2016-10-31 17:32:08 -04:00
logger ( " Done deleting orphaned data from term table " );
2016-10-20 18:05:21 -04:00
}
2016-11-01 17:36:15 -04:00
// Call it again if not all entries were purged
2017-01-09 04:37:37 -05:00
if (( $stage != 0 ) AND ( $count > 0 ) AND Config :: get ( " system " , " worker " )) {
proc_run ( PRIORITY_MEDIUM , 'include/dbclean.php' );
2016-11-01 17:36:15 -04:00
}
2016-10-19 17:06:37 -04:00
}
2016-10-22 00:57:52 -04:00
if ( array_search ( __file__ , get_included_files ()) === 0 ){
dbclean_run ( $_SERVER [ " argv " ], $_SERVER [ " argc " ]);
killme ();
}
2016-10-19 17:06:37 -04:00
?>