Schema export plugins

Signed-off-by: Bimal Yashodha <kb.yashodha@gmail.com>
This commit is contained in:
Bimal Yashodha 2014-08-09 21:22:30 +05:30
parent 0d099f69f2
commit dc42693489
26 changed files with 2922 additions and 2313 deletions

View File

@ -936,11 +936,20 @@ function Export_pages()
PMA_ajaxShowMessage(data.error, false);
} else {
PMA_ajaxRemoveMessage($msgbox);
var $form = $(data.message);
var $formatDropDown = $form.find('#plugins');
$formatDropDown.change(function() {
var format = $formatDropDown.val();
$form.find('.format_specific_options').hide();
$form.find('#' + format + '_options').show();
}).trigger('change');
$('<div id="page_export_dialog"></div>')
.append(data.message)
.append($form)
.dialog({
title: PMA_messages.strExportRelationalSchema,
width: 400,
width: 550,
modal: true,
buttons: button_options,
close: function () {
@ -951,26 +960,13 @@ function Export_pages()
}); // end $.get()
}// end export pages
function getParamsForExport($from)
function getParamsForExport($form)
{
var url = "";
url += "&db=" + $from.find('input[name="db"]').val();
url += "&token=" + $from.find('input[name="token"]').val();
url += "&do=" + $from.find('input[name="do"]').val();
url += "&export_type=" + $from.find("#export_type").val();
url += "&chpage=" + $from.find('input[name="chpage"]').val();
url += "&orientation=" + $from.find('select[name="orientation"]').val();
url += "&paper=" + $from.find('select[name="paper"]').val();
url += "&show_color=" + ($from.find('input[name="show_color"]').is(":checked") ? "on" : "off");
url += "&with_doc=" + ($from.find('input[name="with_doc"]').is(":checked") ? "on" : "off");
url += "&all_tables_same_width=" + ($from.find('input[name="all_tables_same_width"]').is(":checked") ? "on" : "off");
url += "&show_grid=" + ($from.find('input[name="show_grid"]').is(":checked") ? "on" : "off");
url += "&show_keys=" + ($from.find('input[name="show_keys"]').is(":checked") ? "on" : "off");
url += "&show_table_dimension=" + ($from.find('input[name="show_table_dimension"]').is(":checked") ? "on" : "off");
url += "&offline_export=" + (pmd_tables_enabled ? "off" : "on");
var url = $form.serialize();
if (pmd_tables_enabled) {
url += Get_url_pos();
} else {
url += "&offline_export=true";
url += "&tbl_coords=" + JSON.stringify(Get_url_pos());
}

View File

@ -143,64 +143,34 @@ function PMA_getPageIdsAndNames($db)
*/
function PMA_getHtmlForSchemaExport($db, $page)
{
$htmlString = '<form method="post" action="schema_export.php"'
. ' class="disableAjax" id="id_export_pages">'
. '<fieldset>'
. PMA_URL_getHiddenInputs($db)
. '<select name="export_type" id="export_type">';
/* Scan for schema plugins */
$export_list = PMA_getPlugins(
"schema",
'libraries/plugins/schema/'
);
if (file_exists(TCPDF_INC)) {
$htmlString .= '<option value="pdf" selected="selected">PDF</option>';
/* Fail if we didn't find any schema plugin */
if (empty($export_list)) {
return PMA_Message::error(
__('Could not load schema plugins, please check your installation!')
)->getDisplay();
}
$htmlString .=' <option value="svg">SVG</option>'
. '<option value="dia">DIA</option>'
. '<option value="eps">EPS</option>'
. '</select>'
. '<label>' . __('Select Export Relational Type') . '</label><br />';
$htmlString .= '<input type="hidden" name="chpage" value="' . htmlspecialchars($page) . '" />'
. '<input type="checkbox" name="show_grid" id="show_grid_opt" />'
. '<label for="show_grid_opt">' . __('Show grid') . '</label><br />'
. '<input type="checkbox" name="show_color"'
. ' id="show_color_opt" checked="checked" />'
. '<label for="show_color_opt">' . __('Show color') . '</label>'
. '<br />'
. '<input type="checkbox" name="show_table_dimension"'
. ' id="show_table_dim_opt" />'
. '<label for="show_table_dim_opt">'
. __('Show dimension of tables')
. '</label><br />'
. '<input type="checkbox" name="all_tables_same_width"'
. ' id="all_tables_same_width" />'
. '<label for="all_tables_same_width">'
. __('Same width for all tables')
. '</label><br />'
. '<input type="checkbox" name="with_doc"'
. ' id="with_doc" checked="checked" />'
. '<label for="with_doc">' . __('Data Dictionary') . '</label><br />'
. '<input type="checkbox" name="show_keys" id="show_keys" />'
. '<label for="show_keys">' . __('Only show keys') . '</label><br />'
. '<select name="orientation" id="orientation_opt" class="paper-change">'
. '<option value="L">' . __('Landscape') . '</option>'
. '<option value="P">' . __('Portrait') . '</option>'
. '</select>'
. '<label for="orientation_opt">' . __('Orientation') . '</label>'
. '<br />'
. '<select name="paper" id="paper_opt" class="paper-change">';
foreach ($GLOBALS['cfg']['PDFPageSizes'] as $val) {
$htmlString .= '<option value="' . htmlspecialchars($val) . '"';
if ($val == $GLOBALS['cfg']['PDFDefaultPageSize']) {
$htmlString .= ' selected="selected"';
}
$htmlString .= '>' . htmlspecialchars($val) . '</option>' . "\n";
}
$htmlString .= '</select>'
. '<label for="paper_opt">' . __('Paper size') . '</label>'
. '</fieldset>'
. '</form>';
$htmlString = '<form method="post" action="schema_export.php"'
. ' class="disableAjax" id="id_export_pages">';
$htmlString .= '<fieldset>';
$htmlString .= PMA_URL_getHiddenInputs($db);
$htmlString .= '<label>' . __('Select Export Relational Type')
. '</label><br />';
$htmlString .= PMA_pluginGetChoice(
'Schema', 'export_type', $export_list, 'schema_export_format'
);
$htmlString .= '<input type="hidden" name="chpage"'
. ' value="' . htmlspecialchars($page) . '" />';
$htmlString .= PMA_pluginGetOptions('Schema', $export_list);
$htmlString .= '</fieldset>';
$htmlString .= '</form>';
return $htmlString;
}

View File

@ -0,0 +1,76 @@
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* Abstract class for the schema export plugins
*
* @package PhpMyAdmin
*/
if (! defined('PHPMYADMIN')) {
exit;
}
/**
* Provides a common interface that will have to be implemented by all of the
* schema export plugins. Some of the plugins will also implement other public
* methods, but those are not declared here, because they are not implemented
* by all export plugins.
*
* @package PhpMyAdmin
*/
abstract class SchemaPlugin
{
/**
* SchemaPluginProperties object containing
* the specific schema export plugin type properties
*
* @var SchemaPluginProperties
*/
protected $properties;
/**
* Gets the export specific format plugin properties
*
* @return array
*/
public function getProperties()
{
return $this->properties;
}
/**
* Sets the export plugins properties and is implemented by
* each schema export plugin
*
* @return void
*/
protected abstract function setProperties();
/**
* Exports the shcema into the specified format.
*
* @param string $db database name
*
* @return bool Whether it succeeded
*/
public abstract function exportSchema($db);
/**
* Adds export options common to all plugins.
*
* @param OptionsPropertyMainGroup $properyGroup property group
*
* @return void
*/
protected function addCommonOptions(OptionsPropertyMainGroup $properyGroup)
{
$leaf = new BoolPropertyItem();
$leaf->setName('show_color');
$leaf->setText(__('Show color'));
$properyGroup->addProperty($leaf);
$leaf = new BoolPropertyItem();
$leaf->setName('show_keys');
$leaf->setText(__('Only show keys'));
$properyGroup->addProperty($leaf);
}
}
?>

View File

@ -19,18 +19,26 @@ if (! defined('PHPMYADMIN')) {
*/
class PMA_Export_Relation_Schema
{
private $_pageTitle;
public $showGrid;
public $showColor;
public $tableDimension;
public $sameWide;
public $withDoc;
public $showKeys;
public $orientation;
public $paper;
public $pageNumber;
public $exportType;
public $offline;
/**
* Constructor.
*
* @see PMA_SVG
*/
function __construct()
{
$this->setPageNumber($_REQUEST['page_number']);
$this->setOffline(isset($_REQUEST['offline_export']));
}
protected $showColor;
protected $tableDimension;
protected $sameWide;
protected $showKeys;
protected $orientation;
protected $paper;
protected $pageNumber;
protected $offline;
/**
* Set Page Number
@ -43,33 +51,19 @@ class PMA_Export_Relation_Schema
*/
public function setPageNumber($value)
{
$this->pageNumber = isset($value) ? $value : 1;
}
/**
* Set Show Grid
*
* @param boolean $value show grid of the document or not
*
* @return void
*
* @access public
*/
public function setShowGrid($value)
{
$this->showGrid = (isset($value) && $value == 'on');
$this->pageNumber = $value;
}
/**
* Sets showColor
*
* @param string $value 'on' to set the the variable
* @param boolean $value whether to show colors
*
* @return void
*/
public function setShowColor($value)
{
$this->showColor = (isset($value) && $value == 'on');
$this->showColor = $value;
}
/**
@ -83,7 +77,7 @@ class PMA_Export_Relation_Schema
*/
public function setTableDimension($value)
{
$this->tableDimension = (isset($value) && $value == 'on');
$this->tableDimension = $value;
}
/**
@ -97,21 +91,7 @@ class PMA_Export_Relation_Schema
*/
public function setAllTablesSameWidth($value)
{
$this->sameWide = (isset($value) && $value == 'on');
}
/**
* Set Data Dictionary
*
* @param boolean $value show selected database data dictionary or not
*
* @return void
*
* @access public
*/
public function setWithDataDictionary($value)
{
$this->withDoc = (isset($value) && $value == 'on');
$this->sameWide = $value;
}
/**
@ -125,7 +105,7 @@ class PMA_Export_Relation_Schema
*/
public function setShowKeys($value)
{
$this->showKeys = (isset($value) && $value == 'on');
$this->showKeys = $value;
}
/**
@ -139,7 +119,7 @@ class PMA_Export_Relation_Schema
*/
public function setOrientation($value)
{
$this->orientation = (isset($value) && $value == 'P') ? 'P' : 'L';
$this->orientation = ($value == 'P') ? 'P' : 'L';
}
/**
@ -153,35 +133,7 @@ class PMA_Export_Relation_Schema
*/
public function setPaper($value)
{
$this->paper = isset($value) ? $value : 'A4';
}
/**
* Set title of the page
*
* @param string $title title of the page displayed at top of the document
*
* @return void
*
* @access public
*/
public function setPageTitle($title)
{
$this->_pageTitle=$title;
}
/**
* Set type of export relational schema
*
* @param string $value can be pdf,svg,dia,eps etc
*
* @return void
*
* @access public
*/
public function setExportType($value)
{
$this->exportType=$value;
$this->paper = $value;
}
/**
@ -195,7 +147,7 @@ class PMA_Export_Relation_Schema
*/
public function setOffline($value)
{
$this->offline = (isset($value) && $value == 'on');
$this->offline = $value;
}
/**
@ -222,12 +174,10 @@ class PMA_Export_Relation_Schema
*/
public function getAllTables($db, $pageNumber)
{
global $cfgRelation;
// Get All tables
$tab_sql = 'SELECT table_name FROM '
. PMA_Util::backquote($GLOBALS['cfgRelation']['db']) . '.'
. PMA_Util::backquote($cfgRelation['table_coords'])
. PMA_Util::backquote($GLOBALS['cfgRelation']['table_coords'])
. ' WHERE db_name = \'' . PMA_Util::sqlAddSlashes($db) . '\''
. ' AND pdf_page_number = ' . $pageNumber;

View File

@ -0,0 +1,26 @@
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* Contains abstract class to hold relation preferences/statistics
*
* @package PhpMyAdmin
*/
if (! defined('PHPMYADMIN')) {
exit;
}
/**
* Relations preferences/statistics
*
* This class fetches the table master and foreign fields positions
* and helps in generating the Table references and then connects
* master table's master field to foreign table's foreign key.
*
* @package PhpMyAdmin
* @abstract
*/
abstract class RealtionStats
{
}
?>

View File

@ -0,0 +1,117 @@
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* Dia schema export code
*
* @package PhpMyAdmin-Schema
* @subpackage Dia
*/
if (! defined('PHPMYADMIN')) {
exit;
}
/* Get the schema export interface */
require_once 'libraries/plugins/SchemaPlugin.class.php';
require_once 'libraries/plugins/schema/dia/Dia_Relation_Schema.class.php';
/**
* Handles the schema export for the Dia format
*
* @package PhpMyAdmin-Schema
* @subpackage Dia
*/
class SchemaDia extends SchemaPlugin
{
/**
* Constructor
*/
public function __construct()
{
$this->setProperties();
}
/**
* Sets the schema export Dia properties
*
* @return void
*/
protected function setProperties()
{
$props = 'libraries/properties/';
include_once "$props/plugins/SchemaPluginProperties.class.php";
include_once "$props/options/groups/OptionsPropertyRootGroup.class.php";
include_once "$props/options/groups/OptionsPropertyMainGroup.class.php";
include_once "$props/options/items/BoolPropertyItem.class.php";
include_once "$props/options/items/SelectPropertyItem.class.php";
$schemaPluginProperties = new SchemaPluginProperties();
$schemaPluginProperties->setText('Dia');
$schemaPluginProperties->setExtension('dia');
$schemaPluginProperties->setMimeType('application/dia');
// create the root group that will be the options field for
// $schemaPluginProperties
// this will be shown as "Format specific options"
$exportSpecificOptions = new OptionsPropertyRootGroup();
$exportSpecificOptions->setName("Format Specific Options");
// specific options main group
$specificOptions = new OptionsPropertyMainGroup();
$specificOptions->setName("general_opts");
// add options common to all plugins
$this->addCommonOptions($specificOptions);
$leaf = new SelectPropertyItem();
$leaf->setName("orientation");
$leaf->setText(__('Orientation'));
$leaf->setValues(
array(
'L' => 'Landscape',
'P' => 'Portrait',
)
);
$specificOptions->addProperty($leaf);
$leaf = new SelectPropertyItem();
$leaf->setName("paper");
$leaf->setText(__('Paper size'));
$leaf->setValues($this->_getPaperSizeArray());
$specificOptions->addProperty($leaf);
// add the main group to the root group
$exportSpecificOptions->addProperty($specificOptions);
// set the options for the schema export plugin property item
$schemaPluginProperties->setOptions($exportSpecificOptions);
$this->properties = $schemaPluginProperties;
}
/**
* Returns the array of paper sizes
*
* @return array array of paper sizes
*/
private function _getPaperSizeArray()
{
$ret = array();
foreach ($GLOBALS['cfg']['PDFPageSizes'] as $val) {
$ret[$val] = $val;
}
return $ret;
}
/**
* Exports the shcema into DIA format.
*
* @param string $db database name
*
* @return bool Whether it succeeded
*/
public function exportSchema($db)
{
$export = new PMA_Dia_Relation_Schema();
$export->showOutput();
}
}
?>

View File

@ -0,0 +1,102 @@
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* PDF schema export code
*
* @package PhpMyAdmin-Schema
* @subpackage EPS
*/
if (! defined('PHPMYADMIN')) {
exit;
}
/* Get the schema export interface */
require_once 'libraries/plugins/SchemaPlugin.class.php';
require_once 'libraries/plugins/schema/eps/Eps_Relation_Schema.class.php';
/**
* Handles the schema export for the EPS format
*
* @package PhpMyAdmin-Schema
* @subpackage EPS
*/
class SchemaEps extends SchemaPlugin
{
/**
* Constructor
*/
public function __construct()
{
$this->setProperties();
}
/**
* Sets the schema export EPS properties
*
* @return void
*/
protected function setProperties()
{
$props = 'libraries/properties/';
include_once "$props/plugins/SchemaPluginProperties.class.php";
include_once "$props/options/groups/OptionsPropertyRootGroup.class.php";
include_once "$props/options/groups/OptionsPropertyMainGroup.class.php";
include_once "$props/options/items/BoolPropertyItem.class.php";
include_once "$props/options/items/SelectPropertyItem.class.php";
$schemaPluginProperties = new SchemaPluginProperties();
$schemaPluginProperties->setText('EPS');
$schemaPluginProperties->setExtension('eps');
$schemaPluginProperties->setMimeType('application/eps');
// create the root group that will be the options field for
// $schemaPluginProperties
// this will be shown as "Format specific options"
$exportSpecificOptions = new OptionsPropertyRootGroup();
$exportSpecificOptions->setName("Format Specific Options");
// specific options main group
$specificOptions = new OptionsPropertyMainGroup();
$specificOptions->setName("general_opts");
// add options common to all plugins
$this->addCommonOptions($specificOptions);
// create leaf items and add them to the group
$leaf = new BoolPropertyItem();
$leaf->setName('all_tables_same_width');
$leaf->setText(__('Same width for all tables'));
$specificOptions->addProperty($leaf);
$leaf = new SelectPropertyItem();
$leaf->setName("orientation");
$leaf->setText(__('Orientation'));
$leaf->setValues(
array(
'L' => 'Landscape',
'P' => 'Portrait',
)
);
$specificOptions->addProperty($leaf);
// add the main group to the root group
$exportSpecificOptions->addProperty($specificOptions);
// set the options for the schema export plugin property item
$schemaPluginProperties->setOptions($exportSpecificOptions);
$this->properties = $schemaPluginProperties;
}
/**
* Exports the shcema into EPS format.
*
* @param string $db database name
*
* @return bool Whether it succeeded
*/
public function exportSchema($db)
{
$export = new PMA_Eps_Relation_Schema();
$export->showOutput();
}
}
?>

View File

@ -0,0 +1,132 @@
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* PDF schema export code
*
* @package PhpMyAdmin-Schema
* @subpackage PDF
*/
if (! defined('PHPMYADMIN')) {
exit;
}
/* Get the schema export interface */
require_once 'libraries/plugins/SchemaPlugin.class.php';
require_once 'libraries/plugins/schema/pdf/Pdf_Relation_Schema.class.php';
/**
* Handles the schema export for the PDF format
*
* @package PhpMyAdmin-Schema
* @subpackage PDF
*/
class SchemaPdf extends SchemaPlugin
{
/**
* Constructor
*/
public function __construct()
{
$this->setProperties();
}
/**
* Sets the schema export PDF properties
*
* @return void
*/
protected function setProperties()
{
$props = 'libraries/properties/';
include_once "$props/plugins/SchemaPluginProperties.class.php";
include_once "$props/options/groups/OptionsPropertyRootGroup.class.php";
include_once "$props/options/groups/OptionsPropertyMainGroup.class.php";
include_once "$props/options/items/BoolPropertyItem.class.php";
include_once "$props/options/items/SelectPropertyItem.class.php";
$schemaPluginProperties = new SchemaPluginProperties();
$schemaPluginProperties->setText('PDF');
$schemaPluginProperties->setExtension('pdf');
$schemaPluginProperties->setMimeType('application/pdf');
// create the root group that will be the options field for
// $schemaPluginProperties
// this will be shown as "Format specific options"
$exportSpecificOptions = new OptionsPropertyRootGroup();
$exportSpecificOptions->setName("Format Specific Options");
// specific options main group
$specificOptions = new OptionsPropertyMainGroup();
$specificOptions->setName("general_opts");
// add options common to all plugins
$this->addCommonOptions($specificOptions);
// create leaf items and add them to the group
$leaf = new BoolPropertyItem();
$leaf->setName('all_tables_same_width');
$leaf->setText(__('Same width for all tables'));
$specificOptions->addProperty($leaf);
$leaf = new SelectPropertyItem();
$leaf->setName("orientation");
$leaf->setText(__('Orientation'));
$leaf->setValues(
array(
'L' => 'Landscape',
'P' => 'Portrait',
)
);
$specificOptions->addProperty($leaf);
$leaf = new SelectPropertyItem();
$leaf->setName("paper");
$leaf->setText(__('Paper size'));
$leaf->setValues($this->_getPaperSizeArray());
$specificOptions->addProperty($leaf);
$leaf = new BoolPropertyItem();
$leaf->setName('show_grid');
$leaf->setText(__('Show grid'));
$specificOptions->addProperty($leaf);
$leaf = new BoolPropertyItem();
$leaf->setName('with_doc');
$leaf->setText(__('Data Dictionary'));
$specificOptions->addProperty($leaf);
// add the main group to the root group
$exportSpecificOptions->addProperty($specificOptions);
// set the options for the schema export plugin property item
$schemaPluginProperties->setOptions($exportSpecificOptions);
$this->properties = $schemaPluginProperties;
}
/**
* Returns the array of paper sizes
*
* @return array array of paper sizes
*/
private function _getPaperSizeArray()
{
$ret = array();
foreach ($GLOBALS['cfg']['PDFPageSizes'] as $val) {
$ret[$val] = $val;
}
return $ret;
}
/**
* Exports the shcema into PDF format.
*
* @param string $db database name
*
* @return bool Whether it succeeded
*/
public function exportSchema($db)
{
$export = new PMA_Pdf_Relation_Schema();
$export->showOutput();
}
}
?>

View File

@ -0,0 +1,90 @@
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* PDF schema export code
*
* @package PhpMyAdmin-Schema
* @subpackage SVG
*/
if (! defined('PHPMYADMIN')) {
exit;
}
/* Get the schema export interface */
require_once 'libraries/plugins/SchemaPlugin.class.php';
require_once 'libraries/plugins/schema/svg/Svg_Relation_Schema.class.php';
/**
* Handles the schema export for the SVG format
*
* @package PhpMyAdmin-Schema
* @subpackage SVG
*/
class SchemaSvg extends SchemaPlugin
{
/**
* Constructor
*/
public function __construct()
{
$this->setProperties();
}
/**
* Sets the schema export SVG properties
*
* @return void
*/
protected function setProperties()
{
$props = 'libraries/properties/';
include_once "$props/plugins/SchemaPluginProperties.class.php";
include_once "$props/options/groups/OptionsPropertyRootGroup.class.php";
include_once "$props/options/groups/OptionsPropertyMainGroup.class.php";
include_once "$props/options/items/BoolPropertyItem.class.php";
$schemaPluginProperties = new SchemaPluginProperties();
$schemaPluginProperties->setText('SVG');
$schemaPluginProperties->setExtension('svg');
$schemaPluginProperties->setMimeType('application/svg');
// create the root group that will be the options field for
// $schemaPluginProperties
// this will be shown as "Format specific options"
$exportSpecificOptions = new OptionsPropertyRootGroup();
$exportSpecificOptions->setName("Format Specific Options");
// specific options main group
$specificOptions = new OptionsPropertyMainGroup();
$specificOptions->setName("general_opts");
// add options common to all plugins
$this->addCommonOptions($specificOptions);
// create leaf items and add them to the group
$leaf = new BoolPropertyItem();
$leaf->setName('all_tables_same_width');
$leaf->setText(__('Same width for all tables'));
$specificOptions->addProperty($leaf);
// add the main group to the root group
$exportSpecificOptions->addProperty($specificOptions);
// set the options for the schema export plugin property item
$schemaPluginProperties->setOptions($exportSpecificOptions);
$this->properties = $schemaPluginProperties;
}
/**
* Exports the shcema into SVG format.
*
* @param string $db database name
*
* @return bool Whether it succeeded
*/
public function exportSchema($db)
{
$export = new PMA_Svg_Relation_Schema();
$export->showOutput();
}
}
?>

View File

@ -26,7 +26,7 @@ abstract class TableStats
protected $tableName;
protected $showKeys;
protected $showInfo;
protected $tableDimension;
public $displayfield;
public $fields = array();
@ -41,16 +41,18 @@ abstract class TableStats
/**
* Constructor
*
* @param object $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 $showInfo whether to display table position or not
* @param object $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, $showInfo, $offline
$diagram, $db, $pageNumber, $tableName, $showKeys, $tableDimension, $offline
) {
$this->diagram = $diagram;
$this->db = $db;
@ -58,7 +60,7 @@ abstract class TableStats
$this->tableName = $tableName;
$this->showKeys = $showKeys;
$this->showInfo = $showInfo;
$this->tableDimension = $tableDimension;
$this->offline = $offline;
@ -122,10 +124,10 @@ abstract class TableStats
{
global $cfgRelation;
if ($this->offline){
$tbl_coords = json_decode($GLOBALS['tbl_coords']);
if ($this->offline) {
$tbl_coords = json_decode($_REQUEST['tbl_coords']);
foreach ($tbl_coords as $tbl) {
if( $this->tableName === $tbl->table_name){
if ($this->tableName === $tbl->table_name) {
$this->x = (double) $tbl->x;
$this->y = (double) $tbl->y;
break;
@ -136,8 +138,8 @@ abstract class TableStats
. PMA_Util::backquote($GLOBALS['cfgRelation']['db']) . "."
. PMA_Util::backquote($cfgRelation['table_coords'])
. " WHERE db_name = '" . PMA_Util::sqlAddSlashes($this->db) . "'"
. " AND table_name = '" . PMA_Util::sqlAddSlashes($this->tableName) . "'"
. " AND pdf_page_number = " . $this->pageNumber;
. " AND table_name = '" . PMA_Util::sqlAddSlashes($this->tableName) . "'"
. " AND pdf_page_number = " . $this->pageNumber;
$result = PMA_queryAsControlUser(
$sql, false, PMA_DatabaseInterface::QUERY_STORE
);
@ -196,7 +198,7 @@ abstract class TableStats
*/
protected function getTitle()
{
return ($this->showInfo
return ($this->tableDimension
? sprintf('%.0fx%0.f', $this->width, $this->heightCell)
: ''
)

View File

@ -0,0 +1,383 @@
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* Classes to create relation schema in Dia format.
*
* @package PhpMyAdmin
*/
if (! defined('PHPMYADMIN')) {
exit;
}
require_once 'libraries/plugins/schema/Export_Relation_Schema.class.php';
require_once 'libraries/plugins/schema/dia/RelationStatsDia.class.php';
require_once 'libraries/plugins/schema/dia/TableStatsDia.class.php';
/**
* This Class inherits the XMLwriter class and
* helps in developing structure of DIA Schema Export
*
* @package PhpMyAdmin
* @access public
* @see http://php.net/manual/en/book.xmlwriter.php
*/
class PMA_DIA extends XMLWriter
{
/**
* The "PMA_DIA" constructor
*
* Upon instantiation This starts writing the Dia XML document
*
* @see XMLWriter::openMemory(),XMLWriter::setIndent(),XMLWriter::startDocument()
*/
function __construct()
{
$this->openMemory();
/*
* Set indenting using three spaces,
* so output is formatted
*/
$this->setIndent(true);
$this->setIndentString(' ');
/*
* Create the XML document
*/
$this->startDocument('1.0', 'UTF-8');
}
/**
* Starts Dia Document
*
* dia document starts by first initializing dia:diagram tag
* then dia:diagramdata contains all the attributes that needed
* to define the document, then finally a Layer starts which
* holds all the objects.
*
* @param string $paper the size of the paper/document
* @param float $topMargin top margin of the paper/document in cm
* @param float $bottomMargin bottom margin of the paper/document in cm
* @param float $leftMargin left margin of the paper/document in cm
* @param float $rightMargin right margin of the paper/document in cm
* @param string $orientation orientation of the document, portrait or landscape
*
* @return void
*
* @access public
* @see XMLWriter::startElement(),XMLWriter::writeAttribute(),
* XMLWriter::writeRaw()
*/
function startDiaDoc($paper, $topMargin, $bottomMargin, $leftMargin,
$rightMargin, $orientation
) {
if ($orientation == 'P') {
$isPortrait = 'true';
} else {
$isPortrait = 'false';
}
$this->startElement('dia:diagram');
$this->writeAttribute('xmlns:dia', 'http://www.lysator.liu.se/~alla/dia/');
$this->startElement('dia:diagramdata');
$this->writeRaw(
'<dia:attribute name="background">
<dia:color val="#ffffff"/>
</dia:attribute>
<dia:attribute name="pagebreak">
<dia:color val="#000099"/>
</dia:attribute>
<dia:attribute name="paper">
<dia:composite type="paper">
<dia:attribute name="name">
<dia:string>#' . $paper . '#</dia:string>
</dia:attribute>
<dia:attribute name="tmargin">
<dia:real val="' . $topMargin . '"/>
</dia:attribute>
<dia:attribute name="bmargin">
<dia:real val="' . $bottomMargin . '"/>
</dia:attribute>
<dia:attribute name="lmargin">
<dia:real val="' . $leftMargin . '"/>
</dia:attribute>
<dia:attribute name="rmargin">
<dia:real val="' . $rightMargin . '"/>
</dia:attribute>
<dia:attribute name="is_portrait">
<dia:boolean val="' . $isPortrait . '"/>
</dia:attribute>
<dia:attribute name="scaling">
<dia:real val="1"/>
</dia:attribute>
<dia:attribute name="fitto">
<dia:boolean val="false"/>
</dia:attribute>
</dia:composite>
</dia:attribute>
<dia:attribute name="grid">
<dia:composite type="grid">
<dia:attribute name="width_x">
<dia:real val="1"/>
</dia:attribute>
<dia:attribute name="width_y">
<dia:real val="1"/>
</dia:attribute>
<dia:attribute name="visible_x">
<dia:int val="1"/>
</dia:attribute>
<dia:attribute name="visible_y">
<dia:int val="1"/>
</dia:attribute>
<dia:composite type="color"/>
</dia:composite>
</dia:attribute>
<dia:attribute name="color">
<dia:color val="#d8e5e5"/>
</dia:attribute>
<dia:attribute name="guides">
<dia:composite type="guides">
<dia:attribute name="hguides"/>
<dia:attribute name="vguides"/>
</dia:composite>
</dia:attribute>'
);
$this->endElement();
$this->startElement('dia:layer');
$this->writeAttribute('name', 'Background');
$this->writeAttribute('visible', 'true');
$this->writeAttribute('active', 'true');
}
/**
* Ends Dia Document
*
* @return void
* @access public
* @see XMLWriter::endElement(),XMLWriter::endDocument()
*/
function endDiaDoc()
{
$this->endElement();
$this->endDocument();
}
/**
* Output Dia Document for download
*
* @param string $fileName name of the dia document
*
* @return void
* @access public
* @see XMLWriter::flush()
*/
function showOutput($fileName)
{
if (ob_get_clean()) {
ob_end_clean();
}
$output = $this->flush();
PMA_Response::getInstance()->disable();
PMA_downloadHeader(
$fileName . '.dia', 'application/x-dia-diagram', strlen($output)
);
print $output;
}
}
/**
* Dia Relation Schema Class
*
* Purpose of this class is to generate the Dia XML Document
* which is used for representing the database diagrams in Dia IDE
* This class uses Database Table and Reference Objects of Dia and with
* the combination of these objects actually helps in preparing Dia XML.
*
* Dia XML is generated by using XMLWriter php extension and this class
* inherits Export_Relation_Schema class has common functionality added
* to this class
*
* @package PhpMyAdmin
* @name Dia_Relation_Schema
*/
class PMA_Dia_Relation_Schema extends PMA_Export_Relation_Schema
{
/**
* Defines properties
*/
private $_tables = array();
private $_relations = array();
private $_topMargin = 2.8222000598907471;
private $_bottomMargin = 2.8222000598907471;
private $_leftMargin = 2.8222000598907471;
private $_rightMargin = 2.8222000598907471;
public static $objectId = 0;
/**
* The "PMA_Dia_Relation_Schema" constructor
*
* Upon instantiation This outputs the Dia XML document
* that user can download
*
* @see PMA_DIA,Table_Stats_Dia,Relation_Stats_Dia
*/
function __construct()
{
parent::__construct();
global $dia, $db;
$this->setShowColor(isset($_REQUEST['dia_show_color']));
$this->setShowKeys(isset($_REQUEST['dia_show_keys']));
$this->setOrientation($_REQUEST['dia_orientation']);
$this->setPaper($_REQUEST['dia_paper']);
$dia = new PMA_DIA();
$dia->startDiaDoc(
$this->paper, $this->_topMargin, $this->_bottomMargin,
$this->_leftMargin, $this->_rightMargin, $this->orientation
);
if ($this->isOffline()) {
$alltables = array();
$tbl_coords = json_decode($_REQUEST['tbl_coords']);
foreach ($tbl_coords as $tbl) {
$alltables[] = $tbl->table_name;
}
} else {
$alltables = $this->getAllTables($db, $this->pageNumber);
}
foreach ($alltables as $table) {
if (! isset($this->tables[$table])) {
$this->_tables[$table] = new Table_Stats_Dia(
$table, $this->pageNumber, $this->showKeys, $this->isOffline()
);
}
}
$seen_a_relation = false;
foreach ($alltables as $one_table) {
$exist_rel = PMA_getForeigners($db, $one_table, '', 'both');
if ($exist_rel) {
$seen_a_relation = true;
foreach ($exist_rel as $master_field => $rel) {
/* put the foreign table on the schema only if selected
* by the user
* (do not use array_search() because we would have to
* to do a === false and this is not PHP3 compatible)
*/
if ($master_field != 'foreign_keys_data') {
if (in_array($rel['foreign_table'], $alltables)) {
$this->_addRelation(
$one_table, $master_field, $rel['foreign_table'],
$rel['foreign_field'], $this->showKeys
);
}
} else {
foreach ($rel as $key => $one_key) {
if (in_array($one_key['ref_table_name'], $alltables)) {
foreach ($one_key['index_list'] as $index => $one_field) {
$this->_addRelation(
$one_table, $one_field, $one_key['ref_table_name'],
$one_key['ref_index_list'][$index], $this->showKeys
);
}
}
}
}
}
}
}
$this->_drawTables();
if ($seen_a_relation) {
$this->_drawRelations();
}
$dia->endDiaDoc();
}
/**
* Output Dia Document for download
*
* @return void
* @access public
*/
function showOutput()
{
global $dia, $db;
$filename = $db . '-' . $this->pageNumber;
if ($this->isOffline()) {
$filename = __("Dia export page");
}
$dia->showOutput($filename);
}
/**
* Defines relation objects
*
* @param string $masterTable The master table name
* @param string $masterField The relation field in the master table
* @param string $foreignTable The foreign table name
* @param string $foreignField The relation field in the foreign table
* @param bool $showKeys Whether to display ONLY keys or not
*
* @return void
*
* @access private
* @see Table_Stats_Dia::__construct(),Relation_Stats_Dia::__construct()
*/
private function _addRelation($masterTable, $masterField, $foreignTable,
$foreignField, $showKeys
) {
if (! isset($this->_tables[$masterTable])) {
$this->_tables[$masterTable] = new Table_Stats_Dia(
$masterTable, $this->pageNumber, $showKeys
);
}
if (! isset($this->_tables[$foreignTable])) {
$this->_tables[$foreignTable] = new Table_Stats_Dia(
$foreignTable, $this->pageNumber, $showKeys
);
}
$this->_relations[] = new Relation_Stats_Dia(
$this->_tables[$masterTable], $masterField,
$this->_tables[$foreignTable], $foreignField
);
}
/**
* Draws relation references
*
* connects master table's master field to
* foreign table's forein field using Dia object
* type Database - Reference
*
* @return void
*
* @access private
* @see Relation_Stats_Dia::relationDraw()
*/
private function _drawRelations()
{
foreach ($this->_relations as $relation) {
$relation->relationDraw($this->showColor);
}
}
/**
* Draws tables
*
* Tables are generated using Dia object type Database - Table
* primary fields are underlined and bold in tables
*
* @return void
*
* @access private
* @see Table_Stats_Dia::tableDraw()
*/
private function _drawTables()
{
foreach ($this->_tables as $table) {
$table->tableDraw($this->showColor);
}
}
}
?>

View File

@ -0,0 +1,218 @@
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* Contains Relation_Stats_Dia class
*
* @package PhpMyAdmin
*/
if (! defined('PHPMYADMIN')) {
exit;
}
require_once 'libraries/plugins/schema/RelationStats.class.php';
/**
* Relation preferences/statistics
*
* This class fetches the table master and foreign fields positions
* and helps in generating the Table references and then connects
* master table's master field to foreign table's foreign key
* in dia XML document.
*
* @package PhpMyAdmin
* @name Relation_Stats_Dia
* @see PMA_DIA
*/
class Relation_Stats_Dia extends RealtionStats
{
/**
* Defines properties
*/
public $srcConnPointsRight;
public $srcConnPointsLeft;
public $destConnPointsRight;
public $destConnPointsLeft;
public $masterTableId;
public $foreignTableId;
public $masterTablePos;
public $foreignTablePos;
public $referenceColor;
/**
* The "Relation_Stats_Dia" constructor
*
* @param string $master_table The master table name
* @param string $master_field The relation field in the master table
* @param string $foreign_table The foreign table name
* @param string $foreign_field The relation field in the foreign table
*
* @see Relation_Stats_Dia::_getXy
*/
function __construct($master_table, $master_field, $foreign_table,
$foreign_field
) {
$src_pos = $this->_getXy($master_table, $master_field);
$dest_pos = $this->_getXy($foreign_table, $foreign_field);
$this->srcConnPointsLeft = $src_pos[0];
$this->srcConnPointsRight = $src_pos[1];
$this->destConnPointsLeft = $dest_pos[0];
$this->destConnPointsRight = $dest_pos[1];
$this->masterTablePos = $src_pos[2];
$this->foreignTablePos = $dest_pos[2];
$this->masterTableId = $master_table->tableId;
$this->foreignTableId = $foreign_table->tableId;
}
/**
* Each Table object have connection points
* which is used to connect to other objects in Dia
* we detect the position of key in fields and
* then determines its left and right connection
* points.
*
* @param string $table The current table name
* @param string $column The relation column name
*
* @return array Table right,left connection points and key position
*
* @access private
*/
private function _getXy($table, $column)
{
$pos = array_search($column, $table->fields);
// left, right, position
$value = 12;
if ($pos != 0) {
return array($pos + $value + $pos, $pos + $value + $pos + 1, $pos);
}
return array($pos + $value , $pos + $value + 1, $pos);
}
/**
* Draws relation references
*
* connects master table's master field to foreign table's
* forein field using Dia object type Database - Reference
* Dia object is used to generate the XML of Dia Document.
* Database reference Object and their attributes are involved
* in the combination of displaing Database - reference on Dia Document.
*
* @param boolean $showColor Whether to use one color per relation or not
* if showColor is true then an array of $listOfColors will be used to choose
* the random colors for references lines. we can change/add more colors to this
*
* @return boolean|void
*
* @global object $dia The current Dia document
*
* @access public
* @see PMA_PDF
*/
public function relationDraw($showColor)
{
global $dia;
PMA_Dia_Relation_Schema::$objectId += 1;
/*
* if source connection points and destination connection
* points are same then return it false and don't draw that
* relation
*/
if ( $this->srcConnPointsRight == $this->destConnPointsRight) {
if ( $this->srcConnPointsLeft == $this->destConnPointsLeft) {
return false;
}
}
if ($showColor) {
$listOfColors = array(
'FF0000',
'000099',
'00FF00'
);
shuffle($listOfColors);
$this->referenceColor = '#' . $listOfColors[0] . '';
} else {
$this->referenceColor = '#000000';
}
$dia->writeRaw(
'<dia:object type="Database - Reference" version="0" id="'
. PMA_Dia_Relation_Schema::$objectId . '">
<dia:attribute name="obj_pos">
<dia:point val="3.27,18.9198"/>
</dia:attribute>
<dia:attribute name="obj_bb">
<dia:rectangle val="2.27,8.7175;17.7679,18.9198"/>
</dia:attribute>
<dia:attribute name="meta">
<dia:composite type="dict"/>
</dia:attribute>
<dia:attribute name="orth_points">
<dia:point val="3.27,18.9198"/>
<dia:point val="2.27,18.9198"/>
<dia:point val="2.27,14.1286"/>
<dia:point val="17.7679,14.1286"/>
<dia:point val="17.7679,9.3375"/>
<dia:point val="16.7679,9.3375"/>
</dia:attribute>
<dia:attribute name="orth_orient">
<dia:enum val="0"/>
<dia:enum val="1"/>
<dia:enum val="0"/>
<dia:enum val="1"/>
<dia:enum val="0"/>
</dia:attribute>
<dia:attribute name="orth_autoroute">
<dia:boolean val="true"/>
</dia:attribute>
<dia:attribute name="text_colour">
<dia:color val="#000000"/>
</dia:attribute>
<dia:attribute name="line_colour">
<dia:color val="' . $this->referenceColor . '"/>
</dia:attribute>
<dia:attribute name="line_width">
<dia:real val="0.10000000000000001"/>
</dia:attribute>
<dia:attribute name="line_style">
<dia:enum val="0"/>
<dia:real val="1"/>
</dia:attribute>
<dia:attribute name="corner_radius">
<dia:real val="0"/>
</dia:attribute>
<dia:attribute name="end_arrow">
<dia:enum val="22"/>
</dia:attribute>
<dia:attribute name="end_arrow_length">
<dia:real val="0.5"/>
</dia:attribute>
<dia:attribute name="end_arrow_width">
<dia:real val="0.5"/>
</dia:attribute>
<dia:attribute name="start_point_desc">
<dia:string>#1#</dia:string>
</dia:attribute>
<dia:attribute name="end_point_desc">
<dia:string>#n#</dia:string>
</dia:attribute>
<dia:attribute name="normal_font">
<dia:font family="monospace" style="0" name="Courier"/>
</dia:attribute>
<dia:attribute name="normal_font_height">
<dia:real val="0.59999999999999998"/>
</dia:attribute>
<dia:connections>
<dia:connection handle="0" to="'
. $this->masterTableId . '" connection="'
. $this->srcConnPointsRight . '"/>
<dia:connection handle="1" to="'
. $this->foreignTableId . '" connection="'
. $this->destConnPointsRight . '"/>
</dia:connections>
</dia:object>'
);
}
}
?>

View File

@ -0,0 +1,247 @@
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* Contains Table_Stats_Dia class
*
* @package PhpMyAdmin
*/
if (! defined('PHPMYADMIN')) {
exit;
}
require_once 'libraries/plugins/schema/TableStats.class.php';
/**
* Table preferences/statistics
*
* This class preserves the table co-ordinates,fields
* and helps in drawing/generating the Tables in dia XML document.
*
* @package PhpMyAdmin
* @name Table_Stats_Dia
* @see PMA_DIA
*/
class Table_Stats_Dia extends TableStats
{
public $tableId;
public $tableColor;
/**
* The "Table_Stats_Dia" constructor
*
* @param string $tableName The table name
* @param integer $pageNumber The current page number (from the
* $cfg['Servers'][$i]['table_coords'] table)
* @param boolean $showKeys Whether to display ONLY keys or not
* @param boolean $offline Whether the coordinates are sent from the browser
*
* @global object $dia The current dia document
* @global array $cfgRelation The relations settings
* @global string $db The current db name
*
* @see PMA_DIA
*/
function __construct(
$tableName, $pageNumber, $showKeys = false, $offline = false
) {
global $dia, $cfgRelation, $db;
parent::__construct(
$dia, $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
*/
PMA_Dia_Relation_Schema::$objectId += 1;
$this->tableId = PMA_Dia_Relation_Schema::$objectId;
}
/**
* Displays an error when the table cannot be found.
*
* @return void
*/
protected function showMissingTableError()
{
$this->diagram->dieSchema(
$this->pageNumber,
"DIA",
sprintf(__('The %s table doesn\'t exist!'), $this->tableName)
);
}
/**
* Displays an error on missing coordinates
*
* @return void
*/
protected function showMissingCoordinatesError()
{
$this->diagram->dieSchema(
$this->pageNumber,
"DIA",
sprintf(
__('Please configure the coordinates for table %s'),
$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 displaing Database - Table on Dia Document.
*
* @param boolean $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
*
* @return void
*
* @global object $dia The current Dia document
*
* @access public
* @see PMA_DIA
*/
public function tableDraw($showColor)
{
global $dia;
if ($showColor) {
$listOfColors = array(
'FF0000',
'000099',
'00FF00'
);
shuffle($listOfColors);
$this->tableColor = '#' . $listOfColors[0] . '';
} else {
$this->tableColor = '#000000';
}
$factor = 0.1;
$dia->startElement('dia:object');
$dia->writeAttribute('type', 'Database - Table');
$dia->writeAttribute('version', '0');
$dia->writeAttribute('id', '' . $this->tableId . '');
$dia->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>'
);
$dia->startElement('dia:attribute');
$dia->writeAttribute('name', 'attributes');
foreach ($this->fields as $field) {
$dia->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';
}
$dia->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>'
);
}
$dia->endElement();
$dia->endElement();
}
}
?>

View File

@ -9,7 +9,9 @@ if (! defined('PHPMYADMIN')) {
exit;
}
require_once 'Export_Relation_Schema.class.php';
require_once 'libraries/plugins/schema/Export_Relation_Schema.class.php';
require_once 'libraries/plugins/schema/eps/RelationStatsEps.class.php';
require_once 'libraries/plugins/schema/eps/TableStatsEps.class.php';
require_once 'libraries/Font.class.php';
/**
@ -89,21 +91,21 @@ class PMA_EPS
/**
* Set document orientation
*
* @param string $value sets the author
* @param string $orientation sets the orientation
*
* @return void
*
* @access public
*/
function setOrientation($value)
function setOrientation($orientation)
{
$this->stringCommands .= "%%PageOrder: Ascend \n";
if ($value == "L") {
$value = "Landscape";
$this->stringCommands .= '%%Orientation: ' . $value . "\n";
if ($orientation == "L") {
$orientation = "Landscape";
$this->stringCommands .= '%%Orientation: ' . $orientation . "\n";
} else {
$value = "Portrait";
$this->stringCommands .= '%%Orientation: ' . $value . "\n";
$orientation = "Portrait";
$this->stringCommands .= '%%Orientation: ' . $orientation . "\n";
}
$this->stringCommands .= "%%EndComments \n";
$this->stringCommands .= "%%Pages 1 \n";
@ -297,372 +299,6 @@ class PMA_EPS
}
}
require_once './libraries/schema/TableStats.class.php';
/**
* Table preferences/statistics
*
* This class preserves the table co-ordinates,fields
* and helps in drawing/generating the Tables in EPS.
*
* @package PhpMyAdmin
* @name Table_Stats_Eps
* @see PMA_EPS
*/
class Table_Stats_Eps extends TableStats
{
/**
* Defines properties
*/
public $height;
public $currentCell = 0;
/**
* The "Table_Stats_Eps" constructor
*
* @param string $tableName The table name
* @param string $font The font name
* @param integer $fontSize The font size
* @param integer $pageNumber Page number
* @param integer &$same_wide_width The max width among tables
* @param boolean $showKeys Whether to display keys or not
* @param boolean $showInfo Whether to display table position or not
*
* @global object $eps The current eps document
* @global integer The current page number (from the
* $cfg['Servers'][$i]['table_coords'] table)
* @global array $cfgRelation The relations settings
* @global string $db The current db name
*
* @access private
* @see PMA_EPS, Table_Stats_Eps::Table_Stats_setWidth,
* Table_Stats_Eps::Table_Stats_setHeight
*/
function __construct(
$tableName, $font, $fontSize, $pageNumber, &$same_wide_width,
$showKeys = false, $showInfo = false, $offline = false
) {
global $eps, $cfgRelation, $db;
parent::__construct(
$eps, $db, $pageNumber, $tableName, $showKeys, $showInfo, $offline
);
// height and width
$this->_setHeightTable($fontSize);
// setWidth must me after setHeight, because title
// can include table height which changes table width
$this->_setWidthTable($font, $fontSize);
if ($same_wide_width < $this->width) {
$same_wide_width = $this->width;
}
}
/**
* Displays an error when the table cannot be found.
*
* @return void
*/
protected function showMissingTableError()
{
$this->diagram->dieSchema(
$this->pageNumber,
"EPS",
sprintf(__('The %s table doesn\'t exist!'), $this->tableName)
);
}
/**
* Displays an error on missing coordinates
*
* @return void
*/
protected function showMissingCoordinatesError()
{
$this->diagram->dieSchema(
$this->pageNumber,
"EPS",
sprintf(
__('Please configure the coordinates for table %s'),
$this->tableName
)
);
}
/**
* Sets the width of the table
*
* @param string $font The font name
* @param integer $fontSize The font size
*
* @global object $eps The current eps document
*
* @return void
*
* @access private
* @see PMA_EPS
*/
private function _setWidthTable($font,$fontSize)
{
foreach ($this->fields as $field) {
$this->width = max(
$this->width,
PMA_Font::getStringWidth($field, $font, $fontSize)
);
}
$this->width += PMA_Font::getStringWidth(' ', $font, $fontSize);
/*
* it is unknown what value must be added, because
* table title is affected by the tabe width value
*/
while ($this->width
< PMA_Font::getStringWidth($this->getTitle(), $font, $fontSize)) {
$this->width += 7;
}
}
/**
* Sets the height of the table
*
* @param integer $fontSize The font size
*
* @return void
* @access private
*/
private function _setHeightTable($fontSize)
{
$this->heightCell = $fontSize + 4;
$this->height = (count($this->fields) + 1) * $this->heightCell;
}
/**
* Draw the table
*
* @param boolean $showColor Whether to display color
*
* @global object $eps The current eps document
*
* @return void
*
* @access public
* @see PMA_EPS,PMA_EPS::line,PMA_EPS::rect
*/
public function tableDraw($showColor)
{
global $eps;
//echo $this->tableName.'<br />';
$eps->rect($this->x, $this->y + 12, $this->width, $this->heightCell, 1);
$eps->showXY($this->getTitle(), $this->x + 5, $this->y + 14);
foreach ($this->fields as $field) {
$this->currentCell += $this->heightCell;
$showColor = 'none';
if ($showColor) {
if (in_array($field, $this->primary)) {
$showColor = '#0c0';
}
if ($field == $this->displayfield) {
$showColor = 'none';
}
}
$eps->rect(
$this->x, $this->y + 12 + $this->currentCell,
$this->width, $this->heightCell, 1
);
$eps->showXY($field, $this->x + 5, $this->y + 14 + $this->currentCell);
}
}
}
/**
* Relation preferences/statistics
*
* This class fetches the table master and foreign fields positions
* and helps in generating the Table references and then connects
* master table's master field to foreign table's foreign key
* in EPS document.
*
* @package PhpMyAdmin
* @name Relation_Stats_Eps
* @see PMA_EPS
*/
class Relation_Stats_Eps
{
/**
* Defines properties
*/
public $xSrc, $ySrc;
public $srcDir ;
public $destDir;
public $xDest, $yDest;
public $wTick = 10;
/**
* The "Relation_Stats_Eps" constructor
*
* @param string $master_table The master table name
* @param string $master_field The relation field in the master table
* @param string $foreign_table The foreign table name
* @param string $foreign_field The relation field in the foreign table
*
* @see Relation_Stats_Eps::_getXy
*/
function __construct(
$master_table, $master_field, $foreign_table, $foreign_field
) {
$src_pos = $this->_getXy($master_table, $master_field);
$dest_pos = $this->_getXy($foreign_table, $foreign_field);
/*
* [0] is x-left
* [1] is x-right
* [2] is y
*/
$src_left = $src_pos[0] - $this->wTick;
$src_right = $src_pos[1] + $this->wTick;
$dest_left = $dest_pos[0] - $this->wTick;
$dest_right = $dest_pos[1] + $this->wTick;
$d1 = abs($src_left - $dest_left);
$d2 = abs($src_right - $dest_left);
$d3 = abs($src_left - $dest_right);
$d4 = abs($src_right - $dest_right);
$d = min($d1, $d2, $d3, $d4);
if ($d == $d1) {
$this->xSrc = $src_pos[0];
$this->srcDir = -1;
$this->xDest = $dest_pos[0];
$this->destDir = -1;
} elseif ($d == $d2) {
$this->xSrc = $src_pos[1];
$this->srcDir = 1;
$this->xDest = $dest_pos[0];
$this->destDir = -1;
} elseif ($d == $d3) {
$this->xSrc = $src_pos[0];
$this->srcDir = -1;
$this->xDest = $dest_pos[1];
$this->destDir = 1;
} else {
$this->xSrc = $src_pos[1];
$this->srcDir = 1;
$this->xDest = $dest_pos[1];
$this->destDir = 1;
}
$this->ySrc = $src_pos[2] + 10;
$this->yDest = $dest_pos[2] + 10;
}
/**
* Gets arrows coordinates
*
* @param string $table The current table name
* @param string $column The relation column name
*
* @return array Arrows coordinates
*
* @access private
*/
private function _getXy($table, $column)
{
$pos = array_search($column, $table->fields);
// x_left, x_right, y
return array(
$table->x,
$table->x + $table->width,
$table->y + ($pos + 1.5) * $table->heightCell
);
}
/**
* draws relation links and arrows
* shows foreign key relations
*
* @param boolean $changeColor Whether to use one color per relation or not
*
* @global object $eps The current EPS document
*
* @access public
* @see PMA_EPS
*
* @return void
*/
public function relationDraw($changeColor)
{
global $eps;
if ($changeColor) {
$listOfColors = array(
'red',
'grey',
'black',
'yellow',
'green',
'cyan',
' orange'
);
shuffle($listOfColors);
$color = $listOfColors[0];
} else {
$color = 'black';
}
// draw a line like -- to foreign field
$eps->line(
$this->xSrc,
$this->ySrc,
$this->xSrc + $this->srcDir * $this->wTick,
$this->ySrc,
1
);
// draw a line like -- to master field
$eps->line(
$this->xDest + $this->destDir * $this->wTick,
$this->yDest,
$this->xDest,
$this->yDest,
1
);
// draw a line that connects to master field line and foreign field line
$eps->line(
$this->xSrc + $this->srcDir * $this->wTick,
$this->ySrc,
$this->xDest + $this->destDir * $this->wTick,
$this->yDest,
1
);
$root2 = 2 * sqrt(2);
$eps->line(
$this->xSrc + $this->srcDir * $this->wTick * 0.75,
$this->ySrc,
$this->xSrc + $this->srcDir * (0.75 - 1 / $root2) * $this->wTick,
$this->ySrc + $this->wTick / $root2,
1
);
$eps->line(
$this->xSrc + $this->srcDir * $this->wTick * 0.75,
$this->ySrc,
$this->xSrc + $this->srcDir * (0.75 - 1 / $root2) * $this->wTick,
$this->ySrc - $this->wTick / $root2,
1
);
$eps->line(
$this->xDest + $this->destDir * $this->wTick / 2,
$this->yDest,
$this->xDest + $this->destDir * (0.5 + 1 / $root2) * $this->wTick,
$this->yDest + $this->wTick / $root2,
1
);
$eps->line(
$this->xDest + $this->destDir * $this->wTick / 2,
$this->yDest,
$this->xDest + $this->destDir * (0.5 + 1 / $root2) * $this->wTick,
$this->yDest - $this->wTick / $root2,
1
);
}
}
/*
* end of the "Relation_Stats_Eps" class
*/
/**
* EPS Relation Schema Class
*
@ -692,16 +328,15 @@ class PMA_Eps_Relation_Schema extends PMA_Export_Relation_Schema
*/
function __construct()
{
parent::__construct();
global $eps,$db;
$this->setPageNumber($_POST['pdf_page_number']);
$this->setShowColor($_POST['show_color']);
$this->setShowKeys($_POST['show_keys']);
$this->setTableDimension($_POST['show_table_dimension']);
$this->setAllTablesSameWidth($_POST['all_tables_same_width']);
$this->setOrientation($_POST['orientation']);
$this->setExportType($_POST['export_type']);
$this->setOffline($_POST['offline_export']);
$this->setShowColor(isset($_REQUEST['eps_show_color']));
$this->setShowKeys(isset($_REQUEST['eps_show_keys']));
$this->setTableDimension(isset($_REQUEST['eps_show_table_dimension']));
$this->setAllTablesSameWidth(isset($_REQUEST['eps_all_tables_same_width']));
$this->setOrientation($_REQUEST['eps_orientation']);
$eps = new PMA_EPS();
$eps->setTitle(
@ -718,7 +353,7 @@ class PMA_Eps_Relation_Schema extends PMA_Export_Relation_Schema
if ($this->isOffline()) {
$alltables = array();
$tbl_coords = json_decode($GLOBALS['tbl_coords']);
$tbl_coords = json_decode($_REQUEST['tbl_coords']);
foreach ($tbl_coords as $tbl) {
$alltables[] = $tbl->table_name;
}
@ -780,10 +415,10 @@ class PMA_Eps_Relation_Schema extends PMA_Export_Relation_Schema
}
}
if ($seen_a_relation) {
$this->_drawRelations($this->showColor);
$this->_drawRelations();
}
$this->_drawTables($this->showColor);
$this->_drawTables();
$eps->endEpsDoc();
}
@ -806,13 +441,13 @@ class PMA_Eps_Relation_Schema extends PMA_Export_Relation_Schema
/**
* Defines relation objects
*
* @param string $masterTable The master table name
* @param string $font The font
* @param int $fontSize The font size
* @param string $masterField The relation field in the master table
* @param string $foreignTable The foreign table name
* @param string $foreignField The relation field in the foreign table
* @param boolean $showInfo Whether to display table position or not
* @param string $masterTable The master table name
* @param string $font The font
* @param int $fontSize The font size
* @param string $masterField The relation field in the master table
* @param string $foreignTable The foreign table name
* @param string $foreignField The relation field in the foreign table
* @param boolean $tableDimension Whether to display table position or not
*
* @return void
*
@ -822,18 +457,18 @@ class PMA_Eps_Relation_Schema extends PMA_Export_Relation_Schema
*/
private function _addRelation(
$masterTable, $font, $fontSize, $masterField,
$foreignTable, $foreignField, $showInfo
$foreignTable, $foreignField, $tableDimension
) {
if (! isset($this->_tables[$masterTable])) {
$this->_tables[$masterTable] = new Table_Stats_Eps(
$masterTable, $font, $fontSize, $this->pageNumber,
$this->_tablewidth, false, $showInfo
$this->_tablewidth, false, $tableDimension
);
}
if (! isset($this->_tables[$foreignTable])) {
$this->_tables[$foreignTable] = new Table_Stats_Eps(
$foreignTable, $font, $fontSize, $this->pageNumber,
$this->_tablewidth, false, $showInfo
$this->_tablewidth, false, $tableDimension
);
}
$this->_relations[] = new Relation_Stats_Eps(
@ -846,34 +481,30 @@ class PMA_Eps_Relation_Schema extends PMA_Export_Relation_Schema
* Draws relation arrows and lines connects master table's master field to
* foreign table's forein field
*
* @param boolean $changeColor Whether to use one color per relation or not
*
* @return void
*
* @access private
* @see Relation_Stats_Eps::relationDraw()
*/
private function _drawRelations($changeColor)
private function _drawRelations()
{
foreach ($this->_relations as $relation) {
$relation->relationDraw($changeColor);
$relation->relationDraw($this->showColor);
}
}
/**
* Draws tables
*
* @param boolean $changeColor Whether to show color for primary fields or not
*
* @return void
*
* @access private
* @see Table_Stats_Eps::Table_Stats_tableDraw()
*/
private function _drawTables($changeColor)
private function _drawTables()
{
foreach ($this->_tables as $table) {
$table->tableDraw($changeColor);
$table->tableDraw($this->showColor);
}
}
}

View File

@ -0,0 +1,201 @@
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* Contains Relation_Stats_Eps class
*
* @package PhpMyAdmin
*/
if (! defined('PHPMYADMIN')) {
exit;
}
require_once 'libraries/plugins/schema/RelationStats.class.php';
/**
* Relation preferences/statistics
*
* This class fetches the table master and foreign fields positions
* and helps in generating the Table references and then connects
* master table's master field to foreign table's foreign key
* in EPS document.
*
* @package PhpMyAdmin
* @name Relation_Stats_Eps
* @see PMA_EPS
*/
class Relation_Stats_Eps extends RealtionStats
{
/**
* Defines properties
*/
public $xSrc, $ySrc;
public $srcDir ;
public $destDir;
public $xDest, $yDest;
public $wTick = 10;
/**
* The "Relation_Stats_Eps" constructor
*
* @param string $master_table The master table name
* @param string $master_field The relation field in the master table
* @param string $foreign_table The foreign table name
* @param string $foreign_field The relation field in the foreign table
*
* @see Relation_Stats_Eps::_getXy
*/
function __construct(
$master_table, $master_field, $foreign_table, $foreign_field
) {
$src_pos = $this->_getXy($master_table, $master_field);
$dest_pos = $this->_getXy($foreign_table, $foreign_field);
/*
* [0] is x-left
* [1] is x-right
* [2] is y
*/
$src_left = $src_pos[0] - $this->wTick;
$src_right = $src_pos[1] + $this->wTick;
$dest_left = $dest_pos[0] - $this->wTick;
$dest_right = $dest_pos[1] + $this->wTick;
$d1 = abs($src_left - $dest_left);
$d2 = abs($src_right - $dest_left);
$d3 = abs($src_left - $dest_right);
$d4 = abs($src_right - $dest_right);
$d = min($d1, $d2, $d3, $d4);
if ($d == $d1) {
$this->xSrc = $src_pos[0];
$this->srcDir = -1;
$this->xDest = $dest_pos[0];
$this->destDir = -1;
} elseif ($d == $d2) {
$this->xSrc = $src_pos[1];
$this->srcDir = 1;
$this->xDest = $dest_pos[0];
$this->destDir = -1;
} elseif ($d == $d3) {
$this->xSrc = $src_pos[0];
$this->srcDir = -1;
$this->xDest = $dest_pos[1];
$this->destDir = 1;
} else {
$this->xSrc = $src_pos[1];
$this->srcDir = 1;
$this->xDest = $dest_pos[1];
$this->destDir = 1;
}
$this->ySrc = $src_pos[2] + 10;
$this->yDest = $dest_pos[2] + 10;
}
/**
* Gets arrows coordinates
*
* @param string $table The current table name
* @param string $column The relation column name
*
* @return array Arrows coordinates
*
* @access private
*/
private function _getXy($table, $column)
{
$pos = array_search($column, $table->fields);
// x_left, x_right, y
return array(
$table->x,
$table->x + $table->width,
$table->y + ($pos + 1.5) * $table->heightCell
);
}
/**
* draws relation links and arrows
* shows foreign key relations
*
* @param boolean $showColor Whether to use one color per relation or not
*
* @global object $eps The current EPS document
*
* @access public
* @see PMA_EPS
*
* @return void
*/
public function relationDraw($showColor)
{
global $eps;
if ($showColor) {
$listOfColors = array(
'red',
'grey',
'black',
'yellow',
'green',
'cyan',
'orange'
);
shuffle($listOfColors);
$color = $listOfColors[0];
} else {
$color = 'black';
}
// draw a line like -- to foreign field
$eps->line(
$this->xSrc,
$this->ySrc,
$this->xSrc + $this->srcDir * $this->wTick,
$this->ySrc,
1
);
// draw a line like -- to master field
$eps->line(
$this->xDest + $this->destDir * $this->wTick,
$this->yDest,
$this->xDest,
$this->yDest,
1
);
// draw a line that connects to master field line and foreign field line
$eps->line(
$this->xSrc + $this->srcDir * $this->wTick,
$this->ySrc,
$this->xDest + $this->destDir * $this->wTick,
$this->yDest,
1
);
$root2 = 2 * sqrt(2);
$eps->line(
$this->xSrc + $this->srcDir * $this->wTick * 0.75,
$this->ySrc,
$this->xSrc + $this->srcDir * (0.75 - 1 / $root2) * $this->wTick,
$this->ySrc + $this->wTick / $root2,
1
);
$eps->line(
$this->xSrc + $this->srcDir * $this->wTick * 0.75,
$this->ySrc,
$this->xSrc + $this->srcDir * (0.75 - 1 / $root2) * $this->wTick,
$this->ySrc - $this->wTick / $root2,
1
);
$eps->line(
$this->xDest + $this->destDir * $this->wTick / 2,
$this->yDest,
$this->xDest + $this->destDir * (0.5 + 1 / $root2) * $this->wTick,
$this->yDest + $this->wTick / $root2,
1
);
$eps->line(
$this->xDest + $this->destDir * $this->wTick / 2,
$this->yDest,
$this->xDest + $this->destDir * (0.5 + 1 / $root2) * $this->wTick,
$this->yDest - $this->wTick / $root2,
1
);
}
}
?>

View File

@ -0,0 +1,179 @@
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* Contains Table_Stats_Eps class
*
* @package PhpMyAdmin
*/
if (! defined('PHPMYADMIN')) {
exit;
}
require_once 'libraries/plugins/schema/TableStats.class.php';
/**
* Table preferences/statistics
*
* This class preserves the table co-ordinates,fields
* and helps in drawing/generating the Tables in EPS.
*
* @package PhpMyAdmin
* @name Table_Stats_Eps
* @see PMA_EPS
*/
class Table_Stats_Eps extends TableStats
{
/**
* Defines properties
*/
public $height;
public $currentCell = 0;
/**
* The "Table_Stats_Eps" constructor
*
* @param string $tableName The table name
* @param string $font The font name
* @param integer $fontSize The font size
* @param integer $pageNumber Page number
* @param integer &$same_wide_width The max width among tables
* @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
*
* @global object $eps The current eps document
* @global integer The current page number (from the
* $cfg['Servers'][$i]['table_coords'] table)
* @global array $cfgRelation The relations settings
* @global string $db The current db name
*
* @access private
* @see PMA_EPS, Table_Stats_Eps::Table_Stats_setWidth,
* Table_Stats_Eps::Table_Stats_setHeight
*/
function __construct(
$tableName, $font, $fontSize, $pageNumber, &$same_wide_width,
$showKeys = false, $tableDimension = false, $offline = false
) {
global $eps, $cfgRelation, $db;
parent::__construct(
$eps, $db, $pageNumber, $tableName, $showKeys, $tableDimension, $offline
);
// height and width
$this->_setHeightTable($fontSize);
// setWidth must me after setHeight, because title
// can include table height which changes table width
$this->_setWidthTable($font, $fontSize);
if ($same_wide_width < $this->width) {
$same_wide_width = $this->width;
}
}
/**
* Displays an error when the table cannot be found.
*
* @return void
*/
protected function showMissingTableError()
{
$this->diagram->dieSchema(
$this->pageNumber,
"EPS",
sprintf(__('The %s table doesn\'t exist!'), $this->tableName)
);
}
/**
* Displays an error on missing coordinates
*
* @return void
*/
protected function showMissingCoordinatesError()
{
$this->diagram->dieSchema(
$this->pageNumber,
"EPS",
sprintf(
__('Please configure the coordinates for table %s'),
$this->tableName
)
);
}
/**
* Sets the width of the table
*
* @param string $font The font name
* @param integer $fontSize The font size
*
* @global object $eps The current eps document
*
* @return void
*
* @access private
* @see PMA_EPS
*/
private function _setWidthTable($font,$fontSize)
{
foreach ($this->fields as $field) {
$this->width = max(
$this->width,
PMA_Font::getStringWidth($field, $font, $fontSize)
);
}
$this->width += PMA_Font::getStringWidth(' ', $font, $fontSize);
/*
* it is unknown what value must be added, because
* table title is affected by the tabe width value
*/
while ($this->width
< PMA_Font::getStringWidth($this->getTitle(), $font, $fontSize)) {
$this->width += 7;
}
}
/**
* Sets the height of the table
*
* @param integer $fontSize The font size
*
* @return void
* @access private
*/
private function _setHeightTable($fontSize)
{
$this->heightCell = $fontSize + 4;
$this->height = (count($this->fields) + 1) * $this->heightCell;
}
/**
* Draw the table
*
* @param boolean $showColor Whether to display color
*
* @global object $eps The current eps document
*
* @return void
*
* @access public
* @see PMA_EPS,PMA_EPS::line,PMA_EPS::rect
*/
public function tableDraw($showColor)
{
global $eps;
//echo $this->tableName.'<br />';
$eps->rect($this->x, $this->y + 12, $this->width, $this->heightCell, 1);
$eps->showXY($this->getTitle(), $this->x + 5, $this->y + 14);
foreach ($this->fields as $field) {
$this->currentCell += $this->heightCell;
$eps->rect(
$this->x, $this->y + 12 + $this->currentCell,
$this->width, $this->heightCell, 1
);
$eps->showXY($field, $this->x + 5, $this->y + 14 + $this->currentCell);
}
}
}
?>

View File

@ -24,8 +24,10 @@ if (getcwd() == dirname(__FILE__)) {
die('Attack stopped');
}
require_once 'Export_Relation_Schema.class.php';
require_once './libraries/PDF.class.php';
require_once 'libraries/plugins/schema/Export_Relation_Schema.class.php';
require_once 'libraries/plugins/schema/pdf/RelationStatsPdf.class.php';
require_once 'libraries/plugins/schema/pdf/TableStatsPdf.class.php';
require_once 'libraries/PDF.class.php';
/**
* Extends the "TCPDF" class and helps
@ -50,7 +52,25 @@ class PMA_Schema_PDF extends PMA_PDF
var $def_outlines;
var $widths;
private $_ff = PMA_PDF_FONT;
private $offline;
private $_offline;
private $_exportingPage;
/**
* Constructs PDF for schema export.
*
* @param string $orientation page orientation
* @param string $unit unit
* @param string $format the format used for pages
* @param int $exportingPage schema page number that is being exported
*
* @access public
*/
public function __construct(
$orientation, $unit, $format, $exportingPage
) {
parent::__construct($orientation, $unit, $format);
$this->_exportingPage = $exportingPage;
}
/**
* Sets the value for margins
@ -223,16 +243,16 @@ class PMA_Schema_PDF extends PMA_PDF
// We only show this if we find something in the new pdf_pages table
// This function must be named "Header" to work with the TCPDF library
global $cfgRelation, $db, $pdf_page_number, $with_doc;
if ($with_doc) {
if ($this->offline) {
global $cfgRelation, $db, $pdf_with_doc;
if ($pdf_with_doc) {
if ($this->_offline) {
$pg_name = __("PDF export page");
} else {
$test_query = 'SELECT * FROM '
. PMA_Util::backquote($GLOBALS['cfgRelation']['db']) . '.'
. PMA_Util::backquote($cfgRelation['pdf_pages'])
. PMA_Util::backquote($GLOBALS['cfgRelation']['pdf_pages'])
. ' WHERE db_name = \'' . PMA_Util::sqlAddSlashes($db) . '\''
. ' AND page_nr = \'' . $pdf_page_number . '\'';
. ' AND page_nr = \'' . $this->_exportingPage . '\'';
$test_rs = PMA_queryAsControlUser($test_query);
$pages = @$GLOBALS['dbi']->fetchAssoc($test_rs);
$pg_name = ucfirst($pages['page_descr']);
@ -254,8 +274,8 @@ class PMA_Schema_PDF extends PMA_PDF
*/
function Footer()
{
global $with_doc;
if ($with_doc) {
global $pdf_with_doc;
if ($pdf_with_doc) {
parent::Footer();
}
}
@ -372,435 +392,18 @@ class PMA_Schema_PDF extends PMA_PDF
return $nl;
}
/**
* Set whether the document is generated from client side DB
*
* @param string $value 'on' if offline
*
* @return void
*
* @access private
*/
public function setOffline($value)
{
$this->offline = (isset($value) && $value == 'on');
}
}
require_once './libraries/schema/TableStats.class.php';
/**
* Table preferences/statistics
*
* This class preserves the table co-ordinates,fields
* and helps in drawing/generating the Tables in PDF document.
*
* @name Table_Stats_Pdf
* @package PhpMyAdmin
* @see PMA_Schema_PDF
*/
class Table_Stats_Pdf extends TableStats
{
/**
* Defines properties
*/
public $nb_fiels;
public $height;
private $_ff = PMA_PDF_FONT;
/**
* The "Table_Stats_Pdf" constructor
* Set whether the document is generated from client side DB
*
* @param string $tableName The table name
* @param integer $fontSize The font size
* @param integer $pageNumber The current page number (from the
* $cfg['Servers'][$i]['table_coords'] table)
* @param integer &$sameWideWidth The max. with among tables
* @param boolean $showKeys Whether to display keys or not
* @param boolean $showInfo Whether to display table position or not
*
* @global object $pdf The current PDF document
* @global array $cfgRelation The relations settings
* @global string $db The current db name
*
* @see PMA_Schema_PDF, Table_Stats_Pdf::Table_Stats_setWidth,
* Table_Stats_Pdf::Table_Stats_setHeight
*/
function __construct($tableName, $fontSize, $pageNumber, &$sameWideWidth,
$showKeys = false, $showInfo = false, $offline = false
) {
global $pdf, $cfgRelation, $db;
parent::__construct(
$pdf, $db, $pageNumber, $tableName, $showKeys, $showInfo, $offline
);
$this->heightCell = 6;
$this->_setHeight();
/*
* setWidth must me after setHeight, because title
* can include table height which changes table width
*/
$this->_setWidth($fontSize);
if ($sameWideWidth < $this->width) {
$sameWideWidth = $this->width;
}
}
/**
* Displays an error when the table cannot be found.
*
* @return void
*/
protected function showMissingTableError()
{
$this->diagram->dieSchema(
$this->pageNumber,
"PDF",
sprintf(__('The %s table doesn\'t exist!'), $this->tableName)
);
}
/**
* Displays an error on missing coordinates
*
* @return void
*/
protected function showMissingCoordinatesError()
{
$this->diagram->dieSchema(
$this->pageNumber,
"PDF",
sprintf(
__('Please configure the coordinates for table %s'),
$this->tableName
)
);
}
/**
* Returns title of the current table,
* title can have the dimensions of the table
*
* @return string
*/
protected function getTitle()
{
$ret = '';
if ($this->showInfo) {
$ret = sprintf('%.0fx%0.f', $this->width, $this->height);
}
return $ret . ' ' . $this->tableName;
}
/**
* Sets the width of the table
*
* @param integer $fontSize The font size
*
* @global object $pdf The current PDF document
*
* @access private
*
* @return void
*
* @see PMA_Schema_PDF
*/
private function _setWidth($fontSize)
{
global $pdf;
foreach ($this->fields as $field) {
$this->width = max($this->width, $pdf->GetStringWidth($field));
}
$this->width += $pdf->GetStringWidth(' ');
$pdf->SetFont($this->_ff, 'B', $fontSize);
/*
* it is unknown what value must be added, because
* table title is affected by the tabe width value
*/
while ($this->width < $pdf->GetStringWidth($this->getTitle())) {
$this->width += 5;
}
$pdf->SetFont($this->_ff, '', $fontSize);
}
/**
* Sets the height of the table
* @param string $value 'on' if offline
*
* @return void
*
* @access private
*/
private function _setHeight()
public function setOffline($value)
{
$this->height = (count($this->fields) + 1) * $this->heightCell;
}
/**
* Do draw the table
*
* @param integer $fontSize The font size
* @param boolean $withDoc Whether to include links to documentation
* @param boolean|integer $setColor Whether to display color
*
* @global object $pdf The current PDF document
*
* @access public
*
* @return void
*
* @see PMA_Schema_PDF
*/
public function tableDraw($fontSize, $withDoc, $setColor = 0)
{
global $pdf, $withDoc;
$pdf->setXyScale($this->x, $this->y);
$pdf->SetFont($this->_ff, 'B', $fontSize);
if ($setColor) {
$pdf->SetTextColor(200);
$pdf->SetFillColor(0, 0, 128);
}
if ($withDoc) {
$pdf->SetLink($pdf->PMA_links['RT'][$this->tableName]['-'], -1);
} else {
$pdf->PMA_links['doc'][$this->tableName]['-'] = '';
}
$pdf->cellScale(
$this->width,
$this->heightCell,
$this->getTitle(),
1,
1,
'C',
$setColor,
$pdf->PMA_links['doc'][$this->tableName]['-']
);
$pdf->setXScale($this->x);
$pdf->SetFont($this->_ff, '', $fontSize);
$pdf->SetTextColor(0);
$pdf->SetFillColor(255);
foreach ($this->fields as $field) {
if ($setColor) {
if (in_array($field, $this->primary)) {
$pdf->SetFillColor(215, 121, 123);
}
if ($field == $this->displayfield) {
$pdf->SetFillColor(142, 159, 224);
}
}
if ($withDoc) {
$pdf->SetLink($pdf->PMA_links['RT'][$this->tableName][$field], -1);
} else {
$pdf->PMA_links['doc'][$this->tableName][$field] = '';
}
$pdf->cellScale(
$this->width,
$this->heightCell,
' ' . $field,
1,
1,
'L',
$setColor,
$pdf->PMA_links['doc'][$this->tableName][$field]
);
$pdf->setXScale($this->x);
$pdf->SetFillColor(255);
}
}
}
/**
* Relation preferences/statistics
*
* This class fetches the table master and foreign fields positions
* and helps in generating the Table references and then connects
* master table's master field to foreign table's foreign key
* in PDF document.
*
* @name Relation_Stats_Pdf
* @package PhpMyAdmin
* @see PMA_Schema_PDF::SetDrawColor, PMA_Schema_PDF::setLineWidthScale,
* PMA_Schema_PDF::lineScale
*/
class Relation_Stats_Pdf
{
/**
* Defines properties
*/
public $xSrc, $ySrc;
public $srcDir;
public $destDir;
public $xDest, $yDest;
public $wTick = 5;
/**
* The "Relation_Stats_Pdf" constructor
*
* @param string $master_table The master table name
* @param string $master_field The relation field in the master table
* @param string $foreign_table The foreign table name
* @param string $foreign_field The relation field in the foreign table
*
* @see Relation_Stats_Pdf::_getXy
*/
function __construct($master_table, $master_field, $foreign_table,
$foreign_field
) {
$src_pos = $this->_getXy($master_table, $master_field);
$dest_pos = $this->_getXy($foreign_table, $foreign_field);
/*
* [0] is x-left
* [1] is x-right
* [2] is y
*/
$src_left = $src_pos[0] - $this->wTick;
$src_right = $src_pos[1] + $this->wTick;
$dest_left = $dest_pos[0] - $this->wTick;
$dest_right = $dest_pos[1] + $this->wTick;
$d1 = abs($src_left - $dest_left);
$d2 = abs($src_right - $dest_left);
$d3 = abs($src_left - $dest_right);
$d4 = abs($src_right - $dest_right);
$d = min($d1, $d2, $d3, $d4);
if ($d == $d1) {
$this->xSrc = $src_pos[0];
$this->srcDir = -1;
$this->xDest = $dest_pos[0];
$this->destDir = -1;
} elseif ($d == $d2) {
$this->xSrc = $src_pos[1];
$this->srcDir = 1;
$this->xDest = $dest_pos[0];
$this->destDir = -1;
} elseif ($d == $d3) {
$this->xSrc = $src_pos[0];
$this->srcDir = -1;
$this->xDest = $dest_pos[1];
$this->destDir = 1;
} else {
$this->xSrc = $src_pos[1];
$this->srcDir = 1;
$this->xDest = $dest_pos[1];
$this->destDir = 1;
}
$this->ySrc = $src_pos[2];
$this->yDest = $dest_pos[2];
}
/**
* Gets arrows coordinates
*
* @param string $table The current table name
* @param string $column The relation column name
*
* @return array Arrows coordinates
*
* @access private
*/
private function _getXy($table, $column)
{
$pos = array_search($column, $table->fields);
// x_left, x_right, y
return array(
$table->x,
$table->x + $table->width,
$table->y + ($pos + 1.5) * $table->heightCell
);
}
/**
* draws relation links and arrows shows foreign key relations
*
* @param boolean $changeColor Whether to use one color per relation or not
* @param integer $i The id of the link to draw
*
* @global object $pdf The current PDF document
*
* @access public
*
* @return void
*
* @see PMA_Schema_PDF
*/
public function relationDraw($changeColor, $i)
{
global $pdf;
if ($changeColor) {
$d = $i % 6;
$j = ($i - $d) / 6;
$j = $j % 4;
$j++;
$case = array(
array(1, 0, 0),
array(0, 1, 0),
array(0, 0, 1),
array(1, 1, 0),
array(1, 0, 1),
array(0, 1, 1)
);
list ($a, $b, $c) = $case[$d];
$e = (1 - ($j - 1) / 6);
$pdf->SetDrawColor($a * 255 * $e, $b * 255 * $e, $c * 255 * $e);
} else {
$pdf->SetDrawColor(0);
}
$pdf->setLineWidthScale(0.2);
$pdf->lineScale(
$this->xSrc,
$this->ySrc,
$this->xSrc + $this->srcDir * $this->wTick,
$this->ySrc
);
$pdf->lineScale(
$this->xDest + $this->destDir * $this->wTick,
$this->yDest,
$this->xDest,
$this->yDest
);
$pdf->setLineWidthScale(0.1);
$pdf->lineScale(
$this->xSrc + $this->srcDir * $this->wTick,
$this->ySrc,
$this->xDest + $this->destDir * $this->wTick,
$this->yDest
);
/*
* Draws arrows ->
*/
$root2 = 2 * sqrt(2);
$pdf->lineScale(
$this->xSrc + $this->srcDir * $this->wTick * 0.75,
$this->ySrc,
$this->xSrc + $this->srcDir * (0.75 - 1 / $root2) * $this->wTick,
$this->ySrc + $this->wTick / $root2
);
$pdf->lineScale(
$this->xSrc + $this->srcDir * $this->wTick * 0.75,
$this->ySrc,
$this->xSrc + $this->srcDir * (0.75 - 1 / $root2) * $this->wTick,
$this->ySrc - $this->wTick / $root2
);
$pdf->lineScale(
$this->xDest + $this->destDir * $this->wTick / 2,
$this->yDest,
$this->xDest + $this->destDir * (0.5 + 1 / $root2) * $this->wTick,
$this->yDest + $this->wTick / $root2
);
$pdf->lineScale(
$this->xDest + $this->destDir * $this->wTick / 2,
$this->yDest,
$this->xDest + $this->destDir * (0.5 + 1 / $root2) * $this->wTick,
$this->yDest - $this->wTick / $root2
);
$pdf->SetDrawColor(0);
$this->_offline = (isset($value) && $value == 'on');
}
}
@ -821,6 +424,8 @@ class PMA_Pdf_Relation_Schema extends PMA_Export_Relation_Schema
/**
* Defines properties
*/
private $_showGrid;
private $_withDoc;
private $_tables = array();
private $_ff = PMA_PDF_FONT;
private $_xMax = 0;
@ -840,28 +445,28 @@ class PMA_Pdf_Relation_Schema extends PMA_Export_Relation_Schema
*
* @global object $pdf The current PDF Schema document
* @global string $db The current db name
* @global array The relations settings
* @access private
* @see PMA_Schema_PDF
*/
function __construct()
{
parent::__construct();
global $pdf, $db;
$this->setPageNumber($_POST['pdf_page_number']);
$this->setShowGrid($_POST['show_grid']);
$this->setShowColor($_POST['show_color']);
$this->setShowKeys($_POST['show_keys']);
$this->setTableDimension($_POST['show_table_dimension']);
$this->setAllTablesSameWidth($_POST['all_tables_same_width']);
$this->setWithDataDictionary($_POST['with_doc']);
$this->setOrientation($_POST['orientation']);
$this->setPaper($_POST['paper']);
$this->setExportType($_POST['export_type']);
$this->setOffline($_POST['offline_export']);
$this->setShowGrid(isset($_REQUEST['pdf_show_grid']));
$this->setShowColor(isset($_REQUEST['pdf_show_color']));
$this->setShowKeys(isset($_REQUEST['pdf_show_keys']));
$this->setTableDimension(isset($_REQUEST['pdf_show_table_dimension']));
$this->setAllTablesSameWidth(isset($_REQUEST['pdf_all_tables_same_width']));
$this->setWithDataDictionary(isset($_REQUEST['pdf_with_doc']));
$this->setOrientation($_REQUEST['pdf_orientation']);
$this->setPaper($_REQUEST['pdf_paper']);
// Initializes a new document
$pdf = new PMA_Schema_PDF($this->orientation, 'mm', $this->paper);
$pdf = new PMA_Schema_PDF(
$this->orientation, 'mm', $this->paper, intval($_REQUEST['chpage'])
);
$pdf->SetTitle(
sprintf(
__('Schema of the %s database - Page %s'),
@ -875,7 +480,7 @@ class PMA_Pdf_Relation_Schema extends PMA_Export_Relation_Schema
$pdf->setOffline($this->isOffline());
if ($this->isOffline()) {
$alltables = array();
$tbl_coords = json_decode($GLOBALS['tbl_coords']);
$tbl_coords = json_decode($_REQUEST['tbl_coords']);
foreach ($tbl_coords as $tbl) {
$alltables[] = $tbl->table_name;
}
@ -883,7 +488,7 @@ class PMA_Pdf_Relation_Schema extends PMA_Export_Relation_Schema
$alltables = $this->getAllTables($db, $this->pageNumber);
}
if ($this->withDoc) {
if ($this->_withDoc) {
$pdf->SetAutoPageBreak('auto', 15);
$pdf->setCMargin(1);
$this->dataDictionaryDoc($alltables);
@ -893,7 +498,7 @@ class PMA_Pdf_Relation_Schema extends PMA_Export_Relation_Schema
$pdf->Addpage();
if ($this->withDoc) {
if ($this->_withDoc) {
$pdf->SetLink($pdf->PMA_links['RT']['-'], -1);
$pdf->Bookmark(__('Relational schema'));
$pdf->SetAlias('{00}', $pdf->PageNo());
@ -940,7 +545,7 @@ class PMA_Pdf_Relation_Schema extends PMA_Export_Relation_Schema
// Builds and save the PDF document
$pdf->setLineWidthScale(0.1);
if ($this->showGrid) {
if ($this->_showGrid) {
$pdf->SetFontSize(10);
$this->_strokeGrid();
}
@ -988,9 +593,37 @@ class PMA_Pdf_Relation_Schema extends PMA_Export_Relation_Schema
} // end while
if ($seen_a_relation) {
$this->_drawRelations($this->showColor);
$this->_drawRelations();
}
$this->_drawTables($this->showColor);
$this->_drawTables();
}
/**
* Set Show Grid
*
* @param boolean $value show grid of the document or not
*
* @return void
*
* @access public
*/
public function setShowGrid($value)
{
$this->_showGrid = (isset($value) && $value == 'on');
}
/**
* Set Data Dictionary
*
* @param boolean $value show selected database data dictionary or not
*
* @return void
*
* @access public
*/
public function setWithDataDictionary($value)
{
$this->_withDoc = (isset($value) && $value == 'on');
}
/**
@ -1080,7 +713,7 @@ class PMA_Pdf_Relation_Schema extends PMA_Export_Relation_Schema
$gridSize = 10;
$labelHeight = 4;
$labelWidth = 5;
if ($this->withDoc) {
if ($this->_withDoc) {
$topSpace = 6;
$bottomSpace = 15;
} else {
@ -1141,19 +774,17 @@ class PMA_Pdf_Relation_Schema extends PMA_Export_Relation_Schema
/**
* Draws relation arrows
*
* @param boolean $changeColor Whether to use one color per relation or not
*
* @access private
*
* @return void
*
* @see Relation_Stats_Pdf::relationdraw()
*/
private function _drawRelations($changeColor)
private function _drawRelations()
{
$i = 0;
foreach ($this->relations as $relation) {
$relation->relationDraw($changeColor, $i);
$relation->relationDraw($this->showColor, $i);
$i++;
}
}
@ -1161,18 +792,16 @@ class PMA_Pdf_Relation_Schema extends PMA_Export_Relation_Schema
/**
* Draws tables
*
* @param boolean|integer $changeColor Whether to display table position or not
*
* @access private
*
* @return void
*
* @see Table_Stats_Pdf::tableDraw()
*/
private function _drawTables($changeColor = 0)
private function _drawTables()
{
foreach ($this->_tables as $table) {
$table->tableDraw(null, $this->withDoc, $changeColor);
$table->tableDraw(null, $this->_withDoc, $this->showColor);
}
}
@ -1194,16 +823,18 @@ class PMA_Pdf_Relation_Schema extends PMA_Export_Relation_Schema
*/
private function _showOutput($pageNumber)
{
global $pdf, $cfgRelation;
global $pdf;
// Get the name of this pdfpage to use as filename
if ($this->isOffline()) {
$filename = __("PDF export page") . '.pdf';
} else {
$editingPage = $_POST['chpage'] != '-1' ? $_POST['chpage'] : $pageNumber;
$editingPage = $_REQUEST['chpage'] != '-1'
? $_REQUEST['chpage']
: $pageNumber;
$_name_sql = 'SELECT page_descr FROM '
. PMA_Util::backquote($GLOBALS['cfgRelation']['db']) . '.'
. PMA_Util::backquote($cfgRelation['pdf_pages'])
. PMA_Util::backquote($GLOBALS['cfgRelation']['pdf_pages'])
. ' WHERE page_nr = ' . $editingPage;
$_name_rs = PMA_queryAsControlUser($_name_sql);
if ($_name_rs) {
@ -1227,9 +858,9 @@ class PMA_Pdf_Relation_Schema extends PMA_Export_Relation_Schema
*/
public function dataDictionaryDoc($alltables)
{
global $db, $pdf, $orientation, $paper;
global $db, $pdf, $pdf_orientation, $pdf_paper;
// TOC
$pdf->addpage($_POST['orientation']);
$pdf->addpage($this->orientation);
$pdf->Cell(0, 9, __('Table of contents'), 1, 0, 'C');
$pdf->Ln(15);
$i = 1;
@ -1274,7 +905,7 @@ class PMA_Pdf_Relation_Schema extends PMA_Export_Relation_Schema
foreach ($alltables as $table) {
$z++;
$pdf->SetAutoPageBreak(true, 15);
$pdf->addpage($_POST['orientation']);
$pdf->addpage($this->orientation);
$pdf->Bookmark($table);
$pdf->SetAlias('{' . sprintf("%02d", $z) . '}', $pdf->PageNo());
$pdf->PMA_links['RT'][$table]['-'] = $pdf->AddLink();
@ -1404,7 +1035,7 @@ class PMA_Pdf_Relation_Schema extends PMA_Export_Relation_Schema
}
$pdf->SetFont($this->_ff, 'B');
if (isset($orientation) && $orientation == 'L') {
if (isset($pdf_orientation) && $pdf_orientation == 'L') {
$pdf->Cell(25, 8, __('Column'), 1, 0, 'C');
$pdf->Cell(20, 8, __('Type'), 1, 0, 'C');
$pdf->Cell(20, 8, __('Attributes'), 1, 0, 'C');
@ -1413,7 +1044,7 @@ class PMA_Pdf_Relation_Schema extends PMA_Export_Relation_Schema
$pdf->Cell(25, 8, __('Extra'), 1, 0, 'C');
$pdf->Cell(45, 8, __('Links to'), 1, 0, 'C');
if ($paper == 'A4') {
if ($pdf_paper == 'A4') {
$comments_width = 67;
} else {
// this is really intended for 'letter'

View File

@ -0,0 +1,204 @@
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* Contains Relation_Stats_Pdf class
*
* @package PhpMyAdmin
*/
if (! defined('PHPMYADMIN')) {
exit;
}
require_once 'libraries/plugins/schema/RelationStats.class.php';
/**
* Relation preferences/statistics
*
* This class fetches the table master and foreign fields positions
* and helps in generating the Table references and then connects
* master table's master field to foreign table's foreign key
* in PDF document.
*
* @name Relation_Stats_Pdf
* @package PhpMyAdmin
* @see PMA_Schema_PDF::SetDrawColor, PMA_Schema_PDF::setLineWidthScale,
* PMA_Schema_PDF::lineScale
*/
class Relation_Stats_Pdf extends RealtionStats
{
/**
* Defines properties
*/
public $xSrc, $ySrc;
public $srcDir;
public $destDir;
public $xDest, $yDest;
public $wTick = 5;
/**
* The "Relation_Stats_Pdf" constructor
*
* @param string $master_table The master table name
* @param string $master_field The relation field in the master table
* @param string $foreign_table The foreign table name
* @param string $foreign_field The relation field in the foreign table
*
* @see Relation_Stats_Pdf::_getXy
*/
function __construct($master_table, $master_field, $foreign_table,
$foreign_field
) {
$src_pos = $this->_getXy($master_table, $master_field);
$dest_pos = $this->_getXy($foreign_table, $foreign_field);
/*
* [0] is x-left
* [1] is x-right
* [2] is y
*/
$src_left = $src_pos[0] - $this->wTick;
$src_right = $src_pos[1] + $this->wTick;
$dest_left = $dest_pos[0] - $this->wTick;
$dest_right = $dest_pos[1] + $this->wTick;
$d1 = abs($src_left - $dest_left);
$d2 = abs($src_right - $dest_left);
$d3 = abs($src_left - $dest_right);
$d4 = abs($src_right - $dest_right);
$d = min($d1, $d2, $d3, $d4);
if ($d == $d1) {
$this->xSrc = $src_pos[0];
$this->srcDir = -1;
$this->xDest = $dest_pos[0];
$this->destDir = -1;
} elseif ($d == $d2) {
$this->xSrc = $src_pos[1];
$this->srcDir = 1;
$this->xDest = $dest_pos[0];
$this->destDir = -1;
} elseif ($d == $d3) {
$this->xSrc = $src_pos[0];
$this->srcDir = -1;
$this->xDest = $dest_pos[1];
$this->destDir = 1;
} else {
$this->xSrc = $src_pos[1];
$this->srcDir = 1;
$this->xDest = $dest_pos[1];
$this->destDir = 1;
}
$this->ySrc = $src_pos[2];
$this->yDest = $dest_pos[2];
}
/**
* Gets arrows coordinates
*
* @param string $table The current table name
* @param string $column The relation column name
*
* @return array Arrows coordinates
*
* @access private
*/
private function _getXy($table, $column)
{
$pos = array_search($column, $table->fields);
// x_left, x_right, y
return array(
$table->x,
$table->x + $table->width,
$table->y + ($pos + 1.5) * $table->heightCell
);
}
/**
* draws relation links and arrows shows foreign key relations
*
* @param boolean $showColor Whether to use one color per relation or not
* @param integer $i The id of the link to draw
*
* @global object $pdf The current PDF document
*
* @access public
*
* @return void
*
* @see PMA_Schema_PDF
*/
public function relationDraw($showColor, $i)
{
global $pdf;
if ($showColor) {
$d = $i % 6;
$j = ($i - $d) / 6;
$j = $j % 4;
$j++;
$case = array(
array(1, 0, 0),
array(0, 1, 0),
array(0, 0, 1),
array(1, 1, 0),
array(1, 0, 1),
array(0, 1, 1)
);
list ($a, $b, $c) = $case[$d];
$e = (1 - ($j - 1) / 6);
$pdf->SetDrawColor($a * 255 * $e, $b * 255 * $e, $c * 255 * $e);
} else {
$pdf->SetDrawColor(0);
}
$pdf->setLineWidthScale(0.2);
$pdf->lineScale(
$this->xSrc,
$this->ySrc,
$this->xSrc + $this->srcDir * $this->wTick,
$this->ySrc
);
$pdf->lineScale(
$this->xDest + $this->destDir * $this->wTick,
$this->yDest,
$this->xDest,
$this->yDest
);
$pdf->setLineWidthScale(0.1);
$pdf->lineScale(
$this->xSrc + $this->srcDir * $this->wTick,
$this->ySrc,
$this->xDest + $this->destDir * $this->wTick,
$this->yDest
);
/*
* Draws arrows ->
*/
$root2 = 2 * sqrt(2);
$pdf->lineScale(
$this->xSrc + $this->srcDir * $this->wTick * 0.75,
$this->ySrc,
$this->xSrc + $this->srcDir * (0.75 - 1 / $root2) * $this->wTick,
$this->ySrc + $this->wTick / $root2
);
$pdf->lineScale(
$this->xSrc + $this->srcDir * $this->wTick * 0.75,
$this->ySrc,
$this->xSrc + $this->srcDir * (0.75 - 1 / $root2) * $this->wTick,
$this->ySrc - $this->wTick / $root2
);
$pdf->lineScale(
$this->xDest + $this->destDir * $this->wTick / 2,
$this->yDest,
$this->xDest + $this->destDir * (0.5 + 1 / $root2) * $this->wTick,
$this->yDest + $this->wTick / $root2
);
$pdf->lineScale(
$this->xDest + $this->destDir * $this->wTick / 2,
$this->yDest,
$this->xDest + $this->destDir * (0.5 + 1 / $root2) * $this->wTick,
$this->yDest - $this->wTick / $root2
);
$pdf->SetDrawColor(0);
}
}
?>

View File

@ -0,0 +1,240 @@
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* Contains Table_Stats_Pdf class
*
* @package PhpMyAdmin
*/
if (! defined('PHPMYADMIN')) {
exit;
}
require_once 'libraries/plugins/schema/TableStats.class.php';
/**
* Table preferences/statistics
*
* This class preserves the table co-ordinates,fields
* and helps in drawing/generating the Tables in PDF document.
*
* @name Table_Stats_Pdf
* @package PhpMyAdmin
* @see PMA_Schema_PDF
*/
class Table_Stats_Pdf extends TableStats
{
/**
* Defines properties
*/
public $nb_fiels;
public $height;
private $_ff = PMA_PDF_FONT;
/**
* The "Table_Stats_Pdf" constructor
*
* @param string $tableName The table name
* @param integer $fontSize The font size
* @param integer $pageNumber The current page number (from the
* $cfg['Servers'][$i]['table_coords'] table)
* @param integer &$sameWideWidth The max. with among tables
* @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
*
* @global object $pdf The current PDF document
* @global array $cfgRelation The relations settings
* @global string $db The current db name
*
* @see PMA_Schema_PDF, Table_Stats_Pdf::Table_Stats_setWidth,
* Table_Stats_Pdf::Table_Stats_setHeight
*/
function __construct($tableName, $fontSize, $pageNumber, &$sameWideWidth,
$showKeys = false, $tableDimension = false, $offline = false
) {
global $pdf, $cfgRelation, $db;
parent::__construct(
$pdf, $db, $pageNumber, $tableName, $showKeys, $tableDimension, $offline
);
$this->heightCell = 6;
$this->_setHeight();
/*
* setWidth must me after setHeight, because title
* can include table height which changes table width
*/
$this->_setWidth($fontSize);
if ($sameWideWidth < $this->width) {
$sameWideWidth = $this->width;
}
}
/**
* Displays an error when the table cannot be found.
*
* @return void
*/
protected function showMissingTableError()
{
$this->diagram->dieSchema(
$this->pageNumber,
"PDF",
sprintf(__('The %s table doesn\'t exist!'), $this->tableName)
);
}
/**
* Displays an error on missing coordinates
*
* @return void
*/
protected function showMissingCoordinatesError()
{
$this->diagram->dieSchema(
$this->pageNumber,
"PDF",
sprintf(
__('Please configure the coordinates for table %s'),
$this->tableName
)
);
}
/**
* Returns title of the current table,
* title can have the dimensions of the table
*
* @return string
*/
protected function getTitle()
{
$ret = '';
if ($this->tableDimension) {
$ret = sprintf('%.0fx%0.f', $this->width, $this->height);
}
return $ret . ' ' . $this->tableName;
}
/**
* Sets the width of the table
*
* @param integer $fontSize The font size
*
* @global object $pdf The current PDF document
*
* @access private
*
* @return void
*
* @see PMA_Schema_PDF
*/
private function _setWidth($fontSize)
{
global $pdf;
foreach ($this->fields as $field) {
$this->width = max($this->width, $pdf->GetStringWidth($field));
}
$this->width += $pdf->GetStringWidth(' ');
$pdf->SetFont($this->_ff, 'B', $fontSize);
/*
* it is unknown what value must be added, because
* table title is affected by the tabe width value
*/
while ($this->width < $pdf->GetStringWidth($this->getTitle())) {
$this->width += 5;
}
$pdf->SetFont($this->_ff, '', $fontSize);
}
/**
* Sets the height of the table
*
* @return void
*
* @access private
*/
private function _setHeight()
{
$this->height = (count($this->fields) + 1) * $this->heightCell;
}
/**
* Do draw the table
*
* @param integer $fontSize The font size
* @param boolean $withDoc Whether to include links to documentation
* @param boolean|integer $setColor Whether to display color
*
* @global object $pdf The current PDF document
*
* @access public
*
* @return void
*
* @see PMA_Schema_PDF
*/
public function tableDraw($fontSize, $withDoc, $setColor = 0)
{
global $pdf;
$pdf->setXyScale($this->x, $this->y);
$pdf->SetFont($this->_ff, 'B', $fontSize);
if ($setColor) {
$pdf->SetTextColor(200);
$pdf->SetFillColor(0, 0, 128);
}
if ($withDoc) {
$pdf->SetLink($pdf->PMA_links['RT'][$this->tableName]['-'], -1);
} else {
$pdf->PMA_links['doc'][$this->tableName]['-'] = '';
}
$pdf->cellScale(
$this->width,
$this->heightCell,
$this->getTitle(),
1,
1,
'C',
$setColor,
$pdf->PMA_links['doc'][$this->tableName]['-']
);
$pdf->setXScale($this->x);
$pdf->SetFont($this->_ff, '', $fontSize);
$pdf->SetTextColor(0);
$pdf->SetFillColor(255);
foreach ($this->fields as $field) {
if ($setColor) {
if (in_array($field, $this->primary)) {
$pdf->SetFillColor(215, 121, 123);
}
if ($field == $this->displayfield) {
$pdf->SetFillColor(142, 159, 224);
}
}
if ($withDoc) {
$pdf->SetLink($pdf->PMA_links['RT'][$this->tableName][$field], -1);
} else {
$pdf->PMA_links['doc'][$this->tableName][$field] = '';
}
$pdf->cellScale(
$this->width,
$this->heightCell,
' ' . $field,
1,
1,
'L',
$setColor,
$pdf->PMA_links['doc'][$this->tableName][$field]
);
$pdf->setXScale($this->x);
$pdf->SetFillColor(255);
}
}
}
?>

View File

@ -0,0 +1,187 @@
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* Contains Relation_Stats_Svg class
*
* @package PhpMyAdmin
*/
if (! defined('PHPMYADMIN')) {
exit;
}
require_once 'libraries/plugins/schema/RelationStats.class.php';
/**
* Relation preferences/statistics
*
* This class fetches the table master and foreign fields positions
* and helps in generating the Table references and then connects
* master table's master field to foreign table's foreign key
* in SVG XML document.
*
* @package PhpMyAdmin
* @name Relation_Stats_Svg
* @see PMA_SVG::printElementLine
*/
class Relation_Stats_Svg extends RealtionStats
{
/**
* Defines properties
*/
public $xSrc, $ySrc;
public $srcDir ;
public $destDir;
public $xDest, $yDest;
public $wTick = 10;
/**
* The "Relation_Stats_Svg" constructor
*
* @param string $master_table The master table name
* @param string $master_field The relation field in the master table
* @param string $foreign_table The foreign table name
* @param string $foreign_field The relation field in the foreign table
*
* @see Relation_Stats_Svg::_getXy
*/
function __construct($master_table, $master_field, $foreign_table,
$foreign_field
) {
$src_pos = $this->_getXy($master_table, $master_field);
$dest_pos = $this->_getXy($foreign_table, $foreign_field);
/*
* [0] is x-left
* [1] is x-right
* [2] is y
*/
$src_left = $src_pos[0] - $this->wTick;
$src_right = $src_pos[1] + $this->wTick;
$dest_left = $dest_pos[0] - $this->wTick;
$dest_right = $dest_pos[1] + $this->wTick;
$d1 = abs($src_left - $dest_left);
$d2 = abs($src_right - $dest_left);
$d3 = abs($src_left - $dest_right);
$d4 = abs($src_right - $dest_right);
$d = min($d1, $d2, $d3, $d4);
if ($d == $d1) {
$this->xSrc = $src_pos[0];
$this->srcDir = -1;
$this->xDest = $dest_pos[0];
$this->destDir = -1;
} elseif ($d == $d2) {
$this->xSrc = $src_pos[1];
$this->srcDir = 1;
$this->xDest = $dest_pos[0];
$this->destDir = -1;
} elseif ($d == $d3) {
$this->xSrc = $src_pos[0];
$this->srcDir = -1;
$this->xDest = $dest_pos[1];
$this->destDir = 1;
} else {
$this->xSrc = $src_pos[1];
$this->srcDir = 1;
$this->xDest = $dest_pos[1];
$this->destDir = 1;
}
$this->ySrc = $src_pos[2];
$this->yDest = $dest_pos[2];
}
/**
* Gets arrows coordinates
*
* @param string $table The current table name
* @param string $column The relation column name
*
* @return array Arrows coordinates
* @access private
*/
function _getXy($table, $column)
{
$pos = array_search($column, $table->fields);
// x_left, x_right, y
return array(
$table->x,
$table->x + $table->width,
$table->y + ($pos + 1.5) * $table->heightCell
);
}
/**
* draws relation links and arrows shows foreign key relations
*
* @param boolean $showColor Whether to use one color per relation or not
*
* @global object $svg The current SVG image document
*
* @return void
* @access public
*
* @see PMA_SVG
*/
public function relationDraw($showColor)
{
global $svg;
if ($showColor) {
$listOfColors = array(
'red',
'grey',
'black',
'yellow',
'green',
'cyan',
' orange'
);
shuffle($listOfColors);
$color = $listOfColors[0];
} else {
$color = 'black';
}
$svg->printElementLine(
'line', $this->xSrc, $this->ySrc,
$this->xSrc + $this->srcDir * $this->wTick, $this->ySrc,
'fill:' . $color . ';stroke:black;stroke-width:2;'
);
$svg->printElementLine(
'line', $this->xDest + $this->destDir * $this->wTick,
$this->yDest, $this->xDest, $this->yDest,
'fill:' . $color . ';stroke:black;stroke-width:2;'
);
$svg->printElementLine(
'line', $this->xSrc + $this->srcDir * $this->wTick, $this->ySrc,
$this->xDest + $this->destDir * $this->wTick, $this->yDest,
'fill:' . $color . ';stroke:' . $color . ';stroke-width:1;'
);
$root2 = 2 * sqrt(2);
$svg->printElementLine(
'line', $this->xSrc + $this->srcDir * $this->wTick * 0.75, $this->ySrc,
$this->xSrc + $this->srcDir * (0.75 - 1 / $root2) * $this->wTick,
$this->ySrc + $this->wTick / $root2,
'fill:' . $color . ';stroke:black;stroke-width:2;'
);
$svg->printElementLine(
'line', $this->xSrc + $this->srcDir * $this->wTick * 0.75, $this->ySrc,
$this->xSrc + $this->srcDir * (0.75 - 1 / $root2) * $this->wTick,
$this->ySrc - $this->wTick / $root2,
'fill:' . $color . ';stroke:black;stroke-width:2;'
);
$svg->printElementLine(
'line', $this->xDest + $this->destDir * $this->wTick / 2, $this->yDest,
$this->xDest + $this->destDir * (0.5 + 1 / $root2) * $this->wTick,
$this->yDest + $this->wTick / $root2,
'fill:' . $color . ';stroke:black;stroke-width:2;'
);
$svg->printElementLine(
'line', $this->xDest + $this->destDir * $this->wTick / 2, $this->yDest,
$this->xDest + $this->destDir * (0.5 + 1 / $root2) * $this->wTick,
$this->yDest - $this->wTick / $root2,
'fill:' . $color . ';stroke:black;stroke-width:2;'
);
}
}
?>

View File

@ -9,7 +9,9 @@ if (! defined('PHPMYADMIN')) {
exit;
}
require_once 'Export_Relation_Schema.class.php';
require_once 'libraries/plugins/schema/Export_Relation_Schema.class.php';
require_once 'libraries/plugins/schema/svg/RelationStatsSvg.class.php';
require_once 'libraries/plugins/schema/svg/TableStatsSvg.class.php';
require_once 'libraries/Font.class.php';
/**
@ -263,371 +265,6 @@ class PMA_SVG extends XMLWriter
}
}
require_once './libraries/schema/TableStats.class.php';
/**
* Table preferences/statistics
*
* This class preserves the table co-ordinates,fields
* and helps in drawing/generating the Tables in SVG XML document.
*
* @package PhpMyAdmin
* @name Table_Stats_Svg
* @see PMA_SVG
*/
class Table_Stats_Svg extends TableStats
{
/**
* Defines properties
*/
public $height;
public $currentCell = 0;
/**
* The "Table_Stats_Svg" constructor
*
* @param string $tableName The table name
* @param string $font Font face
* @param integer $fontSize The font size
* @param integer $pageNumber Page number
* @param integer &$same_wide_width The max. with among tables
* @param boolean $showKeys Whether to display keys or not
* @param boolean $showInfo Whether to display table position or not
*
* @global object $svg The current SVG image document
* @global integer The current page number (from the
* $cfg['Servers'][$i]['table_coords'] table)
* @global array $cfgRelation The relations settings
* @global string $db The current db name
*
* @access private
*
* @see PMA_SVG, Table_Stats_Svg::Table_Stats_setWidth,
* Table_Stats_Svg::Table_Stats_setHeight
*/
function __construct(
$tableName, $font, $fontSize, $pageNumber, &$same_wide_width,
$showKeys = false, $showInfo = false, $offline = false
) {
global $svg, $cfgRelation, $db;
parent::__construct(
$svg, $db, $pageNumber, $tableName, $showKeys, $showInfo, $offline
);
// height and width
$this->_setHeightTable($fontSize);
// setWidth must me after setHeight, because title
// can include table height which changes table width
$this->_setWidthTable($font, $fontSize);
if ($same_wide_width < $this->width) {
$same_wide_width = $this->width;
}
}
/**
* Displays an error when the table cannot be found.
*
* @return void
*/
protected function showMissingTableError()
{
$this->diagram->dieSchema(
$this->pageNumber,
"SVG",
sprintf(__('The %s table doesn\'t exist!'), $this->tableName)
);
}
/**
* Displays an error on missing coordinates
*
* @return void
*/
protected function showMissingCoordinatesError()
{
$this->diagram->dieSchema(
$this->pageNumber,
"SVG",
sprintf(
__('Please configure the coordinates for table %s'),
$this->tableName
)
);
}
/**
* Sets the width of the table
*
* @param string $font The font size
* @param integer $fontSize The font size
*
* @global object $svg The current SVG image document
*
* @return void
* @access private
*
* @see PMA_SVG
*/
private function _setWidthTable($font,$fontSize)
{
foreach ($this->fields as $field) {
$this->width = max(
$this->width,
PMA_Font::getStringWidth($field, $font, $fontSize)
);
}
$this->width += PMA_Font::getStringWidth(' ', $font, $fontSize);
/*
* it is unknown what value must be added, because
* table title is affected by the tabe width value
*/
while ($this->width
< PMA_Font::getStringWidth($this->getTitle(), $font, $fontSize)
) {
$this->width += 7;
}
}
/**
* Sets the height of the table
*
* @param integer $fontSize font size
*
* @return void
* @access private
*/
function _setHeightTable($fontSize)
{
$this->heightCell = $fontSize + 4;
$this->height = (count($this->fields) + 1) * $this->heightCell;
}
/**
* draw the table
*
* @param boolean $showColor Whether to display color
*
* @global object $svg The current SVG image document
*
* @access public
* @return void
*
* @see PMA_SVG,PMA_SVG::printElement
*/
public function tableDraw($showColor)
{
global $svg;
//echo $this->tableName.'<br />';
$svg->printElement(
'rect', $this->x, $this->y, $this->width,
$this->heightCell, null, 'fill:red;stroke:black;'
);
$svg->printElement(
'text', $this->x + 5, $this->y+ 14, $this->width, $this->heightCell,
$this->getTitle(), 'fill:none;stroke:black;'
);
foreach ($this->fields as $field) {
$this->currentCell += $this->heightCell;
$showColor = 'none';
if ($showColor) {
if (in_array($field, $this->primary)) {
$showColor = '#0c0';
}
if ($field == $this->displayfield) {
$showColor = 'none';
}
}
$svg->printElement(
'rect', $this->x, $this->y + $this->currentCell, $this->width,
$this->heightCell, null, 'fill:' . $showColor . ';stroke:black;'
);
$svg->printElement(
'text', $this->x + 5, $this->y + 14 + $this->currentCell,
$this->width, $this->heightCell, $field, 'fill:none;stroke:black;'
);
}
}
}
/**
* Relation preferences/statistics
*
* This class fetches the table master and foreign fields positions
* and helps in generating the Table references and then connects
* master table's master field to foreign table's foreign key
* in SVG XML document.
*
* @package PhpMyAdmin
* @name Relation_Stats_Svg
* @see PMA_SVG::printElementLine
*/
class Relation_Stats_Svg
{
/**
* Defines properties
*/
public $xSrc, $ySrc;
public $srcDir ;
public $destDir;
public $xDest, $yDest;
public $wTick = 10;
/**
* The "Relation_Stats_Svg" constructor
*
* @param string $master_table The master table name
* @param string $master_field The relation field in the master table
* @param string $foreign_table The foreign table name
* @param string $foreign_field The relation field in the foreign table
*
* @see Relation_Stats_Svg::_getXy
*/
function __construct($master_table, $master_field, $foreign_table,
$foreign_field
) {
$src_pos = $this->_getXy($master_table, $master_field);
$dest_pos = $this->_getXy($foreign_table, $foreign_field);
/*
* [0] is x-left
* [1] is x-right
* [2] is y
*/
$src_left = $src_pos[0] - $this->wTick;
$src_right = $src_pos[1] + $this->wTick;
$dest_left = $dest_pos[0] - $this->wTick;
$dest_right = $dest_pos[1] + $this->wTick;
$d1 = abs($src_left - $dest_left);
$d2 = abs($src_right - $dest_left);
$d3 = abs($src_left - $dest_right);
$d4 = abs($src_right - $dest_right);
$d = min($d1, $d2, $d3, $d4);
if ($d == $d1) {
$this->xSrc = $src_pos[0];
$this->srcDir = -1;
$this->xDest = $dest_pos[0];
$this->destDir = -1;
} elseif ($d == $d2) {
$this->xSrc = $src_pos[1];
$this->srcDir = 1;
$this->xDest = $dest_pos[0];
$this->destDir = -1;
} elseif ($d == $d3) {
$this->xSrc = $src_pos[0];
$this->srcDir = -1;
$this->xDest = $dest_pos[1];
$this->destDir = 1;
} else {
$this->xSrc = $src_pos[1];
$this->srcDir = 1;
$this->xDest = $dest_pos[1];
$this->destDir = 1;
}
$this->ySrc = $src_pos[2];
$this->yDest = $dest_pos[2];
}
/**
* Gets arrows coordinates
*
* @param string $table The current table name
* @param string $column The relation column name
*
* @return array Arrows coordinates
* @access private
*/
function _getXy($table, $column)
{
$pos = array_search($column, $table->fields);
// x_left, x_right, y
return array(
$table->x,
$table->x + $table->width,
$table->y + ($pos + 1.5) * $table->heightCell
);
}
/**
* draws relation links and arrows shows foreign key relations
*
* @param boolean $changeColor Whether to use one color per relation or not
*
* @global object $svg The current SVG image document
*
* @return void
* @access public
*
* @see PMA_SVG
*/
public function relationDraw($changeColor)
{
global $svg;
if ($changeColor) {
$listOfColors = array(
'red',
'grey',
'black',
'yellow',
'green',
'cyan',
' orange'
);
shuffle($listOfColors);
$color = $listOfColors[0];
} else {
$color = 'black';
}
$svg->printElementLine(
'line', $this->xSrc, $this->ySrc,
$this->xSrc + $this->srcDir * $this->wTick, $this->ySrc,
'fill:' . $color . ';stroke:black;stroke-width:2;'
);
$svg->printElementLine(
'line', $this->xDest + $this->destDir * $this->wTick,
$this->yDest, $this->xDest, $this->yDest,
'fill:' . $color . ';stroke:black;stroke-width:2;'
);
$svg->printElementLine(
'line', $this->xSrc + $this->srcDir * $this->wTick, $this->ySrc,
$this->xDest + $this->destDir * $this->wTick, $this->yDest,
'fill:' . $color . ';stroke:' . $color . ';stroke-width:1;'
);
$root2 = 2 * sqrt(2);
$svg->printElementLine(
'line', $this->xSrc + $this->srcDir * $this->wTick * 0.75, $this->ySrc,
$this->xSrc + $this->srcDir * (0.75 - 1 / $root2) * $this->wTick,
$this->ySrc + $this->wTick / $root2,
'fill:' . $color . ';stroke:black;stroke-width:2;'
);
$svg->printElementLine(
'line', $this->xSrc + $this->srcDir * $this->wTick * 0.75, $this->ySrc,
$this->xSrc + $this->srcDir * (0.75 - 1 / $root2) * $this->wTick,
$this->ySrc - $this->wTick / $root2,
'fill:' . $color . ';stroke:black;stroke-width:2;'
);
$svg->printElementLine(
'line', $this->xDest + $this->destDir * $this->wTick / 2, $this->yDest,
$this->xDest + $this->destDir * (0.5 + 1 / $root2) * $this->wTick,
$this->yDest + $this->wTick / $root2,
'fill:' . $color . ';stroke:black;stroke-width:2;'
);
$svg->printElementLine(
'line', $this->xDest + $this->destDir * $this->wTick / 2, $this->yDest,
$this->xDest + $this->destDir * (0.5 + 1 / $root2) * $this->wTick,
$this->yDest - $this->wTick / $root2,
'fill:' . $color . ';stroke:black;stroke-width:2;'
);
}
}
/*
* end of the "Relation_Stats_Svg" class
*/
/**
* Svg Relation Schema Class
*
@ -664,15 +301,14 @@ class PMA_Svg_Relation_Schema extends PMA_Export_Relation_Schema
*/
function __construct()
{
global $svg,$db;
parent::__construct();
$this->setPageNumber($_POST['pdf_page_number']);
$this->setShowColor($_POST['show_color']);
$this->setShowKeys($_POST['show_keys']);
$this->setTableDimension($_POST['show_table_dimension']);
$this->setAllTablesSameWidth($_POST['all_tables_same_width']);
$this->setExportType($_POST['export_type']);
$this->setOffline($_POST['offline_export']);
global $svg, $db;
$this->setShowColor(isset($_REQUEST['svg_show_color']));
$this->setShowKeys(isset($_REQUEST['svg_show_keys']));
$this->setTableDimension(isset($_REQUEST['svg_show_table_dimension']));
$this->setAllTablesSameWidth(isset($_REQUEST['svg_all_tables_same_width']));
$svg = new PMA_SVG();
$svg->setTitle(
@ -689,7 +325,7 @@ class PMA_Svg_Relation_Schema extends PMA_Export_Relation_Schema
if ($this->isOffline()) {
$alltables = array();
$tbl_coords = json_decode($GLOBALS['tbl_coords']);
$tbl_coords = json_decode($_REQUEST['tbl_coords']);
foreach ($tbl_coords as $tbl) {
$alltables[] = $tbl->table_name;
}
@ -751,10 +387,10 @@ class PMA_Svg_Relation_Schema extends PMA_Export_Relation_Schema
}
}
if ($seen_a_relation) {
$this->_drawRelations($this->showColor);
$this->_drawRelations();
}
$this->_drawTables($this->showColor);
$this->_drawTables();
$svg->endSvgDoc();
}
@ -766,7 +402,7 @@ class PMA_Svg_Relation_Schema extends PMA_Export_Relation_Schema
*/
function showOutput()
{
global $svg,$db;
global $svg, $db;
$filename = $db . '-' . $this->pageNumber;
if ($this->isOffline()) {
$filename = __("SVG export page");
@ -794,13 +430,13 @@ class PMA_Svg_Relation_Schema extends PMA_Export_Relation_Schema
/**
* Defines relation objects
*
* @param string $masterTable The master table name
* @param string $font The font face
* @param int $fontSize Font size
* @param string $masterField The relation field in the master table
* @param string $foreignTable The foreign table name
* @param string $foreignField The relation field in the foreign table
* @param boolean $showInfo Whether to display table position or not
* @param string $masterTable The master table name
* @param string $font The font face
* @param int $fontSize Font size
* @param string $masterField The relation field in the master table
* @param string $foreignTable The foreign table name
* @param string $foreignField The relation field in the foreign table
* @param boolean $tableDimension Whether to display table position or not
*
* @access private
* @return void
@ -810,19 +446,19 @@ class PMA_Svg_Relation_Schema extends PMA_Export_Relation_Schema
*/
private function _addRelation(
$masterTable,$font,$fontSize, $masterField,
$foreignTable, $foreignField, $showInfo
$foreignTable, $foreignField, $tableDimension
) {
if (! isset($this->_tables[$masterTable])) {
$this->_tables[$masterTable] = new Table_Stats_Svg(
$masterTable, $font, $fontSize, $this->pageNumber,
$this->_tablewidth, false, $showInfo
$this->_tablewidth, false, $tableDimension
);
$this->_setMinMax($this->_tables[$masterTable]);
}
if (! isset($this->_tables[$foreignTable])) {
$this->_tables[$foreignTable] = new Table_Stats_Svg(
$foreignTable, $font, $fontSize, $this->pageNumber,
$this->_tablewidth, false, $showInfo
$this->_tablewidth, false, $tableDimension
);
$this->_setMinMax($this->_tables[$foreignTable]);
}
@ -837,34 +473,30 @@ class PMA_Svg_Relation_Schema extends PMA_Export_Relation_Schema
* connects master table's master field to
* foreign table's forein field
*
* @param boolean $changeColor Whether to use one color per relation or not
*
* @return void
* @access private
*
* @see Relation_Stats_Svg::relationDraw()
*/
private function _drawRelations($changeColor)
private function _drawRelations()
{
foreach ($this->_relations as $relation) {
$relation->relationDraw($changeColor);
$relation->relationDraw($this->showColor);
}
}
/**
* Draws tables
*
* @param boolean $changeColor Whether to show color for primary fields or not
*
* @return void
* @access private
*
* @see Table_Stats_Svg::Table_Stats_tableDraw()
*/
private function _drawTables($changeColor)
private function _drawTables()
{
foreach ($this->_tables as $table) {
$table->tableDraw($changeColor);
$table->tableDraw($this->showColor);
}
}
}

View File

@ -0,0 +1,198 @@
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* Contains Table_Stats_Svg class
*
* @package PhpMyAdmin
*/
if (! defined('PHPMYADMIN')) {
exit;
}
require_once 'libraries/plugins/schema/TableStats.class.php';
/**
* Table preferences/statistics
*
* This class preserves the table co-ordinates,fields
* and helps in drawing/generating the Tables in SVG XML document.
*
* @package PhpMyAdmin
* @name Table_Stats_Svg
* @see PMA_SVG
*/
class Table_Stats_Svg extends TableStats
{
/**
* Defines properties
*/
public $height;
public $currentCell = 0;
/**
* The "Table_Stats_Svg" constructor
*
* @param string $tableName The table name
* @param string $font Font face
* @param integer $fontSize The font size
* @param integer $pageNumber Page number
* @param integer &$same_wide_width The max. with among tables
* @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
*
* @global object $svg The current SVG image document
* @global array $cfgRelation The relations settings
* @global string $db The current db name
*
* @access private
*
* @see PMA_SVG, Table_Stats_Svg::Table_Stats_setWidth,
* Table_Stats_Svg::Table_Stats_setHeight
*/
function __construct(
$tableName, $font, $fontSize, $pageNumber, &$same_wide_width,
$showKeys = false, $tableDimension = false, $offline = false
) {
global $svg, $cfgRelation, $db;
parent::__construct(
$svg, $db, $pageNumber, $tableName, $showKeys, $tableDimension, $offline
);
// height and width
$this->_setHeightTable($fontSize);
// setWidth must me after setHeight, because title
// can include table height which changes table width
$this->_setWidthTable($font, $fontSize);
if ($same_wide_width < $this->width) {
$same_wide_width = $this->width;
}
}
/**
* Displays an error when the table cannot be found.
*
* @return void
*/
protected function showMissingTableError()
{
$this->diagram->dieSchema(
$this->pageNumber,
"SVG",
sprintf(__('The %s table doesn\'t exist!'), $this->tableName)
);
}
/**
* Displays an error on missing coordinates
*
* @return void
*/
protected function showMissingCoordinatesError()
{
$this->diagram->dieSchema(
$this->pageNumber,
"SVG",
sprintf(
__('Please configure the coordinates for table %s'),
$this->tableName
)
);
}
/**
* Sets the width of the table
*
* @param string $font The font size
* @param integer $fontSize The font size
*
* @global object $svg The current SVG image document
*
* @return void
* @access private
*
* @see PMA_SVG
*/
private function _setWidthTable($font,$fontSize)
{
foreach ($this->fields as $field) {
$this->width = max(
$this->width,
PMA_Font::getStringWidth($field, $font, $fontSize)
);
}
$this->width += PMA_Font::getStringWidth(' ', $font, $fontSize);
/*
* it is unknown what value must be added, because
* table title is affected by the tabe width value
*/
while ($this->width
< PMA_Font::getStringWidth($this->getTitle(), $font, $fontSize)
) {
$this->width += 7;
}
}
/**
* Sets the height of the table
*
* @param integer $fontSize font size
*
* @return void
* @access private
*/
function _setHeightTable($fontSize)
{
$this->heightCell = $fontSize + 4;
$this->height = (count($this->fields) + 1) * $this->heightCell;
}
/**
* draw the table
*
* @param boolean $showColor Whether to display color
*
* @global object $svg The current SVG image document
*
* @access public
* @return void
*
* @see PMA_SVG,PMA_SVG::printElement
*/
public function tableDraw($showColor)
{
global $svg;
$svg->printElement(
'rect', $this->x, $this->y, $this->width,
$this->heightCell, null, 'fill:red;stroke:black;'
);
$svg->printElement(
'text', $this->x + 5, $this->y+ 14, $this->width, $this->heightCell,
$this->getTitle(), 'fill:none;stroke:black;'
);
foreach ($this->fields as $field) {
$this->currentCell += $this->heightCell;
$fillColor = 'none';
if ($showColor) {
if (in_array($field, $this->primary)) {
$fillColor = '#0c0';
}
if ($field == $this->displayfield) {
$fillColor = 'none';
}
}
$svg->printElement(
'rect', $this->x, $this->y + $this->currentCell, $this->width,
$this->heightCell, null, 'fill:' . $fillColor . ';stroke:black;'
);
$svg->printElement(
'text', $this->x + 5, $this->y + 14 + $this->currentCell,
$this->width, $this->heightCell, $field, 'fill:none;stroke:black;'
);
}
}
}
?>

View File

@ -0,0 +1,47 @@
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* Properties class for the schema export plug-in
*
* @package PhpMyAdmin
*/
if (! defined('PHPMYADMIN')) {
exit;
}
/* This class extends the PluginPropertyItem class */
require_once 'PluginPropertyItem.class.php';
/**
* Defines possible options and getters and setters for them.
*
* @package PhpMyAdmin
*/
class SchemaPluginProperties extends PluginPropertyItem
{
/* ~~~~~~~~~~~~~~~~~~~~ Getters and Setters ~~~~~~~~~~~~~~~~~~~~ */
/**
* Returns the property item type of either an instance of
* - OptionsPropertyOneItem ( f.e. "bool", "text", "radio", etc ) or
* - OptionsPropertyGroup ( "root", "main" or "subgroup" )
* - PluginPropertyItem ( "export", "import", "transformations" )
*
* @return string
*/
public function getItemType()
{
return "schema";
}
/**
* Gets the force file parameter
*
* @return bool
*/
public function getForceFile()
{
return true;
}
}
?>

View File

@ -1,834 +0,0 @@
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* Classes to create relation schema in Dia format.
*
* @package PhpMyAdmin
*/
if (! defined('PHPMYADMIN')) {
exit;
}
require_once 'Export_Relation_Schema.class.php';
/**
* This Class inherits the XMLwriter class and
* helps in developing structure of DIA Schema Export
*
* @package PhpMyAdmin
* @access public
* @see http://php.net/manual/en/book.xmlwriter.php
*/
class PMA_DIA extends XMLWriter
{
public $title;
public $author;
public $font;
public $fontSize;
/**
* The "PMA_DIA" constructor
*
* Upon instantiation This starts writing the Dia XML document
*
* @see XMLWriter::openMemory(),XMLWriter::setIndent(),XMLWriter::startDocument()
*/
function __construct()
{
$this->openMemory();
/*
* Set indenting using three spaces,
* so output is formatted
*/
$this->setIndent(true);
$this->setIndentString(' ');
/*
* Create the XML document
*/
$this->startDocument('1.0', 'UTF-8');
}
/**
* Starts Dia Document
*
* dia document starts by first initializing dia:diagram tag
* then dia:diagramdata contains all the attributes that needed
* to define the document, then finally a Layer starts which
* holds all the objects.
*
* @param string $paper the size of the paper/document
* @param float $topMargin top margin of the paper/document in cm
* @param float $bottomMargin bottom margin of the paper/document in cm
* @param float $leftMargin left margin of the paper/document in cm
* @param float $rightMargin right margin of the paper/document in cm
* @param string $portrait document will be portrait or landscape
*
* @return void
*
* @access public
* @see XMLWriter::startElement(),XMLWriter::writeAttribute(),
* XMLWriter::writeRaw()
*/
function startDiaDoc($paper, $topMargin, $bottomMargin, $leftMargin,
$rightMargin, $portrait
) {
if ($portrait == 'P') {
$isPortrait='true';
} else {
$isPortrait='false';
}
$this->startElement('dia:diagram');
$this->writeAttribute('xmlns:dia', 'http://www.lysator.liu.se/~alla/dia/');
$this->startElement('dia:diagramdata');
$this->writeRaw(
'<dia:attribute name="background">
<dia:color val="#ffffff"/>
</dia:attribute>
<dia:attribute name="pagebreak">
<dia:color val="#000099"/>
</dia:attribute>
<dia:attribute name="paper">
<dia:composite type="paper">
<dia:attribute name="name">
<dia:string>#' . $paper . '#</dia:string>
</dia:attribute>
<dia:attribute name="tmargin">
<dia:real val="' . $topMargin . '"/>
</dia:attribute>
<dia:attribute name="bmargin">
<dia:real val="' . $bottomMargin . '"/>
</dia:attribute>
<dia:attribute name="lmargin">
<dia:real val="' . $leftMargin . '"/>
</dia:attribute>
<dia:attribute name="rmargin">
<dia:real val="' . $rightMargin . '"/>
</dia:attribute>
<dia:attribute name="is_portrait">
<dia:boolean val="' . $isPortrait . '"/>
</dia:attribute>
<dia:attribute name="scaling">
<dia:real val="1"/>
</dia:attribute>
<dia:attribute name="fitto">
<dia:boolean val="false"/>
</dia:attribute>
</dia:composite>
</dia:attribute>
<dia:attribute name="grid">
<dia:composite type="grid">
<dia:attribute name="width_x">
<dia:real val="1"/>
</dia:attribute>
<dia:attribute name="width_y">
<dia:real val="1"/>
</dia:attribute>
<dia:attribute name="visible_x">
<dia:int val="1"/>
</dia:attribute>
<dia:attribute name="visible_y">
<dia:int val="1"/>
</dia:attribute>
<dia:composite type="color"/>
</dia:composite>
</dia:attribute>
<dia:attribute name="color">
<dia:color val="#d8e5e5"/>
</dia:attribute>
<dia:attribute name="guides">
<dia:composite type="guides">
<dia:attribute name="hguides"/>
<dia:attribute name="vguides"/>
</dia:composite>
</dia:attribute>'
);
$this->endElement();
$this->startElement('dia:layer');
$this->writeAttribute('name', 'Background');
$this->writeAttribute('visible', 'true');
$this->writeAttribute('active', 'true');
}
/**
* Ends Dia Document
*
* @return void
* @access public
* @see XMLWriter::endElement(),XMLWriter::endDocument()
*/
function endDiaDoc()
{
$this->endElement();
$this->endDocument();
}
/**
* Output Dia Document for download
*
* @param string $fileName name of the dia document
*
* @return void
* @access public
* @see XMLWriter::flush()
*/
function showOutput($fileName)
{
if (ob_get_clean()) {
ob_end_clean();
}
$output = $this->flush();
PMA_Response::getInstance()->disable();
PMA_downloadHeader(
$fileName . '.dia', 'application/x-dia-diagram', strlen($output)
);
print $output;
}
}
require_once './libraries/schema/TableStats.class.php';
/**
* Table preferences/statistics
*
* This class preserves the table co-ordinates,fields
* and helps in drawing/generating the Tables in dia XML document.
*
* @package PhpMyAdmin
* @name Table_Stats_Dia
* @see PMA_DIA
*/
class Table_Stats_Dia extends TableStats
{
/**
* Defines properties
*/
public $tableId;
public $tableColor;
/**
* The "Table_Stats_Dia" constructor
*
* @param string $tableName The table name
* @param integer $pageNumber The current page number (from the
* $cfg['Servers'][$i]['table_coords'] table)
* @param boolean $showKeys Whether to display ONLY keys or not
*
* @global object $dia The current dia document
* @global array $cfgRelation The relations settings
* @global string $db The current db name
*
* @see PMA_DIA
*/
function __construct($tableName, $pageNumber, $showKeys = false, $offline = false)
{
global $dia, $cfgRelation, $db;
parent::__construct($dia, $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
*/
PMA_Dia_Relation_Schema::$objectId += 1;
$this->tableId = PMA_Dia_Relation_Schema::$objectId;
}
/**
* Displays an error when the table cannot be found.
*
* @return void
*/
protected function showMissingTableError()
{
$this->diagram->dieSchema(
$this->pageNumber,
"DIA",
sprintf(__('The %s table doesn\'t exist!'), $this->tableName)
);
}
/**
* Displays an error on missing coordinates
*
* @return void
*/
protected function showMissingCoordinatesError()
{
$this->diagram->dieSchema(
$this->pageNumber,
"DIA",
sprintf(
__('Please configure the coordinates for table %s'),
$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 displaing Database - Table on Dia Document.
*
* @param boolean $changeColor Whether to show color for tables text or not
* if changeColor 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
*
* @return void
*
* @global object $dia The current Dia document
*
* @access public
* @see PMA_DIA
*/
public function tableDraw($changeColor)
{
global $dia;
if ($changeColor) {
$listOfColors = array(
'FF0000',
'000099',
'00FF00'
);
shuffle($listOfColors);
$this->tableColor = '#' . $listOfColors[0] . '';
} else {
$this->tableColor = '#000000';
}
$factor = 0.1;
$dia->startElement('dia:object');
$dia->writeAttribute('type', 'Database - Table');
$dia->writeAttribute('version', '0');
$dia->writeAttribute('id', '' . $this->tableId . '');
$dia->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>'
);
$dia->startElement('dia:attribute');
$dia->writeAttribute('name', 'attributes');
foreach ($this->fields as $field) {
$dia->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';
}
$dia->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>'
);
}
$dia->endElement();
$dia->endElement();
}
}
/**
* Relation preferences/statistics
*
* This class fetches the table master and foreign fields positions
* and helps in generating the Table references and then connects
* master table's master field to foreign table's foreign key
* in dia XML document.
*
* @package PhpMyAdmin
* @name Relation_Stats_Dia
* @see PMA_DIA
*/
class Relation_Stats_Dia
{
/**
* Defines properties
*/
public $srcConnPointsRight;
public $srcConnPointsLeft;
public $destConnPointsRight;
public $destConnPointsLeft;
public $masterTableId;
public $foreignTableId;
public $masterTablePos;
public $foreignTablePos;
public $referenceColor;
/**
* The "Relation_Stats_Dia" constructor
*
* @param string $master_table The master table name
* @param string $master_field The relation field in the master table
* @param string $foreign_table The foreign table name
* @param string $foreign_field The relation field in the foreign table
*
* @see Relation_Stats_Dia::_getXy
*/
function __construct($master_table, $master_field, $foreign_table,
$foreign_field
) {
$src_pos = $this->_getXy($master_table, $master_field);
$dest_pos = $this->_getXy($foreign_table, $foreign_field);
$this->srcConnPointsLeft = $src_pos[0];
$this->srcConnPointsRight = $src_pos[1];
$this->destConnPointsLeft = $dest_pos[0];
$this->destConnPointsRight = $dest_pos[1];
$this->masterTablePos = $src_pos[2];
$this->foreignTablePos = $dest_pos[2];
$this->masterTableId = $master_table->tableId;
$this->foreignTableId = $foreign_table->tableId;
}
/**
* Each Table object have connection points
* which is used to connect to other objects in Dia
* we detect the position of key in fields and
* then determines its left and right connection
* points.
*
* @param string $table The current table name
* @param string $column The relation column name
*
* @return array Table right,left connection points and key position
*
* @access private
*/
private function _getXy($table, $column)
{
$pos = array_search($column, $table->fields);
// left, right, position
$value = 12;
if ($pos != 0) {
return array($pos + $value + $pos, $pos + $value + $pos + 1, $pos);
}
return array($pos + $value , $pos + $value + 1, $pos);
}
/**
* Draws relation references
*
* connects master table's master field to foreign table's
* forein field using Dia object type Database - Reference
* Dia object is used to generate the XML of Dia Document.
* Database reference Object and their attributes are involved
* in the combination of displaing Database - reference on Dia Document.
*
* @param boolean $changeColor Whether to use one color per relation or not
* if changeColor is true then an array of $listOfColors will be used to choose
* the random colors for references lines. we can change/add more colors to this
*
* @return boolean|void
*
* @global object $dia The current Dia document
*
* @access public
* @see PMA_PDF
*/
public function relationDraw($changeColor)
{
global $dia;
PMA_Dia_Relation_Schema::$objectId += 1;
/*
* if source connection points and destination connection
* points are same then return it false and don't draw that
* relation
*/
if ( $this->srcConnPointsRight == $this->destConnPointsRight) {
if ( $this->srcConnPointsLeft == $this->destConnPointsLeft) {
return false;
}
}
if ($changeColor) {
$listOfColors = array(
'FF0000',
'000099',
'00FF00'
);
shuffle($listOfColors);
$this->referenceColor = '#' . $listOfColors[0] . '';
} else {
$this->referenceColor = '#000000';
}
$dia->writeRaw(
'<dia:object type="Database - Reference" version="0" id="'
. PMA_Dia_Relation_Schema::$objectId . '">
<dia:attribute name="obj_pos">
<dia:point val="3.27,18.9198"/>
</dia:attribute>
<dia:attribute name="obj_bb">
<dia:rectangle val="2.27,8.7175;17.7679,18.9198"/>
</dia:attribute>
<dia:attribute name="meta">
<dia:composite type="dict"/>
</dia:attribute>
<dia:attribute name="orth_points">
<dia:point val="3.27,18.9198"/>
<dia:point val="2.27,18.9198"/>
<dia:point val="2.27,14.1286"/>
<dia:point val="17.7679,14.1286"/>
<dia:point val="17.7679,9.3375"/>
<dia:point val="16.7679,9.3375"/>
</dia:attribute>
<dia:attribute name="orth_orient">
<dia:enum val="0"/>
<dia:enum val="1"/>
<dia:enum val="0"/>
<dia:enum val="1"/>
<dia:enum val="0"/>
</dia:attribute>
<dia:attribute name="orth_autoroute">
<dia:boolean val="true"/>
</dia:attribute>
<dia:attribute name="text_colour">
<dia:color val="#000000"/>
</dia:attribute>
<dia:attribute name="line_colour">
<dia:color val="' . $this->referenceColor . '"/>
</dia:attribute>
<dia:attribute name="line_width">
<dia:real val="0.10000000000000001"/>
</dia:attribute>
<dia:attribute name="line_style">
<dia:enum val="0"/>
<dia:real val="1"/>
</dia:attribute>
<dia:attribute name="corner_radius">
<dia:real val="0"/>
</dia:attribute>
<dia:attribute name="end_arrow">
<dia:enum val="22"/>
</dia:attribute>
<dia:attribute name="end_arrow_length">
<dia:real val="0.5"/>
</dia:attribute>
<dia:attribute name="end_arrow_width">
<dia:real val="0.5"/>
</dia:attribute>
<dia:attribute name="start_point_desc">
<dia:string>#1#</dia:string>
</dia:attribute>
<dia:attribute name="end_point_desc">
<dia:string>#n#</dia:string>
</dia:attribute>
<dia:attribute name="normal_font">
<dia:font family="monospace" style="0" name="Courier"/>
</dia:attribute>
<dia:attribute name="normal_font_height">
<dia:real val="0.59999999999999998"/>
</dia:attribute>
<dia:connections>
<dia:connection handle="0" to="'
. $this->masterTableId . '" connection="'
. $this->srcConnPointsRight . '"/>
<dia:connection handle="1" to="'
. $this->foreignTableId . '" connection="'
. $this->destConnPointsRight . '"/>
</dia:connections>
</dia:object>'
);
}
}
/**
* Dia Relation Schema Class
*
* Purpose of this class is to generate the Dia XML Document
* which is used for representing the database diagrams in Dia IDE
* This class uses Database Table and Reference Objects of Dia and with
* the combination of these objects actually helps in preparing Dia XML.
*
* Dia XML is generated by using XMLWriter php extension and this class
* inherits Export_Relation_Schema class has common functionality added
* to this class
*
* @package PhpMyAdmin
* @name Dia_Relation_Schema
*/
class PMA_Dia_Relation_Schema extends PMA_Export_Relation_Schema
{
/**
* Defines properties
*/
private $_tables = array();
private $_relations = array();
private $_topMargin = 2.8222000598907471;
private $_bottomMargin = 2.8222000598907471;
private $_leftMargin = 2.8222000598907471;
private $_rightMargin = 2.8222000598907471;
public static $objectId = 0;
/**
* The "PMA_Dia_Relation_Schema" constructor
*
* Upon instantiation This outputs the Dia XML document
* that user can download
*
* @see PMA_DIA,Table_Stats_Dia,Relation_Stats_Dia
*/
function __construct()
{
global $dia,$db;
$this->setPageNumber($_POST['pdf_page_number']);
$this->setShowGrid(isset($_POST['show_grid']));
$this->setShowColor($_POST['show_color']);
$this->setShowKeys(isset($_POST['show_keys']));
$this->setOrientation(isset($_POST['orientation']));
$this->setPaper($_POST['paper']);
$this->setExportType($_POST['export_type']);
$this->setOffline($_POST['offline_export']);
$dia = new PMA_DIA();
$dia->startDiaDoc(
$this->paper, $this->_topMargin, $this->_bottomMargin,
$this->_leftMargin, $this->_rightMargin, $this->orientation
);
if ($this->isOffline()) {
$alltables = array();
$tbl_coords = json_decode($GLOBALS['tbl_coords']);
foreach ($tbl_coords as $tbl) {
$alltables[] = $tbl->table_name;
}
} else {
$alltables = $this->getAllTables($db, $this->pageNumber);
}
foreach ($alltables as $table) {
if (! isset($this->tables[$table])) {
$this->_tables[$table] = new Table_Stats_Dia(
$table, $this->pageNumber, $this->showKeys, $this->isOffline()
);
}
}
$seen_a_relation = false;
foreach ($alltables as $one_table) {
$exist_rel = PMA_getForeigners($db, $one_table, '', 'both');
if ($exist_rel) {
$seen_a_relation = true;
foreach ($exist_rel as $master_field => $rel) {
/* put the foreign table on the schema only if selected
* by the user
* (do not use array_search() because we would have to
* to do a === false and this is not PHP3 compatible)
*/
if ($master_field != 'foreign_keys_data') {
if (in_array($rel['foreign_table'], $alltables)) {
$this->_addRelation(
$one_table, $master_field, $rel['foreign_table'],
$rel['foreign_field'], $this->showKeys
);
}
} else {
foreach ($rel as $key => $one_key) {
if (in_array($one_key['ref_table_name'], $alltables)) {
foreach ($one_key['index_list'] as $index => $one_field) {
$this->_addRelation(
$one_table, $one_field, $one_key['ref_table_name'],
$one_key['ref_index_list'][$index], $this->showKeys
);
}
}
}
}
}
}
}
$this->_drawTables($this->showColor);
if ($seen_a_relation) {
$this->_drawRelations($this->showColor);
}
$dia->endDiaDoc();
}
/**
* Output Dia Document for download
*
* @return void
* @access public
*/
function showOutput()
{
global $dia, $db;
$filename = $db . '-' . $this->pageNumber;
if ($this->isOffline()) {
$filename = __("Dia export page");
}
$dia->showOutput($filename);
}
/**
* Defines relation objects
*
* @param string $masterTable The master table name
* @param string $masterField The relation field in the master table
* @param string $foreignTable The foreign table name
* @param string $foreignField The relation field in the foreign table
* @param bool $showKeys Whether to display ONLY keys or not
*
* @return void
*
* @access private
* @see Table_Stats_Dia::__construct(),Relation_Stats_Dia::__construct()
*/
private function _addRelation($masterTable, $masterField, $foreignTable,
$foreignField, $showKeys
) {
if (! isset($this->_tables[$masterTable])) {
$this->_tables[$masterTable] = new Table_Stats_Dia(
$masterTable, $this->pageNumber, $showKeys
);
}
if (! isset($this->_tables[$foreignTable])) {
$this->_tables[$foreignTable] = new Table_Stats_Dia(
$foreignTable, $this->pageNumber, $showKeys
);
}
$this->_relations[] = new Relation_Stats_Dia(
$this->_tables[$masterTable], $masterField,
$this->_tables[$foreignTable], $foreignField
);
}
/**
* Draws relation references
*
* connects master table's master field to
* foreign table's forein field using Dia object
* type Database - Reference
*
* @param boolean $changeColor Whether to use one color per relation or not
*
* @return void
*
* @access private
* @see Relation_Stats_Dia::relationDraw()
*/
private function _drawRelations($changeColor)
{
foreach ($this->_relations as $relation) {
$relation->relationDraw($changeColor);
}
}
/**
* Draws tables
*
* Tables are generated using Dia object type Database - Table
* primary fields are underlined and bold in tables
*
* @param boolean $changeColor Whether to show color for tables text or not
*
* @return void
*
* @access private
* @see Table_Stats_Dia::tableDraw()
*/
private function _drawTables($changeColor)
{
foreach ($this->_tables as $table) {
$table->tableDraw($changeColor);
}
}
}
?>

View File

@ -31,6 +31,7 @@ if (isset($_REQUEST['dialog'])) {
} else if ($_REQUEST['dialog'] == 'save_as') {
$html = PMA_getHtmlForPageSaveAs($GLOBALS['db']);
} else if ($_REQUEST['dialog'] == 'export') {
include_once 'libraries/plugin_interface.lib.php';
$html = PMA_getHtmlForSchemaExport($GLOBALS['db'], $_REQUEST['selected_page']);
}

View File

@ -18,10 +18,9 @@ require 'libraries/StorageEngine.class.php';
*/
$cfgRelation = PMA_getRelationsParam();
require_once 'libraries/transformations.lib.php';
require_once 'libraries/Index.class.php';
require_once 'libraries/pmd_common.php';
require_once 'libraries/schema/Export_Relation_Schema.class.php';
require_once 'libraries/plugin_interface.lib.php';
/**
* get all the export options and verify
@ -30,37 +29,26 @@ require_once 'libraries/schema/Export_Relation_Schema.class.php';
*/
$post_params = array(
'all_tables_same_width',
'chpage',
'db',
'export_type',
'orientation',
'paper',
'names',
'show_color',
'show_grid',
'show_keys',
'show_table_dimension',
'with_doc',
'offline_export',
'tbl_coords'
'pdf_with_doc',
'pdf_orientation',
'pdf_paper'
);
foreach ($post_params as $one_post_param) {
if (isset($_REQUEST[$one_post_param])) {
$GLOBALS[$one_post_param] = $_REQUEST[$one_post_param];
$_POST[$one_post_param] = $_REQUEST[$one_post_param];
}
}
if ($_POST['offline_export'] === "on") {
$_POST['pdf_page_number'] = -1;
PMA_processExportSchema();
if (isset($_REQUEST['offline_export'])) {
$_REQUEST['page_number'] = -1;
PMA_processExportSchema($_REQUEST['export_type']);
} else {
$temp_page = PMA_createNewPage("_temp" . rand(), $GLOBALS['db']);
try {
PMA_saveTablePositions($temp_page);
$_POST['pdf_page_number'] = $temp_page;
PMA_processExportSchema();
$_REQUEST['page_number'] = $temp_page;
PMA_processExportSchema($_REQUEST['export_type']);
PMA_deletePage($temp_page);
} catch (Exception $e) {
PMA_deletePage($temp_page); // delete temp page even if an exception occured
@ -72,40 +60,35 @@ if ($_POST['offline_export'] === "on") {
* get all the export options and verify
* call and include the appropriate Schema Class depending on $export_type
*
* @param string $export_type format of the export
*
* @return void
*/
function PMA_processExportSchema()
function PMA_processExportSchema($export_type)
{
/**
* default is PDF, otherwise validate it's only letters a-z
*/
global $db,$export_type;
if (! isset($export_type) || ! preg_match('/^[a-zA-Z]+$/', $export_type)) {
$export_type = 'pdf';
}
$GLOBALS['dbi']->selectDb($db);
$path = PMA_securePath(ucfirst($export_type));
$filename = 'libraries/schema/' . $path . '_Relation_Schema.class.php';
if (!file_exists($filename)) {
PMA_Export_Relation_Schema::dieSchema(
$_POST['chpage'],
$export_type,
__('File doesn\'t exist')
);
// sanitize this parameter which will be used below in a file inclusion
$export_type = PMA_securePath($export_type);
// get the specific plugin
$export_plugin = PMA_getPlugin(
"Schema",
$export_type,
'libraries/plugins/schema/'
);
// Check schema export type
if (! isset($export_plugin)) {
PMA_fatalError(__('Bad type!'));
}
$GLOBALS['skip_import'] = false;
include $filename;
if ( $GLOBALS['skip_import']) {
PMA_Export_Relation_Schema::dieSchema(
$_POST['chpage'],
$export_type,
__('Plugin is disabled')
);
}
$class_name = 'PMA_' . $path . '_Relation_Schema';
$obj_schema = new $class_name();
$obj_schema->showOutput();
$GLOBALS['dbi']->selectDb($GLOBALS['db']);
$export_plugin->exportSchema($GLOBALS['db']);
}
?>