Files
VAR.DatabaseExplorer/ServerExplorer/CodeGen.cs
2013-10-14 01:03:45 +02:00

381 lines
13 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Data;
namespace ServerExplorer
{
public class CodeGen
{
private static string FixNombre(string strIn){
return strIn.Replace(' ', '_');
}
public static void GeneraDTO(Config config, TablaDesc t)
{
string nombreObj = FixNombre(t.Esquema) + "_" + FixNombre(t.Nombre);
string nombreFichero = config.PathDTO + "/" + nombreObj + "_DTO.cs";
EscritorCodigo escritor = new EscritorCodigo(nombreFichero);
// Cabecera
escritor.Escribe("using System;");
escritor.Escribe("using System.Data;");
escritor.Escribe("");
escritor.EscribeInd("namespace " + config.NamespaceDTO);
// El objeto de la tabla
escritor.EscribeInd("public partial class " + nombreObj);
foreach (ColumnaDesc c in t.Columnas)
{
string nombre = FixNombre(c.Nombre);
TipoCol tipo = c.GetTipo();
string sTipo = null;
// Determinar el tipo a usar
switch (tipo)
{
case TipoCol.Numerico:
sTipo = "int"; break;
case TipoCol.Texto:
sTipo = "string"; break;
case TipoCol.AproxNumerico:
sTipo = "double"; break;
case TipoCol.Tiempo:
sTipo = "DateTime"; break;
case TipoCol.Booleano:
sTipo = "bool"; break;
case TipoCol.Binario:
sTipo = "byte[]"; break;
}
if (sTipo == null)
{
continue;
}
// El atributo privado para cada columna
escritor.Escribe("private " + sTipo + " _" + nombre + ";");
// La propiedad publica para cada columna
escritor.EscribeInd("public " + sTipo + " " + nombre);
escritor.EscribeInd("get");
escritor.Escribe("return _" + nombre + ";");
escritor.DeInd();
escritor.EscribeInd("set");
escritor.Escribe("_" + nombre + " = value;");
escritor.DeInd();
escritor.DeInd();
escritor.Escribe("");
}
escritor.DeInd();
// El Pie
escritor.DeInd();
// Cerrar ficheros
escritor.Cerrar();
}
private static void GenerarDALParametrosTabla
(TablaDesc t, String varPrm, String varCmd, String varDTO, bool input, EscritorCodigo escritor)
{
foreach (ColumnaDesc c in t.Columnas)
{
string nombre = FixNombre(c.Nombre);
TipoCol tipo = c.GetTipo();
// Establecer el tipo del parametro
switch (tipo)
{
case TipoCol.Numerico:
escritor.Escribe(varPrm + " = new SqlParameter(\"@[" + c.Nombre + "]\",SqlDbType.Int);"); break;
case TipoCol.Texto:
escritor.Escribe(varPrm + " = new SqlParameter(\"@[" + c.Nombre + "]\", " +
"SqlDbType.VarChar, " + c.Tamanho + ");"); break;
case TipoCol.AproxNumerico:
escritor.Escribe(varPrm + " = new SqlParameter(\"@[" + c.Nombre + "]\", SqlDbType.Real);"); break;
case TipoCol.Tiempo:
escritor.Escribe(varPrm + " = new SqlParameter(\"@[" + c.Nombre + "]\", SqlDbType.DateTime);"); break;
case TipoCol.Booleano:
escritor.Escribe(varPrm + " = new SqlParameter(\"@[" + c.Nombre + "]\", SqlDbType.Bit);"); break;
case TipoCol.Binario:
if (c.Tamanho > 0)
{
escritor.Escribe(varPrm + " = new SqlParameter(\"@[" + c.Nombre + "]\", " +
"SqlDbType.VarBinary, " + c.Tamanho + ");");
}
else
{
escritor.Escribe(varPrm + " = new SqlParameter(\"@[" + c.Nombre + "]\", SqlDbType.Binary);");
}
break;
default:
continue;
}
if (input)
{
escritor.Escribe(varPrm + ".Direction = ParameterDirection.Input;");
}
else
{
escritor.Escribe(varPrm + ".Direction = ParameterDirection.Output;");
}
escritor.Escribe(varPrm + ".Value = " + varDTO + "." + nombre + ";");
escritor.Escribe(varCmd + ".Parameters.Add(" + varPrm + ");");
}
escritor.Escribe("");
}
private static void GenerarDALInsert(Config config, TablaDesc t, EscritorCodigo escritor)
{
string nombreObj = FixNombre(t.Esquema) + "_" + FixNombre(t.Nombre);
string strInsert1, strInsert2;
// Cabecera y variables del metodo
escritor.EscribeInd("public bool Insertar(" + nombreObj + " reg)");
escritor.Escribe("SqlCommand cmd;");
escritor.Escribe("SqlParameter prm;");
escritor.Escribe("int nRows;");
escritor.Escribe("");
// Preparacion del comando
strInsert1 = String.Empty;
strInsert2 = String.Empty;
foreach (ColumnaDesc c in t.Columnas)
{
TipoCol tipo = c.GetTipo();
if(tipo==TipoCol.Otro)
continue;
if (strInsert1 == String.Empty)
{
// Primera columna
strInsert1 += "[" + c.Nombre + "]";
strInsert2 += "@[" + c.Nombre + "]";
}
else
{
// Cualquier otra columna
strInsert1 += ", [" + c.Nombre + "]";
strInsert2 += ", @[" + c.Nombre + "]";
}
}
escritor.Escribe("cmd = new SqlCommand(\"INSERT INTO [" + t.Esquema + "].[" + t.Nombre + "] " +
"(" + strInsert1 + ") " +
"VALUES (" + strInsert2 + "\");");
escritor.Escribe("");
// Preparacion de los parametros
GenerarDALParametrosTabla(t, "prm", "cmd", "reg", true, escritor);
// Ejecucion
escritor.Escribe("cnx.Open();");
escritor.Escribe("nRows = cmd.ExecuteNonQuery()");
escritor.Escribe("cnx.Close();");
escritor.Escribe("");
// Pie
escritor.Escribe("return (nRows>0);");
escritor.DeInd();
escritor.Escribe("");
}
private static void GenerarDALActualizar(Config config, TablaDesc t, EscritorCodigo escritor)
{
string nombreObj = FixNombre(t.Esquema) + "_" + FixNombre(t.Nombre);
string strActualizar,strFiltroPrimario;
// Cabecera y variables del metodo
escritor.EscribeInd("public bool Actualizar(" + nombreObj + " reg)");
escritor.Escribe("SqlCommand cmd;");
escritor.Escribe("SqlParameter prm;");
escritor.Escribe("int nRows;");
escritor.Escribe("");
// Preparacion del comando
strActualizar = String.Empty;
foreach (ColumnaDesc c in t.Columnas)
{
TipoCol tipo = c.GetTipo();
if (tipo == TipoCol.Otro)
continue;
if (c.Primaria)
continue;
if (strActualizar != String.Empty)
{
strActualizar += ",";
}
strActualizar += "[" + c.Nombre + "]=@[" + c.Nombre + "]";
}
strFiltroPrimario = String.Empty;
foreach (ColumnaDesc c in t.Columnas)
{
TipoCol tipo = c.GetTipo();
if (!c.Primaria)
continue;
if (strFiltroPrimario != String.Empty)
{
strFiltroPrimario += " AND ";
}
strFiltroPrimario += "[" + c.Nombre + "]=@[" + c.Nombre + "]";
}
escritor.Escribe("cmd = new SqlCommand(\"UPDATE [" + t.Esquema + "].[" + t.Nombre + "] " +
"SET " + strActualizar + " " +
"WHERE " + strFiltroPrimario + "\");");
escritor.Escribe("");
// Preparacion de los parametros
GenerarDALParametrosTabla(t, "prm", "cmd", "reg", true, escritor);
// Ejecucion
escritor.Escribe("cnx.Open();");
escritor.Escribe("nRows = cmd.ExecuteNonQuery();");
escritor.Escribe("cnx.Close();");
escritor.Escribe("");
// Pie
escritor.Escribe("return (nRows>0);");
escritor.DeInd();
escritor.Escribe("");
}
public static void GeneraDAL(Config config, TablaDesc t)
{
string nombreObj = FixNombre(t.Esquema) + "_" + FixNombre(t.Nombre);
string nombreDAL = FixNombre(t.Esquema) + "_" + FixNombre(t.Nombre) + "_DAL";
string nombreFichero = config.PathDTO + "/" + nombreDAL + ".cs";
EscritorCodigo escritor = new EscritorCodigo(nombreFichero);
// Cabecera.
escritor.Escribe("using System;");
escritor.Escribe("using System.Data;");
escritor.Escribe("using System.Data.Sql;");
escritor.Escribe("using System.Data.SqlClient;");
escritor.Escribe("");
escritor.Escribe("using " + config.NamespaceDTO + ";");
escritor.Escribe("");
escritor.EscribeInd("namespace " + config.NamespaceDAL);
// El objeto DAL.
escritor.EscribeInd("public partial class " + nombreDAL);
// Atributos internos
escritor.Escribe("SqlConnexion cnx;");
escritor.Escribe("");
// Constructor
escritor.EscribeInd("public " + nombreDAL + "(SqlConnexion cnx)");
escritor.Escribe("this.cnx = cnx;");
escritor.DeInd();
escritor.Escribe("");
// Metodo Insertar.
GenerarDALInsert(config, t, escritor);
// Metodo Actualizar.
GenerarDALActualizar(config, t, escritor);
// FIXME: Metodo Borrar.
// FIXME: Metodo Leer.
// FIXME: Metodo LeerTodos
// Cerrar objeto DAL.
escritor.DeInd();
// El Pie
escritor.DeInd();
// Cerrar ficheros.
escritor.Cerrar();
}
public static Boolean GenerarCodigo(Config config,DatabaseDesc database)
{
// Asegura la existencia de los directorios destinos
if (!System.IO.Directory.Exists(config.PathRaiz)) { Utiles.CrearDirectorio(config.PathRaiz); }
if (!System.IO.Directory.Exists(config.PathDTO)) { Utiles.CrearDirectorio(config.PathDTO); }
if (!System.IO.Directory.Exists(config.PathDAL)) { Utiles.CrearDirectorio(config.PathDAL); }
if (!System.IO.Directory.Exists(config.PathExtra)) { Utiles.CrearDirectorio(config.PathExtra); }
// Itera por cada tabla para crear sus DTO y DAL
foreach (TablaDesc t in database.Tablas)
{
GeneraDTO(config, t);
GeneraDAL(config, t);
}
return true;
}
private class Indentado
{
private int indentado = 0;
private StringBuilder sb = new StringBuilder();
public void Inc()
{
indentado++;
}
public void Dec()
{
indentado--;
if (indentado < 0)
{
indentado = 0;
}
}
public string Str()
{
sb.Remove(0, sb.Length);
for (int i=0; i < indentado; i++)
{
sb.Append("\t");
}
return sb.ToString();
}
}
private class EscritorCodigo
{
StreamWriter escritor;
Indentado indentado;
public EscritorCodigo(string nombreFichero)
{
escritor = new StreamWriter(nombreFichero);
indentado = new Indentado();
}
public void Cerrar()
{
escritor.Close();
}
public void Escribe(String str)
{
escritor.WriteLine(indentado.Str() + str);
}
public void EscribeInd(String str)
{
escritor.WriteLine(indentado.Str() + str);
escritor.WriteLine(indentado.Str() + "{");
indentado.Inc();
}
public void DeInd()
{
indentado.Dec();
escritor.WriteLine(indentado.Str() + "}");
}
}
}
}