Migrar llaves foráneas de innodb a ndb en mysql

November 26th, 2009

Hola que a todos mis lectores pues ahora tengo un nuevo trabajo y por lo tanto algo nuevo que hacer ahora lo que tengo que hacer es levantar un clúster usando LVS+Mysql Cluster+Cluster suite y por ahora me estoy “peleando” con la base de datos, se supone que solo es cuestión de migrar las tablas… pues bien aquí vamos a tener problemas primero que nada debemos de conocer son las desventajas de usar mysql-cluster una vez que las conocemos procedamos a continuar con el trabajo.
Primero que nada sabemos que las llaves foráneas no son permitidas en el engine NDB para eso tenemos que forzarlas con triggers podemos hacer los trigers a manita (si es que no tenemos muchas llaves) pero que pasa cuando tenemos muchas llaves??? Por eso mismo me he dado a la tarea de crear un programa para que escriba los triggers y aqui se los dejo Saludos cualquier duda estoy a sus ordenes :D

Nota: debes de tener el archivo .sql solamente con las llaves que arroja el mysqldump en el que se va a basar el programa por ejemplo:

Nota: Necesitas crear esta tabla para ke funcione las referencias:
CREATE TABLE error_msg (error_msg VARCHAR(32) NOT NULL PRIMARY KEY)Engine=ndbcluster;

