From db08d32d6f305d550037fe27a7a067779c533c38 Mon Sep 17 00:00:00 2001 From: plegall Date: Mon, 29 Jul 2024 23:39:40 +0200 Subject: [PATCH] fixes #2194 more details about files in send_piwigo_infos new function to handle unique_exec (can be used in other places as well) --- include/functions.inc.php | 132 +++++++++++++++++++++++++++++--------- 1 file changed, 102 insertions(+), 30 deletions(-) diff --git a/include/functions.inc.php b/include/functions.inc.php index bf2800442..4c1c2d57f 100644 --- a/include/functions.inc.php +++ b/include/functions.inc.php @@ -2453,37 +2453,11 @@ function send_piwigo_infos() return; } - $exec_id = substr(sha1(random_bytes(1000)), 0, 8); - $logger->info('['.__FUNCTION__.'][exec='.$exec_id.'] starts now'); - - // we only want one send_piwigo_infos to run at once - if (isset($conf['send_piwigo_infos_running'])) - { - list($running_exec_id, $running_exec_start_time) = explode('-', $conf['send_piwigo_infos_running']); - if (time() - $running_exec_start_time > 60) - { - $logger->info('['.__FUNCTION__.'][exec='.$exec_id.'] exec='.$running_exec_id.', timeout stopped by another call to the function'); - conf_delete_param('send_piwigo_infos_running'); - } - } - - $query = ' -INSERT IGNORE - INTO '.CONFIG_TABLE.' - SET param="send_piwigo_infos_running" - , value="'.$exec_id.'-'.time().'" -;'; - pwg_query($query); - - list($send_piwigo_infos_running) = pwg_db_fetch_row(pwg_query('SELECT value FROM '.CONFIG_TABLE.' WHERE param = "send_piwigo_infos_running"')); - list($running_exec_id,) = explode('-', $send_piwigo_infos_running); - - if ($running_exec_id != $exec_id) + $exec_id = pwg_unique_exec_begins('send_piwigo_infos'); + if (false === $exec_id) { - $logger->info('['.__FUNCTION__.'][exec='.$exec_id.'] skip'); return; } - $logger->info('['.__FUNCTION__.'][exec='.$exec_id.'] wins the race and gets the token!'); include_once(PHPWG_ROOT_PATH.'admin/include/functions.php'); @@ -2513,6 +2487,61 @@ INSERT IGNORE $piwigo_infos['general_stats']['installed_on'] = get_installation_date(); + + $piwigo_infos['files'] = array(); + + if ($piwigo_infos['general_stats']['nb_photos'] > 0) + { + $query = ' +SELECT + COUNT(*) AS counter + FROM `'.IMAGES_TABLE.'` + WHERE storage_category_id IS NOT NULL +;'; + if (query2array($query, null, 'counter')[0] > 0) + { + // slow SQL query, but necessary if you have files added by sync + $query = ' +SELECT + IF(storage_category_id IS NULL, \'api\', \'sync\') AS add_method, + MAX(date_available) AS last_added_on, + COUNT(*) AS nb_files + FROM `'.IMAGES_TABLE.'` + GROUP BY add_method +;'; + $piwigo_infos['files']['added_by'] = query2array($query, 'add_method'); + } + else + { + // much faster SQL query, but valid only if you do not use sync to add photos + $query = ' +SELECT + date_available + FROM `'.IMAGES_TABLE.'` + ORDER BY id DESC + LIMIT 1 +;'; + $images = query2array($query); + + $piwigo_infos['files']['added_by'] = array( + 'api' => array( + 'nb_files' => $piwigo_infos['general_stats']['nb_photos'], + 'last_added_on' => count($images) > 0 ? $images[0]['date_available'] : null, + ) + ); + } + + $query = ' +SELECT + SUBSTRING_INDEX(path,".",-1) AS ext, + COUNT(*) AS counter, + SUM(filesize) AS filesize + FROM `'.IMAGES_TABLE.'` + GROUP BY ext +;'; + $piwigo_infos['files']['extensions'] = query2array($query, 'ext'); + } + // $conf['pem_plugins_category'] = 12; // $conf['pem_themes_category'] = 10; $url = PEM_URL . '/api/get_extension_list.php'; @@ -2531,7 +2560,7 @@ INSERT IGNORE { $logger->info('['.__FUNCTION__.'][exec='.$exec_id.'] fetchRemote on '.$url.' has failed'); send_piwigo_infos_retry_later(1*60*60); // 1 hour later - conf_delete_param('send_piwigo_infos_running'); + pwg_unique_exec_ends('send_piwigo_infos'); $logger->info('['.__FUNCTION__.'][exec='.$exec_id.'] executed in '.get_elapsed_time($start_time, get_moment())); return; } @@ -2752,7 +2781,7 @@ SELECT conf_update_param('send_piwigo_infos_last_notice', date('c')); } - conf_delete_param('send_piwigo_infos_running'); + pwg_unique_exec_ends('send_piwigo_infos'); $logger->info('['.__FUNCTION__.'][exec='.$exec_id.'] executed in '.get_elapsed_time($start_time, get_moment())); } @@ -2767,4 +2796,47 @@ function send_piwigo_infos_retry_later($wait_time) conf_update_param('send_piwigo_infos_last_notice', date('c', $last_notice)); } +function pwg_unique_exec_begins($token_name, $timeout=60) +{ + global $conf, $logger; + + $exec_id = substr(sha1(random_bytes(1000)), 0, 8); + $logger->info('['.$token_name.'][exec='.$exec_id.'] starts now'); + + if (isset($conf[$token_name.'_running'])) + { + list($running_exec_id, $running_exec_start_time) = explode('-', $conf[$token_name.'_running']); + if (time() - $running_exec_start_time > $timeout) + { + $logger->info('['.$token_name.'][exec='.$exec_id.'] exec='.$running_exec_id.', timeout stopped by another call to the function'); + pwg_unique_exec_ends($token_name); + } + } + + $query = ' +INSERT IGNORE + INTO '.CONFIG_TABLE.' + SET param="'.$token_name.'_running" + , value="'.$exec_id.'-'.time().'" +;'; + pwg_query($query); + + list($running_exec) = pwg_db_fetch_row(pwg_query('SELECT value FROM '.CONFIG_TABLE.' WHERE param = "'.$token_name.'_running"')); + list($running_exec_id,) = explode('-', $running_exec); + + if ($running_exec_id != $exec_id) + { + $logger->info('['.$token_name.'][exec='.$exec_id.'] skip'); + return false; + } + $logger->info('['.$token_name.'][exec='.$exec_id.'] wins the race and gets the token!'); + + return $exec_id; +} + +function pwg_unique_exec_ends($token_name) +{ + conf_delete_param($token_name.'_running'); +} + ?>