Во многих предприятиях, разместивших свои ресурсы в интернете, осталось большое количество
программных комплексов и различных скриптов, работающих с данными в формате dbase.
Появилась задача обратной совместимости.
Данный класс поможет Вам преобразовывать базы данных mysql в dbase.
Для работы этого скрипта необходимо, чтобы php был скомпилирован с поддержкой dbase.
Чтобы узнать это, достаточно вызвать функцию phpinfo(). Если в строке configure command
сведений о версии php есть параметр --enable-dbase, значит Ваша версия поддерживает dbase
(можно также посмотреть в разделе additional modules наличие строки dbase).
- < ?php
- 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 < sizeof($this->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.
Постоянные ссылки
При копировании ссылка на TeaM RSN обязательна!
Оставить комментарий
Вы должны войти, чтобы оставить комментарий.