—————————-ARCHIVO EJEMPLO DE MYSQLDUMP—————————-
– Filtros para la tabla `admin_agente_zona`
ALTER TABLE `admin_agente`
ADD CONSTRAINT `agente_agente` FOREIGN KEY (`id_agente`) REFERENCES `admin_` (`id_agente`),
ADD CONSTRAINT `agente_zona_` FOREIGN KEY (`id_zona`) REFERENCES `admin_zonas` (`id_zona`);
– Filtros para la tabla `admin_`
ALTER TABLE `admin_compania`
ADD CONSTRAINT `admin_compania_db` FOREIGN KEY (`postgis_db`) REFERENCES `admin_db_postgis` (`postgis_db`),
ADD CONSTRAINT `compania_Requiere_ FOREIGN KEY (`id_agente`) REFERENCES `admin_agente` (`id_agente`),
ADD CONSTRAINT `compania_Requiere_` FOREIGN KEY (`id_compania_padre`) REFERENCES `admin_compania` (`id_compania`),
ADD CONSTRAINT `compania_Requiere_` FOREIGN KEY (`id_tipo_cia`) REFERENCES `admin_tipo_compania` (`id_tipo_cia`);
– Filtros para la tabla `admin_empresa`
ALTER TABLE `admin_empresa`
ADD CONSTRAINT `admin_empresa_ibfk_1` FOREIGN KEY (`id_compania`) REFERENCES `admin_compania` (`id_compania`),
ADD CONSTRAINT `admin_empresa_ibfk_3` FOREIGN KEY (`id_tipo_empresa`) REFERENCES `admin_tipo_empresa` (`id_tipo_empresa`);
—————————————————————————————————————————————————————————
Clase: creadordetrigers.java

package cradordetrigers;

package cradordetrigers;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author kloneton
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        {
            try {
                //se abre el archivo
                File f = new File("constraints.txt");
                BufferedReader entrada = new BufferedReader(new FileReader(f));
                // creando patrones para saber que linea procesaremos
                String lineaTabla = "";
                List lista = new ArrayList();
                //leer el archivo completo
                System.out.println("DELIMITER $$");
                int contador = 0;
                while (entrada.ready()) {

                    String texto = entrada.readLine();
                    if (texto.contains("ALTER TABLE")) {
                        lineaTabla = texto;
                        contador++;
                    } else if (texto.contains("ADD CONSTRAINT")) {
                        lista.add(texto);
                    } else if (texto.contains("Filtros")) {
                        //dando output al triger mofique esta linea en caso de querer escrivir en un archivo
                        System.out.println(creaTriger(lista, lineaTabla));
                        lista.clear();
                    }

                }
                System.out.println("DELIMITER  ;");
                System.out.println(contador);
            } catch (IOException ex) {
                System.out.println("Error al leer archivo");
                ex.printStackTrace();
            }
        }
    }

    public static String creaTriger(List lista, String lineatabla) {
        //primer expresion regular para separar ALTER TABLE lo que utilizaremos aqui sera el nombre de nuestra PK
        Pattern patronTabla = Pattern.compile("(\\w+) (\\w+) `(.+)`");
        //asignando expresion a un matcher para separar la palabara
        Matcher matPK = patronTabla.matcher(lineatabla);
        if (matPK.find()) {
            // linea de aqui arriba busca la exspresion regular
            //separando el nombre de la tabla que llevara los PK
            String tabla_PK = matPK.group(3);
            String tabla_FK = "";
            String anidacion = "";
            //segunda expresion regular para separar los miembros que nos serviran de referencia
            Pattern patronFK = Pattern.compile("(.+FOREIGN KEY)\\p{Blank}(\\(.+\\))\\p{Blank}REFERENCES\\p{Blank}\\`(.+)\\`\\p{Blank}(.+)[\\,\\;]$");
            //variables, variables... y mas variables inicializadas para que no marque nullpointerexeption
            String trigger = "";
            String campo_PK = "";
            String campo_FK = "";
            String prefijoIf = "IF ";
            int contador = 0;
            //iterando cada una de las lineas para asi generar el output
            for (Iterator it = lista.iterator(); it.hasNext();) {
                String linea = it.next();
                //asignando al matcher el patron para separar la linea que contiene la llave
                Matcher matFK = patronFK.matcher(linea);
                //buscando la exprecion regular
                matFK.find();
                //separando los miembros y quitando comillas y parentesis
                tabla_FK = matFK.group(3);
                campo_PK = matFK.group(2).replaceAll("[\\(\\)\\`]", "");
                campo_FK = matFK.group(4).replaceAll("[\\(\\)\\`]", "");
                //vsi tiene mas de una llave este for nos ayudara a separarlos y asi crear un solo trigger
                if (campo_PK.contains(",") && campo_FK.contains(",")) {
                    String camposPK[] = campo_PK.split(",");
                    String camposFK[] = campo_FK.split(",");
                    campo_PK = "";
                    campo_FK = "";
                    for (int i = 0; i < camposPK.length; i++) {
                        campo_PK += " alias." + camposPK[i].trim() + " = new." + camposFK[i].trim();
                        if (i < (camposFK.length - 1)) {
                            campo_PK += "  AND  ";
                        }
                    }

                } else {
                    campo_PK = "alias." + campo_PK.trim() + " = ";
                    campo_FK = "new." + campo_FK.trim();
                }
                //construyendo el trigger agregando if o else en caso de tener mas de una llave
                prefijoIf = (0 == contador++) ? "\tIF" : "\tELSEIF ";
                anidacion += prefijoIf + "(SELECT COUNT(*) FROM " + tabla_FK + " alias WHERE " + campo_PK + " " + campo_FK + ")=0" + " \n" +
                        " \tTHEN" + " \n" +
                        " \tINSERT error_msg VALUES ('FK_INSERT_" + tabla_PK + "_" + tabla_FK + " Key Violated');" + " \n";

            }
            //dando salida a los mensajes de error que se insertaran en la tabla ya mencionada
            System.out.println(" INSERT INTO error_msg values('FK_INSERT_" + tabla_PK + "_" + tabla_FK + " Key Violated')$");
            System.out.println(" INSERT INTO error_msg values('FK_UPDATE_" + tabla_PK + "_" + tabla_FK + " Key Violated')$");
            //estructuta estandar del triger la variable anidacion es el producto en caso de tener mas de una PK
            trigger = "" +
                    " CREATE TRIGGER FK_INSERT_" + tabla_PK + "_" + tabla_FK + " \n" +
                    "  BEFORE INSERT" + " \n" +
                    " \tON  " + tabla_PK + " \n" +
                    " \tFOR EACH ROW" + " \n" +
                    " \tBEGIN" + " \n" + anidacion +
                    " \tEND IF;" + " \n" +
                    " END;$$";
            //remplazando valores para hacer el Before Update
            String trigTemp = trigger;
            trigTemp = trigTemp.replace("new.", "old.");
            trigTemp = trigTemp.replaceAll("FK_INSERT", "FK_UPDATE");
            trigTemp = trigTemp.replaceAll("BEFORE INSERT", "BEFORE UPDATE");
            trigger += "\n" + trigTemp;

            return trigger;
        } else {
            return "";
        }
    }
}

