Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Move byte array handling methods to the SQLiteBytes class. Remove superfluous ValueArrayFromSizeAndIntPtr method from the SQLiteMarshal class. More work on docs. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | virtualTables |
Files: | files | file ages | folders |
SHA1: |
75dd5c847a3b5005736e072b954f56f5 |
User & Date: | mistachkin 2013-06-25 08:24:28.658 |
Context
2013-06-25
| ||
09:53 | When marshalling from/to the SQLiteIndex class, only marshal data members of the needed direction. The SQLiteVirtualTableCursorEnumerable class should implement the IDisposable pattern. More work on docs. check-in: c6a8523c45 user: mistachkin tags: virtualTables | |
08:24 | Move byte array handling methods to the SQLiteBytes class. Remove superfluous ValueArrayFromSizeAndIntPtr method from the SQLiteMarshal class. More work on docs. check-in: 75dd5c847a user: mistachkin tags: virtualTables | |
07:44 | Document the SQLiteString class. In the SQLiteString.ProbeForUtf8ByteLength method, make sure the limit is greater than zero. check-in: 3fbdd30433 user: mistachkin tags: virtualTables | |
Changes
Changes to System.Data.SQLite/SQLiteModule.cs.
︙ | ︙ | |||
68 69 70 71 72 73 74 | UnsafeNativeMethods.sqlite3_result_null(pContext); } /////////////////////////////////////////////////////////////////////// /// <summary> | | | | | | | | | | | | | | 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 | UnsafeNativeMethods.sqlite3_result_null(pContext); } /////////////////////////////////////////////////////////////////////// /// <summary> /// Sets the context result to the specified <see cref="Double" /> /// value. /// </summary> /// <param name="value"> /// The <see cref="Double" /> value to use. /// </param> public void SetDouble(double value) { if (pContext == IntPtr.Zero) throw new InvalidOperationException(); #if !PLATFORM_COMPACTFRAMEWORK UnsafeNativeMethods.sqlite3_result_double(pContext, value); #elif !SQLITE_STANDARD UnsafeNativeMethods.sqlite3_result_double_interop(pContext, ref value); #else throw new NotImplementedException(); #endif } /////////////////////////////////////////////////////////////////////// /// <summary> /// Sets the context result to the specified <see cref="Int32" /> /// value. /// </summary> /// <param name="value"> /// The <see cref="Int32" /> value to use. /// </param> public void SetInt(int value) { if (pContext == IntPtr.Zero) throw new InvalidOperationException(); UnsafeNativeMethods.sqlite3_result_int(pContext, value); } /////////////////////////////////////////////////////////////////////// /// <summary> /// Sets the context result to the specified <see cref="Int64" /> /// value. /// </summary> /// <param name="value"> /// The <see cref="Int64" /> value to use. /// </param> public void SetInt64(long value) { if (pContext == IntPtr.Zero) throw new InvalidOperationException(); #if !PLATFORM_COMPACTFRAMEWORK UnsafeNativeMethods.sqlite3_result_int64(pContext, value); #elif !SQLITE_STANDARD UnsafeNativeMethods.sqlite3_result_int64_interop(pContext, ref value); #else throw new NotImplementedException(); #endif } /////////////////////////////////////////////////////////////////////// /// <summary> /// Sets the context result to the specified <see cref="String" /> /// value. /// </summary> /// <param name="value"> /// The <see cref="String" /> value to use. This value will be /// converted to the UTF-8 encoding prior to being used. /// </param> public void SetString(string value) { if (pContext == IntPtr.Zero) throw new InvalidOperationException(); byte[] bytes = SQLiteString.GetUtf8BytesFromString(value); if (bytes == null) throw new ArgumentNullException("value"); UnsafeNativeMethods.sqlite3_result_text( pContext, bytes, bytes.Length, (IntPtr)(-1)); } /////////////////////////////////////////////////////////////////////// /// <summary> /// Sets the context result to the specified <see cref="String" /> /// value containing an error message. /// </summary> /// <param name="value"> /// The <see cref="String" /> value containing the error message text. /// This value will be converted to the UTF-8 encoding prior to being /// used. /// </param> public void SetError(string value) { if (pContext == IntPtr.Zero) throw new InvalidOperationException(); byte[] bytes = SQLiteString.GetUtf8BytesFromString(value); |
︙ | ︙ | |||
223 224 225 226 227 228 229 | UnsafeNativeMethods.sqlite3_result_error_nomem(pContext); } /////////////////////////////////////////////////////////////////////// /// <summary> | | | | | 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 | UnsafeNativeMethods.sqlite3_result_error_nomem(pContext); } /////////////////////////////////////////////////////////////////////// /// <summary> /// Sets the context result to the specified <see cref="Byte" /> array /// value. /// </summary> /// <param name="value"> /// The <see cref="Byte" /> array value to use. /// </param> public void SetBlob(byte[] value) { if (pContext == IntPtr.Zero) throw new InvalidOperationException(); if (value == null) |
︙ | ︙ | |||
410 411 412 413 414 415 416 | if (pValue == IntPtr.Zero) return 0; return UnsafeNativeMethods.sqlite3_value_bytes(pValue); } /////////////////////////////////////////////////////////////////////// /// <summary> | | | | | | | | | | | | | | | | | | 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 | if (pValue == IntPtr.Zero) return 0; return UnsafeNativeMethods.sqlite3_value_bytes(pValue); } /////////////////////////////////////////////////////////////////////// /// <summary> /// Gets and returns the <see cref="Int32" /> associated with this /// value. /// </summary> /// <returns> /// The <see cref="Int32" /> associated with this value. /// </returns> public int GetInt() { if (pValue == IntPtr.Zero) return default(int); return UnsafeNativeMethods.sqlite3_value_int(pValue); } /////////////////////////////////////////////////////////////////////// /// <summary> /// Gets and returns the <see cref="Int64" /> associated with /// this value. /// </summary> /// <returns> /// The <see cref="Int64" /> associated with this value. /// </returns> public long GetInt64() { if (pValue == IntPtr.Zero) return default(long); #if !PLATFORM_COMPACTFRAMEWORK return UnsafeNativeMethods.sqlite3_value_int64(pValue); #elif !SQLITE_STANDARD long value; UnsafeNativeMethods.sqlite3_value_int64_interop(pValue, out value); return value; #else throw new NotImplementedException(); #endif } /////////////////////////////////////////////////////////////////////// /// <summary> /// Gets and returns the <see cref="Double" /> associated with this /// value. /// </summary> /// <returns> /// The <see cref="Double" /> associated with this value. /// </returns> public double GetDouble() { if (pValue == IntPtr.Zero) return default(double); #if !PLATFORM_COMPACTFRAMEWORK return UnsafeNativeMethods.sqlite3_value_double(pValue); #elif !SQLITE_STANDARD double value; UnsafeNativeMethods.sqlite3_value_double_interop(pValue, out value); return value; #else throw new NotImplementedException(); #endif } /////////////////////////////////////////////////////////////////////// /// <summary> /// Gets and returns the <see cref="String" /> associated with this /// value. /// </summary> /// <returns> /// The <see cref="String" /> associated with this value. The value is /// converted from the UTF-8 encoding prior to being returned. /// </returns> public string GetString() { if (pValue == IntPtr.Zero) return null; return SQLiteString.StringFromUtf8IntPtr(pValue, GetBytes()); } /////////////////////////////////////////////////////////////////////// /// <summary> /// Gets and returns the <see cref="Byte" /> array associated with this /// value. /// </summary> /// <returns> /// The <see cref="Byte" /> array associated with this value. /// </returns> public byte[] GetBlob() { if (pValue == IntPtr.Zero) return null; return SQLiteBytes.FromIntPtr(pValue, GetBytes()); } /////////////////////////////////////////////////////////////////////// /// <summary> /// Uses the native value handle to obtain and store the managed value /// for this object instance, thus saving it for later use. The type |
︙ | ︙ | |||
1269 1270 1271 1272 1273 1274 1275 | #endregion /////////////////////////////////////////////////////////////////////// #region IDisposable "Pattern" Members private bool disposed; /// <summary> | | | | 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 | #endregion /////////////////////////////////////////////////////////////////////// #region IDisposable "Pattern" Members private bool disposed; /// <summary> /// Throws an <see cref="ObjectDisposedException"/> if this object /// instance has been disposed. /// </summary> private void CheckDisposed() /* throw */ { #if THROW_ON_DISPOSED if (disposed) { throw new ObjectDisposedException( |
︙ | ︙ | |||
1515 1516 1517 1518 1519 1520 1521 | #endregion /////////////////////////////////////////////////////////////////////// #region IDisposable "Pattern" Members private bool disposed; /// <summary> | | | | 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 | #endregion /////////////////////////////////////////////////////////////////////// #region IDisposable "Pattern" Members private bool disposed; /// <summary> /// Throws an <see cref="ObjectDisposedException"/> if this object /// instance has been disposed. /// </summary> private void CheckDisposed() /* throw */ { #if THROW_ON_DISPOSED if (disposed) { throw new ObjectDisposedException( |
︙ | ︙ | |||
3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 | #endregion } #endregion /////////////////////////////////////////////////////////////////////////// #region SQLiteString Static Class internal static class SQLiteString { #region Private Constants /// <summary> /// This is the maximum possible length for the native UTF-8 encoded /// strings used with the SQLite core library. /// </summary> | > > > > | 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 | #endregion } #endregion /////////////////////////////////////////////////////////////////////////// #region SQLiteString Static Class /// <summary> /// This class contains static methods that are used to deal with native /// UTF-8 string pointers to be used with the SQLite core library. /// </summary> internal static class SQLiteString { #region Private Constants /// <summary> /// This is the maximum possible length for the native UTF-8 encoded /// strings used with the SQLite core library. /// </summary> |
︙ | ︙ | |||
3758 3759 3760 3761 3762 3763 3764 | } #endregion } #endregion /////////////////////////////////////////////////////////////////////////// | | < < < < < < < < < < < | < | < < | < < < < < < < < < | < | | < < < | < < < < < < < < | < | < | < < < < < < < < < < | < | < < < < | < < < | < < < < | < | < < < < < < < < < < < < < < | < | < < < < < < < < < < < < | | < | < | > > > > > > > > > > | | 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 | } #endregion } #endregion /////////////////////////////////////////////////////////////////////////// #region SQLiteBytes Static Class /// <summary> /// This class contains static methods that are used to deal with native /// pointers to memory blocks that logically contain arrays of bytes to be /// used with the SQLite core library. /// </summary> internal static class SQLiteBytes { #region Byte Array Helper Methods /// <summary> /// Converts a native pointer to a logical array of bytes of the /// specified length into a managed byte array. /// </summary> /// <param name="pValue"> /// The native pointer to the logical array of bytes to convert. /// </param> /// <param name="length"> /// The length, in bytes, of the logical array of bytes to convert. /// </param> /// <returns> /// The managed byte array or null upon failure. /// </returns> public static byte[] FromIntPtr( IntPtr pValue, int length ) { if (pValue == IntPtr.Zero) return null; if (length == 0) return new byte[0]; byte[] result = new byte[length]; Marshal.Copy(pValue, result, 0, length); return result; } /////////////////////////////////////////////////////////////////////// /// <summary> /// Converts a managed byte array into a native pointer to a logical /// array of bytes. /// </summary> /// <param name="value"> /// The managed byte array to convert. /// </param> /// <returns> /// The native pointer to a logical byte array or null upon failure. /// </returns> public static IntPtr ToIntPtr( byte[] value ) { if (value == null) return IntPtr.Zero; int length = value.Length; |
︙ | ︙ | |||
3911 3912 3913 3914 3915 3916 3917 | return IntPtr.Zero; Marshal.Copy(value, 0, result, length); return result; } #endregion | | > > | > > > | > > > > > > > > > > > > > > > > | > | > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > | > > > > > > > > > > > > > > | > > > > > | > > > > > > > > > | > > > > > > > > > > > > > > > > | > > > | > > > > > > > > | > > > > > > > > > > > > > > > > > > > | | > > > | > > > > | > | > > > > > > > > > > > > > > > > > > > | > > > > > | > > > | > | > > > > > > > > > > > > > > > > > > > | > > > | > > > > | 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 | return IntPtr.Zero; Marshal.Copy(value, 0, result, length); return result; } #endregion } #endregion /////////////////////////////////////////////////////////////////////////// #region SQLiteMarshal Static Class internal static class SQLiteMarshal { #region IntPtr Helper Methods /// <summary> /// Returns a new <see cref="IntPtr" /> object instance based on the /// specified <see cref="IntPtr" /> object instance and an integer /// offset. /// </summary> /// <param name="pointer"> /// The <see cref="IntPtr" /> object instance representing the base /// memory location. /// </param> /// <param name="offset"> /// The integer offset from the base memory location that the new /// <see cref="IntPtr" /> object instance should point to. /// </param> /// <returns> /// The new <see cref="IntPtr" /> object instance. /// </returns> public static IntPtr IntPtrForOffset( IntPtr pointer, int offset ) { return new IntPtr(pointer.ToInt64() + offset); } #endregion /////////////////////////////////////////////////////////////////////// #region Marshal Read Helper Methods /// <summary> /// Reads a <see cref="Int32" /> value from the specified memory /// location. /// </summary> /// <param name="pointer"> /// The <see cref="IntPtr" /> object instance representing the base /// memory location. /// </param> /// <param name="offset"> /// The integer offset from the base memory location where the /// <see cref="Int32" /> value to be read is located. /// </param> /// <returns> /// The <see cref="Int32" /> value at the specified memory location. /// </returns> public static int ReadInt32( IntPtr pointer, int offset ) { #if !PLATFORM_COMPACTFRAMEWORK return Marshal.ReadInt32(pointer, offset); #else return Marshal.ReadInt32(IntPtrForOffset(pointer, offset)); #endif } /////////////////////////////////////////////////////////////////////// /// <summary> /// Reads a <see cref="Double" /> value from the specified memory /// location. /// </summary> /// <param name="pointer"> /// The <see cref="IntPtr" /> object instance representing the base /// memory location. /// </param> /// <param name="offset"> /// The integer offset from the base memory location where the /// <see cref="Double" /> to be read is located. /// </param> /// <returns> /// The <see cref="Double" /> value at the specified memory location. /// </returns> public static double ReadDouble( IntPtr pointer, int offset ) { #if !PLATFORM_COMPACTFRAMEWORK return BitConverter.Int64BitsToDouble(Marshal.ReadInt64( pointer, offset)); #else return BitConverter.ToDouble(BitConverter.GetBytes( Marshal.ReadInt64(IntPtrForOffset(pointer, offset))), 0); #endif } /////////////////////////////////////////////////////////////////////// /// <summary> /// Reads an <see cref="IntPtr" /> value from the specified memory /// location. /// </summary> /// <param name="pointer"> /// The <see cref="IntPtr" /> object instance representing the base /// memory location. /// </param> /// <param name="offset"> /// The integer offset from the base memory location where the /// <see cref="IntPtr" /> value to be read is located. /// </param> /// <returns> /// The <see cref="IntPtr" /> value at the specified memory location. /// </returns> public static IntPtr ReadIntPtr( IntPtr pointer, int offset ) { #if !PLATFORM_COMPACTFRAMEWORK return Marshal.ReadIntPtr(pointer, offset); #else return Marshal.ReadIntPtr(IntPtrForOffset(pointer, offset)); #endif } #endregion /////////////////////////////////////////////////////////////////////// #region Marshal Write Helper Methods /// <summary> /// Writes an <see cref="Int32" /> value to the specified memory /// location. /// </summary> /// <param name="pointer"> /// The <see cref="IntPtr" /> object instance representing the base /// memory location. /// </param> /// <param name="offset"> /// The integer offset from the base memory location where the /// <see cref="Int32" /> value to be written is located. /// </param> /// <param name="value"> /// The <see cref="Int32" /> value to write. /// </param> public static void WriteInt32( IntPtr pointer, int offset, int value ) { #if !PLATFORM_COMPACTFRAMEWORK Marshal.WriteInt32(pointer, offset, value); #else Marshal.WriteInt32(IntPtrForOffset(pointer, offset), value); #endif } /////////////////////////////////////////////////////////////////////// /// <summary> /// Writes a <see cref="Double" /> value to the specified memory /// location. /// </summary> /// <param name="pointer"> /// The <see cref="IntPtr" /> object instance representing the base /// memory location. /// </param> /// <param name="offset"> /// The integer offset from the base memory location where the /// <see cref="Double" /> value to be written is located. /// </param> /// <param name="value"> /// The <see cref="Double" /> value to write. /// </param> public static void WriteDouble( IntPtr pointer, int offset, double value ) { #if !PLATFORM_COMPACTFRAMEWORK Marshal.WriteInt64(pointer, offset, BitConverter.DoubleToInt64Bits(value)); #else Marshal.WriteInt64(IntPtrForOffset(pointer, offset), BitConverter.ToInt64(BitConverter.GetBytes(value), 0)); #endif } /////////////////////////////////////////////////////////////////////// /// <summary> /// Writes a <see cref="IntPtr" /> value to the specified memory /// location. /// </summary> /// <param name="pointer"> /// The <see cref="IntPtr" /> object instance representing the base /// memory location. /// </param> /// <param name="offset"> /// The integer offset from the base memory location where the /// <see cref="IntPtr" /> value to be written is located. /// </param> /// <param name="value"> /// The <see cref="IntPtr" /> value to write. /// </param> public static void WriteIntPtr( IntPtr pointer, int offset, IntPtr value ) { #if !PLATFORM_COMPACTFRAMEWORK Marshal.WriteIntPtr(pointer, offset, value); #else Marshal.WriteIntPtr(IntPtrForOffset(pointer, offset), value); #endif } #endregion /////////////////////////////////////////////////////////////////////// #region SQLiteValue Helper Methods public static SQLiteValue[] ValueArrayFromIntPtrArray( IntPtr[] values ) { if (values == null) return null; |
︙ | ︙ | |||
4930 4931 4932 4933 4934 4935 4936 | #endregion /////////////////////////////////////////////////////////////////// #region IDisposable "Pattern" Members private bool disposed; /// <summary> | | | | 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 | #endregion /////////////////////////////////////////////////////////////////// #region IDisposable "Pattern" Members private bool disposed; /// <summary> /// Throws an <see cref="ObjectDisposedException"/> if this object /// instance has been disposed. /// </summary> private void CheckDisposed() /* throw */ { #if THROW_ON_DISPOSED if (disposed) { throw new ObjectDisposedException( |
︙ | ︙ | |||
7592 7593 7594 7595 7596 7597 7598 | #endregion /////////////////////////////////////////////////////////////////////// #region IDisposable "Pattern" Members private bool disposed; /// <summary> | | | | 7707 7708 7709 7710 7711 7712 7713 7714 7715 7716 7717 7718 7719 7720 7721 7722 | #endregion /////////////////////////////////////////////////////////////////////// #region IDisposable "Pattern" Members private bool disposed; /// <summary> /// Throws an <see cref="ObjectDisposedException"/> if this object /// instance has been disposed. /// </summary> private void CheckDisposed() /* throw */ { #if THROW_ON_DISPOSED if (disposed) { throw new ObjectDisposedException( |
︙ | ︙ |