Блог And-rey.ru Блог And-rey.ru Блог And-rey.ru
Логин:
Регистрация Пароль:

Начало / Начало / xbase2mysql.pl


And-rey:xbase2mysql.pl (19.07.10 17:17)
  
Perl
  1. #!C:\Perl64\bin\perl.exe -w
  2.  
  3. #************************************************************************
  4. # Конвертер из XBase в MySQL v 0.2 (17.05.2010г.)
  5. #
  6. #************************************************************************
  7.  
  8. use strict;
  9. #use Data::Dump qw(dump);
  10. use DBI;
  11. use XBase;
  12.  
  13.  
  14. my (
  15.     %conf_xbase, %conf_mysql, @tables, %type, @ntables, $dbh_x, $dbh_m, $sth_x
  16.     );
  17.  
  18.  
  19. # Настройки для MySQL
  20. %conf_mysql = (
  21.                'host' => 'localhost',
  22.                'base' => 'test1',
  23.                'user' => 'root',
  24.                'pass' => '123'
  25.                );
  26.  
  27. # Настройки для XBase
  28. %conf_xbase = (
  29.                'dir' => 'D:\DBASES\COMMON\\'
  30.                );
  31.  
  32. # Только перечисленные таблицы (все если пусто)
  33. @tables = (
  34.            #'table_name',
  35.            );
  36.  
  37.  
  38. # соотношение типов столбцов
  39. #        XBase  MySQL
  40. %type = (
  41.          'N' => 'float',
  42.          'C' => 'char',
  43.          'M' => 'longtext',
  44.          'D' => 'date'
  45.          );
  46.  
  47.  
  48. my $time = time;
  49.  
  50.  
  51. $dbh_x = xbase_connect_1();
  52. $dbh_m = mysql_connect_1();
  53. $dbh_m->do(qq{SET NAMES 'cp1251'});
  54.  
  55.  
  56. # Создание таблиц в MySQL базе
  57. print "Создание таблиц:\n";
  58. my $num_table = 0;
  59. opendir(DIR, $conf_xbase{'dir'});
  60. foreach my $file (readdir(DIR)) {
  61.    
  62.     next if !($file =~ /(.+)\.dbf$/i);
  63.    
  64.     if (@tables) {
  65.         next if !(scalar(grep{$_ eq lc($1)} @tables));
  66.     }
  67.     $ntables[$num_table] = $1;
  68.    
  69.     my $table = new XBase $conf_xbase{'dir'}.$file or die XBase->errstr;
  70.    
  71.     my @names    = $table->field_names;
  72.     my @types    = $table->field_types;
  73.     my @lengths  = $table->field_lengths;
  74.     my @decimals = $table->field_decimals;
  75.    
  76.     my $i = 0;
  77.     my $sql = "CREATE TABLE IF NOT EXISTS `$1` (\n";
  78.     foreach (@names) {
  79.         die "Неизвесный тип - '$types[$i]'" unless exists $type{$types[$i]};
  80.         if ($type{$types[$i]} eq 'float') {
  81.             $sql .= "  `$_` $type{$types[$i]}($lengths[$i], $decimals[$i])";
  82.         } elsif ($type{$types[$i]} eq 'char') {
  83.             $sql .= "  `$_` $type{$types[$i]}($lengths[$i])";
  84.         } else {
  85.             $sql .= "  `$_` $type{$types[$i]}";
  86.         }
  87.         #$sql .= " NOT NULL,\n";
  88.         $sql .= ",\n";
  89.         $i++;
  90.     }
  91.     # индексы
  92.     if (-e $conf_xbase{'dir'}.$1.'.cdx') {
  93.         my $cur = $table->prepare_select_with_index($conf_xbase{'dir'}.$1.'.cdx');
  94.         my @index = @{$cur->[4]{tags}}; # проверить! -> print dump($cur);
  95.         foreach my $tag (@index) {
  96.             if (scalar(grep{$_ eq $tag} @names)) {
  97.                 $sql .= "  KEY `".lc($tag)."` (`$tag`),\n";
  98.             }
  99.         }
  100.     }
  101.     chop($sql); chop($sql);
  102.     $sql .= "\n) ENGINE=MyISAM DEFAULT CHARSET=cp1251\n\n";
  103.    
  104.     $table->close();
  105.     $dbh_m->do(qq{$sql});
  106.     $num_table++;
  107.    
  108. }
  109. closedir(DIR);
  110. print "  таблиц $num_table\n";
  111.  
  112.  
  113. # Импорт данных в MySQL базу
  114. print "Импорт данных в таблицу:\n";
  115. foreach my $table (@ntables) {
  116.    
  117.     print "  $table";
  118.    
  119.     $sth_x = $dbh_x->prepare("SELECT * FROM $table") or die $dbh_x->errstr();
  120.     $sth_x->execute() or die $sth_x->errstr();
  121.     my $num_row = 0;
  122.     while (my $row = $sth_x->fetchrow_hashref()) {
  123.         my @fields = sort keys %{$row};
  124.         my @values = @{$row}{@fields};
  125.         my $sql = sprintf "INSERT INTO `%s` (`%s`) VALUES (%s)",
  126.                   $table, join("`,`", @fields), join(",", ("?")x@fields);
  127.         $dbh_m->do(qq{$sql}, undef, @values);
  128.         $num_row++;
  129.     }
  130.     $sth_x->finish();
  131.     $dbh_m->do(qq{ OPTIMIZE TABLE `$table` });
  132.    
  133.     print " ($num_row)\n";
  134.    
  135. }
  136.  
  137.  
  138. $dbh_x->disconnect();
  139. $dbh_m->disconnect();
  140.  
  141.  
  142. print "Готово (".(time - $time)."с).\n";
  143.  
  144.  
  145. # Соединение с xBase
  146. sub xbase_connect_1 {
  147.     return DBI->connect("DBI:XBase:$conf_xbase{'dir'}") or die $DBI::errstr;
  148. }
  149.  
  150. # Соединение с MySQL
  151. sub mysql_connect_1 {
  152.     my $dsn = "DBI:mysql:$conf_mysql{'base'}:$conf_mysql{'host'}";
  153.     return DBI->connect($dsn, $conf_mysql{'user'}, $conf_mysql{'pass'}) or die $DBI::errstr;
  154. }
  155.  

 




    <Ответить>
    Имя:
    Тема:*
    Сообщение:[b] [i] [u] [s] [sub] [sup] [left] [center] [right] [justify] [img] [url] [youtube]   [help]
    *
     

     

    Я сделаю свой блог — с блэкджеком и шлюхами!

    2006-2012, CC-BY: Andrey A.