Главная » Полезные статьи » MySQL » Конвертация баз MySQL в dBase
Распечатать статью

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

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

Источник:  internet-technologies.ru

Вы можете оставить комментарий, или обратную ссылку на Ваш сайт.

Оставить комментарий

Похожие статьи