2007-07-17 07:23:17 +00:00
|
|
|
<?php
|
2008-04-10 14:37:10 +00:00
|
|
|
page_header(lang('Database schema'), "", array(), $_GET["db"]);
|
2007-07-17 07:23:17 +00:00
|
|
|
|
2007-07-26 14:52:02 +00:00
|
|
|
$table_pos = array();
|
|
|
|
$table_pos_js = array();
|
|
|
|
preg_match_all('~([^:]+):([-0-9.]+)x([-0-9.]+)(_|$)~', $_COOKIE["schema"], $matches, PREG_SET_ORDER); //! ':' in table name
|
|
|
|
foreach ($matches as $i => $match) {
|
2007-07-27 06:24:59 +00:00
|
|
|
$table_pos[$match[1]] = array($match[2], $match[3]);
|
2007-07-26 14:52:02 +00:00
|
|
|
$table_pos_js[] = "\n\t'" . addcslashes($match[1], "\r\n'\\") . "': [ $match[2], $match[3] ]";
|
|
|
|
}
|
|
|
|
|
|
|
|
$top = 0;
|
2007-07-28 22:36:07 +00:00
|
|
|
$base_left = -1;
|
2007-07-17 07:23:17 +00:00
|
|
|
$schema = array();
|
2007-07-26 14:52:02 +00:00
|
|
|
$referenced = array();
|
2007-08-04 19:40:58 +00:00
|
|
|
$lefts = array();
|
2007-07-17 07:23:17 +00:00
|
|
|
$result = $mysql->query("SHOW TABLE STATUS");
|
|
|
|
while ($row = $result->fetch_assoc()) {
|
|
|
|
if (!isset($row["Engine"])) { // view
|
|
|
|
continue;
|
|
|
|
}
|
2007-07-26 14:52:02 +00:00
|
|
|
$pos = 0;
|
|
|
|
$schema[$row["Name"]]["fields"] = array();
|
|
|
|
foreach (fields($row["Name"]) as $name => $field) {
|
|
|
|
$pos += 1.25;
|
|
|
|
$field["pos"] = $pos;
|
|
|
|
$schema[$row["Name"]]["fields"][$name] = $field;
|
|
|
|
}
|
2007-07-27 06:24:59 +00:00
|
|
|
$schema[$row["Name"]]["pos"] = ($table_pos[$row["Name"]] ? $table_pos[$row["Name"]] : array($top, 0));
|
2007-07-17 07:23:17 +00:00
|
|
|
if ($row["Engine"] == "InnoDB") {
|
|
|
|
foreach (foreign_keys($row["Name"]) as $val) {
|
|
|
|
if (!$val["db"]) {
|
2008-07-10 15:39:24 +00:00
|
|
|
$left = $base_left;
|
2007-07-27 06:24:59 +00:00
|
|
|
if ($table_pos[$row["Name"]][1] || $table_pos[$row["Name"]][1]) {
|
2007-07-28 22:36:07 +00:00
|
|
|
$left = min($table_pos[$row["Name"]][1], $table_pos[$val["table"]][1]) - 1;
|
2007-07-27 06:24:59 +00:00
|
|
|
} else {
|
|
|
|
$base_left -= .1;
|
|
|
|
}
|
2007-08-04 19:40:58 +00:00
|
|
|
while ($lefts[(string) $left]) {
|
2007-07-27 09:54:04 +00:00
|
|
|
$left -= .0001;
|
|
|
|
}
|
2008-11-01 20:38:06 +00:00
|
|
|
$schema[$row["Name"]]["references"][$val["table"]][(string) $left] = array($val["source"], $val["target"]);
|
2007-08-04 19:40:58 +00:00
|
|
|
$referenced[$val["table"]][$row["Name"]][(string) $left] = $val["target"];
|
|
|
|
$lefts[(string) $left] = true;
|
2007-07-17 07:23:17 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2007-07-27 06:24:59 +00:00
|
|
|
$top = max($top, $schema[$row["Name"]]["pos"][0] + 2.5 + $pos);
|
2007-07-17 07:23:17 +00:00
|
|
|
}
|
|
|
|
$result->free();
|
2007-07-26 14:52:02 +00:00
|
|
|
|
2007-07-17 07:23:17 +00:00
|
|
|
?>
|
2007-07-26 14:52:02 +00:00
|
|
|
<script type="text/javascript">
|
|
|
|
var that, x, y, em;
|
|
|
|
var table_pos = {<?php echo implode(",", $table_pos_js) . "\n"; ?>};
|
|
|
|
|
|
|
|
function mousedown(el, event) {
|
|
|
|
that = el;
|
2007-07-27 06:24:59 +00:00
|
|
|
em = document.getElementById('schema').offsetHeight / <?php echo $top; ?>;
|
2007-07-26 14:52:02 +00:00
|
|
|
x = event.clientX - el.offsetLeft;
|
|
|
|
y = event.clientY - el.offsetTop;
|
|
|
|
}
|
2007-07-27 09:47:59 +00:00
|
|
|
document.onmousemove = function (ev) {
|
2007-07-26 14:52:02 +00:00
|
|
|
if (that !== undefined) {
|
2007-07-27 09:47:59 +00:00
|
|
|
ev = ev || event;
|
2007-07-28 22:36:07 +00:00
|
|
|
var left = (ev.clientX - x) / em;
|
|
|
|
var top = (ev.clientY - y) / em;
|
2007-07-29 00:02:01 +00:00
|
|
|
var divs = that.getElementsByTagName('div');
|
2007-08-04 19:40:58 +00:00
|
|
|
var line_set = { };
|
2008-09-24 20:46:21 +00:00
|
|
|
for (var i=0; divs.length > i; i++) {
|
2007-07-28 22:36:07 +00:00
|
|
|
if (divs[i].className == 'references') {
|
2007-07-29 00:02:01 +00:00
|
|
|
var div2 = document.getElementById((divs[i].id.substr(0, 4) == 'refs' ? 'refd' : 'refs') + divs[i].id.substr(4));
|
2007-08-09 15:00:15 +00:00
|
|
|
var ref = (table_pos[divs[i].title] ? table_pos[divs[i].title] : [ div2.parentNode.offsetTop / em, 0 ]);
|
2007-08-04 19:40:58 +00:00
|
|
|
var left1 = -1;
|
|
|
|
var is_top = true;
|
|
|
|
var id = divs[i].id.replace(/^ref.(.+)-.+/, '$1');
|
|
|
|
if (divs[i].parentNode != div2.parentNode) {
|
|
|
|
left1 = Math.min(0, ref[1] - left) - 1;
|
|
|
|
divs[i].style.left = left1 + 'em';
|
|
|
|
divs[i].getElementsByTagName('div')[0].style.width = -left1 + 'em';
|
|
|
|
var left2 = Math.min(0, left - ref[1]) - 1;
|
|
|
|
div2.style.left = left2 + 'em';
|
|
|
|
div2.getElementsByTagName('div')[0].style.width = -left2 + 'em';
|
2008-09-24 20:46:21 +00:00
|
|
|
is_top = (div2.offsetTop + ref[0] * em > divs[i].offsetTop + top * em);
|
2007-08-04 19:40:58 +00:00
|
|
|
}
|
|
|
|
if (!line_set[id]) {
|
|
|
|
var line = document.getElementById(divs[i].id.replace(/^....(.+)-[0-9]+$/, 'refl$1'));
|
|
|
|
var shift = ev.clientY - y - that.offsetTop;
|
|
|
|
line.style.left = (left + left1) + 'em';
|
|
|
|
if (is_top) {
|
|
|
|
line.style.top = (line.offsetTop + shift) / em + 'em';
|
|
|
|
}
|
|
|
|
if (divs[i].parentNode != div2.parentNode) {
|
|
|
|
line = line.getElementsByTagName('div')[0];
|
|
|
|
line.style.height = (line.offsetHeight + (is_top ? -1 : 1) * shift) / em + 'em';
|
|
|
|
}
|
|
|
|
line_set[id] = true;
|
2007-07-29 00:02:01 +00:00
|
|
|
}
|
2007-07-28 22:36:07 +00:00
|
|
|
}
|
|
|
|
}
|
2007-07-29 00:02:01 +00:00
|
|
|
that.style.left = left + 'em';
|
|
|
|
that.style.top = top + 'em';
|
2007-07-26 14:52:02 +00:00
|
|
|
}
|
|
|
|
}
|
2007-07-27 09:47:59 +00:00
|
|
|
document.onmouseup = function (ev) {
|
2007-07-26 14:52:02 +00:00
|
|
|
if (that !== undefined) {
|
2007-07-27 09:47:59 +00:00
|
|
|
ev = ev || event;
|
|
|
|
table_pos[that.firstChild.firstChild.firstChild.data] = [ (ev.clientY - y) / em, (ev.clientX - x) / em ];
|
2007-07-26 14:52:02 +00:00
|
|
|
that = undefined;
|
|
|
|
var date = new Date();
|
|
|
|
date.setMonth(date.getMonth() + 1);
|
|
|
|
var s = '';
|
|
|
|
for (var key in table_pos) {
|
|
|
|
s += '_' + key + ':' + Math.round(table_pos[key][0] * 10000) / 10000 + 'x' + Math.round(table_pos[key][1] * 10000) / 10000;
|
|
|
|
}
|
|
|
|
document.cookie = 'schema=' + encodeURIComponent(s.substr(1)) + '; expires=' + date + '; path=' + location.pathname + location.search;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
|
2007-07-27 09:47:59 +00:00
|
|
|
<div id="schema" style="height: <?php echo $top; ?>em;">
|
2007-07-17 07:23:17 +00:00
|
|
|
<?php
|
2007-07-17 10:47:58 +00:00
|
|
|
foreach ($schema as $name => $table) {
|
2007-07-27 06:24:59 +00:00
|
|
|
echo "<div class='table' style='top: " . $table["pos"][0] . "em; left: " . $table["pos"][1] . "em;' onmousedown='mousedown(this, event);'>";
|
2007-07-17 07:23:17 +00:00
|
|
|
echo '<a href="' . htmlspecialchars($SELF) . 'table=' . urlencode($name) . '"><strong>' . htmlspecialchars($name) . "</strong></a><br />\n";
|
2007-07-26 14:52:02 +00:00
|
|
|
foreach ($table["fields"] as $field) {
|
2007-07-17 07:23:17 +00:00
|
|
|
$val = htmlspecialchars($field["field"]);
|
|
|
|
if (preg_match('~char|text~', $field["type"])) {
|
|
|
|
$val = "<span class='char'>$val</span>";
|
|
|
|
} elseif (preg_match('~date|time|year~', $field["type"])) {
|
|
|
|
$val = "<span class='date'>$val</span>";
|
|
|
|
} elseif (preg_match('~binary|blob~', $field["type"])) {
|
|
|
|
$val = "<span class='binary'>$val</span>";
|
|
|
|
} elseif (preg_match('~enum|set~', $field["type"])) {
|
|
|
|
$val = "<span class='enum'>$val</span>";
|
|
|
|
}
|
|
|
|
echo ($field["primary"] ? "<em>$val</em>" : $val) . "<br />\n";
|
2007-07-26 14:52:02 +00:00
|
|
|
}
|
|
|
|
foreach ((array) $table["references"] as $target_name => $refs) {
|
2008-11-01 20:38:06 +00:00
|
|
|
foreach ($refs as $left => $ref) {
|
2007-08-04 19:40:58 +00:00
|
|
|
$left1 = $left - $table_pos[$name][1];
|
2007-07-29 00:02:01 +00:00
|
|
|
$i = 0;
|
2008-11-01 20:38:06 +00:00
|
|
|
foreach ($ref[0] as $source) {
|
2007-07-29 00:02:01 +00:00
|
|
|
echo '<div class="references" title="' . htmlspecialchars($target_name) . "\" id='refs$left-" . ($i++) . "' style='left: $left1" . "em; top: " . $table["fields"][$source]["pos"] . "em; padding-top: .5em;'><div style='border-top: 1px solid Gray; width: " . (-$left1) . "em;'></div></div>\n";
|
2007-07-26 14:52:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2007-07-28 22:36:07 +00:00
|
|
|
foreach ((array) $referenced[$name] as $target_name => $refs) {
|
|
|
|
foreach ($refs as $left => $columns) {
|
2007-08-04 19:40:58 +00:00
|
|
|
$left1 = $left - $table_pos[$name][1];
|
2007-07-29 00:02:01 +00:00
|
|
|
$i = 0;
|
2007-07-28 22:36:07 +00:00
|
|
|
foreach ($columns as $target) {
|
2007-08-09 15:00:15 +00:00
|
|
|
echo '<div class="references" title="' . htmlspecialchars($target_name) . "\" id='refd$left-" . ($i++) . "' style='left: $left1" . "em; top: " . $table["fields"][$target]["pos"] . "em; height: 1.25em; background: url(arrow.gif) no-repeat right center;'><div style='height: .5em; border-bottom: 1px solid Gray; width: " . (-$left1) . "em;'></div></div>\n";
|
2007-07-28 22:36:07 +00:00
|
|
|
}
|
2007-07-26 14:52:02 +00:00
|
|
|
}
|
2007-07-17 07:23:17 +00:00
|
|
|
}
|
|
|
|
echo "</div>\n";
|
|
|
|
}
|
|
|
|
foreach ($schema as $name => $table) {
|
2007-07-17 12:26:57 +00:00
|
|
|
foreach ((array) $table["references"] as $target_name => $refs) {
|
2007-07-26 14:52:02 +00:00
|
|
|
foreach ($refs as $left => $ref) {
|
2007-07-17 10:47:58 +00:00
|
|
|
$min_pos = $top;
|
2007-07-26 14:52:02 +00:00
|
|
|
$max_pos = -10;
|
2008-11-01 20:38:06 +00:00
|
|
|
foreach ($ref[0] as $key => $source) {
|
2007-07-27 06:24:59 +00:00
|
|
|
$pos1 = $table["pos"][0] + $table["fields"][$source]["pos"];
|
2008-11-01 20:38:06 +00:00
|
|
|
$pos2 = $schema[$target_name]["pos"][0] + $schema[$target_name]["fields"][$ref[1][$key]]["pos"];
|
2007-07-17 10:47:58 +00:00
|
|
|
$min_pos = min($min_pos, $pos1, $pos2);
|
|
|
|
$max_pos = max($max_pos, $pos1, $pos2);
|
|
|
|
}
|
2008-08-07 08:14:32 +00:00
|
|
|
echo "<div class='references' id='refl$left' style='left: $left" . "em; top: $min_pos" . "em; padding: .5em 0;' /><div style='border-right: 1px solid Gray; margin-top: 1px; height: " . ($max_pos - $min_pos) . "em;'></div></div>\n";
|
2007-07-17 10:47:58 +00:00
|
|
|
}
|
|
|
|
}
|
2007-07-17 07:23:17 +00:00
|
|
|
}
|
|
|
|
?>
|
|
|
|
</div>
|