Во многих предприятиях, разместивших свои ресурсы в интернете, осталось большое количество
программных комплексов и различных скриптов, работающих с данными в формате 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 обязательна!
Оставить комментарий
Вы должны войти, чтобы оставить комментарий.