[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные




Базы Данных / MySQL /

Конвертация баз 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;
     }
     $fie
ld = 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.




Комментарии

 Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



Последние статьи: Базы Данных / MySQL /

Близкие контакты третьего вида с Visual Foxpro (или как написать свой провайдер для FoxPro)
12-03-2010   

Многие наверное как и я в свое время задавались интересным вопросом – “А вот как бы задействовать всю силу применяемой в моем проекте СУБД? Не только стандартные SQL запросы, а и скрытые возможности.” Тогда ведь можно будет получать результат найэффективнешими методам... подробнее

Кол. просмотров: общее - 5565 сегодня - 1

Oracle: Изучаем метки доступа к строкам: задание свойств столбца доступа в таблице
07-03-2010   

Эта статья рассматривает некоторые особенности средства label security в oracle. Здесь показана возможность секретить служебный столбец с метками доступа к строкам, а также рассмотрены некоторые правила правки меток. В первую очередь статья затрагивает использование параметра table_options процедуры apply_table_policy из пакета sa_policy_admin... подробнее

Кол. просмотров: общее - 4005 сегодня - 0

Простой журнал аудита на триггерах MySQL
07-03-2010   

Небольшая заметка об использовании триггеров в СУБД MySQL. Несмотря на достаточно приличный возраст этой СУБД, поддержка триггеров появилась только в 5-й версии и достаточно мало описана на русском языке... подробнее

Кол. просмотров: общее - 3916 сегодня - 0

Настройки mysql-server сразу после установки
07-03-2010   

Мой любимый вопрос, задаваемый DBA, которые хотят увеличить производительность MySQL: “какие параметры надо настраивать в первую очередь, сразу после установки сервера?”... подробнее

Кол. просмотров: общее - 3757 сегодня - 0

10+ способов обрушить mysql-сервер
07-03-2010   

Иногда у меня спрашивают о ошибках MySQL, (например таких), которые могут привести к обрушиванию mysql-сервера пользователем с обычными привелегиями. Потом звучит вопрос: “Что же делать в таких случаях? Как защититься от подобных ситуаций?”... подробнее

Кол. просмотров: общее - 9099 сегодня - 0



  WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects