2004-10-19 20:58:50 +02:00
< ? php
2012-08-02 10:07:55 +02:00
/* Copyright ( C ) 2003 Rodolphe Quiedeville < rodolphe @ quiedeville . org >
2021-08-04 13:05:07 +02:00
* Copyright ( C ) 2004 - 2021 Laurent Destailleur < eldy @ users . sourceforge . net >
2012-08-02 10:07:55 +02:00
* Copyright ( C ) 2004 Sebastien Di Cintio < sdicintio @ ressource - toi . org >
* Copyright ( C ) 2004 Benoit Mortier < benoit . mortier @ opensides . be >
2018-10-27 14:43:12 +02:00
* Copyright ( C ) 2005 - 2012 Regis Houssin < regis . houssin @ inodbox . com >
2024-09-18 03:27:25 +02:00
* Copyright ( C ) 2024 MDW < mdeweerd @ users . noreply . github . com >
2024-11-04 23:53:20 +01:00
* Copyright ( C ) 2024 Frédéric France < frederic . france @ free . fr >
2003-09-14 18:12:16 +02:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
2013-01-16 15:36:08 +01:00
* the Free Software Foundation ; either version 3 of the License , or
2003-09-14 18:12:16 +02:00
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2019-09-23 21:55:30 +02:00
* along with this program . If not , see < https :// www . gnu . org / licenses />.
2003-09-14 18:12:16 +02:00
*/
2004-09-04 13:19:13 +02:00
2008-10-27 21:34:31 +01:00
/**
2009-10-26 02:41:47 +01:00
* \file htdocs / admin / system / database - tables . php
2021-08-04 13:05:07 +02:00
* \brief Page with information on database tables . Add also some maintenance action to convert tables .
2008-10-27 21:34:31 +01:00
*/
2004-09-04 13:19:13 +02:00
2021-08-04 13:05:07 +02:00
if ( ! defined ( 'CSRFCHECK_WITH_TOKEN' )) {
define ( 'CSRFCHECK_WITH_TOKEN' , '1' ); // Force use of CSRF protection with tokens even for GET
}
2022-09-07 20:08:59 +02:00
// Load Dolibarr environment
2012-08-22 23:24:21 +02:00
require '../../main.inc.php' ;
2021-07-11 18:56:15 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php' ;
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
2003-09-14 18:12:16 +02:00
2024-11-04 23:53:20 +01:00
/**
* @ var Conf $conf
* @ var DoliDB $db
* @ var HookManager $hookmanager
* @ var Translate $langs
* @ var User $user
*/
2004-09-04 13:19:13 +02:00
$langs -> load ( " admin " );
2020-08-03 11:37:55 +02:00
if ( ! $user -> admin ) {
2012-08-02 10:07:55 +02:00
accessforbidden ();
2020-08-03 11:37:55 +02:00
}
2004-02-15 01:06:47 +01:00
2024-03-18 18:17:53 +01:00
$table = GETPOST ( 'table' , 'aZ09' );
2020-09-16 19:39:50 +02:00
$action = GETPOST ( 'action' , 'aZ09' );
2004-02-15 01:06:47 +01:00
2012-08-02 10:07:55 +02:00
2021-07-11 18:56:15 +02:00
/*
* Actions
*/
2024-03-18 18:17:53 +01:00
if ( $action == 'convert' ) { // Convert engine into innodb
$sql = " ALTER TABLE " . $db -> sanitize ( $table ) . " ENGINE=INNODB " ;
2019-05-21 14:33:28 +02:00
$db -> query ( $sql );
}
2021-02-26 22:04:03 +01:00
if ( $action == 'convertutf8' ) {
2024-09-30 23:11:31 +02:00
$collation = 'utf8_unicode_ci' ;
$defaultcollation = $db -> getDefaultCollationDatabase ();
if ( preg_match ( '/general/' , $defaultcollation )) {
$collation = 'utf8_general_ci' ;
}
$sql = " ALTER TABLE " . $db -> sanitize ( $table ) . " CHARACTER SET utf8 COLLATE " . $db -> sanitize ( $collation ); // Set the default value on table
2024-09-30 20:23:27 +02:00
$resql1 = $db -> query ( $sql );
if ( ! $resql1 ) {
setEventMessages ( $db -> lasterror (), null , 'warnings' );
} else {
2024-09-30 23:11:31 +02:00
$sql = " ALTER TABLE " . $db -> sanitize ( $table ) . " CONVERT TO CHARACTER SET utf8 COLLATE " . $db -> sanitize ( $collation ); // Switch fields (may fails due to foreign key)
2024-09-30 20:23:27 +02:00
$resql2 = $db -> query ( $sql );
if ( ! $resql2 ) {
setEventMessages ( $db -> lasterror (), null , 'warnings' );
}
}
2024-03-18 18:17:53 +01:00
}
if ( $action == 'convertutf8mb4' ) {
2024-09-30 23:11:31 +02:00
$collation = 'utf8mb4_unicode_ci' ;
$defaultcollation = $db -> getDefaultCollationDatabase ();
if ( preg_match ( '/general/' , $defaultcollation )) {
$collation = 'utf8mb4_general_ci' ;
}
$sql = " ALTER TABLE " . $db -> sanitize ( $table ) . " CHARACTER SET utf8mb4 COLLATE " . $db -> sanitize ( $collation ); // Set the default value on table
2024-09-30 20:23:27 +02:00
$resql1 = $db -> query ( $sql );
if ( ! $resql1 ) {
setEventMessages ( $db -> lasterror (), null , 'warnings' );
} else {
2024-09-30 23:11:31 +02:00
$sql = " ALTER TABLE " . $db -> sanitize ( $table ) . " CONVERT TO CHARACTER SET utf8mb4 COLLATE " . $db -> sanitize ( $collation ); // Switch fields (may fails due to foreign key)
2024-09-30 20:23:27 +02:00
$resql2 = $db -> query ( $sql );
if ( ! $resql2 ) {
setEventMessages ( $db -> lasterror (), null , 'warnings' );
}
}
2020-08-03 11:37:55 +02:00
}
2021-02-26 22:04:03 +01:00
if ( $action == 'convertdynamic' ) {
2024-03-18 18:17:53 +01:00
$sql = " ALTER TABLE " . $db -> sanitize ( $table ) . " ROW_FORMAT=DYNAMIC; " ;
2020-08-03 11:37:55 +02:00
$db -> query ( $sql );
2003-11-03 17:47:09 +01:00
}
2005-07-02 15:53:23 +02:00
2008-10-27 21:34:31 +01:00
/*
* View
*/
2024-06-08 17:03:08 +02:00
llxHeader ( '' , '' , '' , '' , 0 , 0 , '' , '' , '' , 'mod-admin page-database_tables' );
2005-07-02 15:53:23 +02:00
2019-01-27 11:55:16 +01:00
print load_fiche_titre ( $langs -> trans ( " Tables " ) . " " . ucfirst ( $conf -> db -> type ), '' , 'title_setup' );
2003-09-14 18:12:16 +02:00
2008-10-27 21:34:31 +01:00
// Define request to get table description
2019-11-14 12:09:15 +01:00
$base = 0 ;
2021-02-26 22:04:03 +01:00
if ( preg_match ( '/mysql/i' , $conf -> db -> type )) {
2008-10-27 21:34:31 +01:00
$sql = " SHOW TABLE STATUS " ;
2019-11-14 12:09:15 +01:00
$base = 1 ;
2021-02-26 22:04:03 +01:00
} elseif ( $conf -> db -> type == 'pgsql' ) {
2008-10-27 21:34:31 +01:00
$sql = " SELECT conname, contype FROM pg_constraint; " ;
2019-11-14 12:09:15 +01:00
$base = 2 ;
2021-02-26 22:04:03 +01:00
} elseif ( $conf -> db -> type == 'mssql' ) {
2007-09-02 09:59:50 +02:00
//$sqls[0] = "";
2008-10-27 21:34:31 +01:00
//$base=3;
2021-02-26 22:04:03 +01:00
} elseif ( $conf -> db -> type == 'sqlite' || $conf -> db -> type == 'sqlite3' ) {
2015-03-03 15:54:55 +01:00
//$sql = "SELECT name, type FROM sqlite_master";
$base = 4 ;
}
2004-09-14 23:14:20 +02:00
2005-07-08 22:51:19 +02:00
2021-02-26 22:04:03 +01:00
if ( ! $base ) {
2006-08-06 02:10:48 +02:00
print $langs -> trans ( " FeatureNotAvailableWithThisDatabaseDriver " );
2020-05-21 09:35:30 +02:00
} else {
2024-09-18 03:27:25 +02:00
$i = 0 ;
2021-02-26 22:04:03 +01:00
if ( $base == 1 ) {
2020-08-03 11:37:55 +02:00
print '<div class="div-table-responsive-no-min">' ;
print '<table class="noborder">' ;
2008-10-27 21:34:31 +01:00
print '<tr class="liste_titre">' ;
2021-07-11 18:56:15 +02:00
print '<td>#</td>' ;
2008-10-27 21:34:31 +01:00
print '<td>' . $langs -> trans ( " TableName " ) . '</td>' ;
print '<td colspan="2">' . $langs -> trans ( " Type " ) . '</td>' ;
print '<td>' . $langs -> trans ( " Format " ) . '</td>' ;
2019-01-21 22:36:14 +01:00
print '<td class="right">' . $langs -> trans ( " NbOfRecord " ) . '</td>' ;
print '<td class="right">Avg_row_length</td>' ;
print '<td class="right">Data_length</td>' ;
print '<td class="right">Max_Data_length</td>' ;
print '<td class="right">Index_length</td>' ;
print '<td class="right">Increment</td>' ;
print '<td class="right">Last check</td>' ;
print '<td class="right">Collation</td>' ;
2008-10-27 21:34:31 +01:00
print " </tr> \n " ;
2009-07-26 13:19:11 +02:00
2022-07-24 19:45:37 +02:00
$arrayoffilesrich = dol_dir_list ( DOL_DOCUMENT_ROOT . '/install/mysql/tables/' , 'files' , 0 , '\.sql$' );
$arrayoffiles = array ();
2023-03-15 15:17:34 +01:00
$arrayoftablesautocreated = array ();
2022-07-24 19:45:37 +02:00
foreach ( $arrayoffilesrich as $value ) {
//print $shortsqlfilename.' ';
$shortsqlfilename = preg_replace ( '/\-[a-z]+\./' , '.' , $value [ 'name' ]);
2023-03-15 15:17:34 +01:00
$arrayoffiles [ $value [ 'name' ]] = $shortsqlfilename ;
if ( $value [ 'name' ] == $shortsqlfilename && ! preg_match ( '/\.key\.sql$/' , $value [ 'name' ])) {
// This is a sql file automatically created
$arrayoftablesautocreated [ $value [ 'name' ]] = $shortsqlfilename ;
}
2022-07-24 19:45:37 +02:00
}
2023-03-15 15:17:34 +01:00
// Now loop on tables really found into database
2008-10-27 21:34:31 +01:00
$sql = " SHOW TABLE STATUS " ;
2009-07-26 13:19:11 +02:00
2008-10-27 21:34:31 +01:00
$resql = $db -> query ( $sql );
2021-02-26 22:04:03 +01:00
if ( $resql ) {
2008-10-27 21:34:31 +01:00
$num = $db -> num_rows ( $resql );
2019-11-14 12:09:15 +01:00
$i = 0 ;
2021-02-26 22:04:03 +01:00
while ( $i < $num ) {
2008-10-27 21:34:31 +01:00
$obj = $db -> fetch_object ( $resql );
2023-03-15 15:17:34 +01:00
2017-04-12 17:44:01 +02:00
print '<tr class="oddeven">' ;
2009-07-26 13:19:11 +02:00
2024-09-18 03:27:25 +02:00
print '<td>' . ( $i + 1 ) . '</td>' ;
2024-06-23 13:57:35 +02:00
print '<td class="tdoverflowmax300" title="' . dol_escape_htmltag ( $obj -> Name ) . '"><a href="dbtable.php?table=' . urlencode ( $obj -> Name ) . '">' . $obj -> Name . '</a>' ;
2021-07-11 18:56:15 +02:00
$tablename = preg_replace ( '/^' . MAIN_DB_PREFIX . '/' , 'llx_' , $obj -> Name );
2022-07-24 19:45:37 +02:00
if ( in_array ( $tablename . '.sql' , $arrayoffiles )) {
2023-03-15 15:17:34 +01:00
if ( in_array ( $tablename . '.sql' , $arrayoftablesautocreated )) {
$img = " info " ;
} else {
$img = " info_black " ;
print img_picto ( $langs -> trans ( " NotAvailableByDefaultEnabledOnModuleActivation " ), $img , 'class="small opacitymedium"' );
}
2021-07-11 18:56:15 +02:00
} else {
$img = " info_black " ;
print img_picto ( $langs -> trans ( " ExternalModule " ), $img , 'class="small"' );
}
print '</td>' ;
2008-10-27 21:34:31 +01:00
print '<td>' . $obj -> Engine . '</td>' ;
2020-08-03 14:44:01 +02:00
if ( isset ( $obj -> Engine ) && $obj -> Engine == " MyISAM " ) {
2021-08-04 13:05:07 +02:00
print '<td><a class="reposition" href="database-tables.php?action=convert&table=' . urlencode ( $obj -> Name ) . '&token=' . newToken () . '">' . $langs -> trans ( " Convert " ) . ' InnoDb</a></td>' ;
2020-05-21 09:35:30 +02:00
} else {
2008-10-27 21:34:31 +01:00
print '<td> </td>' ;
}
2020-08-03 11:37:55 +02:00
print '<td>' ;
print $obj -> Row_format ;
2020-08-03 14:44:01 +02:00
if ( isset ( $obj -> Row_format ) && ( in_array ( $obj -> Row_format , array ( " Compact " )))) {
2021-08-04 13:05:07 +02:00
print '<br><a class="reposition" href="database-tables.php?action=convertdynamic&table=' . urlencode ( $obj -> Name ) . '&token=' . newToken () . '">' . $langs -> trans ( " Convert " ) . ' Dynamic</a>' ;
2020-08-03 11:37:55 +02:00
}
print '</td>' ;
2024-03-18 18:17:53 +01:00
print '<td class="right">' . $obj -> Rows . '</td>' ;
print '<td class="right">' . $obj -> Avg_row_length . '</td>' ;
print '<td class="right">' . $obj -> Data_length . '</td>' ;
print '<td class="right">' . $obj -> Max_data_length . '</td>' ;
print '<td class="right">' . $obj -> Index_length . '</td>' ;
print '<td class="right">' . $obj -> Auto_increment . '</td>' ;
print '<td class="right">' . $obj -> Check_time . '</td>' ;
print '<td class="right nowraponall">' . $obj -> Collation ;
// Link to convert collation
if ( isset ( $obj -> Collation )) {
print '<br><span class="opacitymedium small">' . $langs -> trans ( " ConvertInto " );
if ( ! in_array ( $obj -> Collation , array ( " utf8_unicode_ci " ))) {
print ' <a class="reposition" href="database-tables.php?action=convertutf8&table=' . urlencode ( $obj -> Name ) . '&token=' . newToken () . '">utf8</a>' ;
}
if ( ! in_array ( $obj -> Collation , array ( " utf8mb4_unicode_ci " ))) {
print ' <a class="reposition" href="database-tables.php?action=convertutf8mb4&table=' . urlencode ( $obj -> Name ) . '&token=' . newToken () . '">utf8mb4</a>' ;
}
print '</span>' ;
2019-05-21 14:33:28 +02:00
}
print '</td>' ;
2008-10-27 21:34:31 +01:00
print '</tr>' ;
$i ++ ;
}
}
print '</table>' ;
2017-01-17 20:04:41 +01:00
print '</div>' ;
2006-08-06 02:10:48 +02:00
}
2008-10-27 21:34:31 +01:00
2021-02-26 22:04:03 +01:00
if ( $base == 2 ) {
2020-08-03 11:37:55 +02:00
print '<div class="div-table-responsive-no-min">' ;
print '<table class="noborder">' ;
2008-10-27 21:34:31 +01:00
print '<tr class="liste_titre">' ;
2021-07-11 18:56:15 +02:00
print '<td>#</td>' ;
2008-10-27 21:34:31 +01:00
print '<td>' . $langs -> trans ( " TableName " ) . '</td>' ;
2009-10-26 02:41:47 +01:00
print '<td>Nb of tuples</td>' ;
2008-10-27 21:34:31 +01:00
print '<td>Nb index fetcher.</td>' ;
2009-10-26 02:41:47 +01:00
print '<td>Nb tuples insert</td>' ;
print '<td>Nb tuples modify</td>' ;
print '<td>Nb tuples delete</td>' ;
2008-10-27 21:34:31 +01:00
print " </tr> \n " ;
2012-08-02 10:07:55 +02:00
$sql = " SELECT relname, seq_tup_read, idx_tup_fetch, n_tup_ins, n_tup_upd, n_tup_del " ;
2024-02-09 15:58:49 +01:00
$sql .= " FROM pg_stat_user_tables ORDER BY relname " ;
2009-07-26 13:19:11 +02:00
2008-10-27 21:34:31 +01:00
$resql = $db -> query ( $sql );
2021-02-26 22:04:03 +01:00
if ( $resql ) {
2008-10-27 21:34:31 +01:00
$num = $db -> num_rows ( $resql );
2019-11-14 12:09:15 +01:00
$i = 0 ;
2021-02-26 22:04:03 +01:00
while ( $i < $num ) {
2008-10-27 21:34:31 +01:00
$row = $db -> fetch_row ( $resql );
2017-04-12 17:44:01 +02:00
print '<tr class="oddeven">' ;
2024-09-18 03:27:25 +02:00
print '<td>' . ( $i + 1 ) . '</td>' ;
2009-10-26 02:41:47 +01:00
print '<td>' . $row [ 0 ] . '</td>' ;
2019-01-21 22:36:14 +01:00
print '<td class="right">' . $row [ 1 ] . '</td>' ;
print '<td class="right">' . $row [ 2 ] . '</td>' ;
print '<td class="right">' . $row [ 3 ] . '</td>' ;
print '<td class="right">' . $row [ 4 ] . '</td>' ;
print '<td class="right">' . $row [ 5 ] . '</td>' ;
2008-10-27 21:34:31 +01:00
print '</tr>' ;
$i ++ ;
}
}
print '</table>' ;
2017-01-17 20:04:41 +01:00
print '</div>' ;
2006-08-06 02:10:48 +02:00
}
2015-03-03 15:54:55 +01:00
2021-02-26 22:04:03 +01:00
if ( $base == 4 ) {
2015-03-11 03:03:17 +01:00
// Sqlite by PDO or by Sqlite3
2020-08-03 11:37:55 +02:00
print '<div class="div-table-responsive-no-min">' ;
print '<table class="noborder">' ;
2015-03-03 15:54:55 +01:00
print '<tr class="liste_titre">' ;
2021-07-11 18:56:15 +02:00
print '<td>#</td>' ;
2015-03-03 15:54:55 +01:00
print '<td>' . $langs -> trans ( " TableName " ) . '</td>' ;
2015-03-05 17:35:37 +01:00
print '<td>' . $langs -> trans ( " NbOfRecord " ) . '</td>' ;
2015-03-03 15:54:55 +01:00
print " </tr> \n " ;
$sql = " SELECT name, type FROM sqlite_master where type='table' and name not like 'sqlite%' ORDER BY name " ;
$resql = $db -> query ( $sql );
2021-02-26 22:04:03 +01:00
if ( $resql ) {
2015-03-03 15:54:55 +01:00
while ( $row = $db -> fetch_row ( $resql )) {
2019-11-14 12:09:15 +01:00
$rescount = $db -> query ( " SELECT COUNT(*) FROM " . $row [ 0 ]);
2015-03-03 15:54:55 +01:00
if ( $rescount ) {
$row_count = $db -> fetch_row ( $rescount );
$count = $row_count [ 0 ];
} else {
$count = '?' ;
}
2017-04-12 17:44:01 +02:00
print '<tr class="oddeven">' ;
2024-09-18 03:27:25 +02:00
print '<td>' . ( $i + 1 ) . '</td>' ;
2015-03-03 15:54:55 +01:00
print '<td>' . $row [ 0 ] . '</td>' ;
print '<td>' . $count . '</td>' ;
print '</tr>' ;
}
}
2017-01-17 20:04:41 +01:00
print '</table>' ;
print '</div>' ;
2015-03-03 15:54:55 +01:00
}
2006-08-06 02:10:48 +02:00
}
2018-07-28 14:29:28 +02:00
// End of page
2011-08-27 16:24:16 +02:00
llxFooter ();
2012-08-02 10:07:55 +02:00
$db -> close ();