Exemplo n.º 1
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);
                }
            }
        }
Exemplo n.º 2
0
        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
        }
Exemplo n.º 3
0
 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);
 }
Exemplo n.º 4
0
        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);
                }
            }
        }