phpmyadmin/libraries/plugins/import/ImportDocsql.class.php
2012-06-19 14:53:04 +03:00

204 lines
6.1 KiB
PHP

<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* DocSQL import plugin for phpMyAdmin
*
* @package PhpMyAdmin-Import
* @subpackage DocSQL
*/
if (! defined('PHPMYADMIN')) {
exit;
}
/* Get the import interface */
require_once "libraries/plugins/ImportPlugin.class.php";
// We need relations enabled and we work only on database
if ($GLOBALS['plugin_param'] !== 'database') {
$GLOBALS['skip_import'] = true;
return;
}
/**
* Handles the import for the DocSQL format
*
* @package PhpMyAdmin-Import
*/
class ImportDocsql extends ImportPlugin
{
/**
* Relations configuration
*
* @var array
*/
private $_cfgRelation;
/**
* Constructor
*/
public function __construct()
{
$this->setProperties();
}
/**
* Sets the import plugin properties.
* Called in the constructor.
*
* @return void
*/
protected function setProperties()
{
$this->_setCfgRelation(PMA_getRelationsParam());
$cfgRelation = $this->_getCfgRelation();
if ( $GLOBALS['num_tables'] < 1
|| ! $cfgRelation['relwork']
|| ! $cfgRelation['commwork']
) {
return;
}
$this->properties = array(
'text' => __('DocSQL'),
'extension' => '',
'options' => array(),
'options_text' => __('Options'),
);
$this->properties['options'] = array(
array(
'type' => 'begin_group',
'name' => 'general_opts'
),
array(
'type' => 'text',
'name' => 'table',
'text' => __('Table name')
),
array(
'type' => 'end_group'
)
);
}
/**
* This method is called when any PluginManager to which the observer
* is attached calls PluginManager::notify()
*
* @param SplSubject $subject The PluginManager notifying the observer
* of an update.
*
* @return void
*/
public function update (SplSubject $subject)
{
}
/**
* Handles the whole import logic
*
* @return void
*/
public function doImport()
{
global $error, $timeout_passed, $finished;
$cfgRelation = $this->_getCfgRelation();
$tab = $_POST['docsql_table'];
$buffer = '';
/* Read whole buffer, we except it is small enough */
while (! $finished && ! $error && ! $timeout_passed) {
$data = PMA_importGetNextChunk();
if ($data === false) {
// subtract data we didn't handle yet and stop processing
break;
} elseif ($data === true) {
// nothing to read
break;
} else {
// Append new data to buffer
$buffer .= $data;
}
} // End of import loop
/* Process the data */
if ($data === true && ! $error && ! $timeout_passed) {
$buffer = str_replace("\r\n", "\n", $buffer);
$buffer = str_replace("\r", "\n", $buffer);
$lines = explode("\n", $buffer);
foreach ($lines AS $lkey => $line) {
//echo '<p>' . $line . '</p>';
$inf = explode('|', $line);
if (!empty($inf[1]) && strlen(trim($inf[1])) > 0) {
$qry = '
INSERT INTO
' . PMA_backquote($cfgRelation['db']) . '.'
. PMA_backquote($cfgRelation['column_info']) . '
(db_name, table_name, column_name, comment)
VALUES (
\'' . PMA_sqlAddSlashes($GLOBALS['db']) . '\',
\'' . PMA_sqlAddSlashes(trim($tab)) . '\',
\'' . PMA_sqlAddSlashes(trim($inf[0])) . '\',
\'' . PMA_sqlAddSlashes(trim($inf[1])) . '\')';
PMA_importRunQuery(
$qry, $qry . '-- ' . htmlspecialchars($tab)
. '.' . htmlspecialchars($inf[0]), true
);
} // end inf[1] exists
if (!empty($inf[2]) && strlen(trim($inf[2])) > 0) {
$for = explode('->', $inf[2]);
$qry = '
INSERT INTO
' . PMA_backquote($cfgRelation['db']) . '.'
. PMA_backquote($cfgRelation['relation']) . '
(master_db, master_table, master_field,'
. ' foreign_db, foreign_table, foreign_field)
VALUES (
\'' . PMA_sqlAddSlashes($GLOBALS['db']) . '\',
\'' . PMA_sqlAddSlashes(trim($tab)) . '\',
\'' . PMA_sqlAddSlashes(trim($inf[0])) . '\',
\'' . PMA_sqlAddSlashes($GLOBALS['db']) . '\',
\'' . PMA_sqlAddSlashes(trim($for[0])) . '\',
\'' . PMA_sqlAddSlashes(trim($for[1])) . '\')';
PMA_importRunQuery(
$qry, $qry . '-- ' . htmlspecialchars($tab)
. '.' . htmlspecialchars($inf[0])
. '(' . htmlspecialchars($inf[2]) . ')', true
);
} // end inf[2] exists
} // End lines loop
} // End import
// Commit any possible data in buffers
PMA_importRunQuery();
}
/* ~~~~~~~~~~~~~~~~~~~~ Getters and Setters ~~~~~~~~~~~~~~~~~~~~ */
/**
* Gets relation configuration
*
* @return array
*/
private function _getCfgRelation()
{
return $this->_cfgRelation;
}
/**
* Sets relation configuration
*
* @param array $cfgRelation relation configuration
*
* @return void
*/
private function _setCfgRelation($cfgRelation)
{
$this->_cfgRelation = $cfgRelation;
}
}