Hello world!

June 11th, 2009

Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!

Operaciones con fechas java

May 7th, 2009

fechas

Bueno primero que nada una severa disculpa por que no habia podido escrivir sobre el comentario que dejaron hice un  videotutorial de como insertar un .swf en java swing ya esta nadamas que he tenido problemas para subirlo si alguien conose un servido bueno pls post it me continuando con el trabajo aqui les dejo una clase que tiene muchas operaciones para fechas (se preguntaran por que estoy muy traumado con ls fechas) lo que pasa es que en mi trabajo haora mismo desarrollo un RelogChecador cosa que implica mucho trabajo con fechas bueno pues aqui les dejo mi clase cualquer cosa avisenme porfavor la mayoria de los metodos son estaticos abajo lez dejo otro ejemplo de como se podrian mandar llamar.

Clases utilizadas:

Veamos la clase que hasta el momento estoy alimenando 

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.kloneton.utilerias;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.StringTokenizer;

/**
 *
 * @author klone
 */
public class Fecha {

    public Fecha() {
    }

    /**
     * extencion de java.util.SimpleDateFormat
     * @param formato
     *  String de formato ejemplo:
     * <center>getFecha("dd/MM/yyyy")<br /> return 05/04/2009</center>
     * @see SimpleDateFormat
     * @return
     */
    public static String getFecha(String formato) {
        Date date = new Date();
        SimpleDateFormat formating = new SimpleDateFormat(formato);
        return formating.format(date);

    }

    /**
     *  Este metodo funciona con objets tipo sqlDate
     * @param formato
     * @param date
     * @return
     */
    public static String getFecha(String formato, java.sql.Date date) {
        SimpleDateFormat formating = new SimpleDateFormat(formato);
        return formating.format(date);

    }

    /**
     * Este metodo funciona con objets tipo utilDate
     * @param formato
     * @param date
     * @return
     */
    public static String getFecha(String formato, Date date) {
        SimpleDateFormat formating = new SimpleDateFormat(formato);
        return formating.format(date);

    }

    /**
     * retorna la fecha en español en formato YYYY/MMMM/DD
     * <sub>
     * <br />  YYYY= AÑO EN CUATRO DIGITOS ejemplo 2009
     * <br />  MMMM= MES EN ESPAÑOL ejemplo ABRIL
     * <br />  DD= DIA DEL MES  ejemplo 05</sub>
     * @param separador
     * Se usa para separar la cadena de fecha por ejemplo:
     * <br />
     * <center> getFechaCompletaEsp("/")
     * <br />return 2009/ABRIL/05  </center>
     * @return
     */
    public static String getFechaCompletaEsp(String separador) {
        Date date = new Date();
        SimpleDateFormat formating = new SimpleDateFormat("yyyy,MM,dd");

        StringBuffer buffer = new StringBuffer();
        StringTokenizer tokens = new StringTokenizer(formating.format(date), ",");
        buffer.append(tokens.nextElement().toString());
        buffer.append(separador);

        switch (Integer.parseInt(tokens.nextElement().toString())) {
            case 1:
                buffer.append("Enero");
                break;
            case 2:
                buffer.append("Febrero");
                break;
            case 3:
                buffer.append("Marzo");
                break;
            case 4:
                buffer.append("Abril");
                break;
            case 5:
                buffer.append("Mayo");
                break;
            case 6:
                buffer.append("Junio");
                break;
            case 7:
                buffer.append("Julio");
                break;
            case 8:
                buffer.append("Agosto");
                break;
            case 9:
                buffer.append("Septiembre");
                break;
            case 10:
                buffer.append("Octubre");
                break;
            case 11:
                buffer.append("Nobiembre");
                break;
            case 12:
                buffer.append("Diciembre");
                break;
        }
        buffer.append(separador);
        buffer.append(tokens.nextElement().toString());
        return buffer.toString().toUpperCase();
    }

