/** * retrieves table info and stores it in $GLOBALS['PMD'] * * @uses $GLOBALS['script_display_field'] * @uses $GLOBALS['PMD'] to fill it * @uses $GLOBALS['db'] * @uses PMA_DBI_get_tables_full() * @uses PMA_DBI_select_db() * @uses PMA_getDisplayField() * @uses urlencode() * @uses htmlspecialchars() * @uses strtoupper() * @uses urlencode() */ function get_tabs() { $GLOBALS['PMD']['TABLE_NAME'] = array(); // that foreach no error $GLOBALS['PMD']['OWNER'] = array(); $GLOBALS['PMD']['TABLE_NAME_SMALL'] = array(); $tables = PMA_DBI_get_tables_full($GLOBALS['db']); // seems to be needed later PMA_DBI_select_db($GLOBALS['db']); $i = 0; foreach ($tables as $one_table) { $GLOBALS['PMD']['TABLE_NAME'][$i] = $GLOBALS['db'] . "." . $one_table['TABLE_NAME']; $GLOBALS['PMD']['OWNER'][$i] = $GLOBALS['db']; $GLOBALS['PMD']['TABLE_NAME_SMALL'][$i] = $one_table['TABLE_NAME']; $GLOBALS['PMD_URL']['TABLE_NAME'][$i] = urlencode($GLOBALS['db'] . "." . $one_table['TABLE_NAME']); $GLOBALS['PMD_URL']['OWNER'][$i] = urlencode($GLOBALS['db']); $GLOBALS['PMD_URL']['TABLE_NAME_SMALL'][$i] = urlencode($one_table['TABLE_NAME']); $GLOBALS['PMD_OUT']['TABLE_NAME'][$i] = htmlspecialchars($GLOBALS['db'] . "." . $one_table['TABLE_NAME'], ENT_QUOTES); $GLOBALS['PMD_OUT']['OWNER'][$i] = htmlspecialchars($GLOBALS['db'], ENT_QUOTES); $GLOBALS['PMD_OUT']['TABLE_NAME_SMALL'][$i] = htmlspecialchars($one_table['TABLE_NAME'], ENT_QUOTES); $GLOBALS['PMD']['TABLE_TYPE'][$i] = strtoupper($one_table['ENGINE']); $DF = PMA_getDisplayField($GLOBALS['db'], $one_table['TABLE_NAME']); if ($DF != '') { $GLOBALS['script_display_field'] .= " display_field['" . $GLOBALS['PMD_URL']["TABLE_NAME_SMALL"][$i] . "'] = '" . urlencode($DF) . "';\n"; } $i++; } $GLOBALS['script_display_field'] .= '// ]]>' . "\n" . '</script>' . "\n"; // return $GLOBALS['PMD']; // many bases // not use ?????? }
/** * retrieves table info and stores it in $GLOBALS['PMD'] * * @return array with table info */ function get_tables_info() { $retval = array(); $GLOBALS['PMD']['TABLE_NAME'] = array(); // that foreach no error $GLOBALS['PMD']['OWNER'] = array(); $GLOBALS['PMD']['TABLE_NAME_SMALL'] = array(); $tables = PMA_DBI_get_tables_full($GLOBALS['db']); // seems to be needed later PMA_DBI_select_db($GLOBALS['db']); $i = 0; foreach ($tables as $one_table) { $GLOBALS['PMD']['TABLE_NAME'][$i] = $GLOBALS['db'] . "." . $one_table['TABLE_NAME']; $GLOBALS['PMD']['OWNER'][$i] = $GLOBALS['db']; $GLOBALS['PMD']['TABLE_NAME_SMALL'][$i] = $one_table['TABLE_NAME']; $GLOBALS['PMD_URL']['TABLE_NAME'][$i] = urlencode($GLOBALS['db'] . "." . $one_table['TABLE_NAME']); $GLOBALS['PMD_URL']['OWNER'][$i] = urlencode($GLOBALS['db']); $GLOBALS['PMD_URL']['TABLE_NAME_SMALL'][$i] = urlencode($one_table['TABLE_NAME']); $GLOBALS['PMD_OUT']['TABLE_NAME'][$i] = htmlspecialchars($GLOBALS['db'] . "." . $one_table['TABLE_NAME'], ENT_QUOTES); $GLOBALS['PMD_OUT']['OWNER'][$i] = htmlspecialchars($GLOBALS['db'], ENT_QUOTES); $GLOBALS['PMD_OUT']['TABLE_NAME_SMALL'][$i] = htmlspecialchars($one_table['TABLE_NAME'], ENT_QUOTES); $GLOBALS['PMD']['TABLE_TYPE'][$i] = strtoupper($one_table['ENGINE']); $DF = PMA_getDisplayField($GLOBALS['db'], $one_table['TABLE_NAME']); if ($DF != '') { $retval[$GLOBALS['PMD_URL']["TABLE_NAME_SMALL"][$i]] = urlencode($DF); } $i++; } return $retval; }
/** * returns array with tables of given db with extended information and grouped * * @param string $db name of db * @param string $tables name of tables * @param integer $limit_offset list offset * @param int|bool $limit_count max tables to return * * @return array (recursive) grouped table list */ function PMA_getTableList($db, $tables = null, $limit_offset = 0, $limit_count = false) { $sep = $GLOBALS['cfg']['LeftFrameTableSeparator']; if (null === $tables) { $tables = PMA_DBI_get_tables_full($db, false, false, null, $limit_offset, $limit_count); if ($GLOBALS['cfg']['NaturalOrder']) { uksort($tables, 'strnatcasecmp'); } } if (count($tables) < 1) { return $tables; } $default = array('Name' => '', 'Rows' => 0, 'Comment' => '', 'disp_name' => ''); $table_groups = array(); // for blobstreaming - list of blobstreaming tables // load PMA configuration $PMA_Config = $GLOBALS['PMA_Config']; foreach ($tables as $table_name => $table) { // if BS tables exist if (PMA_BS_IsHiddenTable($table_name)) { continue; } // check for correct row count if (null === $table['Rows']) { // Do not check exact row count here, // if row count is invalid possibly the table is defect // and this would break left frame; // but we can check row count if this is a view or the // information_schema database // since PMA_Table::countRecords() returns a limited row count // in this case. // set this because PMA_Table::countRecords() can use it $tbl_is_view = $table['TABLE_TYPE'] == 'VIEW'; if ($tbl_is_view || PMA_is_system_schema($db)) { $table['Rows'] = PMA_Table::countRecords($db, $table['Name'], false, true); } } // in $group we save the reference to the place in $table_groups // where to store the table info if ($GLOBALS['cfg']['LeftFrameDBTree'] && $sep && strstr($table_name, $sep)) { $parts = explode($sep, $table_name); $group =& $table_groups; $i = 0; $group_name_full = ''; $parts_cnt = count($parts) - 1; while ($i < $parts_cnt && $i < $GLOBALS['cfg']['LeftFrameTableLevel']) { $group_name = $parts[$i] . $sep; $group_name_full .= $group_name; if (!isset($group[$group_name])) { $group[$group_name] = array(); $group[$group_name]['is' . $sep . 'group'] = true; $group[$group_name]['tab' . $sep . 'count'] = 1; $group[$group_name]['tab' . $sep . 'group'] = $group_name_full; } elseif (!isset($group[$group_name]['is' . $sep . 'group'])) { $table = $group[$group_name]; $group[$group_name] = array(); $group[$group_name][$group_name] = $table; unset($table); $group[$group_name]['is' . $sep . 'group'] = true; $group[$group_name]['tab' . $sep . 'count'] = 1; $group[$group_name]['tab' . $sep . 'group'] = $group_name_full; } else { $group[$group_name]['tab' . $sep . 'count']++; } $group =& $group[$group_name]; $i++; } } else { if (!isset($table_groups[$table_name])) { $table_groups[$table_name] = array(); } $group =& $table_groups; } if ($GLOBALS['cfg']['ShowTooltipAliasTB'] && $GLOBALS['cfg']['ShowTooltipAliasTB'] !== 'nested' && $table['Comment'] && $table['Comment'] != 'VIEW') { // switch tooltip and name $table['disp_name'] = $table['Comment']; $table['Comment'] = $table['Name']; } else { $table['disp_name'] = $table['Name']; } $group[$table_name] = array_merge($default, $table); } return $table_groups; }
/** * Counts and returns (or displays) the number of records in a table * * Revision 13 July 2001: Patch for limiting dump size from * vinay@sanisoft.com & girish@sanisoft.com * * @param string $db the current database name * @param string $table the current table name * @param bool $force_exact whether to force an exact count * @param bool $is_view whether the table is a view * * @return mixed the number of records if "retain" param is true, * otherwise true */ public static function countRecords($db, $table, $force_exact = false, $is_view = null) { if (isset(PMA_Table::$cache[$db][$table]['ExactRows'])) { $row_count = PMA_Table::$cache[$db][$table]['ExactRows']; } else { $row_count = false; if (null === $is_view) { $is_view = PMA_Table::isView($db, $table); } if (!$force_exact) { if (!isset(PMA_Table::$cache[$db][$table]['Rows']) && !$is_view) { $tmp_tables = PMA_DBI_get_tables_full($db, $table); if (isset($tmp_tables[$table])) { PMA_Table::$cache[$db][$table] = $tmp_tables[$table]; } } if (isset(PMA_Table::$cache[$db][$table]['Rows'])) { $row_count = PMA_Table::$cache[$db][$table]['Rows']; } else { $row_count = false; } } // for a VIEW, $row_count is always false at this point if (false === $row_count || $row_count < $GLOBALS['cfg']['MaxExactCount']) { // Make an exception for views in I_S and D_D schema in Drizzle, as these map to // in-memory data and should execute fast enough if (!$is_view || PMA_DRIZZLE && PMA_is_system_schema($db)) { $row_count = PMA_DBI_fetch_value('SELECT COUNT(*) FROM ' . PMA_backquote($db) . '.' . PMA_backquote($table)); } else { // For complex views, even trying to get a partial record // count could bring down a server, so we offer an // alternative: setting MaxExactCountViews to 0 will bypass // completely the record counting for views if ($GLOBALS['cfg']['MaxExactCountViews'] == 0) { $row_count = 0; } else { // Counting all rows of a VIEW could be too long, so use // a LIMIT clause. // Use try_query because it can fail (when a VIEW is // based on a table that no longer exists) $result = PMA_DBI_try_query('SELECT 1 FROM ' . PMA_backquote($db) . '.' . PMA_backquote($table) . ' LIMIT ' . $GLOBALS['cfg']['MaxExactCountViews'], null, PMA_DBI_QUERY_STORE); if (!PMA_DBI_getError()) { $row_count = PMA_DBI_num_rows($result); PMA_DBI_free_result($result); } } } PMA_Table::$cache[$db][$table]['ExactRows'] = $row_count; } } return $row_count; }
$myfieldname = 'Tables_in_' . htmlspecialchars($db); $table = $row[$myfieldname]; if ($cfgRelation['commwork'] || PMA_MYSQL_INT_VERSION >= 40100) { $comments = PMA_getComments($db, $table); } if ($count != 0) { echo '<div style="page-break-before: always;">' . "\n"; } else { echo '<div>' . "\n"; } echo '<h2>' . $table . '</h2>' . "\n"; /** * Gets table informations */ // The 'show table' statement works correct since 3.23.03 $showtable = PMA_DBI_get_tables_full($db, $table); $num_rows = isset($showtable[$table]['TABLE_ROWS']) ? $showtable[$table]['TABLE_ROWS'] : 0; $show_comment = isset($showtable[$table]['TABLE_COMMENT']) ? $showtable[$table]['TABLE_COMMENT'] : ''; unset($showtable); /** * Gets table keys and retains them */ PMA_DBI_select_db($db); $result = PMA_DBI_query('SHOW KEYS FROM ' . PMA_backquote($table) . ';'); $primary = ''; $indexes = array(); $lastIndex = ''; $indexes_info = array(); $indexes_data = array(); $pk_array = array(); // will be use to emphasis prim. keys in the table
/** * Get VIEWs in a particular database * * @param string $db Database name to look in * * @return array $views Set of VIEWs inside the database */ function PMA_DBI_getVirtualTables($db) { $tables_full = PMA_DBI_get_tables_full($db); $views = array(); foreach ($tables_full as $table => $tmp) { if (PMA_Table::isView($db, $table)) { $views[] = $table; } } return $views; }
<?php /* $Id: pmd_relation_new.php 9828 2007-01-05 17:30:36Z lem9 $ */ // vim: expandtab sw=4 ts=4 sts=4: include_once 'pmd_common.php'; $die_save_pos = 0; include_once 'pmd_save_pos.php'; require_once './libraries/relation.lib.php'; extract($_POST); $tables = PMA_DBI_get_tables_full($db, $T1); $type_T1 = strtoupper($tables[$T1]['ENGINE']); $tables = PMA_DBI_get_tables_full($db, $T2); //print_r($tables); //die(); $type_T2 = strtoupper($tables[$T2]['ENGINE']); // I n n o D B if ($type_T1 == 'INNODB' and $type_T2 == 'INNODB') { // relation exists? $existrel_innodb = PMA_getForeigners($db, $T2, '', 'innodb'); if (isset($existrel_innodb[$F2]) && isset($existrel_innodb[$F2]['constraint'])) { PMD_return(0, 'strErrorRelationExists'); } // note: in InnoDB, the index does not requires to be on a PRIMARY // or UNIQUE key // improve: check all other requirements for InnoDB relations $result = PMA_DBI_query('SHOW INDEX FROM ' . PMA_backquote($T1) . ';'); $index_array1 = array(); // will be use to emphasis prim. keys in the table view while ($row = PMA_DBI_fetch_assoc($result)) { $index_array1[$row['Column_name']] = 1; }
/** * Counts and returns (or displays) the number of records in a table * * Revision 13 July 2001: Patch for limiting dump size from * vinay@sanisoft.com & girish@sanisoft.com * * @param string the current database name * @param string the current table name * @param boolean whether to force an exact count * * @return mixed the number of records if "retain" param is true, * otherwise true * * @access public */ public static function countRecords($db, $table, $force_exact = false, $is_view = null) { if (isset(PMA_Table::$cache[$db][$table]['ExactRows'])) { $row_count = PMA_Table::$cache[$db][$table]['ExactRows']; } else { $row_count = false; if (null === $is_view) { $is_view = PMA_Table::isView($db, $table); } if (!$force_exact) { if (!isset(PMA_Table::$cache[$db][$table]['Rows']) && !$is_view) { $tmp_tables = PMA_DBI_get_tables_full($db, $table); if (isset($tmp_tables[$table])) { PMA_Table::$cache[$db][$table] = $tmp_tables[$table]; } } if (isset(PMA_Table::$cache[$db][$table]['Rows'])) { $row_count = PMA_Table::$cache[$db][$table]['Rows']; } else { $row_count = false; } } // for a VIEW, $row_count is always false at this point if (false === $row_count || $row_count < $GLOBALS['cfg']['MaxExactCount']) { if (!$is_view) { //print_r($GLOBALS['cfg']['Server']); if ($db && $db != 'undefined' && $db != strtoupper($GLOBALS['cfg']['Server']['user'])) { $row_count = PMA_DBI_fetch_value('SELECT COUNT(*) FROM ' . PMA_backquote($db) . '.' . PMA_backquote(strtoupper($table))); } else { $row_count = PMA_DBI_fetch_value('SELECT COUNT(*) FROM ' . PMA_backquote(strtoupper($table))); } } else { // For complex views, even trying to get a partial record // count could bring down a server, so we offer an // alternative: setting MaxExactCountViews to 0 will bypass // completely the record counting for views if ($GLOBALS['cfg']['MaxExactCountViews'] == 0) { $row_count = 0; } else { // Counting all rows of a VIEW could be too long, so use // a LIMIT clause. // Use try_query because it can fail (when a VIEW is // based on a table that no longer exists) $result = PMA_DBI_try_query('SELECT 1 FROM ' . PMA_backquote($db) . '.' . PMA_backquote($table) . ' LIMIT ' . $GLOBALS['cfg']['MaxExactCountViews'], null, PMA_DBI_QUERY_STORE); //print_r('xxxxyyy'); if (!PMA_DBI_getError()) { $row_count = PMA_DBI_num_rows($result); PMA_DBI_free_result($result); } } } PMA_Table::$cache[$db][$table]['ExactRows'] = $row_count; } } return $row_count; }
// - get the total number of tables // (needed for proper working of the MaxTableList feature) $tables = PMA_DBI_get_tables($db); $total_num_tables = count($tables); if (isset($sub_part) && $sub_part == '_export') { // (don't fetch only a subset if we are coming from db_export.php, // because I think it's too risky to display only a subset of the // table names when exporting a db) /** * * @todo Page selector for table names? */ $tables = PMA_DBI_get_tables_full($db, false, false, null, 0, false, $sort, $sort_order); } else { // fetch the details for a possible limited subset $tables = PMA_DBI_get_tables_full($db, false, false, null, $pos, true, $sort, $sort_order); } } if ($cfg['ShowTooltip']) { foreach ($tables as $each_table) { PMA_fillTooltip($tooltip_truename, $tooltip_aliasname, $each_table); } } } /** * @global int count of tables in db */ $num_tables = count($tables); // (needed for proper working of the MaxTableList feature) if (!isset($total_num_tables)) { $total_num_tables = $num_tables;
/** * process internal and foreign key relations * * @param string $db The database name * @param integer $pageNumber document number/Id * @param array $cfgRelation relation settings * * @return void * @access private */ public function processRelations($db, $pageNumber, $cfgRelation) { /* * A u t o m a t i c l a y o u t * * There are 2 kinds of relations in PMA * 1) Internal Relations 2) Foreign Key Relations */ if (isset($this->autoLayoutInternal) || isset($this->autoLayoutForeign)) { $all_tables = array(); } if (isset($this->autoLayoutForeign)) { /* * get the tables list * who support FOREIGN KEY, it's not * important that we group together InnoDB tables * and PBXT tables, as this logic is just to put * the tables on the layout, not to determine relations */ $tables = PMA_DBI_get_tables_full($db); $foreignkey_tables = array(); foreach ($tables as $table_name => $table_properties) { if (PMA_foreignkey_supported($table_properties['ENGINE'])) { $foreignkey_tables[] = $table_name; } } $all_tables = $foreignkey_tables; /* * could be improved by finding the tables which have the * most references keys and placing them at the beginning * of the array (so that they are all center of schema) */ unset($tables, $foreignkey_tables); } if (isset($this->autoLayoutInternal)) { /* * get the tables list who support Internal Relations; * This type of relations will be created when * you setup the PMA tables correctly */ $master_tables = 'SELECT COUNT(master_table), master_table' . ' FROM ' . PMA_backquote($GLOBALS['cfgRelation']['db']) . '.' . PMA_backquote($cfgRelation['relation']) . ' WHERE master_db = \'' . PMA_sqlAddSlashes($db) . '\'' . ' GROUP BY master_table' . ' ORDER BY COUNT(master_table) DESC'; $master_tables_rs = PMA_query_as_controluser($master_tables, false, PMA_DBI_QUERY_STORE); if ($master_tables_rs && PMA_DBI_num_rows($master_tables_rs) > 0) { /* first put all the master tables at beginning * of the list, so they are near the center of * the schema */ while (list(, $master_table) = PMA_DBI_fetch_row($master_tables_rs)) { $all_tables[] = $master_table; } /* Now for each master, add its foreigns into an array * of foreign tables, if not already there * (a foreign might be foreign for more than * one table, and might be a master itself) */ $foreign_tables = array(); foreach ($all_tables as $master_table) { $foreigners = PMA_getForeigners($db, $master_table); foreach ($foreigners as $foreigner) { if (!in_array($foreigner['foreign_table'], $foreign_tables)) { $foreign_tables[] = $foreigner['foreign_table']; } } } /* * Now merge the master and foreign arrays/tables */ foreach ($foreign_tables as $foreign_table) { if (!in_array($foreign_table, $all_tables)) { $all_tables[] = $foreign_table; } } } } if (isset($this->autoLayoutInternal) || isset($this->autoLayoutForeign)) { $this->addRelationCoordinates($all_tables, $pageNumber, $db, $cfgRelation); } $this->chosenPage = $pageNumber; }
// all tables in db // - get the total number of tables $tables = PMA_DBI_get_tables($db); $total_num_tables = count($tables); if (isset($sub_part) && $sub_part == '_export') { // (don't fetch only a subset if we are coming from db_export.php, // because I think it's too risky to display only a subset of the // table names when exporting a db) /** * * @todo Page selector for table names? */ $tables = PMA_DBI_get_tables_full($db, false, false, null, 0, false); } else { // fetch the details for a possible limited subset $tables = PMA_DBI_get_tables_full($db, false, false, null, $pos, true); } } if ($cfg['ShowTooltip']) { foreach ($tables as $each_table) { PMA_fillTooltip($tooltip_truename, $tooltip_aliasname, $each_table); } } } /** * @global int count of tables in db */ $num_tables = count($tables); if (!isset($total_num_tables)) { $total_num_tables = $num_tables; }
/** * returns array with tables of given db with extended infomation and grouped * * @uses $GLOBALS['cfg']['LeftFrameTableSeparator'] * @uses $GLOBALS['cfg']['LeftFrameTableLevel'] * @uses $GLOBALS['cfg']['ShowTooltipAliasTB'] * @uses $GLOBALS['cfg']['NaturalOrder'] * @uses PMA_DBI_fetch_result() * @uses PMA_backquote() * @uses count() * @uses array_merge * @uses uksort() * @uses strstr() * @uses explode() * @param string $db name of db * return array (rekursive) grouped table list */ function PMA_getTableList($db, $tables = null) { $sep = $GLOBALS['cfg']['LeftFrameTableSeparator']; if (null === $tables) { $tables = PMA_DBI_get_tables_full($db); if ($GLOBALS['cfg']['NaturalOrder']) { uksort($tables, 'strnatcasecmp'); } } if (count($tables) < 1) { return $tables; } $default = array('Name' => '', 'Rows' => 0, 'Comment' => '', 'disp_name' => ''); $table_groups = array(); foreach ($tables as $table_name => $table) { // check for correct row count if (null === $table['Rows']) { // Do not check exact row count here, // if row count is invalid possibly the table is defect // and this would break left frame; // but we can check row count if this is a view, // since PMA_Table::countRecords() returns a limited row count // in this case. // set this because PMA_Table::countRecords() can use it $tbl_is_view = PMA_Table::isView($db, $table['Name']); if ($tbl_is_view) { $table['Rows'] = PMA_Table::countRecords($db, $table['Name'], $return = true); } } // in $group we save the reference to the place in $table_groups // where to store the table info if ($GLOBALS['cfg']['LeftFrameDBTree'] && $sep && strstr($table_name, $sep)) { $parts = explode($sep, $table_name); $group =& $table_groups; $i = 0; $group_name_full = ''; while ($i < count($parts) - 1 && $i < $GLOBALS['cfg']['LeftFrameTableLevel']) { $group_name = $parts[$i] . $sep; $group_name_full .= $group_name; if (!isset($group[$group_name])) { $group[$group_name] = array(); $group[$group_name]['is' . $sep . 'group'] = true; $group[$group_name]['tab' . $sep . 'count'] = 1; $group[$group_name]['tab' . $sep . 'group'] = $group_name_full; } elseif (!isset($group[$group_name]['is' . $sep . 'group'])) { $table = $group[$group_name]; $group[$group_name] = array(); $group[$group_name][$group_name] = $table; unset($table); $group[$group_name]['is' . $sep . 'group'] = true; $group[$group_name]['tab' . $sep . 'count'] = 1; $group[$group_name]['tab' . $sep . 'group'] = $group_name_full; } else { $group[$group_name]['tab' . $sep . 'count']++; } $group =& $group[$group_name]; $i++; } } else { if (!isset($table_groups[$table_name])) { $table_groups[$table_name] = array(); } $group =& $table_groups; } if ($GLOBALS['cfg']['ShowTooltipAliasTB'] && $GLOBALS['cfg']['ShowTooltipAliasTB'] !== 'nested') { // switch tooltip and name $table['Comment'] = $table['Name']; $table['disp_name'] = $table['Comment']; } else { $table['disp_name'] = $table['Name']; } $group[$table_name] = array_merge($default, $table); } return $table_groups; }
/** * returns array with tables of given db with extended information and grouped * * @uses $cfg['LeftFrameTableSeparator'] * @uses $cfg['LeftFrameTableLevel'] * @uses $cfg['ShowTooltipAliasTB'] * @uses $cfg['NaturalOrder'] * @uses PMA_backquote() * @uses count() * @uses array_merge * @uses uksort() * @uses strstr() * @uses explode() * @param string $db name of db * @param string $tables name of tables * @param integer $limit_offset list offset * @param integer $limit_count max tables to return * return array (recursive) grouped table list */ function PMA_getTableList($db, $tables = null, $limit_offset = 0, $limit_count = false) { $sep = $GLOBALS['cfg']['LeftFrameTableSeparator']; if (null === $tables) { $tables = PMA_DBI_get_tables_full($db, false, false, null, $limit_offset, $limit_count); if ($GLOBALS['cfg']['NaturalOrder']) { uksort($tables, 'strnatcasecmp'); } } if (count($tables) < 1) { return $tables; } $default = array('Name' => '', 'Rows' => 0, 'Comment' => '', 'disp_name' => ''); $table_groups = array(); // for blobstreaming - list of blobstreaming tables - rajk // load PMA configuration $PMA_Config = $_SESSION['PMA_Config']; // if PMA configuration exists if (!empty($PMA_Config)) { $session_bs_tables = $_SESSION['PMA_Config']->get('BLOBSTREAMING_TABLES'); } foreach ($tables as $table_name => $table) { // if BS tables exist if (isset($session_bs_tables)) { // compare table name to tables in list of blobstreaming tables foreach ($session_bs_tables as $table_key => $table_val) { // if table is in list, skip outer foreach loop if ($table_name == $table_key) { continue 2; } } } // check for correct row count if (null === $table['Rows']) { // Do not check exact row count here, // if row count is invalid possibly the table is defect // and this would break left frame; // but we can check row count if this is a view or the // information_schema database // since PMA_Table::countRecords() returns a limited row count // in this case. // set this because PMA_Table::countRecords() can use it $tbl_is_view = PMA_Table::isView($db, $table['Name']); if ($tbl_is_view || 'information_schema' == $db) { $table['Rows'] = PMA_Table::countRecords($db, $table['Name'], $return = true); } } // in $group we save the reference to the place in $table_groups // where to store the table info if ($GLOBALS['cfg']['LeftFrameDBTree'] && $sep && strstr($table_name, $sep)) { $parts = explode($sep, $table_name); $group =& $table_groups; $i = 0; $group_name_full = ''; while ($i < count($parts) - 1 && $i < $GLOBALS['cfg']['LeftFrameTableLevel']) { $group_name = $parts[$i] . $sep; $group_name_full .= $group_name; if (!isset($group[$group_name])) { $group[$group_name] = array(); $group[$group_name]['is' . $sep . 'group'] = true; $group[$group_name]['tab' . $sep . 'count'] = 1; $group[$group_name]['tab' . $sep . 'group'] = $group_name_full; } elseif (!isset($group[$group_name]['is' . $sep . 'group'])) { $table = $group[$group_name]; $group[$group_name] = array(); $group[$group_name][$group_name] = $table; unset($table); $group[$group_name]['is' . $sep . 'group'] = true; $group[$group_name]['tab' . $sep . 'count'] = 1; $group[$group_name]['tab' . $sep . 'group'] = $group_name_full; } else { $group[$group_name]['tab' . $sep . 'count']++; } $group =& $group[$group_name]; $i++; } } else { if (!isset($table_groups[$table_name])) { $table_groups[$table_name] = array(); } $group =& $table_groups; } if ($GLOBALS['cfg']['ShowTooltipAliasTB'] && $GLOBALS['cfg']['ShowTooltipAliasTB'] !== 'nested') { // switch tooltip and name $table['Comment'] = $table['Name']; $table['disp_name'] = $table['Comment']; } else { $table['disp_name'] = $table['Name']; } $group[$table_name] = array_merge($default, $table); } return $table_groups; }
/** * returns array with tables of given db with extended information and grouped * * @param string $db name of db * @param string $tables name of tables * @param integer $limit_offset list offset * @param int|bool $limit_count max tables to return * * @return array (recursive) grouped table list */ public static function getTableList( $db, $tables = null, $limit_offset = 0, $limit_count = false ) { $sep = $GLOBALS['cfg']['NavigationTreeTableSeparator']; if ($tables === null) { $tables = PMA_DBI_get_tables_full( $db, false, false, null, $limit_offset, $limit_count ); if ($GLOBALS['cfg']['NaturalOrder']) { uksort($tables, 'strnatcasecmp'); } } if (count($tables) < 1) { return $tables; } $default = array( 'Name' => '', 'Rows' => 0, 'Comment' => '', 'disp_name' => '', ); $table_groups = array(); foreach ($tables as $table_name => $table) { // check for correct row count if ($table['Rows'] === null) { // Do not check exact row count here, // if row count is invalid possibly the table is defect // and this would break left frame; // but we can check row count if this is a view or the // information_schema database // since PMA_Table::countRecords() returns a limited row count // in this case. // set this because PMA_Table::countRecords() can use it $tbl_is_view = $table['TABLE_TYPE'] == 'VIEW'; if ($tbl_is_view || PMA_is_system_schema($db)) { $table['Rows'] = PMA_Table::countRecords( $db, $table['Name'], false, true ); } } // in $group we save the reference to the place in $table_groups // where to store the table info if ($GLOBALS['cfg']['NavigationTreeEnableGrouping'] && $sep && strstr($table_name, $sep) ) { $parts = explode($sep, $table_name); $group =& $table_groups; $i = 0; $group_name_full = ''; $parts_cnt = count($parts) - 1; while (($i < $parts_cnt) && ($i < $GLOBALS['cfg']['NavigationTreeTableLevel']) ) { $group_name = $parts[$i] . $sep; $group_name_full .= $group_name; if (! isset($group[$group_name])) { $group[$group_name] = array(); $group[$group_name]['is' . $sep . 'group'] = true; $group[$group_name]['tab' . $sep . 'count'] = 1; $group[$group_name]['tab' . $sep . 'group'] = $group_name_full; } elseif (! isset($group[$group_name]['is' . $sep . 'group'])) { $table = $group[$group_name]; $group[$group_name] = array(); $group[$group_name][$group_name] = $table; unset($table); $group[$group_name]['is' . $sep . 'group'] = true; $group[$group_name]['tab' . $sep . 'count'] = 1; $group[$group_name]['tab' . $sep . 'group'] = $group_name_full; } else { $group[$group_name]['tab' . $sep . 'count']++; } $group =& $group[$group_name]; $i++; } } else { if (! isset($table_groups[$table_name])) { $table_groups[$table_name] = array(); } $group =& $table_groups; } $table['disp_name'] = $table['Name']; $group[$table_name] = array_merge($default, $table); } return $table_groups; }
/** * Returns full table status info, or specific if $info provided * * this info is collected from information_schema * * @todo PMA_DBI_get_tables_full needs to be merged somehow into this class or at least better documented * @param string $db * @param string $table * @param string $info * @param boolean $force_read * @return mixed */ public static function sGetStatusInfo($db, $table, $info = null, $force_read = false) { if (!isset(PMA_Table::$cache[$db][$table]) || $force_read) { PMA_DBI_get_tables_full($db, $table); } if (!isset(PMA_Table::$cache[$db][$table])) { // happens when we enter the table creation dialog // or when we really did not get any status info, for example // when $table == 'TABLE_NAMES' after the user tried SHOW TABLES return ''; } if (null === $info) { return PMA_Table::$cache[$db][$table]; } if (!isset(PMA_Table::$cache[$db][$table][$info])) { trigger_error('unknown table status: ' . $info, E_USER_WARNING); return false; } return PMA_Table::$cache[$db][$table][$info]; }
/** * loads structure data */ function loadStructure() { $table_info = PMA_DBI_get_tables_full($this->getDbName(), $this->getName()); if (false === $table_info) { return false; } $this->settings = $table_info; if ($this->get('TABLE_ROWS') === null) { $this->set('TABLE_ROWS', PMA_Table::countRecords($this->getDbName(), $this->getName(), true, true)); } $create_options = explode(' ', $this->get('TABLE_ROWS')); // export create options by its name as variables into gloabel namespace // f.e. pack_keys=1 becomes available as $pack_keys with value of '1' foreach ($create_options as $each_create_option) { $each_create_option = explode('=', $each_create_option); if (isset($each_create_option[1])) { $this->set(${$each_create_option}[0], $each_create_option[1]); } } }
/** * displays collapsable db list * * @uses $_REQUEST['dbgroup'] * @uses $GLOBALS['cfg']['DefaultTabDatabase'] * @uses $GLOBALS['strSelectADb'] * @uses strpos() * @uses urlencode() * @uses printf() * @uses htmlspecialchars() * @uses PMA_generate_common_url() * @uses PMA_getTableList() * @uses PMA_displayTableList() * @global $element_counter * @global $img_minus * @global $img_plus * @global $href_left * @global $db_start * @global $common_url_query * @param array $ext_dblist extended db list */ function PMA_displayDbList($ext_dblist) { global $element_counter, $img_minus, $img_plus, $href_left, $db_start, $common_url_query; // get table list, for all databases // doing this in one step takes advantage of a single query with information_schema! $tables_full = PMA_DBI_get_tables_full($GLOBALS['PMA_List_Database']->items); $url_dbgroup = ''; echo '<ul id="leftdatabaselist">'; $close_db_group = false; foreach ($ext_dblist as $group => $db_group) { if ($GLOBALS['PMA_List_Database']->count() > 1) { if ($close_db_group) { $url_dbgroup = ''; echo '</ul>'; echo '</li>'; $close_db_group = false; } if (count($db_group) > 1) { $close_db_group = true; $url_dbgroup = '&dbgroup=' . urlencode($group); $common_url_query = PMA_generate_common_url() . $url_dbgroup; $element_counter++; echo '<li class="dbgroup">'; if (!empty($_REQUEST['dbgroup']) && $_REQUEST['dbgroup'] == $group || $db_start == $group || strpos($db_start, $group) === 0) { // display + only if this db(group) is not preselected printf($href_left, $element_counter, PMA_generate_common_url()); printf($img_minus, $element_counter); } else { printf($href_left, $element_counter, $common_url_query); printf($img_plus, $element_counter); } echo '</a> ' . $group . "\n"; if (!empty($_REQUEST['dbgroup']) && $_REQUEST['dbgroup'] == $group || $db_start == $group || strpos($db_start, $group) === 0) { echo '<ul id="subel' . $element_counter . '">' . "\n"; } else { echo '<ul id="subel' . $element_counter . '"' . ' style="display: none">' . "\n"; } } } foreach ($db_group as $db) { $common_url_query = PMA_generate_common_url($db['name']) . $url_dbgroup; $element_counter++; // Displays the database name echo '<li>' . "\n"; if ($GLOBALS['PMA_List_Database']->count() > 1) { // only with more than one db we need collapse ... if ($db_start != $db['name'] || $db['num_tables'] < 1) { // display + only if this db is not preselected // or table count is 0 printf($href_left, $element_counter, $common_url_query); printf($img_plus, $element_counter); } else { printf($href_left, $element_counter, PMA_generate_common_url() . $url_dbgroup); printf($img_minus, $element_counter); } echo '</a>'; // ... and we need to refresh both frames on db selection ?> <a class="item" id="<?php echo htmlspecialchars($db['name']); ?> " href="index.php?<?php echo $common_url_query; ?> " target="_parent" title="<?php echo htmlspecialchars($db['comment']); ?> " onclick=" if (! toggle('<?php echo $element_counter; ?> ', true)) window.parent.goTo('./navigation.php?<?php echo $common_url_query; ?> '); window.parent.goTo('./<?php echo $GLOBALS['cfg']['DefaultTabDatabase'] . '?' . $common_url_query; ?> ', 'main'); return false;"> <?php if ($GLOBALS['text_dir'] === 'rtl') { echo ' <bdo dir="ltr">(' . $db['num_tables'] . ')</bdo> '; } echo htmlspecialchars($db['disp_name']); if ($GLOBALS['text_dir'] === 'ltr') { echo ' <bdo dir="ltr">(' . $db['num_tables'] . ')</bdo> '; } ?> </a> <?php } else { // with only 1 db available we dont need to refresh left frame // on db selection, only phpmain ?> <a href="<?php echo $GLOBALS['cfg']['DefaultTabDatabase'] . '?' . $common_url_query; ?> " id="<?php echo htmlspecialchars($db['name']); ?> " title="<?php echo htmlspecialchars($db['comment']); ?> "> <?php if ($GLOBALS['text_dir'] === 'rtl') { echo ' <bdo dir="ltr">(' . $db['num_tables'] . ')</bdo> '; } echo htmlspecialchars($db['disp_name']); if ($GLOBALS['text_dir'] === 'ltr') { echo ' <bdo dir="ltr">(' . $db['num_tables'] . ')</bdo> '; } ?> </a> <?php } if ($db['num_tables']) { if (isset($tables_full[$db['name']])) { $tables = PMA_getTableList($db['name'], $tables_full[$db['name']]); } elseif (isset($tables_full[strtolower($db['name'])])) { // on windows with lower_case_table_names = 1 // MySQL returns // with SHOW DATABASES or information_schema.SCHEMATA: `Test` // but information_schema.TABLES gives `test` // bug #1436171 // sf.net/tracker/?func=detail&aid=1436171&group_id=23067&atid=377408 $tables = PMA_getTableList($db['name'], $tables_full[strtolower($db['name'])]); } else { $tables = PMA_getTableList($db['name']); } $child_visible = (bool) ($GLOBALS['PMA_List_Database']->count() === 1 || $db_start == $db['name']); PMA_displayTableList($tables, $child_visible, '', $db['name']); } elseif ($GLOBALS['cfg']['LeftFrameLight']) { // no tables and LeftFrameLight: // display message no tables in selected db echo '<p>' . $GLOBALS['strSelectADb'] . '</p>' . "\n"; } echo '</li>' . "\n"; } // end foreach db } // end foreach group if ($close_db_group) { $url_dbgroup = ''; echo '</ul>'; echo '</li>'; $close_db_group = false; } echo '</ul>' . "\n"; }
case 'createpage': if (!isset($newpage) || $newpage == '') { $newpage = $strNoDescription; } $ins_query = 'INSERT INTO ' . PMA_backquote($GLOBALS['cfgRelation']['db']) . '.' . PMA_backquote($cfgRelation['pdf_pages']) . ' (db_name, page_descr)' . ' VALUES (\'' . PMA_sqlAddslashes($db) . '\', \'' . PMA_sqlAddslashes($newpage) . '\')'; PMA_query_as_cu($ins_query, FALSE, $query_default_option); // A u t o m a t i c l a y o u t // ================================ if (isset($auto_layout_internal) || isset($auto_layout_innodb)) { // save the page number $pdf_page_number = PMA_DBI_insert_id(isset($controllink) ? $controllink : ''); $all_tables = array(); } if (isset($auto_layout_innodb)) { // get the tables list $tables = PMA_DBI_get_tables_full($db); // find the InnoDB ones $innodb_tables = array(); foreach ($tables as $table_name => $table_properties) { if ($table_properties['ENGINE'] == 'InnoDB') { $innodb_tables[] = $table_name; } } $all_tables = $innodb_tables; // could be improved by finding the tables which have the // most references keys and place them at the beginning // of the array (so that they are all center of schema) unset($tables, $innodb_tables); } // endif auto_layout_innodb if (isset($auto_layout_internal)) {
/** * returns array with tables of given db with extended infomation and grouped * * @uses $GLOBALS['cfg']['LeftFrameTableSeparator'] * @uses $GLOBALS['cfg']['LeftFrameTableLevel'] * @uses $GLOBALS['cfg']['ShowTooltipAliasTB'] * @uses $GLOBALS['cfg']['NaturalOrder'] * @uses PMA_DBI_fetch_result() * @uses PMA_backquote() * @uses count() * @uses array_merge * @uses uksort() * @uses strstr() * @uses explode() * @param string $db name of db * return array (rekursive) grouped table list */ function PMA_getTableList($db) { $sep = $GLOBALS['cfg']['LeftFrameTableSeparator']; $tables = PMA_DBI_get_tables_full($db); if (count($tables) < 1) { return $tables; } if ($GLOBALS['cfg']['NaturalOrder']) { uksort($tables, 'strcmp'); } $default = array('Name' => '', 'Rows' => 0, 'Comment' => '', 'disp_name' => ''); $table_groups = array(); foreach ($tables as $table_name => $table) { // check for correct row count if (NULL === $table['Rows']) { $table['Rows'] = PMA_countRecords($db, $table['Name'], $return = true, $force_exact = true); } // in $group we save the reference to the place in $table_groups // where to store the table info if ($GLOBALS['cfg']['LeftFrameDBTree'] && $sep && strstr($table_name, $sep)) { $parts = explode($sep, $table_name); $group =& $table_groups; $i = 0; $group_name_full = ''; while ($i < count($parts) - 1 && $i < $GLOBALS['cfg']['LeftFrameTableLevel']) { $group_name = $parts[$i] . $sep; $group_name_full .= $group_name; if (!isset($group[$group_name])) { $group[$group_name] = array(); $group[$group_name]['is' . $sep . 'group'] = true; $group[$group_name]['tab' . $sep . 'count'] = 1; $group[$group_name]['tab' . $sep . 'group'] = $group_name_full; } elseif (!isset($group[$group_name]['is' . $sep . 'group'])) { $table = $group[$group_name]; $group[$group_name] = array(); $group[$group_name][$group_name] = $table; unset($table); $group[$group_name]['is' . $sep . 'group'] = true; $group[$group_name]['tab' . $sep . 'count'] = 1; $group[$group_name]['tab' . $sep . 'group'] = $group_name_full; } else { $group[$group_name]['tab_count']++; } $group =& $group[$group_name]; $i++; } } else { if (!isset($table_groups[$table_name])) { $table_groups[$table_name] = array(); } $group =& $table_groups; } if ($GLOBALS['cfg']['ShowTooltipAliasTB'] && $GLOBALS['cfg']['ShowTooltipAliasTB'] !== 'nested') { // switch tooltip and name $table['Comment'] = $table['Name']; $table['disp_name'] = $table['Comment']; } else { $table['disp_name'] = $table['Name']; } $group[$table_name] = array_merge($default, $table); } return $table_groups; }