Exemple #1
0
        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);
                }
            }
        }
Exemple #2
0
        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);
                }
            }
        }