Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | In the SQLiteFunction class, check if the database connection is open prior to attempting to call the Cancel method. Add NoFunctions connection flag to skip binding functions registered in the application domain. Fixes and adjustments to comments. Add several data-types for compatibility purposes. Fix for [fe50b8c2e8]. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
dff9a878ddb106e63223043439cedeae |
User & Date: | mistachkin 2013-07-01 18:22:31.141 |
Context
2013-07-02
| ||
07:07 | Enable setting of the logging related SQLiteModule properties via the connection flags. check-in: 7c20d612a1 user: mistachkin tags: trunk | |
2013-07-01
| ||
18:22 | In the SQLiteFunction class, check if the database connection is open prior to attempting to call the Cancel method. Add NoFunctions connection flag to skip binding functions registered in the application domain. Fixes and adjustments to comments. Add several data-types for compatibility purposes. Fix for [fe50b8c2e8]. check-in: dff9a878dd user: mistachkin tags: trunk | |
10:16 | Allow virtual tables implemented in managed code to implement functions. check-in: 3e1da60858 user: mistachkin tags: trunk | |
Changes
Changes to Doc/Extra/version.html.
︙ | ︙ | |||
44 45 46 47 48 49 50 51 52 53 54 55 56 57 | <div id="mainBody"> <h1 class="heading">Version History</h1> <p><b>1.0.87.0 - June XX, 2013 <font color="red">(release scheduled)</font></b></p> <ul> <li>Add all the necessary infrastructure to allow virtual tables to be implemented in managed code. Fix for <a href="http://system.data.sqlite.org/index.html/info/9a544991be">[9a544991be]</a>.</li> <li>The DbType to type name translation needs to prioritize the Entity Framework type names. Fix for <a href="http://system.data.sqlite.org/index.html/info/47f4bac575">[47f4bac575]</a>.</li> <li>Add DateTimeFormatString connection string property to allow the DateTime format string used for all parsing and formatting to be overridden.</li> <li>When reading a DateTime value, avoid unnecessary string conversions. Fix for <a href="http://system.data.sqlite.org/index.html/info/4d87fbc742">[4d87fbc742]</a>.</li> <li>Modify the index introspection code so that it does not treat PRAGMA table_info "pk" column values as boolean. Fix for <a href="http://system.data.sqlite.org/index.html/info/f2c47a01eb">[f2c47a01eb]</a>.</li> <li>Disable use of the new connection string parsing algorithm when the No_SQLiteConnectionNewParser environment variable is set. Pursuant to <a href="http://system.data.sqlite.org/index.html/info/bbdda6eae2">[bbdda6eae2]</a>.</li> <li>Rename the ReturnCode property of the SQLiteException class to ResultCode. <b>** Potentially Incompatible Change **</b></li> </ul> <p><b>1.0.86.0 - May 23, 2013</b></p> <ul> | > > | 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | <div id="mainBody"> <h1 class="heading">Version History</h1> <p><b>1.0.87.0 - June XX, 2013 <font color="red">(release scheduled)</font></b></p> <ul> <li>Add all the necessary infrastructure to allow virtual tables to be implemented in managed code. Fix for <a href="http://system.data.sqlite.org/index.html/info/9a544991be">[9a544991be]</a>.</li> <li>The DbType to type name translation needs to prioritize the Entity Framework type names. Fix for <a href="http://system.data.sqlite.org/index.html/info/47f4bac575">[47f4bac575]</a>.</li> <li>Add DateTimeFormatString connection string property to allow the DateTime format string used for all parsing and formatting to be overridden.</li> <li>Add NoFunctions connection flag to skip binding functions registered in the application domain.</li> <li>Add several data-types for compatibility purposes. Fix for <a href="http://system.data.sqlite.org/index.html/info/fe50b8c2e8">[fe50b8c2e8]</a>.</li> <li>When reading a DateTime value, avoid unnecessary string conversions. Fix for <a href="http://system.data.sqlite.org/index.html/info/4d87fbc742">[4d87fbc742]</a>.</li> <li>Modify the index introspection code so that it does not treat PRAGMA table_info "pk" column values as boolean. Fix for <a href="http://system.data.sqlite.org/index.html/info/f2c47a01eb">[f2c47a01eb]</a>.</li> <li>Disable use of the new connection string parsing algorithm when the No_SQLiteConnectionNewParser environment variable is set. Pursuant to <a href="http://system.data.sqlite.org/index.html/info/bbdda6eae2">[bbdda6eae2]</a>.</li> <li>Rename the ReturnCode property of the SQLiteException class to ResultCode. <b>** Potentially Incompatible Change **</b></li> </ul> <p><b>1.0.86.0 - May 23, 2013</b></p> <ul> |
︙ | ︙ |
Changes to System.Data.SQLite/SQLite3.cs.
︙ | ︙ | |||
232 233 234 235 236 237 238 239 240 241 242 243 244 245 | } _sql = null; } } /////////////////////////////////////////////////////////////////////////////////////////////// internal override void Cancel() { UnsafeNativeMethods.sqlite3_interrupt(_sql); } internal override string Version { | > > > > | 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 | } _sql = null; } } /////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// Attempts to interrupt the query currently executing on the associated /// native database connection. /// </summary> internal override void Cancel() { UnsafeNativeMethods.sqlite3_interrupt(_sql); } internal override string Version { |
︙ | ︙ | |||
409 410 411 412 413 414 415 416 417 418 419 420 421 422 | /// <returns>Returns a result code</returns> internal override SQLiteErrorCode Shutdown() { SQLiteErrorCode rc = UnsafeNativeMethods.sqlite3_shutdown(); return rc; } internal override bool IsOpen() { return (_sql != null) && !_sql.IsInvalid && !_sql.IsClosed; } internal override void Open(string strFilename, SQLiteConnectionFlags connectionFlags, SQLiteOpenFlagsEnum openFlags, int maxPoolSize, bool usePool) { | > > > > > > | 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 | /// <returns>Returns a result code</returns> internal override SQLiteErrorCode Shutdown() { SQLiteErrorCode rc = UnsafeNativeMethods.sqlite3_shutdown(); return rc; } /// <summary> /// Determines if the associated native connection handle is open. /// </summary> /// <returns> /// Non-zero if the associated native connection handle is open. /// </returns> internal override bool IsOpen() { return (_sql != null) && !_sql.IsInvalid && !_sql.IsClosed; } internal override void Open(string strFilename, SQLiteConnectionFlags connectionFlags, SQLiteOpenFlagsEnum openFlags, int maxPoolSize, bool usePool) { |
︙ | ︙ | |||
474 475 476 477 478 479 480 481 482 | #endif if (n != SQLiteErrorCode.Ok) throw new SQLiteException(n, null); _sql = new SQLiteConnectionHandle(db, true); } lock (_sql) { /* HACK: Force the SyncBlock to be "created" now. */ } } // Bind functions to this connection. If any previous functions of the same name // were already bound, then the new bindings replace the old. | > > | > | 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 | #endif if (n != SQLiteErrorCode.Ok) throw new SQLiteException(n, null); _sql = new SQLiteConnectionHandle(db, true); } lock (_sql) { /* HACK: Force the SyncBlock to be "created" now. */ } } // Bind functions to this connection. If any previous functions of the same name // were already bound, then the new bindings replace the old. if ((connectionFlags & SQLiteConnectionFlags.NoFunctions) != SQLiteConnectionFlags.NoFunctions) _functionsArray = SQLiteFunction.BindFunctions(this, connectionFlags); SetTimeout(0); GC.KeepAlive(_sql); } internal override void ClearPool() { SQLiteConnectionPool.ClearPool(_fileName); |
︙ | ︙ |
Changes to System.Data.SQLite/SQLite3_UTF16.cs.
︙ | ︙ | |||
189 190 191 192 193 194 195 | #endif if (n != SQLiteErrorCode.Ok) throw new SQLiteException(n, null); _sql = new SQLiteConnectionHandle(db, true); } lock (_sql) { /* HACK: Force the SyncBlock to be "created" now. */ } } | > > > > | > | 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 | #endif if (n != SQLiteErrorCode.Ok) throw new SQLiteException(n, null); _sql = new SQLiteConnectionHandle(db, true); } lock (_sql) { /* HACK: Force the SyncBlock to be "created" now. */ } } // Bind functions to this connection. If any previous functions of the same name // were already bound, then the new bindings replace the old. if ((connectionFlags & SQLiteConnectionFlags.NoFunctions) != SQLiteConnectionFlags.NoFunctions) _functionsArray = SQLiteFunction.BindFunctions(this, connectionFlags); SetTimeout(0); GC.KeepAlive(_sql); } internal override void Bind_DateTime(SQLiteStatement stmt, SQLiteConnectionFlags flags, int index, DateTime dt) { switch (_datetimeFormat) |
︙ | ︙ |
Changes to System.Data.SQLite/SQLiteBase.cs.
︙ | ︙ | |||
72 73 74 75 76 77 78 | internal abstract SQLiteErrorCode SetMemoryStatus(bool value); /// <summary> /// Shutdown the SQLite engine so that it can be restarted with different config options. /// We depend on auto initialization to recover. /// </summary> internal abstract SQLiteErrorCode Shutdown(); /// <summary> | | | > > | 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | internal abstract SQLiteErrorCode SetMemoryStatus(bool value); /// <summary> /// Shutdown the SQLite engine so that it can be restarted with different config options. /// We depend on auto initialization to recover. /// </summary> internal abstract SQLiteErrorCode Shutdown(); /// <summary> /// Determines if the associated native connection handle is open. /// </summary> /// <returns> /// Non-zero if a database connection is open. /// </returns> internal abstract bool IsOpen(); /// <summary> /// Opens a database. /// </summary> /// <remarks> /// Implementers should call SQLiteFunction.BindFunctions() and save the array after opening a connection /// to bind all attributed user-defined functions and collating sequences to the new connection. |
︙ | ︙ | |||
145 146 147 148 149 150 151 152 153 154 155 156 157 158 | /// <summary> /// Resets a prepared statement so it can be executed again. If the error returned is SQLITE_SCHEMA, /// transparently attempt to rebuild the SQL statement and throw an error if that was not possible. /// </summary> /// <param name="stmt">The statement to reset</param> /// <returns>Returns -1 if the schema changed while resetting, 0 if the reset was sucessful or 6 (SQLITE_LOCKED) if the reset failed due to a lock</returns> internal abstract SQLiteErrorCode Reset(SQLiteStatement stmt); internal abstract void Cancel(); internal abstract void Bind_Double(SQLiteStatement stmt, SQLiteConnectionFlags flags, int index, double value); internal abstract void Bind_Int32(SQLiteStatement stmt, SQLiteConnectionFlags flags, int index, Int32 value); internal abstract void Bind_UInt32(SQLiteStatement stmt, SQLiteConnectionFlags flags, int index, UInt32 value); internal abstract void Bind_Int64(SQLiteStatement stmt, SQLiteConnectionFlags flags, int index, Int64 value); internal abstract void Bind_UInt64(SQLiteStatement stmt, SQLiteConnectionFlags flags, int index, UInt64 value); | > > > > > | 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | /// <summary> /// Resets a prepared statement so it can be executed again. If the error returned is SQLITE_SCHEMA, /// transparently attempt to rebuild the SQL statement and throw an error if that was not possible. /// </summary> /// <param name="stmt">The statement to reset</param> /// <returns>Returns -1 if the schema changed while resetting, 0 if the reset was sucessful or 6 (SQLITE_LOCKED) if the reset failed due to a lock</returns> internal abstract SQLiteErrorCode Reset(SQLiteStatement stmt); /// <summary> /// Attempts to interrupt the query currently executing on the associated /// native database connection. /// </summary> internal abstract void Cancel(); internal abstract void Bind_Double(SQLiteStatement stmt, SQLiteConnectionFlags flags, int index, double value); internal abstract void Bind_Int32(SQLiteStatement stmt, SQLiteConnectionFlags flags, int index, Int32 value); internal abstract void Bind_UInt32(SQLiteStatement stmt, SQLiteConnectionFlags flags, int index, UInt32 value); internal abstract void Bind_Int64(SQLiteStatement stmt, SQLiteConnectionFlags flags, int index, Int64 value); internal abstract void Bind_UInt64(SQLiteStatement stmt, SQLiteConnectionFlags flags, int index, UInt64 value); |
︙ | ︙ | |||
894 895 896 897 898 899 900 901 902 903 904 905 906 907 | /// <summary> /// Prevent this <see cref="SQLiteConnection" /> object instance from /// creating virtual table modules. /// </summary> NoCreateModule = 0x400, /// <summary> /// When binding and returning column values, always treat them as though /// they were plain text (i.e. no numeric, date/time, or other conversions /// should be attempted). /// </summary> BindAndGetAllAsText = BindAllAsText | GetAllAsText, | > > > > > > | 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 | /// <summary> /// Prevent this <see cref="SQLiteConnection" /> object instance from /// creating virtual table modules. /// </summary> NoCreateModule = 0x400, /// <summary> /// Skip adding the any functions provided by other managed assemblies /// when opening the connection. /// </summary> NoFunctions = 0x800, /// <summary> /// When binding and returning column values, always treat them as though /// they were plain text (i.e. no numeric, date/time, or other conversions /// should be attempted). /// </summary> BindAndGetAllAsText = BindAllAsText | GetAllAsText, |
︙ | ︙ |
Changes to System.Data.SQLite/SQLiteConvert.cs.
︙ | ︙ | |||
1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 | new SQLiteDbTypeMapping("BIGUINT", DbType.UInt64, false), new SQLiteDbTypeMapping("BINARY", DbType.Binary, false), new SQLiteDbTypeMapping("BIT", DbType.Boolean, true), new SQLiteDbTypeMapping("BLOB", DbType.Binary, true), new SQLiteDbTypeMapping("BOOL", DbType.Boolean, false), new SQLiteDbTypeMapping("BOOLEAN", DbType.Boolean, false), new SQLiteDbTypeMapping("CHAR", DbType.AnsiStringFixedLength, true), new SQLiteDbTypeMapping("COUNTER", DbType.Int64, false), new SQLiteDbTypeMapping("CURRENCY", DbType.Decimal, false), new SQLiteDbTypeMapping("DATE", DbType.DateTime, false), new SQLiteDbTypeMapping("DATETIME", DbType.DateTime, true), new SQLiteDbTypeMapping("DECIMAL", DbType.Decimal, true), new SQLiteDbTypeMapping("DOUBLE", DbType.Double, false), new SQLiteDbTypeMapping("FLOAT", DbType.Double, false), | > | 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 | new SQLiteDbTypeMapping("BIGUINT", DbType.UInt64, false), new SQLiteDbTypeMapping("BINARY", DbType.Binary, false), new SQLiteDbTypeMapping("BIT", DbType.Boolean, true), new SQLiteDbTypeMapping("BLOB", DbType.Binary, true), new SQLiteDbTypeMapping("BOOL", DbType.Boolean, false), new SQLiteDbTypeMapping("BOOLEAN", DbType.Boolean, false), new SQLiteDbTypeMapping("CHAR", DbType.AnsiStringFixedLength, true), new SQLiteDbTypeMapping("CLOB", DbType.String, false), new SQLiteDbTypeMapping("COUNTER", DbType.Int64, false), new SQLiteDbTypeMapping("CURRENCY", DbType.Decimal, false), new SQLiteDbTypeMapping("DATE", DbType.DateTime, false), new SQLiteDbTypeMapping("DATETIME", DbType.DateTime, true), new SQLiteDbTypeMapping("DECIMAL", DbType.Decimal, true), new SQLiteDbTypeMapping("DOUBLE", DbType.Double, false), new SQLiteDbTypeMapping("FLOAT", DbType.Double, false), |
︙ | ︙ | |||
1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 | new SQLiteDbTypeMapping("LONGTEXT", DbType.String, false), new SQLiteDbTypeMapping("LONGVARCHAR", DbType.String, false), new SQLiteDbTypeMapping("MEMO", DbType.String, false), new SQLiteDbTypeMapping("MONEY", DbType.Decimal, false), new SQLiteDbTypeMapping("NCHAR", DbType.StringFixedLength, true), new SQLiteDbTypeMapping("NOTE", DbType.String, false), new SQLiteDbTypeMapping("NTEXT", DbType.String, false), new SQLiteDbTypeMapping("NUMERIC", DbType.Decimal, false), new SQLiteDbTypeMapping("NVARCHAR", DbType.String, true), new SQLiteDbTypeMapping("OLEOBJECT", DbType.Binary, false), new SQLiteDbTypeMapping("REAL", DbType.Double, true), new SQLiteDbTypeMapping("SINGLE", DbType.Single, true), new SQLiteDbTypeMapping("SMALLDATE", DbType.DateTime, false), new SQLiteDbTypeMapping("SMALLINT", DbType.Int16, true), new SQLiteDbTypeMapping("SMALLUINT", DbType.UInt16, true), new SQLiteDbTypeMapping("STRING", DbType.String, false), new SQLiteDbTypeMapping("TEXT", DbType.String, false), | > > | 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 | new SQLiteDbTypeMapping("LONGTEXT", DbType.String, false), new SQLiteDbTypeMapping("LONGVARCHAR", DbType.String, false), new SQLiteDbTypeMapping("MEMO", DbType.String, false), new SQLiteDbTypeMapping("MONEY", DbType.Decimal, false), new SQLiteDbTypeMapping("NCHAR", DbType.StringFixedLength, true), new SQLiteDbTypeMapping("NOTE", DbType.String, false), new SQLiteDbTypeMapping("NTEXT", DbType.String, false), new SQLiteDbTypeMapping("NUMBER", DbType.Decimal, false), new SQLiteDbTypeMapping("NUMERIC", DbType.Decimal, false), new SQLiteDbTypeMapping("NVARCHAR", DbType.String, true), new SQLiteDbTypeMapping("OLEOBJECT", DbType.Binary, false), new SQLiteDbTypeMapping("RAW", DbType.Binary, false), new SQLiteDbTypeMapping("REAL", DbType.Double, true), new SQLiteDbTypeMapping("SINGLE", DbType.Single, true), new SQLiteDbTypeMapping("SMALLDATE", DbType.DateTime, false), new SQLiteDbTypeMapping("SMALLINT", DbType.Int16, true), new SQLiteDbTypeMapping("SMALLUINT", DbType.UInt16, true), new SQLiteDbTypeMapping("STRING", DbType.String, false), new SQLiteDbTypeMapping("TEXT", DbType.String, false), |
︙ | ︙ | |||
1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 | new SQLiteDbTypeMapping("UNSIGNEDINTEGER", DbType.UInt64, true), new SQLiteDbTypeMapping("UNSIGNEDINTEGER8", DbType.Byte, false), new SQLiteDbTypeMapping("UNSIGNEDINTEGER16", DbType.UInt16, false), new SQLiteDbTypeMapping("UNSIGNEDINTEGER32", DbType.UInt32, false), new SQLiteDbTypeMapping("UNSIGNEDINTEGER64", DbType.UInt64, false), new SQLiteDbTypeMapping("VARBINARY", DbType.Binary, false), new SQLiteDbTypeMapping("VARCHAR", DbType.AnsiString, true), new SQLiteDbTypeMapping("YESNO", DbType.Boolean, false) }); } /// <summary> /// For a given type name, return a closest-match .NET type /// </summary> | > | 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 | new SQLiteDbTypeMapping("UNSIGNEDINTEGER", DbType.UInt64, true), new SQLiteDbTypeMapping("UNSIGNEDINTEGER8", DbType.Byte, false), new SQLiteDbTypeMapping("UNSIGNEDINTEGER16", DbType.UInt16, false), new SQLiteDbTypeMapping("UNSIGNEDINTEGER32", DbType.UInt32, false), new SQLiteDbTypeMapping("UNSIGNEDINTEGER64", DbType.UInt64, false), new SQLiteDbTypeMapping("VARBINARY", DbType.Binary, false), new SQLiteDbTypeMapping("VARCHAR", DbType.AnsiString, true), new SQLiteDbTypeMapping("VARCHAR2", DbType.AnsiString, false), new SQLiteDbTypeMapping("YESNO", DbType.Boolean, false) }); } /// <summary> /// For a given type name, return a closest-match .NET type /// </summary> |
︙ | ︙ |
Changes to System.Data.SQLite/SQLiteFunction.cs.
︙ | ︙ | |||
464 465 466 467 468 469 470 | } } // // NOTE: This must be done to prevent the core SQLite library from // using our (invalid) result. // | | | 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 | } } // // NOTE: This must be done to prevent the core SQLite library from // using our (invalid) result. // if ((_base != null) && _base.IsOpen()) _base.Cancel(); return 0; } /// <summary> /// Internal collation sequence function, which wraps up the raw string pointers and executes the Compare() virtual function. |
︙ | ︙ | |||
511 512 513 514 515 516 517 | } } // // NOTE: This must be done to prevent the core SQLite library from // using our (invalid) result. // | | | 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 | } } // // NOTE: This must be done to prevent the core SQLite library from // using our (invalid) result. // if ((_base != null) && _base.IsOpen()) _base.Cancel(); return 0; } /// <summary> /// The internal aggregate Step function callback, which wraps the raw context pointer and calls the virtual Step() method. |
︙ | ︙ |
Changes to System.Data.SQLite/SQLiteModule.cs.
︙ | ︙ | |||
5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889 | return sqliteBase.DeclareVirtualTable(this, sql, ref error); } #endregion /////////////////////////////////////////////////////////////////////// #region Function Declaration Helper Methods protected virtual SQLiteErrorCode DeclareFunction( SQLiteConnection connection, int argumentCount, string name, ref string error ) { | > > > > > > > > > > > > > > > > > > > > > > > > | 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 | return sqliteBase.DeclareVirtualTable(this, sql, ref error); } #endregion /////////////////////////////////////////////////////////////////////// #region Function Declaration Helper Methods /// <summary> /// Calls the native SQLite core library in order to declare a virtual /// table function in response to a call into the /// <see cref="ISQLiteNativeModule.xCreate" /> /// or <see cref="ISQLiteNativeModule.xConnect" /> virtual table /// methods. /// </summary> /// <param name="connection"> /// The <see cref="SQLiteConnection" /> object instance to use when /// declaring the schema of the virtual table. /// </param> /// <param name="argumentCount"> /// The number of arguments to the function being declared. /// </param> /// <param name="name"> /// The name of the function being declared. /// </param> /// <param name="error"> /// Upon success, the contents of this parameter are undefined. Upon /// failure, it should contain an appropriate error message. /// </param> /// <returns> /// A standard SQLite return code. /// </returns> protected virtual SQLiteErrorCode DeclareFunction( SQLiteConnection connection, int argumentCount, string name, ref string error ) { |
︙ | ︙ |
Changes to Tests/basic.eagle.
︙ | ︙ | |||
1457 1458 1459 1460 1461 1462 1463 | } -constraints {eagle SQLite System.Data.SQLite System.Data.SQLite.Linq} \ -result {}} ############################################################################### runTest {test data-1.27 {VARCHAR / NVARCHAR types with spaces} -body { list [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ | | | | | | 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 | } -constraints {eagle SQLite System.Data.SQLite System.Data.SQLite.Linq} \ -result {}} ############################################################################### runTest {test data-1.27 {VARCHAR / NVARCHAR types with spaces} -body { list [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ TypeNameToDbType VARCHAR] \ [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ TypeNameToDbType NVARCHAR] \ [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ TypeNameToDbType VARCHAR(1)] \ [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ TypeNameToDbType NVARCHAR(1)] \ [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ TypeNameToDbType "VARCHAR (1)"] \ [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ TypeNameToDbType "NVARCHAR (1)"] \ } -constraints {eagle System.Data.SQLite} -result \ {AnsiString String AnsiString String AnsiString String}} |
︙ | ︙ |
Added Tests/tkt-fe50b8c2e8.eagle.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | ############################################################################### # # tkt-fe50b8c2e8.eagle -- # # Written by Joe Mistachkin. # Released to the public domain, use at your own risk! # ############################################################################### package require Eagle package require Eagle.Library package require Eagle.Test runTestPrologue ############################################################################### package require System.Data.SQLite.Test runSQLiteTestPrologue ############################################################################### runTest {test tkt-fe50b8c2e8-1.1 {compatibility data types} -body { list [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ TypeNameToDbType VARCHAR2] \ [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ TypeNameToDbType CLOB] \ [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ TypeNameToDbType NUMBER] \ [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ TypeNameToDbType RAW] \ [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ DbTypeToTypeName AnsiString] \ [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ DbTypeToTypeName String] \ [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ DbTypeToTypeName Decimal] \ [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ DbTypeToTypeName Binary] } -constraints {eagle System.Data.SQLite} -result \ {AnsiString String Decimal Binary VARCHAR NVARCHAR DECIMAL BLOB}} ############################################################################### runSQLiteTestEpilogue runTestEpilogue |
Changes to Tests/vtab.eagle.
︙ | ︙ | |||
17 18 19 20 21 22 23 | package require System.Data.SQLite.Test runSQLiteTestPrologue ############################################################################### runTest {test vtab-1.1 {basic virtual table support} -setup { | | | 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package require System.Data.SQLite.Test runSQLiteTestPrologue ############################################################################### runTest {test vtab-1.1 {basic virtual table support} -setup { set fileName vtab-1.1.db } -body { set id [object invoke Interpreter.GetActive NextId] set dataSource [file join [getDatabaseDirectory] $fileName] set sql { \ CREATE VIRTUAL TABLE t${id} USING mod${id}; \ } |
︙ | ︙ | |||
96 97 98 99 100 101 102 | [expr {[info exists errors] ? $errors : ""}] \ [expr {$code eq "Ok" ? [catch { object invoke _Dynamic${id}.Test${id} Main } result] : [set result ""]}] $result } -cleanup { cleanupDb $fileName | | | | 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | [expr {[info exists errors] ? $errors : ""}] \ [expr {$code eq "Ok" ? [catch { object invoke _Dynamic${id}.Test${id} Main } result] : [set result ""]}] $result } -cleanup { cleanupDb $fileName unset -nocomplain result code results errors sql dataSource id fileName } -constraints \ {eagle monoBug28 command.sql compile.DATA SQLite System.Data.SQLite\ defineConstant.System.Data.SQLite.INTEROP_VIRTUAL_TABLE} -match regexp -result \ {^Ok System#CodeDom#Compiler#CompilerResults#\d+ \{\} 0 \{\}$}} ############################################################################### runTest {test vtab-1.2 {IEnumerable virtual table} -setup { set fileName vtab-1.2.db } -body { set id [object invoke Interpreter.GetActive NextId] set dataSource [file join [getDatabaseDirectory] $fileName] set sql(1) { \ CREATE VIRTUAL TABLE t${id} USING mod${id}; \ } |
︙ | ︙ | |||
201 202 203 204 205 206 207 | [expr {[info exists errors] ? $errors : ""}] \ [expr {$code eq "Ok" ? [catch { object invoke _Dynamic${id}.Test${id} GetList one two three 4 5.0 } result] : [set result ""]}] $result } -cleanup { cleanupDb $fileName | | | | 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 | [expr {[info exists errors] ? $errors : ""}] \ [expr {$code eq "Ok" ? [catch { object invoke _Dynamic${id}.Test${id} GetList one two three 4 5.0 } result] : [set result ""]}] $result } -cleanup { cleanupDb $fileName unset -nocomplain result code results errors sql dataSource id fileName } -constraints \ {eagle monoBug28 command.sql compile.DATA SQLite System.Data.SQLite\ defineConstant.System.Data.SQLite.INTEROP_VIRTUAL_TABLE} -match regexp -result \ [string map [list \n \r\n] {^Ok System#CodeDom#Compiler#CompilerResults#\d+\ \{\} 0 \{one two three 4 5.0 Error \{SQL logic error or missing database virtual table "t\d+" is read-only\}\}$}]} ############################################################################### runTest {test vtab-1.3 {IEnumerable<T> virtual table} -setup { set fileName vtab-1.3.db } -body { set id [object invoke Interpreter.GetActive NextId] set dataSource [file join [getDatabaseDirectory] $fileName] set sql(1) { \ CREATE VIRTUAL TABLE t${id} USING mod${id}; \ } |
︙ | ︙ | |||
309 310 311 312 313 314 315 | [expr {[info exists errors] ? $errors : ""}] \ [expr {$code eq "Ok" ? [catch { object invoke _Dynamic${id}.Test${id} GetList 1 2 3 4 5 } result] : [set result ""]}] $result } -cleanup { cleanupDb $fileName | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 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 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 | [expr {[info exists errors] ? $errors : ""}] \ [expr {$code eq "Ok" ? [catch { object invoke _Dynamic${id}.Test${id} GetList 1 2 3 4 5 } result] : [set result ""]}] $result } -cleanup { cleanupDb $fileName unset -nocomplain result code results errors sql dataSource id fileName } -constraints \ {eagle monoBug28 command.sql compile.DATA SQLite System.Data.SQLite\ defineConstant.System.Data.SQLite.INTEROP_VIRTUAL_TABLE} -match regexp -result \ [string map [list \n \r\n] {^Ok System#CodeDom#Compiler#CompilerResults#\d+\ \{\} 0 \{1 2 3 4 5 Error \{SQL logic error or missing database virtual table "t\d+" is read-only\}\}$}]} ############################################################################### runTest {test vtab-1.4 {virtual table function support} -setup { set fileName vtab-1.4.db } -body { set id [object invoke Interpreter.GetActive NextId] set dataSource [file join [getDatabaseDirectory] $fileName] set sql(1) { \ CREATE VIRTUAL TABLE t${id} USING mod${id}; \ } set sql(2) { \ SELECT Base64(x, CAST('one' AS BLOB)) FROM t${id}; \ } set sql(3) { \ SELECT Base64(x, CAST('one' AS BLOB), 'two') FROM t${id}; \ } set sql(4) { \ SELECT Base65(x, CAST('one' AS BLOB)) FROM t${id}; \ } unset -nocomplain results errors set code [compileCSharpWith [subst { using System; using System.Data.SQLite; using Eagle._Containers.Public; namespace _Dynamic${id} { public class SQLiteFunction${id} : SQLiteFunction { public SQLiteFunction${id}() : base(SQLiteDateFormats.Default, DateTimeKind.Unspecified, null, false) { // do nothing. } /////////////////////////////////////////////////////////////////////// public override object Invoke( object\[\] args ) { if (args == null) return null; if (args.Length != 2) return new ArgumentException(String.Format( "need exactly two arguments, got {0}", args.Length)); object arg = args\[1\]; if (arg == null) return String.Empty; Type type = arg.GetType(); if (type == typeof(DBNull)) return String.Empty; if (type != typeof(byte\[\])) return new ArgumentException(String.Format( "argument must be byte array, got {0}", type)); return Convert.ToBase64String((byte\[\]) arg); } } ///////////////////////////////////////////////////////////////////////// public sealed class SQLiteModuleTest${id} : SQLiteModuleNoop { public SQLiteModuleTest${id}(string name) : base(name) { // do nothing. } /////////////////////////////////////////////////////////////////////// public override SQLiteErrorCode Create( SQLiteConnection connection, IntPtr pClientData, string\[\] arguments, ref SQLiteVirtualTable table, ref string error ) { SQLiteErrorCode rc = DeclareTable( connection, "CREATE TABLE ignored(x);", ref error); if (rc != SQLiteErrorCode.Ok) return rc; rc = DeclareFunction(connection, -1, "Base64", ref error); if (rc != SQLiteErrorCode.Ok) return rc; table = new SQLiteVirtualTable(arguments); return SQLiteErrorCode.Ok; } /////////////////////////////////////////////////////////////////////// public override SQLiteErrorCode Open( SQLiteVirtualTable table, ref SQLiteVirtualTableCursor cursor ) { cursor = new SQLiteVirtualTableCursor(table); return SQLiteErrorCode.Ok; } /////////////////////////////////////////////////////////////////////// public override bool FindFunction( SQLiteVirtualTable table, int argumentCount, string name, ref SQLiteFunction function, ref IntPtr pClientData ) { if (argumentCount != 2) { SetTableError(table, String.Format( "no \\"{0}\\" functions accept {1} argument(s)", base.Name, argumentCount)); return false; } if (!String.Equals(name, "Base64", StringComparison.OrdinalIgnoreCase)) { SetTableError(table, String.Format( "no \\"{0}\\" functions are named \\"{1}\\"", base.Name, name)); return false; } function = new SQLiteFunction${id}(); return true; } } ///////////////////////////////////////////////////////////////////////// public static class Test${id} { public static StringList GetList() { StringList result = new StringList(); using (SQLiteConnection connection = new SQLiteConnection( "Data Source=${dataSource};Flags=NoFunctions;")) { connection.Open(); connection.CreateModule(new SQLiteModuleTest${id}("mod${id}")); try { using (SQLiteCommand command = connection.CreateCommand()) { command.CommandText = "[subst ${sql(1)}]"; result.Add(String.Format("{0}", command.ExecuteScalar())); } } catch (Exception e) { result.Add(e.Message); } try { using (SQLiteCommand command = connection.CreateCommand()) { command.CommandText = "[subst ${sql(2)}]"; result.Add(String.Format("{0}", command.ExecuteScalar())); } } catch (Exception e) { result.Add(e.Message); } try { using (SQLiteCommand command = connection.CreateCommand()) { command.CommandText = "[subst ${sql(3)}]"; result.Add(String.Format("{0}", command.ExecuteScalar())); } } catch (Exception e) { result.Add(e.Message); } try { using (SQLiteCommand command = connection.CreateCommand()) { command.CommandText = "[subst ${sql(4)}]"; result.Add(String.Format("{0}", command.ExecuteScalar())); } } catch (Exception e) { result.Add(e.Message); } connection.Close(); } return result; } /////////////////////////////////////////////////////////////////////// public static void Main() { // do nothing. } } } }] true true true results errors [list System.Data.SQLite.dll Eagle.dll]] list $code $results \ [expr {[info exists errors] ? $errors : ""}] \ [expr {$code eq "Ok" ? [catch { object invoke _Dynamic${id}.Test${id} GetList } result] : [set result ""]}] $result } -cleanup { cleanupDb $fileName unset -nocomplain result code results errors sql dataSource id fileName } -constraints \ {eagle monoBug28 command.sql compile.DATA SQLite System.Data.SQLite\ defineConstant.System.Data.SQLite.INTEROP_VIRTUAL_TABLE} -match regexp -result \ [string map [list \n \r\n] {^Ok System#CodeDom#Compiler#CompilerResults#\d+\ \{\} 0 \{\{\} b25l \{SQL logic error or missing database unable to use function Base64 in the requested context\} \{SQL logic error or\ missing database no such function: Base65\}\}$}]} ############################################################################### runTest {test vtab-1.5 {virtual table function support} -setup { set fileName vtab-1.5.db } -body { set id [object invoke Interpreter.GetActive NextId] set dataSource [file join [getDatabaseDirectory] $fileName] set sql(1) { \ CREATE VIRTUAL TABLE t${id} USING mod${id}; \ } |
︙ | ︙ | |||
560 561 562 563 564 565 566 | [expr {[info exists errors] ? $errors : ""}] \ [expr {$code eq "Ok" ? [catch { object invoke _Dynamic${id}.Test${id} GetList } result] : [set result ""]}] $result } -cleanup { cleanupDb $fileName | | | | | 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 | [expr {[info exists errors] ? $errors : ""}] \ [expr {$code eq "Ok" ? [catch { object invoke _Dynamic${id}.Test${id} GetList } result] : [set result ""]}] $result } -cleanup { cleanupDb $fileName unset -nocomplain result code results errors sql dataSource id fileName } -constraints \ {eagle monoBug28 command.sql compile.DATA SQLite System.Data.SQLite\ defineConstant.System.Data.SQLite.INTEROP_VIRTUAL_TABLE} -match regexp -result \ [string map [list \n \r\n] {^Ok System#CodeDom#Compiler#CompilerResults#\d+\ \{\} 0 \{\{\} b25l \{SQL logic error or missing database (?:unable to use function Base64 in the requested context|need exactly one\ argument, got 3)\} \{SQL logic error or missing database no such function: Base65\}\}$}]} ############################################################################### runSQLiteTestEpilogue runTestEpilogue |
Changes to readme.htm.
︙ | ︙ | |||
189 190 191 192 193 194 195 196 197 198 199 200 201 202 | <p> <b>1.0.87.0 - June XX, 2013 <font color="red">(release scheduled)</font></b> </p> <ul> <li>Add all the necessary infrastructure to allow virtual tables to be implemented in managed code. Fix for [9a544991be].</li> <li>The DbType to type name translation needs to prioritize the Entity Framework type names. Fix for [47f4bac575].</li> <li>Add DateTimeFormatString connection string property to allow the DateTime format string used for all parsing and formatting to be overridden.</li> <li>When reading a DateTime value, avoid unnecessary string conversions. Fix for [4d87fbc742].</li> <li>Modify the index introspection code so that it does not treat PRAGMA table_info "pk" column values as boolean. Fix for [f2c47a01eb].</li> <li>Disable use of the new connection string parsing algorithm when the No_SQLiteConnectionNewParser environment variable is set. Pursuant to [bbdda6eae2].</li> <li>Rename the ReturnCode property of the SQLiteException class to ResultCode. <b>** Potentially Incompatible Change **</b></li> </ul> <p> <b>1.0.86.0 - May 23, 2013</b> | > > | 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 | <p> <b>1.0.87.0 - June XX, 2013 <font color="red">(release scheduled)</font></b> </p> <ul> <li>Add all the necessary infrastructure to allow virtual tables to be implemented in managed code. Fix for [9a544991be].</li> <li>The DbType to type name translation needs to prioritize the Entity Framework type names. Fix for [47f4bac575].</li> <li>Add DateTimeFormatString connection string property to allow the DateTime format string used for all parsing and formatting to be overridden.</li> <li>Add NoFunctions connection flag to skip binding functions registered in the application domain.</li> <li>Add several data-types for compatibility purposes. Fix for [fe50b8c2e8].</li> <li>When reading a DateTime value, avoid unnecessary string conversions. Fix for [4d87fbc742].</li> <li>Modify the index introspection code so that it does not treat PRAGMA table_info "pk" column values as boolean. Fix for [f2c47a01eb].</li> <li>Disable use of the new connection string parsing algorithm when the No_SQLiteConnectionNewParser environment variable is set. Pursuant to [bbdda6eae2].</li> <li>Rename the ReturnCode property of the SQLiteException class to ResultCode. <b>** Potentially Incompatible Change **</b></li> </ul> <p> <b>1.0.86.0 - May 23, 2013</b> |
︙ | ︙ |
Changes to www/news.wiki.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <title>News</title> <b>Version History</b> <p> <b>1.0.87.0 - June XX, 2013 <font color="red">(release scheduled)</font></b> </p> <ul> <li>Add all the necessary infrastructure to allow virtual tables to be implemented in managed code. Fix for [9a544991be].</li> <li>The DbType to type name translation needs to prioritize the Entity Framework type names. Fix for [47f4bac575].</li> <li>Add DateTimeFormatString connection string property to allow the DateTime format string used for all parsing and formatting to be overridden.</li> <li>When reading a DateTime value, avoid unnecessary string conversions. Fix for [4d87fbc742].</li> <li>Modify the index introspection code so that it does not treat PRAGMA table_info "pk" column values as boolean. Fix for [f2c47a01eb].</li> <li>Disable use of the new connection string parsing algorithm when the No_SQLiteConnectionNewParser environment variable is set. Pursuant to [bbdda6eae2].</li> <li>Rename the ReturnCode property of the SQLiteException class to ResultCode. <b>** Potentially Incompatible Change **</b></li> </ul> <p> <b>1.0.86.0 - May 23, 2013</b> | > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <title>News</title> <b>Version History</b> <p> <b>1.0.87.0 - June XX, 2013 <font color="red">(release scheduled)</font></b> </p> <ul> <li>Add all the necessary infrastructure to allow virtual tables to be implemented in managed code. Fix for [9a544991be].</li> <li>The DbType to type name translation needs to prioritize the Entity Framework type names. Fix for [47f4bac575].</li> <li>Add DateTimeFormatString connection string property to allow the DateTime format string used for all parsing and formatting to be overridden.</li> <li>Add NoFunctions connection flag to skip binding functions registered in the application domain.</li> <li>Add several data-types for compatibility purposes. Fix for [fe50b8c2e8].</li> <li>When reading a DateTime value, avoid unnecessary string conversions. Fix for [4d87fbc742].</li> <li>Modify the index introspection code so that it does not treat PRAGMA table_info "pk" column values as boolean. Fix for [f2c47a01eb].</li> <li>Disable use of the new connection string parsing algorithm when the No_SQLiteConnectionNewParser environment variable is set. Pursuant to [bbdda6eae2].</li> <li>Rename the ReturnCode property of the SQLiteException class to ResultCode. <b>** Potentially Incompatible Change **</b></li> </ul> <p> <b>1.0.86.0 - May 23, 2013</b> |
︙ | ︙ |