public static TypeSchema GetSchema(Type type) { if (!TypeSchemas.ContainsKey(type)) { var fields = type.GetProperties() .Where(p => p.GetCustomAttribute <SchemaIgnoreAttribute>() == null) .Select(p => { TypeFieldSchema field = new TypeFieldSchema() { Name = p.Name, FieldType = p.MapFieldType(), IsIndex = p.GetCustomAttribute <IndexAttribute>() != null, IsRequired = p.GetCustomAttribute <RequiredAttribute>() != null, IsPrimaryKey = p.GetCustomAttribute <KeyAttribute>() != null, OriginalPropertyType = p.PropertyType, PropertyInfo = p, IsNullable = p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == TypeMapping.type_nullable }; field.IsGeoType = (int)field.FieldType >= (int)FieldTypeEnum.GeometryPoint && (int)field.FieldType <= (int)FieldTypeEnum.GeometryCollection; var stringLength = p.GetCustomAttribute <StringLengthAttribute>(); if (stringLength != null) { field.MaxLength = stringLength.MaximumLength; field.MinLength = stringLength.MinimumLength; } var forceType = p.GetCustomAttribute <ForceTypeAttribute>(); if (forceType != null) { field.Converter = forceType.Converter; } else { field.Converter = identity; } return(field); }); TypeSchema schema = new TypeSchema() { Name = type.Name }; foreach (var field in fields) { schema.typeFields.Add(field.Name, field); } TypeSchemas.Add(type, schema); } return(TypeSchemas[type]); }
public static string FieldDeclaration(this TypeFieldSchema field) => $"{field.Name} {field.PostgreSQLType}{(field.IsRequired ? " NOT NULL" : "")}{(field.IsPrimaryKey ? " PRIMARY KEY" : "")}";
public static string TableIndex(this TypeFieldSchema field) => field.IsGeoType ? $"USING GIST({field.Name})" : $"({field.Name})";