Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Merge updates from trunk. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | publishWithNuGetPkg |
Files: | files | file ages | folders |
SHA1: |
d48e9010a9a6e2c6b3889112304285a4 |
User & Date: | mistachkin 2014-11-14 00:58:37.696 |
Context
2014-11-19
| ||
00:45 | Make sure the interop files are copied when publishing a project that refers to a NuGet package containing them. Fix for [e796ac82c1]. check-in: ee40baa88e user: mistachkin tags: publishWithNuGetPkg | |
2014-11-14
| ||
00:58 | Merge updates from trunk. check-in: d48e9010a9 user: mistachkin tags: publishWithNuGetPkg | |
00:55 | Wrap SELECT statements in parenthesis if they have an ORDER BY, LIMIT, or OFFSET clause and a compound operator is involved. Fix for [0a32885109]. check-in: a0f4a5ebcf user: mistachkin tags: trunk | |
2014-10-17
| ||
23:08 | Slightly improve build task naming. check-in: a72d3b55ad user: mistachkin tags: publishWithNuGetPkg | |
Changes
Changes to Doc/Extra/Provider/version.html.
︙ | ︙ | |||
41 42 43 44 45 46 47 | </table> </div> <div id="mainSection"> <div id="mainBody"> <h1 class="heading">Version History</h1> <p><b>1.0.95.0 - November XX, 2014 <font color="red">(release scheduled)</font></b></p> <ul> | | > > > | 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | </table> </div> <div id="mainSection"> <div id="mainBody"> <h1 class="heading">Version History</h1> <p><b>1.0.95.0 - November XX, 2014 <font color="red">(release scheduled)</font></b></p> <ul> <li>Updated to <a href="http://www.sqlite.org/releaselog/3_8_7_1.html">SQLite 3.8.7.1</a>.</li> <li>Make sure SQL statements generated for DbUpdateCommandTree objects are properly delimited.</li> <li>Various minor performance enhancements to the SQLiteDataReader class. Pursuant to <a href="http://system.data.sqlite.org/index.html/info/e122d26e70">[e122d26e70]</a>.</li> <li>Defer disposing of connections created by the static SQLiteCommand.Execute method when a data reader is returned. Fix for <a href="http://system.data.sqlite.org/index.html/info/daeaf3150a">[daeaf3150a]</a>.</li> <li>Wrap SELECT statements in parenthesis if they have an ORDER BY, LIMIT, or OFFSET clause and a compound operator is involved. Fix for <a href="http://system.data.sqlite.org/index.html/info/0a32885109">[0a32885109]</a>.</li> <li>In the SQLiteDataReader.VerifyType method, remove duplicate "if" statement for the DbType.SByte value and move the remaining "if" to the Int64 affinity. Fix for <a href="http://system.data.sqlite.org/index.html/info/c5cc2fb334">[c5cc2fb334]</a>. <b>** Potentially Incompatible Change **</b></li> <li>Handle Julian Day values that fall outside of the supported range for OLE Automation dates. Fix for <a href="http://system.data.sqlite.org/index.html/info/3e783eecbe">[3e783eecbe]</a>. <b>** Potentially Incompatible Change **</b></li> </ul> <p><b>1.0.94.0 - September 9, 2014</b></p> <ul> <li>Updated to <a href="http://www.sqlite.org/releaselog/3_8_6.html">SQLite 3.8.6</a>.</li> <li>Updated to <a href="http://www.nuget.org/packages/EntityFramework/6.1.1">Entity Framework 6.1.1</a>.</li> <li>Refactor and simplify NuGet packages in order to support per-solution SQLite interop assembly files. <b>** Potentially Incompatible Change **</b></li> <li>Add RefreshFlags method to the SQLiteDataReader class to forcibly refresh its connection flags.</li> |
︙ | ︙ |
Changes to SQLite.Designer/Editors/TableDesignerDoc.cs.
︙ | ︙ | |||
795 796 797 798 799 800 801 | { case __FRAMESHOW.FRAMESHOW_WinShown: case __FRAMESHOW.FRAMESHOW_WinRestored: SetPropertyWindow(); if (_warned == false) { _warned = true; | | | 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 | { case __FRAMESHOW.FRAMESHOW_WinShown: case __FRAMESHOW.FRAMESHOW_WinRestored: SetPropertyWindow(); if (_warned == false) { _warned = true; MessageBox.Show(this, "The table designer is still in development. Please report bugs to the sqlite-users mailing list at sqlite-users@sqlite.org", "Feature Under Review", MessageBoxButtons.OK); } break; } return VSConstants.S_OK; } int IVsWindowFrameNotify.OnSize() |
︙ | ︙ |
Changes to SQLite.Designer/Editors/ViewDesignerDoc.cs.
︙ | ︙ | |||
564 565 566 567 568 569 570 | case __FRAMESHOW.FRAMESHOW_WinShown: case __FRAMESHOW.FRAMESHOW_WinRestored: _timer.Enabled = true; SetPropertyWindow(); if (_warned == false) { _warned = true; | | | 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 | case __FRAMESHOW.FRAMESHOW_WinShown: case __FRAMESHOW.FRAMESHOW_WinRestored: _timer.Enabled = true; SetPropertyWindow(); if (_warned == false) { _warned = true; MessageBox.Show(this, "The view designer is still in development. Please report bugs to the sqlite-users mailing list at sqlite-users@sqlite.org", "Feature Under Review", MessageBoxButtons.OK); } break; } return VSConstants.S_OK; } int IVsWindowFrameNotify.OnSize() |
︙ | ︙ |
Changes to SQLite.Interop/props/sqlite3.props.
1 2 3 4 5 6 7 8 9 10 11 | <?xml version="1.0" encoding="utf-8"?> <!-- * * sqlite3.props - * * Written by Joe Mistachkin. * Released to the public domain, use at your own risk! * --> <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> <PropertyGroup Label="UserMacros"> | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?xml version="1.0" encoding="utf-8"?> <!-- * * sqlite3.props - * * Written by Joe Mistachkin. * Released to the public domain, use at your own risk! * --> <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> <PropertyGroup Label="UserMacros"> <SQLITE_MANIFEST_VERSION>3.8.7.1</SQLITE_MANIFEST_VERSION> <SQLITE_RC_VERSION>3,8,7,1</SQLITE_RC_VERSION> <SQLITE_COMMON_DEFINES>_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;SQLITE_THREADSAFE=1;SQLITE_USE_URI=1;SQLITE_ENABLE_COLUMN_METADATA=1;SQLITE_ENABLE_STAT4=1;SQLITE_ENABLE_FTS3=1;SQLITE_ENABLE_LOAD_EXTENSION=1;SQLITE_ENABLE_RTREE=1;SQLITE_SOUNDEX=1;SQLITE_ENABLE_MEMORY_MANAGEMENT=1</SQLITE_COMMON_DEFINES> <SQLITE_EXTRA_DEFINES>SQLITE_HAS_CODEC=1</SQLITE_EXTRA_DEFINES> <SQLITE_WINCE_200X_DEFINES>SQLITE_OMIT_WAL=1</SQLITE_WINCE_200X_DEFINES> <SQLITE_WINCE_2013_DEFINES>HAVE_ERRNO_H=1;SQLITE_MSVC_LOCALTIME_API=1</SQLITE_WINCE_2013_DEFINES> <SQLITE_DEBUG_DEFINES>SQLITE_DEBUG=1;SQLITE_MEMDEBUG=1;SQLITE_ENABLE_EXPENSIVE_ASSERT=1</SQLITE_DEBUG_DEFINES> <SQLITE_RELEASE_DEFINES>SQLITE_WIN32_MALLOC=1</SQLITE_RELEASE_DEFINES> <SQLITE_DISABLE_WARNINGS>4055;4100;4127;4146;4210;4232;4244;4245;4267;4306;4389;4701;4703;4706</SQLITE_DISABLE_WARNINGS> |
︙ | ︙ |
Changes to SQLite.Interop/props/sqlite3.vsprops.
︙ | ︙ | |||
10 11 12 13 14 15 16 | <VisualStudioPropertySheet ProjectType="Visual C++" Version="8.00" Name="sqlite3" > <UserMacro Name="SQLITE_MANIFEST_VERSION" | | | | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <VisualStudioPropertySheet ProjectType="Visual C++" Version="8.00" Name="sqlite3" > <UserMacro Name="SQLITE_MANIFEST_VERSION" Value="3.8.7.1" PerformEnvironmentSet="true" /> <UserMacro Name="SQLITE_RC_VERSION" Value="3,8,7,1" PerformEnvironmentSet="true" /> <UserMacro Name="SQLITE_COMMON_DEFINES" Value="_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;SQLITE_THREADSAFE=1;SQLITE_USE_URI=1;SQLITE_ENABLE_COLUMN_METADATA=1;SQLITE_ENABLE_STAT4=1;SQLITE_ENABLE_FTS3=1;SQLITE_ENABLE_LOAD_EXTENSION=1;SQLITE_ENABLE_RTREE=1;SQLITE_SOUNDEX=1;SQLITE_ENABLE_MEMORY_MANAGEMENT=1" PerformEnvironmentSet="true" /> |
︙ | ︙ |
Changes to SQLite.Interop/src/core/sqlite3.c.
1 2 | /****************************************************************************** ** This file is an amalgamation of many separate C source files from SQLite | | | 1 2 3 4 5 6 7 8 9 10 | /****************************************************************************** ** This file is an amalgamation of many separate C source files from SQLite ** version 3.8.7.1. By combining all the individual C code files into this ** single large file, the entire code can be compiled as a single translation ** unit. This allows many compilers to do optimizations that would not be ** possible if the files were compiled separately. Performance improvements ** of 5% or more are commonly seen when SQLite is compiled as a single ** translation unit. ** ** This file is all you need to compile SQLite. To use SQLite in other |
︙ | ︙ | |||
227 228 229 230 231 232 233 | ** string contains the date and time of the check-in (UTC) and an SHA1 ** hash of the entire source tree. ** ** See also: [sqlite3_libversion()], ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ | | | | 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 | ** string contains the date and time of the check-in (UTC) and an SHA1 ** hash of the entire source tree. ** ** See also: [sqlite3_libversion()], ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ #define SQLITE_VERSION "3.8.7.1" #define SQLITE_VERSION_NUMBER 3008007 #define SQLITE_SOURCE_ID "2014-10-29 13:59:56 3b7b72c4685aa5cf5e675c2c47ebec10d9704221" /* ** CAPI3REF: Run-Time Library Version Numbers ** KEYWORDS: sqlite3_version, sqlite3_sourceid ** ** These interfaces provide the same information as the [SQLITE_VERSION], ** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros |
︙ | ︙ | |||
20752 20753 20754 20755 20756 20757 20758 | /* ** If the strchrnul() library function is available, then set ** HAVE_STRCHRNUL. If that routine is not available, this module ** will supply its own. The built-in version is slower than ** the glibc version so the glibc version is definitely preferred. */ #if !defined(HAVE_STRCHRNUL) | < < < | < | 20752 20753 20754 20755 20756 20757 20758 20759 20760 20761 20762 20763 20764 20765 20766 | /* ** If the strchrnul() library function is available, then set ** HAVE_STRCHRNUL. If that routine is not available, this module ** will supply its own. The built-in version is slower than ** the glibc version so the glibc version is definitely preferred. */ #if !defined(HAVE_STRCHRNUL) # define HAVE_STRCHRNUL 0 #endif /* ** Conversion types fall into various categories as defined by the ** following enumeration. */ |
︙ | ︙ | |||
42802 42803 42804 42805 42806 42807 42808 42809 42810 42811 42812 42813 42814 42815 | assert( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ); sqlite3OsClose(pPager->jfd); }else if( pPager->journalMode==PAGER_JOURNALMODE_TRUNCATE ){ if( pPager->journalOff==0 ){ rc = SQLITE_OK; }else{ rc = sqlite3OsTruncate(pPager->jfd, 0); } pPager->journalOff = 0; }else if( pPager->journalMode==PAGER_JOURNALMODE_PERSIST || (pPager->exclusiveMode && pPager->journalMode!=PAGER_JOURNALMODE_WAL) ){ rc = zeroJournalHdr(pPager, hasMaster); pPager->journalOff = 0; | > > > > > > > > | 42798 42799 42800 42801 42802 42803 42804 42805 42806 42807 42808 42809 42810 42811 42812 42813 42814 42815 42816 42817 42818 42819 | assert( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ); sqlite3OsClose(pPager->jfd); }else if( pPager->journalMode==PAGER_JOURNALMODE_TRUNCATE ){ if( pPager->journalOff==0 ){ rc = SQLITE_OK; }else{ rc = sqlite3OsTruncate(pPager->jfd, 0); if( rc==SQLITE_OK && pPager->fullSync ){ /* Make sure the new file size is written into the inode right away. ** Otherwise the journal might resurrect following a power loss and ** cause the last transaction to roll back. See ** https://bugzilla.mozilla.org/show_bug.cgi?id=1072773 */ rc = sqlite3OsSync(pPager->jfd, pPager->syncFlags); } } pPager->journalOff = 0; }else if( pPager->journalMode==PAGER_JOURNALMODE_PERSIST || (pPager->exclusiveMode && pPager->journalMode!=PAGER_JOURNALMODE_WAL) ){ rc = zeroJournalHdr(pPager, hasMaster); pPager->journalOff = 0; |
︙ | ︙ | |||
71439 71440 71441 71442 71443 71444 71445 | ** still not up to p2, that means that the record has fewer than p2 ** columns. So the result will be either the default value or a NULL. */ if( pC->nHdrParsed<=p2 ){ if( pOp->p4type==P4_MEM ){ sqlite3VdbeMemShallowCopy(pDest, pOp->p4.pMem, MEM_Static); }else{ | | | 71443 71444 71445 71446 71447 71448 71449 71450 71451 71452 71453 71454 71455 71456 71457 | ** still not up to p2, that means that the record has fewer than p2 ** columns. So the result will be either the default value or a NULL. */ if( pC->nHdrParsed<=p2 ){ if( pOp->p4type==P4_MEM ){ sqlite3VdbeMemShallowCopy(pDest, pOp->p4.pMem, MEM_Static); }else{ sqlite3VdbeMemSetNull(pDest); } goto op_column_out; } } /* Extract the content for the p2+1-th column. Control can only ** reach this point if aOffset[p2], aOffset[p2+1], and pC->aType[p2] are |
︙ | ︙ | |||
93753 93754 93755 93756 93757 93758 93759 | ** where-clause loop above. */ if( okOnePass ){ /* Just one row. Hence the top-of-loop is a no-op */ assert( nKey==nPk ); /* OP_Found will use an unpacked key */ assert( !IsVirtual(pTab) ); if( aToOpen[iDataCur-iTabCur] ){ | | | 93757 93758 93759 93760 93761 93762 93763 93764 93765 93766 93767 93768 93769 93770 93771 | ** where-clause loop above. */ if( okOnePass ){ /* Just one row. Hence the top-of-loop is a no-op */ assert( nKey==nPk ); /* OP_Found will use an unpacked key */ assert( !IsVirtual(pTab) ); if( aToOpen[iDataCur-iTabCur] ){ assert( pPk!=0 || pTab->pSelect!=0 ); sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, addrBypass, iKey, nKey); VdbeCoverage(v); } }else if( pPk ){ addrLoop = sqlite3VdbeAddOp1(v, OP_Rewind, iEphCur); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_RowKey, iEphCur, iKey); assert( nKey==0 ); /* OP_Found will use a composite key */ |
︙ | ︙ | |||
111277 111278 111279 111280 111281 111282 111283 | } sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, iBaseCur, aToOpen, 0, 0); } /* Top of the update loop */ if( okOnePass ){ | | | | 111281 111282 111283 111284 111285 111286 111287 111288 111289 111290 111291 111292 111293 111294 111295 111296 | } sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, iBaseCur, aToOpen, 0, 0); } /* Top of the update loop */ if( okOnePass ){ if( aToOpen[iDataCur-iBaseCur] && !isView ){ assert( pPk ); sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelBreak, regKey, nKey); VdbeCoverageNeverTaken(v); } labelContinue = labelBreak; sqlite3VdbeAddOp2(v, OP_IsNull, pPk ? regKey : regOldRowid, labelBreak); VdbeCoverageIf(v, pPk==0); VdbeCoverageIf(v, pPk!=0); |
︙ | ︙ |
Changes to SQLite.Interop/src/core/sqlite3.h.
︙ | ︙ | |||
103 104 105 106 107 108 109 | ** string contains the date and time of the check-in (UTC) and an SHA1 ** hash of the entire source tree. ** ** See also: [sqlite3_libversion()], ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ | | | | 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | ** string contains the date and time of the check-in (UTC) and an SHA1 ** hash of the entire source tree. ** ** See also: [sqlite3_libversion()], ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ #define SQLITE_VERSION "3.8.7.1" #define SQLITE_VERSION_NUMBER 3008007 #define SQLITE_SOURCE_ID "2014-10-29 13:59:56 3b7b72c4685aa5cf5e675c2c47ebec10d9704221" /* ** CAPI3REF: Run-Time Library Version Numbers ** KEYWORDS: sqlite3_version, sqlite3_sourceid ** ** These interfaces provide the same information as the [SQLITE_VERSION], ** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros |
︙ | ︙ |
Changes to System.Data.SQLite.Linq/SQL Generation/SqlGenerator.cs.
︙ | ︙ | |||
2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 | return result; } ISqlFragment VisitSetOpExpression(DbExpression left, DbExpression right, string separator) { SqlSelectStatement leftSelectStatement = VisitExpressionEnsureSqlStatement(left); SqlSelectStatement rightSelectStatement = VisitExpressionEnsureSqlStatement(right); SqlBuilder setStatement = new SqlBuilder(); setStatement.Append(leftSelectStatement); setStatement.AppendLine(); setStatement.Append(separator); // e.g. UNION ALL setStatement.AppendLine(); setStatement.Append(rightSelectStatement); return setStatement; } #endregion | > > > > > > > > > > > > > > > > > | 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 2500 2501 2502 2503 2504 | return result; } ISqlFragment VisitSetOpExpression(DbExpression left, DbExpression right, string separator) { SqlSelectStatement leftSelectStatement = VisitExpressionEnsureSqlStatement(left); bool leftOrderByLimitOrOffset = leftSelectStatement.HaveOrderByLimitOrOffset(); SqlSelectStatement rightSelectStatement = VisitExpressionEnsureSqlStatement(right); bool rightOrderByLimitOrOffset = rightSelectStatement.HaveOrderByLimitOrOffset(); SqlBuilder setStatement = new SqlBuilder(); if (leftOrderByLimitOrOffset) setStatement.Append("SELECT * FROM ("); setStatement.Append(leftSelectStatement); if (leftOrderByLimitOrOffset) setStatement.Append(") "); setStatement.AppendLine(); setStatement.Append(separator); // e.g. UNION ALL setStatement.AppendLine(); if (rightOrderByLimitOrOffset) setStatement.Append("SELECT * FROM ("); setStatement.Append(rightSelectStatement); if (rightOrderByLimitOrOffset) setStatement.Append(") "); return setStatement; } #endregion |
︙ | ︙ |
Changes to System.Data.SQLite.Linq/SQL Generation/SqlSelectStatement.cs.
︙ | ︙ | |||
191 192 193 194 195 196 197 198 199 200 201 202 203 204 | // if not Order By should be omitted unless there is a corresponding TOP private bool isTopMost; internal bool IsTopMost { get { return this.isTopMost; } set { this.isTopMost = value; } } #region ISqlFragment Members /// <summary> /// Write out a SQL select statement as a string. /// We have to /// <list type="number"> | > > > > > > > > > > > > > > > > > > > > > | 191 192 193 194 195 196 197 198 199 200 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 | // if not Order By should be omitted unless there is a corresponding TOP private bool isTopMost; internal bool IsTopMost { get { return this.isTopMost; } set { this.isTopMost = value; } } /// <summary> /// Checks if the statement has an ORDER BY, LIMIT, or OFFSET clause. /// </summary> /// <returns> /// Non-zero if there is an ORDER BY, LIMIT, or OFFSET clause; /// otherwise, zero. /// </returns> public bool HaveOrderByLimitOrOffset() { if ((this.orderBy != null) && !this.orderBy.IsEmpty) return true; if (this.top != null) return true; if (this.skip != null) return true; return false; } #region ISqlFragment Members /// <summary> /// Write out a SQL select statement as a string. /// We have to /// <list type="number"> |
︙ | ︙ |
Changes to System.Data.SQLite/SQLiteCommand.cs.
︙ | ︙ | |||
702 703 704 705 706 707 708 | return Execute( commandText, executeType, CommandBehavior.Default, connectionString, args); } /// <summary> /// This method creates a new connection, executes the query using the given | | | | | 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 | return Execute( commandText, executeType, CommandBehavior.Default, connectionString, args); } /// <summary> /// This method creates a new connection, executes the query using the given /// execution type and command behavior, closes the connection unless a data /// reader is created, and returns the results. If the connection string is /// null, a temporary in-memory database connection will be used. /// </summary> /// <param name="commandText"> /// The text of the command to be executed. /// </param> /// <param name="executeType"> /// The execution type for the command. This is used to determine which method /// of the command object to call, which then determines the type of results |
︙ | ︙ | |||
737 738 739 740 741 742 743 | string commandText, SQLiteExecuteType executeType, CommandBehavior commandBehavior, string connectionString, params object[] args ) { | > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > > > > > > > > > | > | > > > > | > > > > > > > > > > > > | > > > > > > > > > > > > > > > > | 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 847 848 | string commandText, SQLiteExecuteType executeType, CommandBehavior commandBehavior, string connectionString, params object[] args ) { SQLiteConnection connection = null; try { if (connectionString == null) connectionString = DefaultConnectionString; using (connection = new SQLiteConnection(connectionString)) { connection.Open(); using (SQLiteCommand command = connection.CreateCommand()) { command.CommandText = commandText; if (args != null) { foreach (object arg in args) { if (arg is SQLiteParameter) command.Parameters.Add((SQLiteParameter)arg); else command.Parameters.Add(new SQLiteParameter(DbType.Object, arg)); } } switch (executeType) { case SQLiteExecuteType.None: { // // NOTE: Do nothing. // break; } case SQLiteExecuteType.NonQuery: { return command.ExecuteNonQuery(commandBehavior); } case SQLiteExecuteType.Scalar: { return command.ExecuteScalar(commandBehavior); } case SQLiteExecuteType.Reader: { bool success = true; try { // // NOTE: The CloseConnection flag is being added here. // This should force the returned data reader to // close the connection when it is disposed. In // order to prevent the containing using block // from disposing the connection prematurely, // the innermost finally block sets the internal // no-disposal flag to true. The outer finally // block will reset the internal no-disposal flag // to false so that the data reader will be able // to (eventually) dispose of the connection. // return command.ExecuteReader( commandBehavior | CommandBehavior.CloseConnection); } catch { success = false; throw; } finally { // // NOTE: If an exception was not thrown, that can only // mean the data reader was successfully created // and now owns the connection. Therefore, set // the internal no-disposal flag (temporarily) // in order to exit the containing using block // without disposing it. // if (success) connection._noDispose = true; } } } } } } finally { // // NOTE: Now that the using block has been exited, reset the // internal disposal flag for the connection. This is // always done if the connection was created because // it will be harmless whether or not the data reader // now owns it. // if (connection != null) connection._noDispose = false; } return null; } /// <summary> /// Overrides the default behavior to return a SQLiteDataReader specialization class |
︙ | ︙ |
Changes to System.Data.SQLite/SQLiteConnection.cs.
︙ | ︙ | |||
320 321 322 323 324 325 326 | /// <b>False</b> - Skip attempting to expand the data source file name to a fully qualified path before opening. /// </description> /// <description>N</description> /// <description>True</description> /// </item> /// </list> /// </remarks> | | | 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 | /// <b>False</b> - Skip attempting to expand the data source file name to a fully qualified path before opening. /// </description> /// <description>N</description> /// <description>True</description> /// </item> /// </list> /// </remarks> public sealed partial class SQLiteConnection : DbConnection, ICloneable, IDisposable { #region Private Constants /// <summary> /// The "invalid value" for the <see cref="DbType" /> enumeration used /// by the <see cref="DefaultDbType" /> property. This constant is shared /// by this class and the SQLiteConnectionStringBuilder class. /// </summary> |
︙ | ︙ | |||
430 431 432 433 434 435 436 437 438 439 440 441 442 443 | /// </summary> private string _connectionString; /// <summary> /// Nesting level of the transactions open on the connection /// </summary> internal int _transactionLevel; /// <summary> /// If set, then the connection is currently being disposed. /// </summary> private bool _disposing; /// <summary> /// The default isolation level for new transactions | > > > > > > > | 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 | /// </summary> private string _connectionString; /// <summary> /// Nesting level of the transactions open on the connection /// </summary> internal int _transactionLevel; /// <summary> /// If this flag is non-zero, the <see cref="Dispose()" /> method will have /// no effect; however, the <see cref="Close" /> method will continue to /// behave as normal. /// </summary> internal bool _noDispose; /// <summary> /// If set, then the connection is currently being disposed. /// </summary> private bool _disposing; /// <summary> /// The default isolation level for new transactions |
︙ | ︙ | |||
603 604 605 606 607 608 609 610 611 612 613 614 615 616 | /// </param> /// <param name="parseViaFramework"> /// Non-zero to parse the connection string using the built-in (i.e. /// framework provided) parser when opening the connection. /// </param> public SQLiteConnection(string connectionString, bool parseViaFramework) { #if (SQLITE_STANDARD || USE_INTEROP_DLL || PLATFORM_COMPACTFRAMEWORK) && PRELOAD_NATIVE_LIBRARY UnsafeNativeMethods.Initialize(); #endif SQLiteLog.Initialize(); #if !PLATFORM_COMPACTFRAMEWORK && !INTEROP_LEGACY_CLOSE && SQLITE_STANDARD | > > | 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 | /// </param> /// <param name="parseViaFramework"> /// Non-zero to parse the connection string using the built-in (i.e. /// framework provided) parser when opening the connection. /// </param> public SQLiteConnection(string connectionString, bool parseViaFramework) { _noDispose = false; #if (SQLITE_STANDARD || USE_INTEROP_DLL || PLATFORM_COMPACTFRAMEWORK) && PRELOAD_NATIVE_LIBRARY UnsafeNativeMethods.Initialize(); #endif SQLiteLog.Initialize(); #if !PLATFORM_COMPACTFRAMEWORK && !INTEROP_LEGACY_CLOSE && SQLITE_STANDARD |
︙ | ︙ | |||
1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 | dateFormat, kind, dateTimeFormat, IntPtr.Zero, null, false); } } /////////////////////////////////////////////////////////////////////////////////////////////// #region IDisposable "Pattern" Members private bool disposed; private void CheckDisposed() /* throw */ { #if THROW_ON_DISPOSED if (disposed) throw new ObjectDisposedException(typeof(SQLiteConnection).Name); #endif } /////////////////////////////////////////////////////////////////////////////////////////////// protected override void Dispose(bool disposing) { _disposing = true; try { if (!disposed) { //if (disposing) | > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 | dateFormat, kind, dateTimeFormat, IntPtr.Zero, null, false); } } /////////////////////////////////////////////////////////////////////////////////////////////// #region IDisposable Members /// <summary> /// Disposes and finalizes the connection, if applicable. /// </summary> public new void Dispose() { if (_noDispose) return; base.Dispose(); } #endregion /////////////////////////////////////////////////////////////////////////////////////////////// #region IDisposable "Pattern" Members private bool disposed; private void CheckDisposed() /* throw */ { #if THROW_ON_DISPOSED if (disposed) throw new ObjectDisposedException(typeof(SQLiteConnection).Name); #endif } /////////////////////////////////////////////////////////////////////////////////////////////// protected override void Dispose(bool disposing) { #if !NET_COMPACT_20 && TRACE_WARNING if ((_flags & SQLiteConnectionFlags.TraceWarning) == SQLiteConnectionFlags.TraceWarning) { if (_noDispose) { System.Diagnostics.Trace.WriteLine(String.Format(CultureInfo.CurrentCulture, "WARNING: Disposing of connection \"{0}\" with the no-dispose flag set.", _connectionString)); } } #endif _disposing = true; try { if (!disposed) { //if (disposing) |
︙ | ︙ |
Changes to System.Data.SQLite/SQLiteConvert.cs.
︙ | ︙ | |||
37 38 39 40 41 42 43 44 | /// <summary> /// The value for the Unix epoch (e.g. January 1, 1970 at midnight, in UTC). /// </summary> protected static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); /// <summary> | > | > > > > > > > > > > > > > > | 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 | /// <summary> /// The value for the Unix epoch (e.g. January 1, 1970 at midnight, in UTC). /// </summary> protected static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); #pragma warning disable 414 /// <summary> /// The value of the OLE Automation epoch represented as a Julian day. This /// field cannot be removed as the test suite relies upon it. /// </summary> private static readonly double OleAutomationEpochAsJulianDay = 2415018.5; #pragma warning restore 414 /// <summary> /// The format string for DateTime values when using the InvariantCulture or CurrentCulture formats. /// </summary> private const string FullFormat = "yyyy-MM-ddTHH:mm:ss.fffffffK"; /// <summary> /// This is the minimum Julian Day value supported by this library /// (148731163200000). /// </summary> private static readonly long MinimumJd = computeJD(DateTime.MinValue); /// <summary> /// This is the maximum Julian Day value supported by this library /// (464269060799000). /// </summary> private static readonly long MaximumJd = computeJD(DateTime.MaxValue); /// <summary> /// An array of ISO-8601 DateTime formats that we support parsing. /// </summary> private static string[] _datetimeFormats = new string[] { "THHmmssK", "THHmmK", "HH:mm:ss.FFFFFFFK", |
︙ | ︙ | |||
197 198 199 200 201 202 203 | byte[] byteArray = new byte[nativestringlen]; Marshal.Copy(nativestring, byteArray, 0, nativestringlen); return _utf8.GetString(byteArray, 0, nativestringlen); } | | < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 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 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 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 | byte[] byteArray = new byte[nativestringlen]; Marshal.Copy(nativestring, byteArray, 0, nativestringlen); return _utf8.GetString(byteArray, 0, nativestringlen); } #endregion /////////////////////////////////////////////////////////////////////////// #region DateTime Conversion Functions #region New Julian Day Conversion Methods /// <summary> /// Checks if the specified <see cref="Int64" /> is within the /// supported range for a Julian Day value. /// </summary> /// <param name="jd"> /// The Julian Day value to check. /// </param> /// <returns> /// Non-zero if the specified Julian Day value is in the supported /// range; otherwise, zero. /// </returns> private static bool isValidJd( long jd ) { return ((jd >= MinimumJd) && (jd <= MaximumJd)); } /////////////////////////////////////////////////////////////////////////// /// <summary> /// Converts a Julian Day value from a <see cref="Double" /> to an /// <see cref="Int64" />. /// </summary> /// <param name="julianDay"> /// The Julian Day <see cref="Double" /> value to convert. /// </param> /// <returns> /// The resulting Julian Day <see cref="Int64" /> value. /// </returns> private static long DoubleToJd( double julianDay ) { return (long)(julianDay * 86400000.0); } /////////////////////////////////////////////////////////////////////////// /// <summary> /// Converts a Julian Day value from an <see cref="Int64" /> to a /// <see cref="Double" />. /// </summary> /// <param name="jd"> /// The Julian Day <see cref="Int64" /> value to convert. /// </param> /// <returns> /// The resulting Julian Day <see cref="Double" /> value. /// </returns> private static double JdToDouble( long jd ) { return (double)(jd / 86400000.0); } /////////////////////////////////////////////////////////////////////////// /// <summary> /// Converts a Julian Day value to a <see cref="DateTime" />. /// This method was translated from the "computeYMD" function in the /// "date.c" file belonging to the SQLite core library. /// </summary> /// <param name="jd"> /// The Julian Day value to convert. /// </param> /// <param name="badValue"> /// The <see cref="DateTime" /> value to return in the event that the /// Julian Day is out of the supported range. If this value is null, /// an exception will be thrown instead. /// </param> /// <returns> /// A <see cref="DateTime" /> value that contains the year, month, and /// day values that are closest to the specified Julian Day value. /// </returns> private static DateTime computeYMD( long jd, DateTime? badValue ) { if (!isValidJd(jd)) { if (badValue == null) { throw new ArgumentException( "Not a supported Julian Day value."); } return (DateTime)badValue; } int Z, A, B, C, D, E, X1; Z = (int)((jd + 43200000) / 86400000); A = (int)((Z - 1867216.25) / 36524.25); A = Z + 1 + A - (A / 4); B = A + 1524; C = (int)((B - 122.1) / 365.25); D = (36525 * C) / 100; E = (int)((B - D) / 30.6001); X1 = (int)(30.6001 * E); int day, month, year; day = B - D - X1; month = E < 14 ? E - 1 : E - 13; year = month > 2 ? C - 4716 : C - 4715; try { return new DateTime(year, month, day); } catch { if (badValue == null) throw; return (DateTime)badValue; } } /////////////////////////////////////////////////////////////////////////// /// <summary> /// Converts a Julian Day value to a <see cref="DateTime" />. /// This method was translated from the "computeHMS" function in the /// "date.c" file belonging to the SQLite core library. /// </summary> /// <param name="jd"> /// The Julian Day value to convert. /// </param> /// <param name="badValue"> /// The <see cref="DateTime" /> value to return in the event that the /// Julian Day value is out of the supported range. If this value is /// null, an exception will be thrown instead. /// </param> /// <returns> /// A <see cref="DateTime" /> value that contains the hour, minute, and /// second, and millisecond values that are closest to the specified /// Julian Day value. /// </returns> private static DateTime computeHMS( long jd, DateTime? badValue ) { if (!isValidJd(jd)) { if (badValue == null) { throw new ArgumentException( "Not a supported Julian Day value."); } return (DateTime)badValue; } int si; si = (int)((jd + 43200000) % 86400000); decimal sd; sd = si / 1000.0M; si = (int)sd; int millisecond = (int)((sd - si) * 1000.0M); sd -= si; int hour; hour = si / 3600; si -= hour * 3600; int minute; minute = si / 60; sd += si - minute * 60; int second = (int)sd; try { DateTime minValue = DateTime.MinValue; return new DateTime( minValue.Year, minValue.Month, minValue.Day, hour, minute, second, millisecond); } catch { if (badValue == null) throw; return (DateTime)badValue; } } /////////////////////////////////////////////////////////////////////////// /// <summary> /// Converts a <see cref="DateTime" /> to a Julian Day value. /// This method was translated from the "computeJD" function in /// the "date.c" file belonging to the SQLite core library. /// Since the range of Julian Day values supported by this method /// includes all possible (valid) values of a <see cref="DateTime" /> /// value, it should be extremely difficult for this method to /// raise an exception or return an undefined result. /// </summary> /// <param name="dateTime"> /// The <see cref="DateTime" /> value to convert. This value /// will be within the range of <see cref="DateTime.MinValue" /> /// (00:00:00.0000000, January 1, 0001) to /// <see cref="DateTime.MaxValue" /> (23:59:59.9999999, December /// 31, 9999). /// </param> /// <returns> /// The nearest Julian Day value corresponding to the specified /// <see cref="DateTime" /> value. /// </returns> private static long computeJD( DateTime dateTime ) { int Y, M, D; Y = dateTime.Year; M = dateTime.Month; D = dateTime.Day; if (M <= 2) { Y--; M += 12; } int A, B, X1, X2; A = Y / 100; B = 2 - A + (A / 4); X1 = 36525 * (Y + 4716) / 100; X2 = 306001 * (M + 1) / 10000; long jd; jd = (long)((X1 + X2 + D + B - 1524.5) * 86400000); jd += (dateTime.Hour * 3600000) + (dateTime.Minute * 60000) + (dateTime.Second * 1000) + dateTime.Millisecond; return jd; } #endregion /////////////////////////////////////////////////////////////////////////// /// <summary> /// Converts a string into a DateTime, using the DateTimeFormat, DateTimeKind, /// and DateTimeFormatString specified for the connection when it was opened. /// </summary> /// <remarks> /// Acceptable ISO8601 DateTime formats are: /// <list type="bullet"> |
︙ | ︙ | |||
404 405 406 407 408 409 410 | /// <summary> /// Converts a julianday value into a DateTime /// </summary> /// <param name="julianDay">The value to convert</param> /// <param name="kind">The DateTimeKind to use.</param> /// <returns>A .NET DateTime</returns> | | > > > > | > | > > > > | 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 | /// <summary> /// Converts a julianday value into a DateTime /// </summary> /// <param name="julianDay">The value to convert</param> /// <param name="kind">The DateTimeKind to use.</param> /// <returns>A .NET DateTime</returns> public static DateTime ToDateTime( double julianDay, DateTimeKind kind ) { long jd = DoubleToJd(julianDay); DateTime dateTimeYMD = computeYMD(jd, null); DateTime dateTimeHMS = computeHMS(jd, null); return new DateTime( dateTimeYMD.Year, dateTimeYMD.Month, dateTimeYMD.Day, dateTimeHMS.Hour, dateTimeHMS.Minute, dateTimeHMS.Second, dateTimeHMS.Millisecond, kind); } /// <summary> /// Converts the specified number of seconds from the Unix epoch into a /// <see cref="DateTime" /> value. /// </summary> /// <param name="seconds"> |
︙ | ︙ | |||
453 454 455 456 457 458 459 | /// <summary> /// Converts a DateTime struct to a JulianDay double /// </summary> /// <param name="value">The DateTime to convert</param> /// <returns>The JulianDay value the Datetime represents</returns> public static double ToJulianDay(DateTime value) { | | | 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 | /// <summary> /// Converts a DateTime struct to a JulianDay double /// </summary> /// <param name="value">The DateTime to convert</param> /// <returns>The JulianDay value the Datetime represents</returns> public static double ToJulianDay(DateTime value) { return JdToDouble(computeJD(value)); } /// <summary> /// Converts a DateTime struct to the whole number of seconds since the /// Unix epoch. /// </summary> /// <param name="value">The DateTime to convert</param> |
︙ | ︙ |
Added Tests/tkt-0a32885109.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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | ############################################################################### # # tkt-0a32885109.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 runSQLiteTestFilesPrologue ############################################################################### runTest {test tkt-0a32885109-1.1 {LINQ compound-operator handling} -body { # # NOTE: Re-copy the reference database file used for this unit test to the # build directory in case it has been changed by a previous test run. # file copy -force $northwindEfDbFile \ [file join [getBuildDirectory] [file tail $northwindEfDbFile]] set result [list] set output "" set code [catch { testClrExec $testLinqExeFile [list -eventflags Wait -directory \ [file dirname $testLinqExeFile] -nocarriagereturns -stdout output \ -success 0] -unionall } error] tlog "---- BEGIN STDOUT OUTPUT\n" tlog $output tlog "\n---- END STDOUT OUTPUT\n" lappend result $code if {$code == 0} then { lappend result [string trim $output] } else { lappend result [string trim $error] } set result } -cleanup { unset -nocomplain code output error result } -constraints {eagle monoToDo SQLite file_System.Data.SQLite.dll testExec\ file_System.Data.SQLite.Linq.dll file_testlinq.exe file_northwindEF.db} \ -result {0 {WHITC ANATR BERGS WHITC ANATR WHITC ANATR BERGS}}} ############################################################################### runSQLiteTestFilesEpilogue runSQLiteTestEpilogue runTestEpilogue |
Added Tests/tkt-3e783eecbe.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 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 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 | ############################################################################### # # tkt-3e783eecbe.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-3e783eecbe-1.1 {To Julian Day w/o OLE Automation} -setup { set minDateTime [object invoke -create -alias DateTime MinValue] set maxDateTime [object invoke -create -alias DateTime MaxValue] set dateTimeValues [list $minDateTime "0099-12-31 00:00:00" \ "0100-01-01 00:00:00" $maxDateTime] } -body { set results [list] foreach dateTimeValue $dateTimeValues { if {$dateTimeValue ni [info objects]} then { set dateTimeValue [object invoke \ -create DateTime ParseExact $dateTimeValue \ [getDateTimeFormat] null] set dateTimeValue [object invoke -create -alias \ DateTime SpecifyKind $dateTimeValue Utc] } set code [catch { object invoke System.Data.SQLite.SQLiteConvert ToJulianDay \ $dateTimeValue } result] if {$code != 0} then { regexp -- {---> (.*?):} $result result result regexp -- {(System\..*?):} $result result result } lappend results [list [$dateTimeValue ToString [getDateTimeFormat]] \ $code $result] } set results } -cleanup { unset -nocomplain code result results dateTimeValue dateTimeValues \ maxDateTime minDateTime } -constraints {eagle System.Data.SQLite} -result {{{0001-01-01 00:00:00} 0\ 1721425.5} {{0099-12-31 00:00:00Z} 0 1757583.5} {{0100-01-01 00:00:00Z} 0\ 1757584.5} {{9999-12-31 23:59:59.9999999} 0 5373484.49999999}}} ############################################################################### runTest {test tkt-3e783eecbe-1.2 {From Julian Day w/o OLE Automation} -setup { set minDoubleValue [object invoke -create -alias Double MinValue] set maxDoubleValue [object invoke -create -alias Double MaxValue] set doubleValues [list \ $minDoubleValue -1.0 0.0 1.0 1721425.5 1757583.5 2451910.5 \ 2456962.0 5373484.49999998 5373484.49999999 $maxDoubleValue] } -body { set results [list] foreach doubleValue $doubleValues { if {$doubleValue ni [info objects]} then { set doubleValue [object invoke \ -create -alias Double Parse $doubleValue] } set code [catch { set dateTimeValue [object invoke -create -alias \ System.Data.SQLite.SQLiteConvert ToDateTime $doubleValue Utc] $dateTimeValue ToString [getDateTimeFormat] } result] if {$code != 0} then { regexp -- {---> (.*?):} $result result result regexp -- {(System\..*?):} $result result result } lappend results [list [$doubleValue ToString] $code $result] } set results } -cleanup { unset -nocomplain code result results dateTimeValue doubleValue \ doubleValues maxDoubleValue minDoubleValue } -constraints {eagle System.Data.SQLite} -result {{-1.79769313486232E+308 1\ System.ArgumentException} {-1 1 System.ArgumentException} {0 1\ System.ArgumentException} {1 1 System.ArgumentException} {1721425.5 0\ {0001-01-01 00:00:00Z}} {1757583.5 0 {0099-12-31 00:00:00Z}} {2451910.5 0\ {2001-01-01 00:00:00Z}} {2456962 0 {2014-10-31 12:00:00Z}} {5373484.49999998 0\ {9999-12-31 23:59:59.998Z}} {5373484.49999999 0 {9999-12-31 23:59:59.999Z}}\ {1.79769313486232E+308 1 System.ArgumentException}}} ############################################################################### runTest {test tkt-3e783eecbe-1.3 {Julian Day storage} -setup { set doubleValues [list \ -1.0 0.0 1.0 1721425.5 1757583.5 2451910.5 2456962.0 \ 5373484.49999998 5373484.49999999] setupDb [set fileName tkt-3e783eecbe-1.3.db] "" JulianDay } -body { sql execute $db "CREATE TABLE t1(x INTEGER, y DATETIME);" set i 1 set results [list] foreach doubleValue $doubleValues { if {$doubleValue ni [info objects]} then { set doubleValue [object invoke \ -create -alias Double Parse $doubleValue] } set code [catch { sql execute $db "INSERT INTO t1 (x, y) VALUES(?, ?);" \ [list param1 Int32 $i] [list param2 Double $doubleValue] sql execute -execute reader -format list -datetimeformat \ [getDateTimeFormat] $db "SELECT y FROM t1 WHERE x = ?;" \ [list param1 Int32 $i] } result] if {$code != 0} then { regexp -- {---> (.*?):} $result result result regexp -- {(System\..*?):} $result result result } lappend results [list [$doubleValue ToString] $code $result] incr i } set results } -cleanup { unset -nocomplain code result results i dateTimeValue doubleValue \ doubleValues maxDoubleValue minDoubleValue cleanupDb $fileName unset -nocomplain db fileName } -constraints \ {eagle monoBug28 command.sql compile.DATA SQLite System.Data.SQLite} -result \ {{-1 1 System.ArgumentException} {0 1 System.ArgumentException} {1 1\ System.ArgumentException} {1721425.5 0 {{0001-01-01 00:00:00}}} {1757583.5 0\ {{0099-12-31 00:00:00}}} {2451910.5 0 {{2001-01-01 00:00:00}}} {2456962 0\ {{2014-10-31 12:00:00}}} {5373484.49999998 0 {{9999-12-31 23:59:59.998}}}\ {5373484.49999999 0 {{9999-12-31 23:59:59.999}}}}} ############################################################################### runSQLiteTestEpilogue runTestEpilogue |
Added Tests/tkt-daeaf3150a.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 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 | ############################################################################### # # tkt-daeaf3150a.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-daeaf3150a-1.1 {static Execute connection disposal} -setup { unset -nocomplain result sql } -body { set sql(1) { \ CREATE TABLE t1(x); \ INSERT INTO t1 (x) VALUES (NULL); \ SELECT x FROM t1 ORDER BY x; \ } set sql(2) { \ CREATE TABLE t1(x); \ INSERT INTO t1 (x) VALUES (?); \ SELECT x FROM t1 ORDER BY x; \ } set result(1) [object invoke System.Data.SQLite.SQLiteCommand Execute \ "this will not execute" None null] set result(2) [object invoke System.Data.SQLite.SQLiteCommand Execute \ $sql(1) NonQuery null] set result(3) [object invoke System.Data.SQLite.SQLiteCommand Execute \ $sql(1) Scalar null] set result(4) [object invoke System.Data.SQLite.SQLiteCommand Execute \ $sql(1) Reader null] object invoke $result(4) Read; object invoke $result(4) Close set result(5) [object invoke System.Data.SQLite.SQLiteCommand Execute \ "this will not execute" None null 1] set result(6) [object invoke System.Data.SQLite.SQLiteCommand Execute \ $sql(2) NonQuery null 1] set result(7) [object invoke System.Data.SQLite.SQLiteCommand Execute \ $sql(2) Scalar null 1] set result(8) [object invoke System.Data.SQLite.SQLiteCommand Execute \ $sql(2) Reader null 1] list $result(1) $result(2) $result(3) $result(4) $result(5) $result(6) \ $result(7) $result(8) } -cleanup { unset -nocomplain result sql } -constraints {eagle monoBug28 SQLite System.Data.SQLite} -match regexp \ -result {^\{\} 1 System#DBNull#\d+ System#Data#SQLite#SQLiteDataReader#\d+ \{\}\ 1 1 System#Data#SQLite#SQLiteDataReader#\d+$}} ############################################################################### runSQLiteTestEpilogue runTestEpilogue |
Changes to readme.htm.
1 2 3 4 5 6 7 8 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> </head> <body> ADO.NET SQLite Data Provider<br /> Version 1.0.95.0 November XX, 2014 <font color="red">(release scheduled)</font><br /> | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> </head> <body> ADO.NET SQLite Data Provider<br /> Version 1.0.95.0 November XX, 2014 <font color="red">(release scheduled)</font><br /> Using <a href="http://www.sqlite.org/releaselog/3_8_7_1.html">SQLite 3.8.7.1</a><br /> Originally written by Robert Simpson<br /> Released to the public domain, use at your own risk!<br /> Official provider website: <a href="http://system.data.sqlite.org/">http://system.data.sqlite.org/</a><br /> Legacy versions: <a href="http://sqlite.phxsoftware.com/">http://sqlite.phxsoftware.com/</a><br /> <br /> The current development version can be downloaded from <a href="http://system.data.sqlite.org/index.html/timeline?y=ci"> http://system.data.sqlite.org/index.html/timeline?y=ci</a> |
︙ | ︙ | |||
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 | <p> <b>1.0.95.0 - November XX, 2014 <font color="red">(release scheduled)</font></b> </p> <ul> <li>Updated to <a href="http://www.sqlite.org/releaselog/3_8_7.html">SQLite 3.8.7</a>.</li> <li>Make sure SQL statements generated for DbUpdateCommandTree objects are properly delimited.</li> <li>Various minor performance enhancements to the SQLiteDataReader class. Pursuant to [e122d26e70].</li> <li>In the SQLiteDataReader.VerifyType method, remove duplicate "if" statement for the DbType.SByte value and move the remaining "if" to the Int64 affinity. Fix for [c5cc2fb334]. <b>** Potentially Incompatible Change **</b></li> </ul> <p> <b>1.0.94.0 - September 9, 2014</b> </p> <ul> <li>Updated to <a href="http://www.sqlite.org/releaselog/3_8_6.html">SQLite 3.8.6</a>.</li> <li>Updated to <a href="http://www.nuget.org/packages/EntityFramework/6.1.1">Entity Framework 6.1.1</a>.</li> | > > > | 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 | <p> <b>1.0.95.0 - November XX, 2014 <font color="red">(release scheduled)</font></b> </p> <ul> <li>Updated to <a href="http://www.sqlite.org/releaselog/3_8_7.html">SQLite 3.8.7</a>.</li> <li>Make sure SQL statements generated for DbUpdateCommandTree objects are properly delimited.</li> <li>Various minor performance enhancements to the SQLiteDataReader class. Pursuant to [e122d26e70].</li> <li>Defer disposing of connections created by the static SQLiteCommand.Execute method when a data reader is returned. Fix for [daeaf3150a].</li> <li>Wrap SELECT statements in parenthesis if they have an ORDER BY, LIMIT, or OFFSET clause and a compound operator is involved. Fix for [0a32885109].</li> <li>In the SQLiteDataReader.VerifyType method, remove duplicate "if" statement for the DbType.SByte value and move the remaining "if" to the Int64 affinity. Fix for [c5cc2fb334]. <b>** Potentially Incompatible Change **</b></li> <li>Handle Julian Day values that fall outside of the supported range for OLE Automation dates. Fix for [3e783eecbe]. <b>** Potentially Incompatible Change **</b></li> </ul> <p> <b>1.0.94.0 - September 9, 2014</b> </p> <ul> <li>Updated to <a href="http://www.sqlite.org/releaselog/3_8_6.html">SQLite 3.8.6</a>.</li> <li>Updated to <a href="http://www.nuget.org/packages/EntityFramework/6.1.1">Entity Framework 6.1.1</a>.</li> |
︙ | ︙ |
Changes to testlinq/Program.cs.
︙ | ︙ | |||
72 73 74 75 76 77 78 79 80 81 82 83 84 85 | if (arg != null) pageSize = int.Parse(arg.Trim()); } return SkipTest(pageSize); } case "endswith": { string value = null; if (args.Length > 1) { value = args[1]; | > > > > | 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | if (arg != null) pageSize = int.Parse(arg.Trim()); } return SkipTest(pageSize); } case "unionall": { return UnionAllTest(); } case "endswith": { string value = null; if (args.Length > 1) { value = args[1]; |
︙ | ︙ | |||
213 214 215 216 217 218 219 220 221 222 223 224 225 226 | Console.Write(' '); Console.Write(customers.CustomerID); once = true; } } return 0; } // // NOTE: Used to test the fix for ticket [ccfa69fc32]. // | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 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 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 | Console.Write(' '); Console.Write(customers.CustomerID); once = true; } } return 0; } // // NOTE: Used to test the fix for ticket [0a32885109]. // private static int UnionAllTest() { using (northwindEFEntities db = new northwindEFEntities()) { bool once = false; var customers1 = db.Customers.Where( f => f.Orders.Any()).OrderByDescending( f => f.CompanyName).Skip(1).Take(1); var customers2 = db.Customers.Where( f => f.Orders.Any()).OrderBy( f => f.CompanyName).Skip(1).Take(1); var customers3 = db.Customers.Where( f => f.CustomerID.StartsWith("B")).OrderBy( f => f.CompanyName).Skip(1).Take(1); foreach (var customer in customers1) { if (once) Console.Write(' '); Console.Write(customer.CustomerID); once = true; } foreach (var customer in customers2) { if (once) Console.Write(' '); Console.Write(customer.CustomerID); once = true; } foreach (var customer in customers3) { if (once) Console.Write(' '); Console.Write(customer.CustomerID); once = true; } foreach (var customer in customers1.Concat(customers2)) { if (once) Console.Write(' '); Console.Write(customer.CustomerID); once = true; } foreach (var customer in customers1.Concat(customers2).Concat(customers3)) { if (once) Console.Write(' '); Console.Write(customer.CustomerID); once = true; } } return 0; } // // NOTE: Used to test the fix for ticket [ccfa69fc32]. // |
︙ | ︙ |
Changes to www/news.wiki.
1 2 3 4 5 6 7 8 | <title>News</title> <b>Version History</b> <p> <b>1.0.95.0 - November XX, 2014 <font color="red">(release scheduled)</font></b> </p> <ul> | | > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <title>News</title> <b>Version History</b> <p> <b>1.0.95.0 - November XX, 2014 <font color="red">(release scheduled)</font></b> </p> <ul> <li>Updated to [http://www.sqlite.org/releaselog/3_8_7_1.html|SQLite 3.8.7.1].</li> <li>Make sure SQL statements generated for DbUpdateCommandTree objects are properly delimited.</li> <li>Various minor performance enhancements to the SQLiteDataReader class. Pursuant to [e122d26e70].</li> <li>Defer disposing of connections created by the static SQLiteCommand.Execute method when a data reader is returned. Fix for [daeaf3150a].</li> <li>Wrap SELECT statements in parenthesis if they have an ORDER BY, LIMIT, or OFFSET clause and a compound operator is involved. Fix for [0a32885109].</li> <li>In the SQLiteDataReader.VerifyType method, remove duplicate "if" statement for the DbType.SByte value and move the remaining "if" to the Int64 affinity. Fix for [c5cc2fb334]. <b>** Potentially Incompatible Change **</b></li> <li>Handle Julian Day values that fall outside of the supported range for OLE Automation dates. Fix for [3e783eecbe]. <b>** Potentially Incompatible Change **</b></li> </ul> <p> <b>1.0.94.0 - September 9, 2014</b> </p> <ul> <li>Updated to [http://www.sqlite.org/releaselog/3_8_6.html|SQLite 3.8.6].</li> <li>Updated to [http://www.nuget.org/packages/EntityFramework/6.1.1|Entity Framework 6.1.1].</li> |
︙ | ︙ |