Linux vps-61133.fhnet.fr 4.9.0-19-amd64 #1 SMP Debian 4.9.320-2 (2022-06-30) x86_64
Apache/2.4.25 (Debian)
Server IP : 93.113.207.21 & Your IP : 216.73.216.119
Domains :
Cant Read [ /etc/named.conf ]
User : www-data
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
usr /
share /
phpmyadmin /
libraries /
Delete
Unzip
Name
Size
Permission
Date
Action
bfShapeFiles
[ DIR ]
drwxrwxrwx
2022-03-20 10:35
config
[ DIR ]
drwxrwxrwx
2022-03-20 10:35
controllers
[ DIR ]
drwxrwxrwx
2022-03-20 10:35
dbi
[ DIR ]
drwxrwxrwx
2022-03-20 10:35
di
[ DIR ]
drwxrwxrwx
2022-03-20 10:35
engines
[ DIR ]
drwxrwxrwx
2022-03-20 10:35
gis
[ DIR ]
drwxrwxrwx
2022-03-20 10:35
navigation
[ DIR ]
drwxrwxrwx
2022-03-20 10:35
plugins
[ DIR ]
drwxrwxrwx
2022-03-20 10:35
properties
[ DIR ]
drwxrwxrwx
2022-03-20 10:35
rte
[ DIR ]
drwxrwxrwx
2022-03-20 10:35
sql-parser
[ DIR ]
drwxrwxrwx
2022-03-20 10:35
Advisor.php
15.13
KB
-rw-r--r--
2017-01-23 20:20
Config.php
54.69
KB
-rw-r--r--
2020-10-23 14:39
Console.php
14.82
KB
-rw-r--r--
2017-01-23 20:20
DatabaseInterface.php
95.6
KB
-rw-r--r--
2017-01-23 20:20
DbList.php
1.9
KB
-rw-r--r--
2017-01-23 20:20
DbQbe.php
68.87
KB
-rw-r--r--
2017-01-23 20:20
DbSearch.php
17.21
KB
-rw-r--r--
2017-01-23 20:20
DisplayResults.php
206
KB
-rw-r--r--
2020-10-23 14:39
Error.php
12.7
KB
-rw-r--r--
2017-01-23 20:20
ErrorHandler.php
16.48
KB
-rw-r--r--
2017-01-23 20:20
File.php
18.82
KB
-rw-r--r--
2017-01-23 20:20
Font.php
4.24
KB
-rw-r--r--
2017-01-23 20:20
Footer.php
10.52
KB
-rw-r--r--
2020-10-23 14:39
Header.php
25.34
KB
-rw-r--r--
2017-01-23 20:20
Index.php
23.79
KB
-rw-r--r--
2017-01-23 20:20
IndexColumn.php
4.46
KB
-rw-r--r--
2017-01-23 20:20
Language.php
4.27
KB
-rw-r--r--
2017-01-23 20:20
LanguageManager.php
20.75
KB
-rw-r--r--
2017-01-23 20:20
Linter.php
5.02
KB
-rw-r--r--
2017-01-23 20:20
ListAbstract.php
3.15
KB
-rw-r--r--
2017-01-23 20:20
ListDatabase.php
4.62
KB
-rw-r--r--
2017-01-23 20:20
Menu.php
21.14
KB
-rw-r--r--
2017-01-23 20:20
Message.php
18.67
KB
-rw-r--r--
2017-01-23 20:20
OutputBuffering.php
3.59
KB
-rw-r--r--
2017-01-23 20:20
PDF.php
3.94
KB
-rw-r--r--
2017-01-23 20:20
Partition.php
7.26
KB
-rw-r--r--
2017-01-23 20:20
Psr4Autoloader.php
4.85
KB
-rw-r--r--
2017-01-23 20:20
RecentFavoriteTable.php
11.78
KB
-rw-r--r--
2017-01-23 20:20
Response.php
12.61
KB
-rw-r--r--
2017-01-23 20:20
SavedSearches.php
11.67
KB
-rw-r--r--
2017-01-23 20:20
Scripts.php
7.38
KB
-rw-r--r--
2017-01-23 20:20
ServerStatusData.php
15.72
KB
-rw-r--r--
2017-01-23 20:20
StorageEngine.php
13.61
KB
-rw-r--r--
2017-01-23 20:20
SubPartition.php
3.52
KB
-rw-r--r--
2017-01-23 20:20
SysInfo.php
799
B
-rw-r--r--
2017-01-23 20:20
SysInfoLinux.php
1.92
KB
-rw-r--r--
2017-01-23 20:20
SysInfoSunOS.php
1.86
KB
-rw-r--r--
2017-01-23 20:20
SysInfoWINNT.php
3.08
KB
-rw-r--r--
2017-01-23 20:20
SystemDatabase.php
3.66
KB
-rw-r--r--
2017-01-23 20:20
Table.php
88.12
KB
-rw-r--r--
2017-01-23 20:20
Template.php
4.45
KB
-rw-r--r--
2017-01-23 20:20
Theme.php
11.34
KB
-rw-r--r--
2017-01-23 20:20
ThemeManager.php
12.91
KB
-rw-r--r--
2017-01-23 20:20
Tracker.php
30.35
KB
-rw-r--r--
2017-01-23 20:20
Types.php
6.08
KB
-rw-r--r--
2017-01-23 20:20
TypesMySQL.php
17.26
KB
-rw-r--r--
2017-01-23 20:20
Util.php
172.46
KB
-rw-r--r--
2020-10-23 14:39
VersionInformation.php
7.87
KB
-rw-r--r--
2017-01-23 20:20
ZipFile.php
6.63
KB
-rw-r--r--
2017-01-23 20:20
advisor.lib.php
1.6
KB
-rw-r--r--
2017-01-23 20:20
advisory_rules.txt
25.94
KB
-rw-r--r--
2017-01-23 20:20
autoloader.php
450
B
-rw-r--r--
2017-01-23 20:20
bookmark.lib.php
8.5
KB
-rw-r--r--
2017-01-23 20:20
browse_foreigners.lib.php
9.83
KB
-rw-r--r--
2017-01-23 20:20
central_columns.lib.php
49.38
KB
-rw-r--r--
2017-01-23 20:20
charset_conversion.lib.php
3.54
KB
-rw-r--r--
2017-01-23 20:20
check_user_privileges.lib.php
10.65
KB
-rw-r--r--
2017-01-23 20:20
cleanup.lib.php
1.29
KB
-rw-r--r--
2017-01-23 20:20
common.inc.php
34.38
KB
-rw-r--r--
2020-10-23 14:39
config.default.php
66.5
KB
-rw-r--r--
2017-01-23 20:20
config.values.php
10.17
KB
-rw-r--r--
2017-01-23 20:20
core.lib.php
29.94
KB
-rw-r--r--
2017-01-23 20:20
create_addfield.lib.php
15.68
KB
-rw-r--r--
2017-01-23 20:20
database_interface.inc.php
2.63
KB
-rw-r--r--
2017-01-23 20:20
db_common.inc.php
3.12
KB
-rw-r--r--
2017-01-23 20:20
db_designer.lib.php
10.4
KB
-rw-r--r--
2020-10-23 14:39
db_table_exists.lib.php
3.21
KB
-rw-r--r--
2017-01-23 20:20
display_change_password.lib.php
5.45
KB
-rw-r--r--
2017-01-23 20:20
display_create_table.lib.php
1.53
KB
-rw-r--r--
2017-01-23 20:20
display_export.lib.php
38.11
KB
-rw-r--r--
2017-01-23 20:20
display_git_revision.lib.php
3.04
KB
-rw-r--r--
2020-10-23 14:39
display_import.lib.php
24.34
KB
-rw-r--r--
2017-01-23 20:20
display_import_ajax.lib.php
3.13
KB
-rw-r--r--
2017-01-23 20:20
display_select_lang.lib.php
2.36
KB
-rw-r--r--
2017-01-23 20:20
error.inc.php
1.21
KB
-rw-r--r--
2017-01-23 20:20
error_report.lib.php
10.25
KB
-rw-r--r--
2017-01-23 20:20
export.lib.php
35.16
KB
-rw-r--r--
2017-01-23 20:20
file_listing.lib.php
2.37
KB
-rw-r--r--
2017-01-23 20:20
iconv_wrapper.lib.php
3.88
KB
-rw-r--r--
2017-01-23 20:20
import.lib.php
50.64
KB
-rw-r--r--
2017-01-23 20:20
index.lib.php
1.37
KB
-rw-r--r--
2017-01-23 20:20
information_schema_relations.lib.php
10.95
KB
-rw-r--r--
2017-01-23 20:20
insert_edit.lib.php
112.79
KB
-rw-r--r--
2020-10-23 14:39
ip_allow_deny.lib.php
9.35
KB
-rw-r--r--
2017-01-23 20:20
js_escape.lib.php
4.43
KB
-rw-r--r--
2017-01-23 20:20
kanji-encoding.lib.php
4.46
KB
-rw-r--r--
2017-01-23 20:20
language_stats.inc.php
1.45
KB
-rw-r--r--
2017-01-23 20:20
logging.lib.php
521
B
-rw-r--r--
2017-01-23 20:20
mime.lib.php
704
B
-rw-r--r--
2017-01-23 20:20
mult_submits.inc.php
10.64
KB
-rw-r--r--
2017-01-23 20:20
mult_submits.lib.php
20.44
KB
-rw-r--r--
2017-01-23 20:20
mysql_charsets.inc.php
4.09
KB
-rw-r--r--
2017-01-23 20:20
mysql_charsets.lib.php
10.47
KB
-rw-r--r--
2017-01-23 20:20
mysql_relations.lib.php
5.12
KB
-rw-r--r--
2017-01-23 20:20
normalization.lib.php
33.98
KB
-rw-r--r--
2017-01-23 20:20
opendocument.lib.php
7.94
KB
-rw-r--r--
2017-01-23 20:20
operations.lib.php
73.64
KB
-rw-r--r--
2017-01-23 20:20
parse_analyze.lib.php
2.12
KB
-rw-r--r--
2017-01-23 20:20
plugin_interface.lib.php
19.69
KB
-rw-r--r--
2017-01-23 20:20
pmd_common.php
24.2
KB
-rw-r--r--
2020-10-23 14:39
relation.lib.php
68.41
KB
-rw-r--r--
2017-01-23 20:20
relation_cleanup.lib.php
13.84
KB
-rw-r--r--
2017-01-23 20:20
replication.inc.php
8.82
KB
-rw-r--r--
2017-01-23 20:20
replication_gui.lib.php
37.45
KB
-rw-r--r--
2017-01-23 20:20
sanitizing.lib.php
6.3
KB
-rw-r--r--
2017-01-23 20:20
select_server.lib.php
3.4
KB
-rw-r--r--
2017-01-23 20:20
server_common.inc.php
1.22
KB
-rw-r--r--
2017-01-23 20:20
server_common.lib.php
1.92
KB
-rw-r--r--
2017-01-23 20:20
server_privileges.lib.php
179.22
KB
-rw-r--r--
2020-10-23 14:39
server_status.lib.php
9.92
KB
-rw-r--r--
2017-01-23 20:20
server_status_advisor.lib.php
1.89
KB
-rw-r--r--
2017-01-23 20:20
server_status_monitor.lib.php
26.22
KB
-rw-r--r--
2017-01-23 20:20
server_status_processes.lib.php
9.57
KB
-rw-r--r--
2017-01-23 20:20
server_status_queries.lib.php
4.86
KB
-rw-r--r--
2017-01-23 20:20
server_status_variables.lib.php
28.95
KB
-rw-r--r--
2017-01-23 20:20
server_user_groups.lib.php
12.8
KB
-rw-r--r--
2017-01-23 20:20
server_users.lib.php
1.35
KB
-rw-r--r--
2017-01-23 20:20
session.inc.php
5.22
KB
-rw-r--r--
2017-01-23 20:20
session.lib.php
735
B
-rw-r--r--
2017-01-23 20:20
special_schema_links.lib.php
17.51
KB
-rw-r--r--
2017-01-23 20:20
sql.lib.php
77.51
KB
-rw-r--r--
2017-01-23 20:20
sql_query_form.lib.php
15.71
KB
-rw-r--r--
2017-01-23 20:20
string.lib.php
800
B
-rw-r--r--
2017-01-23 20:20
stringMb.lib.php
1.86
KB
-rw-r--r--
2017-01-23 20:20
stringNative.lib.php
6.82
KB
-rw-r--r--
2017-01-23 20:20
sysinfo.lib.php
1.34
KB
-rw-r--r--
2017-01-23 20:20
tbl_columns_definition_form.inc.php
13.55
KB
-rw-r--r--
2017-01-23 20:20
tbl_common.inc.php
1.3
KB
-rw-r--r--
2017-01-23 20:20
tbl_info.inc.php
3.54
KB
-rw-r--r--
2017-01-23 20:20
tbl_partition_definition.inc.php
5.55
KB
-rw-r--r--
2017-01-23 20:20
tracking.lib.php
54.93
KB
-rw-r--r--
2017-01-23 20:20
transformations.lib.php
14.63
KB
-rw-r--r--
2020-10-23 14:39
url_generating.lib.php
6.77
KB
-rw-r--r--
2017-01-23 20:20
user_preferences.inc.php
2.38
KB
-rw-r--r--
2017-01-23 20:20
user_preferences.lib.php
8.17
KB
-rw-r--r--
2017-01-23 20:20
util.lib.php
749
B
-rw-r--r--
2017-01-23 20:20
vendor_config.php
2.49
KB
-rw-r--r--
2020-10-23 14:39
zip_extension.lib.php
5.38
KB
-rw-r--r--
2017-01-23 20:20
Save
Rename
<?php /* vim: set expandtab sw=4 ts=4 sts=4: */ /** * Tracking changes on databases, tables and views * * @package PhpMyAdmin */ namespace PMA\libraries; use PMA\libraries\plugins\export\ExportSql; /** * This class tracks changes on databases, tables and views. * * @package PhpMyAdmin * * @todo use stristr instead of strstr */ class Tracker { /** * Whether tracking is ready. */ static protected $enabled = false; /** * Actually enables tracking. This needs to be done after all * underlaying code is initialized. * * @static * * @return void */ static public function enable() { self::$enabled = true; } /** * Gets the on/off value of the Tracker module, starts initialization. * * @static * * @return boolean (true=on|false=off) */ static public function isActive() { if (! self::$enabled) { return false; } /* We need to avoid attempt to track any queries * from PMA_getRelationsParam */ self::$enabled = false; $cfgRelation = PMA_getRelationsParam(); /* Restore original state */ self::$enabled = true; if (! $cfgRelation['trackingwork']) { return false; } $pma_table = self::_getTrackingTable(); if (isset($pma_table)) { return true; } else { return false; } } /** * Parses the name of a table from a SQL statement substring. * * @param string $string part of SQL statement * * @static * * @return string the name of table */ static protected function getTableName($string) { if (mb_strstr($string, '.')) { $temp = explode('.', $string); $tablename = $temp[1]; } else { $tablename = $string; } $str = explode("\n", $tablename); $tablename = $str[0]; $tablename = str_replace(';', '', $tablename); $tablename = str_replace('`', '', $tablename); $tablename = trim($tablename); return $tablename; } /** * Gets the tracking status of a table, is it active or deactive ? * * @param string $dbname name of database * @param string $tablename name of table * * @static * * @return boolean true or false */ static public function isTracked($dbname, $tablename) { if (! self::$enabled) { return false; } /* We need to avoid attempt to track any queries * from PMA_getRelationsParam */ self::$enabled = false; $cfgRelation = PMA_getRelationsParam(); /* Restore original state */ self::$enabled = true; if (! $cfgRelation['trackingwork']) { return false; } $sql_query = " SELECT tracking_active FROM " . self::_getTrackingTable() . " WHERE db_name = '" . $GLOBALS['dbi']->escapeString($dbname) . "' " . " AND table_name = '" . $GLOBALS['dbi']->escapeString($tablename) . "' " . " ORDER BY version DESC"; $row = $GLOBALS['dbi']->fetchArray(PMA_queryAsControlUser($sql_query)); if (isset($row['tracking_active']) && $row['tracking_active'] == 1) { return true; } else { return false; } } /** * Returns the comment line for the log. * * @return string Comment, contains date and username */ static public function getLogComment() { $date = date('Y-m-d H:i:s'); $user = preg_replace('/\s+/', ' ', $GLOBALS['cfg']['Server']['user']); return "# log " . $date . " " . $user . "\n"; } /** * Creates tracking version of a table / view * (in other words: create a job to track future changes on the table). * * @param string $dbname name of database * @param string $tablename name of table * @param string $version version * @param string $tracking_set set of tracking statements * @param bool $is_view if table is a view * * @static * * @return int result of version insertion */ static public function createVersion($dbname, $tablename, $version, $tracking_set = '', $is_view = false ) { global $sql_backquotes, $export_type; if ($tracking_set == '') { $tracking_set = $GLOBALS['cfg']['Server']['tracking_default_statements']; } // get Export SQL instance include_once "libraries/plugin_interface.lib.php"; /* @var $export_sql_plugin \PMA\libraries\plugins\export\ExportSql */ $export_sql_plugin = PMA_getPlugin( "export", "sql", 'libraries/plugins/export/', array( 'export_type' => $export_type, 'single_table' => false, ) ); $sql_backquotes = true; $date = date('Y-m-d H:i:s'); // Get data definition snapshot of table $columns = $GLOBALS['dbi']->getColumns($dbname, $tablename, null, true); // int indices to reduce size $columns = array_values($columns); // remove Privileges to reduce size for ($i = 0, $nb = count($columns); $i < $nb; $i++) { unset($columns[$i]['Privileges']); } $indexes = $GLOBALS['dbi']->getTableIndexes($dbname, $tablename); $snapshot = array('COLUMNS' => $columns, 'INDEXES' => $indexes); $snapshot = serialize($snapshot); // Get DROP TABLE / DROP VIEW and CREATE TABLE SQL statements $sql_backquotes = true; $create_sql = ""; if ($GLOBALS['cfg']['Server']['tracking_add_drop_table'] == true && $is_view == false ) { $create_sql .= self::getLogComment() . 'DROP TABLE IF EXISTS ' . Util::backquote($tablename) . ";\n"; } if ($GLOBALS['cfg']['Server']['tracking_add_drop_view'] == true && $is_view == true ) { $create_sql .= self::getLogComment() . 'DROP VIEW IF EXISTS ' . Util::backquote($tablename) . ";\n"; } $create_sql .= self::getLogComment() . $export_sql_plugin->getTableDef($dbname, $tablename, "\n", ""); // Save version $sql_query = "/*NOTRACK*/\n" . "INSERT INTO " . self::_getTrackingTable() . " (" . "db_name, " . "table_name, " . "version, " . "date_created, " . "date_updated, " . "schema_snapshot, " . "schema_sql, " . "data_sql, " . "tracking " . ") " . "values ( '" . $GLOBALS['dbi']->escapeString($dbname) . "', '" . $GLOBALS['dbi']->escapeString($tablename) . "', '" . $GLOBALS['dbi']->escapeString($version) . "', '" . $GLOBALS['dbi']->escapeString($date) . "', '" . $GLOBALS['dbi']->escapeString($date) . "', '" . $GLOBALS['dbi']->escapeString($snapshot) . "', '" . $GLOBALS['dbi']->escapeString($create_sql) . "', '" . $GLOBALS['dbi']->escapeString("\n") . "', '" . $GLOBALS['dbi']->escapeString($tracking_set) . "' )"; $result = PMA_queryAsControlUser($sql_query); if ($result) { // Deactivate previous version self::deactivateTracking($dbname, $tablename, ($version - 1)); } return $result; } /** * Removes all tracking data for a table or a version of a table * * @param string $dbname name of database * @param string $tablename name of table * @param string $version version * * @static * * @return int result of version insertion */ static public function deleteTracking($dbname, $tablename, $version = '') { $sql_query = "/*NOTRACK*/\n" . "DELETE FROM " . self::_getTrackingTable() . " WHERE `db_name` = '" . $GLOBALS['dbi']->escapeString($dbname) . "'" . " AND `table_name` = '" . $GLOBALS['dbi']->escapeString($tablename) . "'"; if ($version) { $sql_query .= " AND `version` = '" . $GLOBALS['dbi']->escapeString($version) . "'"; } $result = PMA_queryAsControlUser($sql_query); return $result; } /** * Creates tracking version of a database * (in other words: create a job to track future changes on the database). * * @param string $dbname name of database * @param string $version version * @param string $query query * @param string $tracking_set set of tracking statements * * @static * * @return int result of version insertion */ static public function createDatabaseVersion($dbname, $version, $query, $tracking_set = 'CREATE DATABASE,ALTER DATABASE,DROP DATABASE' ) { $date = date('Y-m-d H:i:s'); if ($tracking_set == '') { $tracking_set = $GLOBALS['cfg']['Server']['tracking_default_statements']; } $create_sql = ""; if ($GLOBALS['cfg']['Server']['tracking_add_drop_database'] == true) { $create_sql .= self::getLogComment() . 'DROP DATABASE IF EXISTS ' . Util::backquote($dbname) . ";\n"; } $create_sql .= self::getLogComment() . $query; // Save version $sql_query = "/*NOTRACK*/\n" . "INSERT INTO " . self::_getTrackingTable() . " (" . "db_name, " . "table_name, " . "version, " . "date_created, " . "date_updated, " . "schema_snapshot, " . "schema_sql, " . "data_sql, " . "tracking " . ") " . "values ( '" . $GLOBALS['dbi']->escapeString($dbname) . "', '" . $GLOBALS['dbi']->escapeString('') . "', '" . $GLOBALS['dbi']->escapeString($version) . "', '" . $GLOBALS['dbi']->escapeString($date) . "', '" . $GLOBALS['dbi']->escapeString($date) . "', '" . $GLOBALS['dbi']->escapeString('') . "', '" . $GLOBALS['dbi']->escapeString($create_sql) . "', '" . $GLOBALS['dbi']->escapeString("\n") . "', '" . $GLOBALS['dbi']->escapeString($tracking_set) . "' )"; $result = PMA_queryAsControlUser($sql_query); return $result; } /** * Changes tracking of a table. * * @param string $dbname name of database * @param string $tablename name of table * @param string $version version * @param integer $new_state the new state of tracking * * @static * * @return int result of SQL query */ static private function _changeTracking($dbname, $tablename, $version, $new_state ) { $sql_query = " UPDATE " . self::_getTrackingTable() . " SET `tracking_active` = '" . $new_state . "' " . " WHERE `db_name` = '" . $GLOBALS['dbi']->escapeString($dbname) . "' " . " AND `table_name` = '" . $GLOBALS['dbi']->escapeString($tablename) . "' " . " AND `version` = '" . $GLOBALS['dbi']->escapeString($version) . "' "; $result = PMA_queryAsControlUser($sql_query); return $result; } /** * Changes tracking data of a table. * * @param string $dbname name of database * @param string $tablename name of table * @param string $version version * @param string $type type of data(DDL || DML) * @param string|array $new_data the new tracking data * * @static * * @return bool result of change */ static public function changeTrackingData($dbname, $tablename, $version, $type, $new_data ) { if ($type == 'DDL') { $save_to = 'schema_sql'; } elseif ($type == 'DML') { $save_to = 'data_sql'; } else { return false; } $date = date('Y-m-d H:i:s'); $new_data_processed = ''; if (is_array($new_data)) { foreach ($new_data as $data) { $new_data_processed .= '# log ' . $date . ' ' . $data['username'] . $GLOBALS['dbi']->escapeString($data['statement']) . "\n"; } } else { $new_data_processed = $new_data; } $sql_query = " UPDATE " . self::_getTrackingTable() . " SET `" . $save_to . "` = '" . $new_data_processed . "' " . " WHERE `db_name` = '" . $GLOBALS['dbi']->escapeString($dbname) . "' " . " AND `table_name` = '" . $GLOBALS['dbi']->escapeString($tablename) . "' " . " AND `version` = '" . $GLOBALS['dbi']->escapeString($version) . "' "; $result = PMA_queryAsControlUser($sql_query); return (boolean) $result; } /** * Activates tracking of a table. * * @param string $dbname name of database * @param string $tablename name of table * @param string $version version * * @static * * @return int result of SQL query */ static public function activateTracking($dbname, $tablename, $version) { return self::_changeTracking($dbname, $tablename, $version, 1); } /** * Deactivates tracking of a table. * * @param string $dbname name of database * @param string $tablename name of table * @param string $version version * * @static * * @return int result of SQL query */ static public function deactivateTracking($dbname, $tablename, $version) { return self::_changeTracking($dbname, $tablename, $version, 0); } /** * Gets the newest version of a tracking job * (in other words: gets the HEAD version). * * @param string $dbname name of database * @param string $tablename name of table * @param string $statement tracked statement * * @static * * @return int (-1 if no version exists | > 0 if a version exists) */ static public function getVersion($dbname, $tablename, $statement = null) { $sql_query = " SELECT MAX(version) FROM " . self::_getTrackingTable() . " WHERE `db_name` = '" . $GLOBALS['dbi']->escapeString($dbname) . "' " . " AND `table_name` = '" . $GLOBALS['dbi']->escapeString($tablename) . "' "; if ($statement != "") { $sql_query .= " AND FIND_IN_SET('" . $statement . "',tracking) > 0" ; } $row = $GLOBALS['dbi']->fetchArray(PMA_queryAsControlUser($sql_query)); return isset($row[0]) ? $row[0] : -1; } /** * Gets the record of a tracking job. * * @param string $dbname name of database * @param string $tablename name of table * @param string $version version number * * @static * * @return mixed record DDM log, DDL log, structure snapshot, tracked * statements. */ static public function getTrackedData($dbname, $tablename, $version) { $sql_query = " SELECT * FROM " . self::_getTrackingTable() . " WHERE `db_name` = '" . $GLOBALS['dbi']->escapeString($dbname) . "' "; if (! empty($tablename)) { $sql_query .= " AND `table_name` = '" . $GLOBALS['dbi']->escapeString($tablename) . "' "; } $sql_query .= " AND `version` = '" . $GLOBALS['dbi']->escapeString($version) . "' " . " ORDER BY `version` DESC LIMIT 1"; $mixed = $GLOBALS['dbi']->fetchAssoc(PMA_queryAsControlUser($sql_query)); // Parse log $log_schema_entries = explode('# log ', $mixed['schema_sql']); $log_data_entries = explode('# log ', $mixed['data_sql']); $ddl_date_from = $date = date('Y-m-d H:i:s'); $ddlog = array(); $first_iteration = true; // Iterate tracked data definition statements // For each log entry we want to get date, username and statement foreach ($log_schema_entries as $log_entry) { if (trim($log_entry) != '') { $date = mb_substr($log_entry, 0, 19); $username = mb_substr( $log_entry, 20, mb_strpos($log_entry, "\n") - 20 ); if ($first_iteration) { $ddl_date_from = $date; $first_iteration = false; } $statement = rtrim(mb_strstr($log_entry, "\n")); $ddlog[] = array( 'date' => $date, 'username'=> $username, 'statement' => $statement ); } } $date_from = $ddl_date_from; $ddl_date_to = $date; $dml_date_from = $date_from; $dmlog = array(); $first_iteration = true; // Iterate tracked data manipulation statements // For each log entry we want to get date, username and statement foreach ($log_data_entries as $log_entry) { if (trim($log_entry) != '') { $date = mb_substr($log_entry, 0, 19); $username = mb_substr( $log_entry, 20, mb_strpos($log_entry, "\n") - 20 ); if ($first_iteration) { $dml_date_from = $date; $first_iteration = false; } $statement = rtrim(mb_strstr($log_entry, "\n")); $dmlog[] = array( 'date' => $date, 'username' => $username, 'statement' => $statement ); } } $dml_date_to = $date; // Define begin and end of date range for both logs $data = array(); if (strtotime($ddl_date_from) <= strtotime($dml_date_from)) { $data['date_from'] = $ddl_date_from; } else { $data['date_from'] = $dml_date_from; } if (strtotime($ddl_date_to) >= strtotime($dml_date_to)) { $data['date_to'] = $ddl_date_to; } else { $data['date_to'] = $dml_date_to; } $data['ddlog'] = $ddlog; $data['dmlog'] = $dmlog; $data['tracking'] = $mixed['tracking']; $data['schema_snapshot'] = $mixed['schema_snapshot']; return $data; } /** * Parses a query. Gets * - statement identifier (UPDATE, ALTER TABLE, ...) * - type of statement, is it part of DDL or DML ? * - tablename * * @param string $query query * * @static * @todo: using PMA SQL Parser when possible * @todo: support multi-table/view drops * * @return mixed Array containing identifier, type and tablename. * */ static public function parseQuery($query) { // Usage of PMA_SQP does not work here // // require_once("libraries/sqlparser.lib.php"); // $parsed_sql = PMA_SQP_parse($query); // $sql_info = PMA_SQP_analyze($parsed_sql); $query = str_replace("\n", " ", $query); $query = str_replace("\r", " ", $query); $query = trim($query); $query = trim($query, ' -'); $tokens = explode(" ", $query); foreach ($tokens as $key => $value) { $tokens[$key] = mb_strtoupper($value); } // Parse USE statement, need it for SQL dump imports if (mb_substr($query, 0, 4) == 'USE ') { $prefix = explode('USE ', $query); $GLOBALS['db'] = self::getTableName($prefix[1]); } /* * DDL statements */ $result = array(); $result['type'] = 'DDL'; // Parse CREATE VIEW statement if (in_array('CREATE', $tokens) == true && in_array('VIEW', $tokens) == true && in_array('AS', $tokens) == true ) { $result['identifier'] = 'CREATE VIEW'; $index = array_search('VIEW', $tokens); $result['tablename'] = mb_strtolower( self::getTableName($tokens[$index + 1]) ); } // Parse ALTER VIEW statement if (in_array('ALTER', $tokens) == true && in_array('VIEW', $tokens) == true && in_array('AS', $tokens) == true && ! isset($result['identifier']) ) { $result['identifier'] = 'ALTER VIEW'; $index = array_search('VIEW', $tokens); $result['tablename'] = mb_strtolower( self::getTableName($tokens[$index + 1]) ); } // Parse DROP VIEW statement if (! isset($result['identifier']) && substr($query, 0, 10) == 'DROP VIEW ' ) { $result['identifier'] = 'DROP VIEW'; $prefix = explode('DROP VIEW ', $query); $str = str_replace('IF EXISTS', '', $prefix[1]); $result['tablename'] = self::getTableName($str); } // Parse CREATE DATABASE statement if (! isset($result['identifier']) && substr($query, 0, 15) == 'CREATE DATABASE' ) { $result['identifier'] = 'CREATE DATABASE'; $str = str_replace('CREATE DATABASE', '', $query); $str = str_replace('IF NOT EXISTS', '', $str); $prefix = explode('DEFAULT ', $str); $result['tablename'] = ''; $GLOBALS['db'] = self::getTableName($prefix[0]); } // Parse ALTER DATABASE statement if (! isset($result['identifier']) && substr($query, 0, 14) == 'ALTER DATABASE' ) { $result['identifier'] = 'ALTER DATABASE'; $result['tablename'] = ''; } // Parse DROP DATABASE statement if (! isset($result['identifier']) && substr($query, 0, 13) == 'DROP DATABASE' ) { $result['identifier'] = 'DROP DATABASE'; $str = str_replace('DROP DATABASE', '', $query); $str = str_replace('IF EXISTS', '', $str); $GLOBALS['db'] = self::getTableName($str); $result['tablename'] = ''; } // Parse CREATE TABLE statement if (! isset($result['identifier']) && substr($query, 0, 12) == 'CREATE TABLE' ) { $result['identifier'] = 'CREATE TABLE'; $query = str_replace('IF NOT EXISTS', '', $query); $prefix = explode('CREATE TABLE ', $query); $suffix = explode('(', $prefix[1]); $result['tablename'] = self::getTableName($suffix[0]); } // Parse ALTER TABLE statement if (! isset($result['identifier']) && substr($query, 0, 12) == 'ALTER TABLE ' ) { $result['identifier'] = 'ALTER TABLE'; $prefix = explode('ALTER TABLE ', $query); $suffix = explode(' ', $prefix[1]); $result['tablename'] = self::getTableName($suffix[0]); } // Parse DROP TABLE statement if (! isset($result['identifier']) && substr($query, 0, 11) == 'DROP TABLE ' ) { $result['identifier'] = 'DROP TABLE'; $prefix = explode('DROP TABLE ', $query); $str = str_replace('IF EXISTS', '', $prefix[1]); $result['tablename'] = self::getTableName($str); } // Parse CREATE INDEX statement if (! isset($result['identifier']) && (substr($query, 0, 12) == 'CREATE INDEX' || substr($query, 0, 19) == 'CREATE UNIQUE INDEX' || substr($query, 0, 20) == 'CREATE SPATIAL INDEX') ) { $result['identifier'] = 'CREATE INDEX'; $prefix = explode('ON ', $query); $suffix = explode('(', $prefix[1]); $result['tablename'] = self::getTableName($suffix[0]); } // Parse DROP INDEX statement if (! isset($result['identifier']) && substr($query, 0, 10) == 'DROP INDEX' ) { $result['identifier'] = 'DROP INDEX'; $prefix = explode('ON ', $query); $result['tablename'] = self::getTableName($prefix[1]); } // Parse RENAME TABLE statement if (! isset($result['identifier']) && substr($query, 0, 13) == 'RENAME TABLE ' ) { $result['identifier'] = 'RENAME TABLE'; $prefix = explode('RENAME TABLE ', $query); $names = explode(' TO ', $prefix[1]); $result['tablename'] = self::getTableName($names[0]); $result["tablename_after_rename"] = self::getTableName($names[1]); } /* * DML statements */ if (! isset($result['identifier'])) { $result["type"] = 'DML'; } // Parse UPDATE statement if (! isset($result['identifier']) && substr($query, 0, 6) == 'UPDATE' ) { $result['identifier'] = 'UPDATE'; $prefix = explode('UPDATE ', $query); $suffix = explode(' ', $prefix[1]); $result['tablename'] = self::getTableName($suffix[0]); } // Parse INSERT INTO statement if (! isset($result['identifier']) && substr($query, 0, 11) == 'INSERT INTO' ) { $result['identifier'] = 'INSERT'; $prefix = explode('INSERT INTO', $query); $suffix = explode('(', $prefix[1]); $result['tablename'] = self::getTableName($suffix[0]); } // Parse DELETE statement if (! isset($result['identifier']) && substr($query, 0, 6) == 'DELETE' ) { $result['identifier'] = 'DELETE'; $prefix = explode('FROM ', $query); $suffix = explode(' ', $prefix[1]); $result['tablename'] = self::getTableName($suffix[0]); } // Parse TRUNCATE statement if (! isset($result['identifier']) && substr($query, 0, 8) == 'TRUNCATE' ) { $result['identifier'] = 'TRUNCATE'; $prefix = explode('TRUNCATE', $query); $result['tablename'] = self::getTableName($prefix[1]); } return $result; } /** * Analyzes a given SQL statement and saves tracking data. * * @param string $query a SQL query * * @static * * @return void */ static public function handleQuery($query) { // If query is marked as untouchable, leave if (mb_strstr($query, "/*NOTRACK*/")) { return; } if (! (substr($query, -1) == ';')) { $query = $query . ";\n"; } // Get some information about query $result = self::parseQuery($query); // Get database name $dbname = trim(isset($GLOBALS['db']) ? $GLOBALS['db'] : '', '`'); // $dbname can be empty, for example when coming from Synchronize // and this is a query for the remote server if (empty($dbname)) { return; } // If we found a valid statement if (isset($result['identifier'])) { $version = self::getVersion( $dbname, $result['tablename'], $result['identifier'] ); // If version not exists and auto-creation is enabled if ($GLOBALS['cfg']['Server']['tracking_version_auto_create'] == true && self::isTracked($dbname, $result['tablename']) == false && $version == -1 ) { // Create the version switch ($result['identifier']) { case 'CREATE TABLE': self::createVersion($dbname, $result['tablename'], '1'); break; case 'CREATE VIEW': self::createVersion( $dbname, $result['tablename'], '1', '', true ); break; case 'CREATE DATABASE': self::createDatabaseVersion($dbname, '1', $query); break; } // end switch } // If version exists if (self::isTracked($dbname, $result['tablename']) && $version != -1) { if ($result['type'] == 'DDL') { $save_to = 'schema_sql'; } elseif ($result['type'] == 'DML') { $save_to = 'data_sql'; } else { $save_to = ''; } $date = date('Y-m-d H:i:s'); // Cut off `dbname`. from query $query = preg_replace( '/`' . preg_quote($dbname, '/') . '`\s?\./', '', $query ); // Add log information $query = self::getLogComment() . $query ; // Mark it as untouchable $sql_query = " /*NOTRACK*/\n" . " UPDATE " . self::_getTrackingTable() . " SET " . Util::backquote($save_to) . " = CONCAT( " . Util::backquote($save_to) . ",'\n" . $GLOBALS['dbi']->escapeString($query) . "') ," . " `date_updated` = '" . $date . "' "; // If table was renamed we have to change // the tablename attribute in pma_tracking too if ($result['identifier'] == 'RENAME TABLE') { $sql_query .= ', `table_name` = \'' . $GLOBALS['dbi']->escapeString($result['tablename_after_rename']) . '\' '; } // Save the tracking information only for // 1. the database // 2. the table / view // 3. the statements // we want to track $sql_query .= " WHERE FIND_IN_SET('" . $result['identifier'] . "',tracking) > 0" . " AND `db_name` = '" . $GLOBALS['dbi']->escapeString($dbname) . "' " . " AND `table_name` = '" . $GLOBALS['dbi']->escapeString($result['tablename']) . "' " . " AND `version` = '" . $GLOBALS['dbi']->escapeString($version) . "' "; PMA_queryAsControlUser($sql_query); } } } /** * Returns the tracking table * * @return string tracking table */ private static function _getTrackingTable() { $cfgRelation = PMA_getRelationsParam(); return Util::backquote($cfgRelation['db']) . '.' . Util::backquote($cfgRelation['tracking']); } }