示例#1
0
        internal static void adjustInsertValue(ref object value, TypeItemInfo p, object parameters)
        {
            if (value is Uri uri)
            {
                value = uri.ToString();
            }

            if (!p.Is(DatabaseWrapper.ColumnAttributes.PrimaryKey))
            {
                return;
            }


            //if (p.Type == typeof(int) || p.Type == typeof(long))
            //{
            //    if (!value.Equals(0)) return;
            //    // PK ints are AI
            //    value = null;
            //}

            //  Check for INT or LONGs equals to zero
            if (p.Type == typeof(int))
            {
                if ((int)value != 0)
                {
                    return;
                }
                value = null;
            }
            else if (p.Type == typeof(long))
            {
                if ((long)value != 0)
                {
                    return;
                }
                value = null;
            }
            else if (p.Type == typeof(Guid))
            {
                if ((Guid)value != Guid.Empty)
                {
                    return;
                }

                value = Guid.NewGuid();
                // write new guid on object
                p.SetValue(parameters, value);
            }
        }
        /// <summary>
        /// Create a column schema from TypeInfoItem
        /// </summary>
        public static IColumn FromInfo(TypeInfo info, TypeItemInfo pi)
        {
            SqliteType dataType = mapType(pi);

            //Props
            bool isKey = pi.Is(DatabaseWrapper.ColumnAttributes.PrimaryKey);
            // Auto select
            bool allowNulls = dataType == SqliteType.TEXT ||
                              dataType == SqliteType.BLOB;

            // was specified ?
            if (pi.Is(DatabaseWrapper.ColumnAttributes.AllowNull))
            {
                allowNulls = true;
            }
            if (pi.Is(DatabaseWrapper.ColumnAttributes.NotNull))
            {
                allowNulls = false;
            }

            bool isUnique = pi.Is(DatabaseWrapper.ColumnAttributes.Unique);

            object defVal = null;

            foreach (var attr in pi.DBAttributes)
            {
                if (attr.Attribute is DefaultValueAttribute def)
                {
                    defVal = def;
                    break;
                }
            }

            // create
            return(new Column()
            {
                ColumnName = pi.Name,
                AllowNulls = allowNulls,
                NativeType = pi.Type,
                SqliteType = dataType,
                DefaultValue = defVal,
                IsPK = isKey,
                IsAI = isKey && dataType == SqliteType.INTEGER,
                IsUnique = isUnique,
            });
        }
        /// <summary>
        /// Creates a column schema from a Type
        /// </summary>

        private static SqliteType mapType(TypeItemInfo info)
        {
            SqliteType dataType;

            // Texts
            if (info.Type == typeof(string))
            {
                dataType = SqliteType.TEXT;
            }
            else if (info.Type == typeof(Uri))
            {
                dataType = SqliteType.TEXT;
            }
            // Float point Numbers
            else if (info.Type == typeof(float))
            {
                dataType = SqliteType.REAL;
            }
            else if (info.Type == typeof(double))
            {
                dataType = SqliteType.REAL;
            }
            // Fixed FloatPoint
            else if (info.Type == typeof(decimal))
            {
                dataType = SqliteType.NUMERIC;
            }
            // Integers
            else if (info.Type == typeof(byte))
            {
                dataType = SqliteType.INTEGER;
            }
            else if (info.Type == typeof(int))
            {
                dataType = SqliteType.INTEGER;
            }
            else if (info.Type == typeof(uint))
            {
                dataType = SqliteType.INTEGER;
            }
            else if (info.Type == typeof(long))
            {
                dataType = SqliteType.INTEGER;
            }
            else if (info.Type == typeof(ulong))
            {
                dataType = SqliteType.INTEGER;
            }
            // Others Mapped of NUMERIC
            else if (info.Type == typeof(bool))
            {
                dataType = SqliteType.NUMERIC;
            }
            else if (info.Type == typeof(DateTime))
            {
                dataType = SqliteType.NUMERIC;
            }
            // Other
            else if (info.Type == typeof(Guid))
            {
                dataType = SqliteType.BLOB;
            }
            else if (info.Type == typeof(Color))
            {
                dataType = SqliteType.BLOB;
            }
            else if (info.Type == typeof(byte[]))
            {
                dataType = SqliteType.BLOB;
            }
            //Int enums
            else if (info.Type.IsEnum)
            {
                dataType = SqliteType.INTEGER;
            }
            else
            {
                throw new Exception($"Type {info.Type.Name} is not supported on field {info.Name}");
            }
            return(dataType);
        }