private object ReadCol(Sqlite3Statement stmt, int index, ColType type, Type clrType, object defaultValue) { if (type == ColType.Null) { return(defaultValue); } else { var clrTypeInfo = clrType.GetTypeInfo(); if (clrType == typeof(String)) { return(SQLite3.ColumnStringUTF8(stmt, index)); } else if (clrType == typeof(Int32)) { return((int)SQLite3.ColumnInt32(stmt, index)); } else if (clrType == typeof(Boolean)) { return(SQLite3.ColumnInt32(stmt, index) == 1); } else if (clrType == typeof(double)) { return(SQLite3.ColumnDouble(stmt, index)); } else if (clrType == typeof(float)) { return((float)SQLite3.ColumnDouble(stmt, index)); } else if (clrType == typeof(TimeSpan)) { return(new TimeSpan(SQLite3.ColumnInt64(stmt, index))); } else if (clrType == typeof(DateTime)) { if (Connection.StoreDateTimeAsTicks) { return(new DateTime(SQLite3.ColumnInt64(stmt, index))); } else { var text = SQLite3.ColumnStringUTF8(stmt, index); DateTime resultDate; if (!DateTime.TryParseExact(text, DateTimeExactStoreFormat, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out resultDate)) { resultDate = DateTime.Parse(text); } return(resultDate); } } else if (clrType == typeof(DateTimeOffset)) { var value = SQLite3.ColumnInt64(stmt, index); // if the date goes outside the bounds of a valid date time, we need to consider the date as corrupted by // either the disk or some other process, and in that case the date cannot be trusted. With this in mind // we are going to use the default value if the date has been corrupted. if (value < DateTimeOffset.MinValue.Ticks || value > DateTimeOffset.MaxValue.Ticks) { return(defaultValue); } return(new DateTimeOffset(value, TimeSpan.Zero)); } else if (clrTypeInfo.IsEnum) { if (type == ColType.Text) { var value = SQLite3.ColumnStringUTF8(stmt, index); return(Enum.Parse(clrType, value, true)); } else { var value = SQLite3.ColumnInt32(stmt, index); var enumCache = EnumCache.GetInfo(clrType); return(enumCache.GetEnumFromInt32Value(value)); } } else if (clrType == typeof(Int64)) { return(SQLite3.ColumnInt64(stmt, index)); } else if (clrType == typeof(UInt32)) { return((uint)SQLite3.ColumnInt64(stmt, index)); } else if (clrType == typeof(decimal)) { return((decimal)SQLite3.ColumnDouble(stmt, index)); } else if (clrType == typeof(Byte)) { return((byte)SQLite3.ColumnInt32(stmt, index)); } else if (clrType == typeof(UInt16)) { return((ushort)SQLite3.ColumnInt32(stmt, index)); } else if (clrType == typeof(Int16)) { return((short)SQLite3.ColumnInt32(stmt, index)); } else if (clrType == typeof(sbyte)) { return((sbyte)SQLite3.ColumnInt32(stmt, index)); } else if (clrType == typeof(byte[])) { return(SQLite3.ColumnByteArray(stmt, index)); } else if (clrType == typeof(Guid)) { var text = SQLite3.ColumnStringUTF8(stmt, index); return(new Guid(text)); } else if (clrType == typeof(Uri)) { var text = SQLite3.ColumnStringUTF8(stmt, index); return(new Uri(text)); } else if (clrType == typeof(StringBuilder)) { var text = SQLite3.ColumnStringUTF8(stmt, index); return(new StringBuilder(text)); } else if (clrType == typeof(UriBuilder)) { var text = SQLite3.ColumnStringUTF8(stmt, index); return(new UriBuilder(text)); } else { throw new NotSupportedException("Don't know how to read " + clrType); } } }
private static void RegisterDefaultTypes() { #if UNITY_STANDALONE Register( typeof(Vector2), (stmt, index) => { var bytes = SQLite3.ColumnByteArray(stmt, index); var x = BitConverter.ToSingle(bytes, 0); var y = BitConverter.ToSingle(bytes, sizeof(float)); return(new Vector2(x, y)); }, (c) => { return("blob"); }, (stmt, index, value) => { var vec = (Vector2)value; var bytes = new byte[sizeof(float) * 2]; Buffer.BlockCopy(BitConverter.GetBytes(vec.x), 0, bytes, 0, sizeof(float)); Buffer.BlockCopy(BitConverter.GetBytes(vec.y), 0, bytes, sizeof(float), sizeof(float)); SQLite3.BindBlob(stmt, index, bytes, bytes.Length, new System.IntPtr(-1)); }); Register( typeof(Vector3), (stmt, index) => { var bytes = SQLite3.ColumnByteArray(stmt, index); var x = BitConverter.ToSingle(bytes, 0); var y = BitConverter.ToSingle(bytes, sizeof(float)); var z = BitConverter.ToSingle(bytes, sizeof(float) * 2); return(new Vector3(x, y, z)); }, (c) => { return("blob"); }, (stmt, index, value) => { var vec = (Vector3)value; var bytes = new byte[sizeof(float) * 3]; Buffer.BlockCopy(BitConverter.GetBytes(vec.x), 0, bytes, 0, sizeof(float)); Buffer.BlockCopy(BitConverter.GetBytes(vec.y), 0, bytes, sizeof(float), sizeof(float)); Buffer.BlockCopy(BitConverter.GetBytes(vec.z), 0, bytes, sizeof(float) * 2, sizeof(float)); SQLite3.BindBlob(stmt, index, bytes, bytes.Length, new System.IntPtr(-1)); }); Register( typeof(Color), (stmt, index) => { var bytes = SQLite3.ColumnByteArray(stmt, index); var r = BitConverter.ToSingle(bytes, 0); var g = BitConverter.ToSingle(bytes, sizeof(float)); var b = BitConverter.ToSingle(bytes, sizeof(float) * 2); var a = BitConverter.ToSingle(bytes, sizeof(float) * 3); return(new Color(r, g, b, a)); }, (c) => { return("blob"); }, (stmt, index, value) => { var vec = (Color)value; var bytes = new byte[sizeof(float) * 4]; Buffer.BlockCopy(BitConverter.GetBytes(vec.r), 0, bytes, 0, sizeof(float)); Buffer.BlockCopy(BitConverter.GetBytes(vec.g), 0, bytes, sizeof(float), sizeof(float)); Buffer.BlockCopy(BitConverter.GetBytes(vec.b), 0, bytes, sizeof(float) * 2, sizeof(float)); Buffer.BlockCopy(BitConverter.GetBytes(vec.a), 0, bytes, sizeof(float) * 3, sizeof(float)); SQLite3.BindBlob(stmt, index, bytes, bytes.Length, new System.IntPtr(-1)); }); #endif }
private object ReadCol(IntPtr stmt, int index, SQLite3.ColType type, Type clrType) { if (type == SQLite3.ColType.Null) { return(null); } if (clrType == typeof(string)) { return(SQLite3.ColumnString(stmt, index)); } if (clrType == typeof(int)) { return(SQLite3.ColumnInt(stmt, index)); } if (clrType == typeof(bool)) { return(SQLite3.ColumnInt(stmt, index) == 1); } if (clrType == typeof(double)) { return(SQLite3.ColumnDouble(stmt, index)); } if (clrType == typeof(float)) { return((float)SQLite3.ColumnDouble(stmt, index)); } if (clrType == typeof(TimeSpan)) { return(new TimeSpan(SQLite3.ColumnInt64(stmt, index))); } if (clrType == typeof(DateTime)) { if (_conn.StoreDateTimeAsTicks) { return(new DateTime(SQLite3.ColumnInt64(stmt, index))); } string s = SQLite3.ColumnString(stmt, index); return(DateTime.Parse(s)); } if (clrType == typeof(DateTimeOffset)) { return(new DateTimeOffset(SQLite3.ColumnInt64(stmt, index), TimeSpan.Zero)); } if (clrType.IsEnum) { return(SQLite3.ColumnInt(stmt, index)); } if (clrType == typeof(long)) { return(SQLite3.ColumnInt64(stmt, index)); } if (clrType == typeof(uint)) { return((uint)SQLite3.ColumnInt64(stmt, index)); } if (clrType == typeof(decimal)) { return((decimal)SQLite3.ColumnDouble(stmt, index)); } if (clrType == typeof(byte)) { return((byte)SQLite3.ColumnInt(stmt, index)); } if (clrType == typeof(ushort)) { return((ushort)SQLite3.ColumnInt(stmt, index)); } if (clrType == typeof(short)) { return((short)SQLite3.ColumnInt(stmt, index)); } if (clrType == typeof(sbyte)) { return((sbyte)SQLite3.ColumnInt(stmt, index)); } if (clrType == typeof(byte[])) { return(SQLite3.ColumnByteArray(stmt, index)); } if (clrType == typeof(Guid)) { string g = SQLite3.ColumnString(stmt, index); return(new Guid(g)); } throw new NotSupportedException("Don't know how to read " + clrType); }
object ReadCol(Sqlite3Statement stmt, int index, SQLite3.ColType type, Type clrType) { if (type == SQLite3.ColType.Null) { return(null); } else { if (clrType == typeof(String)) { return(SQLite3.ColumnString(stmt, index)); } else if (clrType == typeof(Int32)) { return((int)SQLite3.ColumnInt(stmt, index)); } else if (clrType == typeof(Boolean)) { return(SQLite3.ColumnInt(stmt, index) == 1); } else if (clrType == typeof(double)) { return(SQLite3.ColumnDouble(stmt, index)); } else if (clrType == typeof(float)) { return((float)SQLite3.ColumnDouble(stmt, index)); } else if (clrType == typeof(TimeSpan)) { return(new TimeSpan(SQLite3.ColumnInt64(stmt, index))); } else if (clrType == typeof(DateTime)) { if (_conn.StoreDateTimeAsTicks) { return(new DateTime(SQLite3.ColumnInt64(stmt, index))); } else { var text = SQLite3.ColumnString(stmt, index); DateTime resultDate; if (!DateTime.TryParseExact(text, DateTimeExactStoreFormat, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out resultDate)) { resultDate = DateTime.Parse(text); } return(resultDate); } } else if (clrType == typeof(DateTimeOffset)) { return(new DateTimeOffset(SQLite3.ColumnInt64(stmt, index), TimeSpan.Zero)); #if !USE_NEW_REFLECTION_API } else if (clrType.IsEnum) { #else } else if (clrType.GetTypeInfo().IsEnum) { #endif if (type == SQLite3.ColType.Text) { var value = SQLite3.ColumnString(stmt, index); return(Enum.Parse(clrType, value.ToString(), true)); } else { return(SQLite3.ColumnInt(stmt, index)); } } else if (clrType == typeof(Int64)) { return(SQLite3.ColumnInt64(stmt, index)); } else if (clrType == typeof(UInt32)) { return((uint)SQLite3.ColumnInt64(stmt, index)); } else if (clrType == typeof(decimal)) { return((decimal)SQLite3.ColumnDouble(stmt, index)); } else if (clrType == typeof(Byte)) { return((byte)SQLite3.ColumnInt(stmt, index)); } else if (clrType == typeof(UInt16)) { return((ushort)SQLite3.ColumnInt(stmt, index)); } else if (clrType == typeof(Int16)) { return((short)SQLite3.ColumnInt(stmt, index)); } else if (clrType == typeof(sbyte)) { return((sbyte)SQLite3.ColumnInt(stmt, index)); } else if (clrType == typeof(byte[])) { return(SQLite3.ColumnByteArray(stmt, index)); } else if (clrType == typeof(Guid)) { var text = SQLite3.ColumnString(stmt, index); return(new Guid(text)); } else { throw new NotSupportedException("Don't know how to read " + clrType); } } }