    /**
     *Este metodo es utilizado para  saber en dos letras el dia de la semana<br />
     * y lo calcula por medio de la clase Calendar jsugando el dia de la semana
     * @return "Lu","Ma","Mi,"Ju","Vi","Sa","Do"
     * @see Calendar
     */
    public static String getDiaSemana() {
        String dia = "";
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        int diaInt = cal.get(Calendar.DAY_OF_WEEK);
        switch (diaInt) {
            case 1:
                dia = "Do";
                break;
            case 2:
                dia = "Lu";
                break;
            case 3:
                dia = "Ma";
                break;
            case 4:
                dia = "Mi";
                break;
            case 5:
                dia = "Ju";
                break;
            case 6:
                dia = "Vi";
                break;
            case 7:
                dia = "Sa";
                break;

        }
        return dia;
    }

    /**
     *Este metodo es utilizado para  saber en numero el dia de la semana<br />
     * y lo calcula por medio de la clase Calendar jsugando el dia de la semana
     * @return 1,2,3,4,5,6,7
     * @see Calendar
     */
    public static int getDiaSemanaInt() {

        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        return cal.get(Calendar.DAY_OF_WEEK) + 1;
    }

    /**
     * Resta un determidado numero de minutos a una hora especificada en un Calendar
     * <b>NO SE PODRA RESTAR MAS DE 60MINUTOS</B>
     * @param cal
     * @param minutosAgregar
     * @see Calendar
     */
    public static Calendar restaMinutos(Calendar cal, int mintuosARestar) {
        Calendar calendar = Calendar.getInstance();
        int hora = cal.get(Calendar.HOUR_OF_DAY);
        int minuto = cal.get(Calendar.MINUTE);
        if (minuto - mintuosARestar < 0) {
            int nuevoMinuto = 60 - mintuosARestar;
            calendar.set(0, 0, 0, hora - 1, nuevoMinuto);
        } else {
            calendar.set(0, 0, 0, hora, calendar.get(Calendar.MINUTE) - mintuosARestar);
        }
        return calendar;
    }

    /**
     * Agrega un determidado numero de minutos a una hora especificada en un Calendar
     * * <b>NO SE PODRA AGREGAR MAS DE 60MINUTOS</B>
     * @param cal
     * @param minutosAgregar
     * @see Calendar
     */
    public static Calendar agregaMinutos(Calendar cal, int minutosAgregar) {
        Calendar calendar = Calendar.getInstance();
        int hora = cal.get(Calendar.HOUR_OF_DAY);
        int minuto = cal.get(Calendar.MINUTE);
        if (minuto + minutosAgregar >= 60) {
            int nuevoMinuto = minuto - 60;
            nuevoMinuto -= minutosAgregar;
            calendar.set(0, 0, 0, (hora + 1), nuevoMinuto, Calendar.MINUTE);
        } else {
            calendar.set(0, 0, 0, hora, cal.get(Calendar.MINUTE) + minutosAgregar);
        }
        return calendar;
    }

    /**
     * comp es el Calendar a comparar return true si cal menor comp si no false
     * @param cal
     * @param comp
     * @return
     */
    public static boolean esMenor(Calendar cal, Calendar comp) {
        if (cal.compareTo(comp) <= 0) {
            return true;
        } else {
            return false;
        }

    }

    /**
     *
     * @param cal
     * @param comp
     * @return
     */
    public static boolean esMayorIgual(Calendar cal, Calendar comp) {

        if (cal.compareTo(comp) > 0) {
            return true;

        } else {
            return false;
        }

    }

    /**
     *
     * @param buscar
     * @param menor
     * @param mayor
     * @return boolean
     */
    public static boolean esEntre(Calendar buscar, Calendar menor, Calendar mayor) {

        if (esMayorIgual(buscar, menor) && esMenor(buscar, mayor)) {
            return true;
        } else {
            return false;
        }

    }

