3 declare(strict_types
=1);
5 namespace PhpMyAdmin\Controllers\Database
;
7 use PhpMyAdmin\CheckUserPrivileges
;
8 use PhpMyAdmin\Controllers\AbstractController
;
9 use PhpMyAdmin\DatabaseInterface
;
10 use PhpMyAdmin\Html\Generator
;
11 use PhpMyAdmin\Message
;
12 use PhpMyAdmin\ResponseRenderer
;
13 use PhpMyAdmin\Template
;
14 use PhpMyAdmin\Tracker
;
15 use PhpMyAdmin\Tracking
;
21 use function htmlspecialchars
;
25 * Tracking configuration for database.
27 class TrackingController
extends AbstractController
32 /** @var DatabaseInterface */
35 public function __construct(
36 ResponseRenderer
$response,
39 DatabaseInterface
$dbi
41 parent
::__construct($response, $template);
42 $this->tracking
= $tracking;
46 public function __invoke(): void
48 $this->addScriptFiles(['vendor/jquery/jquery.tablesorter.js', 'database/tracking.js']);
50 Util
::checkParameters(['db']);
52 $GLOBALS['errorUrl'] = Util
::getScriptNameForOption($GLOBALS['cfg']['DefaultTabDatabase'], 'database');
53 $GLOBALS['errorUrl'] .= Url
::getCommon(['db' => $GLOBALS['db']], '&');
55 if (! $this->hasDatabase()) {
59 $GLOBALS['urlParams']['goto'] = Url
::getFromRoute('/table/tracking');
60 $GLOBALS['urlParams']['back'] = Url
::getFromRoute('/database/tracking');
62 // Get the database structure
63 $GLOBALS['sub_part'] = '_structure';
67 $GLOBALS['num_tables'],
68 $GLOBALS['total_num_tables'],
69 $GLOBALS['sub_part'],,
71 $GLOBALS['tooltip_truename'],
72 $GLOBALS['tooltip_aliasname'],
74 ] = Util
::getDbInfo($GLOBALS['db'], $GLOBALS['sub_part']);
76 if (isset($_POST['delete_tracking'], $_POST['table'])) {
77 Tracker
::deleteTracking($GLOBALS['db'], $_POST['table']);
78 echo Message
::success(
79 __('Tracking data deleted successfully.')
81 } elseif (isset($_POST['submit_create_version'])) {
82 $this->tracking
->createTrackingForMultipleTables($GLOBALS['db'], $_POST['selected']);
83 echo Message
::success(
86 'Version %1$s was created for selected tables, tracking is active for them.'
88 htmlspecialchars($_POST['version'])
91 } elseif (isset($_POST['submit_mult'])) {
92 if (! empty($_POST['selected_tbl'])) {
93 if ($_POST['submit_mult'] === 'delete_tracking') {
94 foreach ($_POST['selected_tbl'] as $table) {
95 Tracker
::deleteTracking($GLOBALS['db'], $table);
98 echo Message
::success(
99 __('Tracking data deleted successfully.')
101 } elseif ($_POST['submit_mult'] === 'track') {
102 echo $this->template
->render('create_tracking_version', [
103 'route' => '/database/tracking',
104 'url_params' => $GLOBALS['urlParams'],
106 'db' => $GLOBALS['db'],
107 'selected' => $_POST['selected_tbl'],
109 'default_statements' => $GLOBALS['cfg']['Server']['tracking_default_statements'],
115 echo Message
::notice(
116 __('No tables selected.')
121 // Get tracked data about the database
122 $GLOBALS['data'] = Tracker
::getTrackedData($GLOBALS['db'], '', '1');
124 // No tables present and no log exist
125 if ($GLOBALS['num_tables'] == 0 && count($GLOBALS['data']['ddlog']) === 0) {
126 echo '<p>' , __('No tables found in database.') , '</p>' , "\n";
128 if (empty($isSystemSchema)) {
129 $checkUserPrivileges = new CheckUserPrivileges($this->dbi
);
130 $checkUserPrivileges->getPrivileges();
132 echo $this->template
->render('database/create_table', ['db' => $GLOBALS['db']]);
138 echo $this->tracking
->getHtmlForDbTrackingTables($GLOBALS['db'], $GLOBALS['urlParams'], $GLOBALS['text_dir']);
140 // If available print out database log
141 if (count($GLOBALS['data']['ddlog']) <= 0) {
146 foreach ($GLOBALS['data']['ddlog'] as $entry) {
147 $log .= '# ' . $entry['date'] . ' ' . $entry['username'] . "\n"
148 . $entry['statement'] . "\n";
151 echo Generator
::getMessage(__('Database Log'), $log);