aboutsummaryrefslogtreecommitdiff
path: root/srcs/phpmyadmin/libraries/classes/Plugins/Schema/TableStats.php
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-01-09 10:55:03 +0100
committerCharles <sircharlesaze@gmail.com>2020-01-09 13:09:38 +0100
commit04d6d5ca99ebfd1cebb8ce06618fb3811fc1a8aa (patch)
tree5c691241355c943a3c68ddb06b8cf8c60aa11319 /srcs/phpmyadmin/libraries/classes/Plugins/Schema/TableStats.php
parent7e0d85db834d6351ed85d01e5126ac31dc510b86 (diff)
downloadft_server-04d6d5ca99ebfd1cebb8ce06618fb3811fc1a8aa.tar.gz
ft_server-04d6d5ca99ebfd1cebb8ce06618fb3811fc1a8aa.tar.bz2
ft_server-04d6d5ca99ebfd1cebb8ce06618fb3811fc1a8aa.zip
phpmyadmin working
Diffstat (limited to 'srcs/phpmyadmin/libraries/classes/Plugins/Schema/TableStats.php')
-rw-r--r--srcs/phpmyadmin/libraries/classes/Plugins/Schema/TableStats.php208
1 files changed, 208 insertions, 0 deletions
diff --git a/srcs/phpmyadmin/libraries/classes/Plugins/Schema/TableStats.php b/srcs/phpmyadmin/libraries/classes/Plugins/Schema/TableStats.php
new file mode 100644
index 0000000..a3d3b5c
--- /dev/null
+++ b/srcs/phpmyadmin/libraries/classes/Plugins/Schema/TableStats.php
@@ -0,0 +1,208 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Contains abstract class to hold table preferences/statistics
+ *
+ * @package PhpMyAdmin
+ */
+declare(strict_types=1);
+
+namespace PhpMyAdmin\Plugins\Schema;
+
+use PhpMyAdmin\DatabaseInterface;
+use PhpMyAdmin\Font;
+use PhpMyAdmin\Index;
+use PhpMyAdmin\Relation;
+use PhpMyAdmin\Util;
+use function rawurldecode;
+
+/**
+ * Table preferences/statistics
+ *
+ * This class preserves the table co-ordinates,fields
+ * and helps in drawing/generating the tables.
+ *
+ * @package PhpMyAdmin
+ * @abstract
+ */
+abstract class TableStats
+{
+ protected $diagram;
+ protected $db;
+ protected $pageNumber;
+ protected $tableName;
+ protected $showKeys;
+ protected $tableDimension;
+ public $displayfield;
+ public $fields = [];
+ public $primary = [];
+ public $x;
+ public $y;
+ public $width = 0;
+ public $heightCell = 0;
+ protected $offline;
+
+ /**
+ * @var Relation
+ */
+ protected $relation;
+
+ /**
+ * @var Font
+ */
+ protected $font;
+
+ /**
+ * Constructor
+ *
+ * @param Pdf\Pdf|Svg\Svg|Eps\Eps|Dia\Dia|Pdf\Pdf $diagram schema diagram
+ * @param string $db current db name
+ * @param integer $pageNumber current page number (from the
+ * $cfg['Servers'][$i]['table_coords'] table)
+ * @param string $tableName table name
+ * @param boolean $showKeys whether to display keys or not
+ * @param boolean $tableDimension whether to display table position or not
+ * @param boolean $offline whether the coordinates are sent
+ * from the browser
+ */
+ public function __construct(
+ $diagram,
+ $db,
+ $pageNumber,
+ $tableName,
+ $showKeys,
+ $tableDimension,
+ $offline
+ ) {
+ $this->diagram = $diagram;
+ $this->db = $db;
+ $this->pageNumber = $pageNumber;
+ $this->tableName = $tableName;
+
+ $this->showKeys = $showKeys;
+ $this->tableDimension = $tableDimension;
+
+ $this->offline = $offline;
+
+ $this->relation = new Relation($GLOBALS['dbi']);
+ $this->font = new Font();
+
+ // checks whether the table exists
+ // and loads fields
+ $this->validateTableAndLoadFields();
+ // load table coordinates
+ $this->loadCoordinates();
+ // loads display field
+ $this->loadDisplayField();
+ // loads primary keys
+ $this->loadPrimaryKey();
+ }
+
+ /**
+ * Validate whether the table exists.
+ *
+ * @return void
+ */
+ protected function validateTableAndLoadFields()
+ {
+ $sql = 'DESCRIBE ' . Util::backquote($this->tableName);
+ $result = $GLOBALS['dbi']->tryQuery(
+ $sql,
+ DatabaseInterface::CONNECT_USER,
+ DatabaseInterface::QUERY_STORE
+ );
+ if (! $result || ! $GLOBALS['dbi']->numRows($result)) {
+ $this->showMissingTableError();
+ }
+
+ if ($this->showKeys) {
+ $indexes = Index::getFromTable($this->tableName, $this->db);
+ $all_columns = [];
+ foreach ($indexes as $index) {
+ $all_columns = array_merge(
+ $all_columns,
+ array_flip(array_keys($index->getColumns()))
+ );
+ }
+ $this->fields = array_keys($all_columns);
+ } else {
+ while ($row = $GLOBALS['dbi']->fetchRow($result)) {
+ $this->fields[] = $row[0];
+ }
+ }
+ }
+
+ /**
+ * Displays an error when the table cannot be found.
+ *
+ * @return void
+ * @abstract
+ */
+ abstract protected function showMissingTableError();
+
+ /**
+ * Loads coordinates of a table
+ *
+ * @return void
+ */
+ protected function loadCoordinates()
+ {
+ if (isset($_POST['t_h'])) {
+ foreach ($_POST['t_h'] as $key => $value) {
+ $db = rawurldecode($_POST['t_db'][$key]);
+ $tbl = rawurldecode($_POST['t_tbl'][$key]);
+ if ($this->db . '.' . $this->tableName === $db . '.' . $tbl) {
+ $this->x = (double) $_POST['t_x'][$key];
+ $this->y = (double) $_POST['t_y'][$key];
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * Loads the table's display field
+ *
+ * @return void
+ */
+ protected function loadDisplayField()
+ {
+ $this->displayfield = $this->relation->getDisplayField($this->db, $this->tableName);
+ }
+
+ /**
+ * Loads the PRIMARY key.
+ *
+ * @return void
+ */
+ protected function loadPrimaryKey()
+ {
+ $result = $GLOBALS['dbi']->query(
+ 'SHOW INDEX FROM ' . Util::backquote($this->tableName) . ';',
+ DatabaseInterface::CONNECT_USER,
+ DatabaseInterface::QUERY_STORE
+ );
+ if ($GLOBALS['dbi']->numRows($result) > 0) {
+ while ($row = $GLOBALS['dbi']->fetchAssoc($result)) {
+ if ($row['Key_name'] == 'PRIMARY') {
+ $this->primary[] = $row['Column_name'];
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns title of the current table,
+ * title can have the dimensions/co-ordinates of the table
+ *
+ * @return string title of the current table
+ */
+ protected function getTitle()
+ {
+ return ($this->tableDimension
+ ? sprintf('%.0fx%0.f', $this->width, $this->heightCell)
+ : ''
+ )
+ . ' ' . $this->tableName;
+ }
+}