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