четверг, 17 января 2019 г.

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

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

Автор: Алимов Рустем
Во многих предприятиях, разместивших свои ресурсы в интернете, осталось большое количество программных комплексов и различных скриптов, работающих с данными в формате dBase. Появилась задача обратной совместимости.
Данный класс поможет Вам преобразовывать базы данных MySQL в dBase.
Для работы этого скрипта необходимо, чтобы PHP был скомпилирован с поддержкой dBase. Чтобы узнать это, достаточно вызвать функцию phpinfo(). Если в строке Configure Command сведений о версии PHP есть параметр --enable-dbase, значит Ваша версия поддерживает dBase (можно также посмотреть в разделе Additional Modules наличие строки dBase).
<? PHP
класс ConvdBase
{
var $conv_dir; // каталог конвертации - здесь будут DBF-файлы
var $struct; // структура текущей таблицы,
// используется при конвертации данных
функция ConvdBase ($ dir)
{
$ This-> setoutdir ($ реж);
}
// имя поля и его тип формата MySQL преобразуем к dBase
// например: code int(10), преобразуем к array('code', 'N', 10, 0)
// если $mysql == true, то возвращаем только тип int
// который записывается в $this->struct
Функция getfield ($ f_name, $ f_type, $ mysql = false)
{
$ len = 0;
$ min = 0;
$ pos = strpos ($ f_type, '(');
если ($ поз)
{
$ type = strtolower (substr ($ f_type, 0, $ pos));
sscanf (substr ($ f_type, $ pos), '(% d,% d)', & $ len, & $ perc);
}
еще
$ type = strtolower ($ f_type);
если ($ MySQL)
вернуть тип $;
Переключатель ($ типа)
{
case 'double': case 'float':
$ len = 19; $ min = 3;
$ type = 'N';
перерыв;
case 'enum':
$ len = 5;
case 'int': case 'tinyint': case 'smallint':
if (! $ len)
$ len = 19;
$ min = 0;
// break не нужен
регистр 'десятичный':
$ type = 'N';
перерыв;
case 'tinytext': case 'text': case 'longtext':
case 'varchar': case 'char':
if (! $ len || $ len> 254)
$ len = 254;
$ type = 'C';
перерыв;
case 'year': case 'datetime': case 'timestamp':
$ len = $ min = 0;
$ type = 'D';
перерыв;
}
$ field = array ($ f_name, $ type, $ len, $ perc);
вернуть поле $;
}
// установка исходящего каталога
функция setoutdir ($ dir)
{
$ this-> conv_dir = $ dir;
@mkdir ($ this-> conv_dir, 0777);
}
// конвертация данных
функция convertdata ($ row)
{
$ data = array ();
для ($ i = 0; $ i <sizeof ($ this-> struct); $ i ++)
{
Переключатель ($ this-> структура [$ я])
{
case 'year': case 'datetime': case 'timestamp':
$ data [] = substr ($ row [$ i], 0, 8);
перерыв;
case 'tinytext': case 'text': case 'longtext':
case 'varchar': case 'char':
if (strlen ($ row [$ i])> 254)
{
$ data [] = substr ($ row [$ i], 0, 254);
перерыв;
}
// break не нужен
case 'smallint': case 'double': case 'float': case 'enum':
case 'int': case 'tinyint': case 'decimal': case 'int':
$ data [] = $ row [$ i];
перерыв;
}
}
вернуть данные $;
}
// конвертируем базу
функция преобразования ($ сервер, $ пользователь, $ пароль, $ db_name)
{
// отключить тайм-аут
if (! get_cfg_var ('safe_mode'))
set_time_limit (0);
$ link = mysql_connect ($ server, $ user, $ password);
если (! $ ссылка)
выход («Ошибка подключения»);
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 ('ПОКАЗАТЬ ПОЛЯ ИЗ'. $ таблица);
$ 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 ++);
еще
$ table_name = $ table;
$ base = dbase_create ($ this-> conv_dir. '/'. $ table_name. '.DBF', $ field_array);
если ($ основание)
{
// таблица создана - перекидываем данные
$ row_query = mysql_query ("SELECT * FROM". $ table);
while ($ row = mysql_fetch_array ($ row_query, MYSQL_NUM))
{
$ row = $ this-> convertdata ($ row);
если ($ строка)
if (! dbase_add_record ($ base, $ row))
выход («Ошибка добавления записи»);
}
dbase_close ($ основание);
}
}
mysql_close ($ ссылка);
}
}
?>
А теперь рассмотрим пример использования конвертатора.
$dir = './CONVERT_' . date('YmdHi'); // здесь будут DBF
$ conv = новая ConvdBase ($ dir);
$ conv-> convert ('localhost', 'user', 'pass', 'base');
Если типы данных year, datetime, timestamp надо передавать в неизменном виде, приведите их к типу dBase "С", изменив функции getfield и convertdata.