object ReadCol(IntPtr stmt, int index, Type clrType) { var type = SQLite3.ColumnType(stmt, index); if (type == SQLite3.ColType.Null) { return(null); } else { if (clrType == typeof(Byte) || clrType == typeof(UInt16) || clrType == typeof(SByte) || clrType == typeof(Int16) || clrType == typeof(Int32)) { return(Convert.ChangeType(SQLite3.ColumnInt(stmt, index), clrType)); } else if (clrType == typeof(Boolean)) { return((Byte)Convert.ChangeType(SQLite3.ColumnInt(stmt, index), typeof(Byte)) == 1); } else if (clrType == typeof(UInt32) || clrType == typeof(Int64)) { return(Convert.ChangeType(SQLite3.ColumnInt64(stmt, index), clrType)); } else if (clrType == typeof(Single) || clrType == typeof(Double) || clrType == typeof(Decimal)) { return(Convert.ChangeType(SQLite3.ColumnDouble(stmt, index), clrType)); } else if (clrType == typeof(String)) { var text = Marshal.PtrToStringUni(SQLite3.ColumnText16(stmt, index)); return(text); } else if (clrType == typeof(DateTime)) { var text = Marshal.PtrToStringUni(SQLite3.ColumnText16(stmt, index)); return(Convert.ChangeType(text, clrType)); } else if (clrType.IsEnum) { return(SQLite3.ColumnInt(stmt, index)); } else { throw new NotSupportedException("Don't know how to read " + clrType); } } }
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 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); } } }