Skip to content

Commit

Permalink
desarrollando CreateTableSQL falta probar si lo hace bien :D
Browse files Browse the repository at this point in the history
  • Loading branch information
tetradog committed May 2, 2019
1 parent 3057d21 commit efe743d
Show file tree
Hide file tree
Showing 4 changed files with 115 additions and 17 deletions.
10 changes: 10 additions & 0 deletions Gabriel.Cat.S.BaseDeDades/Atributos/Constraint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,15 @@ public virtual string GetConstrainName(string tableName, string nameProperty)
str.Append(nameProperty);
return str.ToString();
}
protected abstract string GetDeclarationConstraintData();
public string GetDeclarationConstraintLine(string tableName, string nameProperty)
{
StringBuilder strDeclaration = new StringBuilder();
strDeclaration.Append("Contraint ");
strDeclaration.Append(GetConstrainName(tableName,nameProperty));
strDeclaration.Append(" ");
strDeclaration.Append(GetDeclarationConstraintData());
return strDeclaration.ToString();
}
}
}
2 changes: 1 addition & 1 deletion Gabriel.Cat.S.BaseDeDades/BaseDeDatos.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ namespace Gabriel.Cat.S.BaseDeDades
public abstract class BaseDeDatos
{
public abstract string GetDeclaracionType(Type typeCSharp, LimiteCampoSQL limiteCampoSQL=null);
public abstract string GetAutoIncrementColumn();//poner otro nombre más descriptivo
public abstract string GetAutoIncrementColumnDeclaration();//poner otro nombre más descriptivo
}
}
9 changes: 9 additions & 0 deletions Gabriel.Cat.S.BaseDeDades/Extensión/Propiedad.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,14 @@ public static OrderSQL TryGetOrder(this Utilitats.Propiedad propiedad)
{
return propiedad.Info.Atributos.Filtra((atr) => atr is OrderSQL).FirstOrDefault() as OrderSQL;
}
public static string[] GetForeignKeySQL(this PropiedadTipo propiedad)
{
string[] primaryKeysTipoReference = propiedad.Tipo.GetPrimaryKeyColumnsSQL();
string[] foreignKey = new string[primaryKeysTipoReference.Length];
string nameSQL = propiedad.Tipo.GetNameSQL();
for (int i = 0; i < primaryKeysTipoReference.Length; i++)
foreignKey[i] = nameSQL + primaryKeysTipoReference[i];
return foreignKey;
}
}
}
111 changes: 95 additions & 16 deletions Gabriel.Cat.S.BaseDeDades/Extensión/Type.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,58 +18,137 @@ public static string GetNameSQL(this Type tipo)
else name = tipo.Name;
return name;
}

