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(
'
#' . $paper . '#
'
);
$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,
'application/x-dia-diagram',
/*overload*/mb_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;
$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
);
$alltables = $this->getTablesFromRequest();
foreach ($alltables as $table) {
if (! isset($this->tables[$table])) {
$this->_tables[$table] = new Table_Stats_Dia(
$table, $this->pageNumber, $this->showKeys, $this->offline
);
}
}
$seen_a_relation = false;
foreach ($alltables as $one_table) {
$exist_rel = PMA_getForeigners($GLOBALS['db'], $one_table, '', 'both');
if (!$exist_rel) {
continue;
}
$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
);
}
continue;
}
foreach ($rel as $one_key) {
if (!in_array($one_key['ref_table_name'], $alltables)) {
continue;
}
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;
$dia->showOutput($this->getFileName('.dia'));
}
/**
* 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 foreign 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);
}
}
}
?>