Ejemplo n.º 1
0
        public DbProperty RegisterProperty(PropertyInfo pi)
        {
            var dp = new DbProperty();

            dp.Name = dp.ColumnName = pi.Name;
            dp.Info = pi;
            dp.T    = pi.PropertyType;

            if (pi.PropertyType.IsArray)
            {
                dp.PropertyType = PropertyType.IsArray;
                DecodeElementType(pi.PropertyType.GetElementType(), dp);
            }
            else if (pi.IsGenericList())
            {
                dp.PropertyType = PropertyType.IsList;
                DecodeElementType(pi.PropertyType.GenericTypeArguments[0], dp);
                dp.T       = pi.PropertyType;
                dp.Handler = PropertyHandler.AsJson;
            }
            else
            {
                dp.PropertyType = PropertyType.IsBasic;
                DecodeElementType(pi.PropertyType, dp);
            }

            //todo check if underlying type full fill this
            if (dp.ElementType == ElementTypes.Class)
            {
                dp.Handler = PropertyHandler.AsJson;
                return(dp);
            }

            return(dp);
        }
Ejemplo n.º 2
0
        //private T MapFromSql<T>(DbClass rc, SqlDataReader reader)
        //{
        //    T t = (T)Activator.CreateInstance(typeof(T));

        //    var ty = typeof(T);

        //    foreach (var p in rc.Properties)
        //    {
        //        var pidx = reader.GetOrdinal(p.ColumnName);

        //        p.Info.SetValue(t, reader[pidx]);

        //    }

        //    return t;
        //}

        private string MapToSql(DbProperty rp)
        {
            var colName   = $"{rp.ColumnName}";
            var comment   = "";
            var sqlType   = "";
            var nullType  = "";
            var identType = "";

            switch (rp.Handler)
            {
            case PropertyHandler.Default:
                var map = DataTypes.DataTypeMap.FirstOrDefault(x => x.CharlieType == rp.ElementType);
                if (map == null)
                {
                    throw new Exception($"No C# to SQL mapping found for {rp.ColumnName}:{rp.ElementType}");
                }

                sqlType = map.SqlType;
                if (sqlType.Contains("#"))
                {
                    sqlType = sqlType.Replace("#", rp.DbSize == 0 ? "MAX" : rp.DbSize.ToString());
                }

                nullType = $"{(rp.IsNullable ? "NULL" : "NOT NULL")}";
                break;

            case PropertyHandler.Class:
                sqlType  = $"NVARCHAR(max)";
                nullType = "NULL";
                comment  = $" -- JSON Representation for class {rp.ElementTypeName}";
                break;

            case PropertyHandler.AsJson:
                sqlType  = $"NVARCHAR(max)";
                nullType = "NULL";
                comment  = $" -- JSON Representation for class {rp.ElementTypeName}";
                break;

            default:
                throw new Exception($"MapToSql failed for {rp.ColumnName}. No handler defined");
            }

            if (rp.IsID)
            {
                //todo check prop is int type
                comment  += "ID";
                identType = " IDENTITY PRIMARY KEY";
            }

            if (!string.IsNullOrEmpty(comment))
            {
                comment = $"-- {comment}";
            }

            return($"    {colName} {sqlType}{identType} {nullType}, {comment}");
        }
Ejemplo n.º 3
0
        private object GetPropertyValue(DbProperty p, object data)
        {
            switch (p.Handler)
            {
            case PropertyHandler.Default:
                return(p.Info.GetValue(data, null));

            case PropertyHandler.AsJson:
                return(JsonConvert.SerializeObject(p.Info.GetValue(data, null)));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Ejemplo n.º 4
0
        public DbClass Register <T>()
        {
            var dbc = new DbClass {
                ClassType = typeof(T)
            };

            dbc.SqlTableName = dbc.ClassType.Name;

            foreach (var p in dbc.ClassType.GetProperties())
            {
                var rp = new DbProperty().RegisterProperty(p);

                dbc.Properties.Add(rp);
            }
            ClassesType.Add(dbc.ClassType.FullName, dbc);

            return(dbc);
        }
Ejemplo n.º 5
0
        private void SetPropertyValue(DbProperty p, object dst, object v)
        {
            switch (p.Handler)
            {
            case PropertyHandler.Default:
                p.Info.SetValue(dst, v);
                break;

            case PropertyHandler.AsJson:


                var x = JsonConvert.DeserializeObject((string)v, p.T);
                p.Info.SetValue(dst, x);
                break;

            case PropertyHandler.Class:
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Ejemplo n.º 6
0
        private void DecodeElementType(Type type, DbProperty dp)
        {
            //dp.T = type;

            if (type.IsNullable())
            {
                dp.IsNullable  = true;
                dp.ElementType = DataTypes.DecodeType(Nullable.GetUnderlyingType(type));
            }
            else if (type.IsEnum)
            {
                dp.ElementType     = ElementTypes.Enum;
                dp.ElementTypeName = type.FullName;
            }
            else if (type.IsClass && type.FullName != "System.String")
            {
                dp.ElementType     = ElementTypes.Class;
                dp.ElementTypeName = type.FullName;
            }
            else
            {
                dp.ElementType = DataTypes.DecodeType(type);
            }
        }