Конвертация баз MySQL в dBase

Во многих предприятиях, разместивших свои ресурсы в интернете, осталось большое количество программных комплексов и различных скриптов, работающих с данными в формате dBase. Появилась задача обратной совместимости.

Данный класс поможет Вам преобразовывать базы данных MySQL в dBase.

Для работы этого скрипта необходимо, чтобы PHP был скомпилирован с поддержкой dBase. Чтобы узнать это, достаточно вызвать функцию phpinfo(). Если в строке Configure Command сведений о версии PHP есть параметр --enable-dbase, значит Ваша версия поддерживает dBase (можно также посмотреть в разделе Additional Modules наличие строки dBase).


class ConvdBase
{
var $conv_dir;  // каталог конвертации - здесь будут DBF-файлы

var $struct;    // структура текущей таблицы,
// используется при конвертации данных

function ConvdBase($dir)
{
$this->setoutdir($dir);
}

// имя поля и его тип формата MySQL преобразуем к dBase
// например: code int(10), преобразуем к array('code', 'N', 10, 0)
// если $mysql == true, то возвращаем только тип int
// который записывается в $this->struct
function getfield($f_name, $f_type, $mysql = false)
{
$len = 0;
$perc = 0;

$pos = strpos($f_type, '(');
if($pos)
{
$type = strtolower(substr($f_type, 0, $pos));
sscanf(substr($f_type, $pos), '(%d,%d)', &$len, &$perc);
}
else
$type = strtolower($f_type);

if($mysql)
return $type;

switch($type)
{
case 'double': case 'float':
$len  = 19; $perc = 3;
$type = 'N';
break;
case 'enum':
$len = 5;
case 'int': case 'tinyint': case 'smallint':
if(!$len)
$len = 19;
$perc = 0;
// break не нужен
case 'decimal':
$type = 'N';
break;
case 'tinytext': case 'text': case 'longtext':
case 'varchar': case 'char':
if(!$len || $len > 254)
$len = 254;
$type = 'C';
break;
case 'year': case 'datetime': case 'timestamp':
$len = $perc = 0;
$type = 'D';
break;
}
$field = array($f_name, $type, $len, $perc);
return $field;
}

// установка исходящего каталога
function setoutdir($dir)
{
$this->conv_dir = $dir;
@mkdir($this->conv_dir, 0777);
}

// конвертация данных
function convertdata($row)
{
$data = array();
for($i = 0; $i struct); $i++)
{
switch($this->struct[$i])
{
case 'year': case 'datetime': case 'timestamp':
$data[] = substr($row[$i], 0, 8);
break;
case 'tinytext': case 'text': case 'longtext':
case 'varchar':  case 'char':
if(strlen($row[$i]) > 254)
{
$data[] = substr($row[$i], 0, 254);
break;
}
// break не нужен
case 'smallint': case 'double': case 'float': case 'enum':
case 'int': case 'tinyint': case 'decimal': case 'int':
$data[] = $row[$i];
break;
}
}
return $data;
}

// конвертируем базу
function convert($server, $user, $password, $db_name)
{
// отключить тайм-аут
if( !get_cfg_var('safe_mode') )
set_time_limit(0);

$link = mysql_connect($server, $user, $password);
if(!$link)
exit('Error connect');

mysql_select_db($db_name);
$tables_query = mysql_query('SHOW TABLES', $link);

$tek_table = 0; // порядковый номер таблицы - если обязательно
// требуется имя файла не более 8 символов
while($tables = mysql_fetch_array($tables_query, MYSQL_NUM) )
{
$table = $tables[0];

$field_array = array();
$this->struct = array();

// создаем структуру таблицы
$fields_query = mysql_query('SHOW FIELDS FROM ' . $table);
$tek_field = 0;
while ($field = mysql_fetch_array($fields_query, MYSQL_ASSOC) )
{
$f_name = $field['Field'];

// имена полей dBase не должны быть более 10 символов
if(strlen($f_name) > 10)
$f_name = sprintf('%s%03d', substr($f_name, 0, 7), sizeof($field_array) + 1);

$field_array[] = $this->getfield($f_name, $field['Type']);
$this->struct[] = $this->getfield($tek_field, $field['Type'], true);
}

if(strlen($table) > 8) // см.выше о именах таблиц более 8 символов
$table_name = sprintf('%s%03d', substr($table, 0, 5), $tek_table++);
else
$table_name = $table;

$base = dbase_create( $this->conv_dir . '/' . $table_name . '.DBF', $field_array);
if($base)
{
// таблица создана - перекидываем данные
$rows_query = mysql_query("SELECT * FROM " . $table);
while($row = mysql_fetch_array($rows_query, MYSQL_NUM))
{
$row = $this->convertdata($row);
if($row)
if( !dbase_add_record($base, $row) )
exit('Error add record');
}
dbase_close($base);
}
}
mysql_close($link);
}
}
?>


А теперь рассмотрим пример использования конвертатора.

$dir = './CONVERT_' . date('YmdHi'); // здесь будут DBF
$conv = new ConvdBase($dir);
$conv->convert('localhost', 'user', 'pass', 'base');


Если типы данных year, datetime, timestamp надо передавать в неизменном виде, приведите их к типу dBase "С", изменив функции getfield и convertdata.

Читать комменты и комментировать

Добавить комментарий / отзыв



Защитный код
Обновить

Конвертация баз MySQL в dBase | | 2010-09-12 23:35:36 | | Базы данных | | Во многих предприятиях, разместивших свои ресурсы в интернете, осталось большое количество программных комплексов и различных скриптов, работающих с данными в формате dBase. Появилась задача обратной | РэдЛайн, создание сайта, заказать сайт, разработка сайтов, реклама в Интернете, продвижение, маркетинговые исследования, дизайн студия, веб дизайн, раскрутка сайта, создать сайт компании, сделать сайт, создание сайтов, изготовление сайта, обслуживание сайтов, изготовление сайтов, заказать интернет сайт, создать сайт, изготовить сайт, разработка сайта, web студия, создание веб сайта, поддержка сайта, сайт на заказ, сопровождение сайта, дизайн сайта, сайт под ключ, заказ сайта, реклама сайта, хостинг, регистрация доменов, хабаровск, краснодар, москва, комсомольск |
 
Поделиться с друзьями: