Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix for [8b7d179c3c], with tests. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
76e929f6940a7da52dfb1a1d8499ef5b |
User & Date: | mistachkin 2011-07-09 09:01:52.876 |
References
2011-07-18
| ||
23:17 | • Closed ticket [872a690996]: Null reference in SQlChecker on .Net 3.5 plus 4 other changes artifact: 5165e5005f user: mistachkin | |
2011-07-09
| ||
09:03 | • Closed ticket [8b7d179c3c]: EF: wrong native query generation -> Data Loss, query omits some results plus 2 other changes artifact: 5c449d7cac user: mistachkin | |
Context
2011-07-09
| ||
18:10 | Remove NDEBUG from common defines. Move SQLITE_HAS_CODEC to 'extra' defines. check-in: 739ba4e18c user: mistachkin tags: trunk | |
09:01 | Fix for [8b7d179c3c], with tests. check-in: 76e929f694 user: mistachkin tags: trunk | |
2011-07-08
| ||
18:27 | Skip even building CE projects for non-CE platforms as this seems to cause PDB locking issues for VS during rebuilds even without deployment enabled. check-in: 6b62f68649 user: mistachkin tags: trunk | |
Changes
Added System.Data.SQLite.Linq/SQL Generation/SkipClause.cs.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 | //--------------------------------------------------------------------- // <copyright file="SkipClause.cs" company="Microsoft"> // Portions of this file copyright (c) Microsoft Corporation // and are released under the Microsoft Pulic License. See // http://archive.msdn.microsoft.com/EFSampleProvider/Project/License.aspx // or License.txt for details. // All rights reserved. // </copyright> //--------------------------------------------------------------------- namespace System.Data.SQLite { using System.Globalization; /// <summary> /// SkipClause represents the a SKIP expression in a SqlSelectStatement. /// It has a count property, which indicates how many rows should be skipped. /// </summary> class SkipClause : ISqlFragment { ISqlFragment skipCount; /// <summary> /// How many rows should be skipped. /// </summary> internal ISqlFragment SkipCount { get { return skipCount; } } /// <summary> /// Creates a SkipClause with the given skipCount. /// </summary> /// <param name="skipCount"></param> internal SkipClause(ISqlFragment skipCount) { this.skipCount = skipCount; } /// <summary> /// Creates a SkipClause with the given skipCount. /// </summary> /// <param name="skipCount"></param> internal SkipClause(int skipCount) { SqlBuilder sqlBuilder = new SqlBuilder(); sqlBuilder.Append(skipCount.ToString(CultureInfo.InvariantCulture)); this.skipCount = sqlBuilder; } #region ISqlFragment Members /// <summary> /// Write out the SKIP part of sql select statement /// It basically writes OFFSET (X). /// </summary> /// <param name="writer"></param> /// <param name="sqlGenerator"></param> public void WriteSql(SqlWriter writer, SqlGenerator sqlGenerator) { writer.Write(" OFFSET "); this.SkipCount.WriteSql(writer, sqlGenerator); } #endregion } } |
Changes to System.Data.SQLite.Linq/SQL Generation/SqlChecker.cs.
︙ | ︙ | |||
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 | { using System; using System.Collections.Generic; using System.Data.Common.CommandTrees; internal class SqlChecker : DbExpressionVisitor<bool> { private static Type sql8rewriter; static SqlChecker() { string version = #if NET_20 "3.5.0.0"; #else "4.0.0.0"; #endif sql8rewriter = Type.GetType(String.Format("System.Data.SqlClient.SqlGen.Sql8ExpressionRewriter, System.Data.Entity, Version={0}, Culture=neutral, PublicKeyToken=b77a5c561934e089", version), false); } private SqlChecker() { } /// <summary> /// SQLite doesn't support things like SKIP and a few other things. /// So determine if the query has to be rewritten /// </summary> /// <remarks> /// Microsoft went to all the trouble of making things like SKIP work /// on Sql Server 2000 by doing a rewrite of the commandtree. | > > > | 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 | { using System; using System.Collections.Generic; using System.Data.Common.CommandTrees; internal class SqlChecker : DbExpressionVisitor<bool> { #if false private static Type sql8rewriter; static SqlChecker() { string version = #if NET_20 "3.5.0.0"; #else "4.0.0.0"; #endif sql8rewriter = Type.GetType(String.Format("System.Data.SqlClient.SqlGen.Sql8ExpressionRewriter, System.Data.Entity, Version={0}, Culture=neutral, PublicKeyToken=b77a5c561934e089", version), false); } #endif private SqlChecker() { } #if false /// <summary> /// SQLite doesn't support things like SKIP and a few other things. /// So determine if the query has to be rewritten /// </summary> /// <remarks> /// Microsoft went to all the trouble of making things like SKIP work /// on Sql Server 2000 by doing a rewrite of the commandtree. |
︙ | ︙ | |||
49 50 51 52 53 54 55 56 57 58 59 60 61 62 | SqlChecker visitor = new SqlChecker(); if (tree.Query.Accept<bool>(visitor)) { tree = sql8rewriter.InvokeMember("Rewrite", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Static, null, null, new object[] { tree }) as DbQueryCommandTree; } return tree; } public override bool Visit(DbAndExpression expression) { return VisitBinaryExpression(expression); } public override bool Visit(DbApplyExpression expression) | > | 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | SqlChecker visitor = new SqlChecker(); if (tree.Query.Accept<bool>(visitor)) { tree = sql8rewriter.InvokeMember("Rewrite", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Static, null, null, new object[] { tree }) as DbQueryCommandTree; } return tree; } #endif public override bool Visit(DbAndExpression expression) { return VisitBinaryExpression(expression); } public override bool Visit(DbApplyExpression expression) |
︙ | ︙ |
Changes to System.Data.SQLite.Linq/SQL Generation/SqlGenerator.cs.
︙ | ︙ | |||
505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 | /// CollectionType => select statement /// non collection type => select expression /// </summary> /// <param name="tree"></param> /// <returns>The string representing the SQL to be executed.</returns> private string GenerateSql(DbQueryCommandTree tree) { tree = SqlChecker.Rewrite(tree); selectStatementStack = new Stack<SqlSelectStatement>(); isParentAJoinStack = new Stack<bool>(); allExtentNames = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase); allColumnNames = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase); // Literals will not be converted to parameters. | > > > | 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 | /// CollectionType => select statement /// non collection type => select expression /// </summary> /// <param name="tree"></param> /// <returns>The string representing the SQL to be executed.</returns> private string GenerateSql(DbQueryCommandTree tree) { #if false tree = SqlChecker.Rewrite(tree); #endif selectStatementStack = new Stack<SqlSelectStatement>(); isParentAJoinStack = new Stack<bool>(); allExtentNames = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase); allColumnNames = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase); // Literals will not be converted to parameters. |
︙ | ︙ | |||
1803 1804 1805 1806 1807 1808 1809 | /// WHERE Y.[row_number] > count /// ORDER BY sk1, sk2, ... /// </summary> /// <param name="e"></param> /// <returns>A <see cref="SqlBuilder"/></returns> public override ISqlFragment Visit(DbSkipExpression e) { | > | > > | > > > > > > > > > > > > > > > > > > > | 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 | /// WHERE Y.[row_number] > count /// ORDER BY sk1, sk2, ... /// </summary> /// <param name="e"></param> /// <returns>A <see cref="SqlBuilder"/></returns> public override ISqlFragment Visit(DbSkipExpression e) { Debug.Assert(e.Count is DbConstantExpression || e.Count is DbParameterReferenceExpression, "DbLimitExpression.Count is of invalid expression type"); Symbol fromSymbol; SqlSelectStatement result = VisitInputExpression(e.Input.Expression, e.Input.VariableName, e.Input.VariableType, out fromSymbol); if (!IsCompatible(result, e.ExpressionKind)) { result = CreateNewSelectStatement(result, e.Input.VariableName, e.Input.VariableType, out fromSymbol); } selectStatementStack.Push(result); symbolTable.EnterScope(); AddFromSymbol(result, e.Input.VariableName, fromSymbol); AddSortKeys(result.OrderBy, e.SortOrder); symbolTable.ExitScope(); selectStatementStack.Pop(); ISqlFragment skipCount = HandleCountExpression(e.Count); result.Skip = new SkipClause(skipCount); return result; } /// <summary> /// <see cref="Visit(DbFilterExpression)"/> /// </summary> /// <param name="e"></param> /// <returns>A <see cref="SqlSelectStatement"/></returns> |
︙ | ︙ |
Changes to System.Data.SQLite.Linq/SQL Generation/SqlSelectStatement.cs.
︙ | ︙ | |||
110 111 112 113 114 115 116 117 118 119 120 121 122 123 | get { return top; } set { Debug.Assert(top == null, "SqlSelectStatement.Top has already been set"); top = value; } } private SqlBuilder select = new SqlBuilder(); internal SqlBuilder Select { get { return select; } } | > > > > > > > > > > > | 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 | get { return top; } set { Debug.Assert(top == null, "SqlSelectStatement.Top has already been set"); top = value; } } private SkipClause skip; internal SkipClause Skip { get { return skip; } set { Debug.Assert(skip == null, "SqlSelectStatement.Skip has already been set"); skip = value; } } private SqlBuilder select = new SqlBuilder(); internal SqlBuilder Select { get { return select; } } |
︙ | ︙ | |||
300 301 302 303 304 305 306 307 308 309 310 311 312 313 | } if (this.Top != null) { this.Top.WriteSql(writer, sqlGenerator); } --writer.Indent; } #endregion } } | > > > > | 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 | } if (this.Top != null) { this.Top.WriteSql(writer, sqlGenerator); } if (this.skip != null) { this.Skip.WriteSql(writer, sqlGenerator); } --writer.Indent; } #endregion } } |
Changes to System.Data.SQLite.Linq/SQL Generation/TopClause.cs.
︙ | ︙ | |||
63 64 65 66 67 68 69 | this.withTies = withTies; } #region ISqlFragment Members /// <summary> /// Write out the TOP part of sql select statement | | | 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | this.withTies = withTies; } #region ISqlFragment Members /// <summary> /// Write out the TOP part of sql select statement /// It basically writes LIMIT (X). /// </summary> /// <param name="writer"></param> /// <param name="sqlGenerator"></param> public void WriteSql(SqlWriter writer, SqlGenerator sqlGenerator) { writer.Write(" LIMIT "); this.TopCount.WriteSql(writer, sqlGenerator); |
︙ | ︙ |
Changes to System.Data.SQLite.Linq/System.Data.SQLite.Linq.2008.csproj.
︙ | ︙ | |||
57 58 59 60 61 62 63 64 65 66 67 68 69 70 | </Compile> <Compile Include="SQL Generation\DmlSqlGenerator.cs" /> <Compile Include="SQL Generation\InternalBase.cs" /> <Compile Include="SQL Generation\ISqlFragment.cs" /> <Compile Include="SQL Generation\JoinSymbol.cs" /> <Compile Include="SQL Generation\KeyToListMap.cs" /> <Compile Include="SQL Generation\MetadataHelpers.cs" /> <Compile Include="SQL Generation\SqlBuilder.cs" /> <Compile Include="SQL Generation\SqlChecker.cs" /> <Compile Include="SQL Generation\SqlGenerator.cs" /> <Compile Include="SQL Generation\SqlSelectStatement.cs" /> <Compile Include="SQL Generation\SqlWriter.cs" /> <Compile Include="SQL Generation\StringUtil.cs" /> <Compile Include="SQL Generation\Symbol.cs" /> | > | 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | </Compile> <Compile Include="SQL Generation\DmlSqlGenerator.cs" /> <Compile Include="SQL Generation\InternalBase.cs" /> <Compile Include="SQL Generation\ISqlFragment.cs" /> <Compile Include="SQL Generation\JoinSymbol.cs" /> <Compile Include="SQL Generation\KeyToListMap.cs" /> <Compile Include="SQL Generation\MetadataHelpers.cs" /> <Compile Include="SQL Generation\SkipClause.cs" /> <Compile Include="SQL Generation\SqlBuilder.cs" /> <Compile Include="SQL Generation\SqlChecker.cs" /> <Compile Include="SQL Generation\SqlGenerator.cs" /> <Compile Include="SQL Generation\SqlSelectStatement.cs" /> <Compile Include="SQL Generation\SqlWriter.cs" /> <Compile Include="SQL Generation\StringUtil.cs" /> <Compile Include="SQL Generation\Symbol.cs" /> |
︙ | ︙ |
Changes to System.Data.SQLite.Linq/System.Data.SQLite.Linq.2010.csproj.
︙ | ︙ | |||
56 57 58 59 60 61 62 63 64 65 66 67 68 69 | </Compile> <Compile Include="SQL Generation\DmlSqlGenerator.cs" /> <Compile Include="SQL Generation\InternalBase.cs" /> <Compile Include="SQL Generation\ISqlFragment.cs" /> <Compile Include="SQL Generation\JoinSymbol.cs" /> <Compile Include="SQL Generation\KeyToListMap.cs" /> <Compile Include="SQL Generation\MetadataHelpers.cs" /> <Compile Include="SQL Generation\SqlBuilder.cs" /> <Compile Include="SQL Generation\SqlChecker.cs" /> <Compile Include="SQL Generation\SqlGenerator.cs" /> <Compile Include="SQL Generation\SqlSelectStatement.cs" /> <Compile Include="SQL Generation\SqlWriter.cs" /> <Compile Include="SQL Generation\StringUtil.cs" /> <Compile Include="SQL Generation\Symbol.cs" /> | > | 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | </Compile> <Compile Include="SQL Generation\DmlSqlGenerator.cs" /> <Compile Include="SQL Generation\InternalBase.cs" /> <Compile Include="SQL Generation\ISqlFragment.cs" /> <Compile Include="SQL Generation\JoinSymbol.cs" /> <Compile Include="SQL Generation\KeyToListMap.cs" /> <Compile Include="SQL Generation\MetadataHelpers.cs" /> <Compile Include="SQL Generation\SkipClause.cs" /> <Compile Include="SQL Generation\SqlBuilder.cs" /> <Compile Include="SQL Generation\SqlChecker.cs" /> <Compile Include="SQL Generation\SqlGenerator.cs" /> <Compile Include="SQL Generation\SqlSelectStatement.cs" /> <Compile Include="SQL Generation\SqlWriter.cs" /> <Compile Include="SQL Generation\StringUtil.cs" /> <Compile Include="SQL Generation\Symbol.cs" /> |
︙ | ︙ |
Changes to Tests/basic.eagle.
︙ | ︙ | |||
82 83 84 85 86 87 88 | set savedEncoding [object invoke Console OutputEncoding] set encoding [object invoke System.Text.Encoding GetEncoding Windows-1252] object invoke Console OutputEncoding $encoding } -body { set code [catch { testExec $testLinqExeFile [list -eventflags Wait -directory \ | | | 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | set savedEncoding [object invoke Console OutputEncoding] set encoding [object invoke System.Text.Encoding GetEncoding Windows-1252] object invoke Console OutputEncoding $encoding } -body { set code [catch { testExec $testLinqExeFile [list -eventflags Wait -directory \ [file dirname $testLinqExeFile] -stdout output -success 0] } error] tlog "---- BEGIN STDOUT OUTPUT\n" tlog $output tlog "\n---- END STDOUT OUTPUT\n" list $code [string equal $output [readFile $testLinqOutFile]] \ |
︙ | ︙ |
Added Tests/tkt-8b7d179c3c.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 | ############################################################################### # # tkt-8b7d179c3c.eagle -- # # Written by Joe Mistachkin. # Released to the public domain, use at your own risk! # ############################################################################### package require Eagle package require EagleLibrary package require EagleTest runTestPrologue ############################################################################### source [file join $path common.eagle] runSQLiteTestPrologue ############################################################################### # # NOTE: Setup the variables that refer to the various files required by the # tests in this file. # set testLinqExeFile [getBuildFileName testlinq.exe] set northwindEfDbFile [file join [file dirname $path] testlinq northwindEF.db] # # NOTE: Setup the test constraints specific to the tests in this file. # if {![haveConstraint file_[file tail $testLinqExeFile]]} then { checkForFile $test_channel $testLinqExeFile } if {![haveConstraint file_[file tail $northwindEfDbFile]]} then { checkForFile $test_channel $northwindEfDbFile } ############################################################################### runTest {test tkt-8b7d179c3c-1.1 {LINQ with Skip and Take} -body { set result [list] for {set pageSize 0} {$pageSize <= 2} {incr pageSize} { set code [catch { testExec $testLinqExeFile [list -eventflags Wait -directory \ [file dirname $testLinqExeFile] -nocarriagereturns -stdout output \ -success 0] -skip $pageSize } error] tlog "---- BEGIN STDOUT OUTPUT\n" tlog $output tlog "\n---- END STDOUT OUTPUT\n" lappend result $output } list $code [expr {$code == 0 ? "" : $error}] $result } -cleanup { unset -nocomplain code output error result pageSize } -constraints \ {eagle file_testlinq.exe file_northwindEF.db} -result {0 {} {{} {DRACD RATTC\ OLDWO GALED LILAS MAGAA ALFKI CHOPS SAVEA KOENE MAISD FOLKO CACTU OCEAN RANCH\ THECR GOURL GROSR SUPRD HUNGO ISLAT QUICK HUNGC GREAL LEHMS RICSU ERNSH WILMK\ LINOD TRAIH SIMOB OTTIK SPLIR MORGK FOLIG FURIB PRINI AROUT BSBEV CONSH EASTC\ NORTS SEVES BERGS VICTE BOLID FISSA ROMEY BLAUS BONAP MEREP ANATR ANTON CENTC\ PERIC TORTU FRANK TOMSP DUMON FRANR WARTH PARIS SPECD LONEP THEBI REGGC VINET\ WELLI HANAR QUEDE RICAR PICCO HILAA LETSS COMMI FAMIA QUEEN TRADH WHITC GODOS\ SANTG BLONP WANDK FRANS LAMAI BOTTM LAUGB LACOR LAZYK WOLZA VAFFE } {DRACD RATTC OLDWO GALED LILAS MAGAA ALFKI CHOPS SAVEA KOENE MAISD FOLKO\ CACTU OCEAN RANCH THECR GOURL GROSR SUPRD HUNGO ISLAT QUICK HUNGC GREAL LEHMS\ RICSU ERNSH WILMK LINOD TRAIH SIMOB OTTIK SPLIR MORGK FOLIG FURIB PRINI AROUT\ BSBEV CONSH EASTC NORTS SEVES BERGS VICTE BOLID FISSA ROMEY BLAUS BONAP MEREP\ ANATR ANTON CENTC PERIC TORTU FRANK TOMSP DUMON FRANR WARTH PARIS SPECD LONEP\ THEBI REGGC VINET WELLI HANAR QUEDE RICAR PICCO HILAA LETSS COMMI FAMIA QUEEN\ TRADH WHITC GODOS SANTG BLONP WANDK FRANS LAMAI BOTTM LAUGB LACOR LAZYK WOLZA\ VAFFE }}}} ############################################################################### unset -nocomplain testLinqExeFile northwindEfDbFile ############################################################################### runSQLiteTestEpilogue runTestEpilogue |
Changes to testlinq/Program.cs.
1 2 3 4 5 6 7 8 9 | using System; using System.Linq; using System.Data.Objects; using System.Text; namespace testlinq { class Program { | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 | using System; using System.Linq; using System.Data.Objects; using System.Text; namespace testlinq { class Program { private static int Main(string[] args) { string arg = null; if ((args != null) && (args.Length > 0)) arg = args[0]; if (arg == null) arg = ""; arg = arg.Trim().TrimStart('-', '/').ToLowerInvariant(); switch (arg) { case "": // String.Empty case "old": { return OldTests(); } case "skip": { int pageSize = 0; if (args.Length > 1) { arg = args[1]; if (arg != null) pageSize = int.Parse(arg.Trim()); } return SkipTest(pageSize); } default: { Console.WriteLine("unknown test \"{0}\"", arg); return 1; } } } private static int SkipTest(int pageSize) { using (northwindEFEntities db = new northwindEFEntities()) { bool once = false; int count = db.Customers.Count(); int PageCount = (pageSize != 0) ? (count / pageSize) + ((count % pageSize) == 0 ? 0 : 1) : 1; for (int pageIndex = 0; pageIndex < PageCount; pageIndex++) { var query = db.Customers.OrderBy(p => p.City). Skip(pageSize * pageIndex).Take(pageSize); foreach (Customers customers in query) { if (once) Console.Write(' '); Console.Write(customers.CustomerID); once = true; } } } return 0; } private static int OldTests() { using (northwindEFEntities db = new northwindEFEntities()) { { string entitySQL = "SELECT VALUE o FROM Orders AS o WHERE SQLite.DatePart('yyyy', o.OrderDate) = 1997;"; ObjectQuery<Orders> query = db.CreateQuery<Orders>(entitySQL); |
︙ | ︙ | |||
139 140 141 142 143 144 145 146 147 148 | } // // NOTE: (JJM) Removed on 2011/07/06, makes it harder to run this EXE via // the new unit test suite. // // Console.ReadKey(); } } } | > > | 210 211 212 213 214 215 216 217 218 219 220 221 | } // // NOTE: (JJM) Removed on 2011/07/06, makes it harder to run this EXE via // the new unit test suite. // // Console.ReadKey(); return 0; } } } |