<?php /** * Contains PhpMyAdmin\Plugins\Schema\Dia\TableStatsDia class */ declare(strict_types=1); namespace PhpMyAdmin\Plugins\Schema\Dia; use PhpMyAdmin\Plugins\Schema\ExportRelationSchema; use PhpMyAdmin\Plugins\Schema\TableStats; use function __; use function in_array; use function shuffle; use function sprintf; /** * Table preferences/statistics * * This class preserves the table co-ordinates,fields * and helps in drawing/generating the Tables in dia XML document. * * @property Dia $diagram */ class TableStatsDia extends TableStats { /** @var int */ public $tableId; /** @var string */ public $tableColor = '#000000'; /** * @param Dia $diagram The current dia document * @param string $db The database name * @param string $tableName The table name * @param int $pageNumber The current page number (from the * $cfg['Servers'][$i]['table_coords'] table) * @param bool $showKeys Whether to display ONLY keys or not * @param bool $offline Whether the coordinates are sent from the browser */ public function __construct( $diagram, $db, $tableName, $pageNumber, $showKeys = false, $offline = false ) { parent::__construct($diagram, $db, $pageNumber, $tableName, $showKeys, false, $offline); /** * Every object in Dia document needs an ID to identify * so, we used a static variable to keep the things unique */ $this->tableId = ++DiaRelationSchema::$objectId; } /** * Displays an error when the table cannot be found. */ protected function showMissingTableError(): void { ExportRelationSchema::dieSchema( $this->pageNumber, 'DIA', sprintf(__('The %s table doesn\'t exist!'), $this->tableName) ); } /** * Do draw the table * * Tables are generated using object type Database - Table * primary fields are underlined in tables. Dia object * is used to generate the XML of Dia Document. Database Table * Object and their attributes are involved in the combination * of displaying Database - Table on Dia Document. * * @see Dia * * @param bool $showColor Whether to show color for tables text or not * if showColor is true then an array of $listOfColors * will be used to choose the random colors for tables * text we can change/add more colors to this array */ public function tableDraw($showColor): void { if ($showColor) { $listOfColors = [ 'FF0000', '000099', '00FF00', ]; shuffle($listOfColors); $this->tableColor = '#' . $listOfColors[0] . ''; } else { $this->tableColor = '#000000'; } $factor = 0.1; $this->diagram->startElement('dia:object'); $this->diagram->writeAttribute('type', 'Database - Table'); $this->diagram->writeAttribute('version', '0'); $this->diagram->writeAttribute('id', '' . $this->tableId . ''); $this->diagram->writeRaw( '<dia:attribute name="obj_pos"> <dia:point val="' . ($this->x * $factor) . ',' . ($this->y * $factor) . '"/> </dia:attribute> <dia:attribute name="obj_bb"> <dia:rectangle val="' . ($this->x * $factor) . ',' . ($this->y * $factor) . ';9.97,9.2"/> </dia:attribute> <dia:attribute name="meta"> <dia:composite type="dict"/> </dia:attribute> <dia:attribute name="elem_corner"> <dia:point val="' . ($this->x * $factor) . ',' . ($this->y * $factor) . '"/> </dia:attribute> <dia:attribute name="elem_width"> <dia:real val="5.9199999999999999"/> </dia:attribute> <dia:attribute name="elem_height"> <dia:real val="3.5"/> </dia:attribute> <dia:attribute name="text_colour"> <dia:color val="' . $this->tableColor . '"/> </dia:attribute> <dia:attribute name="line_colour"> <dia:color val="#000000"/> </dia:attribute> <dia:attribute name="fill_colour"> <dia:color val="#ffffff"/> </dia:attribute> <dia:attribute name="line_width"> <dia:real val="0.10000000000000001"/> </dia:attribute> <dia:attribute name="name"> <dia:string>#' . $this->tableName . '#</dia:string> </dia:attribute> <dia:attribute name="comment"> <dia:string>##</dia:string> </dia:attribute> <dia:attribute name="visible_comment"> <dia:boolean val="false"/> </dia:attribute> <dia:attribute name="tagging_comment"> <dia:boolean val="false"/> </dia:attribute> <dia:attribute name="underline_primary_key"> <dia:boolean val="true"/> </dia:attribute> <dia:attribute name="bold_primary_keys"> <dia:boolean val="true"/> </dia:attribute> <dia:attribute name="normal_font"> <dia:font family="monospace" style="0" name="Courier"/> </dia:attribute> <dia:attribute name="name_font"> <dia:font family="sans" style="80" name="Helvetica-Bold"/> </dia:attribute> <dia:attribute name="comment_font"> <dia:font family="sans" style="0" name="Helvetica"/> </dia:attribute> <dia:attribute name="normal_font_height"> <dia:real val="0.80000000000000004"/> </dia:attribute> <dia:attribute name="name_font_height"> <dia:real val="0.69999999999999996"/> </dia:attribute> <dia:attribute name="comment_font_height"> <dia:real val="0.69999999999999996"/> </dia:attribute>' ); $this->diagram->startElement('dia:attribute'); $this->diagram->writeAttribute('name', 'attributes'); foreach ($this->fields as $field) { $this->diagram->writeRaw( '<dia:composite type="table_attribute"> <dia:attribute name="name"> <dia:string>#' . $field . '#</dia:string> </dia:attribute> <dia:attribute name="type"> <dia:string>##</dia:string> </dia:attribute> <dia:attribute name="comment"> <dia:string>##</dia:string> </dia:attribute>' ); unset($pm); $pm = 'false'; if (in_array($field, $this->primary)) { $pm = 'true'; } if ($field == $this->displayfield) { $pm = 'false'; } $this->diagram->writeRaw( '<dia:attribute name="primary_key"> <dia:boolean val="' . $pm . '"/> </dia:attribute> <dia:attribute name="nullable"> <dia:boolean val="false"/> </dia:attribute> <dia:attribute name="unique"> <dia:boolean val="' . $pm . '"/> </dia:attribute> </dia:composite>' ); } $this->diagram->endElement(); $this->diagram->endElement(); } }