Advertisement
Guest User

Untitled

a guest
Jul 6th, 2017
505
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 31.74 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.ArrayList;
  3.  
  4.  
  5.  
  6.  
  7. class VO{
  8.  
  9.     static BufferedReader br;
  10.     static ArrayList<String> includes;
  11.  
  12.  
  13.  
  14.  
  15.     static void readFile( String file )
  16.     {
  17.         try{
  18.             br = new BufferedReader(new FileReader( file ));
  19.         }catch(IOException ioe){
  20.             System.out.println( "Cant read File:" );
  21.             System.out.println( ioe );
  22.             System.exit(1);
  23.         }
  24.     }
  25.  
  26.  
  27.    
  28.     static void closeFile( )
  29.     {
  30.         try{
  31.             br.close();        
  32.         }catch(IOException ioe){
  33.             System.out.println( "Cant close File:" );
  34.             System.out.println( ioe );
  35.             System.exit(1);        
  36.         }
  37.  
  38.     }
  39.    
  40.    
  41.     static String toCamelCase(String s)
  42.     {
  43.             //convertir a camelCase
  44.  
  45.             String foo [] = s.split("_");
  46.  
  47.             String camelCase = "";
  48.  
  49.             for(String bar : foo){
  50.                 camelCase += Character.toUpperCase( bar.charAt(0) ) + bar.substring( 1 );
  51.             }
  52.            
  53.             return camelCase;
  54.     }
  55.    
  56.    
  57.    
  58.  
  59.     /*
  60.      *
  61.      *
  62.      * */
  63.     static void parseTable(String t_name) throws IOException
  64.     {
  65.         System.out.println( "parseando tabla: " + t_name );
  66.        
  67.         String tline ;
  68.        
  69.         ArrayList<Field> fields = new ArrayList<Field>();  
  70.        
  71.         while( (tline = br.readLine()).trim().startsWith("`") )
  72.         {
  73.  
  74.             String campo = tline.substring( tline.indexOf("`") + 1, tline.lastIndexOf("`") );
  75.            
  76.             String comentario = (tline.indexOf("COMMENT ") != -1) ? tline.substring( tline.indexOf("COMMENT ") + 9, tline.lastIndexOf("'") ) : " [Campo no documentado]";
  77.            
  78.             boolean autoInc = (tline.indexOf("AUTO_INCREMENT ") != -1);
  79.  
  80.             String tipo = tline.trim().split(" ")[1];
  81.  
  82.             fields.add( new Field(campo , tipo , comentario, false, autoInc) );
  83.        
  84.         }
  85.        
  86.  
  87.        
  88.        
  89.         //buscar llave primaria, PRIMARY KEY
  90.         if( (tline.trim().startsWith("PRIMARY KEY") ) )
  91.         {
  92.  
  93.             //hay definicion de llave primaria
  94.             String pk = tline.substring( tline.indexOf("(")+1, tline.indexOf(")") );
  95.            
  96.             String pks[] = pk.split(",");
  97.            
  98.             for(String i: pks)
  99.             {
  100.                 i= i.trim().substring( 1, i.length()-1 ) ;
  101.                
  102.                 //cicle trough the fields, and add pk to the ones on i
  103.                 for(int a = 0; a < fields.size(); a++){
  104.  
  105.                     if(fields.get( a ).title.equals(i)){
  106.                         fields.get( a ).isPrimary = true;
  107.                     }
  108.                 }
  109.  
  110.                
  111.             }
  112.         }
  113.        
  114.        
  115.         writeVO( t_name, fields );
  116.        
  117.         writeDAOBase( t_name, fields );
  118.        
  119.         writeDAO( t_name, fields );
  120.     }
  121.    
  122.     //vo para una tabla
  123.     static void writeVO( String tabla, ArrayList<Field> fields ) throws IOException
  124.     {
  125.         //convertir a camelCase
  126.    
  127.         String camelCaseTabla = toCamelCase( tabla );
  128.  
  129.         String fileName = "base/" + tabla + ".vo.base.php";
  130.  
  131.         PrintWriter pw = new PrintWriter(new FileWriter( fileName ));
  132.  
  133.         pw.println("<?php");
  134.         pw.println("/** Value Object file for table "+ tabla +"." );
  135.         pw.println("  * ");
  136.         pw.println("  * VO does not have any behaviour except for storage and retrieval of its own data (accessors and mutators).");
  137.         pw.println("  * @author Alan Gonzalez <alan@caffeina.mx> ");
  138.         pw.println("  * @access public");
  139.         pw.println("  * ");
  140.         pw.println("  */");
  141.        
  142.         pw.println();
  143.         pw.println("class " + camelCaseTabla + " extends VO"  );       
  144.         pw.println("{");
  145.        
  146.        
  147.         //constructor
  148.         {
  149.             pw.println( "   /**");
  150.             pw.println( "     * Constructor de " + toCamelCase(tabla) );
  151.             pw.println( "     * " );
  152.             pw.println( "     * Para construir un objeto de tipo "+ toCamelCase(tabla) + " debera llamarse a el constructor " );
  153.             pw.println( "     * sin parametros. Es posible, construir un objeto pasando como parametro un arreglo asociativo " );
  154.             pw.println( "     * cuyos campos son iguales a las variables que constituyen a este objeto." );
  155.             pw.println( "     * @return "+ toCamelCase(tabla) );
  156.             pw.println( "     */");
  157.             pw.println("    function __construct( $data = NULL)");
  158.             pw.println("    { ");
  159.             pw.println("        if(isset($data))");
  160.             pw.println("        {");
  161.         }
  162.        
  163.         for(Field f : fields){
  164.             pw.println("            if( isset($data['" + f.title + "']) ){");
  165.             pw.println("                $this->"+f.title+" = $data['"+ f.title +"'];");
  166.             pw.println("            }");
  167.         }      
  168.        
  169.        
  170.         pw.println("        }");
  171.         pw.println("    }");       
  172.         pw.println("");
  173.  
  174.  
  175.  
  176.  
  177.  
  178.             //toString
  179.             {
  180.                 pw.println( "   /**");
  181.                 pw.println( "     * Obtener una representacion en String" );
  182.                 pw.println( "     * " );
  183.                 pw.println( "     * Este metodo permite tratar a un objeto "+toCamelCase(tabla)+ " en forma de cadena." );
  184.                 pw.println( "     * La representacion de este objeto en cadena es la forma JSON (JavaScript Object Notation) para este objeto.");
  185.                 pw.println( "     * @return String ");
  186.                 pw.println( "     */");
  187.                 pw.println("    public function __toString( )");
  188.                 pw.println("    { ");
  189.  
  190.                 pw.println( "       $vec = array();" );
  191.                 pw.println( "       array_push($vec, array( " );
  192.  
  193.                 int x = 0;
  194.                     for( Field f : fields)
  195.                     {
  196.  
  197.                         if(x++ < (fields.size()-1))
  198.                             pw.println( "       \""+ f.title+ "\" => $this->" + f.title +  "," );
  199.                         else
  200.                             pw.println( "       \"" +f.title +"\" => $this->" + f.title  );
  201.                     }
  202.                 pw.println( "       )); " );                   
  203.                 pw.println( "   return json_encode($vec); " );                 
  204.                 pw.println("    }");
  205.                 pw.println("    ");
  206.             }
  207.  
  208.  
  209.  
  210.  
  211.         //actual fields
  212.         for( Field f : fields)
  213.         {
  214.             pw.println( "   /**");
  215.             pw.println( "     * "+f.title );
  216.             pw.println( "     * ");        
  217.             pw.println( "     * "+f.comment +"<br>");
  218.            
  219.             if(f.isPrimary)
  220.                 pw.println( "     * <b>Llave Primaria</b><br>");
  221.                
  222.             if(f.isAutoIncrement)
  223.                 pw.println( "     * <b>Auto Incremento</b><br>");
  224.            
  225.  
  226.            
  227.             pw.println( "     * @access protected" );
  228.             pw.println( "     * @var "+ f.type );
  229.             pw.println( "     */");
  230.            
  231.             pw.println( "   protected $" + f.title + ";" );
  232.             pw.println();
  233.  
  234.         }
  235.        
  236.        
  237.  
  238.        
  239.         //getters and setters
  240.         for( Field f : fields)
  241.         {
  242.            
  243.             String camelCaseCampo = toCamelCase( f.title );
  244.            
  245.             pw.println( "   /**");
  246.             pw.println( "     * get" + camelCaseCampo );
  247.             pw.println( "     * " );
  248.             pw.println( "     * Get the <i>" + f.title + "</i> property for this object. Donde <i>" + f.title +"</i> es " + f.comment );
  249.             pw.println( "     * @return "+ f.type );
  250.             pw.println( "     */");
  251.            
  252.             pw.println( "   final public function get" + camelCaseCampo + "()" );
  253.             pw.println( "   {" );
  254.             pw.println( "       return $this->"+ f.title +";");
  255.             pw.println( "   }" );
  256.             pw.println();
  257.  
  258.  
  259.             pw.println( "   /**");
  260.             pw.println( "     * set" + camelCaseCampo + "( $"+f.title+" )" );
  261.             pw.println( "     * " );
  262.             pw.println( "     * Set the <i>" + f.title + "</i> property for this object. Donde <i>" + f.title +"</i> es " + f.comment +"." );
  263.             pw.println( "     * Una validacion basica se hara aqui para comprobar que <i>" + f.title + "</i> es de tipo <i>" + f.type +"</i>. " );
  264.             pw.println( "     * Si esta validacion falla, se arrojara... algo. " );
  265.            
  266.             if(f.isAutoIncrement) {
  267.                 pw.println( "     * <br><br>Esta propiedad se mapea con un campo que es de <b>Auto Incremento</b> !<br>");
  268.                 pw.println( "     * No deberias usar set" + camelCaseCampo + "( ) a menos que sepas exactamente lo que estas haciendo.<br>");
  269.             }
  270.            
  271.             if(f.isPrimary) {
  272.                 pw.println( "     * <br><br>Esta propiedad se mapea con un campo que es una <b>Llave Primaria</b> !<br>");
  273.                 pw.println( "     * No deberias usar set" + camelCaseCampo + "( ) a menos que sepas exactamente lo que estas haciendo.<br>");
  274.             }  
  275.            
  276.             pw.println( "     * @param "+ f.type );
  277.             pw.println( "     */");
  278.            
  279.             pw.println( "   final public function set" + camelCaseCampo + "( $"+f.title+" )" );
  280.             pw.println( "   {" );
  281.             pw.println( "       $this->"+f.title+ " = $" + f.title+";" );
  282.             pw.println( "   }" );
  283.             pw.println();
  284.         }
  285.        
  286.        
  287.         pw.println("}");               
  288.         pw.close();
  289.     }
  290.  
  291.  
  292.     //dao normal para tabla
  293.     static void writeDAO(String tabla, ArrayList<Field> fields ) throws IOException
  294.     {
  295.         String fileName = tabla + ".dao.php";
  296.        
  297.         includes.add(fileName);
  298.  
  299.         String className = toCamelCase( tabla );
  300.  
  301.         PrintWriter pw = new PrintWriter(new FileWriter( fileName ));
  302.        
  303.         pw.println("<?php");
  304.         pw.println();
  305.         pw.println( "require_once ('Estructura.php');");
  306.         pw.println("require_once(\"base/"+tabla+".dao.base.php\");");
  307.         pw.println("require_once(\"base/"+tabla+".vo.base.php\");");
  308.  
  309.                
  310.         pw.println("/** "+ toCamelCase(tabla) +" Data Access Object (DAO)." );
  311.         pw.println("  * ");
  312.         pw.println("  * Esta clase contiene toda la manipulacion de bases de datos que se necesita para ");
  313.         pw.println("  * almacenar de forma permanente y recuperar instancias de objetos {@link "+toCamelCase(tabla)+" }. ");
  314.         pw.println("  * @author Alan Gonzalez <alan@caffeina.mx> ");
  315.         pw.println("  * @access public");
  316.         pw.println("  * ");
  317.         pw.println("  */");    
  318.  
  319.         pw.println("class " + className+ "DAO extends " + className+"DAOBase" );       
  320.         pw.println("{");
  321.         pw.println();
  322.         pw.println("}");
  323.        
  324.         pw.flush();
  325.         pw.close();
  326.     }
  327.  
  328.     //dao base para tabla
  329.     static void writeDAOBase(String tabla, ArrayList<Field> fields ) throws IOException
  330.     {
  331.         String fileName = "base/" + tabla + ".dao.base.php";
  332.  
  333.         String className = toCamelCase( tabla );
  334.  
  335.         PrintWriter pw = new PrintWriter(new FileWriter( fileName ));
  336.        
  337.         pw.println("<?php");
  338.  
  339.         pw.println("/** "+ toCamelCase(tabla) +" Data Access Object (DAO) Base." );
  340.         pw.println("  * ");
  341.         pw.println("  * Esta clase contiene toda la manipulacion de bases de datos que se necesita para ");
  342.         pw.println("  * almacenar de forma permanente y recuperar instancias de objetos {@link "+toCamelCase(tabla)+" }. ");
  343.         pw.println("  * @author Alan Gonzalez <alan@caffeina.mx> ");
  344.         pw.println("  * @access private");
  345.         pw.println("  * ");
  346.         pw.println("  */");
  347.        
  348.         pw.println("abstract class " + className+ "DAOBase extends TablaDAO" );    
  349.         pw.println("{");
  350.         pw.println();
  351.        
  352.                
  353.         /* 
  354.             metodo save
  355.         */
  356.         {
  357.             pw.println("    /**");
  358.             pw.println("      * Guardar registros. ");
  359.             pw.println("      * ");
  360.             pw.println("      * Este metodo guarda el estado actual del objeto {@link "+toCamelCase(tabla)+"} pasado en la base de datos. La llave ");
  361.             pw.println("      * primaria indicara que instancia va a ser actualizado en base de datos. Si la llave primara o combinacion de llaves");
  362.             pw.println("      * primarias describen una fila que no se encuentra en la base de datos, entonces save() creara una nueva fila, insertando");
  363.             pw.println("      * en ese objeto el ID recien creado.");
  364.             pw.println("      * ");
  365.             pw.println("      * @static");
  366.             pw.println("      * @throws Exception si la operacion fallo.");
  367.             pw.println("      * @param "+toCamelCase(tabla)+" [$"+tabla+"] El objeto de tipo " + toCamelCase(tabla));
  368.             pw.println("      * @return Un entero mayor o igual a cero denotando las filas afectadas, o un string con el error si es que hubo alguno.");
  369.             pw.println("      **/");
  370.            
  371.             pw.println("    public static final function save( &$"+tabla+" )");
  372.             pw.println("    {");
  373.            
  374.             String pks = "";
  375.             for(Field f : fields){
  376.                 if(!f.isPrimary) continue;
  377.                 pks +=  " $"+tabla+"->get"+ toCamelCase(f.title)+"() ,";
  378.             }
  379.             pks = pks.substring(0, pks.length() -1 );
  380.            
  381.             pw.println("        if( self::getByPK( " + pks + ") === NULL )");
  382.             pw.println("        {");
  383.             pw.println("            try{ return " + className +"DAOBase::create( $"+ tabla +") ; } catch(Exception $e){ throw $e; }");
  384.             pw.println("        }else{");
  385.             pw.println("            try{ return " + className +"DAOBase::update( $"+ tabla +") ; } catch(Exception $e){ throw $e; }");
  386.             pw.println("        }");
  387.             pw.println("    }");
  388.             pw.println();
  389.             pw.println();      
  390.         }
  391.        
  392.        
  393.        
  394.        
  395.        
  396.        
  397.        
  398.        
  399.        
  400.        
  401.         /* 
  402.             metodo getByPK
  403.         */
  404.         {
  405.  
  406.             String pks = "";
  407.             String sql = "";
  408.            
  409.             for(Field f : fields){
  410.                
  411.                 if(!f.isPrimary) continue;
  412.                
  413.                 pks +=  " $"+f.title+",";
  414.                 sql +=  f.title +" = ? AND ";
  415.             }
  416.  
  417.             pks = pks.substring( 0, pks.length() -1 );         
  418.             sql = sql.substring( 0, sql.length() -4 );
  419.  
  420.  
  421.             pw.println("    /**");
  422.             pw.println("      * Obtener {@link "+toCamelCase(tabla)+"} por llave primaria. ");
  423.             pw.println("      * ");
  424.             pw.println("      * Este metodo cargara un objeto {@link "+toCamelCase(tabla)+"} de la base de datos ");
  425.             pw.println("      * usando sus llaves primarias. ");
  426.             pw.println("      * ");
  427.             pw.println("      * @static");
  428.             pw.println("      * @return Objeto Un objeto del tipo {@link "+toCamelCase(tabla)+"}. NULL si no hay tal registro.");
  429.             pw.println("      **/");
  430.  
  431.             pw.println("    public static final function getByPK( " + pks + " )");
  432.             pw.println("    {");
  433.             pw.println("        $sql = \"SELECT * FROM "+tabla+" WHERE ("+ sql + ") LIMIT 1;\";");
  434.             pw.println("        $params = array( "+ pks +" );");
  435.             pw.println("        global $conn;");
  436.             pw.println("        $rs = $conn->GetRow($sql, $params);");
  437.             pw.println("        if(count($rs)==0)return NULL;");
  438.             pw.println("        return new " + toCamelCase(tabla) + "( $rs );");
  439.             pw.println("    }");
  440.             pw.println();
  441.             pw.println();          
  442.         }
  443.                
  444.                
  445.                
  446.                
  447.                
  448.        
  449.  
  450.         /* 
  451.             metodo getAll
  452.         */
  453.         {
  454.            
  455.             pw.println("    /**");
  456.             pw.println("      * Obtener todas las filas.");
  457.             pw.println("      * ");
  458.             pw.println("      * Esta funcion leera todos los contenidos de la tabla en la base de datos y construira");
  459.             pw.println("      * un vector que contiene objetos de tipo {@link "+toCamelCase(tabla)+"}. Tenga en cuenta que este metodo");
  460.             pw.println("      * consumen enormes cantidades de recursos si la tabla tiene muchas filas. ");
  461.             pw.println("      * Este metodo solo debe usarse cuando las tablas destino tienen solo pequenas cantidades de datos o se usan sus parametros para obtener un menor numero de filas.");
  462.             pw.println("      * ");
  463.             pw.println("      * @static");
  464.             pw.println("      * @param $pagina Pagina a ver.");        
  465.             pw.println("      * @param $columnas_por_pagina Columnas por pagina.");    
  466.             pw.println("      * @param $orden Debe ser una cadena con el nombre de una columna en la base de datos.");     
  467.             pw.println("      * @param $tipo_de_orden 'ASC' o 'DESC' el default es 'ASC'");        
  468.             pw.println("      * @return Array Un arreglo que contiene objetos del tipo {@link "+toCamelCase(tabla)+"}.");
  469.             pw.println("      **/");
  470.             pw.println("    public static final function getAll( $pagina = NULL, $columnas_por_pagina = NULL, $orden = NULL, $tipo_de_orden = 'ASC' )");
  471.             pw.println("    {");
  472.             pw.println("        $sql = \"SELECT * from "+tabla+"\";");             
  473.  
  474.             pw.println("        if($orden != NULL)");
  475.             pw.println("        { $sql .= \" ORDER BY \" . $orden . \" \" . $tipo_de_orden; }");
  476.            
  477.             pw.println("        if($pagina != NULL)");
  478.             pw.println("        {");
  479.             pw.println("            $sql .= \" LIMIT \" . (( $pagina - 1 )*$columnas_por_pagina) . \",\" . $columnas_por_pagina; ");
  480.             pw.println("        }");
  481.             pw.println("        global $conn;");
  482.             pw.println("        $rs = $conn->Execute($sql);");
  483.             pw.println("        $allData = array();");
  484.             pw.println("        foreach ($rs as $foo) {");
  485.             pw.println("            array_push( $allData, new "+ toCamelCase( tabla ) +"($foo));");
  486.             pw.println("        }");
  487.             pw.println("        return $allData;");
  488.             pw.println("    }");
  489.             pw.println();
  490.             pw.println();      
  491.         }
  492.        
  493.        
  494.         /* 
  495.             metodo search
  496.         */
  497.  
  498.         {
  499.             pw.println("    /**");
  500.             pw.println("      * Buscar registros.");
  501.             pw.println("      * ");
  502.             pw.println("      * Este metodo proporciona capacidad de busqueda para conseguir un juego de objetos {@link "+toCamelCase(tabla)+"} de la base de datos. ");
  503.             pw.println("      * Consiste en buscar todos los objetos que coinciden con las variables permanentes instanciadas de objeto pasado como argumento. ");
  504.             pw.println("      * Aquellas variables que tienen valores NULL seran excluidos en busca de criterios.");
  505.             pw.println("      * ");
  506.            
  507.             pw.println("      * <code>");
  508.             pw.println("      *  /**");
  509.             pw.println("      *   * Ejemplo de uso - buscar todos los clientes que tengan limite de credito igual a 20000");
  510.             pw.println("      *   {@*} ");
  511.  
  512.             pw.println("      *   $cliente = new Cliente();");
  513.             pw.println("      *   $cliente->setLimiteCredito(\"20000\");");
  514.             pw.println("      *   $resultados = ClienteDAO::search($cliente);");
  515.             pw.println("      *   ");
  516.             pw.println("      *   foreach($resultados as $c ){");
  517.             pw.println("      *     echo $c->getNombre() . \"<br>\";");
  518.             pw.println("      *   }");
  519.            
  520.             pw.println("      * </code>");
  521.             pw.println("      * @static");
  522.             pw.println("      * @param "+toCamelCase(tabla)+" [$"+tabla+"] El objeto de tipo " + toCamelCase(tabla));
  523.             pw.println("      * @param bool [$json] Verdadero para obtener los resultados en forma JSON y no objetos. En caso de no presentare este parametro se tomara el valor default de false.");          
  524.             pw.println("      **/");
  525.  
  526.             pw.println("    public static final function search( $"+tabla+" , $json = false)");
  527.             pw.println("    {");
  528.            
  529.  
  530.             pw.println("        $sql = \"SELECT * from "+tabla+" WHERE (\"; ");
  531.             pw.println("        $val = array();");
  532.  
  533.             for(Field f : fields)
  534.             {
  535.                 pw.println("        if( $"+tabla+"->get"+toCamelCase(f.title)+"() != NULL){");
  536.                 pw.println("            $sql .= \" "+ f.title +" = ? AND\";");
  537.                 pw.println("            array_push( $val, $"+tabla+"->get"+toCamelCase(f.title)+"() );");
  538.                 pw.println("        }");
  539.                 pw.println();
  540.             }
  541.    
  542.             pw.println("        $sql = substr($sql, 0, -3) . \" )\";" );
  543.             pw.println("        global $conn;");
  544.             pw.println("        $rs = $conn->Execute($sql, $val);");
  545.  
  546.             pw.println("        if($json === false){");        
  547.             pw.println("            $ar = array();");
  548.             pw.println("            foreach ($rs as $foo) {");
  549.             pw.println("                array_push( $ar, new "+ toCamelCase( tabla ) +"($foo));");
  550.             pw.println("            }");
  551.             pw.println("            return $ar;");         
  552.             pw.println("        }else{");
  553.             pw.println("            $allData = '[';");
  554.             pw.println("            foreach ($rs as $foo) {");
  555.             pw.println("                $allData .= new "+ toCamelCase( tabla ) +"($foo) . ',';"  );
  556.             pw.println("            }");
  557.             pw.println("            $allData = substr($allData, 0 , -1) . ']';"  );        
  558.             pw.println("            return $allData;");
  559.             pw.println("        }");           
  560.  
  561.             pw.println("    }");
  562.             pw.println();
  563.             pw.println();      
  564.         }
  565.        
  566.        
  567.        
  568.        
  569.        
  570.        
  571.         /* 
  572.             metodo update
  573.         */
  574.         {
  575.             pw.println("    /**");
  576.             pw.println("      * Actualizar registros.");
  577.             pw.println("      * ");
  578.             pw.println("      * Este metodo es un metodo de ayuda para uso interno. Se ejecutara todas las manipulaciones");
  579.             pw.println("      * en la base de datos que estan dadas en el objeto pasado.No se haran consultas SELECT ");
  580.             pw.println("      * aqui, sin embargo. El valor de retorno indica cuántas filas se vieron afectadas.");
  581.             pw.println("      * ");
  582.             pw.println("      * @internal private information for advanced developers only");
  583.             pw.println("      * @return Filas afectadas o un string con la descripcion del error");
  584.             pw.println("      * @param "+toCamelCase(tabla)+" [$"+tabla+"] El objeto de tipo " + toCamelCase(tabla) + " a actualizar.");
  585.             pw.println("      **/");
  586.            
  587.  
  588.             pw.println("    private static final function update( $"+tabla+" )");
  589.             pw.println("    {");
  590.  
  591.             String sql = "";
  592.             String args = "";
  593.             String pk = "";
  594.             String pkargs = "";
  595.                        
  596.             for(Field f : fields){
  597.                 if( f.isPrimary )
  598.                 {
  599.                     pk += " " + f.title + " = ? AND";
  600.                     pkargs += "$"+tabla+"->get" + toCamelCase(f.title)+"(),";
  601.                 }else{
  602.                     args += "$"+tabla+"->get"+ toCamelCase(f.title) + "(), \n           ";
  603.                     sql += f.title+" = ?, ";
  604.                 }
  605.             }
  606.            
  607.             if(args.length()==0){
  608.                
  609.             }else{
  610.                 args = args.substring(0, args.length() -1 ) ;
  611.                 pk = pk.substring(0, pk.length() - 4 ) ;
  612.                 sql = sql.substring(0, sql.length() -2 );
  613.  
  614.                 pw.println("        $sql = \"UPDATE "+tabla+" SET  "+ sql + " WHERE " +pk+ ";\";" );
  615.                 pw.println("        $params = array( \n         "+ args +"  "+ pkargs +" );");
  616.                 pw.println("        global $conn;");
  617.                 pw.println("        try{$conn->Execute($sql, $params);}");         
  618.                 pw.println("        catch(Exception $e){ throw new Exception ($e->getMessage()); }");              
  619.                 pw.println("        return $conn->Affected_Rows();");
  620.             }
  621.  
  622.             pw.println("    }");
  623.             pw.println();
  624.             pw.println();
  625.         }
  626.        
  627.  
  628.  
  629.  
  630.  
  631.                
  632.         /* 
  633.             metodo create
  634.         */
  635.         {
  636.  
  637.             pw.println("    /**");
  638.             pw.println("      * Crear registros.");
  639.             pw.println("      * ");
  640.             pw.println("      * Este metodo creara una nueva fila en la base de datos de acuerdo con los ");
  641.             pw.println("      * contenidos del objeto "+toCamelCase(tabla)+" suministrado. Asegurese");
  642.             pw.println("      * de que los valores para todas las columnas NOT NULL se ha especificado ");
  643.             pw.println("      * correctamente. Despues del comando INSERT, este metodo asignara la clave ");
  644.             pw.println("      * primaria generada en el objeto "+toCamelCase(tabla)+" dentro de la misma transaccion.");
  645.             pw.println("      * ");
  646.             pw.println("      * @internal private information for advanced developers only");
  647.             pw.println("      * @return Un entero mayor o igual a cero identificando las filas afectadas, en caso de error, regresara una cadena con la descripcion del error");
  648.             pw.println("      * @param "+toCamelCase(tabla)+" [$"+tabla+"] El objeto de tipo " + toCamelCase(tabla) +" a crear." );
  649.             pw.println("      **/");
  650.             pw.println("    private static final function create( &$"+tabla+" )");
  651.             pw.println("    {");
  652.  
  653.             String sql = "";
  654.             String args = "";
  655.             String sqlnames = "";
  656.             String pk_ai = "";
  657.                
  658.             for(Field f : fields){
  659.                
  660.                 if(f.isPrimary && f.isAutoIncrement)
  661.                 {
  662.                     pk_ai += "$"+tabla+"->set"+ toCamelCase(f.title) + "( $conn->Insert_ID() );";
  663.                 }else{
  664.                     args += "$"+tabla+"->get"+ toCamelCase(f.title) + "(), \n           ";
  665.                     sqlnames += f.title+", ";
  666.                     sql +=  "?, ";                 
  667.                 }
  668.  
  669.             }
  670.  
  671.             sqlnames = sqlnames.substring(0, sqlnames.length() -2 ) ;
  672.             args = args.substring(0, args.length() -1 ) ;
  673.             sql = sql.substring(0, sql.length() -2 );
  674.            
  675.             pw.println("        $sql = \"INSERT INTO "+tabla+" ( "+ sqlnames + " ) VALUES ( "+ sql +");\";" );
  676.             pw.println("        $params = array( \n         "+ args +" );");
  677.             pw.println("        global $conn;");
  678.             pw.println("        try{$conn->Execute($sql, $params);}");         
  679.             pw.println("        catch(Exception $e){ throw new Exception ($e->getMessage()); }");
  680.             pw.println("        $ar = $conn->Affected_Rows();");
  681.             pw.println("        if($ar == 0) return 0;");
  682.             pw.println("        " + pk_ai);
  683.             pw.println("        return $ar;");
  684.             pw.println("    }");
  685.             pw.println();
  686.             pw.println();
  687.         }
  688.        
  689.        
  690.    
  691.             /* 
  692.                 metodo byrange
  693.             */
  694.  
  695.             {
  696.                 pw.println("    /**");
  697.                 pw.println("      * Buscar por rango.");
  698.                 pw.println("      * ");
  699.                 pw.println("      * Este metodo proporciona capacidad de busqueda para conseguir un juego de objetos {@link "+toCamelCase(tabla)+"} de la base de datos siempre y cuando ");
  700.                 pw.println("      * esten dentro del rango de atributos activos de dos objetos criterio de tipo {@link "+toCamelCase(tabla)+"}.");
  701.                 pw.println("      * ");
  702.                 pw.println("      * Aquellas variables que tienen valores NULL seran excluidos en la busqueda. ");
  703.                 pw.println("      * No es necesario ordenar los objetos criterio, asi como tambien es posible mezclar atributos.");
  704.                 pw.println("      * Si algun atributo solo esta especificado en solo uno de los objetos de criterio se buscara que los resultados conicidan exactamente en ese campo.");
  705.                 pw.println("      * ");
  706.  
  707.                 pw.println("      * <code>");
  708.                 pw.println("      *  /**");
  709.                 pw.println("      *   * Ejemplo de uso - buscar todos los clientes que tengan limite de credito ");
  710.                 pw.println("      *   * mayor a 2000 y menor a 5000. Y que tengan un descuento del 50%.");
  711.                 pw.println("      *   {@*} ");
  712.  
  713.                 pw.println("      *   $cr1 = new Cliente();");
  714.                 pw.println("      *   $cr1->setLimiteCredito(\"2000\");");
  715.                 pw.println("      *   $cr1->setDescuento(\"50\");");
  716.                 pw.println("      *   ");
  717.                 pw.println("      *   $cr2 = new Cliente();");
  718.                 pw.println("      *   $cr2->setLimiteCredito(\"5000\");");                 
  719.                 pw.println("      *   $resultados = ClienteDAO::byRange($cr1, $cr2);");
  720.                 pw.println("      *   ");
  721.                 pw.println("      *   foreach($resultados as $c ){");
  722.                 pw.println("      *     echo $c->getNombre() . \"<br>\";");
  723.                 pw.println("      *   }");
  724.  
  725.                 pw.println("      * </code>");
  726.                 pw.println("      * @static");
  727.                 pw.println("      * @param "+toCamelCase(tabla)+" [$"+tabla+"] El objeto de tipo " + toCamelCase(tabla));
  728.                 pw.println("      * @param "+toCamelCase(tabla)+" [$"+tabla+"] El objeto de tipo " + toCamelCase(tabla));
  729.                 pw.println("      * @param bool [$json] Verdadero para obtener los resultados en forma JSON y no objetos. En caso de no presentare este parametro se tomara el valor default de false.");                      
  730.                 pw.println("      **/");
  731.  
  732.                 pw.println("    public static final function byRange( $"+tabla+"A , $"+tabla+"B , $json = false)");
  733.                 pw.println("    {");
  734.  
  735.                 pw.println("        $sql = \"SELECT * from "+tabla+" WHERE (\"; ");
  736.                 pw.println("        $val = array();");
  737.  
  738.                 for(Field f : fields)
  739.                 {
  740.  
  741.                     pw.println("        if( (($a = $"+tabla+"A->get"+toCamelCase(f.title)+"()) != NULL) & ( ($b = $"+tabla+"B->get"+toCamelCase(f.title)+"()) != NULL) ){");
  742.                     pw.println("                $sql .= \" "+ f.title +" >= ? AND "+ f.title +" <= ? AND\";");
  743.                     pw.println("                array_push( $val, min($a,$b)); ");
  744.                     pw.println("                array_push( $val, max($a,$b)); ");
  745.                     pw.println("        }elseif( $a || $b ){");
  746.                     pw.println("            $sql .= \" "+ f.title +" = ? AND\"; ");
  747.                     pw.println("            $a = $a == NULL ? $b : $a;");
  748.                     pw.println("            array_push( $val, $a);");
  749.                     pw.println("            ");                    
  750.                     pw.println("        }");
  751.                     pw.println();
  752.                 }
  753.  
  754.                 pw.println("        $sql = substr($sql, 0, -3) . \" )\";" );
  755.  
  756.                 pw.println("        global $conn;");
  757.                 pw.println("        $rs = $conn->Execute($sql, $val);");
  758.  
  759.                 pw.println("        if($json === false){");        
  760.                 pw.println("            $ar = array();");
  761.                 pw.println("            foreach ($rs as $foo) {");
  762.                 pw.println("                array_push( $ar, new "+ toCamelCase( tabla ) +"($foo));");
  763.                 pw.println("            }");
  764.                 pw.println("            return $ar;");         
  765.                 pw.println("        }else{");
  766.                 pw.println("            $allData = '[';");
  767.                 pw.println("            foreach ($rs as $foo) {");
  768.                 pw.println("                $allData .= new "+ toCamelCase( tabla ) +"($foo) . ',';"  );
  769.                 pw.println("            }");
  770.                 pw.println("            $allData = substr($allData, 0 , -1) . ']';"  );        
  771.                 pw.println("            return $allData;");
  772.                 pw.println("        }");
  773.                 pw.println("    }");
  774.                 pw.println();
  775.                 pw.println();      
  776.  
  777.  
  778.             //termina -------
  779.         }
  780.        
  781.        
  782.        
  783.        
  784.        
  785.        
  786.        
  787.        
  788.         /* 
  789.             metodo delete
  790.         */
  791.         {
  792.            
  793.                                
  794.                 pw.println("    /**");
  795.                 pw.println("      * Eliminar registros.");
  796.                 pw.println("      * ");
  797.                 pw.println("      * Este metodo eliminara la informacion de base de datos identificados por la clave primaria");
  798.                 pw.println("      * en el objeto "+toCamelCase(tabla)+" suministrado. Una vez que se ha suprimido un objeto, este no ");
  799.                 pw.println("      * puede ser restaurado llamando a save(). save() al ver que este es un objeto vacio, creara una nueva fila ");
  800.                 pw.println("      * pero el objeto resultante tendra una clave primaria diferente de la que estaba en el objeto eliminado. ");
  801.                 pw.println("      * Si no puede encontrar eliminar fila coincidente a eliminar, Exception sera lanzada.");
  802.                 pw.println("      * ");
  803.                 pw.println("      * @throws Exception Se arroja cuando el objeto no tiene definidas sus llaves primarias.");
  804.                 pw.println("      * @return int El numero de filas afectadas.");
  805.                 pw.println("      * @param "+toCamelCase(tabla)+" [$"+tabla+"] El objeto de tipo " + toCamelCase(tabla)+ " a eliminar");               
  806.                 pw.println("      **/");
  807.                
  808.                 pw.println("    public static final function delete( &$"+tabla+" )");
  809.                 pw.println("    {");
  810.  
  811.  
  812.                 String sql = "";
  813.                 String args = "";
  814.                 String pk = "";
  815.                 String pkargs = "";
  816.  
  817.                 for(Field f : fields){
  818.  
  819.                     if( f.isPrimary )
  820.                     {
  821.                         pk += " " + f.title + " = ? AND";
  822.                         pkargs += "$"+tabla+"->get" + toCamelCase(f.title)+"(), ";
  823.                     }
  824.                 }
  825.  
  826.                 if(pkargs.length() == 0){
  827.  
  828.                 }else{
  829.                     pkargs = pkargs.substring(0, pkargs.length() -2 ) ;
  830.                     pk = pk.substring(0, pk.length() - 4 ) ;
  831.                    
  832.                     pw.println("        if(self::getByPK("+ pkargs +") === NULL) throw new Exception('Campo no encontrado.');");
  833.                                         //DELETE FROM `pos`.`cliente` WHERE `cliente`.`id_cliente` = 54 LIMIT 1
  834.                     pw.println("        $sql = \"DELETE FROM "+tabla+" WHERE " +pk+ ";\";" );
  835.  
  836.                     pw.println("        $params = array( "+ pkargs +" );");
  837.  
  838.                     pw.println("        global $conn;");
  839.                     pw.println();
  840.                     pw.println("        $conn->Execute($sql, $params);");  
  841.                     pw.println("        return $conn->Affected_Rows();");  
  842.                    
  843.  
  844.                 }
  845.  
  846.  
  847.                 pw.println("    }");
  848.                 pw.println();
  849.                 pw.println();
  850.         }
  851.    
  852.         pw.println("}");
  853.         pw.close();
  854.     }
  855.    
  856.    
  857.    
  858.    
  859.    
  860.    
  861.    
  862.    
  863.    
  864.    
  865.  
  866.    
  867.     //parse view
  868.     static void parseView(String vname) throws IOException
  869.     {
  870.     }
  871.    
  872.     //vo para vista
  873.     static void parseViewTableVO( String tabla, ArrayList<Field> fields ) throws IOException
  874.     {
  875.     }
  876.  
  877.     //ado y adobase para vista
  878.     static void parseViewTableADO( String tabla, ArrayList<Field> fields ) throws IOException
  879.     {
  880.     }
  881.        
  882.        
  883.  
  884.  
  885.        
  886.  
  887.    
  888.    
  889.     /*
  890.         init
  891.     */
  892.  
  893.     static void parseContent() throws IOException
  894.     {
  895.        
  896.         System.out.println("Starting...");
  897.        
  898.         String line ;
  899.        
  900.         int table_count = 0;
  901.         int views_count = 0;
  902.        
  903.        
  904.         while( (line = br.readLine()) != null )
  905.         {
  906.             if( line.indexOf("CREATE TABLE") != -1 )
  907.             {
  908.                 table_count++;
  909.                
  910.                 String t_name = line.substring( line.indexOf("`") + 1, line.lastIndexOf("`") );
  911.                
  912.                 parseTable( t_name );
  913.             }
  914.  
  915.         }
  916.        
  917.         //escribir el archivo de la estructura de las clases
  918.         PrintWriter pw = new PrintWriter(new FileWriter("Estructura.php"));
  919.        
  920.         pw.println("<?php");
  921.  
  922.         pw.println("        /** Table Data Access Object.");
  923.         pw.println("       *     ");
  924.         pw.println("          * Esta clase abstracta comprende metodos comunes para todas las clases DAO que mapean una tabla");
  925.         pw.println("          * @author Alan Gonzalez <alan@caffeina.mx> ");
  926.         pw.println("          * @access private");
  927.         pw.println("          * ");
  928.         pw.println("          */");
  929.         pw.println("        abstract class TablaDAO");
  930.         pw.println("        {");
  931.         pw.println("");
  932.         pw.println("        }");
  933.         pw.println("");
  934.         pw.println("        /** Table Data Access Object.");
  935.         pw.println("          * ");
  936.         pw.println("          * Esta clase abstracta comprende metodos comunes para todas las clases DAO que mapean una vista");
  937.         pw.println("          * @author Alan Gonzalez <alan@caffeina.mx> ");
  938.         pw.println("          * @access private");
  939.         pw.println("          * ");
  940.         pw.println("          */");
  941.         pw.println("        abstract class VistaDAO");
  942.         pw.println("        {");
  943.         pw.println("");
  944.         pw.println("        }");
  945.  
  946.         pw.println("        /** Value Object.");
  947.         pw.println("          * ");
  948.         pw.println("          * Esta clase abstracta comprende metodos comunes para todas los objetos VO");
  949.         pw.println("          * @author Alan Gonzalez <alan@caffeina.mx> ");
  950.         pw.println("          * @access private");
  951.         pw.println("          * ");
  952.         pw.println("          */");
  953.         pw.println("        abstract class VO");
  954.         pw.println("        {");
  955.         pw.println("");
  956.         pw.println("");
  957.         pw.println("        }");
  958.        
  959.         pw.flush();
  960.         pw.close();
  961.        
  962.         System.out.println("Parsed tables: " + table_count);
  963.         System.out.println("Parsed views: " + views_count);    
  964.     }
  965.    
  966.    
  967.    
  968.    
  969.    
  970.    
  971.     static void writeIncludes(  )
  972.     {
  973.        
  974.         try{
  975.            
  976.             PrintWriter pw = new PrintWriter(new FileWriter( "model.inc.php" ));
  977.  
  978.             pw.println("<?php");
  979.             pw.println("/* Todos los includes de este sitema */" );
  980.             pw.println();
  981.  
  982.             pw.println( "require_once ('Estructura.php');");
  983.  
  984.             for( String s : includes )
  985.             {
  986.                 pw.println( "require_once ('"+ s +"');");
  987.             }
  988.                
  989.             pw.close();
  990.         }catch(IOException ioe){
  991.             System.out.println("Inclues"+ioe);
  992.            
  993.         }
  994.     }
  995.  
  996.  
  997.  
  998.    
  999.     public static void main(String ... args)
  1000.     {
  1001.        
  1002.         br = null;
  1003.  
  1004.         includes = new ArrayList<String>();
  1005.  
  1006.         if(args.length < 1){
  1007.             System.out.println("No sql file specified... using bd.sql");
  1008.             readFile( "bd.sql" );
  1009.         }else{
  1010.             readFile( args[0] );
  1011.         }
  1012.                
  1013.         try{
  1014.             parseContent(  );          
  1015.         }catch(IOException ioe){
  1016.             System.out.println( "Error al parsear..." );
  1017.         }
  1018.  
  1019.         writeIncludes();
  1020.        
  1021.         closeFile();
  1022.     }
  1023.  
  1024.  
  1025. }
  1026.  
  1027.  
  1028.  
  1029.  
  1030.  
  1031.  
  1032.  
  1033. class Field{
  1034.    
  1035.     String title;
  1036.     String type;
  1037.     String comment;
  1038.     boolean isPrimary;
  1039.     boolean isAutoIncrement;
  1040.    
  1041.     Field( String title )
  1042.     {
  1043.         this.title = title;
  1044.     }
  1045.    
  1046.     Field( String title, String type, String comment, boolean isPrimary, boolean isAutoIncrement )
  1047.     {
  1048.         this.title = title;
  1049.         this.type = type;
  1050.         this.comment = comment;
  1051.         this.isPrimary = isPrimary;
  1052.         this.isAutoIncrement = isAutoIncrement;
  1053.     }
  1054.    
  1055. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement