Convertisseur interbase -> mysql

Contenu du snippet

Après avoir cherché un logiciel capable de faire des conversions de bases de données InterBase, je n'ai trouvé que des logiciels payants (et pas qu'un peu !).

Pour une simple et unique conversion, c'est quand même un peu exagéré, j'ai donc préféré écrire moi même un script me permettant de le faire. Au passage je l'ai rendu suffisamment autonome pour pouvoir être publié et utilisé par d'autres, vu qu'il n'y a pas tant d'outils que ça traitant de InterBase ...

Source / Exemple :


<?php
#######################################################
#           SCRIPT DE CONVERSION DE BDD               #
#               INTERBASE -> MYSQL                    #
#             le 08/11/2007 par Silk                  #
#            (trooper@libertysurf.fr)                 #
#######################################################

#FONCTIONS
function TypeChamp ($champ,$taille) {
    switch ($champ) {
     case 7:
     return array('SMALLINT',$taille);
     break;

     case 8:
     return array('INT',$taille);
     break;

     case 16:
     return array('BIGINT',$taille);
     break;

     case 10:
     return array('FLOAT','');
     break;

     case 11:
     //return 'D_Float';
     return 'erreur';
     break;

     case 27:
     return array('DOUBLE','');
     break;

     case 9:
     //return 'Quad';
     return 'erreur';
     break;

     case 14:
     return array('CHAR',$taille);
     break;

     case 37:
     return array('VARCHAR',$taille);
     break;

     case 40:
     //return 'CString';
     return 'erreur';
     break;

     case 13:
     return array('TIME','');
     break;

     case 12:
     return array('DATE','');
     break;

     case 35:
     return array('TIMESTAMP','');
     break;

     case 261:
     return array('BLOB','');
     break;
    }
}
#FIN FONCTIONS

#PARAMETRES
//C'est ici que vous devez entrer les paramètres de connexions aux BDD InterBase et MySQL
//Assurez-vous d'avoir un serveur InterBase (ex: Firebird) et MySQL (ex: EasyPHP, WAMP) en activité.
//PARAMETRES INTERBASE
  $hote = 'localhost:C:\fichier.gdb'; //On se connecte au fichier (ici, il se trouve à la racine de C:)
  $utilisateur = 'SYSDBA'; //User par défaut
  $passe ='masterkey'; //Pass par défaut
  $bdd_interbase = ibase_connect($hote, $utilisateur, $passe, 'ISO8859_1'); //Connexion
//PARAMETRES MYSQL
  $hote_mysql = 'localhost';
  $utilisateur_mysql = 'interbase';
  $passe_mysql = 'interbase';
  $nom_mysql = 'interbase'; //Nom de la BDD MySQL
  $bdd_mysql = mysql_connect($hote_mysql,$utilisateur_mysql,$passe_mysql);
  mysql_select_db($nom_mysql,$bdd_mysql);
#FIN PARAMETRES

//ON PARCOURT LA BDD INTERBASE
  $requete = 'SELECT DISTINCT rdb$relation_name FROM rdb$relation_fields
WHERE rdb$view_context IS NULL
  AND rdb$system_flag = 0'; //Injection de la requête permettant de récupérer les tables
  $resultat = ibase_query($bdd_interbase, $requete);
  while ($ligne = ibase_fetch_assoc($resultat)) {
    foreach ($ligne AS $table) {
    echo "<br><b>".$table."</b><br>";
    $req_struc_table = 'SELECT *
                        FROM rdb$relations rel
                          JOIN rdb$relation_fields rel_field
                            ON rel_field.rdb$relation_name = rel.rdb$relation_name
                          JOIN rdb$fields field
                            ON rel_field.rdb$field_source = field.rdb$field_name
                        WHERE rel.rdb$relation_name = \''.$table.'\'
                        ORDER BY rel_field.rdb$field_position, rel_field.rdb$field_name';
       $res_struc_table = ibase_query($req_struc_table);
       //Construction de la requête de création de la table
       $req_create_table = "CREATE TABLE `".trim($table)."` (";
       while ($tab_struc_table = ibase_fetch_assoc($res_struc_table)) {
         $struct_champ = TypeChamp($tab_struc_table['RDB$FIELD_TYPE'],$tab_struc_table['RDB$FIELD_LENGTH']);
         if ($prem) {
            $req_create_table .= " , ";
         } else { $prem = 1; }
         $req_create_table .= "`".trim($tab_struc_table['RDB$FIELD_NAME'])."` ".$struct_champ[0];
         if ($struct_champ[1]) {
            $req_create_table .= "(".$struct_champ[1].")";
         }
         if ($tab_struc_table['RDB$NULL_FLAG'] == 0) {
            $req_create_table .= " NULL";
         } else {
            $req_create_table .= " NOT NULL";
         }
       }
       $req_create_table .= ") ENGINE = MYISAM";
       unset($prem);
       mysql_query($req_create_table) or die ("Impossible de créer la table : ".mysql_error()."<br>Requete : ".$req_create_table);
       //echo "<br>";
       ibase_free_result($res_struc_table);
       $requete2 = 'SELECT * FROM '.$table; //On récupère les champs de la table et leurs valeurs
       $resultat2 = ibase_query($bdd_interbase, $requete2);
       while ($ligne2 = ibase_fetch_assoc($resultat2)) {
          //Construction de la requête d'insertion des données
          $req_insert = "INSERT INTO `".trim($table)."` SET ";
          foreach ($ligne2 AS $champ => $valeur) {
            if ($prem) {
               $req_insert .= " , ";
            } else { $prem = 1; }
            #Correction des valeurs texte
            $valeur = str_replace("\'","'",$valeur);
            $valeur = utf8_decode($valeur);
            $req_insert .= "`".$champ."`='".addslashes($valeur)."'";
          }
          unset($prem);
          mysql_query($req_insert) or die ("Insertion impossible : ".mysql_error()."<br>Requete : ".$req_insert);
          //echo "<br>";
       }
       ibase_free_result($resultat2);
    }
  }
  ibase_free_result($resultat);
  ibase_close($bdd_interbase);
?>

Conclusion :


Bien que le script soit déjà utilisable dans de nombreux cas, il reste encore pas mal de boulot à faire dessus, en particulier pour la création des tables qui ne gère pas les clefs primaires, auto incréments et autres joyeusetés de ce genre.

N'hésitez pas à l'améliorer si vous vous en sentez l'envie ;-)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.