    /**
     * Este metodo funciona para encontrar la diferencia en dias entre dos Calendar
     * @param inicio
     * @param fin
     * @return
     */
    public static long diferenciaDates(Calendar inicio, Calendar fin) {
        long diferenciaMilis = fin.getTimeInMillis() - inicio.getTimeInMillis();
        long diferenciaDias = diferenciaMilis / (1000 * 60 * 60 * 24);
        return diferenciaDias;

    }
}
como se pueden ver todos los metodos son estatic s aqui les pongo el ejemplo de como se podrian utilizar ya en un main 
public static void main(String args[]) {
        System.out.println(Fecha.getDiaSemana()); // salida Ju
        System.out.println(Fecha.getFechaCompletaEsp("-")); // salida 2009-MAYO-07
        System.out.println(Fecha.getFecha("dd/MM/yyyy hh:mm:ss aa", new Date()));
        Calendar calendarAagregar=Calendar.getInstance();// inicializamoz nuestro calendar con la fecha  de haorita 2008-05-07 13:17:00
        Calendar calendarNuevo=Fecha.agregaMinutos(calendarAagregar, 20);
        Date fechaSalida=calendarNuevo.getTime();//extraemos el objeto Date para poder ulizar nuestros metodos
        System.out.println(Fecha.getFecha("dd/MM/yyyy hh:mm:ss aa",fechaSalida)); // salida 2008-05-07 13:37:00
    }
Muchas gracias por dedicarme unos minutos hasla luego ojala que para hoy ya este arriba el Video tutorial saludos.

Eltima component

April 28th, 2009

Logo de eltima software

Hola que tal a todos losseguidores de mi blog para mi segundo post XD quiero hacer algo muy especial y esto es “compartir” esta magnifica libreria que en ocaciones hace milagros  por jemplo yo hace poco tenia que entregar un proyecto para mi clase de programacion y por parte de mi trabajo pude conseguir esta libreria no estoy muy seguro que la compraron pero TOTAL llego a mis manos y quiziera compartirla con uds pues tengo planeado hacer un par de post en el que explique la funcionalidad de los componentes mas usados de esta libreria. primero que nada quiero exponer “QUE ES ELTIMA PARA MI”.

  1. un grupo de componentes (jLabel, JPanel,jTable y muchos mas) con funciones de mas.
  2. una salvacion para aquellos que quieren ponerle un poco mas de estilo a los prgramas.
  3. haorro de tiempo tremendamente.
  4. un frame para swing.

pues bien como diria Gutar Hero VAMOZ A DARLE CAÑA Como siempre tratare de hacer las cosas muchismo mas facil ya que nustro objetivo es haorrar tiempo y como la mayoria de los estudiantes (y alguno ke otro experimentado)

¿COMO LO AGO CON NETBEANS?

Para los que no conocen netbeans es un IDE para desarrollar programas en java desde Java Swing, Java para moviles, Java para la web, Java FX y actualmente ya tiene un gran soporte para PHP, Rubi on Rails y Grouvy y muchas cossisisimas mas solo que la verdad no expoto al maximo netbeans pero si lo ocupo en muchas ocaciones. aqui les dejo un TUTORIAL BASICO DE NETBEANS

haora para hacer mas facil nuestra codificacion vamos a incrustar nuestro componente en el palette de netbeans para solo arrastrar y soltar lo que necesitamos

Herramientas a utilizar

Libreria de EltimaComponents click aki

ahora aqui Descargar Eltima components

Netbeans Utima Release

  1. Creamos un proyecto de Java Aplication  .
crear proyecto

crear proyecto

2. Creamos un JFrame pulsando boton derecho sobre un paquete

Cramos un JFrame

Cramos un JFrame

3.  le ponemos un JFrame (Recuerda que todas las clases de Java deven de empesar con Mayusculas) y pulsamos Finish

Nombre al JFrame

Nombre al JFrame

4. Pulsamos boton derecho sobre el Palette que netbeans tiene para insertar Componentes(el passo 4 y paso 5 se pueden omitir pero es recomendable por cuestion de organizacion)

Creamos una category

Creamos una category

5. le ponemos un nombre a la categoria de objetos (en mi caso puse Eltima Components) para identificarlos por grupos

