Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Add SQLiteConnection.BindFunction method to facilitate adding custom functions on a per-connection basis. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
1fa0ac70f35bdeeaa1fe5c9b2fad2caa |
User & Date: | mistachkin 2013-07-04 06:00:28.039 |
Context
2013-07-04
| ||
18:49 | Rename the new NoFunctions connection flag to NoBindFunctions. check-in: 8e945470fe user: mistachkin tags: trunk | |
06:00 | Add SQLiteConnection.BindFunction method to facilitate adding custom functions on a per-connection basis. check-in: 1fa0ac70f3 user: mistachkin tags: trunk | |
03:00 | Make sure the exception thrown by the InitializeBackup method always contains a meaningful error message. check-in: aec2437c24 user: mistachkin tags: trunk | |
Changes
Changes to Doc/Extra/version.html.
︙ | ︙ | |||
46 47 48 49 50 51 52 53 54 55 56 57 58 59 | <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> | > | 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | <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>Add SQLiteConnection.BindFunction method to facilitate adding custom functions on a per-connection basis.</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.
︙ | ︙ | |||
71 72 73 74 75 76 77 | #if (NET_35 || NET_40 || NET_45) && !PLATFORM_COMPACTFRAMEWORK private bool _buildingSchema; #endif /// <summary> /// The user-defined functions registered on this connection /// </summary> | | | 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #if (NET_35 || NET_40 || NET_45) && !PLATFORM_COMPACTFRAMEWORK private bool _buildingSchema; #endif /// <summary> /// The user-defined functions registered on this connection /// </summary> protected List<SQLiteFunction> _functions; #if INTEROP_VIRTUAL_TABLE /// <summary> /// The modules created using this connection. /// </summary> protected Dictionary<string, SQLiteModule> _modules; #endif |
︙ | ︙ | |||
240 241 242 243 244 245 246 247 248 249 250 251 252 253 | /// 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 { get { return SQLite3.SQLiteVersion; } | > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 | /// Attempts to interrupt the query currently executing on the associated /// native database connection. /// </summary> internal override void Cancel() { UnsafeNativeMethods.sqlite3_interrupt(_sql); } /// <summary> /// This function binds a user-defined function to the connection. /// </summary> /// <param name="functionAttribute"> /// The <see cref="SQLiteFunctionAttribute"/> object instance containing /// the metadata for the function to be bound. /// </param> /// <param name="function"> /// The <see cref="SQLiteFunction"/> object instance that implements the /// function to be bound. /// </param> /// <param name="flags"> /// The flags associated with the parent connection object. /// </param> internal override void BindFunction( SQLiteFunctionAttribute functionAttribute, SQLiteFunction function, SQLiteConnectionFlags flags ) { SQLiteFunction.BindFunction(this, functionAttribute, function, flags); if (_functions == null) _functions = new List<SQLiteFunction>(); _functions.Add(function); } internal override string Version { get { return SQLite3.SQLiteVersion; } |
︙ | ︙ | |||
488 489 490 491 492 493 494 | } 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) | > > > > | > | 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 | } 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) { if (_functions == null) _functions = new List<SQLiteFunction>(); _functions.AddRange(new List<SQLiteFunction>(SQLiteFunction.BindFunctions(this, connectionFlags))); } SetTimeout(0); GC.KeepAlive(_sql); } internal override void ClearPool() { |
︙ | ︙ |
Changes to System.Data.SQLite/SQLite3_UTF16.cs.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /******************************************************** * ADO.NET 2.0 Data Provider for SQLite Version 3.X * Written by Robert Simpson (robert@blackcastlesoft.com) * * Released to the public domain, use at your own risk! ********************************************************/ namespace System.Data.SQLite { using System; #if !NET_COMPACT_20 && TRACE_CONNECTION using System.Diagnostics; #endif using System.IO; using System.Runtime.InteropServices; | > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /******************************************************** * ADO.NET 2.0 Data Provider for SQLite Version 3.X * Written by Robert Simpson (robert@blackcastlesoft.com) * * Released to the public domain, use at your own risk! ********************************************************/ namespace System.Data.SQLite { using System; using System.Collections.Generic; #if !NET_COMPACT_20 && TRACE_CONNECTION using System.Diagnostics; #endif using System.IO; using System.Runtime.InteropServices; |
︙ | ︙ | |||
193 194 195 196 197 198 199 | } 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) | > > > > | > | 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 | } 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) { if (_functions == null) _functions = new List<SQLiteFunction>(); _functions.AddRange(new List<SQLiteFunction>(SQLiteFunction.BindFunctions(this, connectionFlags))); } SetTimeout(0); GC.KeepAlive(_sql); } internal override void Bind_DateTime(SQLiteStatement stmt, SQLiteConnectionFlags flags, int index, DateTime dt) { |
︙ | ︙ |
Changes to System.Data.SQLite/SQLiteBase.cs.
︙ | ︙ | |||
154 155 156 157 158 159 160 161 162 163 164 165 166 167 | /// <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); internal abstract void Bind_Text(SQLiteStatement stmt, SQLiteConnectionFlags flags, int index, string value); internal abstract void Bind_Blob(SQLiteStatement stmt, SQLiteConnectionFlags flags, int index, byte[] blobData); | > > > > > > > > > > > > > > > > | 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 | /// <summary> /// Attempts to interrupt the query currently executing on the associated /// native database connection. /// </summary> internal abstract void Cancel(); /// <summary> /// This function binds a user-defined functions to the connection. /// </summary> /// <param name="functionAttribute"> /// The <see cref="SQLiteFunctionAttribute"/> object instance containing /// the metadata for the function to be bound. /// </param> /// <param name="function"> /// The <see cref="SQLiteFunction"/> object instance that implements the /// function to be bound. /// </param> /// <param name="flags"> /// The flags associated with the parent connection object. /// </param> internal abstract void BindFunction(SQLiteFunctionAttribute functionAttribute, SQLiteFunction function, SQLiteConnectionFlags flags); 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); internal abstract void Bind_Text(SQLiteStatement stmt, SQLiteConnectionFlags flags, int index, string value); internal abstract void Bind_Blob(SQLiteStatement stmt, SQLiteConnectionFlags flags, int index, byte[] blobData); |
︙ | ︙ |
Changes to System.Data.SQLite/SQLiteConnection.cs.
︙ | ︙ | |||
827 828 829 830 831 832 833 834 835 836 837 838 839 840 | finally { if (backup != null) sqliteBase.FinishBackup(backup); /* throw */ } } #endregion /////////////////////////////////////////////////////////////////////////////////////////////// [Conditional("CHECK_STATE")] internal static void Check(SQLiteConnection connection) { if (connection == null) | > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 | finally { if (backup != null) sqliteBase.FinishBackup(backup); /* throw */ } } #endregion /////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// Attempts to bind the specified <see cref="SQLiteFunction" /> object /// instance to this connection. /// </summary> /// <param name="functionAttribute"> /// The <see cref="SQLiteFunctionAttribute"/> object instance containing /// the metadata for the function to be bound. /// </param> /// <param name="function"> /// The <see cref="SQLiteFunction"/> object instance that implements the /// function to be bound. /// </param> public void BindFunction( SQLiteFunctionAttribute functionAttribute, SQLiteFunction function ) { CheckDisposed(); if (_sql == null) throw new InvalidOperationException( "Database connection not valid for binding functions."); _sql.BindFunction(functionAttribute, function, _flags); } /////////////////////////////////////////////////////////////////////////////////////////////// [Conditional("CHECK_STATE")] internal static void Check(SQLiteConnection connection) { if (connection == null) |
︙ | ︙ |
Changes to System.Data.SQLite/SQLiteFunction.cs.
︙ | ︙ | |||
702 703 704 705 706 707 708 | object[] arAtt = arTypes[x].GetCustomAttributes(typeof(SQLiteFunctionAttribute), false); int u = arAtt.Length; for (int y = 0; y < u; y++) { at = arAtt[y] as SQLiteFunctionAttribute; if (at != null) { | | | 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 | object[] arAtt = arTypes[x].GetCustomAttributes(typeof(SQLiteFunctionAttribute), false); int u = arAtt.Length; for (int y = 0; y < u; y++) { at = arAtt[y] as SQLiteFunctionAttribute; if (at != null) { at.InstanceType = arTypes[x]; _registeredFunctions.Add(at); } } } } #endif } |
︙ | ︙ | |||
731 732 733 734 735 736 737 | SQLiteFunctionAttribute at; for (int y = 0; y < u; y++) { at = arAtt[y] as SQLiteFunctionAttribute; if (at != null) { | | | | < | | | | > > | | > > | > > > > > > > > > > > | > | > > > > | > > | | > > > > > > | > > | > | > > | > > > > > > | > > | > > > | | | > > | > > > > > > > > > | 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 | SQLiteFunctionAttribute at; for (int y = 0; y < u; y++) { at = arAtt[y] as SQLiteFunctionAttribute; if (at != null) { at.InstanceType = typ; _registeredFunctions.Add(at); } } } /// <summary> /// Called by SQLiteBase derived classes, this function binds all user-defined functions to a connection. /// It is done this way so that all user-defined functions will access the database using the same encoding scheme /// as the connection (UTF-8 or UTF-16). /// </summary> /// <remarks> /// The wrapper functions that interop with SQLite will create a unique cookie value, which internally is a pointer to /// all the wrapped callback functions. The interop function uses it to map CDecl callbacks to StdCall callbacks. /// </remarks> /// <param name="sqlbase">The base object on which the functions are to bind</param> /// <param name="flags">The flags associated with the parent connection object</param> /// <returns>Returns a logical list of functions which the connection should retain until it is closed.</returns> internal static IEnumerable<SQLiteFunction> BindFunctions(SQLiteBase sqlbase, SQLiteConnectionFlags flags) { List<SQLiteFunction> lFunctions = new List<SQLiteFunction>(); foreach (SQLiteFunctionAttribute pr in _registeredFunctions) { SQLiteFunction f = (SQLiteFunction)Activator.CreateInstance(pr.InstanceType); BindFunction(sqlbase, pr, f, flags); lFunctions.Add(f); } return lFunctions; } /// <summary> /// This function binds a user-defined functions to a connection. /// </summary> /// <param name="sqliteBase"> /// The <see cref="SQLiteBase" /> object instance associated with the /// <see cref="SQLiteConnection" /> that the function should be bound to. /// </param> /// <param name="functionAttribute"> /// The <see cref="SQLiteFunctionAttribute"/> object instance containing /// the metadata for the function to be bound. /// </param> /// <param name="function"> /// The <see cref="SQLiteFunction"/> object instance that implements the /// function to be bound. /// </param> /// <param name="flags"> /// The flags associated with the parent connection object. /// </param> internal static void BindFunction( SQLiteBase sqliteBase, SQLiteFunctionAttribute functionAttribute, SQLiteFunction function, SQLiteConnectionFlags flags ) { if (sqliteBase == null) throw new ArgumentNullException("sqliteBase"); if (functionAttribute == null) throw new ArgumentNullException("functionAttribute"); if (function == null) throw new ArgumentNullException("function"); FunctionType functionType = functionAttribute.FuncType; function._base = sqliteBase; function._flags = flags; function._InvokeFunc = (functionType == FunctionType.Scalar) ? new SQLiteCallback(function.ScalarCallback) : null; function._StepFunc = (functionType == FunctionType.Aggregate) ? new SQLiteCallback(function.StepCallback) : null; function._FinalFunc = (functionType == FunctionType.Aggregate) ? new SQLiteFinalCallback(function.FinalCallback) : null; function._CompareFunc = (functionType == FunctionType.Collation) ? new SQLiteCollation(function.CompareCallback) : null; function._CompareFunc16 = (functionType == FunctionType.Collation) ? new SQLiteCollation(function.CompareCallback16) : null; string name = functionAttribute.Name; if (functionType != FunctionType.Collation) { bool needCollSeq = (function is SQLiteFunctionEx); sqliteBase.CreateFunction( name, functionAttribute.Arguments, needCollSeq, function._InvokeFunc, function._StepFunc, function._FinalFunc); } else { sqliteBase.CreateCollation( name, function._CompareFunc, function._CompareFunc16); } } } /// <summary> /// Extends SQLiteFunction and allows an inherited class to obtain the collating sequence associated with a function call. /// </summary> /// <remarks> |
︙ | ︙ |
Changes to System.Data.SQLite/SQLiteFunctionAttribute.cs.
︙ | ︙ | |||
13 14 15 16 17 18 19 | /// A simple custom attribute to enable us to easily find user-defined functions in /// the loaded assemblies and initialize them in SQLite as connections are made. /// </summary> [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = true)] public sealed class SQLiteFunctionAttribute : Attribute { private string _name; | | | > > > > > > > > > > > > > > > > > > > > > > > | | | > | | | > > > > > > > > | > > | 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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 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 | /// A simple custom attribute to enable us to easily find user-defined functions in /// the loaded assemblies and initialize them in SQLite as connections are made. /// </summary> [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = true)] public sealed class SQLiteFunctionAttribute : Attribute { private string _name; private int _argumentCount; private FunctionType _functionType; private Type _instanceType; /// <summary> /// Default constructor, initializes the internal variables for the function. /// </summary> public SQLiteFunctionAttribute() : this(String.Empty, -1, FunctionType.Scalar) { // do nothing. } /// <summary> /// Constructs an instance of this class. /// </summary> /// <param name="name"> /// The name of the function, as seen by the SQLite core library. /// </param> /// <param name="argumentCount"> /// The number of arguments that the function will accept. /// </param> /// <param name="functionType"> /// The type of function being declared. This will either be Scalar, /// Aggregate, or Collation. /// </param> public SQLiteFunctionAttribute( string name, int argumentCount, FunctionType functionType ) { _name = name; _argumentCount = argumentCount; _functionType = functionType; _instanceType = null; } /// <summary> /// The function's name as it will be used in SQLite command text. /// </summary> public string Name { get { return _name; } set { _name = value; } } /// <summary> /// The number of arguments this function expects. -1 if the number of arguments is variable. /// </summary> public int Arguments { get { return _argumentCount; } set { _argumentCount = value; } } /// <summary> /// The type of function this implementation will be. /// </summary> public FunctionType FuncType { get { return _functionType; } set { _functionType = value; } } /// <summary> /// The <see cref="System.Type" /> object instance that describes the class /// containing the implementation for the associated function. /// </summary> internal Type InstanceType { get { return _instanceType; } set { _instanceType = value; } } } } |
Changes to Tests/basic.eagle.
︙ | ︙ | |||
2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 | } -cleanup { cleanupDb $fileName unset -nocomplain dateTime db fileName } -constraints \ {eagle monoBug28 command.sql compile.DATA SQLite System.Data.SQLite} -result \ {1 630874007980000000}} ############################################################################### unset -nocomplain systemDataSQLiteDllFile systemDataSQLiteLinqDllFile \ testExeFile testLinqExeFile northwindEfDbFile testLinqOutFile ############################################################################### | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 | } -cleanup { cleanupDb $fileName unset -nocomplain dateTime db fileName } -constraints \ {eagle monoBug28 command.sql compile.DATA SQLite System.Data.SQLite} -result \ {1 630874007980000000}} ############################################################################### runTest {test data-1.50 {bind SQLiteFunction to one SQLiteConnection} -setup { set fileName data-1.50.db } -body { set id [object invoke Interpreter.GetActive NextId] set dataSource [file join [getDatabaseDirectory] $fileName] set sql { \ SELECT MyRandom(); \ } unset -nocomplain results errors set code [compileCSharpWith [subst { using System; using System.Data.SQLite; namespace _Dynamic${id} { public class Test${id} : SQLiteFunction { private Random random; /////////////////////////////////////////////////////////////////////// public Test${id}() { random = new Random(); } /////////////////////////////////////////////////////////////////////// public override object Invoke( object\[\] args ) { return random.Next(); } /////////////////////////////////////////////////////////////////////// public static object DoTest(bool bindFunction) { using (SQLiteConnection connection = new SQLiteConnection( "Data Source=${dataSource};")) { connection.Open(); if (bindFunction) { connection.BindFunction(new SQLiteFunctionAttribute( "MyRandom", 0, FunctionType.Scalar), new Test${id}()); } using (SQLiteCommand command = new SQLiteCommand("${sql}", connection)) { return command.ExecuteScalar(); } } } /////////////////////////////////////////////////////////////////////// public static void Main() { // do nothing. } } } }] true true true results errors System.Data.SQLite.dll] list $code $results \ [expr {[info exists errors] ? $errors : ""}] \ [expr {$code eq "Ok" ? [catch { object invoke _Dynamic${id}.Test${id} DoTest false } result] : [set result ""]}] $result \ [expr {$code eq "Ok" ? [catch { object invoke _Dynamic${id}.Test${id} DoTest true } result] : [set result ""]}] $result \ [expr {$code eq "Ok" ? [catch { object invoke _Dynamic${id}.Test${id} DoTest false } 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} -match \ regexp -result [string map [list \n \r\n] {^Ok\ System#CodeDom#Compiler#CompilerResults#\d+ \{\} 1\ \{System\.Reflection\.TargetInvocationException: Exception has been thrown by\ the target of an invocation\. ---> System\.Data\.SQLite\.SQLiteException: SQL\ logic error or missing database no such function: MyRandom.*\} 0 (?:-)?\d+ 1\ \{System\.Reflection\.TargetInvocationException: Exception has been thrown by\ the target of an invocation\. ---> System\.Data\.SQLite\.SQLiteException: SQL\ logic error or missing database no such function: MyRandom.*\}$}]} ############################################################################### unset -nocomplain systemDataSQLiteDllFile systemDataSQLiteLinqDllFile \ testExeFile testLinqExeFile northwindEfDbFile testLinqOutFile ############################################################################### |
︙ | ︙ |
Changes to readme.htm.
︙ | ︙ | |||
191 192 193 194 195 196 197 198 199 200 201 202 203 204 | </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> | > | 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 | </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>Add SQLiteConnection.BindFunction method to facilitate adding custom functions on a per-connection basis.</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 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> | > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <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>Add SQLiteConnection.BindFunction method to facilitate adding custom functions on a per-connection basis.</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> |
︙ | ︙ |