Merge remote branch 'phpmyadmin/master'

Conflicts:
	js/tbl_zoom_plot.js
This commit is contained in:
Ammar Yasir 2011-08-19 08:14:44 +05:30
commit 328c5d5b27
183 changed files with 91772 additions and 69272 deletions

View File

@ -43,6 +43,10 @@ phpMyAdmin - ChangeLog
+ AJAX for table Operations copy table
- bug #3380946 [export] no uid Query result export (Suhosin limit)
+ Grid editing in browse mode (replaces row inline edit)
+ Zoom-search in table Search
+ [interface] Editor for GIS data
+ [import] Import GIS data from ESRI Shapefiles
+ [interface] 'Function based search' for GIS data
3.4.5.0 (not yet released)
- bug #3375325 [interface] Page list in navigation frame looks odd

View File

@ -2088,9 +2088,10 @@ $cfg['TrustedProxies'] =
The name of the directory where temporary files can be stored.
<br /><br />
This is needed to work around limitations of <tt>open_basedir</tt>
for uploaded files, see
<a href="#faq1_11"><abbr title="Frequently Asked Questions">FAQ</abbr>
This is needed for importing ESRI Shapefiles, see
<a href="#faq6_30"><abbr title="Frequently Asked Questions">FAQ</abbr>
6.30</a> and to work around limitations of <tt>open_basedir</tt> for uploaded
files, see <a href="#faq1_11"><abbr title="Frequently Asked Questions">FAQ</abbr>
1.11</a>.
<br /><br />
@ -4373,6 +4374,41 @@ INSERT INTO REL_towns VALUES ('M', 'Montr&eacute;al');
<p> Not every table can be put to the chart. Only tables with one, two or three columns can be visualised as a chart. Moreover the table must be in a special format for chart script to understand it. Currently supported formats can be found in the <a href="http://wiki.phpmyadmin.net/pma/Charts#Data_formats_for_query_results_chart">wiki</a>.</p>
<h4 id="faq6_30">
<a href="#faq6_30">6.30 Import: How can I import ESRI Shapefiles</a></h4>
<p>
An ESRI Shapefile is actually a set of several files, where .shp file contains
geometry data and .dbf file contains data related to those geometry data.
To read data from .dbf file you need to have PHP compiled with the dBase extension
(--enable-dbase). Otherwise only geometry data will be imported.
</p>
<p>To upload these set of files you can use either of the following methods:</p>
<ul>
<li>
<p>
Configure upload directory with
<a href="#cfg_UploadDir" class="configrule">$cfg['UploadDir']</a>, upload both
.shp and .dbf files with the same filename and chose the .shp file from the import page.
</p>
</li>
<li>
<p>
Create a Zip archive with .shp and .dbf files and import it. For this to work,
you need to set <a href="#cfg_TempDir" class="configrule">$cfg['TempDir']</a> to a
place where the web server user can write (for example <tt>'./tmp'</tt>).
</p>
<p> To create the temporary directory on a UNIX-based system, you can do:</p>
<pre>
cd phpMyAdmin
mkdir tmp
chmod o+rwx tmp
</pre>
</li>
</ul>
<h3 id="faqproject">phpMyAdmin project</h3>
<h4 id="faq7_1">

View File

@ -38,7 +38,7 @@
<arg line="${source_comma_sep}
xml
codesize,design,naming,unusedcode
--exclude test,build,tcpdf,php-gettext
--exclude test,build,tcpdf,php-gettext,bfShapeFiles
--reportfile ${basedir}/build/logs/pmd.xml" />
</exec>
</target>
@ -50,6 +50,7 @@
--exclude build
--exclude libraries/tcpdf
--exclude libraries/php-gettext
--exclude libraries/bfShapeFiles
${source}" />
</exec>
</target>
@ -61,6 +62,7 @@
--exclude build
--exclude libraries/tcpdf
--exclude libraries/php-gettext
--exclude libraries/bfShapeFiles
${source}" />
</exec>
</target>
@ -68,7 +70,7 @@
<target name="phpcs" description="Generate checkstyle.xml using PHP_CodeSniffer excluding test, tcpdf directories">
<exec executable="phpcs">
<arg line="
--ignore=*/php-gettext/*,*/tcpdf/*,*/canvg/*,*/codemirror/*,*/highcharts/*,*/openlayers/*,*/jquery/*,*/build/*
--ignore=*/php-gettext/*,*/tcpdf/*,*/canvg/*,*/codemirror/*,*/highcharts/*,*/openlayers/*,*/jquery/*,*/build/*,*/bfShapeFiles/*
--report=checkstyle
--report-file=${basedir}/build/logs/checkstyle.xml
--standard=PEAR

View File

@ -67,9 +67,9 @@ require_once './libraries/db_links.inc.php';
$all_tables_query = ' SELECT table_name, MAX(version) as version FROM ' .
PMA_backquote($GLOBALS['cfg']['Server']['pmadb']) . '.' .
PMA_backquote($GLOBALS['cfg']['Server']['tracking']) .
' WHERE ' . PMA_backquote('db_name') . ' = \'' . PMA_sqlAddSlashes($_REQUEST['db']) . '\' ' .
' GROUP BY '. PMA_backquote('table_name') .
' ORDER BY '. PMA_backquote('table_name') .' ASC';
' WHERE db_name = \'' . PMA_sqlAddSlashes($_REQUEST['db']) . '\' ' .
' GROUP BY table_name' .
' ORDER BY table_name ASC';
$all_tables_result = PMA_query_as_controluser($all_tables_query);

335
gis_data_editor.php Normal file
View File

@ -0,0 +1,335 @@
<?php
require_once './libraries/common.inc.php';
if (! isset($_REQUEST['get_gis_editor']) && ! isset($_REQUEST['generate'])) {
require_once './libraries/header_http.inc.php';
require_once './libraries/header_meta_style.inc.php';
}
require_once './libraries/gis/pma_gis_factory.php';
require_once './libraries/gis_visualization.lib.php';
// Get data if any posted
$gis_data = array();
if (PMA_isValid($_REQUEST['gis_data'], 'array')) {
$gis_data = $_REQUEST['gis_data'];
}
$gis_types = array(
'POINT',
'MULTIPOINT',
'LINESTRING',
'MULTILINESTRING',
'POLYGON',
'MULTIPOLYGON',
'GEOMETRYCOLLECTION'
);
// Extract type from the initial call and make sure that it's a valid one.
// Extract from field's values if availbale, if not use the column type passed.
if (! isset($gis_data['gis_type'])) {
if (isset($_REQUEST['type']) && $_REQUEST['type'] != '') {
$gis_data['gis_type'] = strtoupper($_REQUEST['type']);
}
if (isset($_REQUEST['value']) && trim($_REQUEST['value']) != '') {
$start = (substr($_REQUEST['value'], 0, 1) == "'") ? 1 : 0;
$gis_data['gis_type'] = substr($_REQUEST['value'], $start, strpos($_REQUEST['value'], "(") - $start);
}
if ((! isset($gis_data['gis_type'])) || (! in_array($gis_data['gis_type'], $gis_types))) {
$gis_data['gis_type'] = $gis_types[0];
}
}
$geom_type = $gis_data['gis_type'];
// Generate parameters from value passed.
$gis_obj = PMA_GIS_Factory::factory($geom_type);
if (isset($_REQUEST['value'])) {
$gis_data = array_merge($gis_data, $gis_obj->generateParams($_REQUEST['value']));
}
// Generate Well Known Text
$srid = (isset($gis_data['srid']) && $gis_data['srid'] != '') ? htmlspecialchars($gis_data['srid']) : 0;
$wkt = $gis_obj->generateWkt($gis_data, 0);
$wkt_with_zero = $gis_obj->generateWkt($gis_data, 0, '0');
$result = "'" . $wkt . "'," . $srid;
// Gererate PNG or SVG based visualization
$format = (PMA_USR_BROWSER_AGENT == 'IE' && PMA_USR_BROWSER_VER <= 8) ? 'png' : 'svg';
$visualizationSettings = array('width' => 450, 'height' => 300, 'spatialColumn' => 'wkt');
$data = array(array('wkt' => $wkt_with_zero, 'srid' => $srid));
$visualization = PMA_GIS_visualizationResults($data, $visualizationSettings, $format);
$open_layers = PMA_GIS_visualizationResults($data, $visualizationSettings, 'ol');
// If the call is to update the WKT and visualization make an AJAX response
if (isset($_REQUEST['generate']) && $_REQUEST['generate'] == true) {
$extra_data = array(
'result' => $result,
'visualization' => $visualization,
'openLayers' => $open_layers,
);
PMA_ajaxResponse(null, true, $extra_data);
}
// If the call is to get the whole content, start buffering, skipping </head> and <body> tags
if (isset($_REQUEST['get_gis_editor']) && $_REQUEST['get_gis_editor'] == true) {
ob_start();
} else {
?>
</head>
<body>
<?php
}
?>
<form id="gis_data_editor_form" action="gis_data_editor.php" method="post">
<input type="hidden" id="pmaThemeImage" value="<?php echo($GLOBALS['pmaThemeImage']); ?>" />
<div id="gis_data_editor">
<h3><?php printf(__('Value for the column "%s"'), htmlspecialchars($_REQUEST['field'])); ?></h3>
<?php echo('<input type="hidden" name="field" value="' . htmlspecialchars($_REQUEST['field']) . '" />');
// The input field to which the final result should be added and corresponding null checkbox
if (isset($_REQUEST['input_name'])) {
echo('<input type="hidden" name="input_name" value="' . htmlspecialchars($_REQUEST['input_name']) . '" />');
}
echo PMA_generate_common_hidden_inputs();
?>
<!-- Visualization section -->
<div id="placeholder" style="width:450px;height:300px;
<?php if ($srid != 0) {
echo('display:none;');
}
?> ">
<?php echo ($visualization);
?> </div>
<div id="openlayersmap" style="width:450px;height:300px;
<?php if ($srid == 0) {
echo('display:none;');
}
?> ">
</div>
<div class="choice" style="float:right;clear:right;">
<input type="checkbox" id="choice" value="useBaseLayer"
<?php if ($srid != 0) {
echo(' checked="checked"');
}
?> />
<label for="choice"><?php echo __("Use OpenStreetMaps as Base Layer"); ?></label>
</div>
<script language="javascript" type="text/javascript">
<?php echo($open_layers); ?>
</script>
<!-- End of visualization section -->
<!-- Header section - Inclueds GIS type selector and input field for SRID -->
<div id="gis_data_header">
<select name="gis_data[gis_type]" class="gis_type">
<?php
foreach ($gis_types as $gis_type) {
echo('<option value="' . $gis_type . '"');
if ($geom_type == $gis_type) {
echo(' selected="selected"');
}
echo('>' . $gis_type . '</option>');
}
?>
</select>
<input type="submit" name="gis_data[go]" class="go" value="<?php echo __("Go")?>" />
<label for="srid"><?php echo __("SRID"); ?>:&nbsp;</label>
<input name="gis_data[srid]" type="text" value="<?php echo($srid); ?>" />
</div>
<!-- End of header section -->
<!-- Data section -->
<div id="gis_data">
<?php $geom_count = 1;
if ($geom_type == 'GEOMETRYCOLLECTION') {
$geom_count = (isset($gis_data[$geom_type]['geom_count'])) ? $gis_data[$geom_type]['geom_count'] : 1;
if (isset($gis_data[$geom_type]['add_geom'])) {
$geom_count++;
}
echo('<input type="hidden" name="gis_data[GEOMETRYCOLLECTION][geom_count]" value="' . $geom_count . '">');
}
for ($a = 0; $a < $geom_count; $a++) {
if ($geom_type == 'GEOMETRYCOLLECTION') {
echo('<br/><br/>'); echo __("Geometry"); echo($a + 1 . ':<br/>');
if (isset($gis_data[$a]['gis_type'])) {
$type = $gis_data[$a]['gis_type'];
} else {
$type = $gis_types[0];
}
echo('<select name="gis_data[' . $a . '][gis_type]" class="gis_type">');
foreach (array_slice($gis_types, 0, 6) as $gis_type) {
echo('<option value="' . $gis_type . '"');
if ($type == $gis_type) {
echo(' selected="selected"');
}
echo('>' . $gis_type . '</option>');
}
echo('</select>');
echo('<input type="submit" name="gis_data[' . $a . '][go]" class="go" value="'); echo __("Go"); echo('">');
} else {
$type = $geom_type;
}
if ($type == 'POINT') {
echo('<br/>'); echo __("Point"); echo(' :');
?> <label for="x"><?php echo __("X"); ?></label>
<input name="gis_data[<?php echo($a); ?>][POINT][x]" type="text" value="<?php echo(isset($gis_data[$a]['POINT']['x']) ? htmlspecialchars($gis_data[$a]['POINT']['x']) : ''); ?>" />
<label for="y"><?php echo __("Y"); ?></label>
<input name="gis_data[<?php echo($a); ?>][POINT][y]" type="text" value="<?php echo(isset($gis_data[$a]['POINT']['y']) ? htmlspecialchars($gis_data[$a]['POINT']['y']) : ''); ?>" />
<?php
} elseif ($type == 'MULTIPOINT' || $type == 'LINESTRING') {
$no_of_points = isset($gis_data[$a][$type]['no_of_points']) ? $gis_data[$a][$type]['no_of_points'] : 1;
if ($type == 'LINESTRING' && $no_of_points < 2) {
$no_of_points = 2;
}
if ($type == 'MULTIPOINT' && $no_of_points < 1) {
$no_of_points = 1;
}
if (isset($gis_data[$a][$type]['add_point'])) {
$no_of_points++;
}
echo('<input type="hidden" name="gis_data[' . $a . '][' . $type . '][no_of_points]" value="' . $no_of_points . '">');
for ($i = 0; $i < $no_of_points; $i++) {
echo('<br/>'); echo __("Point"); echo($i + 1 . ':');
?> <label for="x"><?php echo __("X"); ?></label>
<input type="text" name="gis_data[<?php echo($a); ?>][<?php echo($type); ?>][<?php echo($i); ?>][x]" value="<?php echo(isset($gis_data[$a][$type][$i]['x']) ? htmlspecialchars($gis_data[$a][$type][$i]['x']) : ''); ?>" />
<label for="y"><?php echo __("Y"); ?></label>
<input type="text" name="gis_data[<?php echo($a); ?>][<?php echo($type); ?>][<?php echo($i); ?>][y]" value="<?php echo(isset($gis_data[$a][$type][$i]['y']) ? htmlspecialchars($gis_data[$a][$type][$i]['y']) : ''); ?>" />
<?php
}
?>
<input type="submit" name="gis_data[<?php echo($a); ?>][<?php echo($type); ?>][add_point]" class="add addPoint" value="<?php echo __("Add a point"); ?>">
<?php
} elseif ($type == 'MULTILINESTRING' || $type == 'POLYGON') {
$no_of_lines = isset($gis_data[$a][$type]['no_of_lines']) ? $gis_data[$a][$type]['no_of_lines'] : 1;
if ($no_of_lines < 1) {
$no_of_lines = 1;
}
if (isset($gis_data[$a][$type]['add_line'])) {
$no_of_lines++;
}
echo('<input type="hidden" name="gis_data[' . $a . '][' . $type . '][no_of_lines]" value="' . $no_of_lines . '">');
for ($i = 0; $i < $no_of_lines; $i++) {
echo('<br/>');
if ($type == 'MULTILINESTRING') {
echo __("Linestring"); echo($i + 1 . ':');
} else {
if ($i == 0) {
echo __("Outer Ring:");
} else {
echo __("Inner Ring"); echo($i . ':');
}
}
$no_of_points = isset($gis_data[$a][$type][$i]['no_of_points']) ? $gis_data[$a][$type][$i]['no_of_points'] : 2;
if ($type == 'MULTILINESTRING' && $no_of_points < 2) {
$no_of_points = 2;
}
if ($type == 'POLYGON' && $no_of_points < 4) {
$no_of_points = 4;
}
if (isset($gis_data[$a][$type][$i]['add_point'])) {
$no_of_points++;
}
echo('<input type="hidden" name="gis_data[' . $a . '][' . $type . '][' . $i . '][no_of_points]" value="' . $no_of_points . '">');
for ($j = 0; $j < $no_of_points; $j++) {
echo('<br/>'); echo __("Point"); echo($j + 1 . ':');
?> <label for="x"><?php echo __("X"); ?></label>
<input type="text" name="gis_data[<?php echo($a); ?>][<?php echo($type); ?>][<?php echo($i); ?>][<?php echo($j); ?>][x]" value="<?php echo(isset($gis_data[$a][$type][$i][$j]['x']) ? htmlspecialchars($gis_data[$a][$type][$i][$j]['x']) : ''); ?>" />
<label for="y"><?php echo __("Y"); ?></label>
<input type="text" name="gis_data[<?php echo($a); ?>][<?php echo($type); ?>][<?php echo($i); ?>][<?php echo($j); ?>][y]" value="<?php echo(isset($gis_data[$a][$type][$i][$j]['x']) ? htmlspecialchars($gis_data[$a][$type][$i][$j]['y']) : ''); ?>" />
<?php }
?> <input type="submit" name="gis_data[<?php echo($a); ?>][<?php echo($type); ?>][<?php echo($i); ?>][add_point]" class="add addPoint" value="<?php echo __("Add a point"); ?>">
<?php }
$caption = ($type == 'MULTILINESTRING') ? __('Add a linestring') : __('Add an inner ring');
?> <br/><input type="submit" name="gis_data[<?php echo($a); ?>][<?php echo($type); ?>][add_line]" class="add addLine" value="<?php echo($caption); ?>">
<?php
} elseif ($type == 'MULTIPOLYGON') {
$no_of_polygons = isset($gis_data[$a][$type]['no_of_polygons']) ? $gis_data[$a][$type]['no_of_polygons'] : 1;
if ($no_of_polygons < 1) {
$no_of_polygons = 1;
}
if (isset($gis_data[$a][$type]['add_polygon'])) {
$no_of_polygons++;
}
echo('<input type="hidden" name="gis_data[' . $a . '][' . $type . '][no_of_polygons]" value="' . $no_of_polygons . '">');
for ($k = 0; $k < $no_of_polygons; $k++) {
echo('<br/>'); echo __("Polygon"); echo($k + 1 . ':');
$no_of_lines = isset($gis_data[$a][$type][$k]['no_of_lines']) ? $gis_data[$a][$type][$k]['no_of_lines'] : 1;
if ($no_of_lines < 1) {
$no_of_lines = 1;
}
if (isset($gis_data[$a][$type][$k]['add_line'])) {
$no_of_lines++;
}
echo('<input type="hidden" name="gis_data[' . $a . '][' . $type . '][' . $k . '][no_of_lines]" value="' . $no_of_lines . '">');
for ($i = 0; $i < $no_of_lines; $i++) {
echo('<br/><br/>');
if ($i == 0) {
echo __("Outer Ring:");
} else {
echo __("Inner Ring"); echo($i . ':');
}
$no_of_points = isset($gis_data[$a][$type][$k][$i]['no_of_points']) ? $gis_data[$a][$type][$k][$i]['no_of_points'] : 4;
if ($no_of_points < 4) {
$no_of_points = 4;
}
if (isset($gis_data[$a][$type][$k][$i]['add_point'])) {
$no_of_points++;
}
echo('<input type="hidden" name="gis_data[' . $a . '][' . $type . '][' . $k . '][' . $i . '][no_of_points]" value="' . $no_of_points . '">');
for ($j = 0; $j < $no_of_points; $j++) {
echo('<br/>'); echo __("Point"); echo($j + 1 . ':');
?> <label for="x"><?php echo __("X"); ?></label>
<input type="text" name="<?php echo("gis_data[" . $a . "][" . $type . "][" . $k . "][" . $i . "][" . $j . "][x]"); ?>" value="<?php echo(isset($gis_data[$a][$type][$k][$i][$j]['x']) ? htmlspecialchars($gis_data[$a][$type][$k][$i][$j]['x']) : ''); ?>" />
<label for="y"><?php echo __("Y"); ?></label>
<input type="text" name="<?php echo("gis_data[" . $a . "][" . $type . "][" . $k . "][" . $i . "][" . $j . "][y]"); ?>" value="<?php echo(isset($gis_data[$a][$type][$k][$i][$j]['y']) ? htmlspecialchars($gis_data[$a][$type][$k][$i][$j]['y']) : ''); ?>" />
<?php }
?> <input type="submit" name="<?php echo("gis_data[" . $a . "][" . $type . "][" . $k . "][" . $i . "][add_point]"); ?>" class="add addPoint" value="<?php echo __("Add a point"); ?>">
<?php }
?> <br/><input type="submit" name="<?php echo("gis_data[" . $a . "][" . $type . "][" . $k . "][add_line]"); ?>" class="add addLine" value="<?php echo __('Add an inner ring') ?>"><br/>
<?php }
?> <br/><input type="submit" name="<?php echo("gis_data[" . $a . "][" . $type . "][add_polygon]"); ?>" class="add addPolygon" value="<?php echo __('Add a polygon') ?>">
<?php }
}
if ($geom_type == 'GEOMETRYCOLLECTION') {
?> <br/><br/><input type="submit" name="gis_data[GEOMETRYCOLLECTION][add_geom]" class="add addGeom" value="<?php echo __("Add geometry"); ?>" />
<?php }
?> </div>
<!-- End of data section -->
<br/><input type="submit" name="gis_data[save]" value="<?php echo __('Go') ?>">
<div id="gis_data_output">
<h3><?php echo __('Output'); ?></h3>
<p><?php echo __('Chose "GeomFromText" from the "Function" column and paste the below string into the "Value" field'); ?></p>
<textarea id="gis_data_textarea" cols="95" rows="5">
<?php echo($result);
?> </textarea>
</div>
</div>
</form>
<?php
// If the call is to get the whole content, get the content in the buffer and make and AJAX response.
if (isset($_REQUEST['get_gis_editor']) && $_REQUEST['get_gis_editor'] == true) {
$extra_data['gis_editor'] = ob_get_contents();
PMA_ajaxResponse(null, ob_end_clean(), $extra_data);
}
?>
</body>
<?php
/**
* Displays the footer
*/
require './libraries/footer.inc.php';
?>

125
js/OpenStreetMap.js Normal file
View File

@ -0,0 +1,125 @@
/**
* Namespace: Util.OSM
*/
OpenLayers.Util.OSM = {};
/**
* Constant: MISSING_TILE_URL
* {String} URL of image to display for missing tiles
*/
OpenLayers.Util.OSM.MISSING_TILE_URL = "http://www.openstreetmap.org/openlayers/img/404.png";
/**
* Property: originalOnImageLoadError
* {Function} Original onImageLoadError function.
*/
OpenLayers.Util.OSM.originalOnImageLoadError = OpenLayers.Util.onImageLoadError;
/**
* Function: onImageLoadError
*/
OpenLayers.Util.onImageLoadError = function() {
if (this.src.match(/^http:\/\/[abc]\.[a-z]+\.openstreetmap\.org\//)) {
this.src = OpenLayers.Util.OSM.MISSING_TILE_URL;
} else if (this.src.match(/^http:\/\/[def]\.tah\.openstreetmap\.org\//)) {
// do nothing - this layer is transparent
} else {
OpenLayers.Util.OSM.originalOnImageLoadError;
}
};
/**
* Class: OpenLayers.Layer.OSM.Mapnik
*
* Inherits from:
* - <OpenLayers.Layer.OSM>
*/
OpenLayers.Layer.OSM.Mapnik = OpenLayers.Class(OpenLayers.Layer.OSM, {
/**
* Constructor: OpenLayers.Layer.OSM.Mapnik
*
* Parameters:
* name - {String}
* options - {Object} Hashtable of extra options to tag onto the layer
*/
initialize: function(name, options) {
var url = [
"http://a.tile.openstreetmap.org/${z}/${x}/${y}.png",
"http://b.tile.openstreetmap.org/${z}/${x}/${y}.png",
"http://c.tile.openstreetmap.org/${z}/${x}/${y}.png"
];
options = OpenLayers.Util.extend({
numZoomLevels: 19,
buffer: 0,
transitionEffect: "resize"
}, options);
var newArguments = [name, url, options];
OpenLayers.Layer.OSM.prototype.initialize.apply(this, newArguments);
},
CLASS_NAME: "OpenLayers.Layer.OSM.Mapnik"
});
/**
* Class: OpenLayers.Layer.OSM.Osmarender
*
* Inherits from:
* - <OpenLayers.Layer.OSM>
*/
OpenLayers.Layer.OSM.Osmarender = OpenLayers.Class(OpenLayers.Layer.OSM, {
/**
* Constructor: OpenLayers.Layer.OSM.Osmarender
*
* Parameters:
* name - {String}
* options - {Object} Hashtable of extra options to tag onto the layer
*/
initialize: function(name, options) {
var url = [
"http://a.tah.openstreetmap.org/Tiles/tile/${z}/${x}/${y}.png",
"http://b.tah.openstreetmap.org/Tiles/tile/${z}/${x}/${y}.png",
"http://c.tah.openstreetmap.org/Tiles/tile/${z}/${x}/${y}.png"
];
options = OpenLayers.Util.extend({
numZoomLevels: 18,
buffer: 0,
transitionEffect: "resize"
}, options);
var newArguments = [name, url, options];
OpenLayers.Layer.OSM.prototype.initialize.apply(this, newArguments);
},
CLASS_NAME: "OpenLayers.Layer.OSM.Osmarender"
});
/**
* Class: OpenLayers.Layer.OSM.CycleMap
*
* Inherits from:
* - <OpenLayers.Layer.OSM>
*/
OpenLayers.Layer.OSM.CycleMap = OpenLayers.Class(OpenLayers.Layer.OSM, {
/**
* Constructor: OpenLayers.Layer.OSM.CycleMap
*
* Parameters:
* name - {String}
* options - {Object} Hashtable of extra options to tag onto the layer
*/
initialize: function(name, options) {
var url = [
"http://a.tile.opencyclemap.org/cycle/${z}/${x}/${y}.png",
"http://b.tile.opencyclemap.org/cycle/${z}/${x}/${y}.png",
"http://c.tile.opencyclemap.org/cycle/${z}/${x}/${y}.png"
];
options = OpenLayers.Util.extend({
numZoomLevels: 19,
buffer: 0,
transitionEffect: "resize"
}, options);
var newArguments = [name, url, options];
OpenLayers.Layer.OSM.prototype.initialize.apply(this, newArguments);
},
CLASS_NAME: "OpenLayers.Layer.OSM.CycleMap"
});

View File

@ -1,288 +0,0 @@
/**
* A class to parse color values
* @author Stoyan Stefanov <sstoo@gmail.com>
* @link http://www.phpied.com/rgb-color-parser-in-javascript/
* @license Use it if you like it
*/
function RGBColor(color_string)
{
this.ok = false;
// strip any leading #
if (color_string.charAt(0) == '#') { // remove # if any
color_string = color_string.substr(1,6);
}
color_string = color_string.replace(/ /g,'');
color_string = color_string.toLowerCase();
// before getting into regexps, try simple matches
// and overwrite the input
var simple_colors = {
aliceblue: 'f0f8ff',
antiquewhite: 'faebd7',
aqua: '00ffff',
aquamarine: '7fffd4',
azure: 'f0ffff',
beige: 'f5f5dc',
bisque: 'ffe4c4',
black: '000000',
blanchedalmond: 'ffebcd',
blue: '0000ff',
blueviolet: '8a2be2',
brown: 'a52a2a',
burlywood: 'deb887',
cadetblue: '5f9ea0',
chartreuse: '7fff00',
chocolate: 'd2691e',
coral: 'ff7f50',
cornflowerblue: '6495ed',
cornsilk: 'fff8dc',
crimson: 'dc143c',
cyan: '00ffff',
darkblue: '00008b',
darkcyan: '008b8b',
darkgoldenrod: 'b8860b',
darkgray: 'a9a9a9',
darkgreen: '006400',
darkkhaki: 'bdb76b',
darkmagenta: '8b008b',
darkolivegreen: '556b2f',
darkorange: 'ff8c00',
darkorchid: '9932cc',
darkred: '8b0000',
darksalmon: 'e9967a',
darkseagreen: '8fbc8f',
darkslateblue: '483d8b',
darkslategray: '2f4f4f',
darkturquoise: '00ced1',
darkviolet: '9400d3',
deeppink: 'ff1493',
deepskyblue: '00bfff',
dimgray: '696969',
dodgerblue: '1e90ff',
feldspar: 'd19275',
firebrick: 'b22222',
floralwhite: 'fffaf0',
forestgreen: '228b22',
fuchsia: 'ff00ff',
gainsboro: 'dcdcdc',
ghostwhite: 'f8f8ff',
gold: 'ffd700',
goldenrod: 'daa520',
gray: '808080',
green: '008000',
greenyellow: 'adff2f',
honeydew: 'f0fff0',
hotpink: 'ff69b4',
indianred : 'cd5c5c',
indigo : '4b0082',
ivory: 'fffff0',
khaki: 'f0e68c',
lavender: 'e6e6fa',
lavenderblush: 'fff0f5',
lawngreen: '7cfc00',
lemonchiffon: 'fffacd',
lightblue: 'add8e6',
lightcoral: 'f08080',
lightcyan: 'e0ffff',
lightgoldenrodyellow: 'fafad2',
lightgrey: 'd3d3d3',
lightgreen: '90ee90',
lightpink: 'ffb6c1',
lightsalmon: 'ffa07a',
lightseagreen: '20b2aa',
lightskyblue: '87cefa',
lightslateblue: '8470ff',
lightslategray: '778899',
lightsteelblue: 'b0c4de',
lightyellow: 'ffffe0',
lime: '00ff00',
limegreen: '32cd32',
linen: 'faf0e6',
magenta: 'ff00ff',
maroon: '800000',
mediumaquamarine: '66cdaa',
mediumblue: '0000cd',
mediumorchid: 'ba55d3',
mediumpurple: '9370d8',
mediumseagreen: '3cb371',
mediumslateblue: '7b68ee',
mediumspringgreen: '00fa9a',
mediumturquoise: '48d1cc',
mediumvioletred: 'c71585',
midnightblue: '191970',
mintcream: 'f5fffa',
mistyrose: 'ffe4e1',
moccasin: 'ffe4b5',
navajowhite: 'ffdead',
navy: '000080',
oldlace: 'fdf5e6',
olive: '808000',
olivedrab: '6b8e23',
orange: 'ffa500',
orangered: 'ff4500',
orchid: 'da70d6',
palegoldenrod: 'eee8aa',
palegreen: '98fb98',
paleturquoise: 'afeeee',
palevioletred: 'd87093',
papayawhip: 'ffefd5',
peachpuff: 'ffdab9',
peru: 'cd853f',
pink: 'ffc0cb',
plum: 'dda0dd',
powderblue: 'b0e0e6',
purple: '800080',
red: 'ff0000',
rosybrown: 'bc8f8f',
royalblue: '4169e1',
saddlebrown: '8b4513',
salmon: 'fa8072',
sandybrown: 'f4a460',
seagreen: '2e8b57',
seashell: 'fff5ee',
sienna: 'a0522d',
silver: 'c0c0c0',
skyblue: '87ceeb',
slateblue: '6a5acd',
slategray: '708090',
snow: 'fffafa',
springgreen: '00ff7f',
steelblue: '4682b4',
tan: 'd2b48c',
teal: '008080',
thistle: 'd8bfd8',
tomato: 'ff6347',
turquoise: '40e0d0',
violet: 'ee82ee',
violetred: 'd02090',
wheat: 'f5deb3',
white: 'ffffff',
whitesmoke: 'f5f5f5',
yellow: 'ffff00',
yellowgreen: '9acd32'
};
for (var key in simple_colors) {
if (color_string == key) {
color_string = simple_colors[key];
}
}
// emd of simple type-in colors
// array of color definition objects
var color_defs = [
{
re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,
example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'],
process: function (bits){
return [
parseInt(bits[1]),
parseInt(bits[2]),
parseInt(bits[3])
];
}
},
{
re: /^(\w{2})(\w{2})(\w{2})$/,
example: ['#00ff00', '336699'],
process: function (bits){
return [
parseInt(bits[1], 16),
parseInt(bits[2], 16),
parseInt(bits[3], 16)
];
}
},
{
re: /^(\w{1})(\w{1})(\w{1})$/,
example: ['#fb0', 'f0f'],
process: function (bits){
return [
parseInt(bits[1] + bits[1], 16),
parseInt(bits[2] + bits[2], 16),
parseInt(bits[3] + bits[3], 16)
];
}
}
];
// search through the definitions to find a match
for (var i = 0; i < color_defs.length; i++) {
var re = color_defs[i].re;
var processor = color_defs[i].process;
var bits = re.exec(color_string);
if (bits) {
channels = processor(bits);
this.r = channels[0];
this.g = channels[1];
this.b = channels[2];
this.ok = true;
}
}
// validate/cleanup values
this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 255 : this.r);
this.g = (this.g < 0 || isNaN(this.g)) ? 0 : ((this.g > 255) ? 255 : this.g);
this.b = (this.b < 0 || isNaN(this.b)) ? 0 : ((this.b > 255) ? 255 : this.b);
// some getters
this.toRGB = function () {
return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')';
}
this.toHex = function () {
var r = this.r.toString(16);
var g = this.g.toString(16);
var b = this.b.toString(16);
if (r.length == 1) r = '0' + r;
if (g.length == 1) g = '0' + g;
if (b.length == 1) b = '0' + b;
return '#' + r + g + b;
}
// help
this.getHelpXML = function () {
var examples = new Array();
// add regexps
for (var i = 0; i < color_defs.length; i++) {
var example = color_defs[i].example;
for (var j = 0; j < example.length; j++) {
examples[examples.length] = example[j];
}
}
// add type-in colors
for (var sc in simple_colors) {
examples[examples.length] = sc;
}
var xml = document.createElement('ul');
xml.setAttribute('id', 'rgbcolor-examples');
for (var i = 0; i < examples.length; i++) {
try {
var list_item = document.createElement('li');
var list_color = new RGBColor(examples[i]);
var example_div = document.createElement('div');
example_div.style.cssText =
'margin: 3px; '
+ 'border: 1px solid black; '
+ 'background:' + list_color.toHex() + '; '
+ 'color:' + list_color.toHex()
;
example_div.appendChild(document.createTextNode('test'));
var list_item_value = document.createTextNode(
' ' + examples[i] + ' -> ' + list_color.toRGB() + ' -> ' + list_color.toHex()
);
list_item.appendChild(example_div);
list_item.appendChild(list_item_value);
xml.appendChild(list_item);
} catch(e){}
}
return xml;
}
}

View File

@ -150,13 +150,15 @@ function PMA_addDatepicker($this_element, options)
showOn: 'button',
buttonImage: themeCalendarImage, // defined in js/messages.php
buttonImageOnly: true,
duration: '',
time24h: true,
stepMinutes: 1,
stepHours: 1,
showTime: showTimeOption,
showSecond: true,
showTimepicker: showTimeOption,
showButtonPanel: false,
dateFormat: 'yy-mm-dd', // yy means year with four digits
altTimeField: '',
timeFormat: 'hh:mm:ss',
altFieldTimeOnly: false,
showAnim: '',
beforeShow: function(input, inst) {
// Remember that we came from the datepicker; this is used
// in tbl_change.js by verificationsAfterFieldChange()
@ -166,11 +168,10 @@ function PMA_addDatepicker($this_element, options)
setTimeout(function() {
$('#ui-timepicker-div').css('z-index',$('#ui-datepicker-div').css('z-index'))
},0);
},
constrainInput: false
}
};
$this_element.datepicker($.extend(defaultOptions, options));
$this_element.datetimepicker($.extend(defaultOptions, options));
}
/**
@ -611,7 +612,7 @@ $(document).ready(function() {
var $tr = $(this);
// make the table unselectable (to prevent default highlighting when shift+click)
$tr.parents('table').noSelect();
//$tr.parents('table').noSelect();
if (!e.shiftKey || last_clicked_row == -1) {
// usual click
@ -642,6 +643,7 @@ $(document).ready(function() {
last_shift_clicked_row = -1;
} else {
// handle the shift click
PMA_clearSelection();
var start, end;
// clear last shift click result
@ -683,10 +685,12 @@ $(document).ready(function() {
/**
* Add a date/time picker to each element that needs it
*/
$('.datefield, .datetimefield').each(function() {
PMA_addDatepicker($(this));
});
})
if ($.datetimepicker != undefined) {
$('.datefield, .datetimefield').each(function() {
PMA_addDatepicker($(this));
});
}
});
/**
* True if last click is to check a row.
@ -902,26 +906,6 @@ function goToUrl(selObj, goToLocation)
eval("document.location.href = '" + goToLocation + "pos=" + selObj.options[selObj.selectedIndex].value + "'");
}
/**
* getElement
*/
function getElement(e,f)
{
if(document.layers){
f=(f)?f:self;
if(f.document.layers[e]) {
return f.document.layers[e];
}
for(W=0;W<f.document.layers.length;W++) {
return(getElement(e,f.document.layers[W]));
}
}
if(document.all) {
return document.all[e];
}
return document.getElementById(e);
}
/**
* Refresh the WYSIWYG scratchboard after changes have been made
*/
@ -1992,7 +1976,7 @@ $(document).ready(function() {
**/
$("#alterTableOrderby.ajax").live('submit', function(event) {
event.preventDefault();
$form = $(this);
var $form = $(this);
PMA_prepareForAjaxRequest($form);
/*variables which stores the common attributes*/
@ -2010,9 +1994,9 @@ $(document).ready(function() {
$("#result_query .notice").remove();
$("#result_query").prepend((data.message));
} else {
$temp_div = $("<div id='temp_div'></div>")
var $temp_div = $("<div id='temp_div'></div>")
$temp_div.html(data.error);
$error = $temp_div.find("code").addClass("error");
var $error = $temp_div.find("code").addClass("error");
PMA_ajaxShowMessage($error);
}
}) // end $.post()
@ -2023,7 +2007,7 @@ $(document).ready(function() {
**/
$("#copyTable.ajax input[name='submit_copy']").live('click', function(event) {
event.preventDefault();
$form = $("#copyTable");
var $form = $("#copyTable");
if($form.find("input[name='switch_to_new']").attr('checked')) {
$form.append('<input type="hidden" name="submit_copy" value="Go" />');
$form.removeClass('ajax');
@ -2052,15 +2036,53 @@ $(document).ready(function() {
window.parent.frame_navigation.location.reload();
}
} else {
$temp_div = $("<div id='temp_div'></div>")
var $temp_div = $("<div id='temp_div'></div>");
$temp_div.html(data.error);
$error = $temp_div.find("code").addClass("error");
var $error = $temp_div.find("code").addClass("error");
PMA_ajaxShowMessage($error);
}
}) // end $.post()
}
});//end of copyTable ajax submit
/**
*Ajax events for actions in the "Table maintenance"
**/
$("#tbl_maintenance.ajax li a.maintain_action").live('click', function(event) {
event.preventDefault();
var $link = $(this);
var href = $link.attr("href");
href = href.split('?');
if ($("#sqlqueryresults").length != 0) {
$("#sqlqueryresults").remove();
}
if ($("#result_query").length != 0) {
$("#result_query").remove();
}
//variables which stores the common attributes
$.post(href[0], href[1]+"&ajax_request=true", function(data) {
if (data.success == undefined) {
var $temp_div = $("<div id='temp_div'></div>");
$temp_div.html(data);
var $success = $temp_div.find("#result_query .success");
PMA_ajaxShowMessage($success);
$("<div id='sqlqueryresults' class='ajax'></div>").insertAfter("#topmenucontainer");
$("#sqlqueryresults").html(data);
PMA_init_slider();
$("#sqlqueryresults").children("fieldset").remove();
} else if (data.success == true ) {
PMA_ajaxShowMessage(data.message);
$("<div id='sqlqueryresults' class='ajax'></div>").insertAfter("#topmenucontainer");
$("#sqlqueryresults").html(data.sql_query);
} else {
var $temp_div = $("<div id='temp_div'></div>");
$temp_div.html(data.error);
var $error = $temp_div.find("code").addClass("error");
PMA_ajaxShowMessage($error);
}
}) // end $.post()
});//end of table maintanance ajax click
}, 'top.frame_content'); //end $(document).ready for 'Table operations'
@ -2983,7 +3005,7 @@ $(document).ready(function() {
$("#drop_tbl_anchor").live('click', function(event) {
event.preventDefault();
//context is top.frame_content, so we need to use window.parent.db to access the db var
//context is top.frame_content, so we need to use window.parent.table to access the table var
/**
* @var question String containing the question to be asked for confirmation
*/
@ -3011,10 +3033,10 @@ $(document).ready(function() {
* @see $cfg['AjaxEnable']
*/
$(document).ready(function() {
$("#truncate_tbl_anchor").live('click', function(event) {
$("#truncate_tbl_anchor.ajax").live('click', function(event) {
event.preventDefault();
//context is top.frame_content, so we need to use window.parent.db to access the db var
//context is top.frame_content, so we need to use window.parent.table to access the table var
/**
* @var question String containing the question to be asked for confirmation
*/
@ -3024,13 +3046,26 @@ $(document).ready(function() {
PMA_ajaxShowMessage(PMA_messages['strProcessingRequest']);
$.get(url, {'is_js_confirmed': '1', 'ajax_request': true}, function(data) {
//Database deleted successfully, refresh both the frames
window.parent.refreshNavigation();
window.parent.refreshMain();
if ($("#sqlqueryresults").length != 0) {
$("#sqlqueryresults").remove();
}
if ($("#result_query").length != 0) {
$("#result_query").remove();
}
if (data.success == true) {
PMA_ajaxShowMessage(data.message);
$("<div id='sqlqueryresults'></div>").insertAfter("#topmenucontainer");
$("#sqlqueryresults").html(data.sql_query);
} else {
var $temp_div = $("<div id='temp_div'></div>")
$temp_div.html(data.error);
var $error = $temp_div.find("code").addClass("error");
PMA_ajaxShowMessage($error);
}
}) // end $.get()
}); // end $.PMA_confirm()
}); //end of Drop Table Ajax action
}) // end of $(document).ready() for Drop Table
}); //end of Truncate Table Ajax action
}) // end of $(document).ready() for Truncate Table
/**
* Attach CodeMirror2 editor to SQL edit area.
@ -3174,3 +3209,16 @@ $(document).ready(function() {
return true;
});
});
/**
* Clear text selection
*/
function PMA_clearSelection() {
if(document.selection && document.selection.empty) {
document.selection.empty();
} else if(window.getSelection) {
var sel = window.getSelection();
if(sel.empty) sel.empty();
if(sel.removeAllRanges) sel.removeAllRanges();
}
}

309
js/gis_data_editor.js Normal file
View File

@ -0,0 +1,309 @@
/**
* @fileoverview functions used in GIS data editor
*
* @requires jQuery
*
*/
/**
* Closes the GIS data editor and perform necessary clean up work.
*/
function closeGISEditor(){
$("#popup_background").fadeOut("fast");
$("#gis_editor").fadeOut("fast");
$("#gis_editor").html('');
}
/**
* Prepares the HTML recieved via AJAX.
*/
function prepareJSVersion() {
// Hide 'Go' buttons associated with the dropdowns
$('.go').hide();
// Change the text on the submit button
$("input[name='gis_data[save]']")
.attr('value', PMA_messages['strCopy'])
.insertAfter($('#gis_data_textarea'))
.before('<br><br>');
// Add close and cancel links
$('#gis_data_editor').prepend('<a class="close_gis_editor">' + PMA_messages['strClose'] + '</a>');
$('<a class="cancel_gis_editor"> ' + PMA_messages['strCancel'] + '</a>')
.insertAfter($("input[name='gis_data[save]']"));
// Remove the unnecessary text
$('div#gis_data_output p').remove();
// Remove 'add' buttons and add links
$('.add').each(function(e) {
var $button = $(this);
$button.addClass('addJs').removeClass('add');
var classes = $button.attr('class');
$button
.after('<a class="' + classes + '" name="' + $button.attr('name')
+ '">+ ' + $button.attr('value') + '</a>')
.remove();
});
}
/**
* Returns the HTML for a data point.
*
* @param pointNumber point number
* @param prefix prefix of the name
* @returns the HTML for a data point
*/
function addDataPoint(pointNumber, prefix) {
return '<br>' + PMA_messages['strPoint'] + (pointNumber + 1) + ':'
+ '<label for="x"> ' + PMA_messages['strX'] + ' </label>'
+ '<input type="text" name="' + prefix + '[' + pointNumber + '][x]" value="">'
+ '<label for="y"> ' + PMA_messages['strY'] + ' </label>'
+ '<input type="text" name="' + prefix + '[' + pointNumber + '][y]" value="">';
}
/**
* Initialize the visualization in the GIS data editor.
*/
function initGISEditorVisualization() {
// Loads either SVG or OSM visualization based on the choice
selectVisualization();
// Adds necessary styles to the div that coontains the openStreetMap
styleOSM();
// Loads the SVG element and make a reference to it
loadSVG();
// Adds controllers for zooming and panning
addZoomPanControllers();
zoomAndPan();
}
/**
* Opens up the GIS data editor.
*
* @param value current value of the geometry field
* @param field field name
* @param type geometry type
* @param input_name name of the input field
* @param token token
*/
function openGISEditor(value, field, type, input_name, token) {
// Center the popup
var windowWidth = document.documentElement.clientWidth;
var windowHeight = document.documentElement.clientHeight;
var popupWidth = windowWidth * 0.9;
var popupHeight = windowHeight * 0.9;
var popupOffsetTop = windowHeight / 2 - popupHeight / 2;
var popupOffsetLeft = windowWidth / 2 - popupWidth / 2;
var $gis_editor = $("#gis_editor");
$gis_editor.css({"top": popupOffsetTop, "left": popupOffsetLeft, "width": popupWidth, "height": popupHeight});
$.post('gis_data_editor.php', {
'field' : field,
'value' : value,
'type' : type,
'input_name' : input_name,
'get_gis_editor' : true,
'token' : token
}, function(data) {
if(data.success == true) {
$gis_editor.html(data.gis_editor);
initGISEditorVisualization();
prepareJSVersion();
} else {
PMA_ajaxShowMessage(data.error);
}
}, 'json');
// Make it appear
$("#popup_background").css({"opacity":"0.7"});
$("#popup_background").fadeIn("fast");
$gis_editor.fadeIn("fast");
}
/**
* Prepare and insert the GIS data in Well Known Text format
* to the input field.
*/
function insertDataAndClose() {
var $form = $('form#gis_data_editor_form');
var input_name = $form.find("input[name='input_name']").val();
$.post('gis_data_editor.php', $form.serialize() + "&generate=true", function(data) {
if(data.success == true) {
$("input[name='" + input_name + "']").val(data.result);
} else {
PMA_ajaxShowMessage(data.error);
}
}, 'json');
closeGISEditor();
}
$(document).ready(function() {
// Remove the class that is added due to the URL being too long.
$('.open_gis_editor a').removeClass('formLinkSubmit');
/**
* Prepares and insert the GIS data to the input field on clicking 'copy'.
*/
$("input[name='gis_data[save]']").live('click', function(event) {
event.preventDefault();
insertDataAndClose();
});
/**
* Prepares and insert the GIS data to the input field on pressing 'enter'.
*/
$('#gis_editor').live('submit', function(event) {
event.preventDefault();
insertDataAndClose();
});
/**
* Trigger asynchronous calls on data change and update the output.
*/
$('#gis_editor').find("input[type='text']").live('change', function() {
var $form = $('form#gis_data_editor_form');
$.post('gis_data_editor.php', $form.serialize() + "&generate=true", function(data) {
if(data.success == true) {
$('#gis_data_textarea').val(data.result);
$('#placeholder').empty().removeClass('hasSVG').html(data.visualization);
$('#openlayersmap').empty();
eval(data.openLayers);
initGISEditorVisualization();
} else {
PMA_ajaxShowMessage(data.error);
}
}, 'json');
});
/**
* Update the form on change of the GIS type.
*/
$(".gis_type").live('change', function(event) {
var $gis_editor = $("#gis_editor");
var $form = $('form#gis_data_editor_form');
$.post('gis_data_editor.php', $form.serialize() + "&get_gis_editor=true", function(data) {
if(data.success == true) {
$gis_editor.html(data.gis_editor);
initGISEditorVisualization();
prepareJSVersion();
} else {
PMA_ajaxShowMessage(data.error);
}
}, 'json');
});
/**
* Handles closing of the GIS data editor.
*/
$('.close_gis_editor, .cancel_gis_editor').live('click', function() {
closeGISEditor();
});
/**
* Handles adding data points
*/
$('.addJs.addPoint').live('click', function() {
var $a = $(this);
var name = $a.attr('name');
// Eg. name = gis_data[0][MULTIPOINT][add_point] => prefix = gis_data[0][MULTIPOINT]
var prefix = name.substr(0, name.length - 11);
// Find the number of points
var $noOfPointsInput = $("input[name='" + prefix + "[no_of_points]" + "']");
var noOfPoints = parseInt($noOfPointsInput.attr('value'));
// Add the new data point
var html = addDataPoint(noOfPoints, prefix);
$a.before(html);
$noOfPointsInput.attr('value', noOfPoints + 1);
});
/**
* Handles adding linestrings and inner rings
*/
$('.addLine.addJs').live('click', function() {
var $a = $(this);
var name = $a.attr('name');
// Eg. name = gis_data[0][MULTILINESTRING][add_line] => prefix = gis_data[0][MULTILINESTRING]
var prefix = name.substr(0, name.length - 10);
var type = prefix.slice(prefix.lastIndexOf('[') + 1, prefix.lastIndexOf(']'));
// Find the number of lines
var $noOfLinesInput = $("input[name='" + prefix + "[no_of_lines]" + "']");
var noOfLines = parseInt($noOfLinesInput.attr('value'));
// Add the new linesting of inner ring based on the type
var html = '<br>';
if (type == 'MULTILINESTRING') {
html += PMA_messages['strLineString'] + (noOfLines + 1) + ':';
var noOfPoints = 2;
} else {
html += PMA_messages['strInnerRing'] + noOfLines + ':';
var noOfPoints = 4;
}
html += '<input type="hidden" name="' + prefix + '[' + noOfLines + '][no_of_points]" value="' + noOfPoints + '">';
for (i = 0; i < noOfPoints; i++) {
html += addDataPoint(i, (prefix + '[' + noOfLines + ']'));
}
html += '<a class="addPoint addJs" name="' + prefix + '[' + noOfLines + '][add_point]">+ '
+ PMA_messages['strAddPoint'] + '</a><br>';
$a.before(html);
$noOfLinesInput.attr('value', noOfLines + 1);
});
/**
* Handles adding polygons
*/
$('.addJs.addPolygon').live('click', function() {
var $a = $(this);
var name = $a.attr('name');
// Eg. name = gis_data[0][MULTIPOLYGON][add_polygon] => prefix = gis_data[0][MULTIPOLYGON]
var prefix = name.substr(0, name.length - 13);
// Find the number of polygons
var $noOfPolygonsInput = $("input[name='" + prefix + "[no_of_polygons]" + "']");
var noOfPolygons = parseInt($noOfPolygonsInput.attr('value'));
// Add the new polygon
var html = PMA_messages['strPolygon'] + (noOfPolygons + 1) + ':<br>';
html += '<input type="hidden" name="' + prefix + '[' + noOfPolygons + '][no_of_lines]" value="1">';
+ '<br>' + PMA_messages['strOuterRing'] + ':';
+ '<input type="hidden" name="' + prefix + '[' + noOfPolygons + '][0][no_of_points]" value="4">';
for (i = 0; i < 4; i++) {
html += addDataPoint(i, (prefix + '[' + noOfPolygons + '][0]'));
}
html += '<a class="addPoint addJs" name="' + prefix + '[' + noOfPolygons + '][0][add_point]">+ '
+ PMA_messages['strAddPoint'] + '</a><br>'
+ '<a class="addLine addJs" name="' + prefix + '[' + noOfPolygons + '][add_line]">+ '
+ PMA_messages['strAddInnerRing'] + '</a><br><br>';
$a.before(html);
$noOfPolygonsInput.attr('value', noOfPolygons + 1);
});
/**
* Handles adding geoms
*/
$('.addJs.addGeom').live('click', function() {
var $a = $(this);
var prefix = 'gis_data[GEOMETRYCOLLECTION]';
// Find the number of geoms
var $noOfGeomsInput = $("input[name='" + prefix + "[geom_count]" + "']");
var noOfGeoms = parseInt($noOfGeomsInput.attr('value'));
var html1 = PMA_messages['strGeometry'] + (noOfGeoms + 1) + ':<br>';
var $geomType = $("select[name='gis_data[" + (noOfGeoms - 1) + "][gis_type]']").clone();
$geomType.attr('name', 'gis_data[' + noOfGeoms + '][gis_type]').val('POINT');
var html2 = '<br>' + PMA_messages['strPoint'] + ' :'
+ '<label for="x"> ' + PMA_messages['strX'] + ' </label>'
+ '<input type="text" name="gis_data[' + noOfGeoms + '][POINT][x]" value="">'
+ '<label for="y"> ' + PMA_messages['strY'] + ' </label>'
+ '<input type="text" name="gis_data[' + noOfGeoms + '][POINT][y]" value="">'
+ '<br><br>';
$a.before(html1); $geomType.insertBefore($a); $a.before(html2);
$noOfGeomsInput.attr('value', noOfGeoms + 1);
});
});

View File

@ -826,9 +826,11 @@
// if user has supplied a sort list to constructor.
if (config.sortList.length > 0) {
$this.trigger("sorton", [config.sortList]);
} else {
// appendToTable used in sorton event already calls applyWidget
// apply widgets
applyWidget(this);
}
// apply widgets
applyWidget(this);
});
};
this.addParser = function (parser) {

1540
js/jquery/timepicker.js vendored

File diff suppressed because it is too large Load Diff

View File

@ -19,22 +19,22 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
* Constant
***********/
minColWidth: 15,
/***********
* Variables, assigned with default value, changed later
***********/
actionSpan: 5, // number of colspan in Actions header in a table
tableCreateTime: null, // table creation time, used for saving column order and visibility to server, only available in "Browse tab"
// Column reordering variables
colOrder: new Array(), // array of column order
// Column visibility variables
colVisib: new Array(), // array of column visibility
showAllColText: '', // string, text for "show all" button under column visibility list
visibleHeadersCount: 0, // number of visible data headers
// Table hint variables
qtip: null, // qtip API
reorderHint: '', // string, hint for column reordering
@ -45,7 +45,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
showSortHint: false,
showMarkHint: false,
showColVisibHint: false,
// Grid editing
isCellEditActive: false, // true if current focus is in edit cell
isEditCellTextEditable: false, // true if current edit cell is editable in the text input box (not textarea)
@ -60,14 +60,14 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
lastXHR : null, // last XHR object used in AJAX request
isSaving: false, // true when currently saving edited data, used to handle double posting caused by pressing ENTER in grid edit text box in Chrome browser
alertNonUnique: '', // string, alert shown when saving edited nonunique table
// Common hidden inputs
token: null,
server: null,
db: null,
table: null,
/************
* Functions
************/
@ -93,7 +93,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
g.hideEditCell();
}
},
/**
* Start to reorder column. Called when clicking on table header.
*
@ -113,10 +113,10 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
$(g.cPointer).css({
top: objPos.top
});
// get the column index, zero-based
var n = g.getHeaderIdx(obj);
g.colReorder = {
x0: e.pageX,
y0: e.pageY,
@ -133,7 +133,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
g.hideEditCell();
}
},
/**
* Handle mousemove event when dragging.
*
@ -151,7 +151,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
$(g.cCpy)
.css('left', g.colReorder.objLeft + dx)
.show();
// pointer animation
var hoveredCol = g.getHoveredCol(e);
if (hoveredCol) {
@ -175,7 +175,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
}
}
},
/**
* Stop the dragging action.
*
@ -191,7 +191,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
var n = g.colRsz.n;
// do the resizing
g.resize(n, nw);
g.reposRsz();
g.reposDrop();
g.colRsz = false;
@ -210,7 +210,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
}
g.refreshRestoreButton();
}
// animate new column position
$(g.cCpy).stop(true, true)
.animate({
@ -225,7 +225,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
$('body').css('cursor', 'inherit');
$('body').noSelect(false);
},
/**
* Resize column n to new width "nw"
*
@ -239,7 +239,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
.css('width', nw);
});
},
/**
* Reposition column resize bars.
*/
@ -254,7 +254,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
}
$(g.cRsz).css('height', $(g.t).height());
},
/**
* Shift column from index oldn to newn.
*
@ -277,7 +277,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
});
// reposition the column resize bars
g.reposRsz();
// adjust the column visibility list
if (newn < oldn) {
$(g.cList).find('.lDiv div:eq(' + newn + ')')
@ -297,7 +297,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
g.colVisib.splice(newn, 0, tmp);
}
},
/**
* Find currently hovered table column's header (excluding actions column).
*
@ -316,7 +316,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
});
return hoveredCol;
},
/**
* Get a zero-based index from a <th class="draggable"> tag in a table.
*
@ -326,7 +326,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
getHeaderIdx: function(obj) {
return $(obj).parents('tr').find('th.draggable').index(obj);
},
/**
* Reposition the columns back to normal order.
*/
@ -348,7 +348,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
}
g.refreshRestoreButton();
},
/**
* Send column preferences (column order and visibility) to the server.
*/
@ -379,7 +379,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
});
}
},
/**
* Refresh restore button state.
* Make restore button disabled if the table is similar with initial state.
@ -402,7 +402,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
$('.restore_column').show();
}
},
/**
* Update current hint using the boolean values (showReorderHint, showSortHint, etc.).
* It will hide the hint if all the boolean values is false.
@ -429,23 +429,23 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
text += text.length > 0 ? '<br />' : '';
text += g.colVisibHint;
}
// hide the hint if no text and the event is mouseenter
g.qtip.disable(!text && e.type == 'mouseenter');
g.qtip.updateContent(text, false);
} else {
g.hideHint();
}
},
hideHint: function() {
if (g.qtip) {
g.qtip.hide();
g.qtip.disable(true);
}
},
/**
* Toggle column's visibility.
* After calling this function and it returns true, afterToggleCol() must be called.
@ -479,7 +479,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
}
return true;
},
/**
* This must be called if toggleCol() returns is true.
*
@ -491,12 +491,12 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
g.reposRsz();
g.reposDrop();
g.sendColPrefs();
// check visible first row headers count
g.visibleHeadersCount = $(g.t).find('tr:first th.draggable:visible').length;
g.refreshRestoreButton();
},
/**
* Show columns' visibility list.
*
@ -518,7 +518,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
$(obj).addClass('coldrop-hover');
}
},
/**
* Hide columns' visibility list.
*/
@ -526,7 +526,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
$(g.cList).hide();
$(g.cDrop).find('.coldrop-hover').removeClass('coldrop-hover');
},
/**
* Reposition the column visibility drop-down arrow.
*/
@ -541,7 +541,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
});
}
},
/**
* Show all hidden columns.
*/
@ -553,7 +553,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
}
g.afterToggleCol();
},
/**
* Show edit cell, if it can be shown
*
@ -570,7 +570,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
// reposition the cEdit element
$(g.cEdit).css({
top: $cell.position().top,
left: $cell.position().left,
left: $cell.position().left
})
.show()
.find('input')
@ -582,7 +582,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
var value = $cell.is(':not(.null)') ? PMA_getCellValue(cell) : '';
$(g.cEdit).find('input')
.val(value);
g.currentEditCell = cell;
$(g.cEdit).find('input[type=text]').focus();
$(g.cEdit).find('*').removeAttr('disabled');
@ -593,7 +593,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
}
}
},
/**
* Remove edit cell and the edit area, if it is shown.
*
@ -609,13 +609,13 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
g.saveOrPostEditedCell();
return;
}
// cancel any previous request
if (g.lastXHR != null) {
g.lastXHR.abort();
g.lastXHR = null;
}
if (data) {
if (g.currentEditCell) { // save value of currently edited cell
// replace current edited field with the new value
@ -649,19 +649,21 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
$this_field.find('span').html(value);
});
}
// refresh the grid
g.reposRsz();
g.reposDrop();
}
// hide the cell editing area
$(g.cEdit).hide();
$(g.cEdit).find('input[type=text]').blur();
g.isCellEditActive = false;
g.currentEditCell = null;
// destroy datepicker in edit area, if exist
$(g.cEdit).find('.hasDatepicker').datepicker('destroy');
},
/**
* Show drop-down edit area when edit cell is focused.
*/
@ -690,10 +692,10 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
* @var curr_value String current value of the field (for fields that are of type enum or set).
*/
var curr_value = $td.find('span').text();
// empty all edit area, then rebuild it based on $td classes
$editArea.empty();
// add goto link, if this cell contains a link
if ($td.find('a').length > 0) {
var gotoLink = document.createElement('div');
@ -702,7 +704,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
.append($td.find('a').clone());
$editArea.append(gotoLink);
}
g.wasEditedCellNull = false;
if ($td.is(':not(.not_null)')) {
// append a null checkbox
@ -713,7 +715,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
$checkbox.attr('checked', true);
g.wasEditedCellNull = true;
}
// if the select/editor is changed un-check the 'checkbox_null_<field_name>_<row_index>'.
if ($td.is('.enum, .set')) {
$editArea.find('select').live('change', function(e) {
@ -727,14 +729,14 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
$checkbox.attr('checked', false);
})
} else {
$(g.cEdit).find('input[type=text]').live('change', function(e) {
$(g.cEdit).find('input[type=text]').live('keypress change', function(e) {
$checkbox.attr('checked', false);
})
$editArea.find('textarea').live('keydown', function(e) {
$checkbox.attr('checked', false);
})
}
// if 'checkbox_null_<field_name>_<row_index>' is clicked empty the corresponding select/editor.
$checkbox.click(function(e) {
if ($td.is('.enum')) {
@ -755,7 +757,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
$(g.cEdit).find('input[type=text]').val('');
})
}
if($td.is('.relation')) {
/** @lends jQuery */
//handle relations
@ -763,7 +765,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
// initialize the original data
$td.data('original_data', null);
/**
* @var post_params Object containing parameters for the POST request
*/
@ -787,11 +789,11 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
$td.data('original_data', value);
// update the text input field, in case where the "Relational display column" is checked
$(g.cEdit).find('input[type=text]').val(value);
$editArea.append(data.dropdown);
$editArea.append('<div class="cell_edit_hint">' + g.cellEditHint + '</div>');
}) // end $.post()
$editArea.find('select').live('change', function(e) {
$(g.cEdit).find('input[type=text]').val($(this).val());
})
@ -820,7 +822,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
$editArea.append(data.dropdown);
$editArea.append('<div class="cell_edit_hint">' + g.cellEditHint + '</div>');
}) // end $.post()
$editArea.find('select').live('change', function(e) {
$(g.cEdit).find('input[type=text]').val($(this).val());
})
@ -850,7 +852,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
$editArea.append(data.select);
$editArea.append('<div class="cell_edit_hint">' + g.cellEditHint + '</div>');
}) // end $.post()
$editArea.find('select').live('change', function(e) {
$(g.cEdit).find('input[type=text]').val($(this).val());
})
@ -879,7 +881,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
* @var sql_query String containing the SQL query used to retrieve value of truncated/transformed data
*/
var sql_query = 'SELECT `' + field_name + '` FROM `' + g.table + '` WHERE ' + PMA_urldecode(where_clause);
// Make the Ajax call and get the data, wrap it and insert it
g.lastXHR = $.post('sql.php', {
'token' : g.token,
@ -896,7 +898,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
// get the truncated data length
g.maxTruncatedLen = $(g.currentEditCell).text().length - 3;
}
$td.data('original_data', data.value);
$(g.cEdit).find('input[type=text]').val(data.value);
$editArea.append('<textarea>'+data.value+'</textarea>');
@ -914,6 +916,33 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
}) // end $.post()
}
g.isEditCellTextEditable = true;
} else if ($td.is('.datefield, .datetimefield, .timestampfield')) {
var $input_field = $(g.cEdit).find('input[type=text]');
// remember current datetime value in $input_field, if it is not null
var is_null = $td.is('.null');
var current_datetime_value = !is_null ? $input_field.val() : '';
var showTimeOption = true;
if ($td.is('.datefield')) {
showTimeOption = false;
}
PMA_addDatepicker($editArea, {
altField: $input_field,
showTimepicker: showTimeOption,
onSelect: function(dateText, inst) {
// remove null checkbox if it exists
$(g.cEdit).find('.null_div input[type=checkbox]').attr('checked', false);
}
});
// force to restore modified $input_field value after adding datepicker
// (after adding a datepicker, the input field doesn't display the time anymore, only the date)
if (!is_null) {
$editArea.datetimepicker('setDate', current_datetime_value);
} else {
$input_field.val('');
}
} else {
$editArea.append('<textarea>' + PMA_getCellValue(g.currentEditCell) + '</textarea>');
$editArea.find('textarea').live('keyup', function(e) {
@ -925,11 +954,11 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
$editArea.append('<div class="cell_edit_hint">' + g.cellEditHint + '</div>');
g.isEditCellTextEditable = true;
}
$editArea.show();
}
},
/**
* Post the content of edited cell.
*/
@ -938,7 +967,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
return;
}
g.isSaving = true;
/**
* @var relation_fields Array containing the name/value pairs of relational fields
*/
@ -981,19 +1010,19 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
var me_fields_name = Array();
var me_fields = Array();
var me_fields_null = Array();
// alert user if edited table is not unique
if (!is_unique) {
alert(g.alertNonUnique);
}
// loop each edited row
$('.to_be_saved').parents('tr').each(function() {
var $tr = $(this);
var where_clause = $tr.find('.where_clause').val();
full_where_clause.push(PMA_urldecode(where_clause));
var condition_array = jQuery.parseJSON($tr.find('.condition_array').val());
/**
* multi edit variables, for current row
* @TODO array indices are still not correct, they should be md5 of field's name
@ -1008,7 +1037,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
* @var $this_field Object referring to the td that is being edited
*/
var $this_field = $(this);
/**
* @var field_name String containing the name of this field.
* @see getFieldName()
@ -1024,21 +1053,21 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
transformation_fields = true;
}
this_field_params[field_name] = $this_field.data('value');
/**
* @var is_null String capturing whether 'checkbox_null_<field_name>_<row_index>' is checked.
*/
var is_null = this_field_params[field_name] === null;
fields_name.push(field_name);
if (is_null) {
fields_null.push('on');
fields.push('');
} else {
fields_null.push('');
fields.push($this_field.data('value'));
var cell_index = $this_field.index('.to_be_saved');
if($this_field.is(":not(.relation, .enum, .set, .bit)")) {
if($this_field.is('.transformed')) {
@ -1060,9 +1089,9 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
}
}
}
}); // end of loop for every edited cells in a row
// save new_clause
var new_clause = '';
for (var field in condition_array) {
@ -1073,16 +1102,16 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
$tr.data('new_clause', new_clause);
// save condition_array
$tr.find('.condition_array').val(JSON.stringify(condition_array));
me_fields_name.push(fields_name);
me_fields.push(fields);
me_fields_null.push(fields_null);
}); // end of loop for every edited rows
rel_fields_list = $.param(relation_fields);
transform_fields_list = $.param(transform_fields);
// Make the Ajax post after setting all parameters
/**
* @var post_params Object containing parameters for the POST request
@ -1105,7 +1134,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
'goto' : 'sql.php',
'submit_type' : 'save'
};
if (!g.saveCellsAtOnce) {
$(g.cEdit).find('*').attr('disabled', 'disabled');
var $editArea = $(g.cEdit).find('.edit_area');
@ -1114,7 +1143,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
$('.save_edited').addClass('saving_edited_data')
.find('input').attr('disabled', 'disabled'); // disable the save button
}
$.ajax({
type: 'POST',
url: 'tbl_replace.php',
@ -1138,7 +1167,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
var old_clause = $where_clause.attr('value');
var decoded_old_clause = PMA_urldecode(old_clause);
var decoded_new_clause = PMA_urldecode(new_clause);
$where_clause.attr('value', new_clause);
// update Edit, Copy, and Delete links also
$(this).parent('tr').find('a').each(function() {
@ -1158,7 +1187,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
var $checkbox = $(this);
var checkbox_name = $checkbox.attr('name');
var checkbox_value = $checkbox.attr('value');
$checkbox.attr('name', checkbox_name.replace(old_clause, new_clause));
$checkbox.attr('value', checkbox_value.replace(decoded_old_clause, decoded_new_clause));
});
@ -1171,7 +1200,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
$('#sqlqueryresults').prepend(data.sql_query);
}
g.hideEditCell(true, data);
// remove the "Save edited cells" button
$('.save_edited').hide();
// update saved fields
@ -1179,7 +1208,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
.removeClass('to_be_saved')
.data('value', null)
.data('original_data', null);
g.isCellEdited = false;
} else {
PMA_ajaxShowMessage(data.error);
@ -1187,7 +1216,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
}
}) // end $.ajax()
},
/**
* Save edited cell, so it can be posted later.
*/
@ -1225,16 +1254,14 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
need_to_post = true;
}
} else {
if($this_field.is(":not(.relation, .enum, .set, .bit)")) {
this_field_params[field_name] = $(g.cEdit).find('textarea').val();
} else if ($this_field.is('.bit')) {
if ($this_field.is('.bit')) {
this_field_params[field_name] = '0b' + $(g.cEdit).find('textarea').val();
} else if ($this_field.is('.set')) {
$test_element = $(g.cEdit).find('select');
this_field_params[field_name] = $test_element.map(function(){
return $(this).val();
}).get().join(",");
} else {
} else if ($this_field.is('.relation, .enum')) {
// results from a drop-down
$test_element = $(g.cEdit).find('select');
if ($test_element.length != 0) {
@ -1246,12 +1273,16 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
if ($test_element.length != 0) {
this_field_params[field_name] = $test_element.text();
}
} else if ($this_field.is('.datefield, .datetimefield, .timestampfield')) {
this_field_params[field_name] = $(g.cEdit).find('input[type=text]').val();
} else {
this_field_params[field_name] = $(g.cEdit).find('textarea').val();
}
if (g.wasEditedCellNull || this_field_params[field_name] != PMA_getCellValue(g.currentEditCell)) {
need_to_post = true;
}
}
if (need_to_post) {
$(g.currentEditCell).addClass('to_be_saved')
.data('value', this_field_params[field_name]);
@ -1260,10 +1291,10 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
}
g.isCellEdited = true;
}
return need_to_post;
},
/**
* Save or post currently edited cell, depending on the "saveCellsAtOnce" configuration.
*/
@ -1283,7 +1314,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
}
}
},
/**
* Initialize column resize feature.
*/
@ -1291,10 +1322,10 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
// create column resizer div
g.cRsz = document.createElement('div');
g.cRsz.className = 'cRsz';
// get data columns in the first row of the table
var $firstRowCols = $(g.t).find('tr:first th.draggable');
// create column borders
$firstRowCols.each(function() {
var cb = document.createElement('div'); // column border
@ -1305,32 +1336,32 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
$(g.cRsz).append(cb);
});
g.reposRsz();
// attach to global div
$(g.gDiv).prepend(g.cRsz);
},
/**
* Initialize column reordering feature.
*/
initColReorder: function() {
g.cCpy = document.createElement('div'); // column copy, to store copy of dragged column header
g.cPointer = document.createElement('div'); // column pointer, used when reordering column
// adjust g.cCpy
g.cCpy.className = 'cCpy';
$(g.cCpy).hide();
// adjust g.cPointer
g.cPointer.className = 'cPointer';
$(g.cPointer).css('visibility', 'hidden'); // set visibility to hidden instead of calling hide() to force browsers to cache the image in cPointer class
// assign column reordering hint
g.reorderHint = PMA_messages['strColOrderHint'];
// get data columns in the first row of the table
var $firstRowCols = $(g.t).find('tr:first th.draggable');
// initialize column order
$col_order = $('#col_order'); // check if column order is passed from PHP
if ($col_order.length > 0) {
@ -1344,7 +1375,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
g.colOrder.push(i);
}
}
// register events
$(t).find('th.draggable')
.mousedown(function(e) {
@ -1367,41 +1398,41 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
$('.restore_column').click(function() {
g.restoreColOrder();
});
// attach to global div
$(g.gDiv).append(g.cPointer);
$(g.gDiv).append(g.cCpy);
// prevent default "dragstart" event when dragging a link
$(t).find('th a').bind('dragstart', function() {
return false;
});
// refresh the restore column button state
g.refreshRestoreButton();
},
/**
* Initialize column visibility feature.
*/
initColVisib: function() {
g.cDrop = document.createElement('div'); // column drop-down arrows
g.cList = document.createElement('div'); // column visibility list
// adjust g.cDrop
g.cDrop.className = 'cDrop';
// adjust g.cList
g.cList.className = 'cList';
$(g.cList).hide();
// assign column visibility related hints
g.colVisibHint = PMA_messages['strColVisibHint'];
g.showAllColText = PMA_messages['strShowAllCol'];
// get data columns in the first row of the table
var $firstRowCols = $(g.t).find('tr:first th.draggable');
// initialize column visibility
$col_visib = $('#col_visib'); // check if column visibility is passed from PHP
if ($col_visib.length > 0) {
@ -1415,15 +1446,15 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
g.colVisib.push(1);
}
}
// get data columns in the first row of the table
var $firstRowCols = $(t).find('tr:first th.draggable');
// make sure we have more than one column
if ($firstRowCols.length > 1) {
var $colVisibTh = $(g.t).find('th:not(.draggable)');
PMA_createqTip($colVisibTh);
// create column visibility drop-down arrow(s)
$colVisibTh.each(function() {
var $th = $(this);
@ -1445,7 +1476,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
.mouseleave(function(e) {
g.showColVisibHint = false;
});
// add column visibility control
g.cList.innerHTML = '<div class="lDiv"></div>';
var $listDiv = $(g.cList).find('div');
@ -1479,41 +1510,41 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
});
}
}
// hide column visibility list if we move outside the list
$(t).find('td, th.draggable').mouseenter(function() {
g.hideColList();
});
// attach to global div
$(g.gDiv).append(g.cDrop);
$(g.gDiv).append(g.cList);
// some adjustment
g.reposDrop();
},
/**
* Initialize grid editing feature.
*/
initGridEdit: function() {
// create cell edit wrapper element
g.cEdit = document.createElement('div');
// adjust g.cEdit
g.cEdit.className = 'cEdit';
$(g.cEdit).html('<input type="text" /><div class="edit_area" />');
$(g.cEdit).hide();
// assign cell editing hint
g.cellEditHint = PMA_messages['strCellEditHint'];
g.saveCellWarning = PMA_messages['strSaveCellWarning'];
g.alertNonUnique = PMA_messages['strAlertNonUnique'];
g.gotoLinkText = PMA_messages['strGoToLink'];
// initialize cell editing configuration
g.saveCellsAtOnce = $('#save_cells_at_once').val();
// register events
$(t).find('td.data')
.click(function(e) {
@ -1545,6 +1576,9 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
e.preventDefault();
}
});
$(g.cEdit).find('.edit_area').click(function(e) {
e.stopPropagation();
});
$('html').click(function(e) {
// hide edit cell if the click is not from g.cEdit
if ($(e.target).parents().index(g.cEdit) == -1) {
@ -1567,60 +1601,63 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
return g.saveCellWarning;
}
});
// attach to global div
$(g.gDiv).append(g.cEdit);
// add hint for grid editing feature when hovering "Edit" link in each table row
PMA_createqTip($(g.t).find('.edit_row_anchor a'), PMA_messages['strGridEditFeatureHint']);
}
}
/******************
* Initialize grid
******************/
// add relative position to table so that resize handlers are correctly positioned
$(t).css('position', 'relative');
// wrap all data cells, except actions cell, with span
$(t).find('th, td:not(:has(span))')
.wrapInner('<span />');
// create grid elements
g.gDiv = document.createElement('div'); // create global div
// initialize the table variable
g.t = t;
// get data columns in the first row of the table
var $firstRowCols = $(t).find('tr:first th.draggable');
// initialize visible headers count
g.visibleHeadersCount = $firstRowCols.filter(':visible').length;
// assign first column (actions) span
if (! $(t).find('tr:first th:first').hasClass('draggable')) { // action header exist
g.actionSpan = $(t).find('tr:first th:first').prop('colspan');
} else {
g.actionSpan = 0;
}
// assign table create time
// #table_create_time will only available if we are in "Browse" tab
g.tableCreateTime = $('#table_create_time').val();
// assign the hints
g.sortHint = PMA_messages['strSortHint'];
g.markHint = PMA_messages['strColMarkHint'];
// assign common hidden inputs
var $common_hidden_inputs = $('.common_hidden_inputs');
g.token = $common_hidden_inputs.find('input[name=token]').val();
g.server = $common_hidden_inputs.find('input[name=server]').val();
g.db = $common_hidden_inputs.find('input[name=db]').val();
g.table = $common_hidden_inputs.find('input[name=table]').val();
// add table class
$(t).addClass('pma_table');
// link the global div
$(t).before(g.gDiv);
$(g.gDiv).append(t);
@ -1646,10 +1683,10 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
{
g.initGridEdit();
}
// create qtip for each <th> with draggable class
PMA_createqTip($(t).find('th.draggable'));
// register events for hint tooltip
$(t).find('th.draggable a')
.attr('title', '') // hide default tooltip for sorting
@ -1677,7 +1714,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
g.dragEnd(e);
});
}
// bind event to update currently hovered qtip API
$(t).find('th')
.mouseenter(function(e) {
@ -1687,7 +1724,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
.mouseleave(function(e) {
g.updateHint(e);
});
// some adjustment
$(t).removeClass('data');
$(g.gDiv).addClass('data');

View File

@ -90,7 +90,7 @@ $js_messages['strChartIssuedQueriesTitle'] = __('Questions (executed statements
$js_messages['strChartQueryPie'] = __('Query statistics');
/* server status monitor */
$js_messages['strIncompatibleMonitorConfig'] = __('Local monitor configuration icompatible');
$js_messages['strIncompatibleMonitorConfig'] = __('Local monitor configuration incompatible');
$js_messages['strIncompatibleMonitorConfigDescription'] = __('The chart arrangement configuration in your browsers local storage is not compatible anymore to the newer version of the monitor dialog. It is very likely that your current configuration will not work anymore. Please reset your configuration to default in the <i>Settings</i> menu.');
$js_messages['strQueryCacheEfficiency'] = __('Query cache efficiency');
@ -260,12 +260,38 @@ $js_messages['strShowSearchCriteria'] = __('Show search criteria');
/* For tbl_zoom_plot.js */
$js_messages['strZoomSearch'] = __('Zoom Search');
$js_messages['strDisplayHelp'] = __('* Each point represents a data row.<br>* Hovering over a point will show its label.<br>* Drag and select an area in the plot to zoom into it.<br>* Click reset zoom link to come back to original state.<br>* Click a data point to view and possibly edit the data row.<br>* The plot can be resized by dragging it along the bottom right corner.<br>* Strings are converted into integer for plotting');
$js_messages['strInputNull'] = __('<b>Select two columns</b>');
$js_messages['strSameInputs'] = __('<b>Select two different columns</b>');
$js_messages['strDisplayHelp'] = '<ul><li>'
. __('Each point represents a data row.')
. '</li><li>'
. __('Hovering over a point will show its label.')
. '</li><li>'
. __('Drag and select an area in the plot to zoom into it.')
. '</li><li>'
. __('Click reset zoom link to come back to original state.')
. '</li><li>'
. __('Click a data point to view and possibly edit the data row.')
. '</li><li>'
. __('The plot can be resized by dragging it along the bottom right corner.')
. '</li><li>'
. __('Strings are converted into integer for plotting')
. '</li></ul>';
$js_messages['strInputNull'] = '<strong>' . __('Select two columns') . '</strong>';
$js_messages['strSameInputs'] = '<strong>' . __('Select two different columns') . '</strong>';
/* For tbl_change.js */
$js_messages['strIgnore'] = __('Ignore');
$js_messages['strCopy'] = __('Copy');
$js_messages['strX'] = __('X');
$js_messages['strY'] = __('Y');
$js_messages['strPoint'] = __('Point');
$js_messages['strLineString'] = __('Linestring');
$js_messages['strPolygon'] = __('Polygon');
$js_messages['strGeometry'] = __('Geometry');
$js_messages['strInnerRing'] = __('Inner Ring');
$js_messages['strOuterRing'] = __('Outer Ring');
$js_messages['strAddPoint'] = __('Add a point');
$js_messages['strAddInnerRing'] = __('Add an inner ring');
$js_messages['strAddPolygon'] = __('Add a polygon');
/* For tbl_structure.js */
$js_messages['strAddColumns'] = __('Add columns');

View File

@ -15,6 +15,9 @@
// Add a tablesorter parser to properly handle thousands seperated numbers and SI prefixes
$(function() {
// Show all javascript related parts of the page
$('.jsfeature').show();
jQuery.tablesorter.addParser({
id: "fancyNumber",
is: function(s) {
@ -40,7 +43,24 @@ $(function() {
},
type: "numeric"
});
// faster zebra widget: no row visibility check, faster css class switching, no cssChildRow check
jQuery.tablesorter.addWidget({
id: "fast-zebra",
format: function (table) {
if (table.config.debug) {
var time = new Date();
}
$("tr:even", table.tBodies[0])
.removeClass(table.config.widgetZebra.css[0])
.addClass(table.config.widgetZebra.css[1]);
$("tr:odd", table.tBodies[0])
.removeClass(table.config.widgetZebra.css[1])
.addClass(table.config.widgetZebra.css[0]);
if (table.config.debug) {
$.tablesorter.benchmark("Applying Fast-Zebra widget", time);
}
}
});
// Popup behaviour
$('a[rel="popupLink"]').click( function() {
@ -107,10 +127,16 @@ $(function() {
cookie: { name: 'pma_serverStatusTabs', expires: 1 },
show: function(event, ui) {
// Fixes line break in the menu bar when the page overflows and scrollbar appears
menuResize();
menuResize();
// Initialize selected tab
if (!$(ui.tab.hash).data('init-done')) {
initTab($(ui.tab.hash), null);
}
// Load Server status monitor
if (ui.tab.hash == '#statustabs_charting' && ! monitorLoaded) {
$('div#statustabs_charting').append(
$('div#statustabs_charting').append( //PMA_messages['strLoadingMonitor'] + ' ' +
'<img class="ajaxIcon" id="loadingMonitorIcon" src="' +
pmaThemeImage + 'ajax_clock_small.gif" alt="">'
);
@ -140,13 +166,14 @@ $(function() {
// Initialize each tab
$('div.ui-tabs-panel').each(function() {
initTab($(this), null);
tabStatus[$(this).attr('id')] = 'static';
var $tab = $(this);
tabStatus[$tab.attr('id')] = 'static';
// Initialize tabs after browser catches up with previous changes and displays tabs
setTimeout(function() {
initTab($tab, null);
}, 0.5);
});
// Display button links
$('div.buttonlinks').show();
// Handles refresh rate changing
$('.buttonlinks select').change(function() {
var chart = tabChart[$(this).parents('div.ui-tabs-panel').attr('id')];
@ -362,7 +389,7 @@ $(function() {
});
$('#filterText').keyup(function(e) {
word = $(this).val().replace(/_/g, ' ');
var word = $(this).val().replace(/_/g, ' ');
if (word.length == 0) {
textFilter = null;
@ -389,6 +416,10 @@ $(function() {
/* Adjust DOM / Add handlers to the tabs */
function initTab(tab, data) {
if ($(tab).data('init-done') && !data) {
return;
}
$(tab).data('init-done', true);
switch(tab.attr('id')) {
case 'statustabs_traffic':
if (data != null) {
@ -442,6 +473,7 @@ $(function() {
}
}
});
initTableSorter(tab.attr('id'));
break;
case 'statustabs_allvars':
@ -449,43 +481,40 @@ $(function() {
tab.find('.tabInnerContent').html(data);
filterVariables();
}
initTableSorter(tab.attr('id'));
break;
}
initTableSorter(tab.attr('id'));
}
// TODO: tablesorter shouldn't sort already sorted columns
function initTableSorter(tabid) {
var $table, opts;
switch(tabid) {
case 'statustabs_queries':
$('#serverstatusqueriesdetails').tablesorter({
sortList: [[3, 1]],
widgets: ['zebra'],
headers: {
1: { sorter: 'fancyNumber' },
2: { sorter: 'fancyNumber' }
}
});
$('#serverstatusqueriesdetails tr:first th')
.append('<img class="icon sortableIcon" src="themes/dot.gif" alt="">');
$table = $('#serverstatusqueriesdetails');
opts = {
sortList: [[3, 1]],
widgets: ['fast-zebra'],
headers: {
1: { sorter: 'fancyNumber' },
2: { sorter: 'fancyNumber' }
}
};
break;
case 'statustabs_allvars':
$('#serverstatusvariables').tablesorter({
sortList: [[0, 0]],
widgets: ['zebra'],
headers: {
1: { sorter: 'fancyNumber' }
}
});
$('#serverstatusvariables tr:first th')
.append('<img class="icon sortableIcon" src="themes/dot.gif" alt="">');
$table = $('#serverstatusvariables');
opts = {
sortList: [[0, 0]],
widgets: ['fast-zebra'],
headers: {
1: { sorter: 'fancyNumber' }
}
};
break;
}
$table.tablesorter(opts);
$table.find('tr:first th')
.append('<img class="icon sortableIcon" src="themes/dot.gif" alt="">');
}
/* Filters the status variables by name/category/alert in the variables tab */

View File

@ -1680,7 +1680,7 @@ $(function() {
$('div#logTable table').tablesorter({
sortList: [[cols.length - 1, 1]],
widgets: ['zebra']
widgets: ['fast-zebra']
});
$('div#logTable table thead th')
@ -1869,4 +1869,9 @@ $(function() {
$('a[href="#clearMonitorConfig"]').show();
}
});
// Run the monitor once loaded
$(function() {
$('a[href="#pauseCharts"]').trigger('click');
});

View File

@ -334,10 +334,10 @@ $(document).ready(function() {
*/
var button_options = {};
// in the following function we need to use $(this)
button_options[PMA_messages['strCancel']] = function() {$(this).parent().dialog('close').remove();}
button_options[PMA_messages['strCancel']] = function() {$(this).dialog('close').remove();}
var button_options_error = {};
button_options_error[PMA_messages['strOK']] = function() {$(this).parent().dialog('close').remove();}
button_options_error[PMA_messages['strOK']] = function() {$(this).dialog('close').remove();}
var $form = $("#resultsForm");
var $msgbox = PMA_ajaxShowMessage();
@ -351,6 +351,9 @@ $(document).ready(function() {
height: 230,
width: 900,
open: PMA_verifyTypeOfAllColumns,
close: function(event, ui) {
$('#change_row_dialog').remove();
},
buttons : button_options_error
})// end dialog options
} else {
@ -361,6 +364,9 @@ $(document).ready(function() {
height: 600,
width: 900,
open: PMA_verifyTypeOfAllColumns,
close: function(event, ui) {
$('#change_row_dialog').remove();
},
buttons : button_options
})
//Remove the top menu container from the dialog

View File

@ -218,11 +218,38 @@ function verificationsAfterFieldChange(urlField, multi_edit, theType)
* Ajax handlers for Change Table page
*
* Actions Ajaxified here:
* Submit Data to be inserted into the table
* Submit Data to be inserted into the table.
* Restart insertion with 'N' rows.
*/
$(document).ready(function() {
$('.open_gis_editor').live('click', function(event) {
event.preventDefault();
var $span = $(this);
// Current value
var value = $span.parent('td').children("input[type='text']").val();
// Field name
var field = $span.parents('tr').children('td:first').find("input[type='hidden']").val();
// Column type
var type = $span.parents('tr').find('span.column_type').text();
// Names of input field and null checkbox
var input_name = $span.parent('td').children("input[type='text']").attr('name');
//Token
var token = $("input[name='token']").val();
openGISEditor(value, field, type, input_name, token);
});
/**
* Uncheck the null checkbox as geometry data is placed on the input field
*/
$("input[name='gis_data[save]']").live('click', function(event) {
var input_name = $('form#gis_data_editor_form').find("input[name='input_name']").val();
var $null_checkbox = $("input[name='" + input_name + "']").parents('tr').find('.checkbox_null');
$null_checkbox.attr('checked', false);
});
// these were hidden via the "hide" class
$('.foreign_values_anchor').show();

View File

@ -8,7 +8,9 @@
*/
var x = 0;
var default_x = 0;
var y = 0;
var default_y = 0;
var scale = 1;
var svg;
@ -51,56 +53,52 @@ function zoomAndPan()
}
/**
* Ajax handlers for GIS visualization page
*
* Actions Ajaxified here:
*
* Zooming in and zooming out on mousewheel movement.
* Panning the visualization on dragging.
* Zooming in on double clicking.
* Zooming out on clicking the zoom out button.
* Panning on clicking the arrow buttons.
* Displaying tooltips for GIS objects.
* Initially loads either SVG or OSM visualization based on the choice.
*/
$(document).ready(function() {
var $placeholder = $('#placeholder');
var $openlayersmap = $('#openlayersmap');
if ($('#choice').prop('checked') != true) {
$openlayersmap.hide();
function selectVisualization() {
if ($('#choice').prop('checked') != true) {
$('#openlayersmap').hide();
} else {
$placeholder.hide();
$('#placeholder').hide();
}
$('.choice').show();
}
/**
* Adds necessary styles to the div that coontains the openStreetMap.
*/
function styleOSM() {
var $placeholder = $('#placeholder');
var cssObj = {
'border' : '1px solid #aaa',
'width' : $placeholder.width(),
'height' : $placeholder.height(),
'float' : 'right'
};
$openlayersmap.css(cssObj);
drawOpenLayers();
$('#openlayersmap').css(cssObj);
}
$('.choice').show();
$('#choice').bind('click', function() {
if ($(this).prop('checked') == false) {
$placeholder.show();
$openlayersmap.hide();
} else {
$placeholder.hide();
$openlayersmap.show();
}
});
/**
* Loads the SVG element and make a reference to it.
*/
function loadSVG() {
var $placeholder = $('#placeholder');
$('#placeholder').svg({
$placeholder.svg({
onLoad: function(svg_ref) {
svg = svg_ref;
}
});
// Removes the second SVG element unnecessarily added due to the above command.
$('#placeholder').find('svg:nth-child(2)').remove();
// Removes the second SVG element unnecessarily added due to the above command
$placeholder.find('svg:nth-child(2)').remove();
}
/**
* Adds controllers for zooming and panning.
*/
function addZoomPanControllers() {
var $placeholder = $('#placeholder');
if ($("#placeholder svg").length > 0) {
var pmaThemeImage = $('#pmaThemeImage').attr('value');
// add panning arrows
@ -113,7 +111,81 @@ $(document).ready(function() {
$('<img class="button" id="zoom_world" src="' + pmaThemeImage + 'zoom-world-mini.png">').appendTo($placeholder);
$('<img class="button" id="zoom_out" src="' + pmaThemeImage + 'zoom-minus-mini.png">').appendTo($placeholder);
}
}
/**
* Resizes the GIS visualization to fit into the space available.
*/
function resizeGISVisualization() {
var $placeholder = $('#placeholder');
// Hide inputs for width and height
$("input[name='visualizationSettings[width]']").parents('tr').remove();
$("input[name='visualizationSettings[height]']").parents('tr').remove();
var old_width = $placeholder.width();
var extraPadding = 100;
var leftWidth = $('.gis_table').width();
var windowWidth = document.documentElement.clientWidth;
var visWidth = windowWidth - extraPadding - leftWidth;
// Assign new value for width
$placeholder.width(visWidth);
$('svg').attr('width', visWidth);
// Assign the offset created due to resizing to default_x and center the svg.
default_x = (visWidth - old_width) / 2;
x = default_x;
}
/**
* Initialize the GIS visualization.
*/
function initGISVisualization() {
// Loads either SVG or OSM visualization based on the choice
selectVisualization();
// Resizes the GIS visualization to fit into the space available
resizeGISVisualization();
// Adds necessary styles to the div that coontains the openStreetMap
styleOSM();
// Draws openStreetMap with openLayers
drawOpenLayers();
// Loads the SVG element and make a reference to it
loadSVG();
// Adds controllers for zooming and panning
addZoomPanControllers();
zoomAndPan();
}
/**
* Ajax handlers for GIS visualization page
*
* Actions Ajaxified here:
*
* Zooming in and zooming out on mousewheel movement.
* Panning the visualization on dragging.
* Zooming in on double clicking.
* Zooming out on clicking the zoom out button.
* Panning on clicking the arrow buttons.
* Displaying tooltips for GIS objects.
*/
$(document).ready(function() {
// If we are in GIS visualization, initialize it
if ($('.gis_table').length > 0) {
initGISVisualization();
}
$('#choice').live('click', function() {
if ($(this).prop('checked') == false) {
$('#placeholder').show();
$('#openlayersmap').hide();
} else {
$('#placeholder').hide();
$('#openlayersmap').show();
}
});
$('#placeholder').live('mousewheel', function(event, delta) {
if (delta > 0) {
//zoom in
@ -135,13 +207,13 @@ $(document).ready(function() {
var dragX = 0; var dragY = 0;
$('svg').live('dragstart', function(event, dd) {
$placeholder.addClass('placeholderDrag');
$('#placeholder').addClass('placeholderDrag');
dragX = Math.round(dd.offsetX);
dragY = Math.round(dd.offsetY);
});
$('svg').live('mouseup', function(event) {
$placeholder.removeClass('placeholderDrag');
$('#placeholder').removeClass('placeholderDrag');
});
$('svg').live('drag', function(event, dd) {
@ -178,8 +250,8 @@ $(document).ready(function() {
$('#zoom_world').live('click', function(e) {
e.preventDefault();
scale = 1;
x = 0;
y = 0;
x = default_x;
y = default_y;
zoomAndPan();
});
@ -225,7 +297,7 @@ $(document).ready(function() {
*/
$('.polygon, .multipolygon, .point, .multipoint, .linestring, .multilinestring, '
+ '.geometrycollection').live('mousemove', function(event) {
contents = $(this).attr('name');
contents = $.trim($(this).attr('name'));
$("#tooltip").remove();
if (contents != '') {
$('<div id="tooltip">' + contents + '</div>').css({

View File

@ -68,7 +68,7 @@ $(document).ready(function() {
$("#sqlqueryresults").html(response);
$("#sqlqueryresults").trigger('appendAnchor');
$('#tbl_search_form')
// work around for bug #3168569 - Issue on toggling the "Hide search criteria" in chrome.
// workaround for bug #3168569 - Issue on toggling the "Hide search criteria" in chrome.
.slideToggle()
.hide();
$('#togglesearchformlink')
@ -87,4 +87,91 @@ $(document).ready(function() {
});
}) // end $.post()
})
// Following section is related to the 'function based search' for geometry data types.
// Initialy hide all the open_gis_editor spans
$('.open_search_gis_editor').hide();
$('.geom_func').bind('change', function() {
var $geomFuncSelector = $(this);
var binaryFunctions = [
'Contains',
'Crosses',
'Disjoint',
'Equals',
'Intersects',
'Overlaps',
'Touches',
'Within',
'MBRContains',
'MBRDisjoint',
'MBREquals',
'MBRIntersects',
'MBROverlaps',
'MBRTouches',
'MBRWithin',
'ST_Contains',
'ST_Crosses',
'ST_Disjoint',
'ST_Equals',
'ST_Intersects',
'ST_Overlaps',
'ST_Touches',
'ST_Within',
];
var tempArray = [
'Envelope',
'EndPoint',
'StartPoint',
'ExteriorRing',
'Centroid',
'PointOnSurface'
];
var outputGeomFunctions = binaryFunctions.concat(tempArray);
// If the chosen function takes two geomerty objects as parameters
var $operator = $geomFuncSelector.parents('tr').find('td:nth-child(5)').find('select');
if ($.inArray($geomFuncSelector.val(), binaryFunctions) >= 0){
$operator.attr('readonly', true);
} else {
$operator.attr('readonly', false);
}
// if the chosen function's output is a geometry, enable GIS editor
var $editorSpan = $geomFuncSelector.parents('tr').find('.open_search_gis_editor');
if ($.inArray($geomFuncSelector.val(), outputGeomFunctions) >= 0){
$editorSpan.show();
} else {
$editorSpan.hide();
}
});
$('.open_search_gis_editor').live('click', function(event) {
event.preventDefault();
var $span = $(this);
// Current value
var value = $span.parent('td').children("input[type='text']").val();
// Field name
var field = 'Parameter';
// Column type
var geom_func = $span.parents('tr').find('.geom_func').val();
if (geom_func == 'Envelope') {
var type = 'polygon';
} else if (geom_func == 'ExteriorRing') {
var type = 'linestring';
} else {
var type = 'point';
}
// Names of input field and null checkbox
var input_name = $span.parent('td').children("input[type='text']").attr('name');
//Token
var token = $("input[name='token']").val();
openGISEditor(value, field, type, input_name, token);
});
}, 'top.frame_content'); // end $(document).ready()

View File

@ -35,7 +35,7 @@ Array.min = function (array) {
/**
** Checks if a string contains only numeric value
** @param n: String (to be checked)
** @param n: String (to be checked)
**/
function isNumeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
@ -43,7 +43,7 @@ function isNumeric(n) {
/**
** Checks if an object is empty
** @param n: Object (to be checked)
** @param n: Object (to be checked)
**/
function isEmpty(obj) {
var name;
@ -59,15 +59,24 @@ function isEmpty(obj) {
** @param type String Field type(datetime/timestamp/time/date)
**/
function getDate(val,type) {
<<<<<<< HEAD
if(type.toString().search(/datetime/i) != -1 || type.toString().search(/timestamp/i) != -1) {
return Highcharts.dateFormat('%Y-%m-%e %H:%M:%S', val)
}
else if(type.toString().search(/time/i) != -1) {
return Highcharts.dateFormat('%H:%M:%S', val)
}
=======
if (type.toString().search(/datetime/i) != -1 || type.toString().search(/timestamp/i) != -1) {
return Highcharts.dateFormat('%Y-%m-%e %H:%M:%S', val)
}
else if (type.toString().search(/time/i) != -1) {
return Highcharts.dateFormat('%H:%M:%S', val + 19800000)
}
>>>>>>> phpmyadmin/master
else if (type.toString().search(/date/i) != -1) {
return Highcharts.dateFormat('%Y-%m-%e', val)
}
}
}
/**
@ -76,30 +85,30 @@ function getDate(val,type) {
** @param type Sring Field type(datetime/timestamp/time/date)
**/
function getTimeStamp(val,type) {
if(type.toString().search(/datetime/i) != -1 || type.toString().search(/timestamp/i) != -1) {
return getDateFromFormat(val,'yyyy-MM-dd HH:mm:ss', val)
}
else if(type.toString().search(/time/i) != -1) {
return getDateFromFormat('1970-01-01 ' + val,'yyyy-MM-dd HH:mm:ss')
}
if (type.toString().search(/datetime/i) != -1 || type.toString().search(/timestamp/i) != -1) {
return getDateFromFormat(val,'yyyy-MM-dd HH:mm:ss', val)
}
else if (type.toString().search(/time/i) != -1) {
return getDateFromFormat('1970-01-01 ' + val,'yyyy-MM-dd HH:mm:ss')
}
else if (type.toString().search(/date/i) != -1) {
return getDateFromFormat(val,'yyyy-MM-dd')
}
return getDateFromFormat(val,'yyyy-MM-dd')
}
}
/**
** Classifies the field type into numeric,timeseries or text
** @param field: field type (as in database structure)
**/
**/
function getType(field) {
if(field.toString().search(/int/i) != -1 || field.toString().search(/decimal/i) != -1 || field.toString().search(/year/i) != -1)
return 'numeric';
else if(field.toString().search(/time/i) != -1 || field.toString().search(/date/i) != -1)
return 'time';
else
return 'text';
if (field.toString().search(/int/i) != -1 || field.toString().search(/decimal/i) != -1 || field.toString().search(/year/i) != -1)
return 'numeric';
else if (field.toString().search(/time/i) != -1 || field.toString().search(/date/i) != -1)
return 'time';
else
return 'text';
}
/**
/**
** Converts a categorical array into numeric array
** @param array categorical values array
**/
@ -175,7 +184,7 @@ $(document).ready(function() {
cache: 'false'
});
var cursorMode = ($("input[name='mode']:checked").val() == 'edit') ? 'crosshair' : 'pointer';
var cursorMode = ($("input[name='mode']:checked").val() == 'edit') ? 'crosshair' : 'pointer';
var currentChart = null;
var currentData = null;
var xLabel = $('#tableid_0').val();
@ -188,7 +197,7 @@ $(document).ready(function() {
var zoomRatio = 1;
// Get query result
// Get query result
var data = jQuery.parseJSON($('#querydata').html());
/**
@ -212,16 +221,16 @@ $(document).ready(function() {
/**
* Input form validation
**/
**/
$('#inputFormSubmitId').click(function() {
if ($('#tableid_0').get(0).selectedIndex == 0 || $('#tableid_1').get(0).selectedIndex == 0)
PMA_ajaxShowMessage(PMA_messages['strInputNull']);
else if (xLabel == yLabel)
if ($('#tableid_0').get(0).selectedIndex == 0 || $('#tableid_1').get(0).selectedIndex == 0)
PMA_ajaxShowMessage(PMA_messages['strInputNull']);
else if (xLabel == yLabel)
PMA_ajaxShowMessage(PMA_messages['strSameInputs']);
});
/**
** Prepare a div containing a link, otherwise it's incorrectly displayed
** Prepare a div containing a link, otherwise it's incorrectly displayed
** after a couple of clicks
**/
$('<div id="togglesearchformdiv"><a id="togglesearchformlink"></a></div>')
@ -239,177 +248,177 @@ $(document).ready(function() {
} else {
$link.text(PMA_messages['strHideSearchCriteria']);
}
// avoid default click action
return false;
});
/**
// avoid default click action
return false;
});
/**
** Set dialog properties for the data display form
**/
$("#dataDisplay").dialog({
autoOpen: false,
title: 'Data point content',
title: 'Data point content',
modal: false, //false otherwise other dialogues like timepicker may not function properly
height: $('#dataDisplay').height() + 80,
width: $('#dataDisplay').width() + 80
});
/*
* Handle submit of zoom_display_form
* Handle submit of zoom_display_form
*/
$("#submitForm").click(function(event) {
//Prevent default submission of form
event.preventDefault();
//Find changed values by comparing form values with selectedRow Object
var newValues = new Array();//Stores the values changed from original
//Find changed values by comparing form values with selectedRow Object
var newValues = new Array();//Stores the values changed from original
var it = 4;
var xChange = false;
var yChange = false;
for (key in selectedRow) {
if (key != 'where_clause'){
var oldVal = selectedRow[key];
var newVal = ($('#fields_null_id_' + it).attr('checked')) ? null : $('#fieldID_' + it).val();
if (oldVal != newVal){
selectedRow[key] = newVal;
newValues[key] = newVal;
if(key == xLabel) {
xChange = true;
data[currentData][xLabel] = newVal;
}
else if(key == yLabel) {
yChange = true;
data[currentData][yLabel] = newVal;
}
}
}
it++
}//End data update
//Update the chart series and replot
for (key in selectedRow) {
if (key != 'where_clause'){
var oldVal = selectedRow[key];
var newVal = ($('#fields_null_id_' + it).attr('checked')) ? null : $('#fieldID_' + it).val();
if (oldVal != newVal){
selectedRow[key] = newVal;
newValues[key] = newVal;
if (key == xLabel) {
xChange = true;
data[currentData][xLabel] = newVal;
}
else if (key == yLabel) {
yChange = true;
data[currentData][yLabel] = newVal;
}
}
}
it++
}//End data update
//Update the chart series and replot
if (xChange || yChange) {
var newSeries = new Array();
newSeries[0] = new Object();
var newSeries = new Array();
newSeries[0] = new Object();
newSeries[0].marker = {
symbol: 'circle'
};
//Logic similar to plot generation, replot only if xAxis changes or yAxis changes. Code includes a lot of checks so as to replot only when necessary
if(xChange) {
xCord[currentData] = selectedRow[xLabel];
if(xType == 'numeric') {
currentChart.series[0].data[currentData].update({ x : selectedRow[xLabel] });
currentChart.xAxis[0].setExtremes(Array.min(xCord) - 6,Array.max(xCord) + 6);
//Logic similar to plot generation, replot only if xAxis changes or yAxis changes. Code includes a lot of checks so as to replot only when necessary
if (xChange) {
xCord[currentData] = selectedRow[xLabel];
if (xType == 'numeric') {
currentChart.series[0].data[currentData].update({ x : selectedRow[xLabel] });
currentChart.xAxis[0].setExtremes(Array.min(xCord) - 6,Array.max(xCord) + 6);
}
else if(xType == 'time') {
currentChart.series[0].data[currentData].update({ x : getTimeStamp(selectedRow[xLabel],$('#types_0').val())});
}
else {
var tempX = getCord(xCord);
var tempY = getCord(yCord);
var i = 0;
newSeries[0].data = new Array();
xCord = tempX[2];
yCord = tempY[2];
else if (xType == 'time') {
currentChart.series[0].data[currentData].update({ x : getTimeStamp(selectedRow[xLabel],$('#types_0').val())});
}
else {
var tempX = getCord(xCord);
var tempY = getCord(yCord);
var i = 0;
newSeries[0].data = new Array();
xCord = tempX[2];
yCord = tempY[2];
$.each(data,function(key,value) {
if(yType != 'text')
newSeries[0].data.push({ name: value[dataLabel], x: tempX[0][i], y: value[yLabel], marker: {fillColor: colorCodes[i % 8]} , id: i } );
else
$.each(data,function(key,value) {
if (yType != 'text')
newSeries[0].data.push({ name: value[dataLabel], x: tempX[0][i], y: value[yLabel], marker: {fillColor: colorCodes[i % 8]} , id: i } );
else
newSeries[0].data.push({ name: value[dataLabel], x: tempX[0][i], y: tempY[0][i], marker: {fillColor: colorCodes[i % 8]} , id: i } );
i++;
i++;
});
currentSettings.xAxis.labels = { formatter : function() {
if(tempX[1][this.value] && tempX[1][this.value].length > 10)
return tempX[1][this.value].substring(0,10)
else
return tempX[1][this.value];
currentSettings.xAxis.labels = { formatter : function() {
if (tempX[1][this.value] && tempX[1][this.value].length > 10)
return tempX[1][this.value].substring(0,10)
else
return tempX[1][this.value];
}
}
currentSettings.series = newSeries;
currentSettings.series = newSeries;
currentChart = PMA_createChart(currentSettings);
}
}
if(yChange) {
yCord[currentData] = selectedRow[yLabel];
if(yType == 'numeric') {
currentChart.series[0].data[currentData].update({ y : selectedRow[yLabel] });
currentChart.yAxis[0].setExtremes(Array.min(yCord) - 6,Array.max(yCord) + 6);
}
else if(yType =='time') {
currentChart.series[0].data[currentData].update({ y : getTimeStamp(selectedRow[yLabel],$('#types_1').val())});
}
else {
var tempX = getCord(xCord);
var tempY = getCord(yCord);
var i = 0;
newSeries[0].data = new Array();
xCord = tempX[2];
yCord = tempY[2];
$.each(data,function(key,value) {
if(xType != 'text' )
}
if (yChange) {
yCord[currentData] = selectedRow[yLabel];
if (yType == 'numeric') {
currentChart.series[0].data[currentData].update({ y : selectedRow[yLabel] });
currentChart.yAxis[0].setExtremes(Array.min(yCord) - 6,Array.max(yCord) + 6);
}
else if (yType =='time') {
currentChart.series[0].data[currentData].update({ y : getTimeStamp(selectedRow[yLabel],$('#types_1').val())});
}
else {
var tempX = getCord(xCord);
var tempY = getCord(yCord);
var i = 0;
newSeries[0].data = new Array();
xCord = tempX[2];
yCord = tempY[2];
$.each(data,function(key,value) {
if (xType != 'text' )
newSeries[0].data.push({ name: value[dataLabel], x: value[xLabel], y: tempY[0][i], marker: {fillColor: colorCodes[i % 8]} , id: i } );
else
else
newSeries[0].data.push({ name: value[dataLabel], x: tempX[0][i], y: tempY[0][i], marker: {fillColor: colorCodes[i % 8]} , id: i } );
i++;
i++;
});
currentSettings.yAxis.labels = { formatter : function() {
if(tempY[1][this.value] && tempY[1][this.value].length > 10)
return tempY[1][this.value].substring(0,10)
else
return tempY[1][this.value];
currentSettings.yAxis.labels = { formatter : function() {
if (tempY[1][this.value] && tempY[1][this.value].length > 10)
return tempY[1][this.value].substring(0,10)
else
return tempY[1][this.value];
}
}
currentSettings.series = newSeries;
currentChart = PMA_createChart(currentSettings);
}
}
currentChart.series[0].data[currentData].select();
currentSettings.series = newSeries;
currentChart = PMA_createChart(currentSettings);
}
}
currentChart.series[0].data[currentData].select();
}
//End plot update
//End plot update
//Generate SQL query for update
if (!isEmpty(newValues)) {
//Generate SQL query for update
if (!isEmpty(newValues)) {
var sql_query = 'UPDATE `' + window.parent.table + '` SET ';
for (key in newValues) {
if(key != 'where_clause') {
sql_query += '`' + key + '`=' ;
var value = newValues[key];
if(!isNumeric(value) && value != null)
sql_query += '\'' + value + '\' ,';
else
sql_query += value + ' ,';
}
}
sql_query = sql_query.substring(0, sql_query.length - 1);
sql_query += ' WHERE ' + PMA_urldecode(data[currentData]['where_clause']);
//Post SQL query to sql.php
$.post('sql.php', {
for (key in newValues) {
if (key != 'where_clause') {
sql_query += '`' + key + '`=' ;
var value = newValues[key];
if (!isNumeric(value) && value != null)
sql_query += '\'' + value + '\' ,';
else
sql_query += value + ' ,';
}
}
sql_query = sql_query.substring(0, sql_query.length - 1);
sql_query += ' WHERE ' + PMA_urldecode(data[currentData]['where_clause']);
//Post SQL query to sql.php
$.post('sql.php', {
'token' : window.parent.token,
'db' : window.parent.db,
'ajax_request' : true,
'sql_query' : sql_query,
'inline_edit' : false
}, function(data) {
if(data.success == true) {
$('#sqlqueryresults').html(data.sql_query);
$("#sqlqueryresults").trigger('appendAnchor');
}
else
PMA_ajaxShowMessage(data.error);
})//End $.post
}//End database update
$("#dataDisplay").dialog("close");
});//End submit handler
'inline_edit' : false
}, function(data) {
if (data.success == true) {
$('#sqlqueryresults').html(data.sql_query);
$("#sqlqueryresults").trigger('appendAnchor');
}
else
PMA_ajaxShowMessage(data.error);
})//End $.post
}//End database update
$("#dataDisplay").dialog("close");
});//End submit handler
/*
* Generate plot using Highcharts
*/
*/
if (data != null) {
$('#zoom_search_form')
@ -417,8 +426,9 @@ $(document).ready(function() {
.hide();
$('#togglesearchformlink')
.text(PMA_messages['strShowSearchCriteria'])
$('#togglesearchformdiv').show();
$('#togglesearchformdiv').show();
var selectedRow;
<<<<<<< HEAD
var colorCodes = ['#FF0000','#00FFFF','#0000FF','#0000A0','#FF0080','#800080','#FFFF00','#00FF00','#FF00FF'];
var series = new Array();
var xCord = new Array();
@ -429,10 +439,22 @@ $(document).ready(function() {
var xMin; // xAxis extreme min
var yMax; // yAxis extreme max
var yMin; // yAxis extreme min
=======
var columnNames = new Array();
var colorCodes = ['#FF0000','#00FFFF','#0000FF','#0000A0','#FF0080','#800080','#FFFF00','#00FF00','#FF00FF'];
var series = new Array();
var xCord = new Array();
var yCord = new Array();
var xCat = new Array();
var yCat = new Array();
var tempX, tempY;
var it = 0;
>>>>>>> phpmyadmin/master
// Set the basic plot settings
var currentSettings = {
chart: {
<<<<<<< HEAD
renderTo: 'querychart',
type: 'scatter',
//zoomType: 'xy',
@ -441,64 +463,74 @@ $(document).ready(function() {
},
credits: {
enabled: false
=======
renderTo: 'querychart',
type: 'scatter',
zoomType: 'xy',
width:$('#resizer').width() -3,
height:$('#resizer').height()-20
>>>>>>> phpmyadmin/master
},
exporting: { enabled: false },
credits: {
enabled: false
},
exporting: { enabled: false },
label: { text: $('#dataLabel').val() },
plotOptions: {
series: {
allowPointSelect: true,
plotOptions: {
series: {
allowPointSelect: true,
cursor: 'pointer',
showInLegend: false,
showInLegend: false,
dataLabels: {
enabled: false,
enabled: false
},
point: {
point: {
events: {
click: function() {
var id = this.id;
var fid = 4;
currentData = id;
// Make AJAX request to tbl_zoom_select.php for getting the complete row info
var post_params = {
var id = this.id;
var fid = 4;
currentData = id;
// Make AJAX request to tbl_zoom_select.php for getting the complete row info
var post_params = {
'ajax_request' : true,
'get_data_row' : true,
'db' : window.parent.db,
'table' : window.parent.table,
'where_clause' : data[id]['where_clause'],
'token' : window.parent.token,
'token' : window.parent.token
}
$.post('tbl_zoom_select.php', post_params, function(data) {
// Row is contained in data.row_info, now fill the displayResultForm with row values
for ( key in data.row_info) {
if (data.row_info[key] == null)
$('#fields_null_id_' + fid).attr('checked', true);
else
$('#fieldID_' + fid).val(data.row_info[key]);
fid++;
}
selectedRow = new Object();
selectedRow = data.row_info;
// Row is contained in data.row_info, now fill the displayResultForm with row values
for ( key in data.row_info) {
if (data.row_info[key] == null)
$('#fields_null_id_' + fid).attr('checked', true);
else
$('#fieldID_' + fid).val(data.row_info[key]);
fid++;
}
selectedRow = new Object();
selectedRow = data.row_info;
});
$("#dataDisplay").dialog("open");
},
$("#dataDisplay").dialog("open");
}
}
}
}
},
tooltip: {
formatter: function() {
return this.point.name;
}
},
}
}
},
tooltip: {
formatter: function() {
return this.point.name;
}
},
title: { text: 'Query Results' },
xAxis: {
title: { text: $('#tableid_0').val() },
xAxis: {
title: { text: $('#tableid_0').val() }
},
yAxis: {
min: null,
title: { text: $('#tableid_1').val() },
},
min: null,
title: { text: $('#tableid_1').val() }
}
}
$('#resizer').resizable({
@ -510,144 +542,144 @@ $(document).ready(function() {
);
}
});
// Classify types as either numeric,time,text
xType = getType(xType);
yType = getType(yType);
//Set the axis type based on the field
currentSettings.xAxis.type = (xType == 'time') ? 'datetime' : 'linear';
currentSettings.yAxis.type = (yType == 'time') ? 'datetime' : 'linear';
// Classify types as either numeric,time,text
xType = getType(xType);
yType = getType(yType);
//Set the axis type based on the field
currentSettings.xAxis.type = (xType == 'time') ? 'datetime' : 'linear';
currentSettings.yAxis.type = (yType == 'time') ? 'datetime' : 'linear';
// Formulate series data for plot
series[0] = new Object();
series[0].data = new Array();
series[0].marker = {
series[0].marker = {
symbol: 'circle'
};
if (xType != 'text' && yType != 'text') {
$.each(data,function(key,value) {
var xVal = (xType == 'numeric') ? value[xLabel] : getTimeStamp(value[xLabel],$('#types_0').val());
var yVal = (yType == 'numeric') ? value[yLabel] : getTimeStamp(value[yLabel],$('#types_1').val());
if (xType != 'text' && yType != 'text') {
$.each(data,function(key,value) {
var xVal = (xType == 'numeric') ? value[xLabel] : getTimeStamp(value[xLabel],$('#types_0').val());
var yVal = (yType == 'numeric') ? value[yLabel] : getTimeStamp(value[yLabel],$('#types_1').val());
series[0].data.push({ name: value[dataLabel], x: xVal, y: yVal, marker: {fillColor: colorCodes[it % 8]} , id: it } );
xCord.push(value[xLabel]);
yCord.push(value[yLabel]);
it++;
xCord.push(value[xLabel]);
yCord.push(value[yLabel]);
it++;
});
if(xType == 'numeric') {
currentSettings.xAxis.max = Array.max(xCord) + 6
currentSettings.xAxis.min = Array.min(xCord) - 6
}
else {
currentSettings.xAxis.labels = { formatter : function() {
return getDate(this.value, $('#types_0').val());
}}
if (xType == 'numeric') {
currentSettings.xAxis.max = Array.max(xCord) + 6
currentSettings.xAxis.min = Array.min(xCord) - 6
}
if(yType == 'numeric') {
currentSettings.yAxis.max = Array.max(yCord) + 6
currentSettings.yAxis.min = Array.min(yCord) - 6
}
else {
currentSettings.yAxis.labels = { formatter : function() {
return getDate(this.value, $('#types_1').val());
}}
else {
currentSettings.xAxis.labels = { formatter : function() {
return getDate(this.value, $('#types_0').val());
}}
}
if (yType == 'numeric') {
currentSettings.yAxis.max = Array.max(yCord) + 6
currentSettings.yAxis.min = Array.min(yCord) - 6
}
else {
currentSettings.yAxis.labels = { formatter : function() {
return getDate(this.value, $('#types_1').val());
}}
}
}
else if (xType =='text' && yType !='text') {
$.each(data,function(key,value) {
xCord.push(value[xLabel]);
yCord.push(value[yLabel]);
});
tempX = getCord(xCord);
$.each(data,function(key,value) {
var yVal = (yType == 'numeric') ? value[yLabel] : getTimeStamp(value[yLabel],$('#types_1').val());
else if (xType =='text' && yType !='text') {
$.each(data,function(key,value) {
xCord.push(value[xLabel]);
yCord.push(value[yLabel]);
});
tempX = getCord(xCord);
$.each(data,function(key,value) {
var yVal = (yType == 'numeric') ? value[yLabel] : getTimeStamp(value[yLabel],$('#types_1').val());
series[0].data.push({ name: value[dataLabel], x: tempX[0][it], y: yVal, marker: {fillColor: colorCodes[it % 8]} , id: it } );
it++;
it++;
});
currentSettings.xAxis.labels = { formatter : function() {
if(tempX[1][this.value] && tempX[1][this.value].length > 10)
return tempX[1][this.value].substring(0,10)
else
return tempX[1][this.value];
}
currentSettings.xAxis.labels = { formatter : function() {
if (tempX[1][this.value] && tempX[1][this.value].length > 10)
return tempX[1][this.value].substring(0,10)
else
return tempX[1][this.value];
}
}
if(yType == 'numeric') {
currentSettings.yAxis.max = Array.max(yCord) + 6
currentSettings.yAxis.min = Array.min(yCord) - 6
}
else {
currentSettings.yAxis.labels = { formatter : function() {
return getDate(this.value, $('#types_1').val());
}}
if (yType == 'numeric') {
currentSettings.yAxis.max = Array.max(yCord) + 6
currentSettings.yAxis.min = Array.min(yCord) - 6
}
xCord = tempX[2];
}
else if (xType !='text' && yType =='text') {
$.each(data,function(key,value) {
xCord.push(value[xLabel]);
yCord.push(value[yLabel]);
});
tempY = getCord(yCord);
$.each(data,function(key,value) {
var xVal = (xType == 'numeric') ? value[xLabel] : getTimeStamp(value[xLabel],$('#types_0').val());
else {
currentSettings.yAxis.labels = { formatter : function() {
return getDate(this.value, $('#types_1').val());
}}
}
xCord = tempX[2];
}
else if (xType !='text' && yType =='text') {
$.each(data,function(key,value) {
xCord.push(value[xLabel]);
yCord.push(value[yLabel]);
});
tempY = getCord(yCord);
$.each(data,function(key,value) {
var xVal = (xType == 'numeric') ? value[xLabel] : getTimeStamp(value[xLabel],$('#types_0').val());
series[0].data.push({ name: value[dataLabel], y: tempY[0][it], x: xVal, marker: {fillColor: colorCodes[it % 8]} , id: it } );
it++;
it++;
});
if(xType == 'numeric') {
currentSettings.xAxis.max = Array.max(xCord) + 6
currentSettings.xAxis.min = Array.min(xCord) - 6
}
else {
currentSettings.xAxis.labels = { formatter : function() {
return getDate(this.value, $('#types_0').val());
}}
if (xType == 'numeric') {
currentSettings.xAxis.max = Array.max(xCord) + 6
currentSettings.xAxis.min = Array.min(xCord) - 6
}
currentSettings.yAxis.labels = { formatter : function() {
if(tempY[1][this.value] && tempY[1][this.value].length > 10)
return tempY[1][this.value].substring(0,10)
else
return tempY[1][this.value];
}
else {
currentSettings.xAxis.labels = { formatter : function() {
return getDate(this.value, $('#types_0').val());
}}
}
yCord = tempY[2];
}
else if (xType =='text' && yType =='text') {
$.each(data,function(key,value) {
xCord.push(value[xLabel]);
yCord.push(value[yLabel]);
});
tempX = getCord(xCord);
tempY = getCord(yCord);
$.each(data,function(key,value) {
currentSettings.yAxis.labels = { formatter : function() {
if (tempY[1][this.value] && tempY[1][this.value].length > 10)
return tempY[1][this.value].substring(0,10)
else
return tempY[1][this.value];
}
}
yCord = tempY[2];
}
else if (xType =='text' && yType =='text') {
$.each(data,function(key,value) {
xCord.push(value[xLabel]);
yCord.push(value[yLabel]);
});
tempX = getCord(xCord);
tempY = getCord(yCord);
$.each(data,function(key,value) {
series[0].data.push({ name: value[dataLabel], x: tempX[0][it], y: tempY[0][it], marker: {fillColor: colorCodes[it % 8]} , id: it } );
it++;
it++;
});
currentSettings.xAxis.labels = { formatter : function() {
if(tempX[1][this.value] && tempX[1][this.value].length > 10)
return tempX[1][this.value].substring(0,10)
else
return tempX[1][this.value];
}
}
currentSettings.yAxis.labels = { formatter : function() {
if(tempY[1][this.value] && tempY[1][this.value].length > 10)
return tempY[1][this.value].substring(0,10)
else
return tempY[1][this.value];
}
}
xCord = tempX[2];
yCord = tempY[2];
currentSettings.xAxis.labels = { formatter : function() {
if (tempX[1][this.value] && tempX[1][this.value].length > 10) {
return tempX[1][this.value].substring(0,10)
} else {
return tempX[1][this.value];
}
}};
currentSettings.yAxis.labels = { formatter : function() {
if (tempY[1][this.value] && tempY[1][this.value].length > 10) {
return tempY[1][this.value].substring(0,10);
} else {
return tempY[1][this.value];
}
}};
xCord = tempX[2];
yCord = tempY[2];
}
}
currentSettings.series = series;
currentSettings.series = series;
currentChart = PMA_createChart(currentSettings);
xMin = currentChart.xAxis[0].getExtremes().min;
xMax = currentChart.xAxis[0].getExtremes().max;
@ -676,6 +708,5 @@ $(document).ready(function() {
}
});
scrollToChart();
}
});

View File

@ -69,9 +69,11 @@ class Advisor
$this->variables['value'] = $value;
try {
if($this->ruleExprEvaluate($rule['test']))
if ($this->ruleExprEvaluate($rule['test'])) {
$this->addRule('fired', $rule);
else $this->addRule('notfired', $rule);
} else {
$this->addRule('notfired', $rule);
}
} catch(Exception $e) {
$this->runResult['errors'][] = 'Failed running test for rule \''.$rule['name'].'\'. PHP threw following error: '.$e->getMessage();
}
@ -81,14 +83,47 @@ class Advisor
return true;
}
/**
* Escapes percent string to be used in format string.
*
* @param string $str
* @return string
*/
function escapePercent($str)
{
return preg_replace('/%( |,|\.|$)/','%%\1', $str);
}
/**
* Wrapper function for translating.
*
* @param string $str
* @param mixed $param
* @return string
*/
function translate($str, $param = null)
{
if (is_null($param)) {
return sprintf(_gettext(Advisor::escapePercent($str)));
} else {
$printf = 'sprintf("' . _gettext(Advisor::escapePercent($str)) . '",';
return $this->ruleExprEvaluate(
$printf . $param . ')',
strlen($printf)
);
}
}
/**
* Splits justification to text and formula.
*
* @param string $rule
* @return array
*/
function splitJustification($rule)
{
$jst = preg_split('/\s*\|\s*/', $rule['justification'], 2);
if (count($jst) > 1) {
$jst[0] = preg_replace('/%( |,|\.|$)/','%%\1',$jst[0]);
return array($jst[0], $jst[1]);
}
return array($rule['justification']);
@ -100,33 +135,40 @@ class Advisor
switch($type) {
case 'notfired':
case 'fired':
$jst = Advisor::splitJustification($rule);
if (count($jst) > 1) {
try {
/* Translate */
$jst[0] = _gettext($jst[0]);
$str = $this->ruleExprEvaluate(
'sprintf("'.$jst[0].'",'.$jst[1].')',
strlen('sprintf("'.$jst[0].'"')
);
} catch (Exception $e) {
$this->runResult['errors'][] = 'Failed formattingstring for rule \''.$rule['name'].'\'. PHP threw following error: '.$e->getMessage();
return;
}
$rule['justification'] = $str;
} else {
$rule['justification'] = _gettext($rule['justification']);
$jst = Advisor::splitJustification($rule);
if (count($jst) > 1) {
try {
/* Translate */
$str = $this->translate($jst[0], $jst[1]);
} catch (Exception $e) {
$this->runResult['errors'][] = sprintf(
__('Failed formatting string for rule \'%s\'. PHP threw following error: %s'),
$rule['name'],
$e->getMessage()
);
return;
}
$rule['name'] = _gettext($rule['name']);
$rule['issue'] = _gettext($rule['issue']);
$rule['recommendation'] = preg_replace(
'/\{([a-z_0-9]+)\}/Ui',
'<a href="server_variables.php' . PMA_generate_common_url() . '#filter=\1">\1</a>',
_gettext($rule['recommendation']));
$rule['justification'] = $str;
} else {
$rule['justification'] = $this->translate($rule['justification']);
}
$rule['name'] = $this->translate($rule['name']);
$rule['issue'] = $this->translate($rule['issue']);
break;
// Replaces {server_variable} with 'server_variable' linking to server_variables.php
$rule['recommendation'] = preg_replace(
'/\{([a-z_0-9]+)\}/Ui',
'<a href="server_variables.php?' . PMA_generate_common_url() . '#filter=\1">\1</a>',
$this->translate($rule['recommendation']));
// Replaces external Links with PMA_linkURL() generated links
$rule['recommendation'] = preg_replace(
'#href=("|\')(https?://[^\1]+)\1#ie',
'\'href="\' . PMA_linkURL("\2") . \'"\'',
$rule['recommendation']
);
break;
}
$this->runResult[$type][] = $rule;

View File

@ -334,6 +334,7 @@ class PMA_Config
* should be called on object creation
*
* @param string $source config file
* @return bool
*/
function load($source = null)
{
@ -698,6 +699,8 @@ class PMA_Config
* $cfg['PmaAbsoluteUri'] is a required directive else cookies won't be
* set properly and, depending on browsers, inserting or updating a
* record might fail
*
* @return bool
*/
function checkPmaAbsoluteUri()
{
@ -937,7 +940,7 @@ class PMA_Config
}
/**
* @static
* @return bool
*/
public function isHttps()
{
@ -964,6 +967,8 @@ class PMA_Config
*
* Please note that this just detects what we see, so
* it completely ignores things like reverse proxies.
*
* @return bool
*/
function detectHttps()
{
@ -1012,7 +1017,7 @@ class PMA_Config
}
/**
* @static
* @return string
*/
public function getCookiePath()
{

View File

@ -127,6 +127,7 @@ class PMA_Error_Handler
*
* @todo finish!
* @param PMA_Error $error
* @return bool
*/
protected function _logError($error)
{

View File

@ -189,6 +189,7 @@ class PMA_File
/**
* @access public
* @return bool
*/
function isUploaded()
{
@ -591,7 +592,7 @@ class PMA_File
}
/**
*
* @return bool
*/
function open()
{
@ -688,6 +689,8 @@ class PMA_File
* http://bugs.php.net/bug.php?id=29532
* bzip reads a maximum of 8192 bytes on windows systems
* @todo this function is unused
* @param int $max_size
* @return bool|string
*/
function getNextChunk($max_size = null)
{

View File

@ -90,6 +90,7 @@ require_once './libraries/List.class.php';
*
* @todo we could also search mysql tables if all fail?
* @param string $like_db_name usally a db_name containing wildcards
* @return array
*/
protected function _retrieve($like_db_name = null)
{

View File

@ -44,6 +44,9 @@ class PMA
* magic access to protected/inaccessible members/properties
*
* @see http://php.net/language.oop5.overloading
*
* @param string $param
* @return mixed
*/
public function __get($param)
{
@ -66,6 +69,9 @@ class PMA
* magic access to protected/inaccessible members/properties
*
* @see http://php.net/language.oop5.overloading
*
* @param string $param
* @param mixed $value
*/
public function __set($param, $value)
{

View File

@ -910,7 +910,7 @@ class PMA_Table
if ($GLOBALS['cfgRelation']['commwork']) {
// Get all comments and MIME-Types for current table
$comments_copy_query = 'SELECT
column_name, ' . PMA_backquote('comment') . ($GLOBALS['cfgRelation']['mimework'] ? ', mimetype, transformation, transformation_options' : '') . '
column_name, comment' . ($GLOBALS['cfgRelation']['mimework'] ? ', mimetype, transformation, transformation_options' : '') . '
FROM ' . PMA_backquote($GLOBALS['cfgRelation']['db']) . '.' . PMA_backquote($GLOBALS['cfgRelation']['column_info']) . '
WHERE
db_name = \'' . PMA_sqlAddSlashes($source_db) . '\' AND
@ -920,7 +920,7 @@ class PMA_Table
// Write every comment as new copied entry. [MIME]
while ($comments_copy_row = PMA_DBI_fetch_assoc($comments_copy_rs)) {
$new_comment_query = 'REPLACE INTO ' . PMA_backquote($GLOBALS['cfgRelation']['db']) . '.' . PMA_backquote($GLOBALS['cfgRelation']['column_info'])
. ' (db_name, table_name, column_name, ' . PMA_backquote('comment') . ($GLOBALS['cfgRelation']['mimework'] ? ', mimetype, transformation, transformation_options' : '') . ') '
. ' (db_name, table_name, column_name, comment' . ($GLOBALS['cfgRelation']['mimework'] ? ', mimetype, transformation, transformation_options' : '') . ') '
. ' VALUES('
. '\'' . PMA_sqlAddSlashes($target_db) . '\','
. '\'' . PMA_sqlAddSlashes($target_table) . '\','
@ -1185,7 +1185,7 @@ class PMA_Table
*
* returns an array with all columns make use of an index, in fact only
* first columns in an index
*
*
* e.g. index(col1, col2) would only return col1
*
* @param bool $backquoted whether to quote name with backticks ``
@ -1290,7 +1290,10 @@ class PMA_Table
$success = PMA_DBI_try_query($sql_query, $GLOBALS['controllink']);
if (!$success) {
$message = PMA_Message::error(__('Failed to cleanup table UI preferences (see cfg["Server"]["MaxTableUiprefs"] documentation)'));
$message = PMA_Message::error(sprintf(
__('Failed to cleanup table UI preferences (see $cfg[\'Servers\'][$i][\'MaxTableUiprefs\'] %s)'),
PMA_showDocu('cfg_Servers_MaxTableUiprefs')
));
$message->addMessage('<br /><br />');
$message->addMessage(PMA_Message::rawError(PMA_DBI_getError($GLOBALS['controllink'])));
print_r($message);

View File

@ -130,6 +130,7 @@ class PMA_Theme
* checks image path for existance - if not found use img from original theme
*
* @access public
* @return bool
*/
function checkImgPath()
{
@ -282,6 +283,7 @@ class PMA_Theme
*
* @access public
* @param string $type left, right or print
* @return bool
*/
function loadCss(&$type)
{

View File

@ -38,7 +38,7 @@ class PMA_Theme_Manager
var $active_theme = '';
/**
* @var object PMA_Theme active theme
* @var PMA_Theme PMA_Theme active theme
*/
var $theme = null;
@ -193,6 +193,7 @@ class PMA_Theme_Manager
/**
* save theme in cookie
*
* @return bool true
*/
function setThemeCookie()
{
@ -224,6 +225,8 @@ class PMA_Theme_Manager
/**
* read all themes
*
* @return bool true
*/
function loadThemes()
{
@ -232,9 +235,11 @@ class PMA_Theme_Manager
if ($handleThemes = opendir($this->getThemesPath())) {
// check for themes directory
while (false !== ($PMA_Theme = readdir($handleThemes))) {
// Skip non dirs, . and ..
if ($PMA_Theme == '.' || $PMA_Theme == '..' || ! is_dir($this->getThemesPath() . '/' . $PMA_Theme)) {
continue;
}
if (array_key_exists($PMA_Theme, $this->themes)) {
// this does nothing!
//$this->themes[$PMA_Theme] = $this->themes[$PMA_Theme];
continue;
}
$new_theme = PMA_Theme::load($this->getThemesPath() . '/' . $PMA_Theme);
@ -259,6 +264,7 @@ class PMA_Theme_Manager
* checks if given theme name is a known theme
*
* @param string $theme name fo theme to check for
* @return bool
*/
function checkTheme($theme)
{
@ -273,6 +279,7 @@ class PMA_Theme_Manager
* returns HTML selectbox, with or without form enclosed
*
* @param boolean $form whether enclosed by from tags or not
* @return string
*/
function getHtmlSelectBox($form = true)
{
@ -318,8 +325,8 @@ class PMA_Theme_Manager
/**
* load layout file if exists
*/
if (@file_exists($GLOBALS['pmaThemePath'] . 'layout.inc.php')) {
include $GLOBALS['pmaThemePath'] . 'layout.inc.php';
if (file_exists($this->theme->getLayoutFile())) {
include $this->theme->getLayoutFile();
}
@ -351,6 +358,9 @@ class PMA_Theme_Manager
/**
* prints css data
*
* @param string $type
* @return bool
*/
function printCss($type)
{

View File

@ -130,39 +130,6 @@ class PMA_Tracker
}
}
/**
* Returns a simple DROP TABLE statement.
*
* @param string $tablename
* @return string
*/
static public function getStatementDropTable($tablename)
{
return 'DROP TABLE IF EXISTS ' . $tablename;
}
/**
* Returns a simple DROP VIEW statement.
*
* @param string $viewname
* @return string
*/
static public function getStatementDropView($viewname)
{
return 'DROP VIEW IF EXISTS ' . $viewname;
}
/**
* Returns a simple DROP DATABASE statement.
*
* @param string $dbname
* @return string
*/
static public function getStatementDropDatabase($dbname)
{
return 'DROP DATABASE IF EXISTS ' . $dbname;
}
/**
* Parses the name of a table from a SQL statement substring.
*
@ -219,8 +186,8 @@ class PMA_Tracker
$sql_query =
" SELECT tracking_active FROM " . self::$pma_table .
" WHERE " . PMA_backquote('db_name') . " = '" . PMA_sqlAddSlashes($dbname) . "' " .
" AND " . PMA_backquote('table_name') . " = '" . PMA_sqlAddSlashes($tablename) . "' " .
" WHERE db_name = '" . PMA_sqlAddSlashes($dbname) . "' " .
" AND table_name = '" . PMA_sqlAddSlashes($tablename) . "' " .
" ORDER BY version DESC";
$row = PMA_DBI_fetch_array(PMA_query_as_controluser($sql_query));
@ -254,7 +221,7 @@ class PMA_Tracker
* @param string $tablename name of table
* @param string $version version
* @param string $tracking_set set of tracking statements
* @param string $is_view if table is a view
* @param bool $is_view if table is a view
*
* @return int result of version insertion
*/
@ -273,13 +240,13 @@ class PMA_Tracker
$date = date('Y-m-d H:i:s');
// Get data definition snapshot of table
$sql_query = '
SHOW FULL COLUMNS FROM ' . PMA_backquote($dbname) . '.' . PMA_backquote($tablename);
$sql_result = PMA_DBI_query($sql_query);
while ($row = PMA_DBI_fetch_array($sql_result)) {
$columns[] = $row;
$columns = PMA_DBI_get_columns($dbname, $tablename, true);
// int indices to reduce size
$columns = array_values($columns);
// remove Privileges to reduce size
for ($i = 0; $i < count($columns); $i++) {
unset($columns[$i]['Privileges']);
}
$sql_query = '
@ -289,7 +256,7 @@ class PMA_Tracker
$indexes = array();
while($row = PMA_DBI_fetch_array($sql_result)) {
while($row = PMA_DBI_fetch_assoc($sql_result)) {
$indexes[] = $row;
}
@ -303,13 +270,13 @@ class PMA_Tracker
if (self::$add_drop_table == true && $is_view == false) {
$create_sql .= self::getLogComment() .
self::getStatementDropTable(PMA_backquote($tablename)) . ";\n";
'DROP TABLE IF EXISTS ' . PMA_backquote($tablename) . ";\n";
}
if (self::$add_drop_view == true && $is_view == true) {
$create_sql .= self::getLogComment() .
self::getStatementDropView(PMA_backquote($tablename)) . ";\n";
'DROP VIEW IF EXISTS ' . PMA_backquote($tablename) . ";\n";
}
$create_sql .= self::getLogComment() .
@ -387,8 +354,6 @@ class PMA_Tracker
*/
static public function createDatabaseVersion($dbname, $version, $query, $tracking_set = 'CREATE DATABASE,ALTER DATABASE,DROP DATABASE')
{
global $sql_backquotes;
$date = date('Y-m-d H:i:s');
if ($tracking_set == '') {
@ -401,7 +366,7 @@ class PMA_Tracker
if (self::$add_drop_database == true) {
$create_sql .= self::getLogComment() .
self::getStatementDropDatabase(PMA_backquote($dbname)) . ";\n";
'DROP DATABASE IF EXISTS ' . PMA_backquote($dbname) . ";\n";
}
$create_sql .= self::getLogComment() . $query;
@ -469,11 +434,11 @@ class PMA_Tracker
*
* @static
*
* @param string $dbname name of database
* @param string $tablename name of table
* @param string $version version
* @param string $type type of data(DDL || DML)
* @param string || array $new_data the new tracking data
* @param string $dbname name of database
* @param string $tablename name of table
* @param string $version version
* @param string $type type of data(DDL || DML)
* @param string|array $new_data the new tracking data
*
* @return bool result of change
*/
@ -566,13 +531,9 @@ class PMA_Tracker
$sql_query .= " AND FIND_IN_SET('" . $statement . "',tracking) > 0" ;
}
$row = PMA_DBI_fetch_array(PMA_query_as_controluser($sql_query));
if (isset($row[0])) {
$version = $row[0];
}
if (! isset($version)) {
$version = -1;
}
return $version;
return isset($row[0])
? $row[0]
: -1;
}
@ -598,9 +559,9 @@ class PMA_Tracker
$sql_query .= " AND `table_name` = '" . PMA_sqlAddSlashes($tablename) ."' ";
}
$sql_query .= " AND `version` = '" . PMA_sqlAddSlashes($version) ."' ".
" ORDER BY `version` DESC ";
" ORDER BY `version` DESC LIMIT 1";
$mixed = PMA_DBI_fetch_array(PMA_query_as_controluser($sql_query));
$mixed = PMA_DBI_fetch_assoc(PMA_query_as_controluser($sql_query));
// Parse log
$log_schema_entries = explode('# log ', $mixed['schema_sql']);
@ -890,7 +851,6 @@ class PMA_Tracker
/**
* Analyzes a given SQL statement and saves tracking data.
*
*
* @static
* @param string $query a SQL query
*/
@ -898,7 +858,7 @@ class PMA_Tracker
{
// If query is marked as untouchable, leave
if (strstr($query, "/*NOTRACK*/")) {
return false;
return;
}
if (! (substr($query, -1) == ';')) {
@ -912,7 +872,7 @@ class PMA_Tracker
// $dbname can be empty, for example when coming from Synchronize
// and this is a query for the remote server
if (empty($dbname)) {
return false;
return;
}
// If we found a valid statement

View File

@ -1,6 +1,6 @@
# phpMyAdmin Advisory rules file
# Use only UNIX style newlines
# This file is being parsed by advisor.class.php, which should handle syntax errors correctly.
# This file is being parsed by Advisor.class.php, which should handle syntax errors correctly.
# However, PHP Warnings and the like are being consumed by the phpMyAdmin error handler, so those won't show up
# E.g.: Justification line is empty because you used an unescape percent sign, sprintf() returns an empty string and no warning/error is shown
#
@ -422,7 +422,7 @@ rule 'InnoDB buffer pool size' [system_memory > 0]
value < 60
Your InnoDB buffer pool is fairly small.
The InnoDB buffer pool has a profound impact on performance for InnoDB tables. Assign all your remaining memory to this buffer. For database servers that use solely InnoDB as storage engine and have no other services (e.g. a web server) running, you may set this as high as 80% of your available memory. If that is not the case, you need to carefully assess the memory consumption of your other services and non-InnoDB-Tables and set this variable accordingly. If it is set too high, your system will start swapping, which decreases performance significantly. See also <a href="http://www.mysqlperformanceblog.com/2007/11/03/choosing-innodb_buffer_pool_size/">this article</a>
You are currently using %s% of your memory for the InnoDB buffer pool. This rule fires if you are assigning less than 60%, however this might be perfectly adequate for your system if you don't have much InnoDB tables or other services running on the same machine.
You are currently using %s% of your memory for the InnoDB buffer pool. This rule fires if you are assigning less than 60%, however this might be perfectly adequate for your system if you don't have much InnoDB tables or other services running on the same machine. | value
#
# other

View File

@ -80,6 +80,7 @@ if (function_exists('mcrypt_encrypt')) {
* Returns blowfish secret or generates one if needed.
*
* @access public
* @return string
*/
function PMA_get_blowfish_secret()
{

View File

@ -0,0 +1,649 @@
<?php
function loadData($type, $data) {
if (!$data) return $data;
$tmp = unpack($type, $data);
return current($tmp);
}
function swap($binValue) {
$result = $binValue{strlen($binValue) - 1};
for($i = strlen($binValue) - 2; $i >= 0 ; $i--) {
$result .= $binValue{$i};
}
return $result;
}
function packDouble($value, $mode = 'LE') {
$value = (double)$value;
$bin = pack("d", $value);
//We test if the conversion of an integer (1) is done as LE or BE by default
switch (pack ('L', 1)) {
case pack ('V', 1): //Little Endian
$result = ($mode == 'LE') ? $bin : swap($bin);
break;
case pack ('N', 1): //Big Endian
$result = ($mode == 'BE') ? $bin : swap($bin);
break;
default: //Some other thing, we just return false
$result = FALSE;
}
return $result;
}
class ShapeFile {
var $FileName;
var $SHPFile;
var $SHXFile;
var $DBFFile;
var $DBFHeader;
var $lastError = "";
var $boundingBox = array("xmin" => 0.0, "ymin" => 0.0, "xmax" => 0.0, "ymax" => 0.0);
var $fileLength = 0;
var $shapeType = 0;
var $records;
function ShapeFile($shapeType, $boundingBox = array("xmin" => 0.0, "ymin" => 0.0, "xmax" => 0.0, "ymax" => 0.0), $FileName = NULL) {
$this->shapeType = $shapeType;
$this->boundingBox = $boundingBox;
$this->FileName = $FileName;
$this->fileLength = 50;
}
function loadFromFile($FileName) {
$this->FileName = $FileName;
if (($this->_openSHPFile()) && ($this->_openDBFFile())) {
$this->_loadHeaders();
$this->_loadRecords();
$this->_closeSHPFile();
$this->_closeDBFFile();
} else {
return false;
}
}
function saveToFile($FileName = NULL) {
if ($FileName != NULL) $this->FileName = $FileName;
if (($this->_openSHPFile(TRUE)) && ($this->_openSHXFile(TRUE)) && ($this->_openDBFFile(TRUE))) {
$this->_saveHeaders();
$this->_saveRecords();
$this->_closeSHPFile();
$this->_closeSHXFile();
$this->_closeDBFFile();
} else {
return false;
}
}
function addRecord($record) {
if ((isset($this->DBFHeader)) && (is_array($this->DBFHeader))) {
$record->updateDBFInfo($this->DBFHeader);
}
$this->fileLength += ($record->getContentLength() + 4);
$this->records[] = $record;
$this->records[count($this->records) - 1]->recordNumber = count($this->records);
return (count($this->records) - 1);
}
function deleteRecord($index) {
if (isset($this->records[$index])) {
$this->fileLength -= ($this->records[$index]->getContentLength() + 4);
for ($i = $index; $i < (count($this->records) - 1); $i++) {
$this->records[$i] = $this->records[$i + 1];
}
unset($this->records[count($this->records) - 1]);
$this->_deleteRecordFromDBF($index);
}
}
function getDBFHeader() {
return $this->DBFHeader;
}
function setDBFHeader($header) {
$this->DBFHeader = $header;
for ($i = 0; $i < count($this->records); $i++) {
$this->records[$i]->updateDBFInfo($header);
}
}
function getIndexFromDBFData($field, $value) {
$result = -1;
for ($i = 0; $i < (count($this->records) - 1); $i++) {
if (isset($this->records[$i]->DBFData[$field]) && (strtoupper($this->records[$i]->DBFData[$field]) == strtoupper($value))) {
$result = $i;
}
}
return $result;
}
function _loadDBFHeader() {
$DBFFile = fopen(str_replace('.*', '.dbf', $this->FileName), 'r');
$result = array();
$buff32 = array();
$i = 1;
$inHeader = true;
while ($inHeader) {
if (!feof($DBFFile)) {
$buff32 = fread($DBFFile, 32);
if ($i > 1) {
if (substr($buff32, 0, 1) == chr(13)) {
$inHeader = false;
} else {
$pos = strpos(substr($buff32, 0, 10), chr(0));
$pos = ($pos == 0 ? 10 : $pos);
$fieldName = substr($buff32, 0, $pos);
$fieldType = substr($buff32, 11, 1);
$fieldLen = ord(substr($buff32, 16, 1));
$fieldDec = ord(substr($buff32, 17, 1));
array_push($result, array($fieldName, $fieldType, $fieldLen, $fieldDec));
}
}
$i++;
} else {
$inHeader = false;
}
}
fclose($DBFFile);
return($result);
}
function _deleteRecordFromDBF($index) {
if (@dbase_delete_record($this->DBFFile, $index)) {
@dbase_pack($this->DBFFile);
}
}
function _loadHeaders() {
fseek($this->SHPFile, 24, SEEK_SET);
$this->fileLength = loadData("N", fread($this->SHPFile, 4));
fseek($this->SHPFile, 32, SEEK_SET);
$this->shapeType = loadData("V", fread($this->SHPFile, 4));
$this->boundingBox = array();
$this->boundingBox["xmin"] = loadData("d", fread($this->SHPFile, 8));
$this->boundingBox["ymin"] = loadData("d", fread($this->SHPFile, 8));
$this->boundingBox["xmax"] = loadData("d", fread($this->SHPFile, 8));
$this->boundingBox["ymax"] = loadData("d", fread($this->SHPFile, 8));
$this->DBFHeader = $this->_loadDBFHeader();
}
function _saveHeaders() {
fwrite($this->SHPFile, pack("NNNNNN", 9994, 0, 0, 0, 0, 0));
fwrite($this->SHPFile, pack("N", $this->fileLength));
fwrite($this->SHPFile, pack("V", 1000));
fwrite($this->SHPFile, pack("V", $this->shapeType));
fwrite($this->SHPFile, packDouble($this->boundingBox['xmin']));
fwrite($this->SHPFile, packDouble($this->boundingBox['ymin']));
fwrite($this->SHPFile, packDouble($this->boundingBox['xmax']));
fwrite($this->SHPFile, packDouble($this->boundingBox['ymax']));
fwrite($this->SHPFile, pack("dddd", 0, 0, 0, 0));
fwrite($this->SHXFile, pack("NNNNNN", 9994, 0, 0, 0, 0, 0));
fwrite($this->SHXFile, pack("N", 50 + 4*count($this->records)));
fwrite($this->SHXFile, pack("V", 1000));
fwrite($this->SHXFile, pack("V", $this->shapeType));
fwrite($this->SHXFile, packDouble($this->boundingBox['xmin']));
fwrite($this->SHXFile, packDouble($this->boundingBox['ymin']));
fwrite($this->SHXFile, packDouble($this->boundingBox['xmax']));
fwrite($this->SHXFile, packDouble($this->boundingBox['ymax']));
fwrite($this->SHXFile, pack("dddd", 0, 0, 0, 0));
}
function _loadRecords() {
fseek($this->SHPFile, 100);
while (!feof($this->SHPFile)) {
$bByte = ftell($this->SHPFile);
$record = new ShapeRecord(-1);
$record->loadFromFile($this->SHPFile, $this->DBFFile);
$eByte = ftell($this->SHPFile);
if (($eByte <= $bByte) || ($record->lastError != "")) {
return false;
}
$this->records[] = $record;
}
}
function _saveRecords() {
if (file_exists(str_replace('.*', '.dbf', $this->FileName))) {
@unlink(str_replace('.*', '.dbf', $this->FileName));
}
if (!($this->DBFFile = @dbase_create(str_replace('.*', '.dbf', $this->FileName), $this->DBFHeader))) {
return $this->setError(sprintf("It wasn't possible to create the DBase file '%s'", str_replace('.*', '.dbf', $this->FileName)));
}
$offset = 50;
if (is_array($this->records) && (count($this->records) > 0)) {
reset($this->records);
while (list($index, $record) = each($this->records)) {
//Save the record to the .shp file
$record->saveToFile($this->SHPFile, $this->DBFFile, $index + 1);
//Save the record to the .shx file
fwrite($this->SHXFile, pack("N", $offset));
fwrite($this->SHXFile, pack("N", $record->getContentLength()));
$offset += (4 + $record->getContentLength());
}
}
@dbase_pack($this->DBFFile);
}
function _openSHPFile($toWrite = false) {
$this->SHPFile = @fopen(str_replace('.*', '.shp', $this->FileName), ($toWrite ? "wb+" : "rb"));
if (!$this->SHPFile) {
return $this->setError(sprintf("It wasn't possible to open the Shape file '%s'", str_replace('.*', '.shp', $this->FileName)));
}
return TRUE;
}
function _closeSHPFile() {
if ($this->SHPFile) {
fclose($this->SHPFile);
$this->SHPFile = NULL;
}
}
function _openSHXFile($toWrite = false) {
$this->SHXFile = @fopen(str_replace('.*', '.shx', $this->FileName), ($toWrite ? "wb+" : "rb"));
if (!$this->SHXFile) {
return $this->setError(sprintf("It wasn't possible to open the Index file '%s'", str_replace('.*', '.shx', $this->FileName)));
}
return TRUE;
}
function _closeSHXFile() {
if ($this->SHXFile) {
fclose($this->SHXFile);
$this->SHXFile = NULL;
}
}
function _openDBFFile($toWrite = false) {
$checkFunction = $toWrite ? "is_writable" : "is_readable";
if (($toWrite) && (!file_exists(str_replace('.*', '.dbf', $this->FileName)))) {
if (!@dbase_create(str_replace('.*', '.dbf', $this->FileName), $this->DBFHeader)) {
return $this->setError(sprintf("It wasn't possible to create the DBase file '%s'", str_replace('.*', '.dbf', $this->FileName)));
}
}
if ($checkFunction(str_replace('.*', '.dbf', $this->FileName))) {
$this->DBFFile = dbase_open(str_replace('.*', '.dbf', $this->FileName), ($toWrite ? 2 : 0));
if (!$this->DBFFile) {
return $this->setError(sprintf("It wasn't possible to open the DBase file '%s'", str_replace('.*', '.dbf', $this->FileName)));
}
} else {
return $this->setError(sprintf("It wasn't possible to find the DBase file '%s'", str_replace('.*', '.dbf', $this->FileName)));
}
return TRUE;
}
function _closeDBFFile() {
if ($this->DBFFile) {
dbase_close($this->DBFFile);
$this->DBFFile = NULL;
}
}
function setError($error) {
$this->lastError = $error;
return false;
}
}
class ShapeRecord {
var $SHPFile = NULL;
var $DBFFile = NULL;
var $recordNumber = NULL;
var $shapeType = NULL;
var $lastError = "";
var $SHPData = array();
var $DBFData = array();
function ShapeRecord($shapeType) {
$this->shapeType = $shapeType;
}
function loadFromFile(&$SHPFile, &$DBFFile) {
$this->SHPFile = $SHPFile;
$this->DBFFile = $DBFFile;
$this->_loadHeaders();
switch ($this->shapeType) {
case 0:
$this->_loadNullRecord();
break;
case 1:
$this->_loadPointRecord();
break;
case 3:
$this->_loadPolyLineRecord();
break;
case 5:
$this->_loadPolygonRecord();
break;
case 8:
$this->_loadMultiPointRecord();
break;
default:
$this->setError(sprintf("The Shape Type '%s' is not supported.", $this->shapeType));
break;
}
$this->_loadDBFData();
}
function saveToFile(&$SHPFile, &$DBFFile, $recordNumber) {
$this->SHPFile = $SHPFile;
$this->DBFFile = $DBFFile;
$this->recordNumber = $recordNumber;
$this->_saveHeaders();
switch ($this->shapeType) {
case 0:
$this->_saveNullRecord();
break;
case 1:
$this->_savePointRecord();
break;
case 3:
$this->_savePolyLineRecord();
break;
case 5:
$this->_savePolygonRecord();
break;
case 8:
$this->_saveMultiPointRecord();
break;
default:
$this->setError(sprintf("The Shape Type '%s' is not supported.", $this->shapeType));
break;
}
$this->_saveDBFData();
}
function updateDBFInfo($header) {
$tmp = $this->DBFData;
unset($this->DBFData);
$this->DBFData = array();
reset($header);
while (list($key, $value) = each($header)) {
$this->DBFData[$value[0]] = (isset($tmp[$value[0]])) ? $tmp[$value[0]] : "";
}
}
function _loadHeaders() {
$this->recordNumber = loadData("N", fread($this->SHPFile, 4));
$tmp = loadData("N", fread($this->SHPFile, 4)); //We read the length of the record
$this->shapeType = loadData("V", fread($this->SHPFile, 4));
}
function _saveHeaders() {
fwrite($this->SHPFile, pack("N", $this->recordNumber));
fwrite($this->SHPFile, pack("N", $this->getContentLength()));
fwrite($this->SHPFile, pack("V", $this->shapeType));
}
function _loadPoint() {
$data = array();
$data["x"] = loadData("d", fread($this->SHPFile, 8));
$data["y"] = loadData("d", fread($this->SHPFile, 8));
return $data;
}
function _savePoint($data) {
fwrite($this->SHPFile, packDouble($data["x"]));
fwrite($this->SHPFile, packDouble($data["y"]));
}
function _loadNullRecord() {
$this->SHPData = array();
}
function _saveNullRecord() {
//Don't save anything
}
function _loadPointRecord() {
$this->SHPData = $this->_loadPoint();
}
function _savePointRecord() {
$this->_savePoint($this->SHPData);
}
function _loadMultiPointRecord() {
$this->SHPData = array();
$this->SHPData["xmin"] = loadData("d", fread($this->SHPFile, 8));
$this->SHPData["ymin"] = loadData("d", fread($this->SHPFile, 8));
$this->SHPData["xmax"] = loadData("d", fread($this->SHPFile, 8));
$this->SHPData["ymax"] = loadData("d", fread($this->SHPFile, 8));
$this->SHPData["numpoints"] = loadData("V", fread($this->SHPFile, 4));
for ($i = 0; $i <= $this->SHPData["numpoints"]; $i++) {
$this->SHPData["points"][] = $this->_loadPoint();
}
}
function _saveMultiPointRecord() {
fwrite($this->SHPFile, pack("dddd", $this->SHPData["xmin"], $this->SHPData["ymin"], $this->SHPData["xmax"], $this->SHPData["ymax"]));
fwrite($this->SHPFile, pack("V", $this->SHPData["numpoints"]));
for ($i = 0; $i <= $this->SHPData["numpoints"]; $i++) {
$this->_savePoint($this->SHPData["points"][$i]);
}
}
function _loadPolyLineRecord() {
$this->SHPData = array();
$this->SHPData["xmin"] = loadData("d", fread($this->SHPFile, 8));
$this->SHPData["ymin"] = loadData("d", fread($this->SHPFile, 8));
$this->SHPData["xmax"] = loadData("d", fread($this->SHPFile, 8));
$this->SHPData["ymax"] = loadData("d", fread($this->SHPFile, 8));
$this->SHPData["numparts"] = loadData("V", fread($this->SHPFile, 4));
$this->SHPData["numpoints"] = loadData("V", fread($this->SHPFile, 4));
for ($i = 0; $i < $this->SHPData["numparts"]; $i++) {
$this->SHPData["parts"][$i] = loadData("V", fread($this->SHPFile, 4));
}
$firstIndex = ftell($this->SHPFile);
$readPoints = 0;
reset($this->SHPData["parts"]);
while (list($partIndex, $partData) = each($this->SHPData["parts"])) {
if (!isset($this->SHPData["parts"][$partIndex]["points"]) || !is_array($this->SHPData["parts"][$partIndex]["points"])) {
$this->SHPData["parts"][$partIndex] = array();
$this->SHPData["parts"][$partIndex]["points"] = array();
}
while (!in_array($readPoints, $this->SHPData["parts"]) && ($readPoints < ($this->SHPData["numpoints"])) && !feof($this->SHPFile)) {
$this->SHPData["parts"][$partIndex]["points"][] = $this->_loadPoint();
$readPoints++;
}
}
fseek($this->SHPFile, $firstIndex + ($readPoints*16));
}
function _savePolyLineRecord() {
fwrite($this->SHPFile, pack("dddd", $this->SHPData["xmin"], $this->SHPData["ymin"], $this->SHPData["xmax"], $this->SHPData["ymax"]));
fwrite($this->SHPFile, pack("VV", $this->SHPData["numparts"], $this->SHPData["numpoints"]));
for ($i = 0; $i < $this->SHPData["numparts"]; $i++) {
fwrite($this->SHPFile, pack("V", count($this->SHPData["parts"][$i])));
}
reset($this->SHPData["parts"]);
foreach ($this->SHPData["parts"] as $partData){
reset($partData["points"]);
while (list($pointIndex, $pointData) = each($partData["points"])) {
$this->_savePoint($pointData);
}
}
}
function _loadPolygonRecord() {
$this->_loadPolyLineRecord();
}
function _savePolygonRecord() {
$this->_savePolyLineRecord();
}
function addPoint($point, $partIndex = 0) {
switch ($this->shapeType) {
case 0:
//Don't add anything
break;
case 1:
//Substitutes the value of the current point
$this->SHPData = $point;
break;
case 3:
case 5:
//Adds a new point to the selected part
if (!isset($this->SHPData["xmin"]) || ($this->SHPData["xmin"] > $point["x"])) $this->SHPData["xmin"] = $point["x"];
if (!isset($this->SHPData["ymin"]) || ($this->SHPData["ymin"] > $point["y"])) $this->SHPData["ymin"] = $point["y"];
if (!isset($this->SHPData["xmax"]) || ($this->SHPData["xmax"] < $point["x"])) $this->SHPData["xmax"] = $point["x"];
if (!isset($this->SHPData["ymax"]) || ($this->SHPData["ymax"] < $point["y"])) $this->SHPData["ymax"] = $point["y"];
$this->SHPData["parts"][$partIndex]["points"][] = $point;
$this->SHPData["numparts"] = count($this->SHPData["parts"]);
$this->SHPData["numpoints"]++;
break;
case 8:
//Adds a new point
if (!isset($this->SHPData["xmin"]) || ($this->SHPData["xmin"] > $point["x"])) $this->SHPData["xmin"] = $point["x"];
if (!isset($this->SHPData["ymin"]) || ($this->SHPData["ymin"] > $point["y"])) $this->SHPData["ymin"] = $point["y"];
if (!isset($this->SHPData["xmax"]) || ($this->SHPData["xmax"] < $point["x"])) $this->SHPData["xmax"] = $point["x"];
if (!isset($this->SHPData["ymax"]) || ($this->SHPData["ymax"] < $point["y"])) $this->SHPData["ymax"] = $point["y"];
$this->SHPData["points"][] = $point;
$this->SHPData["numpoints"]++;
break;
default:
$this->setError(sprintf("The Shape Type '%s' is not supported.", $this->shapeType));
break;
}
}
function deletePoint($pointIndex = 0, $partIndex = 0) {
switch ($this->shapeType) {
case 0:
//Don't delete anything
break;
case 1:
//Sets the value of the point to zero
$this->SHPData["x"] = 0.0;
$this->SHPData["y"] = 0.0;
break;
case 3:
case 5:
//Deletes the point from the selected part, if exists
if (isset($this->SHPData["parts"][$partIndex]) && isset($this->SHPData["parts"][$partIndex]["points"][$pointIndex])) {
for ($i = $pointIndex; $i < (count($this->SHPData["parts"][$partIndex]["points"]) - 1); $i++) {
$this->SHPData["parts"][$partIndex]["points"][$i] = $this->SHPData["parts"][$partIndex]["points"][$i + 1];
}
unset($this->SHPData["parts"][$partIndex]["points"][count($this->SHPData["parts"][$partIndex]["points"]) - 1]);
$this->SHPData["numparts"] = count($this->SHPData["parts"]);
$this->SHPData["numpoints"]--;
}
break;
case 8:
//Deletes the point, if exists
if (isset($this->SHPData["points"][$pointIndex])) {
for ($i = $pointIndex; $i < (count($this->SHPData["points"]) - 1); $i++) {
$this->SHPData["points"][$i] = $this->SHPData["points"][$i + 1];
}
unset($this->SHPData["points"][count($this->SHPData["points"]) - 1]);
$this->SHPData["numpoints"]--;
}
break;
default:
$this->setError(sprintf("The Shape Type '%s' is not supported.", $this->shapeType));
break;
}
}
function getContentLength() {
switch ($this->shapeType) {
case 0:
$result = 0;
break;
case 1:
$result = 10;
break;
case 3:
case 5:
$result = 22 + 2*count($this->SHPData["parts"]);
for ($i = 0; $i < count($this->SHPData["parts"]); $i++) {
$result += 8*count($this->SHPData["parts"][$i]["points"]);
}
break;
case 8:
$result = 20 + 8*count($this->SHPData["points"]);
break;
default:
$result = false;
$this->setError(sprintf("The Shape Type '%s' is not supported.", $this->shapeType));
break;
}
return $result;
}
function _loadDBFData() {
$this->DBFData = @dbase_get_record_with_names($this->DBFFile, $this->recordNumber);
unset($this->DBFData["deleted"]);
}
function _saveDBFData() {
unset($this->DBFData["deleted"]);
if ($this->recordNumber <= dbase_numrecords($this->DBFFile)) {
if (!dbase_replace_record($this->DBFFile, array_values($this->DBFData), $this->recordNumber)) {
$this->setError("I wasn't possible to update the information in the DBF file.");
}
} else {
if (!dbase_add_record($this->DBFFile, array_values($this->DBFData))) {
$this->setError("I wasn't possible to add the information to the DBF file.");
}
}
}
function setError($error) {
$this->lastError = $error;
return false;
}
}
?>

View File

@ -4,6 +4,11 @@
* @package BLOBStreaming
*/
/**
* Initializes PBMS database
*
* @return bool
*/
function initPBMSDatabase()
{
$query = "create database IF NOT EXISTS pbms;"; // If no other choice then try this.
@ -379,6 +384,11 @@ function PMA_BS_CreateReferenceLink($bs_reference, $db_name)
* BLOB streaming on a per table or database basis. So in anticipation of this
* PMA_BS_IsTablePBMSEnabled() passes in the table and database name even though
* they are not currently needed.
*
* @param string $db_name
* @param string $tbl_name
* @param string $tbl_type
* @return bool
*/
function PMA_BS_IsTablePBMSEnabled($db_name, $tbl_name, $tbl_type)
{

View File

@ -321,6 +321,7 @@ class Horde_Cipher_blowfish
* Set the key to be used for en/decryption.
*
* @param string $key The key to use.
* @return bool
*/
public function setKey($key)
{

View File

@ -94,7 +94,7 @@ function PMA_getIcon($icon, $alternate = '', $force_text = false, $noSprite = fa
$button .= '<span class="nowrap">';
if ($include_icon) {
if($noSprite) {
if ($noSprite) {
$button .= '<img src="' . $GLOBALS['pmaThemeImage'] . $icon . '"'
. ' class="icon" width="16" height="16" />';
} else {
@ -713,8 +713,8 @@ function PMA_getTableList($db, $tables = null, $limit_offset = 0, $limit_count =
// in $group we save the reference to the place in $table_groups
// where to store the table info
if ($GLOBALS['cfg']['LeftFrameDBTree']
&& $sep && strstr($table_name, $sep))
{
&& $sep && strstr($table_name, $sep)
) {
$parts = explode($sep, $table_name);
$group =& $table_groups;
@ -754,7 +754,8 @@ function PMA_getTableList($db, $tables = null, $limit_offset = 0, $limit_count =
if ($GLOBALS['cfg']['ShowTooltipAliasTB']
&& $GLOBALS['cfg']['ShowTooltipAliasTB'] !== 'nested') {
&& $GLOBALS['cfg']['ShowTooltipAliasTB'] !== 'nested'
) {
// switch tooltip and name
$table['Comment'] = $table['Name'];
$table['disp_name'] = $table['Comment'];
@ -935,7 +936,8 @@ function PMA_showMessage($message, $sql_query = null, $type = 'notice', $is_view
// @todo what about $GLOBALS['display_query']???
// @todo this is REALLY the wrong place to do this - very unexpected here
if (strlen($GLOBALS['table'])
&& $GLOBALS['sql_query'] == 'TRUNCATE TABLE ' . PMA_backquote($GLOBALS['table'])) {
&& $GLOBALS['sql_query'] == 'TRUNCATE TABLE ' . PMA_backquote($GLOBALS['table'])
) {
if (PMA_Table::sGetStatusInfo($GLOBALS['db'], $GLOBALS['table'], 'Index_length') > 1024) {
PMA_DBI_try_query('REPAIR TABLE ' . PMA_backquote($GLOBALS['table']));
}
@ -1029,7 +1031,8 @@ function PMA_showMessage($message, $sql_query = null, $type = 'notice', $is_view
*/
if (isset($analyzed_display_query[0]['queryflags']['select_from'])
&& isset($GLOBALS['sql_limit_to_append'])) {
&& isset($GLOBALS['sql_limit_to_append'])
) {
$query_base = $analyzed_display_query[0]['section_before_limit']
. "\n" . $GLOBALS['sql_limit_to_append']
. $analyzed_display_query[0]['section_after_limit'];
@ -1142,7 +1145,8 @@ function PMA_showMessage($message, $sql_query = null, $type = 'notice', $is_view
// Refresh query
if (! empty($cfg['SQLQuery']['Refresh'])
&& preg_match('@^(SELECT|SHOW)[[:space:]]+@i', $sql_query)) {
&& preg_match('@^(SELECT|SHOW)[[:space:]]+@i', $sql_query)
) {
$refresh_link = 'import.php' . PMA_generate_common_url($url_params);
$refresh_link = ' [' . PMA_linkOrButton($refresh_link, __('Refresh')) . ']';
} else {
@ -1150,7 +1154,8 @@ function PMA_showMessage($message, $sql_query = null, $type = 'notice', $is_view
} //show as php
if (! empty($cfg['SQLValidator']['use'])
&& ! empty($cfg['SQLQuery']['Validate'])) {
&& ! empty($cfg['SQLQuery']['Validate'])
) {
$validate_params = $url_params;
if (!empty($GLOBALS['validatequery'])) {
$validate_message = __('Skip Validate SQL') ;
@ -1251,8 +1256,9 @@ function PMA_profilingSupported()
// (avoid a trip to the server for MySQL before 5.0.37)
// and do not set a constant as we might be switching servers
if (defined('PMA_MYSQL_INT_VERSION')
&& PMA_MYSQL_INT_VERSION >= 50037
&& PMA_DBI_fetch_value("SHOW VARIABLES LIKE 'profiling'")) {
&& PMA_MYSQL_INT_VERSION >= 50037
&& PMA_DBI_fetch_value("SHOW VARIABLES LIKE 'profiling'")
) {
PMA_cacheSet('profiling_supported', true, true);
} else {
PMA_cacheSet('profiling_supported', false, true);
@ -1734,7 +1740,10 @@ function PMA_linkOrButton($url, $message, $tag_params = array(),
$displayed_message = '';
// Add text if not already added
if (stristr($message, '<img') && (!$strip_img || $GLOBALS['cfg']['PropertiesIconic'] === true) && strip_tags($message)==$message) {
if (stristr($message, '<img')
&& (!$strip_img || $GLOBALS['cfg']['PropertiesIconic'] === true)
&& strip_tags($message)==$message
) {
$displayed_message = '<span>' . htmlspecialchars(preg_replace('/^.*\salt="([^"]*)".*$/si', '\1', $message)) . '</span>';
}
@ -1996,7 +2005,8 @@ function PMA_getUniqueCondition($handle, $fields_cnt, $fields_meta, $row, $force
$meta->orgname = $meta->name;
if (isset($GLOBALS['analyzed_sql'][0]['select_expr'])
&& is_array($GLOBALS['analyzed_sql'][0]['select_expr'])) {
&& is_array($GLOBALS['analyzed_sql'][0]['select_expr'])
) {
foreach ($GLOBALS['analyzed_sql'][0]['select_expr'] as $select_expr) {
// need (string) === (string)
// '' !== 0 but '' == 0
@ -2019,7 +2029,10 @@ function PMA_getUniqueCondition($handle, $fields_cnt, $fields_meta, $row, $force
// a view because this view might be updatable.
// (The isView() verification should not be costly in most cases
// because there is some caching in the function).
if (isset($meta->orgtable) && $meta->table != $meta->orgtable && ! PMA_Table::isView($GLOBALS['db'], $meta->table)) {
if (isset($meta->orgtable)
&& $meta->table != $meta->orgtable
&& ! PMA_Table::isView($GLOBALS['db'], $meta->table)
) {
$meta->table = $meta->orgtable;
}
@ -2042,7 +2055,10 @@ function PMA_getUniqueCondition($handle, $fields_cnt, $fields_meta, $row, $force
} else {
// timestamp is numeric on some MySQL 4.1
// for real we use CONCAT above and it should compare to string
if ($meta->numeric && $meta->type != 'timestamp' && $meta->type != 'real') {
if ($meta->numeric
&& $meta->type != 'timestamp'
&& $meta->type != 'real'
) {
$con_val = '= ' . $row[$i];
} elseif (($meta->type == 'blob' || $meta->type == 'string')
// hexify only if this is a true not empty BLOB or a BINARY
@ -2057,6 +2073,13 @@ function PMA_getUniqueCondition($handle, $fields_cnt, $fields_meta, $row, $force
// this blob won't be part of the final condition
$con_val = null;
}
} elseif (in_array($meta->type, PMA_getGISDatatypes()) && ! empty($row[$i])) {
// do not build a too big condition
if (strlen($row[$i]) < 5000) {
$condition .= '=0x' . bin2hex($row[$i]) . ' AND';
} else {
$condition = '';
}
} elseif ($meta->type == 'bit') {
$con_val = "= b'" . PMA_printable_bit_value($row[$i], $meta->length) . "'";
} else {
@ -2131,10 +2154,13 @@ function PMA_buttonOrImage($button_name, $button_class, $image_name, $text,
. PMA_getIcon($image, $text)
.'</button>' . "\n";
} else {
echo '<input type="image" name="' . $image_name . '" value="'
. htmlspecialchars($value) . '" title="' . htmlspecialchars($text) . '" src="' . $GLOBALS['pmaThemeImage']
. $image . '" />'
. ($GLOBALS['cfg']['PropertiesIconic'] === 'both' ? '&nbsp;' . htmlspecialchars($text) : '') . "\n";
echo '<input type="image" name="' . $image_name
. '" value="' . htmlspecialchars($value)
. '" title="' . htmlspecialchars($text)
. '" src="' . $GLOBALS['pmaThemeImage']. $image . '" />'
. ($GLOBALS['cfg']['PropertiesIconic'] === 'both'
? '&nbsp;' . htmlspecialchars($text)
: '') . "\n";
}
} // end function
@ -2228,7 +2254,8 @@ function PMA_pageselector($rows, $pageNow = 1, $nbTotalPage = 1,
} else {
$selected = '';
}
$gotopage .= ' <option ' . $selected . ' value="' . (($i - 1) * $rows) . '">' . $i . '</option>' . "\n";
$gotopage .= ' <option ' . $selected
. ' value="' . (($i - 1) * $rows) . '">' . $i . '</option>' . "\n";
}
$gotopage .= ' </select><noscript><input type="submit" value="' . __('Go') . '" /></noscript>';
@ -2363,8 +2390,8 @@ function PMA_getDbLink($database = null)
}
return '<a href="' . $GLOBALS['cfg']['DefaultTabDatabase'] . '?' . PMA_generate_common_url($database) . '"'
.' title="' . sprintf(__('Jump to database &quot;%s&quot;.'), htmlspecialchars($database)) . '">'
.htmlspecialchars($database) . '</a>';
. ' title="' . sprintf(__('Jump to database &quot;%s&quot;.'), htmlspecialchars($database)) . '">'
. htmlspecialchars($database) . '</a>';
}
/**
@ -2834,6 +2861,31 @@ function PMA_replace_binary_contents($content)
return $result;
}
/**
* Converts GIS data to Well Known Text format
*
* @param $data GIS data
* @param $includeSRID Add SRID to the WKT
* @return GIS data in Well Know Text format
*/
function PMA_asWKT($data, $includeSRID = false) {
// Convert to WKT format
$hex = bin2hex($data);
$wktsql = "SELECT ASTEXT(x'" . $hex . "')";
if ($includeSRID) {
$wktsql .= ", SRID(x'" . $hex . "')";
}
$wktresult = PMA_DBI_try_query($wktsql, null, PMA_DBI_QUERY_STORE);
$wktarr = PMA_DBI_fetch_row($wktresult, 0);
$wktval = $wktarr[0];
if ($includeSRID) {
$srid = $wktarr[1];
$wktval = "'" . $wktval . "'," . $srid;
}
@PMA_DBI_free_result($wktresult);
return $wktval;
}
/**
* If the string starts with a \r\n pair (0x0d0a) add an extra \n
*
@ -2953,10 +3005,9 @@ function PMA_expandUserString($string, $escape = null, $updates = array())
* function that generates a json output for an ajax request and ends script
* execution
*
* @param bool $message message string containing the html of the message
* @param bool $success success whether the ajax request was successfull
* @param array $extra_data extra_data optional - any other data as part of the json request
*
* @param PMA_Message|string $message message string containing the html of the message
* @param bool $success success whether the ajax request was successfull
* @param array $extra_data extra_data optional - any other data as part of the json request
*/
function PMA_ajaxResponse($message, $success = true, $extra_data = array())
{
@ -3147,22 +3198,157 @@ function PMA_getSupportedDatatypes($html = false, $selected = '')
* @return array list of datatypes
*/
function PMA_unsupportedDatatypes()
{
// These GIS data types are not yet supported.
$no_support_types = array('geometry',
'point',
'linestring',
'polygon',
'multipoint',
'multilinestring',
'multipolygon',
'geometrycollection'
);
function PMA_unsupportedDatatypes() {
$no_support_types = array();
return $no_support_types;
}
function PMA_getGISDatatypes($upper_case = false) {
$gis_data_types = array('geometry',
'point',
'linestring',
'polygon',
'multipoint',
'multilinestring',
'multipolygon',
'geometrycollection'
);
if ($upper_case) {
for ($i = 0; $i < count($gis_data_types); $i++) {
$gis_data_types[$i] = strtoupper($gis_data_types[$i]);
}
}
return $gis_data_types;
}
/**
* Generates GIS data based on the string passed.
*
* @param string $gis_string GIS string
*/
function PMA_createGISData($gis_string) {
$gis_string = trim($gis_string);
$geom_types = '(POINT|MULTIPOINT|LINESTRING|MULTILINESTRING|POLYGON|MULTIPOLYGON|GEOMETRYCOLLECTION)';
if (preg_match("/^'" . $geom_types . "\(.*\)',[0-9]*$/i", $gis_string)) {
return 'GeomFromText(' . $gis_string . ')';
} elseif (preg_match("/^" . $geom_types . "\(.*\)$/i", $gis_string)) {
return "GeomFromText('" . $gis_string . "')";
} else {
return $gis_string;
}
}
/**
* Returns the names and details of the functions
* that can be applied on geometry data typess.
*
* @param string $geom_type if provided the output is limited to the functions
* that are applicable to the provided geometry type.
* @param bool $binary if set to false functions that take two geometries
* as arguments will not be included.
* @param bool $display if set to true seperators will be added to the
* output array.
*
* @return array names and details of the functions that can be applied on
* geometry data typess.
*/
function PMA_getGISFunctions($geom_type = null, $binary = true, $display = false) {
$funcs = array();
if ($display) {
$funcs[] = array('display' => ' ');
}
// Unary functions common to all geomety types
$funcs['Dimension'] = array('params' => 1, 'type' => 'int');
$funcs['Envelope'] = array('params' => 1, 'type' => 'Polygon');
$funcs['GeometryType'] = array('params' => 1, 'type' => 'text');
$funcs['SRID'] = array('params' => 1, 'type' => 'int');
$funcs['IsEmpty'] = array('params' => 1, 'type' => 'int');
$funcs['IsSimple'] = array('params' => 1, 'type' => 'int');
$geom_type = trim(strtolower($geom_type));
if ($display && $geom_type != 'geometry' && $geom_type != 'multipoint') {
$funcs[] = array('display' => '--------');
}
// Unary functions that are specific to each geomety type
if ($geom_type == 'point') {
$funcs['X'] = array('params' => 1, 'type' => 'float');
$funcs['Y'] = array('params' => 1, 'type' => 'float');
} elseif ($geom_type == 'multipoint') {
// no fucntions here
} elseif ($geom_type == 'linestring') {
$funcs['EndPoint'] = array('params' => 1, 'type' => 'point');
$funcs['GLength'] = array('params' => 1, 'type' => 'float');
$funcs['NumPoints'] = array('params' => 1, 'type' => 'int');
$funcs['StartPoint'] = array('params' => 1, 'type' => 'point');
$funcs['IsRing'] = array('params' => 1, 'type' => 'int');
} elseif ($geom_type == 'multilinestring') {
$funcs['GLength'] = array('params' => 1, 'type' => 'float');
$funcs['IsClosed'] = array('params' => 1, 'type' => 'int');
} elseif ($geom_type == 'polygon') {
$funcs['Area'] = array('params' => 1, 'type' => 'float');
$funcs['ExteriorRing'] = array('params' => 1, 'type' => 'linestring');
$funcs['NumInteriorRings'] = array('params' => 1, 'type' => 'int');
} elseif ($geom_type == 'multipolygon') {
$funcs['Area'] = array('params' => 1, 'type' => 'float');
$funcs['Centroid'] = array('params' => 1, 'type' => 'point');
// Not yet implemented in MySQL
//$funcs['PointOnSurface'] = array('params' => 1, 'type' => 'point');
} elseif ($geom_type == 'geometrycollection') {
$funcs['NumGeometries'] = array('params' => 1, 'type' => 'int');
}
// If we are asked for binary functions as well
if ($binary) {
// section seperator
if ($display) {
$funcs[] = array('display' => '--------');
}
if (PMA_MYSQL_INT_VERSION < 50601) {
$funcs['Crosses'] = array('params' => 2, 'type' => 'int');
$funcs['Contains'] = array('params' => 2, 'type' => 'int');
$funcs['Disjoint'] = array('params' => 2, 'type' => 'int');
$funcs['Equals'] = array('params' => 2, 'type' => 'int');
$funcs['Intersects'] = array('params' => 2, 'type' => 'int');
$funcs['Overlaps'] = array('params' => 2, 'type' => 'int');
$funcs['Touches'] = array('params' => 2, 'type' => 'int');
$funcs['Within'] = array('params' => 2, 'type' => 'int');
} else {
// If MySQl version is greaeter than or equal 5.6.1, use the ST_ prefix.
$funcs['ST_Crosses'] = array('params' => 2, 'type' => 'int');
$funcs['ST_Contains'] = array('params' => 2, 'type' => 'int');
$funcs['ST_Disjoint'] = array('params' => 2, 'type' => 'int');
$funcs['ST_Equals'] = array('params' => 2, 'type' => 'int');
$funcs['ST_Intersects'] = array('params' => 2, 'type' => 'int');
$funcs['ST_Overlaps'] = array('params' => 2, 'type' => 'int');
$funcs['ST_Touches'] = array('params' => 2, 'type' => 'int');
$funcs['ST_Within'] = array('params' => 2, 'type' => 'int');
}
if ($display) {
$funcs[] = array('display' => '--------');
}
// Minimum bounding rectangle functions
$funcs['MBRContains'] = array('params' => 2, 'type' => 'int');
$funcs['MBRDisjoint'] = array('params' => 2, 'type' => 'int');
$funcs['MBREquals'] = array('params' => 2, 'type' => 'int');
$funcs['MBRIntersects'] = array('params' => 2, 'type' => 'int');
$funcs['MBROverlaps'] = array('params' => 2, 'type' => 'int');
$funcs['MBRTouches'] = array('params' => 2, 'type' => 'int');
$funcs['MBRWithin'] = array('params' => 2, 'type' => 'int');
}
return $funcs;
}
/**
* Creates a dropdown box with MySQL functions for a particular column.
*
@ -3186,7 +3372,8 @@ function PMA_getFunctionsForField($field, $insert_mode)
// or something similar. Then directly look up the entry in the RestrictFunctions array,
// which will then reveal the available dropdown options
if (isset($cfg['RestrictColumnTypes'][strtoupper($field['True_Type'])])
&& isset($cfg['RestrictFunctions'][$cfg['RestrictColumnTypes'][strtoupper($field['True_Type'])]])) {
&& isset($cfg['RestrictFunctions'][$cfg['RestrictColumnTypes'][strtoupper($field['True_Type'])]])
) {
$current_func_type = $cfg['RestrictColumnTypes'][strtoupper($field['True_Type'])];
$dropdown = $cfg['RestrictFunctions'][$current_func_type];
$default_function = $cfg['DefaultFunctions'][$current_func_type];
@ -3203,9 +3390,10 @@ function PMA_getFunctionsForField($field, $insert_mode)
// and the column does not have the
// ON UPDATE DEFAULT TIMESTAMP attribute.
if ($field['True_Type'] == 'timestamp'
&& empty($field['Default'])
&& empty($data)
&& ! isset($analyzed_sql[0]['create_table_fields'][$field['Field']]['on_update_current_timestamp'])) {
&& empty($field['Default'])
&& empty($data)
&& ! isset($analyzed_sql[0]['create_table_fields'][$field['Field']]['on_update_current_timestamp'])
) {
$default_function = $cfg['DefaultFunctions']['first_timestamp'];
}
// For primary keys of type char(36) or varchar(36) UUID if the default function

View File

@ -2753,325 +2753,49 @@ $cfg['DBG']['sql'] = false;
* Column types;
* VARCHAR, TINYINT, TEXT and DATE are listed first, based on estimated popularity
*
* This variable is filled in data_*.inc.php
*
* @global array $cfg['ColumnTypes']
*/
$cfg['ColumnTypes'] = array(
// most used
'INT',
'VARCHAR',
'TEXT',
'DATE',
// numeric
'NUMERIC' => array(
'TINYINT',
'SMALLINT',
'MEDIUMINT',
'INT',
'BIGINT',
'-',
'DECIMAL',
'FLOAT',
'DOUBLE',
'REAL',
'-',
'BIT',
'BOOLEAN',
'SERIAL',
),
// Date/Time
'DATE and TIME' => array(
'DATE',
'DATETIME',
'TIMESTAMP',
'TIME',
'YEAR',
),
// Text
'STRING' => array(
'CHAR',
'VARCHAR',
'-',
'TINYTEXT',
'TEXT',
'MEDIUMTEXT',
'LONGTEXT',
'-',
'BINARY',
'VARBINARY',
'-',
'TINYBLOB',
'MEDIUMBLOB',
'BLOB',
'LONGBLOB',
'-',
'ENUM',
'SET',
),
'SPATIAL' => array(
'GEOMETRY',
'POINT',
'LINESTRING',
'POLYGON',
'MULTIPOINT',
'MULTILINESTRING',
'MULTIPOLYGON',
'GEOMETRYCOLLECTION',
),
);
$cfg['ColumnTypes'] = array();
/**
* Attributes
*
* This variable is filled in data_*.inc.php
*
* @global array $cfg['AttributeTypes']
*/
$cfg['AttributeTypes'] = array(
'',
'BINARY',
'UNSIGNED',
'UNSIGNED ZEROFILL',
'on update CURRENT_TIMESTAMP',
);
$cfg['AttributeTypes'] = array();
if ($cfg['ShowFunctionFields']) {
/**
* Available functions
*
* This variable is filled in data_*.inc.php
*
* @global array $cfg['Functions']
*/
$cfg['Functions'] = array(
'ABS',
'ACOS',
'ASCII',
'ASIN',
'ATAN',
'BIN',
'BIT_COUNT',
'BIT_LENGTH',
'CEILING',
'CHAR',
'CHAR_LENGTH',
'COMPRESS',
'COS',
'COT',
'CRC32',
'CURDATE',
'CURRENT_USER',
'CURTIME',
'DATE',
'DAYNAME',
'DEGREES',
'DES_DECRYPT',
'DES_ENCRYPT',
'ENCRYPT',
'EXP',
'FLOOR',
'FROM_DAYS',
'FROM_UNIXTIME',
'HEX',
'INET_ATON',
'INET_NTOA',
'LENGTH',
'LN',
'LOG',
'LOG10',
'LOG2',
'LOWER',
'MD5',
'NOW',
'OCT',
'OLD_PASSWORD',
'ORD',
'PASSWORD',
'RADIANS',
'RAND',
'REVERSE',
'ROUND',
'SEC_TO_TIME',
'SHA1',
'SOUNDEX',
'SPACE',
'SQRT',
'STDDEV_POP',
'STDDEV_SAMP',
'TAN',
'TIMESTAMP',
'TIME_TO_SEC',
'UNCOMPRESS',
'UNHEX',
'UNIX_TIMESTAMP',
'UPPER',
'USER',
'UTC_DATE',
'UTC_TIME',
'UTC_TIMESTAMP',
'UUID',
'VAR_POP',
'VAR_SAMP',
'YEAR',
);
$cfg['Functions'] = array();
/**
* Which column types will be mapped to which Group?
*
* This variable is filled in data_*.inc.php
*
* @global array $cfg['RestrictColumnTypes']
*/
$cfg['RestrictColumnTypes'] = array(
'TINYINT' => 'FUNC_NUMBER',
'SMALLINT' => 'FUNC_NUMBER',
'MEDIUMINT' => 'FUNC_NUMBER',
'INT' => 'FUNC_NUMBER',
'BIGINT' => 'FUNC_NUMBER',
'DECIMAL' => 'FUNC_NUMBER',
'FLOAT' => 'FUNC_NUMBER',
'DOUBLE' => 'FUNC_NUMBER',
'REAL' => 'FUNC_NUMBER',
'BIT' => 'FUNC_NUMBER',
'BOOLEAN' => 'FUNC_NUMBER',
'SERIAL' => 'FUNC_NUMBER',
'DATE' => 'FUNC_DATE',
'DATETIME' => 'FUNC_DATE',
'TIMESTAMP' => 'FUNC_DATE',
'TIME' => 'FUNC_DATE',
'YEAR' => 'FUNC_DATE',
'CHAR' => 'FUNC_CHAR',
'VARCHAR' => 'FUNC_CHAR',
'TINYTEXT' => 'FUNC_CHAR',
'TEXT' => 'FUNC_CHAR',
'MEDIUMTEXT' => 'FUNC_CHAR',
'LONGTEXT' => 'FUNC_CHAR',
'BINARY' => 'FUNC_CHAR',
'VARBINARY' => 'FUNC_CHAR',
'TINYBLOB' => 'FUNC_CHAR',
'MEDIUMBLOB' => 'FUNC_CHAR',
'BLOB' => 'FUNC_CHAR',
'LONGBLOB' => 'FUNC_CHAR',
'ENUM' => '',
'SET' => '',
'GEOMETRY' => 'FUNC_SPATIAL',
'POINT' => 'FUNC_SPATIAL',
'LINESTRING' => 'FUNC_SPATIAL',
'POLYGON' => 'FUNC_SPATIAL',
'MULTIPOINT' => 'FUNC_SPATIAL',
'MULTILINESTRING' => 'FUNC_SPATIAL',
'MULTIPOLYGON' => 'FUNC_SPATIAL',
'GEOMETRYCOLLECTION' => 'FUNC_SPATIAL',
);
$cfg['RestrictColumnTypes'] = array();
/**
* Map above defined groups to any function
*
* This variable is filled in data_*.inc.php
*
* @global array $cfg['RestrictFunctions']
*/
$cfg['RestrictFunctions'] = array(
'FUNC_CHAR' => array(
'BIN',
'CHAR',
'CURRENT_USER',
'COMPRESS',
'DAYNAME',
'DES_DECRYPT',
'DES_ENCRYPT',
'ENCRYPT',
'HEX',
'INET_NTOA',
'LOWER',
'MD5',
'OLD_PASSWORD',
'PASSWORD',
'REVERSE',
'SHA1',
'SOUNDEX',
'SPACE',
'UNCOMPRESS',
'UNHEX',
'UPPER',
'USER',
'UUID',
),
'FUNC_DATE' => array(
'CURDATE',
'CURTIME',
'DATE',
'FROM_DAYS',
'FROM_UNIXTIME',
'NOW',
'SEC_TO_TIME',
'TIMESTAMP',
'UTC_DATE',
'UTC_TIME',
'UTC_TIMESTAMP',
'YEAR',
),
'FUNC_NUMBER' => array(
'ABS',
'ACOS',
'ASCII',
'ASIN',
'ATAN',
'BIT_LENGTH',
'BIT_COUNT',
'CEILING',
'CHAR_LENGTH',
'COS',
'COT',
'CRC32',
'DEGREES',
'EXP',
'FLOOR',
'INET_ATON',
'LENGTH',
'LN',
'LOG',
'LOG2',
'LOG10',
'OCT',
'ORD',
'RADIANS',
'RAND',
'ROUND',
'SQRT',
'STDDEV_POP',
'STDDEV_SAMP',
'TAN',
'TIME_TO_SEC',
'UNIX_TIMESTAMP',
'VAR_POP',
'VAR_SAMP',
),
'FUNC_SPATIAL' => array(
'GeomFromText',
'GeomFromWKB',
'GeomCollFromText',
'LineFromText',
'MLineFromText',
'PointFromText',
'MPointFromText',
'PolyFromText',
'MPolyFromText',
'GeomCollFromWKB',
'LineFromWKB',
'MLineFromWKB',
'PointFromWKB',
'MPointFromWKB',
'PolyFromWKB',
'MPolyFromWKB',
),
);
$cfg['RestrictFunctions'] = array();
/**
* Default functions for above defined groups
@ -3082,11 +2806,10 @@ if ($cfg['ShowFunctionFields']) {
'FUNC_CHAR' => '',
'FUNC_DATE' => '',
'FUNC_NUMBER' => '',
'FUNC_SPATIAL' => 'GeomFromText',
'first_timestamp' => 'NOW',
'pk_char36' => 'UUID',
);
} // end if
/**

View File

@ -467,10 +467,10 @@ class FormDisplay
}
$this->errors = array();
foreach ($forms as $form) {
foreach ($forms as $form_name) {
/* @var $form Form */
if (isset($this->forms[$form])) {
$form = $this->forms[$form];
if (isset($this->forms[$form_name])) {
$form = $this->forms[$form_name];
} else {
continue;
}

View File

@ -23,6 +23,7 @@ define('PMA_DBI_GETVAR_GLOBAL', 2);
* Checks one of the mysql extensions
*
* @param string $extension mysql extension to check
* @return bool
*/
function PMA_DBI_checkMysqlExtension($extension = 'mysql')
{

View File

@ -65,10 +65,10 @@ function PMA_TableHeader($db_is_information_schema = false, $replication = false
/**
* Creates a clickable column header for table information
*
* @param string title to use for the link
* @param string corresponds to sortable data name mapped in libraries/db_info.inc.php
* @param string initial sort order
* @returns string link to be displayed in the table header
* @param string $title title to use for the link
* @param string $sort corresponds to sortable data name mapped in libraries/db_info.inc.php
* @param string $initial_sort_order
* @return string link to be displayed in the table header
*/
function PMA_SortableTableHeader($title, $sort, $initial_sort_order = 'ASC')
{

View File

@ -1411,11 +1411,19 @@ function PMA_displayTableBody(&$dt_result, &$is_display, $map, $analyzed_sql)
$hide_class = ($col_visib && !$col_visib[$j] &&
// hide per <td> only if the display direction is not vertical
$_SESSION['tmp_user_values']['disp_direction'] != 'vertical') ? 'hide' : '';
// handle datetime-related class, for grid editing
if (substr($meta->type, 0, 9) == 'timestamp' || $meta->type == 'datetime') {
$field_type_class = 'datetimefield';
} else if ($meta->type == 'date') {
$field_type_class = 'datefield';
} else {
$field_type_class = '';
}
$pointer = $i;
$is_field_truncated = false;
//If the previous column had blob data, we need to reset the class
// to $inline_edit_class
$class = 'data ' . $grid_edit_class . ' ' . $not_null_class . ' ' . $relation_class . ' ' . $hide_class; //' ' . $alternating_color_class .
$class = 'data ' . $grid_edit_class . ' ' . $not_null_class . ' ' . $relation_class . ' ' . $hide_class . ' ' . $field_type_class; //' ' . $alternating_color_class .
// See if this column should get highlight because it's used in the
// where-query.
@ -1547,65 +1555,67 @@ function PMA_displayTableBody(&$dt_result, &$is_display, $map, $analyzed_sql)
// Remove 'grid_edit' from $class as we do not allow to inline-edit geometry data.
$class = str_replace('grid_edit', '', $class);
// Display as [GEOMETRY - (size)]
if ('GEOM' == $_SESSION['tmp_user_values']['geometry_display']) {
$geometry_text = PMA_handle_non_printable_contents(
'GEOMETRY', (isset($row[$i]) ? $row[$i] : ''), $transform_function,
$transform_options, $default_function, $meta
);
$vertical_display['data'][$row_no][$i] = PMA_buildValueDisplay(
$class, $condition_field, $geometry_text
);
if (! isset($row[$i]) || is_null($row[$i])) {
$vertical_display['data'][$row_no][$i] = PMA_buildNullDisplay($class, $condition_field);
} elseif ($row[$i] != '') {
// Display as [GEOMETRY - (size)]
if ('GEOM' == $_SESSION['tmp_user_values']['geometry_display']) {
$geometry_text = PMA_handle_non_printable_contents(
'GEOMETRY', (isset($row[$i]) ? $row[$i] : ''), $transform_function,
$transform_options, $default_function, $meta
);
$vertical_display['data'][$row_no][$i] = PMA_buildValueDisplay(
$class, $condition_field, $geometry_text
);
// Display in Well Known Text(WKT) format.
} elseif ('WKT' == $_SESSION['tmp_user_values']['geometry_display']) {
// Convert to WKT format
$wktsql = "SELECT ASTEXT (GeomFromWKB(x'" . PMA_substr(bin2hex($row[$i]), 8) . "'))";
$wktresult = PMA_DBI_try_query($wktsql, null, PMA_DBI_QUERY_STORE);
$wktarr = PMA_DBI_fetch_row($wktresult, 0);
$wktval = $wktarr[0];
@PMA_DBI_free_result($wktresult);
// Display in Well Known Text(WKT) format.
} elseif ('WKT' == $_SESSION['tmp_user_values']['geometry_display']) {
// Convert to WKT format
$wktval = PMA_asWKT($row[$i]);
if (PMA_strlen($wktval) > $GLOBALS['cfg']['LimitChars']
&& $_SESSION['tmp_user_values']['display_text'] == 'P'
) {
$wktval = PMA_substr($wktval, 0, $GLOBALS['cfg']['LimitChars']) . '...';
$is_field_truncated = true;
}
$vertical_display['data'][$row_no][$i] = '<td ' . PMA_prepare_row_data(
$class, $condition_field, $analyzed_sql, $meta, $map, $wktval, $transform_function,
$default_function, $nowrap, $where_comparison, $transform_options, $is_field_truncated
);
// Display in Well Known Binary(WKB) format.
} else {
if ($_SESSION['tmp_user_values']['display_binary']) {
if ($_SESSION['tmp_user_values']['display_binary_as_hex']
&& PMA_contains_nonprintable_ascii($row[$i])
) {
$wkbval = PMA_substr(bin2hex($row[$i]), 8);
} else {
$wkbval = htmlspecialchars(PMA_replace_binary_contents($row[$i]));
}
if (PMA_strlen($wkbval) > $GLOBALS['cfg']['LimitChars']
if (PMA_strlen($wktval) > $GLOBALS['cfg']['LimitChars']
&& $_SESSION['tmp_user_values']['display_text'] == 'P'
) {
$wkbval = PMA_substr($wkbval, 0, $GLOBALS['cfg']['LimitChars']) . '...';
$wktval = PMA_substr($wktval, 0, $GLOBALS['cfg']['LimitChars']) . '...';
$is_field_truncated = true;
}
$vertical_display['data'][$row_no][$i] = '<td ' . PMA_prepare_row_data(
$class, $condition_field, $analyzed_sql, $meta, $map, $wkbval, $transform_function,
$class, $condition_field, $analyzed_sql, $meta, $map, $wktval, $transform_function,
$default_function, $nowrap, $where_comparison, $transform_options, $is_field_truncated
);
// Display in Well Known Binary(WKB) format.
} else {
$wkbval = PMA_handle_non_printable_contents(
'BINARY', $row[$i], $transform_function, $transform_options, $default_function, $meta, $_url_params
);
$vertical_display['data'][$row_no][$i] = PMA_buildValueDisplay($class, $condition_field, $wkbval);
if ($_SESSION['tmp_user_values']['display_binary']) {
if ($_SESSION['tmp_user_values']['display_binary_as_hex']
&& PMA_contains_nonprintable_ascii($row[$i])
) {
$wkbval = PMA_substr(bin2hex($row[$i]), 8);
} else {
$wkbval = htmlspecialchars(PMA_replace_binary_contents($row[$i]));
}
if (PMA_strlen($wkbval) > $GLOBALS['cfg']['LimitChars']
&& $_SESSION['tmp_user_values']['display_text'] == 'P'
) {
$wkbval = PMA_substr($wkbval, 0, $GLOBALS['cfg']['LimitChars']) . '...';
$is_field_truncated = true;
}
$vertical_display['data'][$row_no][$i] = '<td ' . PMA_prepare_row_data(
$class, $condition_field, $analyzed_sql, $meta, $map, $wkbval, $transform_function,
$default_function, $nowrap, $where_comparison, $transform_options, $is_field_truncated
);
} else {
$wkbval = PMA_handle_non_printable_contents(
'BINARY', $row[$i], $transform_function, $transform_options, $default_function, $meta, $_url_params
);
$vertical_display['data'][$row_no][$i] = PMA_buildValueDisplay($class, $condition_field, $wkbval);
}
}
} else {
$vertical_display['data'][$row_no][$i] = PMA_buildEmptyDisplay($class, $condition_field, $meta);
}
// n o t n u m e r i c a n d n o t B L O B

View File

@ -297,8 +297,8 @@ if (isset($plugin_list)) {
/**
* Avoids undefined variables, use NULL so isset() returns false
*/
if (! isset($sql_backquotes)) {
$sql_backquotes = null;
if (! isset($GLOBALS['sql_backquotes'])) {
$GLOBALS['sql_backquotes'] = null;
}
/**

View File

@ -10,9 +10,9 @@
/**
* Returns array of filtered file names
*
* @param string directory to list
* @param string regular expression to match files
* @returns array sorted file list on success, false on failure
* @param string $dir directory to list
* @param string $expression regular expression to match files
* @return array sorted file list on success, false on failure
*/
function PMA_getDirContent($dir, $expression = '')
{
@ -39,10 +39,10 @@ function PMA_getDirContent($dir, $expression = '')
/**
* Returns options of filtered file names
*
* @param string directory to list
* @param string regullar expression to match files
* @param string currently active choice
* @returns array sorted file list on success, false on failure
* @param string $dir directory to list
* @param string $extensions regullar expression to match files
* @param string $active currently active choice
* @return array sorted file list on success, false on failure
*/
function PMA_getFileSelectOptions($dir, $extensions = '', $active = '')
{
@ -64,7 +64,7 @@ function PMA_getFileSelectOptions($dir, $extensions = '', $active = '')
/**
* Get currently supported decompressions.
*
* @returns string | separated list of extensions usable in PMA_getDirContent
* @return string | separated list of extensions usable in PMA_getDirContent
*/
function PMA_supportedDecompressions()
{

View File

@ -20,6 +20,9 @@ class PMA_GIS_Factory
include_once './libraries/gis/pma_gis_geometry.php';
$type_lower = strtolower($type);
if (! file_exists('./libraries/gis/pma_gis_' . $type_lower . '.php')) {
return false;
}
if (include_once './libraries/gis/pma_gis_' . $type_lower . '.php') {
switch($type) {
case 'MULTIPOLYGON' :
@ -37,10 +40,10 @@ class PMA_GIS_Factory
case 'GEOMETRYCOLLECTION' :
return PMA_GIS_Geometrycollection::singleton();
default :
throw new Exception('Unknown GIS data type');
return false;
}
} else {
throw new Exception('File not found');
return false;
}
}
}

View File

@ -67,6 +67,17 @@ abstract class PMA_GIS_Geometry
*/
public abstract function scaleRow($spatial);
/**
* Generate the WKT with the set of parameters passed by the GIS editor.
*
* @param array $gis_data GIS data
* @param int $index Index into the parameter object
* @param string $empty Value for empty points
*
* @return WKT with the set of parameters passed by the GIS editor
*/
public abstract function generateWkt($gis_data, $index, $empty);
/**
* Returns OpenLayers.Bounds object that correspond to the bounds of GIS data.
*
@ -121,6 +132,30 @@ abstract class PMA_GIS_Geometry
return $min_max;
}
/**
* Generate parameters for the GIS data editor from the value of the GIS column.
* This method performs common work.
* More specific work is performed by each of the geom classes.
*
* @param $gis_string $value of the GIS column
*
* @return array parameters for the GIS editor from the value of the GIS column
*/
protected function generateParams($value)
{
$geom_types = '(POINT|MULTIPOINT|LINESTRING|MULTILINESTRING|POLYGON|MULTIPOLYGON|GEOMETRYCOLLECTION)';
$srid = 0;
$wkt = '';
if (preg_match("/^'" . $geom_types . "\(.*\)',[0-9]*$/i", $value)) {
$last_comma = strripos($value, ",");
$srid = trim(substr($value, $last_comma + 1));
$wkt = trim(substr($value, 1, $last_comma - 2));
} elseif (preg_match("/^" . $geom_types . "\(.*\)$/i", $value)) {
$wkt = $value;
}
return array('srid' => $srid, 'wkt' => $wkt);
}
/**
* Extracts points, scales and returns them as an array.
*
@ -141,14 +176,22 @@ abstract class PMA_GIS_Geometry
// Extract cordinates of the point
$cordinates = explode(" ", $point);
if ($scale_data != null) {
$x = ($cordinates[0] - $scale_data['x']) * $scale_data['scale'];
$y = $scale_data['height'] - ($cordinates[1] - $scale_data['y']) * $scale_data['scale'];
if (isset($cordinates[0]) && trim($cordinates[0]) != ''
&& isset($cordinates[1]) && trim($cordinates[1]) != ''
) {
if ($scale_data != null) {
$x = ($cordinates[0] - $scale_data['x']) * $scale_data['scale'];
$y = $scale_data['height'] - ($cordinates[1] - $scale_data['y']) * $scale_data['scale'];
} else {
$x = trim($cordinates[0]);
$y = trim($cordinates[1]);
}
} else {
$x = $cordinates[0];
$y = $cordinates[1];
$x = '';
$y = '';
}
if (! $linear) {
$points_arr[] = array($x, $y);
} else {

View File

@ -53,6 +53,9 @@ class PMA_GIS_Geometrycollection extends PMA_GIS_Geometry
$type = substr($sub_part, 0, $type_pos);
$gis_obj = PMA_GIS_Factory::factory($type);
if (! $gis_obj) {
continue;
}
$scale_data = $gis_obj->scaleRow($sub_part);
// Upadate minimum/maximum values for x and y cordinates.
@ -102,6 +105,9 @@ class PMA_GIS_Geometrycollection extends PMA_GIS_Geometry
$type = substr($sub_part, 0, $type_pos);
$gis_obj = PMA_GIS_Factory::factory($type);
if (! $gis_obj) {
continue;
}
$image = $gis_obj->prepareRowAsPng($sub_part, $label, $color, $scale_data, $image);
}
return $image;
@ -130,6 +136,9 @@ class PMA_GIS_Geometrycollection extends PMA_GIS_Geometry
$type = substr($sub_part, 0, $type_pos);
$gis_obj = PMA_GIS_Factory::factory($type);
if (! $gis_obj) {
continue;
}
$pdf = $gis_obj->prepareRowAsPdf($sub_part, $label, $color, $scale_data, $pdf);
}
return $pdf;
@ -159,6 +168,9 @@ class PMA_GIS_Geometrycollection extends PMA_GIS_Geometry
$type = substr($sub_part, 0, $type_pos);
$gis_obj = PMA_GIS_Factory::factory($type);
if (! $gis_obj) {
continue;
}
$row .= $gis_obj->prepareRowAsSvg($sub_part, $label, $color, $scale_data);
}
return $row;
@ -190,6 +202,9 @@ class PMA_GIS_Geometrycollection extends PMA_GIS_Geometry
$type = substr($sub_part, 0, $type_pos);
$gis_obj = PMA_GIS_Factory::factory($type);
if (! $gis_obj) {
continue;
}
$row .= $gis_obj->prepareRowAsOl($sub_part, $srid, $label, $color, $scale_data);
}
return $row;
@ -222,5 +237,71 @@ class PMA_GIS_Geometrycollection extends PMA_GIS_Geometry
}
return $sub_parts;
}
/**
* Generate the WKT with the set of parameters passed by the GIS editor.
*
* @param array $gis_data GIS data
* @param int $index Index into the parameter object
* @param string $empty Value for empty points
*
* @return WKT with the set of parameters passed by the GIS editor
*/
public function generateWkt($gis_data, $index, $empty = '')
{
$geom_count = (isset($gis_data['GEOMETRYCOLLECTION']['geom_count']))
? $gis_data['GEOMETRYCOLLECTION']['geom_count'] : 1;
$wkt = 'GEOMETRYCOLLECTION(';
for ($i = 0; $i < $geom_count; $i++) {
if (isset($gis_data[$i]['gis_type'])) {
$type = $gis_data[$i]['gis_type'];
$gis_obj = PMA_GIS_Factory::factory($type);
if (! $gis_obj) {
continue;
}
$wkt .= $gis_obj->generateWkt($gis_data, $i, $empty) . ',';
}
}
if (isset($gis_data[0]['gis_type'])) {
$wkt = substr($wkt, 0, strlen($wkt) - 1);
}
$wkt .= ')';
return $wkt;
}
/** Generate parameters for the GIS data editor from the value of the GIS column.
*
* @param string $value of the GIS column
* @param index $index of the geometry
*
* @return parameters for the GIS data editor from the value of the GIS column
*/
public function generateParams($value)
{
$params = array();
$data = PMA_GIS_Geometry::generateParams($value);
$params['srid'] = $data['srid'];
$wkt = $data['wkt'];
// Trim to remove leading 'GEOMETRYCOLLECTION(' and trailing ')'
$goem_col = substr($wkt, 19, (strlen($wkt) - 20));
// Split the geometry collection object to get its constituents.
$sub_parts = $this->_explodeGeomCol($goem_col);
$params['GEOMETRYCOLLECTION']['geom_count'] = count($sub_parts);
$i = 0;
foreach ($sub_parts as $sub_part) {
$type_pos = stripos($sub_part, '(');
$type = substr($sub_part, 0, $type_pos);
$gis_obj = PMA_GIS_Factory::factory($type);
if (! $gis_obj) {
continue;
}
$params = array_merge($params, $gis_obj->generateParams($sub_part, $i));
$i++;
}
return $params;
}
}
?>

View File

@ -59,6 +59,7 @@ class PMA_GIS_Linestring extends PMA_GIS_Geometry
public function prepareRowAsPng($spatial, $label, $line_color, $scale_data, $image)
{
// allocate colors
$black = imagecolorallocate($image, 0, 0, 0);
$red = hexdec(substr($line_color, 1, 2));
$green = hexdec(substr($line_color, 3, 2));
$blue = hexdec(substr($line_color, 4, 2));
@ -77,6 +78,10 @@ class PMA_GIS_Linestring extends PMA_GIS_Geometry
$temp_point = $point;
}
}
// print label if applicable
if (isset($label) && trim($label) != '') {
imagestring($image, 1, $points_arr[1][0], $points_arr[1][1], trim($label), $black);
}
return $image;
}
@ -112,6 +117,12 @@ class PMA_GIS_Linestring extends PMA_GIS_Geometry
$temp_point = $point;
}
}
// print label
if (isset($label) && trim($label) != '') {
$pdf->SetXY($points_arr[1][0], $points_arr[1][1]);
$pdf->SetFontSize(5);
$pdf->Cell(0, 0, trim($label));
}
return $pdf;
}
@ -196,5 +207,70 @@ class PMA_GIS_Linestring extends PMA_GIS_Geometry
. json_encode($style_options) . '));';
return $result;
}
/**
* Generate the WKT with the set of parameters passed by the GIS editor.
*
* @param array $gis_data GIS data
* @param int $index Index into the parameter object
* @param string $empty Value for empty points
*
* @return WKT with the set of parameters passed by the GIS editor
*/
public function generateWkt($gis_data, $index, $empty = '')
{
$no_of_points = isset($gis_data[$index]['LINESTRING']['no_of_points'])
? $gis_data[$index]['LINESTRING']['no_of_points'] : 2;
if ($no_of_points < 2) {
$no_of_points = 2;
}
$wkt = 'LINESTRING(';
for ($i = 0; $i < $no_of_points; $i++) {
$wkt .= ((isset($gis_data[$index]['LINESTRING'][$i]['x'])
&& trim($gis_data[$index]['LINESTRING'][$i]['x']) != '')
? $gis_data[$index]['LINESTRING'][$i]['x'] : $empty)
. ' ' . ((isset($gis_data[$index]['LINESTRING'][$i]['y'])
&& trim($gis_data[$index]['LINESTRING'][$i]['y']) != '')
? $gis_data[$index]['LINESTRING'][$i]['y'] : $empty) .',';
}
$wkt = substr($wkt, 0, strlen($wkt) - 1);
$wkt .= ')';
return $wkt;
}
/**
* Generate parameters for the GIS data editor from the value of the GIS column.
*
* @param string $value of the GIS column
* @param index $index of the geometry
*
* @return parameters for the GIS data editor from the value of the GIS column
*/
public function generateParams($value, $index = -1)
{
if ($index == -1) {
$index = 0;
$params = array();
$data = PMA_GIS_Geometry::generateParams($value);
$params['srid'] = $data['srid'];
$wkt = $data['wkt'];
} else {
$params[$index]['gis_type'] = 'LINESTRING';
$wkt = $value;
}
// Trim to remove leading 'LINESTRING(' and trailing ')'
$linestring = substr($wkt, 11, (strlen($wkt) - 12));
$points_arr = $this->extractPoints($linestring, null);
$no_of_points = count($points_arr);
$params[$index]['LINESTRING']['no_of_points'] = $no_of_points;
for ($i = 0; $i < $no_of_points; $i++) {
$params[$index]['LINESTRING'][$i]['x'] = $points_arr[$i][0];
$params[$index]['LINESTRING'][$i]['y'] = $points_arr[$i][1];
}
return $params;
}
}
?>

View File

@ -68,6 +68,7 @@ class PMA_GIS_Multilinestring extends PMA_GIS_Geometry
public function prepareRowAsPng($spatial, $label, $line_color, $scale_data, $image)
{
// allocate colors
$black = imagecolorallocate($image, 0, 0, 0);
$red = hexdec(substr($line_color, 1, 2));
$green = hexdec(substr($line_color, 3, 2));
$blue = hexdec(substr($line_color, 4, 2));
@ -78,6 +79,7 @@ class PMA_GIS_Multilinestring extends PMA_GIS_Geometry
// Seperate each linestring
$linestirngs = explode("),(", $multilinestirng);
$first_line = true;
foreach ($linestirngs as $linestring) {
$points_arr = $this->extractPoints($linestring, $scale_data);
foreach ($points_arr as $point) {
@ -90,6 +92,11 @@ class PMA_GIS_Multilinestring extends PMA_GIS_Geometry
}
}
unset($temp_point);
// print label if applicable
if (isset($label) && trim($label) != '' && $first_line) {
imagestring($image, 1, $points_arr[1][0], $points_arr[1][1], trim($label), $black);
}
$first_line = false;
}
return $image;
}
@ -118,6 +125,7 @@ class PMA_GIS_Multilinestring extends PMA_GIS_Geometry
// Seperate each linestring
$linestirngs = explode("),(", $multilinestirng);
$first_line = true;
foreach ($linestirngs as $linestring) {
$points_arr = $this->extractPoints($linestring, $scale_data);
foreach ($points_arr as $point) {
@ -130,6 +138,13 @@ class PMA_GIS_Multilinestring extends PMA_GIS_Geometry
}
}
unset($temp_point);
// print label
if (isset($label) && trim($label) != '' && $first_line) {
$pdf->SetXY($points_arr[1][0], $points_arr[1][1]);
$pdf->SetFontSize(5);
$pdf->Cell(0, 0, trim($label));
}
$first_line = false;
}
return $pdf;
}
@ -225,5 +240,109 @@ class PMA_GIS_Multilinestring extends PMA_GIS_Geometry
$row .= ')), null, ' . json_encode($style_options) . '));';
return $row;
}
/**
* Generate the WKT with the set of parameters passed by the GIS editor.
*
* @param array $gis_data GIS data
* @param int $index Index into the parameter object
* @param string $empty Value for empty points
*
* @return WKT with the set of parameters passed by the GIS editor
*/
public function generateWkt($gis_data, $index, $empty = '')
{
$no_of_lines = isset($gis_data[$index]['MULTILINESTRING']['no_of_lines'])
? $gis_data[$index]['MULTILINESTRING']['no_of_lines'] : 1;
if ($no_of_lines < 1) {
$no_of_lines = 1;
}
$wkt = 'MULTILINESTRING(';
for ($i = 0; $i < $no_of_lines; $i++) {
$no_of_points = isset($gis_data[$index]['MULTILINESTRING'][$i]['no_of_points'])
? $gis_data[$index]['MULTILINESTRING'][$i]['no_of_points'] : 2;
if ($no_of_points < 2) {
$no_of_points = 2;
}
$wkt .= '(';
for ($j = 0; $j < $no_of_points; $j++) {
$wkt .= ((isset($gis_data[$index]['MULTILINESTRING'][$i][$j]['x'])
&& trim($gis_data[$index]['MULTILINESTRING'][$i][$j]['x']) != '')
? $gis_data[$index]['MULTILINESTRING'][$i][$j]['x'] : $empty)
. ' ' . ((isset($gis_data[$index]['MULTILINESTRING'][$i][$j]['y'])
&& trim($gis_data[$index]['MULTILINESTRING'][$i][$j]['y']) != '')
? $gis_data[$index]['MULTILINESTRING'][$i][$j]['y'] : $empty) . ',';
}
$wkt = substr($wkt, 0, strlen($wkt) - 1);
$wkt .= '),';
}
$wkt = substr($wkt, 0, strlen($wkt) - 1);
$wkt .= ')';
return $wkt;
}
/**
* Generate the WKT for the data from ESRI shape files.
*
* @param array $row_data GIS data
*
* @return the WKT for the data from ESRI shape files
*/
public function getShape($row_data)
{
$wkt = 'MULTILINESTRING(';
for ($i = 0; $i < $row_data['numparts']; $i++) {
$wkt .= '(';
foreach ($row_data['parts'][$i]['points'] as $point) {
$wkt .= $point['x'] . ' ' . $point['y'] . ',';
}
$wkt = substr($wkt, 0, strlen($wkt) - 1);
$wkt .= '),';
}
$wkt = substr($wkt, 0, strlen($wkt) - 1);
$wkt .= ')';
return $wkt;
}
/**
* Generate parameters for the GIS data editor from the value of the GIS column.
*
* @param string $value of the GIS column
* @param index $index of the geometry
*
* @return parameters for the GIS data editor from the value of the GIS column
*/
public function generateParams($value, $index = -1)
{
if ($index == -1) {
$index = 0;
$params = array();
$data = PMA_GIS_Geometry::generateParams($value);
$params['srid'] = $data['srid'];
$wkt = $data['wkt'];
} else {
$params[$index]['gis_type'] = 'MULTILINESTRING';
$wkt = $value;
}
// Trim to remove leading 'MULTILINESTRING((' and trailing '))'
$multilinestirng = substr($wkt, 17, (strlen($wkt) - 19));
// Seperate each linestring
$linestirngs = explode("),(", $multilinestirng);
$params[$index]['MULTILINESTRING']['no_of_lines'] = count($linestirngs);
$j = 0;
foreach ($linestirngs as $linestring) {
$points_arr = $this->extractPoints($linestring, null);
$no_of_points = count($points_arr);
$params[$index]['MULTILINESTRING'][$j]['no_of_points'] = $no_of_points;
for ($i = 0; $i < $no_of_points; $i++) {
$params[$index]['MULTILINESTRING'][$j][$i]['x'] = $points_arr[$i][0];
$params[$index]['MULTILINESTRING'][$j][$i]['y'] = $points_arr[$i][1];
}
$j++;
}
return $params;
}
}
?>

View File

@ -59,6 +59,7 @@ class PMA_GIS_Multipoint extends PMA_GIS_Geometry
public function prepareRowAsPng($spatial, $label, $point_color, $scale_data, $image)
{
// allocate colors
$black = imagecolorallocate($image, 0, 0, 0);
$red = hexdec(substr($point_color, 1, 2));
$green = hexdec(substr($point_color, 3, 2));
$blue = hexdec(substr($point_color, 4, 2));
@ -70,7 +71,15 @@ class PMA_GIS_Multipoint extends PMA_GIS_Geometry
foreach ($points_arr as $point) {
// draw a small circle to mark the point
imagearc($image, $point[0], $point[1], 7, 7, 0, 360, $color);
if ($point[0] != '' && $point[1] != '') {
imagearc($image, $point[0], $point[1], 7, 7, 0, 360, $color);
}
}
// print label for each point
if ((isset($label) && trim($label) != '')
&& ($points_arr[0][0] != '' && $points_arr[0][1] != '')
) {
imagestring($image, 1, $points_arr[0][0], $points_arr[0][1], trim($label), $black);
}
return $image;
}
@ -100,7 +109,17 @@ class PMA_GIS_Multipoint extends PMA_GIS_Geometry
foreach ($points_arr as $point) {
// draw a small circle to mark the point
$pdf->Circle($point[0], $point[1], 2, 0, 360, 'D', $line);
if ($point[0] != '' && $point[1] != '') {
$pdf->Circle($point[0], $point[1], 2, 0, 360, 'D', $line);
}
}
// print label for each point
if ((isset($label) && trim($label) != '')
&& ($points_arr[0][0] != '' && $points_arr[0][1] != '')
) {
$pdf->SetXY($points_arr[0][0], $points_arr[0][1]);
$pdf->SetFontSize(5);
$pdf->Cell(0, 0, trim($label));
}
return $pdf;
}
@ -131,12 +150,14 @@ class PMA_GIS_Multipoint extends PMA_GIS_Geometry
$row = '';
foreach ($points_arr as $point) {
$row .= '<circle cx="' . $point[0] . '" cy="' . $point[1] . '" r="3"';
$point_options['id'] = $label . rand();
foreach ($point_options as $option => $val) {
$row .= ' ' . $option . '="' . trim($val) . '"';
if ($point[0] != '' && $point[1] != '') {
$row .= '<circle cx="' . $point[0] . '" cy="' . $point[1] . '" r="3"';
$point_options['id'] = $label . rand();
foreach ($point_options as $option => $val) {
$row .= ' ' . $option . '="' . trim($val) . '"';
}
$row .= '/>';
}
$row .= '/>';
}
return $row;
@ -176,11 +197,15 @@ class PMA_GIS_Multipoint extends PMA_GIS_Geometry
$row = 'new Array(';
foreach ($points_arr as $point) {
$row .= '(new OpenLayers.Geometry.Point(' . $point[0] . ', ' . $point[1]
. ')).transform(new OpenLayers.Projection("EPSG:' . $srid
. '"), map.getProjectionObject()), ';
if ($point[0] != '' && $point[1] != '') {
$row .= '(new OpenLayers.Geometry.Point(' . $point[0] . ', ' . $point[1]
. ')).transform(new OpenLayers.Projection("EPSG:' . $srid
. '"), map.getProjectionObject()), ';
}
}
if (substr($row, strlen($row) - 2) == ', ') {
$row = substr($row, 0, strlen($row) - 2);
}
$row = substr($row, 0, strlen($row) - 2);
$row .= ')';
$result .= 'vectorLayer.addFeatures(new OpenLayers.Feature.Vector('
@ -188,5 +213,88 @@ class PMA_GIS_Multipoint extends PMA_GIS_Geometry
. json_encode($style_options) . '));';
return $result;
}
/**
* Generate the WKT with the set of parameters passed by the GIS editor.
*
* @param array $gis_data GIS data
* @param int $index Index into the parameter object
* @param string $empty Multipoint does not adhere to this
*
* @return WKT with the set of parameters passed by the GIS editor
*/
public function generateWkt($gis_data, $index, $empty = '')
{
$no_of_points = isset($gis_data[$index]['MULTIPOINT']['no_of_points'])
? $gis_data[$index]['MULTIPOINT']['no_of_points'] : 1;
if ($no_of_points < 1) {
$no_of_points = 1;
}
$wkt = 'MULTIPOINT(';
for ($i = 0; $i < $no_of_points; $i++) {
$wkt .= ((isset($gis_data[$index]['MULTIPOINT'][$i]['x'])
&& trim($gis_data[$index]['MULTIPOINT'][$i]['x']) != '')
? $gis_data[$index]['MULTIPOINT'][$i]['x'] : '')
. ' ' . ((isset($gis_data[$index]['MULTIPOINT'][$i]['y'])
&& trim($gis_data[$index]['MULTIPOINT'][$i]['y']) != '')
? $gis_data[$index]['MULTIPOINT'][$i]['y'] : '') . ',';
}
$wkt = substr($wkt, 0, strlen($wkt) - 1);
$wkt .= ')';
return $wkt;
}
/**
* Generate the WKT for the data from ESRI shape files.
*
* @param array $row_data GIS data
*
* @return the WKT for the data from ESRI shape files
*/
public function getShape($row_data)
{
$wkt = 'MULTIPOINT(';
for ($i = 0; $i < $row_data['numpoints']; $i++) {
$wkt .= $row_data['points'][$i]['x'] . ' ' . $row_data['points'][$i]['y'] . ',';
}
$wkt = substr($wkt, 0, strlen($wkt) - 1);
$wkt .= ')';
return $wkt;
}
/**
* Generate parameters for the GIS data editor from the value of the GIS column.
*
* @param string $value of the GIS column
* @param index $index of the geometry
*
* @return parameters for the GIS data editor from the value of the GIS column
*/
public function generateParams($value, $index = -1)
{
if ($index == -1) {
$index = 0;
$params = array();
$data = PMA_GIS_Geometry::generateParams($value);
$params['srid'] = $data['srid'];
$wkt = $data['wkt'];
} else {
$params[$index]['gis_type'] = 'MULTIPOINT';
$wkt = $value;
}
// Trim to remove leading 'MULTIPOINT(' and trailing ')'
$points = substr($wkt, 11, (strlen($wkt) - 12));
$points_arr = $this->extractPoints($points, null);
$no_of_points = count($points_arr);
$params[$index]['MULTIPOINT']['no_of_points'] = $no_of_points;
for ($i = 0; $i < $no_of_points; $i++) {
$params[$index]['MULTIPOINT'][$i]['x'] = $points_arr[$i][0];
$params[$index]['MULTIPOINT'][$i]['y'] = $points_arr[$i][1];
}
return $params;
}
}
?>

View File

@ -82,6 +82,7 @@ class PMA_GIS_Multipolygon extends PMA_GIS_Geometry
public function prepareRowAsPng($spatial, $label, $fill_color, $scale_data, $image)
{
// allocate colors
$black = imagecolorallocate($image, 0, 0, 0);
$red = hexdec(substr($fill_color, 1, 2));
$green = hexdec(substr($fill_color, 3, 2));
$blue = hexdec(substr($fill_color, 4, 2));
@ -92,6 +93,7 @@ class PMA_GIS_Multipolygon extends PMA_GIS_Geometry
// Seperate each polygon
$polygons = explode(")),((", $multipolygon);
$first_poly = true;
foreach ($polygons as $polygon) {
// If the polygon doesnt have an inner polygon
if (strpos($polygon, "),(") === false) {
@ -112,6 +114,15 @@ class PMA_GIS_Multipolygon extends PMA_GIS_Geometry
}
// draw polygon
imagefilledpolygon($image, $points_arr, sizeof($points_arr) / 2, $color);
// mark label point if applicable
if (isset($label) && trim($label) != '' && $first_poly) {
$label_point = array($points_arr[2], $points_arr[3]);
}
$first_poly = false;
}
// print label if applicable
if (isset($label_point)) {
imagestring($image, 1, $points_arr[2], $points_arr[3], trim($label), $black);
}
return $image;
}
@ -140,6 +151,7 @@ class PMA_GIS_Multipolygon extends PMA_GIS_Geometry
// Seperate each polygon
$polygons = explode(")),((", $multipolygon);
$first_poly = true;
foreach ($polygons as $polygon) {
// If the polygon doesnt have an inner polygon
if (strpos($polygon, "),(") === false) {
@ -161,6 +173,18 @@ class PMA_GIS_Multipolygon extends PMA_GIS_Geometry
}
// draw polygon
$pdf->Polygon($points_arr, 'F*', array(), $color, true);
// mark label point if applicable
if (isset($label) && trim($label) != '' && $first_poly) {
$label_point = array($points_arr[2], $points_arr[3]);
}
$first_poly = false;
}
// print label if applicable
if (isset($label_point)) {
$pdf->SetXY($label_point[0], $label_point[1]);
$pdf->SetFontSize(5);
$pdf->Cell(0, 0, trim($label));
}
return $pdf;
}
@ -287,5 +311,190 @@ class PMA_GIS_Multipolygon extends PMA_GIS_Geometry
return $row;
}
/**
* Generate the WKT with the set of parameters passed by the GIS editor.
*
* @param array $gis_data GIS data
* @param int $index Index into the parameter object
* @param string $empty Value for empty points
*
* @return WKT with the set of parameters passed by the GIS editor
*/
public function generateWkt($gis_data, $index, $empty = '')
{
$no_of_polygons = isset($gis_data[$index]['MULTIPOLYGON']['no_of_polygons'])
? $gis_data[$index]['MULTIPOLYGON']['no_of_polygons'] : 1;
if ($no_of_polygons < 1) {
$no_of_polygons = 1;
}
$wkt = 'MULTIPOLYGON(';
for ($k = 0; $k < $no_of_polygons; $k++) {
$no_of_lines = isset($gis_data[$index]['MULTIPOLYGON'][$k]['no_of_lines'])
? $gis_data[$index]['MULTIPOLYGON'][$k]['no_of_lines'] : 1;
if ($no_of_lines < 1) {
$no_of_lines = 1;
}
$wkt .= '(';
for ($i = 0; $i < $no_of_lines; $i++) {
$no_of_points = isset($gis_data[$index]['MULTIPOLYGON'][$k][$i]['no_of_points'])
? $gis_data[$index]['MULTIPOLYGON'][$k][$i]['no_of_points'] : 4;
if ($no_of_points < 4) {
$no_of_points = 4;
}
$wkt .= '(';
for ($j = 0; $j < $no_of_points; $j++) {
$wkt .= ((isset($gis_data[$index]['MULTIPOLYGON'][$k][$i][$j]['x'])
&& trim($gis_data[$index]['MULTIPOLYGON'][$k][$i][$j]['x']) != '')
? $gis_data[$index]['MULTIPOLYGON'][$k][$i][$j]['x'] : $empty)
. ' ' . ((isset($gis_data[$index]['MULTIPOLYGON'][$k][$i][$j]['y'])
&& trim($gis_data[$index]['MULTIPOLYGON'][$k][$i][$j]['y']) != '')
? $gis_data[$index]['MULTIPOLYGON'][$k][$i][$j]['y'] : $empty) .',';
}
$wkt = substr($wkt, 0, strlen($wkt) - 1);
$wkt .= '),';
}
$wkt = substr($wkt, 0, strlen($wkt) - 1);
$wkt .= '),';
}
$wkt = substr($wkt, 0, strlen($wkt) - 1);
$wkt .= ')';
return $wkt;
}
/**
* Generate the WKT for the data from ESRI shape files.
*
* @param array $row_data GIS data
*
* @return the WKT for the data from ESRI shape files
*/
public function getShape($row_data)
{
// Determines whether each line ring is an inner ring or an outer ring.
// If it's an inner ring get a point on the surface which can be used to
// correctly classify inner rings to their respective outer rings.
require_once './libraries/gis/pma_gis_polygon.php';
foreach ($row_data['parts'] as $i => $ring) {
$row_data['parts'][$i]['isOuter'] = PMA_GIS_Polygon::isOuterRing($ring['points']);
}
// Find points on surface for inner rings
foreach ($row_data['parts'] as $i => $ring) {
if (! $ring['isOuter']) {
$row_data['parts'][$i]['pointOnSurface'] = PMA_GIS_Polygon::getPointOnSurface($ring['points']);
}
}
// Classify inner rings to their respective outer rings.
foreach ($row_data['parts'] as $j => $ring1) {
if (! $ring1['isOuter']) {
foreach ($row_data['parts'] as $k => $ring2) {
if ($ring2['isOuter']) {
// If the pointOnSurface of the inner ring is also inside the outer ring
if (PMA_GIS_Polygon::isPointInsidePolygon($ring1['pointOnSurface'], $ring2['points'])) {
if (! isset($ring2['inner'])) {
$row_data['parts'][$k]['inner'] = array();
}
$row_data['parts'][$k]['inner'][] = $j;
}
}
}
}
}
$wkt = 'MULTIPOLYGON(';
// for each polygon
foreach ($row_data['parts'] as $ring) {
if ($ring['isOuter']) {
$wkt .= '('; // start of polygon
$wkt .= '('; // start of outer ring
foreach($ring['points'] as $point) {
$wkt .= $point['x'] . ' ' . $point['y'] . ',';
}
$wkt = substr($wkt, 0, strlen($wkt) - 1);
$wkt .= ')'; // end of outer ring
// inner rings if any
if (isset($ring['inner'])) {
foreach ($ring['inner'] as $j) {
$wkt .= ',('; // start of inner ring
foreach ($row_data['parts'][$j]['points'] as $innerPoint) {
$wkt .= $innerPoint['x'] . ' ' . $innerPoint['y'] . ',';
}
$wkt = substr($wkt, 0, strlen($wkt) - 1);
$wkt .= ')'; // end of inner ring
}
}
$wkt .= '),'; // end of polygon
}
}
$wkt = substr($wkt, 0, strlen($wkt) - 1);
$wkt .= ')'; // end of multipolygon
return $wkt;
}
/**
* Generate parameters for the GIS data editor from the value of the GIS column.
*
* @param string $value of the GIS column
* @param index $index of the geometry
*
* @return parameters for the GIS data editor from the value of the GIS column
*/
public function generateParams($value, $index = -1)
{
if ($index == -1) {
$index = 0;
$params = array();
$data = PMA_GIS_Geometry::generateParams($value);
$params['srid'] = $data['srid'];
$wkt = $data['wkt'];
} else {
$params[$index]['gis_type'] = 'MULTIPOLYGON';
$wkt = $value;
}
// Trim to remove leading 'MULTIPOLYGON(((' and trailing ')))'
$multipolygon = substr($wkt, 15, (strlen($wkt) - 18));
// Seperate each polygon
$polygons = explode(")),((", $multipolygon);
$params[$index]['MULTIPOLYGON']['no_of_polygons'] = count($polygons);
$k = 0;
foreach ($polygons as $polygon) {
// If the polygon doesnt have an inner polygon
if (strpos($polygon, "),(") === false) {
$params[$index]['MULTIPOLYGON'][$k]['no_of_lines'] = 1;
$points_arr = $this->extractPoints($polygon, null);
$no_of_points = count($points_arr);
$params[$index]['MULTIPOLYGON'][$k][0]['no_of_points'] = $no_of_points;
for ($i = 0; $i < $no_of_points; $i++) {
$params[$index]['MULTIPOLYGON'][$k][0][$i]['x'] = $points_arr[$i][0];
$params[$index]['MULTIPOLYGON'][$k][0][$i]['y'] = $points_arr[$i][1];
}
} else {
// Seperate outer and inner polygons
$parts = explode("),(", $polygon);
$params[$index]['MULTIPOLYGON'][$k]['no_of_lines'] = count($parts);
$j = 0;
foreach ($parts as $ring) {
$points_arr = $this->extractPoints($ring, null);
$no_of_points = count($points_arr);
$params[$index]['MULTIPOLYGON'][$k][$j]['no_of_points'] = $no_of_points;
for ($i = 0; $i < $no_of_points; $i++) {
$params[$index]['MULTIPOLYGON'][$k][$j][$i]['x'] = $points_arr[$i][0];
$params[$index]['MULTIPOLYGON'][$k][$j][$i]['y'] = $points_arr[$i][1];
}
$j++;
}
}
$k++;
}
return $params;
}
}
?>

View File

@ -59,6 +59,7 @@ class PMA_GIS_Point extends PMA_GIS_Geometry
public function prepareRowAsPng($spatial, $label, $point_color, $scale_data, $image)
{
// allocate colors
$black = imagecolorallocate($image, 0, 0, 0);
$red = hexdec(substr($point_color, 1, 2));
$green = hexdec(substr($point_color, 3, 2));
$blue = hexdec(substr($point_color, 4, 2));
@ -69,7 +70,13 @@ class PMA_GIS_Point extends PMA_GIS_Geometry
$points_arr = $this->extractPoints($point, $scale_data);
// draw a small circle to mark the point
imagearc($image, $points_arr[0][0], $points_arr[0][1], 7, 7, 0, 360, $color);
if ($points_arr[0][0] != '' && $points_arr[0][1] != '') {
imagearc($image, $points_arr[0][0], $points_arr[0][1], 7, 7, 0, 360, $color);
// print label if applicable
if (isset($label) && trim($label) != '') {
imagestring($image, 1, $points_arr[0][0], $points_arr[0][1], trim($label), $black);
}
}
return $image;
}
@ -97,7 +104,15 @@ class PMA_GIS_Point extends PMA_GIS_Geometry
$points_arr = $this->extractPoints($point, $scale_data);
// draw a small circle to mark the point
$pdf->Circle($points_arr[0][0], $points_arr[0][1], 2, 0, 360, 'D', $line);
if ($points_arr[0][0] != '' && $points_arr[0][1] != '') {
$pdf->Circle($points_arr[0][0], $points_arr[0][1], 2, 0, 360, 'D', $line);
// print label if applicable
if (isset($label) && trim($label) != '') {
$pdf->SetXY($points_arr[0][0], $points_arr[0][1]);
$pdf->SetFontSize(5);
$pdf->Cell(0, 0, trim($label));
}
}
return $pdf;
}
@ -126,11 +141,14 @@ class PMA_GIS_Point extends PMA_GIS_Geometry
$point = substr($spatial, 6, (strlen($spatial) - 7));
$points_arr = $this->extractPoints($point, $scale_data);
$row = '<circle cx="' . $points_arr[0][0] . '" cy="' . $points_arr[0][1] . '" r="3"';
foreach ($point_options as $option => $val) {
$row .= ' ' . $option . '="' . trim($val) . '"';
$row = '';
if ($points_arr[0][0] != '' && $points_arr[0][1] != '') {
$row .= '<circle cx="' . $points_arr[0][0] . '" cy="' . $points_arr[0][1] . '" r="3"';
foreach ($point_options as $option => $val) {
$row .= ' ' . $option . '="' . trim($val) . '"';
}
$row .= '/>';
}
$row .= '/>';
return $row;
}
@ -167,12 +185,76 @@ class PMA_GIS_Point extends PMA_GIS_Geometry
$point = substr($spatial, 6, (strlen($spatial) - 7));
$points_arr = $this->extractPoints($point, null);
$result .= 'vectorLayer.addFeatures(new OpenLayers.Feature.Vector(('
. 'new OpenLayers.Geometry.Point(' . $points_arr[0][0] . ', '
. $points_arr[0][1] . ').transform(new OpenLayers.Projection("EPSG:'
. $srid . '"), map.getProjectionObject())), null, '
. json_encode($style_options) . '));';
if ($points_arr[0][0] != '' && $points_arr[0][1] != '') {
$result .= 'vectorLayer.addFeatures(new OpenLayers.Feature.Vector(('
. 'new OpenLayers.Geometry.Point(' . $points_arr[0][0] . ', '
. $points_arr[0][1] . ').transform(new OpenLayers.Projection("EPSG:'
. $srid . '"), map.getProjectionObject())), null, '
. json_encode($style_options) . '));';
}
return $result;
}
/**
* Generate the WKT with the set of parameters passed by the GIS editor.
*
* @param array $gis_data GIS data
* @param int $index Index into the parameter object
* @param string $empty Point deos not adhere to this parameter
*
* @return WKT with the set of parameters passed by the GIS editor
*/
public function generateWkt($gis_data, $index, $empty = '')
{
return 'POINT('
. ((isset($gis_data[$index]['POINT']['x']) && trim($gis_data[$index]['POINT']['x']) != '')
? $gis_data[$index]['POINT']['x'] : '') . ' '
. ((isset($gis_data[$index]['POINT']['y']) && trim($gis_data[$index]['POINT']['y']) != '')
? $gis_data[$index]['POINT']['y'] : '') . ')';
}
/**
* Generate the WKT for the data from ESRI shape files.
*
* @param array $row_data GIS data
*
* @return the WKT for the data from ESRI shape files
*/
public function getShape($row_data)
{
return 'POINT(' . (isset($row_data['x']) ? $row_data['x'] : '')
. ' ' . (isset($row_data['y']) ? $row_data['y'] : '') . ')';
}
/**
* Generate parameters for the GIS data editor from the value of the GIS column.
*
* @param string $value of the GIS column
* @param index $index of the geometry
*
* @return parameters for the GIS data editor from the value of the GIS column
*/
public function generateParams($value, $index = -1)
{
if ($index == -1) {
$index = 0;
$params = array();
$data = PMA_GIS_Geometry::generateParams($value);
$params['srid'] = $data['srid'];
$wkt = $data['wkt'];
} else {
$params[$index]['gis_type'] = 'POINT';
$wkt = $value;
}
// Trim to remove leading 'POINT(' and trailing ')'
$point = substr($wkt, 6, (strlen($wkt) - 7));
$points_arr = $this->extractPoints($point, null);
$params[$index]['POINT']['x'] = $points_arr[0][0];
$params[$index]['POINT']['y'] = $points_arr[0][1];
return $params;
}
}
?>

View File

@ -77,6 +77,7 @@ class PMA_GIS_Polygon extends PMA_GIS_Geometry
public function prepareRowAsPng($spatial, $label, $fill_color, $scale_data, $image)
{
// allocate colors
$black = imagecolorallocate($image, 0, 0, 0);
$red = hexdec(substr($fill_color, 1, 2));
$green = hexdec(substr($fill_color, 3, 2));
$blue = hexdec(substr($fill_color, 4, 2));
@ -105,6 +106,10 @@ class PMA_GIS_Polygon extends PMA_GIS_Geometry
// draw polygon
imagefilledpolygon($image, $points_arr, sizeof($points_arr) / 2, $color);
// print label if applicable
if (isset($label) && trim($label) != '') {
imagestring($image, 1, $points_arr[2], $points_arr[3], trim($label), $black);
}
return $image;
}
@ -150,6 +155,12 @@ class PMA_GIS_Polygon extends PMA_GIS_Geometry
// draw polygon
$pdf->Polygon($points_arr, 'F*', array(), $color, true);
// print label if applicable
if (isset($label) && trim($label) != '') {
$pdf->SetXY($points_arr[2], $points_arr[3]);
$pdf->SetFontSize(5);
$pdf->Cell(0, 0, trim($label));
}
return $pdf;
}
@ -262,5 +273,248 @@ class PMA_GIS_Polygon extends PMA_GIS_Geometry
return $row;
}
/**
* Generate the WKT with the set of parameters passed by the GIS editor.
*
* @param array $gis_data GIS data
* @param int $index Index into the parameter object
* @param string $empty Value for empty points
*
* @return WKT with the set of parameters passed by the GIS editor
*/
public function generateWkt($gis_data, $index, $empty = '')
{
$no_of_lines = isset($gis_data[$index]['POLYGON']['no_of_lines'])
? $gis_data[$index]['POLYGON']['no_of_lines'] : 1;
if ($no_of_lines < 1) {
$no_of_lines = 1;
}
$wkt = 'POLYGON(';
for ($i = 0; $i < $no_of_lines; $i++) {
$no_of_points = isset($gis_data[$index]['POLYGON'][$i]['no_of_points'])
? $gis_data[$index]['POLYGON'][$i]['no_of_points'] : 4;
if ($no_of_points < 4) {
$no_of_points = 4;
}
$wkt .= '(';
for ($j = 0; $j < $no_of_points; $j++) {
$wkt .= ((isset($gis_data[$index]['POLYGON'][$i][$j]['x'])
&& trim($gis_data[$index]['POLYGON'][$i][$j]['x']) != '')
? $gis_data[$index]['POLYGON'][$i][$j]['x'] : $empty)
. ' ' . ((isset($gis_data[$index]['POLYGON'][$i][$j]['y'])
&& trim($gis_data[$index]['POLYGON'][$i][$j]['y']) != '')
? $gis_data[$index]['POLYGON'][$i][$j]['y'] : $empty) .',';
}
$wkt = substr($wkt, 0, strlen($wkt) - 1);
$wkt .= '),';
}
$wkt = substr($wkt, 0, strlen($wkt) - 1);
$wkt .= ')';
return $wkt;
}
/**
* Calculates the area of a closed simple polygon.
*
* @param array $ring array of points forming the ring
*
* @return the area of a closed simple polygon.
*/
public static function area($ring)
{
$no_of_points = count($ring);
// If the last point is same as the first point ignore it
$last = count($ring) - 1;
if (($ring[0]['x'] == $ring[$last]['x'])
&& ($ring[0]['y'] == $ring[$last]['y'])
) {
$no_of_points--;
}
// _n-1
// A = _1_ \ (X(i) * Y(i+1)) - (Y(i) * X(i+1))
// 2 /__
// i=0
$area = 0;
for ($i = 0; $i < $no_of_points; $i++) {
$j = ($i + 1) % $no_of_points;
$area += $ring[$i]['x'] * $ring[$j]['y'];
$area -= $ring[$i]['y'] * $ring[$j]['x'];
}
$area /= 2.0;
return $area;
}
/**
* Determines whether a set of points represents an outer ring.
* If points are in clockwise orientation then, they form an outer ring.
*
* @param array $ring array of points forming the ring
*
* @return whether a set of points represents an outer ring.
*/
public static function isOuterRing($ring)
{
// If area is negative then it's in clockwise orientation,
// i.e. it's an outer ring
if (PMA_GIS_Polygon::area($ring) < 0) {
return true;
}
return false;
}
/**
* Determines whether a given point is inside a given polygon.
*
* @param array $point x, y coordinates of the point
* @param array $polygon array of points forming the ring
*
* @return whether a given point is inside a given polygon
*/
public static function isPointInsidePolygon($point, $polygon)
{
// If first point is repeated at the end remove it
$last = count($polygon) - 1;
if (($polygon[0]['x'] == $polygon[$last]['x'])
&& ($polygon[0]['y'] == $polygon[$last]['y'])
) {
$polygon = array_slice($polygon, 0, $last);
}
$no_of_points = count($polygon);
$counter = 0;
// Use ray casting algorithm
$p1 = $polygon[0];
for ($i = 1; $i <= $no_of_points; $i++) {
$p2 = $polygon[$i % $no_of_points];
if ($point['y'] > min(array($p1['y'], $p2['y']))) {
if ($point['y'] <= max(array($p1['y'], $p2['y']))) {
if ($point['x'] <= max(array($p1['x'], $p2['x']))) {
if ($p1['y'] != $p2['y']) {
$xinters = ($point['y'] - $p1['y'])
* ($p2['x'] - $p1['x'])
/ ($p2['y'] - $p1['y']) + $p1['x'];
if ($p1['x'] == $p2['x'] || $point['x'] <= $xinters) {
$counter++;
}
}
}
}
}
$p1 = $p2;
}
if ($counter % 2 == 0) {
return false;
} else {
return true;
}
}
/**
* Returns a point that is guaranteed to be on the surface of the ring.
* (for simple closed rings)
*
* @param array $ring array of points forming the ring
*
* @return a point on the surface of the ring
*/
public static function getPointOnSurface($ring)
{
// Find two consecutive distinct points.
for ($i = 0; $i < count($ring) - 1; $i++) {
if ($ring[$i]['y'] != $ring[$i + 1]['y']) {
$x0 = $ring[$i]['x'];
$x1 = $ring[$i + 1]['x'];
$y0 = $ring[$i]['y'];
$y1 = $ring[$i + 1]['y'];
break;
}
}
if (! isset($x0)) {
return false;
}
// Find the mid point
$x2 = ($x0 + $x1) / 2;
$y2 = ($y0 + $y1) / 2;
// Always keep $epsilon < 1 to go with the reduction logic down here
$epsilon = 0.1;
$denominator = sqrt(pow(($y1 - $y0), 2) + pow(($x0 - $x1), 2));
$pointA = array(); $pointB = array();
while (true) {
// Get the points on either sides of the line
// with a distance of epsilon to the mid point
$pointA['x'] = $x2 + ($epsilon * ($y1 - $y0)) / $denominator;
$pointA['y'] = $y2 + ($pointA['x'] - $x2) * ($x0 - $x1) / ($y1 - $y0);
$pointB['x'] = $x2 + ($epsilon * ($y1 - $y0)) / (0 - $denominator);
$pointB['y'] = $y2 + ($pointB['x'] - $x2) * ($x0 - $x1) / ($y1 - $y0);
// One of the points should be inside the polygon,
// unless epcilon chosen is too large
if (PMA_GIS_Polygon::isPointInsidePolygon($pointA, $ring)) {
return $pointA;
} elseif (PMA_GIS_Polygon::isPointInsidePolygon($pointB, $ring)) {
return $pointB;
} else {
//If both are outside the polygon reduce the epsilon and
//recalculate the points(reduce exponentially for faster convergance)
$epsilon = pow($epsilon, 2);
if ($epsilon == 0) {
return false;
}
}
}
}
/** Generate parameters for the GIS data editor from the value of the GIS column.
*
* @param string $value of the GIS column
* @param index $index of the geometry
*
* @return parameters for the GIS data editor from the value of the GIS column
*/
public function generateParams($value, $index = -1)
{
if ($index == -1) {
$index = 0;
$params = array();
$data = PMA_GIS_Geometry::generateParams($value);
$params['srid'] = $data['srid'];
$wkt = $data['wkt'];
} else {
$params[$index]['gis_type'] = 'POLYGON';
$wkt = $value;
}
// Trim to remove leading 'POLYGON((' and trailing '))'
$polygon = substr($wkt, 9, (strlen($wkt) - 11));
// Seperate each linestring
$linerings = explode("),(", $polygon);
$params[$index]['POLYGON']['no_of_lines'] = count($linerings);
$j = 0;
foreach ($linerings as $linering) {
$points_arr = $this->extractPoints($linering, null);
$no_of_points = count($points_arr);
$params[$index]['POLYGON'][$j]['no_of_points'] = $no_of_points;
for ($i = 0; $i < $no_of_points; $i++) {
$params[$index]['POLYGON'][$j][$i]['x'] = $points_arr[$i][0];
$params[$index]['POLYGON'][$j][$i]['y'] = $points_arr[$i][1];
}
$j++;
}
return $params;
}
}
?>

View File

@ -18,15 +18,14 @@ class PMA_GIS_Visualization
// Array of colors to be used for GIS visualizations.
'colors' => array(
'#BCE02E',
'#B02EE0',
'#E0642E',
'#E0D62E',
'#2E97E0',
'#B02EE0',
'#BCE02E',
'#E02E75',
'#5CE02E',
'#E0B02E',
'#000000',
'#0022E0',
'#726CB1',
'#481A36',
@ -153,7 +152,7 @@ class PMA_GIS_Visualization
$output .= '<g id="groupPanel">';
$scale_data = $this->_scaleDataSet($this->_data);
$output .= $this->_prepareDataSet($this->_data, 0, $scale_data, 'svg', '');
$output .= $this->_prepareDataSet($this->_data, $scale_data, 'svg', '');
$output .= '</g>';
$output .= '</svg>';
@ -206,7 +205,7 @@ class PMA_GIS_Visualization
);
$scale_data = $this->_scaleDataSet($this->_data);
$image = $this->_prepareDataSet($this->_data, 0, $scale_data, 'png', $image);
$image = $this->_prepareDataSet($this->_data, $scale_data, 'png', $image);
return $image;
}
@ -256,7 +255,33 @@ class PMA_GIS_Visualization
{
$this->init();
$scale_data = $this->_scaleDataSet($this->_data);
$output = $this->_prepareDataSet($this->_data, 0, $scale_data, 'ol', '');
$output =
'var options = {'
. 'projection: new OpenLayers.Projection("EPSG:900913"),'
. 'displayProjection: new OpenLayers.Projection("EPSG:4326"),'
. 'units: "m",'
. 'numZoomLevels: 18,'
. 'maxResolution: 156543.0339,'
. 'maxExtent: new OpenLayers.Bounds(-20037508, -20037508, 20037508, 20037508),'
. 'restrictedExtent: new OpenLayers.Bounds(-20037508, -20037508, 20037508, 20037508)'
. '};'
. 'var map = new OpenLayers.Map("openlayersmap", options);'
. 'var layerNone = new OpenLayers.Layer.Boxes("None", {isBaseLayer: true});'
. 'var layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");'
. 'var layerOsmarender = new OpenLayers.Layer.OSM.Osmarender("Osmarender");'
. 'var layerCycleMap = new OpenLayers.Layer.OSM.CycleMap("CycleMap");'
. 'map.addLayers([layerMapnik, layerOsmarender, layerCycleMap, layerNone]);'
. 'var vectorLayer = new OpenLayers.Layer.Vector("Data");'
. 'var bound;';
$output .= $this->_prepareDataSet($this->_data, $scale_data, 'ol', '');
$output .=
'map.addLayer(vectorLayer);'
. 'map.zoomToExtent(bound);'
. 'if (map.getZoom() < 2) {'
. 'map.zoomTo(2);'
. '}'
. 'map.addControl(new OpenLayers.Control.LayerSwitcher());'
. 'map.addControl(new OpenLayers.Control.MousePosition());';
return $output;
}
@ -274,7 +299,7 @@ class PMA_GIS_Visualization
include_once './libraries/tcpdf/tcpdf.php';
// create pdf
$pdf = new TCPDF('', 'pt', 'A4', true, 'UTF-8', false);
$pdf = new TCPDF('', 'pt', $GLOBALS['cfg']['PDFDefaultPageSize'], true, 'UTF-8', false);
// disable header and footer
$pdf->setPrintHeader(false);
@ -287,7 +312,7 @@ class PMA_GIS_Visualization
$pdf->AddPage();
$scale_data = $this->_scaleDataSet($this->_data);
$pdf = $this->_prepareDataSet($this->_data, 0, $scale_data, 'pdf', $pdf);
$pdf = $this->_prepareDataSet($this->_data, $scale_data, 'pdf', $pdf);
// sanitize file name
$file_name = $this->_sanitizeName($file_name, 'pdf');
@ -319,6 +344,9 @@ class PMA_GIS_Visualization
$type = substr($ref_data, 0, $type_pos);
$gis_obj = PMA_GIS_Factory::factory($type);
if (! $gis_obj) {
continue;
}
$scale_data = $gis_obj->scaleRow($row[$this->_settings['spatialColumn']]);
// Upadate minimum/maximum values for x and y cordinates.
@ -377,19 +405,19 @@ class PMA_GIS_Visualization
/**
* Prepares and return the dataset as needed by the visualization.
*
* @param array $data Raw data
* @param int $color_number Start index to the color array
* @param array $scale_data Data related to scaling
* @param string $format Format of the visulaization
* @param image $results Image object in the case of png
* @param array $data Raw data
* @param array $scale_data Data related to scaling
* @param string $format Format of the visulaization
* @param image $results Image object in the case of png
*
* @return the formatted array of data.
*/
private function _prepareDataSet($data, $color_number, $scale_data, $format, $results)
private function _prepareDataSet($data, $scale_data, $format, $results)
{
$color_number = 0;
// loop through the rows
foreach ($data as $row) {
$index = $color_number % sizeof($this->_settings['colors']);
// Figure out the data type
@ -398,6 +426,9 @@ class PMA_GIS_Visualization
$type = substr($ref_data, 0, $type_pos);
$gis_obj = PMA_GIS_Factory::factory($type);
if (! $gis_obj) {
continue;
}
$label = '';
if (isset($this->_settings['labelColumn'])
&& isset($row[$this->_settings['labelColumn']])
@ -432,4 +463,3 @@ class PMA_GIS_Visualization
}
}
?>

View File

@ -16,7 +16,7 @@
*
* @return the modified sql query.
*/
function PMA_GIS_modify_query($sql_query, $visualizationSettings)
function PMA_GIS_modifyQuery($sql_query, $visualizationSettings)
{
$modified_query = 'SELECT ';
@ -75,7 +75,9 @@ function PMA_GIS_modify_query($sql_query, $visualizationSettings)
// If select cluase is *
} else {
// If label column is chosen add it to the query
if ($visualizationSettings['labelColumn'] != '') {
if (isset($visualizationSettings['labelColumn'])
&& $visualizationSettings['labelColumn'] != ''
) {
$modified_query .= '`' . $visualizationSettings['labelColumn'] .'`, ';
}
@ -84,7 +86,8 @@ function PMA_GIS_modify_query($sql_query, $visualizationSettings)
. '`) AS `' . $visualizationSettings['spatialColumn'] . '`, ';
// Get the SRID
$modified_query .= 'SRID(`' . $visualizationSettings['spatialColumn'] . '`) AS `srid` ';
$modified_query .= 'SRID(`' . $visualizationSettings['spatialColumn']
. '`) AS `srid` ';
}
// Append the rest of the query
@ -98,14 +101,16 @@ function PMA_GIS_modify_query($sql_query, $visualizationSettings)
function sanitize($select)
{
$table_col = $select['table_name'] . "." . $select['column'];
$db_table_col = $select['db'] . "." . $select['table_name'] . "." . $select['column'];
$db_table_col = $select['db'] . "." . $select['table_name']
. "." . $select['column'];
if ($select['expr'] == $select['column']) {
return "`" . $select['column'] . "`";
} elseif ($select['expr'] == $table_col) {
return "`" . $select['table_name'] . "`.`" . $select['column'] . "`";
} elseif ($select['expr'] == $db_table_col) {
return "`" . $select['db'] . "`.`" . $select['table_name'] . "`.`" . $select['column'] . "`";
return "`" . $select['db'] . "`.`" . $select['table_name']
. "`.`" . $select['column'] . "`";
}
return $select['expr'];
}
@ -119,7 +124,7 @@ function sanitize($select)
*
* @return string HTML and JS code for the GIS visualization
*/
function PMA_GIS_visualization_results($data, &$visualizationSettings, $format)
function PMA_GIS_visualizationResults($data, &$visualizationSettings, $format)
{
include_once './libraries/gis/pma_gis_visualization.php';
include_once './libraries/gis/pma_gis_factory.php';
@ -156,7 +161,7 @@ function PMA_GIS_visualization_results($data, &$visualizationSettings, $format)
*
* @return file File containing the visualization
*/
function PMA_GIS_save_to_file($data, $visualizationSettings, $format, $fileName)
function PMA_GIS_saveToFile($data, $visualizationSettings, $format, $fileName)
{
include_once './libraries/gis/pma_gis_visualization.php';
include_once './libraries/gis/pma_gis_factory.php';

View File

@ -16,8 +16,9 @@ if (! defined('PHPMYADMIN')) {
* copy values from one array to another, usually from a superglobal into $GLOBALS
*
* @param array $array values from
* @param array $target values to
* @param boolean $sanitize prevent importing key names in $_import_blacklist
* @param array &$target values to
* @param bool $sanitize prevent importing key names in $_import_blacklist
* @return bool
*/
function PMA_recursive_extract($array, &$target, $sanitize = true)
{

View File

@ -97,16 +97,21 @@ function PMA_importRunQuery($sql = '', $full = '', $controluser = false)
$sql_query .= $import_run_buffer['full'];
}
if (!$cfg['AllowUserDropDatabase']
&& !$is_superuser
&& preg_match('@^[[:space:]]*DROP[[:space:]]+(IF EXISTS[[:space:]]+)?DATABASE @i', $import_run_buffer['sql'])) {
&& !$is_superuser
&& preg_match('@^[[:space:]]*DROP[[:space:]]+(IF EXISTS[[:space:]]+)?DATABASE @i', $import_run_buffer['sql'])
) {
$GLOBALS['message'] = PMA_Message::error(__('"DROP DATABASE" statements are disabled.'));
$error = true;
} else {
$executed_queries++;
if ($run_query && $GLOBALS['finished'] && empty($sql) && !$error && (
(!empty($import_run_buffer['sql']) && preg_match('/^[\s]*(SELECT|SHOW|HANDLER)/i', $import_run_buffer['sql'])) ||
($executed_queries == 1)
)) {
if ($run_query
&& $GLOBALS['finished']
&& empty($sql)
&& !$error
&& ((!empty($import_run_buffer['sql'])
&& preg_match('/^[\s]*(SELECT|SHOW|HANDLER)/i', $import_run_buffer['sql']))
|| ($executed_queries == 1))
) {
$go_sql = true;
if (!$sql_query_disabled) {
$complete_query = $sql_query;
@ -161,13 +166,15 @@ function PMA_importRunQuery($sql = '', $full = '', $controluser = false)
list($db, $reload) = PMA_lookForUse($import_run_buffer['sql'], $db, $reload);
}
if ($result != false && preg_match('@^[\s]*(DROP|CREATE)[\s]+(IF EXISTS[[:space:]]+)?(TABLE|DATABASE)[[:space:]]+(.+)@im', $import_run_buffer['sql'])) {
if ($result != false
&& preg_match('@^[\s]*(DROP|CREATE)[\s]+(IF EXISTS[[:space:]]+)?(TABLE|DATABASE)[[:space:]]+(.+)@im', $import_run_buffer['sql'])
) {
$reload = true;
}
} // end run query
} // end if not DROP DATABASE
} // end non empty query
elseif (!empty($import_run_buffer['full'])) {
// end non empty query
} elseif (!empty($import_run_buffer['full'])) {
if ($go_sql) {
$complete_query .= $import_run_buffer['full'];
$display_query .= $import_run_buffer['full'];
@ -418,6 +425,7 @@ define("VARCHAR", 1);
define("INT", 2);
define("DECIMAL", 3);
define("BIGINT", 4);
define("GEOMETRY", 5);
/* Decimal size defs */
define("M", 0);
@ -430,8 +438,9 @@ define("COL_NAMES", 1);
define("ROWS", 2);
/* Analysis array defs */
define("TYPES", 0);
define("SIZES", 1);
define("TYPES", 0);
define("SIZES", 1);
define("FORMATTEDSQL", 2);
/**
* Obtains the precision (total # of digits) from a size of type decimal
@ -909,7 +918,7 @@ function PMA_buildSQL($db_name, &$tables, &$analyses = null, &$additional_sql =
}
if ($analyses != null) {
$type_array = array(NONE => "NULL", VARCHAR => "varchar", INT => "int", DECIMAL => "decimal", BIGINT => "bigint");
$type_array = array(NONE => "NULL", VARCHAR => "varchar", INT => "int", DECIMAL => "decimal", BIGINT => "bigint", GEOMETRY => 'geometry');
/* TODO: Do more checking here to make sure they really are matched */
if (count($tables) != count($analyses)) {
@ -928,7 +937,10 @@ function PMA_buildSQL($db_name, &$tables, &$analyses = null, &$additional_sql =
$size = 10;
}
$tempSQLStr .= PMA_backquote($tables[$i][COL_NAMES][$j]) . " " . $type_array[$analyses[$i][TYPES][$j]] . "(" . $size . ")";
$tempSQLStr .= PMA_backquote($tables[$i][COL_NAMES][$j]) . " " . $type_array[$analyses[$i][TYPES][$j]];
if ($analyses[$i][TYPES][$j] != GEOMETRY) {
$tempSQLStr .= "(" . $size . ")";
}
if ($j != (count($tables[$i][COL_NAMES]) - 1)) {
$tempSQLStr .= ", ";
@ -973,20 +985,28 @@ function PMA_buildSQL($db_name, &$tables, &$analyses = null, &$additional_sql =
$tempSQLStr .= "(";
for ($k = 0; $k < $num_cols; ++$k) {
if ($analyses != null) {
$is_varchar = ($analyses[$i][TYPES][$col_count] === VARCHAR);
// If fully formatted SQL, no need to enclose with aphostrophes, add shalshes etc.
if ($analyses != null
&& isset($analyses[$i][FORMATTEDSQL][$col_count])
&& $analyses[$i][FORMATTEDSQL][$col_count] == true
) {
$tempSQLStr .= (string) $tables[$i][ROWS][$j][$k];
} else {
$is_varchar = !is_numeric($tables[$i][ROWS][$j][$k]);
}
if ($analyses != null) {
$is_varchar = ($analyses[$i][TYPES][$col_count] === VARCHAR);
} else {
$is_varchar = !is_numeric($tables[$i][ROWS][$j][$k]);
}
/* Don't put quotes around NULL fields */
if (! strcmp($tables[$i][ROWS][$j][$k], 'NULL')) {
$is_varchar = false;
}
/* Don't put quotes around NULL fields */
if (! strcmp($tables[$i][ROWS][$j][$k], 'NULL')) {
$is_varchar = false;
}
$tempSQLStr .= (($is_varchar) ? "'" : "");
$tempSQLStr .= PMA_sqlAddSlashes((string)$tables[$i][ROWS][$j][$k]);
$tempSQLStr .= (($is_varchar) ? "'" : "");
$tempSQLStr .= (($is_varchar) ? "'" : "");
$tempSQLStr .= PMA_sqlAddSlashes((string)$tables[$i][ROWS][$j][$k]);
$tempSQLStr .= (($is_varchar) ? "'" : "");
}
if ($k != ($num_cols - 1)) {
$tempSQLStr .= ", ";

View File

@ -66,7 +66,7 @@ if ($data === true && !$error && !$timeout_passed) {
$qry = '
INSERT INTO
' . PMA_backquote($cfgRelation['db']) . '.' . PMA_backquote($cfgRelation['column_info']) . '
(db_name, table_name, column_name, ' . PMA_backquote('comment') . ')
(db_name, table_name, column_name, comment)
VALUES (
\'' . PMA_sqlAddSlashes($GLOBALS['db']) . '\',
\'' . PMA_sqlAddSlashes(trim($tab)) . '\',

421
libraries/import/shp.php Normal file
View File

@ -0,0 +1,421 @@
<?php
/**
* ESRI Shape file import plugin for phpMyAdmin
*
* @package phpMyAdmin-Import
* @subpackage ESRI_Shape
*/
if (! defined('PHPMYADMIN')) {
exit;
}
if (isset($plugin_list)) {
$plugin_list['shp'] = array(
'text' => __('ESRI Shape File'),
'extension' => 'shp',
'options' => array(),
'options_text' => __('Options'),
);
} else {
if ((int) ini_get('memory_limit') < 512) {
@ini_set('memory_limit', '512M');
}
@set_time_limit(300);
// Append the bfShapeFiles directory to the include path variable
set_include_path(get_include_path() . PATH_SEPARATOR . getcwd() . '/libraries/bfShapeFiles/');
include_once './libraries/bfShapeFiles/ShapeFile.lib.php';
$GLOBALS['finished'] = false;
$buffer = '';
$eof = false;
// Returns specified number of bytes from the buffer.
// Buffer automatically fetches next chunk of data when the buffer falls short.
// Sets $eof when $GLOBALS['finished'] is set and the buffer falls short.
function readFromBuffer($length){
global $buffer, $eof;
if (strlen($buffer) < $length) {
if ($GLOBALS['finished']) {
$eof = true;
} else {
$buffer .= PMA_importGetNextChunk();
}
}
$result = substr($buffer, 0, $length);
$buffer = substr($buffer, $length);
return $result;
}
/**
* This class extends ShapeFile class to cater the following phpMyAdmin
* specific requirements.
* 1) To load data from .dbf file only when the dBase extension is available.
* 2) To use PMA_importGetNextChunk() functionality to read data, rather than
* reading directly from a file. Using readFromBuffer() in place of fread().
* This makes it possible to use compressions.
*/
class PMA_ShapeFile extends ShapeFile {
function _isDbaseLoaded()
{
return extension_loaded('dbase');
}
function loadFromFile($FileName)
{
$this->_loadHeaders();
$this->_loadRecords();
if ($this->_isDbaseLoaded()) {
$this->_closeDBFFile();
}
}
function _loadHeaders()
{
readFromBuffer(24);
$this->fileLength = loadData("N", readFromBuffer(4));
readFromBuffer(4);
$this->shapeType = loadData("V", readFromBuffer(4));
$this->boundingBox = array();
$this->boundingBox["xmin"] = loadData("d", readFromBuffer(8));
$this->boundingBox["ymin"] = loadData("d", readFromBuffer(8));
$this->boundingBox["xmax"] = loadData("d", readFromBuffer(8));
$this->boundingBox["ymax"] = loadData("d", readFromBuffer(8));
if ($this->_isDbaseLoaded() && $this->_openDBFFile()) {
$this->DBFHeader = $this->_loadDBFHeader();
}
}
function _loadRecords()
{
global $eof;
readFromBuffer(32);
while (true) {
$record = new PMA_ShapeRecord(-1);
$record->loadFromFile($this->SHPFile, $this->DBFFile);
if ($record->lastError != "") {
return false;
}
if ($eof) {
break;
}
$this->records[] = $record;
}
}
}
/**
* This class extends ShapeRecord class to cater the following phpMyAdmin
* specific requirements.
* 1) To load data from .dbf file only when the dBase extension is available.
* 2) To use PMA_importGetNextChunk() functionality to read data, rather than
* reading directly from a file. Using readFromBuffer() in place of fread().
* This makes it possible to use compressions.
*/
class PMA_ShapeRecord extends ShapeRecord
{
function loadFromFile(&$SHPFile, &$DBFFile)
{
$this->DBFFile = $DBFFile;
$this->_loadHeaders();
switch ($this->shapeType) {
case 0:
$this->_loadNullRecord();
break;
case 1:
$this->_loadPointRecord();
break;
case 3:
$this->_loadPolyLineRecord();
break;
case 5:
$this->_loadPolygonRecord();
break;
case 8:
$this->_loadMultiPointRecord();
break;
default:
$this->setError(sprintf("The Shape Type '%s' is not supported.", $this->shapeType));
break;
}
if (extension_loaded('dbase') && isset($this->DBFFile)) {
$this->_loadDBFData();
}
}
function _loadHeaders()
{
$this->recordNumber = loadData("N", readFromBuffer(4));
//We read the length of the record
$tmp = loadData("N", readFromBuffer(4));
$this->shapeType = loadData("V", readFromBuffer(4));
}
function _loadPoint()
{
$data = array();
$data["x"] = loadData("d", readFromBuffer(8));
$data["y"] = loadData("d", readFromBuffer(8));
return $data;
}
function _loadMultiPointRecord()
{
$this->SHPData = array();
$this->SHPData["xmin"] = loadData("d", readFromBuffer(8));
$this->SHPData["ymin"] = loadData("d", readFromBuffer(8));
$this->SHPData["xmax"] = loadData("d", readFromBuffer(8));
$this->SHPData["ymax"] = loadData("d", readFromBuffer(8));
$this->SHPData["numpoints"] = loadData("V", readFromBuffer(4));
for ($i = 0; $i <= $this->SHPData["numpoints"]; $i++) {
$this->SHPData["points"][] = $this->_loadPoint();
}
}
function _loadPolyLineRecord()
{
$this->SHPData = array();
$this->SHPData["xmin"] = loadData("d", readFromBuffer(8));
$this->SHPData["ymin"] = loadData("d", readFromBuffer(8));
$this->SHPData["xmax"] = loadData("d", readFromBuffer(8));
$this->SHPData["ymax"] = loadData("d", readFromBuffer(8));
$this->SHPData["numparts"] = loadData("V", readFromBuffer(4));
$this->SHPData["numpoints"] = loadData("V", readFromBuffer(4));
for ($i = 0; $i < $this->SHPData["numparts"]; $i++) {
$this->SHPData["parts"][$i] = loadData("V", readFromBuffer(4));
}
$readPoints = 0;
reset($this->SHPData["parts"]);
while (list($partIndex, $partData) = each($this->SHPData["parts"])) {
if (! isset($this->SHPData["parts"][$partIndex]["points"])
|| !is_array($this->SHPData["parts"][$partIndex]["points"])
) {
$this->SHPData["parts"][$partIndex] = array();
$this->SHPData["parts"][$partIndex]["points"] = array();
}
while (! in_array($readPoints, $this->SHPData["parts"])
&& ($readPoints < ($this->SHPData["numpoints"]))
) {
$this->SHPData["parts"][$partIndex]["points"][] = $this->_loadPoint();
$readPoints++;
}
}
}
}
$shp = new PMA_ShapeFile(1);
// If the zip archive has more than one file,
// get the correct content to the buffer from .shp file.
if ($compression == 'application/zip' && PMA_getNoOfFilesInZip($import_file) > 1) {
$zip_content = PMA_getZipContents($import_file, '/^.*\.shp$/i');
$GLOBALS['import_text'] = $zip_content['data'];
}
$temp_dbf_file = false;
// We need dbase extension to handle .dbf file
if (extension_loaded('dbase')) {
// If we can extract the zip archive to 'TempDir'
// and use the files in it for import
if ($compression == 'application/zip'
&& ! empty($cfg['TempDir'])
&& is_writable($cfg['TempDir'])
) {
$dbf_file_name = PMA_findFileFromZipArchive('/^.*\.dbf$/i', $import_file);
// If the corresponding .dbf file is in the zip archive
if ($dbf_file_name) {
// Extract the .dbf file and point to it.
$extracted = PMA_zipExtract(
$import_file,
realpath($cfg['TempDir']),
array($dbf_file_name)
);
if ($extracted) {
$dbf_file_path = realpath($cfg['TempDir'])
. (PMA_IS_WINDOWS ? '\\' : '/') . $dbf_file_name;
$temp_dbf_file = true;
// Replace the .dbf with .*, as required by the bsShapeFiles library.
$file_name = substr($dbf_file_path, 0, strlen($dbf_file_path) - 4) . '.*';
$shp->FileName = $file_name;
}
}
}
// If file is in UploadDir, use .dbf file in the same UploadDir
// to load extra data.
elseif (! empty($local_import_file)
&& ! empty($cfg['UploadDir'])
&& $compression == 'none'
) {
// Replace the .shp with .*,
// so the bsShapeFiles library correctly locates .dbf file.
$file_name = substr($import_file, 0, strlen($import_file) - 4) . '.*';
$shp->FileName = $file_name;
}
}
// Load data
$shp->loadFromFile('');
if ($shp->lastError != "") {
$error = true;
$message = PMA_Message::error(__('There was an error importing the ESRI shape file: "%s".'));
$message->addParam($shp->lastError);
return;
}
// Delete the .dbf file extracted to 'TempDir'
if ($temp_dbf_file) {
unlink($dbf_file_path);
}
$esri_types = array(
0 => 'Null Shape',
1 => 'Point',
3 => 'PolyLine',
5 => 'Polygon',
8 => 'MultiPoint',
11 => 'PointZ',
13 => 'PolyLineZ',
15 => 'PolygonZ',
18 => 'MultiPointZ',
21 => 'PointM',
23 => 'PolyLineM',
25 => 'PolygonM',
28 => 'MultiPointM',
31 => 'MultiPatch',
);
include_once './libraries/gis/pma_gis_geometry.php';
switch ($shp->shapeType) {
// ESRI Null Shape
case 0:
$gis_obj = null;
break;
// ESRI Point
case 1:
include_once './libraries/gis/pma_gis_point.php';
$gis_obj = PMA_GIS_Point::singleton();
break;
// ESRI PolyLine
case 3:
include_once './libraries/gis/pma_gis_multilinestring.php';
$gis_obj = PMA_GIS_Multilinestring::singleton();
break;
// ESRI Polygon
case 5:
include_once './libraries/gis/pma_gis_multipolygon.php';
$gis_obj = PMA_GIS_Multipolygon::singleton();
break;
// ESRI MultiPoint
case 8:
include_once './libraries/gis/pma_gis_multipoint.php';
$gis_obj = PMA_GIS_Multipoint::singleton();
break;
default:
$error = true;
if (! isset($esri_types[$shp->shapeType])) {
$message = PMA_Message::error(__('You tried to import an invalid file or the imported file contains invalid data'));
} else {
$message = PMA_Message::error(__('MySQL Spatial Extension does not support ESRI type "%s".'));
$message->addParam($param);
}
return;
}
$num_rows = count($shp->records);
// If .dbf file is loaded, the number of extra data columns
$num_data_cols = isset($shp->DBFHeader) ? count($shp->DBFHeader) : 0;
$rows = array();
$col_names = array();
if ($num_rows != 0) {
foreach ($shp->records as $record) {
$tempRow = array();
if ($gis_obj == null) {
$tempRow[] = null;
} else {
$tempRow[] = "GeomFromText('" . $gis_obj->getShape($record->SHPData) . "')";
}
if (isset($shp->DBFHeader)) {
foreach ($shp->DBFHeader as $c) {
$cell = trim($record->DBFData[$c[0]]);
if (! strcmp($cell, '')) {
$cell = 'NULL';
}
$tempRow[] = $cell;
}
}
$rows[] = $tempRow;
}
}
if (count($rows) == 0) {
$error = true;
$message = PMA_Message::error(__('The imported file does not contain any data'));
return;
}
// Column names for spatial column and the rest of the columns,
// if they are available
$col_names[] = 'SPATIAL';
for ($n = 0; $n < $num_data_cols; $n++) {
$col_names[] = $shp->DBFHeader[$n][0];
}
// Set table name based on the number of tables
if (strlen($db)) {
$result = PMA_DBI_fetch_result('SHOW TABLES');
$table_name = 'TABLE '.(count($result) + 1);
} else {
$table_name = 'TBL_NAME';
}
$tables = array(array($table_name, $col_names, $rows));
// Use data from shape file to chose best-fit MySQL types for each column
$analyses = array();
$analyses[] = PMA_analyzeTable($tables[0]);
$table_no = 0; $spatial_col = 0;
$analyses[$table_no][TYPES][$spatial_col] = GEOMETRY;
$analyses[$table_no][FORMATTEDSQL][$spatial_col] = true;
// Set database name to the currently selected one, if applicable
if (strlen($db)) {
$db_name = $db;
$options = array('create_db' => false);
} else {
$db_name = 'SHP_DB';
$options = null;
}
// Created and execute necessary SQL statements from data
$null_param = null;
PMA_buildSQL($db_name, $tables, $analyses, $null_param, $options);
unset($tables);
unset($analyses);
$finished = true;
$error = false;
// Commit any possible data in buffers
PMA_importRunQuery();
}
?>

View File

@ -15,6 +15,9 @@ $ID_KEY = 'APC_UPLOAD_PROGRESS';
* Returns upload status.
*
* This is implementation for APC extension.
*
* @param string $id
* @return array|null
*/
function PMA_getUploadStatus($id)
{
@ -22,7 +25,7 @@ function PMA_getUploadStatus($id)
global $ID_KEY;
if (trim($id) == "") {
return;
return null;
}
if (! array_key_exists($id, $_SESSION[$SESSION_KEY])) {
$_SESSION[$SESSION_KEY][$id] = array(

View File

@ -15,6 +15,9 @@ $ID_KEY = 'noplugin';
* Returns upload status.
*
* This is implementation when no webserver support exists, so it returns just zeroes.
*
* @param string $id
* @return array|null
*/
function PMA_getUploadStatus($id)
{
@ -22,7 +25,7 @@ function PMA_getUploadStatus($id)
global $ID_KEY;
if (trim($id) == "") {
return;
return null;
}
if (! array_key_exists($id, $_SESSION[$SESSION_KEY])) {
$_SESSION[$SESSION_KEY][$id] = array(

View File

@ -14,6 +14,9 @@ $ID_KEY = "UPLOAD_IDENTIFIER";
* Returns upload status.
*
* This is implementation for uploadprogress extension.
*
* @param string $id
* @return array|null
*/
function PMA_getUploadStatus($id)
{
@ -21,7 +24,7 @@ function PMA_getUploadStatus($id)
global $ID_KEY;
if (trim($id) == "") {
return;
return null;
}
if (! array_key_exists($id, $_SESSION[$SESSION_KEY])) {

View File

@ -9,6 +9,9 @@
/**
* Tries to detect MIME type of content.
*
* @param string &$test
* @return string
*/
function PMA_detectMIME(&$test)
{

View File

@ -1068,10 +1068,9 @@ function PMA_REL_renameField($db, $table, $field, $new_name)
* @param string $newpage
* @param array $cfgRelation
* @param string $db
* @param string $query_default_option
* @return string $pdf_page_number
*/
function PMA_REL_create_page($newpage, $cfgRelation, $db, $query_default_option)
function PMA_REL_create_page($newpage, $cfgRelation, $db)
{
if (! isset($newpage) || $newpage == '') {
$newpage = __('no description');
@ -1079,7 +1078,7 @@ function PMA_REL_create_page($newpage, $cfgRelation, $db, $query_default_option)
$ins_query = 'INSERT INTO ' . PMA_backquote($GLOBALS['cfgRelation']['db']) . '.' . PMA_backquote($cfgRelation['pdf_pages'])
. ' (db_name, page_descr)'
. ' VALUES (\'' . PMA_sqlAddSlashes($db) . '\', \'' . PMA_sqlAddSlashes($newpage) . '\')';
PMA_query_as_controluser($ins_query, false, $query_default_option);
PMA_query_as_controluser($ins_query, false);
return PMA_DBI_insert_id(isset($GLOBALS['controllink']) ? $GLOBALS['controllink'] : '');
}
?>

View File

@ -70,16 +70,17 @@ function PMA_RTN_handleExport()
{
global $_GET, $db;
if (! empty($_GET['export_item']) && ! empty($_GET['item_name'])) {
$item_name = $_GET['item_name'];
$type = PMA_DBI_fetch_value(
"SELECT ROUTINE_TYPE " .
"FROM INFORMATION_SCHEMA.ROUTINES " .
"WHERE ROUTINE_SCHEMA='" . PMA_sqlAddSlashes($db) . "' " .
"AND SPECIFIC_NAME='" . PMA_sqlAddSlashes($item_name) . "';"
);
$export_data = PMA_DBI_get_definition($db, $type, $item_name);
PMA_RTE_handleExport($item_name, $export_data);
if ( ! empty($_GET['export_item'])
&& ! empty($_GET['item_name'])
&& ! empty($_GET['item_type'])
) {
if ($_GET['item_type'] == 'FUNCTION' || $_GET['item_type'] == 'PROCEDURE') {
$export_data = PMA_DBI_get_definition(
$db,
$_GET['item_type'],
$_GET['item_name']);
PMA_RTE_handleExport($_GET['item_name'], $export_data);
}
}
} // end PMA_RTN_handleExport()

View File

@ -117,7 +117,7 @@ function PMA_RTN_getRowForList($routine, $rowclass = '')
$sql_drop = sprintf('DROP %s IF EXISTS %s',
$routine['ROUTINE_TYPE'],
PMA_backquote($routine['SPECIFIC_NAME']));
$type_link = "item_type={$routine['ROUTINE_TYPE']}";
$retval = " <tr class='noclick $rowclass'>\n";
$retval .= " <td>\n";
@ -136,6 +136,7 @@ function PMA_RTN_getRowForList($routine, $rowclass = '')
. $url_query
. '&amp;edit_item=1'
. '&amp;item_name=' . urlencode($routine['SPECIFIC_NAME'])
. '&amp;' . $type_link
. '">' . $titles['Edit'] . "</a>\n";
} else {
$retval .= " {$titles['NoEdit']}\n";
@ -150,6 +151,7 @@ function PMA_RTN_getRowForList($routine, $rowclass = '')
// otherwise we can execute it directly.
$routine_details = PMA_RTN_getDataFromName(
$routine['SPECIFIC_NAME'],
$routine['ROUTINE_TYPE'],
false
);
if ($routine !== false) {
@ -168,6 +170,7 @@ function PMA_RTN_getRowForList($routine, $rowclass = '')
. $url_query
. '&amp;' . $execute_action . '=1'
. '&amp;item_name=' . urlencode($routine['SPECIFIC_NAME'])
. '&amp;' . $type_link
. '">' . $titles['Execute'] . "</a>\n";
}
} else {
@ -180,15 +183,16 @@ function PMA_RTN_getRowForList($routine, $rowclass = '')
. $url_query
. '&amp;export_item=1'
. '&amp;item_name=' . urlencode($routine['SPECIFIC_NAME'])
. '&amp;' . $type_link
. '">' . $titles['Export'] . "</a>\n";
$retval .= " </td>\n";
$retval .= " <td>\n";
if (PMA_currentUserHasPrivilege('EVENT', $db)) {
if (PMA_currentUserHasPrivilege('ALTER ROUTINE', $db)) {
$retval .= ' <a ' . $ajax_class['drop']
. ' href="sql.php?'
. $url_query
. '&amp;sql_query=' . urlencode($sql_drop)
. '&amp;goto=db_events.php' . urlencode("?db={$db}")
. '&amp;goto=db_routines.php' . urlencode("?db={$db}")
. '" >' . $titles['Drop'] . "</a>\n";
} else {
$retval .= " {$titles['NoDrop']}\n";

View File

@ -304,7 +304,9 @@ function PMA_RTN_handleEditor()
$extra_data = array();
if ($message->isSuccess()) {
$columns = "`SPECIFIC_NAME`, `ROUTINE_NAME`, `ROUTINE_TYPE`, `DTD_IDENTIFIER`, `ROUTINE_DEFINITION`";
$where = "ROUTINE_SCHEMA='" . PMA_sqlAddSlashes($db) . "' AND ROUTINE_NAME='" . PMA_sqlAddSlashes($_REQUEST['item_name']) . "'";
$where = "ROUTINE_SCHEMA='" . PMA_sqlAddSlashes($db) . "' "
. "AND ROUTINE_NAME='" . PMA_sqlAddSlashes($_REQUEST['item_name']) . "'"
. "AND ROUTINE_TYPE='" . PMA_sqlAddSlashes($_REQUEST['item_type']) . "'";
$routine = PMA_DBI_fetch_single_row("SELECT $columns FROM `INFORMATION_SCHEMA`.`ROUTINES` WHERE $where;");
$extra_data['name'] = htmlspecialchars(strtoupper($_REQUEST['item_name']));
$extra_data['new_row'] = PMA_RTN_getRowForList($routine);
@ -343,7 +345,7 @@ function PMA_RTN_handleEditor()
} else if (! empty($_REQUEST['edit_item'])) {
$title = __("Edit routine");
if (! $operation && ! empty($_REQUEST['item_name']) && empty($_REQUEST['editor_process_edit'])) {
$routine = PMA_RTN_getDataFromName($_REQUEST['item_name']);
$routine = PMA_RTN_getDataFromName($_REQUEST['item_name'], $_REQUEST['item_type']);
if ($routine !== false) {
$routine['item_original_name'] = $routine['item_name'];
$routine['item_original_type'] = $routine['item_type'];
@ -501,12 +503,13 @@ function PMA_RTN_getDataFromRequest()
* the "Edit routine" form given the name of a routine.
*
* @param string $name The name of the routine.
* @param string $type Type of routine (ROUTINE|PROCEDURE)
* @param bool $all Whether to return all data or just
* the info about parameters.
*
* @return array Data necessary to create the routine editor.
*/
function PMA_RTN_getDataFromName($name, $all = true)
function PMA_RTN_getDataFromName($name, $type, $all = true)
{
global $param_directions, $param_sqldataaccess, $db;
@ -517,7 +520,8 @@ function PMA_RTN_getDataFromName($name, $all = true)
. "ROUTINE_DEFINITION, IS_DETERMINISTIC, SQL_DATA_ACCESS, "
. "ROUTINE_COMMENT, SECURITY_TYPE";
$where = "ROUTINE_SCHEMA='" . PMA_sqlAddSlashes($db) . "' "
. "AND SPECIFIC_NAME='" . PMA_sqlAddSlashes($name) . "'";
. "AND SPECIFIC_NAME='" . PMA_sqlAddSlashes($name) . "'"
. "AND ROUTINE_TYPE='" . PMA_sqlAddSlashes($type) . "'";
$query = "SELECT $fields FROM INFORMATION_SCHEMA.ROUTINES WHERE $where;";
$routine = PMA_DBI_fetch_single_row($query);
@ -1002,7 +1006,7 @@ function PMA_RTN_getQueryFromRequest()
$warned_about_dir = false;
$warned_about_name = false;
$warned_about_length = false;
if (! empty($_REQUEST['item_param_name'])
if ( ! empty($_REQUEST['item_param_name'])
&& ! empty($_REQUEST['item_param_type'])
&& ! empty($_REQUEST['item_param_length'])
&& is_array($_REQUEST['item_param_name'])
@ -1124,7 +1128,7 @@ function PMA_RTN_handleExecute()
*/
if (! empty($_REQUEST['execute_routine']) && ! empty($_REQUEST['item_name'])) {
// Build the queries
$routine = PMA_RTN_getDataFromName($_REQUEST['item_name'], false);
$routine = PMA_RTN_getDataFromName($_REQUEST['item_name'], $_REQUEST['item_type'], false);
if ($routine !== false) {
$queries = array();
$end_query = array();
@ -1279,7 +1283,7 @@ function PMA_RTN_handleExecute()
/**
* Display the execute form for a routine.
*/
$routine = PMA_RTN_getDataFromName($_GET['item_name'], false);
$routine = PMA_RTN_getDataFromName($_GET['item_name'], $_GET['item_type'], true);
if ($routine !== false) {
$form = PMA_RTN_getExecuteForm($routine);
if ($GLOBALS['is_ajax_request'] == true) {
@ -1336,6 +1340,8 @@ function PMA_RTN_getExecuteForm($routine)
$retval .= "<form action='db_routines.php' method='post' class='rte_form'>\n";
$retval .= "<input type='hidden' name='item_name'\n";
$retval .= " value='{$routine['item_name']}' />\n";
$retval .= "<input type='hidden' name='item_type'\n";
$retval .= " value='{$routine['item_type']}' />\n";
$retval .= PMA_generate_common_hidden_inputs($db) . "\n";
$retval .= "<fieldset>\n";
if ($GLOBALS['is_ajax_request'] != true) {

View File

@ -144,7 +144,7 @@ class PMA_Schema_PDF extends PMA_PDF
/**
* Sets the scaled line width
*
* @param float width The line width
* @param float $width The line width
* @access public
* @see TCPDF::SetLineWidth()
*/
@ -224,6 +224,10 @@ class PMA_Schema_PDF extends PMA_PDF
/**
* Compute number of lines used by a multicell of width w
*
* @param int $w
* @param string $txt
* @return int
*/
function NbLines($w, $txt)
{
@ -386,7 +390,7 @@ class Table_Stats
* Returns title of the current table,
* title can have the dimensions of the table
*
* @access private
* @return string
*/
private function _getTitle()
{
@ -401,7 +405,7 @@ class Table_Stats
* @access private
* @see PMA_Schema_PDF
*/
function _setWidth($fontSize)
private function _setWidth($fontSize)
{
global $pdf;

View File

@ -440,7 +440,7 @@ class Table_Stats
* @access private
* @see PMA_SVG
*/
function _setWidthTable($font,$fontSize)
private function _setWidthTable($font,$fontSize)
{
global $svg;

View File

@ -38,31 +38,52 @@ class PMA_User_Schema
public function processUserChoice()
{
global $action_choose,$db,$cfgRelation,$cfg,$query_default_option;
global $action_choose,$db,$cfgRelation,$cfg;
if (isset($this->action)) {
switch ($this->action) {
case 'selectpage':
$this->chosenPage = $_REQUEST['chpage'];
if ($action_choose=="1") {
$this->deleteCoordinates($db, $cfgRelation, $this->chosenPage, $query_default_option);
$this->deletePages($db, $cfgRelation, $this->chosenPage, $query_default_option);
$this->deleteCoordinates(
$db,
$cfgRelation,
$this->chosenPage
);
$this->deletePages(
$db,
$cfgRelation,
$this->chosenPage
);
$this->chosenPage = 0;
}
break;
case 'createpage':
$this->pageNumber = PMA_REL_create_page($_POST['newpage'], $cfgRelation, $db, $query_default_option);
$this->pageNumber = PMA_REL_create_page(
$_POST['newpage'],
$cfgRelation,
$db
);
$this->autoLayoutForeign = isset($_POST['auto_layout_foreign']) ? "1":NULL;
$this->autoLayoutInternal = isset($_POST['auto_layout_internal']) ? "1":NULL;
$this->processRelations($db, $this->pageNumber,$cfgRelation,$query_default_option);
$this->processRelations(
$db,
$this->pageNumber,
$cfgRelation
);
break;
case 'edcoord':
$this->chosenPage = $_POST['chpage'];
$this->c_table_rows = $_POST['c_table_rows'];
$this->_editCoordinates($db, $cfgRelation,$query_default_option);
$this->_editCoordinates($db, $cfgRelation);
break;
case 'delete_old_references':
$this->_deleteTableRows($delrow,$cfgRelation,$db,$this->chosenPage);
$this->_deleteTableRows(
$delrow,
$cfgRelation,
$db,
$this->chosenPage
);
break;
case 'process_export':
$this->_processExportSchema();
@ -132,10 +153,10 @@ class PMA_User_Schema
*/
public function selectPage()
{
global $db,$table,$query_default_option,$cfgRelation;
global $db,$table,$cfgRelation;
$page_query = 'SELECT * FROM ' . PMA_backquote($GLOBALS['cfgRelation']['db']) . '.' . PMA_backquote($cfgRelation['pdf_pages'])
. ' WHERE db_name = \'' . PMA_sqlAddSlashes($db) . '\'';
$page_rs = PMA_query_as_controluser($page_query, false, $query_default_option);
$page_rs = PMA_query_as_controluser($page_query, false, PMA_DBI_QUERY_STORE);
if ($page_rs && PMA_DBI_num_rows($page_rs) > 0) {
?>
<form method="get" action="schema_edit.php" name="frm_select_page">
@ -186,7 +207,7 @@ class PMA_User_Schema
*/
public function showTableDashBoard()
{
global $db,$cfgRelation,$table,$cfg,$with_field_names,$query_default_option;
global $db,$cfgRelation,$table,$cfg,$with_field_names;
/*
* We will need an array of all tables in this db
*/
@ -209,7 +230,7 @@ class PMA_User_Schema
$page_query = 'SELECT * FROM ' . PMA_backquote($GLOBALS['cfgRelation']['db']) . '.' . PMA_backquote($cfgRelation['table_coords'])
. ' WHERE db_name = \'' . PMA_sqlAddSlashes($db) . '\''
. ' AND pdf_page_number = \'' . PMA_sqlAddSlashes($this->chosenPage) . '\'';
$page_rs = PMA_query_as_controluser($page_query, false, $query_default_option);
$page_rs = PMA_query_as_controluser($page_query, false);
$array_sh_page = array();
while ($temp_sh_page = @PMA_DBI_fetch_assoc($page_rs)) {
$array_sh_page[] = $temp_sh_page;
@ -420,6 +441,7 @@ class PMA_User_Schema
*/
private function _deleteTables($db, $chpage, $tabExist)
{
global $table;
$_strtrans = '';
$_strname = '';
$shoot = false;
@ -474,12 +496,12 @@ class PMA_User_Schema
$drag_x = $temp_sh_page['x'];
$drag_y = $temp_sh_page['y'];
$draginit2 .= ' Drag.init(getElement("table_' . $i . '"), null, 0, parseInt(myid.style.width)-2, 0, parseInt(myid.style.height)-5);' . "\n";
$draginit2 .= ' getElement("table_' . $i . '").onDrag = function (x, y) { document.edcoord.elements["c_table_' . $i . '[x]"].value = parseInt(x); document.edcoord.elements["c_table_' . $i . '[y]"].value = parseInt(y) }' . "\n";
$draginit .= ' getElement("table_' . $i . '").style.left = "' . $drag_x . 'px";' . "\n";
$draginit .= ' getElement("table_' . $i . '").style.top = "' . $drag_y . 'px";' . "\n";
$reset_draginit .= ' getElement("table_' . $i . '").style.left = "2px";' . "\n";
$reset_draginit .= ' getElement("table_' . $i . '").style.top = "' . (15 * $i) . 'px";' . "\n";
$draginit2 .= ' Drag.init($("#table_' . $i . '")[0], null, 0, parseInt(myid.style.width)-2, 0, parseInt(myid.style.height)-5);' . "\n";
$draginit2 .= ' $("#table_' . $i . '")[0].onDrag = function (x, y) { document.edcoord.elements["c_table_' . $i . '[x]"].value = parseInt(x); document.edcoord.elements["c_table_' . $i . '[y]"].value = parseInt(y) }' . "\n";
$draginit .= ' $("#table_' . $i . '")[0].style.left = "' . $drag_x . 'px";' . "\n";
$draginit .= ' $("#table_' . $i . '")[0].style.top = "' . $drag_y . 'px";' . "\n";
$reset_draginit .= ' $("#table_' . $i . '")[0].style.left = "2px";' . "\n";
$reset_draginit .= ' $("#table_' . $i . '")[0].style.top = "' . (15 * $i) . 'px";' . "\n";
$reset_draginit .= ' document.edcoord.elements["c_table_' . $i . '[x]"].value = "2"' . "\n";
$reset_draginit .= ' document.edcoord.elements["c_table_' . $i . '[y]"].value = "' . (15 * $i) . '"' . "\n";
@ -507,13 +529,13 @@ class PMA_User_Schema
//<![CDATA[
function PDFinit() {
refreshLayout();
myid = getElement('pdflayout');
myid = $('#pdflayout')[0];
<?php echo $draginit; ?>
TableDragInit();
}
function TableDragInit() {
myid = getElement('pdflayout');
myid = $('#pdflayout')[0];
<?php echo $draginit2; ?>
}
@ -543,7 +565,7 @@ class PMA_User_Schema
. ' AND table_name = \'' . PMA_sqlAddSlashes($current_row) . '\'' . "\n"
. ' AND pdf_page_number = \'' . PMA_sqlAddSlashes($chpage) . '\'';
echo $del_query;
PMA_query_as_controluser($del_query, false, $query_default_option);
PMA_query_as_controluser($del_query, false);
}
}
@ -584,12 +606,12 @@ class PMA_User_Schema
* @return void
* @access private
*/
public function deleteCoordinates($db, $cfgRelation, $choosePage, $query_default_option)
public function deleteCoordinates($db, $cfgRelation, $choosePage)
{
$query = 'DELETE FROM ' . PMA_backquote($GLOBALS['cfgRelation']['db']) . '.' . PMA_backquote($cfgRelation['table_coords'])
. ' WHERE db_name = \'' . PMA_sqlAddSlashes($db) . '\''
. ' AND pdf_page_number = \'' . PMA_sqlAddSlashes($choosePage) . '\'';
PMA_query_as_controluser($query, false, $query_default_option);
PMA_query_as_controluser($query, false);
}
/**
@ -601,12 +623,12 @@ class PMA_User_Schema
* @return void
* @access private
*/
public function deletePages($db, $cfgRelation, $choosePage, $query_default_option)
public function deletePages($db, $cfgRelation, $choosePage)
{
$query = 'DELETE FROM ' . PMA_backquote($GLOBALS['cfgRelation']['db']) . '.' . PMA_backquote($cfgRelation['pdf_pages'])
. ' WHERE db_name = \'' . PMA_sqlAddSlashes($db) . '\''
. ' AND page_nr = \'' . PMA_sqlAddSlashes($choosePage) . '\'';
PMA_query_as_controluser($query, false, $query_default_option);
PMA_query_as_controluser($query, false);
}
/**
@ -618,7 +640,7 @@ class PMA_User_Schema
* @return void
* @access private
*/
public function processRelations($db, $pageNumber, $cfgRelation, $query_default_option)
public function processRelations($db, $pageNumber, $cfgRelation)
{
/*
* A u t o m a t i c l a y o u t
@ -662,10 +684,10 @@ class PMA_User_Schema
*/
$master_tables = 'SELECT COUNT(master_table), master_table'
. ' FROM ' . PMA_backquote($GLOBALS['cfgRelation']['db']) . '.' . PMA_backquote($cfgRelation['relation'])
. ' WHERE master_db = \'' . $db . '\''
. ' WHERE master_db = \'' . PMA_sqlAddSlashes($db) . '\''
. ' GROUP BY master_table'
. ' ORDER BY ' . PMA_backquote('COUNT(master_table)') . ' DESC ';
$master_tables_rs = PMA_query_as_controluser($master_tables, false, $query_default_option);
. ' ORDER BY COUNT(master_table) DESC';
$master_tables_rs = PMA_query_as_controluser($master_tables, false, PMA_DBI_QUERY_STORE);
if ($master_tables_rs && PMA_DBI_num_rows($master_tables_rs) > 0) {
/* first put all the master tables at beginning
* of the list, so they are near the center of
@ -703,7 +725,7 @@ class PMA_User_Schema
}
if (isset($this->autoLayoutInternal) || isset($this->autoLayoutForeign)) {
$this->addRelationCoordinates($all_tables,$pageNumber,$db, $cfgRelation,$query_default_option);
$this->addRelationCoordinates($all_tables,$pageNumber,$db, $cfgRelation);
}
$this->chosenPage = $pageNumber;
@ -719,7 +741,7 @@ class PMA_User_Schema
* @return void
* @access private
*/
public function addRelationCoordinates($all_tables,$pageNumber,$db, $cfgRelation,$query_default_option)
public function addRelationCoordinates($all_tables,$pageNumber,$db, $cfgRelation)
{
/*
* Now generate the coordinates for the schema
@ -737,7 +759,7 @@ class PMA_User_Schema
$insert_query = 'INSERT INTO ' . PMA_backquote($GLOBALS['cfgRelation']['db']) . '.' . PMA_backquote($cfgRelation['table_coords']) . ' '
. '(db_name, table_name, pdf_page_number, x, y) '
. 'VALUES (\'' . PMA_sqlAddSlashes($db) . '\', \'' . PMA_sqlAddSlashes($current_table) . '\',' . $pageNumber . ',' . $pos_x . ',' . $pos_y . ')';
PMA_query_as_controluser($insert_query, false, $query_default_option);
PMA_query_as_controluser($insert_query, false);
/*
* compute for the next table
@ -775,7 +797,7 @@ class PMA_User_Schema
* @return void
* @access private
*/
private function _editCoordinates($db, $cfgRelation,$query_default_option)
private function _editCoordinates($db, $cfgRelation)
{
for ($i = 0; $i < $this->c_table_rows; $i++) {
$arrvalue = 'c_table_' . $i;
@ -792,7 +814,7 @@ class PMA_User_Schema
. ' WHERE db_name = \'' . PMA_sqlAddSlashes($db) . '\''
. ' AND table_name = \'' . PMA_sqlAddSlashes($arrvalue['name']) . '\''
. ' AND pdf_page_number = \'' . PMA_sqlAddSlashes($this->chosenPage) . '\'';
$test_rs = PMA_query_as_controluser($test_query, false, $query_default_option);
$test_rs = PMA_query_as_controluser($test_query, false, PMA_DBI_QUERY_STORE);
//echo $test_query;
if ($test_rs && PMA_DBI_num_rows($test_rs) > 0) {
if (isset($arrvalue['delete']) && $arrvalue['delete'] == 'y') {
@ -813,7 +835,7 @@ class PMA_User_Schema
. 'VALUES (\'' . PMA_sqlAddSlashes($db) . '\', \'' . PMA_sqlAddSlashes($arrvalue['name']) . '\', \'' . PMA_sqlAddSlashes($this->chosenPage) . '\',' . $arrvalue['x'] . ',' . $arrvalue['y'] . ')';
}
//echo $ch_query;
PMA_query_as_controluser($ch_query, false, $query_default_option);
PMA_query_as_controluser($ch_query, false);
} // end if
} // end for
}

View File

@ -280,13 +280,12 @@ class Table_Stats
/**
* Sets the width of the table
*
* @param string font The font name
* @param integer fontSize The font size
* @param string $font font name
* @param integer $fontSize font size
* @global object The current Visio XML document
* @access private
* @see PMA_VISIO
*/
function _setWidthTable($font,$fontSize)
private function _setWidthTable($font,$fontSize)
{
global $visio;

View File

@ -11,6 +11,9 @@ if (! defined('PHPMYADMIN')) {
/**
* Returns language name
*
* @param string $tmplang
* @return string
*/
function PMA_langName($tmplang)
{
@ -182,6 +185,8 @@ function PMA_langDetect($str, $envType)
* traditional) must be detected before 'zh' (chinese simplified) for
* example.
*
* @param string $lang
* @return array
*/
function PMA_langDetails($lang)
{

View File

@ -9,6 +9,9 @@
* @package phpMyAdmin
*/
/**
* @return array
*/
function getSysInfo()
{
$supported = array('Linux','WINNT');

View File

@ -3,8 +3,8 @@
/**
* Functions for the table-search page and zoom-search page
*
* Funtion PMA_tbl_getFields : Returns the fields of a table
* Funtion PMA_tbl_search_getWhereClause : Returns the where clause for query generation
* Funtion PMA_tbl_getFields : Returns the fields of a table
* Funtion PMA_tbl_search_getWhereClause : Returns the where clause for query generation
*
* @package phpMyAdmin
*/
@ -13,7 +13,7 @@ require_once 'url_generating.lib.php';
/**
* PMA_tbl_setTitle() sets the title for foreign keys display link
*
*
* @param $propertiesIconic Type of icon property
* @param $themeImage Icon Image
* @return string $str Value of the Title
@ -51,20 +51,26 @@ function PMA_tbl_setTitle($propertiesIconic,$pmaThemeImage){
* @param $db Selected database
* @param $table Selected table
*
* @return array($fields_list,$fields_type,$fields_collation,$fields_null) Array containing the field list, field types, collations and null constatint
* @return array($fields_list,$fields_type,$fields_collation,$fields_null) Array containing the field list, field types, collations and null constatint
*
*/
function PMA_tbl_getFields($table,$db) {
// Gets the list and number of fields
$result = PMA_DBI_query('SHOW FULL FIELDS FROM ' . PMA_backquote($table) . ' FROM ' . PMA_backquote($db) . ';', null, PMA_DBI_QUERY_STORE);
$fields_cnt = PMA_DBI_num_rows($result);
$fields_list = $fields_null = $fields_type = $fields_collation = array();
$geom_column_present = false;
$geom_types = PMA_getGISDatatypes();
while ($row = PMA_DBI_fetch_assoc($result)) {
$fields_list[] = $row['Field'];
$type = $row['Type'];
// check whether table contains geometric columns
if (in_array($type, $geom_types)) {
$geom_column_present = true;
}
// reformat mysql query output
if (strncasecmp($type, 'set', 3) == 0
|| strncasecmp($type, 'enum', 4) == 0) {
@ -93,20 +99,26 @@ function PMA_tbl_getFields($table,$db) {
PMA_DBI_free_result($result);
unset($result, $type);
return array($fields_list,$fields_type,$fields_collation,$fields_null);
return array($fields_list,$fields_type,$fields_collation,$fields_null, $geom_column_present);
}
/* PMA_tbl_setTableHeader() sets the table header for displaying a table in query-by-example format
*
* @return HTML content, the tags and content for table header
* @return HTML content, the tags and content for table header
*
*/
function PMA_tbl_setTableHeader(){
function PMA_tbl_setTableHeader($geom_column_present = false){
// Display the Function column only if there is alteast one geomety colum
$func = '';
if ($geom_column_present) {
$func = '<th>' . __('Function') . '</th>';
}
return '<thead>
<tr><th>' . __('Column') . '</th>
<tr>' . $func . '<th>' . __('Column') . '</th>
<th>' . __('Type') . '</th>
<th>' . __('Collation') . '</th>
<th>' . __('Operator') . '</th>
@ -117,9 +129,9 @@ return '<thead>
}
/* PMA_tbl_getSubTabs() returns an array with necessary configrations to create sub-tabs(Table Search and Zoom Search) in the table_select page
/* PMA_tbl_getSubTabs() returns an array with necessary configrations to create sub-tabs(Table Search and Zoom Search) in the table_select page
*
* @return array $subtabs Array containing configuration (icon,text,link,id,args) of sub-tabs for Table Search and Zoom search
* @return array $subtabs Array containing configuration (icon,text,link,id,args) of sub-tabs for Table Search and Zoom search
*
*/
@ -137,7 +149,7 @@ function PMA_tbl_getSubTabs(){
$subtabs['zoom']['link'] = 'tbl_zoom_select.php';
$subtabs['zoom']['text'] = __('Zoom Search');
$subtabs['zoom']['id'] = 'zoom_search_id';
return $subtabs;
}
@ -164,12 +176,13 @@ function PMA_tbl_getSubTabs(){
* @param $titles Selected title
* @param $foreignMaxLimit Max limit of displaying foreign elements
* @param $fields Array of search criteria inputs
* @param $in_fbs In function based search
*
* @return string $str HTML content for viewing foreing data and elements for search criteria input.
* @return string $str HTML content for viewing foreing data and elements for search criteria input.
*
*/
function PMA_getForeignFields_Values($foreigners, $foreignData, $field, $tbl_fields_type, $i, $db, $table,$titles,$foreignMaxLimit, $fields){
function PMA_getForeignFields_Values($foreigners, $foreignData, $field, $tbl_fields_type, $i, $db, $table, $titles, $foreignMaxLimit, $fields, $in_fbs = false){
$str = '';
@ -185,29 +198,40 @@ function PMA_getForeignFields_Values($foreigners, $foreignData, $field, $tbl_fie
$foreignData['foreign_display'],
'', $foreignMaxLimit);
$str .= ' </select>' . "\n";
}
}
elseif ($foreignData['foreign_link'] == true) {
if(isset($fields[$i]) && is_string($fields[$i])){
$str .= '<input type="text" id="fieldID_' . $i .'"name="fields[' . $i . '] " value="' . $fields[$i] . '"';
'id="field_' . md5($field) . '[' . $i .']"
class="textfield"/>' ;
'id="field_' . md5($field) . '[' . $i .']"
class="textfield"/>' ;
}
else{
$str .= '<input type="text" id="fieldID_' . $i .'"name="fields[' . $i . '] "';
'id="field_' . md5($field) . '[' . $i .']"
class="textfield" />' ;
'id="field_' . md5($field) . '[' . $i .']"
class="textfield" />' ;
}
?>
<?php $str .= '<script type="text/javascript">';
// <![CDATA[
$str .= <<<EOT
<a target="_blank" onclick="window.open(this.href, 'foreigners', 'width=640,height=240,scrollbars=yes'); return false" href="browse_foreigners.php?
<a target="_blank" onclick="window.open(this.href, 'foreigners', 'width=640,height=240,scrollbars=yes'); return false" href="browse_foreigners.php?
EOT;
$str .= '' . PMA_generate_common_url($db, $table) . '&amp;field=' . urlencode($field) . '&amp;fieldkey=' . $i . '">' . str_replace("'", "\'", $titles['Browse']) . '</a>';
// ]]
$str .= '</script>';
}
elseif (strncasecmp($tbl_fields_type[$i], 'enum', 4) == 0) {
} elseif (in_array($tbl_fields_type[$i], PMA_getGISDatatypes())) {
// g e o m e t r y
$str .= '<input type="text" name="fields[' . $i . ']"'
.' size="40" class="textfield" id="field_' . $i . '" />' . "\n";
if ($in_fbs) {
$edit_url = 'gis_data_editor.php?' . PMA_generate_common_url();
$edit_str = PMA_getIcon('b_edit.png', __('Edit/Insert'), true);
$str .= '<span class="open_search_gis_editor">';
$str .= PMA_linkOrButton($edit_url, $edit_str, array(), false, false, '_blank');
$str .= '</span>';
}
} elseif (strncasecmp($tbl_fields_type[$i], 'enum', 4) == 0) {
// e n u m s
$enum_value=explode(', ', str_replace("'", '', substr($tbl_fields_type[$i], 5, -1)));
$cnt_enum_value = count($enum_value);
@ -224,7 +248,7 @@ EOT;
}
} // end for
$str .= ' </select>' . "\n";
}
}
else {
// o t h e r c a s e s
$the_class = 'textfield';
@ -267,17 +291,61 @@ EOT;
* @param $func_type Search fucntion/operator
* @param $unaryFlag Whether operator unary or not
*
* @return string $str HTML content for viewing foreing data and elements for search criteria input.
* @return string $str HTML content for viewing foreing data and elements for search criteria input.
*
*/
function PMA_tbl_search_getWhereClause($fields, $names, $types, $collations, $func_type, $unaryFlag){
function PMA_tbl_search_getWhereClause($fields, $names, $types, $collations, $func_type, $unaryFlag, $geom_func = null){
/**
* @todo move this to a more apropriate place
*/
$geom_unary_functions = array(
'IsEmpty' => 1,
'IsSimple' => 1,
'IsRing' => 1,
'IsClosed' => 1,
);
$w = '';
// If geometry function is set apply it to the field name
if ($geom_func != null && trim($geom_func) != '') {
// Get details about the geometry fucntions
$geom_funcs = PMA_getGISFunctions($types, true, false);
// If the function takes a single parameter
if ($geom_funcs[$geom_func]['params'] == 1) {
$backquoted_name = $geom_func . '(' . PMA_backquote($names) . ')';
// If the function takes two parameters
} else {
// create gis data from the string
$gis_data = PMA_createGISData($fields);
$w = $geom_func . '(' . PMA_backquote($names) . ',' . $gis_data . ')';
return $w;
}
// New output type is the output type of the function being applied
$types = $geom_funcs[$geom_func]['type'];
// If the intended where clause is something like 'IsEmpty(`spatial_col_name`)'
if (isset($geom_unary_functions[$geom_func]) && trim($fields) == '') {
$w = $backquoted_name;
return $w;
}
} else {
$backquoted_name = PMA_backquote($names);
}
$w = '';
if($unaryFlag){
$fields = '';
$w = PMA_backquote($names) . ' ' . $func_type;
$w = $backquoted_name . ' ' . $func_type;
} elseif (in_array($types, PMA_getGISDatatypes())) {
// create gis data from the string
$gis_data = PMA_createGISData($fields);
$w = $backquoted_name . ' ' . $func_type . ' ' . $gis_data;
} elseif (strncasecmp($types, 'enum', 4) == 0) {
if (!empty($fields)) {
@ -304,7 +372,7 @@ function PMA_tbl_search_getWhereClause($fields, $names, $types, $collations, $fu
$enum_where .= ', \'' . PMA_sqlAddslashes($fields[$e]) . '\'';
}
$w = PMA_backquote($names) . ' ' . $func_type . ' ' . $parens_open . $enum_where . $parens_close;
$w = $backquoted_name . ' ' . $func_type . ' ' . $parens_open . $enum_where . $parens_close;
}
} elseif ($fields != '') {
@ -336,12 +404,12 @@ function PMA_tbl_search_getWhereClause($fields, $names, $types, $collations, $fu
$value = $quot . PMA_sqlAddslashes(trim($value)) . $quot;
if ($func_type == 'BETWEEN' || $func_type == 'NOT BETWEEN')
$w = PMA_backquote($names) . ' ' . $func_type . ' ' . (isset($values[0]) ? $values[0] : '') . ' AND ' . (isset($values[1]) ? $values[1] : '');
$w = $backquoted_name . ' ' . $func_type . ' ' . (isset($values[0]) ? $values[0] : '') . ' AND ' . (isset($values[1]) ? $values[1] : '');
else
$w = PMA_backquote($names) . ' ' . $func_type . ' (' . implode(',', $values) . ')';
$w = $backquoted_name . ' ' . $func_type . ' (' . implode(',', $values) . ')';
}
else {
$w = PMA_backquote($names) . ' ' . $func_type . ' ' . $quot . PMA_sqlAddslashes($fields) . $quot;;
$w = $backquoted_name . ' ' . $func_type . ' ' . $quot . PMA_sqlAddslashes($fields) . $quot;;
}
} // end if

View File

@ -9,12 +9,12 @@
/**
* Gets zip file contents
*
* @param string $file
* @param string $specific_entry regular expression to match a file
* @return array ($error_message, $file_data); $error_message
* is empty if no error
*/
function PMA_getZipContents($file)
function PMA_getZipContents($file, $specific_entry = null)
{
$error_message = '';
$file_data = '';
@ -28,11 +28,15 @@ function PMA_getZipContents($file)
$read = zip_entry_read($first_zip_entry);
$ods_mime = 'application/vnd.oasis.opendocument.spreadsheet';
if (!strcmp($ods_mime, $read)) {
$specific_entry = '/^content\.xml$/';
}
if (isset($specific_entry)) {
/* Return the correct contents, not just the first entry */
for ( ; ; ) {
$entry = zip_read($zip_handle);
if (is_resource($entry)) {
if (!strcmp('content.xml', zip_entry_name($entry))) {
if (preg_match($specific_entry, zip_entry_name($entry))) {
zip_entry_open($zip_handle, $entry, 'r');
$file_data = zip_entry_read($entry, zip_entry_filesize($entry));
zip_entry_close($entry);
@ -41,15 +45,15 @@ function PMA_getZipContents($file)
} else {
/**
* Either we have reached the end of the zip and still
* haven't found 'content.xml' or there was a parsing
* haven't found $specific_entry or there was a parsing
* error that we must display
*/
if ($entry === false) {
$error_message = __('Error in ZIP archive:') . ' Could not find "content.xml"';
$error_message = __('Error in ZIP archive:') . ' Could not find "' . $specific_entry . '"';
} else {
$error_message = __('Error in ZIP archive:') . ' ' . PMA_getZipError($zip_handle);
}
break;
}
}
@ -68,6 +72,69 @@ function PMA_getZipContents($file)
return (array('error' => $error_message, 'data' => $file_data));
}
/**
* Returns the file name of the first file that matches the given $file_regexp.
*
* @param string $file_regexp regular expression for the file name to match
* @param string $file zip archive
*/
function PMA_findFileFromZipArchive ($file_regexp, $file)
{
$zip_handle = zip_open($file);
$found = false;
if (is_resource($zip_handle)) {
$entry = zip_read($zip_handle);
while (is_resource($entry)) {
if (preg_match($file_regexp, zip_entry_name($entry))) {
$file_name = zip_entry_name($entry);
zip_close($zip_handle);
return $file_name;
}
$entry = zip_read($zip_handle);
}
}
zip_close($zip_handle);
return false;
}
/**
* Returns the number of files in the zip archive.
*
* @param string $file
*/
function PMA_getNoOfFilesInZip($file)
{
$count = 0;
$zip_handle = zip_open($file);
$found = false;
if (is_resource($zip_handle)) {
$entry = zip_read($zip_handle);
while (is_resource($entry)) {
$count++;
$entry = zip_read($zip_handle);
}
}
zip_close($zip_handle);
return $count;
}
/**
* Extracts a set of files from the given zip archive to a given destinations.
*
* @param string $zip_path
* @param string $destination
* @param array $entries
*/
function PMA_zipExtract($zip_path, $destination, $entries) {
$zip = new ZipArchive;
if ($zip->open($zip_path) === true) {
$zip->extractTo($destination, $entries);
$zip->close();
return true;
}
return false;
}
/**
* Gets zip error message
*

View File

@ -8,7 +8,7 @@
include_once 'pmd_common.php';
/**
* If called directly from the designer, first save the positions
* If called directly from the designer, first save the positions
*/
if (! isset($scale)) {
$no_die_save_pos = 1;
@ -25,11 +25,7 @@ if (isset($mode)) {
$scale_q = PMA_sqlAddSlashes($scale);
if ('create_export' == $mode) {
/*
* @see pdf_pages.php
*/
$query_default_option = PMA_DBI_QUERY_STORE;
$pdf_page_number = PMA_REL_create_page($newpage, $cfgRelation, $db, $query_default_option);
$pdf_page_number = PMA_REL_create_page($newpage, $cfgRelation, $db);
if ($pdf_page_number > 0) {
$message = PMA_Message::success(__('Page has been created'));
$mode = 'export';
@ -57,7 +53,7 @@ if (isset($mode)) {
' . $pmd_table . '.`table_name` = ' . $pma_table . '.`table_name`
AND
' . $pmd_table . '.`db_name`=\''. PMA_sqlAddSlashes($db) .'\'
AND pdf_page_number = ' . $pdf_page_number_q . ';', true, PMA_DBI_QUERY_STORE);
AND pdf_page_number = ' . $pdf_page_number_q . ';', true, PMA_DBI_QUERY_STORE);
}
}
@ -68,20 +64,20 @@ require_once './libraries/header_meta_style.inc.php';
<body>
<br>
<div>
<?php
if (!empty($message)) {
<?php
if (!empty($message)) {
$message->display();
}
?>
<form name="form1" method="post" action="pmd_pdf.php">
<?php
<?php
echo PMA_generate_common_hidden_inputs($db);
echo '<div>';
echo '<fieldset><legend>' . __('Import/Export coordinates for PDF schema') . '</legend>';
$choices = array();
$table_info_result = PMA_query_as_controluser('SELECT * FROM '
$table_info_result = PMA_query_as_controluser('SELECT * FROM '
. PMA_backquote($GLOBALS['cfgRelation']['db']) . '.' . PMA_backquote($cfgRelation['pdf_pages'])
. ' WHERE db_name = \'' . PMA_sqlAddSlashes($db) . '\'');

2260
po/af.po

File diff suppressed because it is too large Load Diff

2267
po/ar.po

File diff suppressed because it is too large Load Diff

2280
po/az.po

File diff suppressed because it is too large Load Diff

2283
po/be.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

2276
po/bg.po

File diff suppressed because it is too large Load Diff

2419
po/bn.po

File diff suppressed because it is too large Load Diff

2258
po/br.po

File diff suppressed because it is too large Load Diff

2274
po/bs.po

File diff suppressed because it is too large Load Diff

2280
po/ca.po

File diff suppressed because it is too large Load Diff

2298
po/cs.po

File diff suppressed because it is too large Load Diff

2266
po/cy.po

File diff suppressed because it is too large Load Diff

2308
po/da.po

File diff suppressed because it is too large Load Diff

2503
po/de.po

File diff suppressed because it is too large Load Diff

2314
po/el.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

2614
po/es.po

File diff suppressed because it is too large Load Diff

2281
po/et.po

File diff suppressed because it is too large Load Diff

2275
po/eu.po

File diff suppressed because it is too large Load Diff

2261
po/fa.po

File diff suppressed because it is too large Load Diff

2280
po/fi.po

File diff suppressed because it is too large Load Diff

2314
po/fr.po

File diff suppressed because it is too large Load Diff

2279
po/gl.po

File diff suppressed because it is too large Load Diff

2275
po/he.po

File diff suppressed because it is too large Load Diff

2278
po/hi.po

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More