You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
cosmopet.ae/wp-content/plugins copy/wp-all-import/libraries/XmlImportSQLParse.php

119 lines
3.1 KiB

<?php
class PMXI_SQLParser{
public $xml_path;
public $_filename;
public $targetDir;
public function __construct($path, $targetDir = false){
$this->_filename = $path;
$wp_uploads = wp_upload_dir();
$this->targetDir = ( ! $targetDir ) ? wp_all_import_secure_file($wp_uploads['basedir'] . DIRECTORY_SEPARATOR . PMXI_Plugin::UPLOADS_DIRECTORY ) : $targetDir;
}
public function parse(){
$tmpname = wp_unique_filename($this->targetDir, str_replace("sql", "xml", basename($this->_filename)));
$this->xml_path = $this->targetDir . '/' . wp_all_import_url_title($tmpname);
$this->toXML();
return $this->xml_path;
}
protected function toXML(){
$fp = fopen($this->_filename, 'rb');
fseek($fp, 0);
$xmlWriter = new XMLWriter();
$xmlWriter->openURI($this->xml_path);
$xmlWriter->setIndent(true);
$xmlWriter->setIndentString("\t");
$xmlWriter->startDocument('1.0', 'UTF-8');
$xmlWriter->startElement('data');
while( ! feof($fp) )
{
//reset time limit for big files
set_time_limit(0);
$sql = fread($fp, 1024 * 8);
$count = preg_match_all("%INSERT INTO .*;%Uis", $sql, $matches);
if ( $count ){
foreach ($matches[0] as $key => $insert) {
$current_table = 'node';
$table = preg_match_all("%INTO\s*[^\(].*\(%Uis", $insert, $table_matches);
if ( $table )
$current_table = sanitize_key(trim(trim(str_replace('INTO', '', trim($table_matches[0][0],'('))), '`'));
$rawData = array();
$headers = preg_match_all("%\(.*\)\s*VALUES%Uis", $insert, $headers_matches);
if ( $headers ){
foreach ($headers_matches[0] as $hdr_key => $found_headers) {
$hdrs = explode(',', rtrim(ltrim(trim(rtrim(trim($found_headers), 'VALUES')),'('),')'));
if ( ! empty($hdrs) ){
foreach ($hdrs as $header) {
$rawData[ sanitize_key(trim(trim($header), '`')) ] = '';
}
}
}
$values = preg_match_all("%\([^`].*\)\s*[,|;]{1}%Uis", $insert, $values_matches);
if ( $values ){
foreach ($values_matches[0] as $val_key => $value) {
$insertData = array();
$vals = explode(',', rtrim(ltrim(trim(rtrim(rtrim(trim($value), ','),';')),'('),')'));
if ( ! empty($vals) ){
$i = 0;
foreach ($rawData as $r_key => $v) {
foreach ($vals as $k => $val) {
if ($i == $k) $insertData[$r_key] = trim(trim($val),"'");
}
$i++;
}
}
if ( ! empty($insertData)){
$xmlWriter->startElement($current_table);
foreach ($insertData as $h => $xml_value) {
$xmlWriter->startElement($h);
$xmlWriter->writeCData($xml_value);
$xmlWriter->endElement();
}
$xmlWriter->endElement();
}
}
}
}
}
}
}
fclose($fp);
$xmlWriter->endElement();
$xmlWriter->flush(true);
return true;
}
}