Poner Nombre Category

Poner Nombre Category

6. Pulsamos boton derecho sobre las categoria y escojemos Palette Manager… para incrustar nuestros objetos

Incrustamos nuestro gupo de objetos Eltima Components

Incrustamos nuestro gupo de objetos Eltima Components

6. Pulsamos el boton Add from Jar.

Pulsar Add from Jar

Pulsar Add from Jar

7. Seleccionamos el Jar que desacargamos de eltima components

Seleccionar Eltima Jar

Seleccionar Eltima Jar

8. Seleccionamos todos los objetos de la lista (pulsando Shift y seleccionando desde el primero hasta el ultimo de la lista) y pulsamos Next>.

Seleccionamos todos los JComponets de eltima

Seleccionamos todos los JComponets de eltima

9. Seleccionamos la categoria que en el paso 5 creamos y pulsamos Finish.

Seleccionamos Eltima Components

Seleccionamos Eltima Components

10.  una vez creado nuestro grupo de componentes solamente es cuestion de arrastrar hacia la venta el componente que nesecitemos y listo.

en este caso yo agrego un ElCalculatorField que sirve para desplegar una calculadora prediseñada con algua que otra utileria

Solo es cuestion de arrastrar..

Solo es cuestion de arrastrar..

11. corremos el proyecto pulsando Shift+f6(Run Single) y este sera nuestro resultado.

Ejemplo de ElCalculatorTime ya funcionando

Ejemplo de ElCalculatorTime ya funcionando

NOTA. se necesita un teclado y mouse para hacer el Tutorial siguendo mis pasos jeeje por que hacer el tutorial con solo el teclado puede ser un poco tedioso pero si gustan lo hago Klonetones.wordpress.com estamos para echarnos la mano.

Si les quedo alguna duda no duden en postearme y preguntarme en mis proximos POST explicare la utilizacion de algunos de los componentes POSTEEN de cual quieren aprender por mi parte es todo ojala y les sirva este pequeño tutorial

SALUDOS JAVEROS!

Como formatear fechas facilmente en java

April 27th, 2009

 

Hola que tal a todos!

En esta ocacion mi primero post por cierto vamos ha ver una forma muy sencilla de como formatear fechas en java en esta ocacion solo vamos a utilizar una clase llamada

aqui tambien les dejo la tabla de que datos vamos a utilizar

Letter  Date or Time Component  Presentation  Examples 
G  Era designator  Text  AD 
y  Year  Year  1996; 96 
M  Month in year  Month  July; Jul; 07 
w  Week in year  Number  27 
W  Week in month  Number  2 
D  Day in year  Number  189 
d  Day in month  Number  10 
F  Day of week in month  Number  2 
E  Day in week  Text  Tuesday; Tue 
a  Am/pm marker  Text  PM 
H  Hour in day (0-23)  Number  0 
k  Hour in day (1-24)  Number  24 
K  Hour in am/pm (0-11)  Number  0 
h  Hour in am/pm (1-12)  Number  12 
m  Minute in hour  Number  30 
s  Second in minute  Number  55 
S  Millisecond  Number  978 
z  Time zone  General time zone  Pacific Standard Time; PST; GMT-08:00 
Z  Time zone  RFC 822 time zone  -0800

vamosal codigo Java 

package free.kloneton;

import java.text.SimpleDateFormat;

import java.util.Date;

public class FormatearFecha {

    public static void main(String[] args) {

        SimpleDateFormat formateador=new SimpleDateFormat("dd/MM/yyyy");

        String fecha=formateador.format(new Date());

        System.out.println(fecha);

    }

}

y el resultado es : 

init:  

deps-jar:

compile-single:

run-single:

26/04/2009

BUILD SUCCESSFUL (total time: 2 seconds)

Aqui tenemos un enlace que hace las cosas de forma invrsa de String “05/05/1988″ a un objeto java.util.Date

SimpleDateFormat inverso

Como pueden ver es un codigo muy simple  cualquier duda por favor avisenme.

Hello world!

April 27th, 2009

Welcome to Wordpress.com. This is your first post. Edit or delete it and start blogging!