Migrar estructura de HyperSQL a MySQL (rutina en Java)

Desde wikipedia: HSQLDB (Hyperthreaded Structured Query Language Database) es un sistema gestor de bases de datos libre escrito en Java. La suite ofimática OpenOffice.org lo incluye desde su versión 2.0 para dar soporte a la aplicación Base.

En estos últimos días estuve sufriendo con una base de datos desconocida para mi, su nombre HyperSQL o también llamada HSQLDB. La base de datos funciona bien, sin embargo no cuenta con una interfaz gráfica muy potente, además de que mis conocimientos sobre esta tecnología son bastante limitados.
Por diversas causas adicionales a las anteriores, me vi en la necesidad de migrar esta base de datos a MySQL. Cuando lo hube conseguido pensé que quizá haya otros quienes tengan esta misma necesidad y ese es el motivo de mi publicación.

Interfaz gráfica HyperSQL

Requisitos

1. HyperSQL funcionando
2. Editor de código Java. En mi caso "Eclipse IDE for Java Developers".
3. Agregar la referencia al archivo "hsqldb.jar"

Nota Importante: Este código funciona únicamente con los siguientes tipos de datos HSQLDB:

  NUMERIC            
  CHARACTER VARYING    
  BIGINT         
  TIMESTAMP        
  BOOLEAN         
  SMALLINT      
  INTEGER        
  CHARACTER LARGE OBJECT
  BINARY LARGE OBJECT

Si tu base de datos utiliza otros tipos, deberás hacer los ajustes necesarios.

Sin mas que decir, les dejo el código Java:

