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); }