#!/usr/bin/php = 0 !\n"); break; case 'i': if (! is_numeric($options['i']) ) abort("Interval (".$options['i'].") is not numeric !\n"); $delay = $options['i']; if ($delay <= 0) abort("Interval (".$options['i'].") must be > 0 !\n"); break; case 'l': if (! is_numeric($options['l']) ) abort("Number of completed rollback operations (".$options['l'].") is not numeric !\n"); $nbComplRlbk = $options['l']; if ($nbComplRlbk < 0) abort("Number of completed rollback operations (".$options['l'].") must be >= 0 !\n"); break; case 'n': if (! is_numeric($options['n']) ) abort("Number of iterations (".$options['n'].") is not numeric !\n"); $nbIter = $options['n']; if ($nbIter <= 0) abort("Number of iterations (".$options['n'].") must be > 0 !\n"); break; case 'v': $verbose = true; break; case 'r': $regressTest = true; break; } $conn_string .= 'application_name='.$appName; // Open a database session. // Connection parameters are optional. If not supplied, the environment variables and PostgreSQL default values are used $dbconn = pg_connect($conn_string) or abort("Connection failed".pg_last_error()."\n"); // Perform the monitoring for ($i = 1 ; $i <= $nbIter ; $i++){ if ($regressTest) echo "[current date and time]\n"; else echo date("d/m/Y - H:i:s")."\n"; // Retrieve the recently completed rollback operations $query = "SELECT * FROM ( SELECT emaj.emaj_rlbk.*, tsr.time_tx_timestamp AS rlbk_start_datetime, tsm.time_tx_timestamp AS rlbk_mark_datetime FROM emaj.emaj_rlbk, emaj.emaj_time_stamp tsr, emaj.emaj_time_stamp tsm WHERE tsr.time_id = rlbk_time_id AND tsm.time_id = rlbk_mark_time_id AND rlbk_end_datetime > current_timestamp - '{$complRlbkAgo} hours'::interval ORDER BY rlbk_id DESC LIMIT {$nbComplRlbk}) AS t ORDER BY rlbk_id ASC"; $result = pg_query($dbconn,$query) or abort('Access to the emaj_rlbk table failed '.pg_last_error()."\n"); // Display results while ($row = pg_fetch_assoc($result)) { if ($regressTest){ $row['rlbk_start_datetime'] = '[rollback start time]'; $row['rlbk_end_datetime'] = '[rollback end time]'; $row['rlbk_mark_datetime'] = '[mark time]'; } echo "** rollback {$row['rlbk_id']} started at {$row['rlbk_start_datetime']} for groups {$row['rlbk_groups']}\n"; echo " status: {$row['rlbk_status']} ; ended at {$row['rlbk_end_datetime']}\n"; if ($verbose) echo " rollback to mark: \"{$row['rlbk_mark']}\" set at {$row['rlbk_mark_datetime']}\n"; if ($verbose) echo " {$row['rlbk_nb_session']} session(s) to process {$row['rlbk_eff_nb_table']} table(s) and {$row['rlbk_nb_sequence']} sequence(s)\n"; } pg_free_result($result); // Call the emaj_rollback_activity() function to retrieve the rollback operations in progress $query = "SELECT * FROM emaj.emaj_rollback_activity() ORDER BY rlbk_id"; $result = pg_query($dbconn,$query) or abort('Call of emaj_rollback_activity() function failed '.pg_last_error()."\n"); // Display results while ($row = pg_fetch_assoc($result)) { if ($regressTest){ $row['rlbk_start_datetime'] = '[rollback start time]'; $row['rlbk_mark_datetime'] = '[mark time]'; } echo "-> rollback {$row['rlbk_id']} started at {$row['rlbk_start_datetime']} for groups {$row['rlbk_groups']}\n"; echo " status: {$row['rlbk_status']} ; completion {$row['rlbk_completion_pct']} %"; if (is_null($row['rlbk_remaining'])) echo "\n"; else echo "; {$row['rlbk_remaining']} remaining\n"; if ($verbose) echo " rollback to mark: {$row['rlbk_mark']} set at {$row['rlbk_mark_datetime']}\n"; if ($verbose) echo " {$row['rlbk_nb_session']} session(s) to process {$row['rlbk_eff_nb_table']} table(s) and {$row['rlbk_nb_sequence']} sequence(s)\n"; } pg_free_result($result); // wait during the delay parameter (except for the last occurrence) if ($i < $nbIter){ sleep($delay); } } // Close the sessions pg_close($dbconn); function abort($msg){ echo $msg; exit(1); } function print_help(){ global $progName,$EmajVersion; echo "$progName belongs to the E-Maj PostgreSQL extension (version $EmajVersion).\n"; echo "It monitors E-Maj rollback operations in progress or recently completed.\n\n"; echo "Usage:\n"; echo " $progName [OPTION]... \n"; echo "\nOptions:\n"; echo " -a max time interval for completed rollback operations to display (in hours, default = 24)\n"; echo " -i time Interval between 2 displays (in seconds, default = 5s)\n"; echo " -l maximum completed rollback operations to display (default = 3)\n"; echo " -n Number of displays (default = 1)\n"; echo " --help shows this help, then exit\n"; echo " --version outputs version information, then exit\n"; echo "\nConnection options:\n"; echo " -d, Database to connect to\n"; echo " -h, database server Host or socket directory\n"; echo " -p, database server Port\n"; echo " -U, User name to connect as\n"; echo " -W, passWord associated to the user, if needed\n"; echo "\nExamples:\n"; echo " emajRollbackMonitor.php -i 3 -n 10 \n"; echo " performs 10 displays during 30 seconds.\n"; echo " emajRollbackMonitor.php -a 12 -l 10 \n"; echo " a single display with a maximum of 10 completed operations in the past 12 hours.\n"; } function print_version(){ global $progName,$EmajVersion; echo "This version of $progName belongs to E-Maj version $EmajVersion.\n"; echo "Type '$progName --help' to get usage information\n\n"; } ?>