/*
 * Developer: tyrodeveloper
 * 
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.io.FileWriter;
public class Scripts {
 public static void main(String args[]){
  try{
   System.out.printf("Procesando...\n");
   DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
   String currentSchema = "";
   String fileName = dateFormat.format(new Date());
   FileWriter writer = new FileWriter("D:\\script-"+ fileName +".sql", true);
   Connection con = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost:9001/sinba", "SA", "");
   Statement  stmt = con.createStatement(); 
   //Script schemas
   String sql = "SELECT TABLE_SCHEMA, COUNT(*) AS TOTAL_TABLAS "
     + "FROM INFORMATION_SCHEMA.TABLES "
     + "WHERE TABLE_TYPE = 'BASE TABLE' "
     + "GROUP BY TABLE_SCHEMA "
     + "ORDER BY TABLE_SCHEMA";
   ResultSet rs = stmt.executeQuery(sql);
   writer.append("/* CREAR ESQUEMAS */\r\n");
   while (rs.next()) {
          String table_schema = rs.getString("TABLE_SCHEMA");
          int total_tablas = rs.getInt("TOTAL_TABLAS");
          writer.append("CREATE SCHEMA IF NOT EXISTS `"+ table_schema + "`;/* TABLAS: "+ total_tablas +" */\r\n");
      }
      rs.close();
   //Script tables
   sql = "SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE "
     + "FROM INFORMATION_SCHEMA.TABLES "
     + "WHERE TABLE_TYPE = 'BASE TABLE' "
     + "ORDER BY TABLE_SCHEMA, TABLE_NAME";
      rs = stmt.executeQuery(sql);
      writer.append("/* CREAR TABLAS */\r\n");
      while (rs.next()) {
          String table_schema = rs.getString("TABLE_SCHEMA");
          String table_name =  rs.getString("TABLE_NAME");
          if(currentSchema!=table_schema)
          {
           writer.append("USE `"+ table_schema + "`;\r\n");
          }
          writer.append(ScriptTable(table_schema , table_name) + "\r\n");
          currentSchema = rs.getString("TABLE_SCHEMA");
      }
      rs.close();
      //Script Primary keys
      sql = "SELECT ' ALTER TABLE `' + TABLE_SCHEM + '`.`' + TABLE_NAME + '` ADD CONSTRAINT `' + PK_NAME + '` PRIMARY KEY (`'  + COLUMN_NAME + '`);'  AS SQL_TEXT "
        + "FROM INFORMATION_SCHEMA.SYSTEM_PRIMARYKEYS "
        + "WHERE KEY_SEQ = 1 "
        + "ORDER BY TABLE_SCHEM ";
      rs = stmt.executeQuery(sql);
      writer.append("/* CREAR PRIMARY KEYS */\r\n");
      while (rs.next()) {
       String sql_text = rs.getString("SQL_TEXT");
          writer.append(sql_text+ "\r\n");
      }
      rs.close();
      //Script foreign keys
      sql = "SELECT 'ALTER TABLE `' + FKTABLE_SCHEM + '`.`' + FKTABLE_NAME + '` ADD CONSTRAINT `' + FK_NAME + '` FOREIGN KEY (`' + FKCOLUMN_NAME  + '`) REFERENCES `' +  PKTABLE_SCHEM + '`.`' + PKTABLE_NAME + '`(`' + PKCOLUMN_NAME + '`);' AS SQL_TEXT "
        + "FROM  INFORMATION_SCHEMA.SYSTEM_CROSSREFERENCE "
        + "WHERE KEY_SEQ = 1 "
        + "ORDER BY FKTABLE_SCHEM ";
      rs = stmt.executeQuery(sql);
      writer.append("/* CREAR FOREIGN KEYS */\r\n");
      while (rs.next()) {
          String sql_text = rs.getString("SQL_TEXT");
          writer.append(sql_text+ "\r\n");  
      }
      rs.close();
      //Close connection
      con.close();
      writer.close();
      System.out.printf("Terminado.");
  }
  catch (Exception  ex) {
   System.out.printf("Error: %s", ex.getMessage());
        }
 }
 
 public static String ScriptTable(String schemaName,String tableName ){
  try{

   StringBuilder sbTable = new StringBuilder();
   Connection con = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost:9001/sinba", "SA", "");
   Statement stmt = con.createStatement();
   String sql ="SELECT COLUMN_NAME,DTD_IDENTIFIER, IS_NULLABLE,DATA_TYPE, "
     + "DECLARED_NUMERIC_PRECISION, DECLARED_NUMERIC_SCALE "
     + "FROM INFORMATION_SCHEMA.COLUMNS "
     + "WHERE TABLE_NAME='"+ tableName +"' "
     + "AND TABLE_SCHEMA ='"+ schemaName +"' ORDER BY ORDINAL_POSITION";
      ResultSet rs = stmt.executeQuery(sql);
      sbTable.append("CREATE TABLE "+ (schemaName == ""?"": ("`" + schemaName + "`.")) + "`" +tableName +"`\r\n(");
      while (rs.next()) {
          String column_name = rs.getString("COLUMN_NAME").intern();
          String column_spec = "";
          String data_type =  rs.getString("DATA_TYPE").intern();
          String dtd_identifier =  rs.getString("DTD_IDENTIFIER").intern();
          String is_nullable =  rs.getString("IS_NULLABLE").intern();
          int numeric_precision = 0;
          if(rs.getString("DECLARED_NUMERIC_PRECISION")!= null)
           numeric_precision= rs.getInt("DECLARED_NUMERIC_PRECISION");
          int numeric_scale = 0;
          if(rs.getString("DECLARED_NUMERIC_SCALE")!=null)
           numeric_scale = rs.getInt("DECLARED_NUMERIC_SCALE");
          switch(data_type){
           case "TIMESTAMP":
            column_spec ="\r\n\t`" + column_name + "` " + dtd_identifier + (is_nullable == "YES" ? " NULL" : " NOT NULL" ) + (data_type=="TIMESTAMP"?" DEFAULT CURRENT_TIMESTAMP":"") + ",";
            break;
           case "CHARACTER VARYING" :
            column_spec ="\r\n\t`" + column_name + "` " + dtd_identifier + (is_nullable == "YES" ? " NULL" : " NOT NULL" ) + ",";
            break;
           case "NUMERIC":
            if(numeric_precision==1){
             column_spec ="\r\n\t`"+ column_name +"` NUMERIC(1)" +  (is_nullable == "YES" ? " NULL" : " NOT NULL" ) + ",";
            }
            else{
             if(numeric_scale==0){column_spec ="\r\n\t`" + column_name + "` INT"+  (is_nullable == "YES" ? " NULL" : " NOT NULL" ) + ",";}
             else{column_spec ="\r\n\t`"+ column_name +"` DECIMAL("+ numeric_precision +","+ numeric_scale +")" +  (is_nullable == "YES" ? " NULL" : " NOT NULL" ) + ",";}
            }
            break;
           case "INTEGER" :
            column_spec ="\r\n\t`" + column_name + "` INT" + (is_nullable == "YES" ? " NULL" : " NOT NULL" ) + ",";
            break;
           case "BINARY LARGE OBJECT" :
            column_spec ="\r\n\t`" + column_name + "` LONGBLOB" + (is_nullable == "YES" ? " NULL" : " NOT NULL" ) + ",";
            break;
           case "CHARACTER LARGE OBJECT" :
            column_spec ="\r\n\t`" + column_name + "` LONGBLOB" + (is_nullable == "YES" ? " NULL" : " NOT NULL" ) + ",";
            break;
           case "BIGINT" :
            column_spec ="\r\n\t`" + column_name + "` BIGINT" + (is_nullable == "YES" ? " NULL" : " NOT NULL" ) + ",";
            break;
           case "BOOLEAN" :
            column_spec ="\r\n\t`" + column_name + "` BIT" + (is_nullable == "YES" ? " NULL" : " NOT NULL" ) + ",";
            break;
           default:
            column_spec ="\r\n\t`" + column_name + "` " + dtd_identifier + (is_nullable == "YES" ? " NULL" : " NOT NULL" ) + ",";
            break;
          }
          sbTable.append(column_spec);
      }
      rs.close();
      con.close();
      sbTable.replace(sbTable.length()-1, sbTable.length(), "");
      sbTable.append("\r\n);");
   return sbTable.toString(); 
  }
  catch (Exception  ex) {
   System.out.printf("Error ScriptTable: %s", ex.getMessage());
   return "/*Error to create table :"+ tableName +" */\r\n";
        }
 }
}

Regálame un G+1

No hay comentarios:

Publicar un comentario