1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
|
<?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();
}
}
|