public static string CreateTableSQL(this Type obj, BaseDeDatos bd)
{
StringBuilder strCreate = new StringBuilder("create or replace table ");
List<System.Reflection.PropertyInfo> columnsObj = obj.GetProperties().Filtra((p) => p.CanRead && p.CanWrite && p.GetAttributes().Filtra((atr) => atr is IgnoreSQL).Count == 0);

List<System.Reflection.PropertyInfo> columnsObjForeignKey;
PropiedadTipo propiedad;
NameSQL nameSql;
PropiedadTipo propiedadReference;
string[] foreignKeys;
IList<Attribute> attributes;
bool containsPrimaryKey = false;
Constraint constraint;
int endName;
strCreate.Append(obj.GetNameSQL());
strCreate.Append('(');
//columns
//name typeSQL,
for (int i = 0; i < columnsObj.Count; i++)
{
propiedad = new PropiedadTipo(columnsObj[i]);
nameSql = propiedad.Atributos.Filtra((atr) => atr is NameSQL).FirstOrDefault() as NameSQL;
if (!containsPrimaryKey && propiedad.Atributos.Filtra((atr) => atr is PrimaryKeySQL).FirstOrDefault() as PrimaryKeySQL != null)
containsPrimaryKey = true;

if (nameSql != null)
if (propiedad.Tipo.IsSimpleType())
{
strCreate.Append(nameSql.ToString());
if (!containsPrimaryKey && propiedad.Atributos.Filtra((atr) => atr is PrimaryKeySQL).FirstOrDefault() as PrimaryKeySQL != null)
containsPrimaryKey = true;
strCreate.Append(propiedad.GetNameSQL());
strCreate.Append(' ');
strCreate.Append(bd.GetDeclaracionType(propiedad.Tipo, propiedad.Atributos.Filtra((atr) => atr is LimiteCampoSQL).FirstOrDefault() as LimiteCampoSQL));

strCreate.Append(',');
}
else strCreate.Append(propiedad.Nombre);
strCreate.Append(' ');
strCreate.Append(bd.GetDeclaracionType(propiedad.Tipo, propiedad.Atributos.Filtra((atr) => atr is LimiteCampoSQL).FirstOrDefault() as LimiteCampoSQL));//si necesito más atributos los paso por aqui
}
//si tiene una foreignkey compuesta necesito hacer esto...
for (int i = 0; i < columnsObj.Count; i++)
{
propiedad = new PropiedadTipo(columnsObj[i]);
if (!propiedad.Tipo.IsSimpleType())
{
endName = propiedad.GetNameSQL().Length;
foreignKeys= propiedad.GetForeignKeySQL();

if (!containsPrimaryKey && propiedad.Atributos.Filtra((atr) => atr is PrimaryKeySQL).FirstOrDefault() as PrimaryKeySQL != null)
containsPrimaryKey = true;
for (int j = 0; j < foreignKeys.Length; i++)
{
strCreate.Append(foreignKeys[j]);
strCreate.Append(' ');
propiedadReference = propiedad.Tipo.GetColumnPropiedadTipo(foreignKeys[j].Substring(endName));//cojo la propiedad de la columna primaryKey del tipo a hacer referencia
strCreate.Append(bd.GetDeclaracionType(propiedadReference.Tipo, propiedadReference.Atributos.Filtra((atr) => atr is LimiteCampoSQL).FirstOrDefault() as LimiteCampoSQL));

strCreate.Append(',');
strCreate.Append(',');
}
}
}
if (!containsPrimaryKey)
{
//se le tiene que poner una columna IdAutoIncrement
strCreate.Append("Id");
strCreate.Append(' ');
strCreate.Append(bd.GetAutoIncrementColumn());
strCreate.Append(bd.GetAutoIncrementColumnDeclaration());
strCreate.Append(',');
}

//añado las constrains de cada columna, le pongo un nombre único y calculable
for (int i = 0; i < columnsObj.Count; i++)
{
attributes = new PropiedadTipo(columnsObj[i]).Atributos;
attributes = new PropiedadTipo(columnsObj[i]).Atributos.Filtra((atr) => atr is Constraint && !(atr is PrimaryKeySQL));
for (int j = 0; j < attributes.Count; j++)
{
//constrains
//constrains de la columna
constraint = attributes[j] as Constraint;
//falta hacer
strCreate.Append(constraint.GetDeclarationConstraintLine(obj.GetNameSQL(), new PropiedadTipo(columnsObj[i]).GetNameSQL()));
strCreate.Append(",");

}
}
// la PrimaryKey que puede ser compuesta

//ahora tengo todas las columnas de la tabla que harán de PrimaryKey
strCreate.Append("Primary Key(");
strCreate.Append(String.Join(",", obj.GetPrimaryKeyColumnsSQL()));
if (strCreate[strCreate.Length - 1] == ',')
strCreate.Remove(strCreate.Length - 1, 1);//quito la ','
strCreate.Append("),");
// los ForeignKey
//las columnas que sean clases que no sean basicas
columnsObjForeignKey = columnsObj.Filtra((column) => !(new PropiedadTipo(column).Tipo.IsSimpleType()));
for (int i = 0; i < columnsObjForeignKey.Count; i++)
{
propiedad = new PropiedadTipo(columnsObjForeignKey[i]);
strCreate.Append("Foreign Key(");
strCreate.Append(String.Join(",", propiedad.GetForeignKeySQL()));//hacer extension para Property que coja el nombre del tipo
if (strCreate[strCreate.Length - 1] == ',')
strCreate.Remove(strCreate.Length - 1, 1);//quito la ','
strCreate.Append(") References ");
strCreate.Append(propiedad.Tipo.GetNameSQL());
strCreate.Append("(");
strCreate.Append(String.Join(",", propiedad.Tipo.GetPrimaryKeyColumnsSQL()));
if (strCreate[strCreate.Length - 1] == ',')
strCreate.Remove(strCreate.Length - 1, 1);//quito la ','
strCreate.Append("),");

}
if (strCreate[strCreate.Length - 1] == ',')
strCreate.Remove(strCreate.Length - 1, 1);
strCreate.Append(')');
strCreate.Append(");");
return strCreate.ToString();
}
public static PropiedadTipo GetColumnPropiedadTipo(this Type type,string sqlNameColumn)
{
PropiedadTipo propiedad=type.GetPropiedadesTipos().Filtra((t) => t.GetNameSQL().Equals(sqlNameColumn)).FirstOrDefault();
if (propiedad == null)
throw new Exception("El tipo "+type.Name+" no contiene la columnaSQL "+sqlNameColumn);
return propiedad;
}
public static string[] GetPrimaryKeyColumnsSQL(this Type type)
{
List<System.Reflection.PropertyInfo> columnsObjPrimaryKey = type.GetProperties().Filtra((column) => new PropiedadTipo(column).Atributos.Filtra((atr) => atr is PrimaryKeySQL).Count != 0);
string[] columnsPrimaryKey = new string[columnsObjPrimaryKey.Count];
//ahora tengo todas las columnas de la tabla que harán de PrimaryKey
for (int i = 0; i < columnsObjPrimaryKey.Count; i++)
columnsPrimaryKey[i] = new PropiedadTipo(columnsObjPrimaryKey[i]).GetNameSQL();

if (columnsObjPrimaryKey.Count == 0)
columnsPrimaryKey = new string[] { "Id" };

return columnsPrimaryKey;
}
public static bool IsSimpleType(this Type type)
{
return Gabriel.Cat.S.Utilitats.Serializar.AsseblyQualifiedName.Contains(type.AssemblyQualifiedName);
}
}
}

0 comments on commit efe743d

Please sign in to comment.