System.Data.SQLite

Check-in Differences
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Difference From c5ddcaede44cb560 To eab7df35a4ef37ab

2017-12-07
01:27
When cloning a MockRegistryKey, be sure to preserve its subKeyName field as well. check-in: c98795a9a2 user: mistachkin tags: trunk
00:57
Remove type name prefix from the method names in the registry operation log output. check-in: eab7df35a4 user: mistachkin tags: trunk
2017-12-06
23:53
Further refinements to the design-time components installer in preparation for future enhancements. check-in: 3f2760ab0f user: mistachkin tags: trunk
2017-10-17
19:59
Update SQLite core library to the latest 'branch-3.21' code. check-in: 1f07d53a90 user: mistachkin tags: trunk
18:09
Update the expected results for test 'authorizer-1.1' to account for upstream changes. check-in: c5ddcaede4 user: mistachkin tags: trunk
08:41
First attempt to address some test issues seen on Mono. check-in: a7124e2dad user: mistachkin tags: trunk

Changes to Doc/Extra/Core/lang_detach.html.
103
104
105
106
107
108
109
110
111
112
113
103
104
105
106
107
108
109


110
111







-
-


When not in <a href="sharedcache.html">shared cache mode</a>, 
it is possible to have the same database file attached multiple times using 
different names, and detaching one connection to a file will leave the 
others intact.</p>
In <a href="sharedcache.html">shared cache mode</a>, attempting to attach the same database file more
than once results in an error.

<p>This statement will fail if SQLite is in the middle of a transaction.</p>



Changes to Doc/Extra/Core/pragma.html.
117
118
119
120
121
122
123
124

125
126
127
128
129
130
131
117
118
119
120
121
122
123

124
125
126
127
128
129
130
131







-
+







    SQL statements.  Whether or not the pragma runs during sqlite3_prepare()
    or sqlite3_step() depends on the pragma and on the specific release
    of SQLite.
<li>The pragma command is specific to SQLite and is
    not compatible with any other SQL database engine.
</ul>

<p>The C-language API for SQLite provides the <a href="c3ref/c_fcntl_busyhandler.html#sqlitefcntlpragma">SQLITE_FCNTL_PRAGMA</a>
<p>The C-language API for SQLite provides the <a href="c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlpragma">SQLITE_FCNTL_PRAGMA</a>
<a href="c3ref/file_control.html">file control</a> which gives <a href="vfs.html">VFS</a> implementations the
opportunity to add new PRAGMA statements or to override the meaning of
built-in PRAGMA statements.</p>


<hr /><a name="syntax"></a>
<h2>PRAGMA command syntax</h2>
217
218
219
220
221
222
223
224

225
226
227
228
229
230
231
217
218
219
220
221
222
223

224
225
226
227
228
229
230
231







-
+







</pre></blockquote>

<p>
Additional notes:
<ul>
<li><p>
Table-valued functions exist only for built-in PRAGMAs, not for PRAGMAs
defined using the <a href="c3ref/c_fcntl_busyhandler.html#sqlitefcntlpragma">SQLITE_FCNTL_PRAGMA</a> file control.
defined using the <a href="c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlpragma">SQLITE_FCNTL_PRAGMA</a> file control.
<li><p>
Table-valued functions exist only for PRAGMAs that return results and
that have no side-effects.
<li><p>
This feature could be used to implement
<a href="https://en.wikipedia.org/wiki/Information_schema">information schema</a>
by first creating a separate schema using
Changes to Doc/Extra/Provider/dbfactorysupport.html.
81
82
83
84
85
86
87
88

89
90
91
92
93
94
95
81
82
83
84
85
86
87

88
89
90
91
92
93
94
95







-
+







&lt;configuration&gt;
  &lt;system.data&gt;
    &lt;DbProviderFactories&gt;
      &lt;remove invariant="System.Data.SQLite"/&gt;
      &lt;add name="SQLite Data Provider" invariant="System.Data.SQLite" 
           description=".NET Framework Data Provider for SQLite"
           type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite,
                 Version=1.0.106.0, Culture=neutral,
                 Version=1.0.107.0, Culture=neutral,
                 PublicKeyToken=db937bc2d44ff139"/&gt;
    &lt;/DbProviderFactories&gt;
  &lt;/system.data&gt;
&lt;/configuration&gt;
</pre>
      </div>
      <p>
Changes to Doc/Extra/Provider/environment.html.
192
193
194
195
196
197
198






199
200
201
202
203
204
205
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211







+
+
+
+
+
+







          <td>If this environment variable is set [to anything], it will be
          used instead of the application base directory by the native
          library pre-loader.  This environment variable can be especially
          useful in ASP.NET and other hosted environments where direct control
          of the location of the managed assemblies is not under the control
          of the application.</td>
        </tr>
        <tr valign="top">
          <td>PreLoadSQLite_BreakIntoDebugger</td>
          <td>If this configuration variable is set [to anything], the native
          library pre-loader subsystem will attempt to give the interactive
          user an opportunity to attach a debugger to the current process.</td>
        </tr>
        <tr valign="top">
          <td>PreLoadSQLite_LibraryFileNameOnly</td>
          <td>If this environment variable is set [to anything], it will be
          used as the base file name (without directory information) for the
          native SQLite library to be pre-loaded (e.g. "sqlite3.dll" or
          "libsqlite3.so.0").</td>
        </tr>
Changes to Doc/Extra/Provider/version.html.
39
40
41
42
43
44
45
46

47
48









49
50

51
52
53
54
55
56
57
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







-
+

-
+
+
+
+
+
+
+
+
+


+







          </td>
        </tr>
      </table>
    </div>
    <div id="mainSection">
    <div id="mainBody">
    <h1 class="heading">Version History</h1>
    <p><b>1.0.106.0 - October XX, 2017 <font color="red">(release scheduled)</font></b></p>
    <p><b>1.0.107.0 - January XX, 2018 <font color="red">(release scheduled)</font></b></p>
    <ul>
      <li>Updated to <a href="https://www.sqlite.org/draft/releaselog/3_21_0.html">SQLite 3.21.0</a>.</li>
      <li>Updated to <a href="https://www.sqlite.org/draft/releaselog/3_22_0.html">SQLite 3.22.0</a>.</li>
      <li>Improve performance of type name lookups by removing superfluous locking and string creation.</li>
      <li>Fix some internal memory accounting present only in the debug build.</li>
      <li>Make sure inbound native delegates are unhooked before adding a connection to the pool. Fix for <a href="https://system.data.sqlite.org/index.html/info/0e48e80333">[0e48e80333]</a>.</li>
      <li>Add preliminary support for the .NET Framework 4.7.1.</li>
    </ul>
    <p><b>1.0.106.0 - November 2, 2017</b></p>
    <ul>
      <li>Updated to <a href="https://www.sqlite.org/releaselog/3_21_0.html">SQLite 3.21.0</a>.</li>
      <li>Add full support for the native <a href="https://www.sqlite.org/sessionintro.html">session</a> extension.</li>
      <li>Add BindDecimalAsText and GetDecimalAsText connection flags to force binding and returning of decimal values as text. Pursuant to <a href="https://system.data.sqlite.org/index.html/info/b167206ad3">[b167206ad3]</a>.</li>
      <li>Add BindInvariantDecimal and GetInvariantDecimal connection flags, enabled by default, to force binding and returning of decimal values using the invariant culture. Pursuant to <a href="https://system.data.sqlite.org/index.html/info/b167206ad3">[b167206ad3]</a>.&nbsp;<b>** Potentially Incompatible Change **</b></li>
      <li>Add preliminary support for Visual Studio 2017 and the .NET Framework 4.7. This does <b>not</b> include support for the design-time components for Visual Studio, see <a href="https://system.data.sqlite.org/index.html/info/8292431f51">[8292431f51]</a>.</li>
    </ul>
    <p><b>1.0.105.2 - June 12, 2017</b></p>
    <ul>
      <li>Updated to <a href="https://www.sqlite.org/releaselog/3_19_3.html">SQLite 3.19.3</a>.</li>
      <li>Fix issues that prevented SQLiteBlob creation from succeeding for tables that did not have an integer primary key.</li>
    </ul>
Changes to Doc/Extra/Provider/welcome.html.
156
157
158
159
160
161
162
163

164
165
166
167
168
169
170
156
157
158
159
160
161
162

163
164
165
166
167
168
169
170







-
+







        <font color="red">
          Itanium processor support not currently included.
        </font>
      </p>
      <h1 class="heading">Distributing the Binaries (Compact Framework)</h1>
      <p>Both the <b>System.Data.SQLite.DLL </b>and <b>SQLite.Interop.XXX.DLL</b> files
        must be deployed on the Compact Framework.&nbsp; The XXX is the build number of
        the System.Data.SQLite library (e.g. &quot;106&quot;).&nbsp; The
        the System.Data.SQLite library (e.g. &quot;107&quot;).&nbsp; The
        <b>SQLite.Interop.XXX.DLL</b> file is a fully native assembly compiled for
        the ARM processor, and System.Data.SQLite is the fully-managed Compact
        Framework assembly.</p>
      <hr />
      <div id="footer">
        <p>
          <a href="mailto:sqlite-users@mailinglists.sqlite.org?subject=SQLite.NET%20Class%20Library%20Documentation%20Feedback:%20Welcome">
Changes to Doc/SQLite.NET.chm.

cannot compute difference between binary files

Changes to Doc/Special/Core/vtab.html.
569
570
571
572
573
574
575
576

577
578
579
580
581
582
583
569
570
571
572
573
574
575

576
577
578
579
580
581
582
583







-
+







been reported up to the application.

</p><p>
If the xCreate method is omitted (left as a NULL pointer) then the
virtual table is an <a href="vtab.html#epoonlyvtab">eponymous-only virtual table</a>.  New instances of
the virtual table cannot be created using <a href="lang_createvtab.html">CREATE VIRTUAL TABLE</a> and the
virtual table can only be used via its module name.
Note that SQLite versions prior to 3.9.0 do not understand
Note that SQLite versions prior to 3.9.0 (2015-10-14) do not understand
eponymous-only virtual tables and will segfault if an attempt is made
to <a href="lang_createvtab.html">CREATE VIRTUAL TABLE</a> on an eponymous-only virtual table because
the xCreate method was not checked for null.

</p><p>
If the xCreate method is the exact same pointer as the <a href="vtab.html#xconnect">xConnect</a> method,
that indicates that the virtual table does not need to initialize backing
675
676
677
678
679
680
681
682
683



684
685
686





687
688
689
690
691
692
693
675
676
677
678
679
680
681


682
683
684



685
686
687
688
689
690
691
692
693
694
695
696







-
-
+
+
+
-
-
-
+
+
+
+
+







virtual table.  Enforcement is the responsibility of the underlying
virtual table implementation.  But SQLite does assume that the PRIMARY KEY
constraint is valid - that the identified columns really are UNIQUE and
NOT NULL - and it uses that assumption to optimize queries against the
virtual table.

</p><p>The rowid column is not accessible on a
WITHOUT ROWID virtual table (of course).  Furthermore, since the
<a href="vtab.html#xupdate">xUpdate</a> method depends on having a valid rowid, the <a href="vtab.html#xupdate">xUpdate</a> method 
WITHOUT ROWID virtual table (of course).

</p><p>The <a href="vtab.html#xupdate">xUpdate</a> method was originally designed around having a
must be NULL for a WITHOUT ROWID virtual table.  That in turn means that
WITHOUT ROWID virtual tables must be read-only.

<a href="lang_createtable.html#rowid">ROWID</a> as a single value.  The <a href="vtab.html#xupdate">xUpdate</a> method has been expanded to
accommodate an arbitrary PRIMARY KEY in place of the ROWID, but the
PRIMARY KEY must still be only one column.  For this reason, SQLite
will reject any WITHOUT ROWID virtual table that has more than one
PRIMARY KEY column and a non-NULL xUpdate method.

<a name="xconnect"></a>

</p><h2 id="the_xconnect_method"><span>2.2. </span>The xConnect Method</h2>

<div class="codeblock"><pre>int (*xConnect)(sqlite3*, void *pAux,
             int argc, char **argv,
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814















815
816
817
818
819
820
821
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







-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







version - perhaps comparing the value returned from <a href="c3ref/libversion.html">sqlite3_libversion_number()</a>
against constants 3008002, 3009000, and/or 3010000. The result of attempting 
to access these fields in an sqlite3_index_info structure created by an 
older version of SQLite are undefined.

</p><p>In addition, there are some defined constants:

</p><div class="codeblock"><pre>#define SQLITE_INDEX_CONSTRAINT_EQ      2
#define SQLITE_INDEX_CONSTRAINT_GT      4
#define SQLITE_INDEX_CONSTRAINT_LE      8
#define SQLITE_INDEX_CONSTRAINT_LT     16
#define SQLITE_INDEX_CONSTRAINT_GE     32
#define SQLITE_INDEX_CONSTRAINT_MATCH  64
#define SQLITE_INDEX_CONSTRAINT_LIKE   65     /* 3.10.0 and later only */
#define SQLITE_INDEX_CONSTRAINT_GLOB   66     /* 3.10.0 and later only */
#define SQLITE_INDEX_CONSTRAINT_REGEXP 67     /* 3.10.0 and later only */
#define SQLITE_INDEX_SCAN_UNIQUE        1     /* Scan visits at most 1 row */
</p><div class="codeblock"><pre>#define SQLITE_INDEX_CONSTRAINT_EQ         2
#define SQLITE_INDEX_CONSTRAINT_GT         4
#define SQLITE_INDEX_CONSTRAINT_LE         8
#define SQLITE_INDEX_CONSTRAINT_LT        16
#define SQLITE_INDEX_CONSTRAINT_GE        32
#define SQLITE_INDEX_CONSTRAINT_MATCH     64
#define SQLITE_INDEX_CONSTRAINT_LIKE      65  /* 3.10.0 and later */
#define SQLITE_INDEX_CONSTRAINT_GLOB      66  /* 3.10.0 and later */
#define SQLITE_INDEX_CONSTRAINT_REGEXP    67  /* 3.10.0 and later */
#define SQLITE_INDEX_CONSTRAINT_NE        68  /* 3.21.0 and later */
#define SQLITE_INDEX_CONSTRAINT_ISNOT     69  /* 3.21.0 and later */
#define SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70  /* 3.21.0 and later */
#define SQLITE_INDEX_CONSTRAINT_ISNULL    71  /* 3.21.0 and later */
#define SQLITE_INDEX_CONSTRAINT_IS        72  /* 3.21.0 and later */
#define SQLITE_INDEX_SCAN_UNIQUE           1  /* Scan visits at most 1 row */
</pre></div>

<p>The SQLite core calls the xBestIndex method when it is compiling a query
that involves a virtual table. In other words, SQLite calls this method 
when it is running <a href="c3ref/prepare.html">sqlite3_prepare()</a> or the equivalent. 
By calling this method, the 
SQLite core is saying to the virtual table that it needs to access 
1239
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
1268

1269
1270


1271
1272
1273


1274
1275
1276
1277
1278
1279
1280
1247
1248
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







-
-
+
+
+












-
-
+
+
+
+


+
-
-
-
+
+
+
+
+


+
-
-
+
+


-
+
+







into the virtual table. If argv[1] is an SQL NULL, then the implementation 
must choose a rowid for the newly inserted row. Subsequent argv[] 
entries contain values of the columns of the virtual table, in the 
order that the columns were declared. The number of columns will
match the table declaration that the <a href="vtab.html#xconnect">xConnect</a> or <a href="vtab.html#xcreate">xCreate</a> method made 
using the <a href="c3ref/declare_vtab.html">sqlite3_declare_vtab()</a> call.  All hidden columns are included.

</p><p>When doing an insert without a rowid (argc>1, argv[1] is an SQL NULL), the 
implementation must set *pRowid to the rowid of the newly inserted row; 
</p><p>When doing an insert without a rowid (argc>1, argv[1] is an SQL NULL),
on a virtual table that uses ROWID (but not on a <a href="vtab.html#worid">WITHOUT ROWID virtual table</a>,
the implementation must set *pRowid to the rowid of the newly inserted row; 
this will become the value returned by the <a href="c3ref/last_insert_rowid.html">sqlite3_last_insert_rowid()</a>
function. Setting this value in all the other cases is a harmless no-op;
the SQLite engine ignores the *pRowid return value if argc==1 or 
argv[1] is not an SQL NULL.

</p><p>Each call to xUpdate will fall into one of cases shown below.
Not that references to <b>argv&#91;i&#93</b> mean the SQL value
held within the argv&#91;i&#93; object, not the argv&#91;i&#93;
object itself.

</p><blockquote>
<dl>
<dt><b>argc = 1</b>
</dt><dd><p>The single row with rowid equal to argv[0] is deleted. No insert occurs.
<dt><b>argc = 1 <br> argv[0] &ne; NULL</b>
</dt><dd><p>
The single row with rowid or PRIMARY KEY equal to argv[0] is deleted. 
No insert occurs.

</p></dd><dt><b>argc &gt; 1 <br> argv[0] = NULL</b>
</dt><dd><p>
</dt><dd><p>A new row is inserted with a rowid argv[1] and column values in
       argv[2] and following.  If argv[1] is an SQL NULL,
       the a new unique rowid is generated automatically.
A new row is inserted with column values taken from
argv[2] and following.  In a rowid virtual table, if argv[1] is an SQL NULL,
then a new unique rowid is generated automatically.  The argv[1] will be NULL
for a <a href="vtab.html#worid">WITHOUT ROWID virtual table</a>, in which case the implementation should
take the PRIMARY KEY value from the appropiate column in argv[2] and following.

</p></dd><dt><b>argc &gt; 1 <br> argv[0] &ne; NULL <br> argv[0] = argv[1]</b>
</dt><dd><p>
</dt><dd><p>The row with rowid argv[0] is updated with new values 
       in argv[2] and following parameters.
The row with rowid or PRIMARY KEY argv[0] is updated with new values 
in argv[2] and following parameters.

</p></dd><dt><b>argc &gt; 1 <br> argv[0] &ne; NULL <br> argv[0] &ne; argv[1]</b>
</dt><dd><p> The row with rowid argv[0] is updated with rowid argv[1] 
</dt><dd><p> The row with rowid or PRIMARY KEY argv[0] is updated with 
the rowid or PRIMARY KEY in argv[1] 
and new values in argv[2] and following parameters. This will occur 
when an SQL statement updates a rowid, as in the statement:
</p><blockquote>
   <a href="lang_update.html">UPDATE</a> table SET rowid=rowid+1 WHERE ...; 
</blockquote>
</dd></dl>
</blockquote>
Changes to Externals/Eagle/bin/Eagle.dll.

cannot compute difference between binary files

Changes to Externals/Eagle/bin/EagleShell.exe.

cannot compute difference between binary files

Changes to Externals/Eagle/bin/EagleShell32.exe.

cannot compute difference between binary files

Changes to Externals/Eagle/bin/x64/Spilornis.dll.

cannot compute difference between binary files

Changes to Externals/Eagle/bin/x86/Spilornis.dll.

cannot compute difference between binary files

Changes to Externals/Eagle/lib/Eagle1.0/init.eagle.
22
23
24
25
26
27
28
29


30
31
32
33
34
35
36
22
23
24
25
26
27
28

29
30
31
32
33
34
35
36
37







-
+
+







namespace eval ::Eagle {
  #
  # NOTE: This is the procedure that detects whether or not we are
  #       running in Eagle (otherwise, we are running in vanilla Tcl).
  #       This procedure must function correctly in both Tcl and Eagle
  #       and must return non-zero only when running in Eagle.  This
  #       procedure must be defined in this script file because it is
  #       needed while this script file is being evaluated.
  #       needed while this script file is being evaluated.  The same
  #       procedure is also defined in the "platform.eagle" file.
  #
  # <bootstrap>
  proc isEagle {} {
    #
    # NOTE: Nothing too fancy or expensive should be done in here.  In
    #       theory, use of this routine should be rare; however, in
    #       practice, this routine is actually used quite a bit (e.g.
Changes to Externals/Eagle/lib/Eagle1.0/object.eagle.
144
145
146
147
148
149
150
151
152
153

154
155
156
157
158
159
160
144
145
146
147
148
149
150



151
152
153
154
155
156
157
158







-
-
-
+








  #
  # NOTE: This procedure returns a string obtained by using the specified
  #       value as an opaque object handle -OR- a default value (e.g. an
  #       empty string) if the value is not a valid opaque object handle.
  #
  proc getStringFromObjectHandle { value {default ""} } {
    global null

    if {[isObjectHandle $value] && $value ne $null} then {
    if {[isNonNullObjectHandle $value]} then {
      return [object invoke $value ToString]
    }

    if {[string length $default] > 0} then {
      return $default
    }

171
172
173
174
175
176
177










178
179
180
181
182
183
184
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192







+
+
+
+
+
+
+
+
+
+








    if {[llength $objects] == 1 && [lindex $objects 0] eq $value} then {
      return true
    }

    return false
  }

  #
  # NOTE: This procedure returns non-zero if the specified value can be used
  #       as an opaque object handle -AND- the value does not represent a null
  #       value.
  #
  proc isNonNullObjectHandle { value } {
    global null
    return [expr {[isObjectHandle $value] && $value ne $null}]
  }

  #
  # NOTE: This procedure returns non-zero if the specified name represents
  #       a valid CLR type name.
  #
  proc isManagedType { name } {
    if {[llength [info commands object]] > 0} then {
219
220
221
222
223
224
225
226
227























































































228
229
230
231
232
233
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









+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+






          }
        }
      }
    }

    return false
  }

  #
  # NOTE: This procedure evaluates a script asynchronously and optionally
  #       notifies another script upon its completion.  The first argument
  #       is the notification script; if an empty string, there will be no
  #       notification when asynchronous script evaluation is completed.
  #       If there is exactly one more argument, it is evaluated verbatim;
  #       otherwise, all remaining arguments are concatenated via [concat]
  #       and evaluated asynchronously.  If the script cannot be submitted
  #       for asynchronous evaluation, a script error will be raised.
  #
  proc evalAsync { doneScript args } {
    #
    # NOTE: This procedure requires the [object] command in order to work.
    #       If it is not available, bail out now.
    #
    if {[llength [info commands object]] == 0} then {
      error "cannot eval async: missing \[object\] command"
    }

    #
    # NOTE: If the core library was not compiled with thread-safety enabled,
    #       this procedure cannot be used because it could corrupt the state
    #       of the interpreter.
    #
    if {[lsearch -exact -- \
        $::eagle_platform(compileOptions) THREADING] == -1} then {
      error "cannot eval async: library missing THREADING compile-option"
    }

    #
    # NOTE: If there is more than one script optional argument, use [concat]
    #       to build up the final script; otherwise, use the single argument
    #       verbatim.  This mirrors the behavior of [eval].
    #
    if {[llength $args] > 1} then {
      set asyncScript [concat $args]
    } else {
      set asyncScript [lindex $args 0]
    }

    #
    # NOTE: Is there a script to be evaluated when the asynchronous script
    #       evaluation is complete?  If so, build an anonymous procedure
    #       that wraps it; otherwise, set the callback argument to null, so
    #       the core marshaller will handle the lack of a callback correctly.
    #       The context argument will be added to this script prior to it
    #       being evaluated; however, it is not actually used by this script.
    #
    if {[string length $doneScript] > 0} then {
      set callback [list -callbackflags {+ResetCancel FireAndForget} \
          -- apply [list [list script context] {uplevel 1 $script}] \
          $doneScript]
    } else {
      set callback null
    }

    #
    # NOTE: Initialize the local variable that will be used to receive the
    #       script error, if any.
    #
    set error null

    #
    # NOTE: Attempt to submit the script for asynchonous evaluation.  Use
    #       the dynamic callback mechanism with the anonymous procedure we
    #       constructed above.
    #
    set code [object invoke -verbose \
        -marshalflags +DynamicCallback -- Interpreter.GetActive \
        EvaluateScript $asyncScript $callback null error]

    #
    # NOTE: Check the return code, which only indicates if the script was
    #       actually submitted for asynchronous evaluation, to make sure
    #       it was successful.  If not, raise a script error.
    #
    if {$code ne "Ok"} then {
      error [getStringFromObjectHandle $error]
    }

    #
    # NOTE: Upon success, return an empty string.  The actual script result
    #       will be sent to the callback script, if any.
    #
    return ""
  }

  #
  # NOTE: Provide the Eagle "object" package to the interpreter.
  #
  package provide Eagle.Object \
    [expr {[isEagle] ? [info engine PatchLevel] : "1.0"}]
}

Changes to Externals/Eagle/lib/Eagle1.0/pkgt.eagle.
59
60
61
62
63
64
65



























































66
67
68
69
70
71
72
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







    # NOTE: The URI where the Package Client Toolset may be downloaded.
    #
    variable packageToolsetUri; # DEFAULT: ${baseUri}/${packageToolsetUrn}

    if {$force || ![info exists packageToolsetUri]} then {
      set packageToolsetUri {${baseUri}/${packageToolsetUrn}}
    }

    #
    # NOTE: The URN, relative to the base URI, where the TclKit DLL for
    #       a particular platform may be downloaded.
    #
    variable tclKitDllUrn; # DEFAULT: tclkit_dll_${platform}

    if {$force || ![info exists tclKitDllUrn]} then {
      set tclKitDllUrn {tclkit_dll_${platform}}
    }

    #
    # NOTE: The URI where the TclKit DLL for a particular platform may
    #       be downloaded.
    #
    variable tclKitDllUri; # DEFAULT: ${baseUri}/${urn}

    if {$force || ![info exists tclKitDllUri]} then {
      set tclKitDllUri {${baseUri}/${urn}}
    }

    #
    # NOTE: The URN, relative to the base URI, where the Harpy and Badge
    #       plugins for a particular build may be downloaded.
    #
    variable securityToolsetUrn; # DEFAULT: security_toolset_${platform}

    if {$force || ![info exists securityToolsetUrn]} then {
      set securityToolsetUrn {security_toolset_${platform}}
    }

    #
    # NOTE: The URI where the Harpy and Badge plugins for a particular
    #       build may be downloaded.
    #
    variable securityToolsetUri; # DEFAULT: ${baseUri}/${urn}

    if {$force || ![info exists securityToolsetUri]} then {
      set securityToolsetUri {${baseUri}/${urn}}
    }

    #
    # NOTE: The URN, relative to the base URI, where license certificate
    #       requests should be sent.
    #
    variable licenseUrn; # DEFAULT: get_license_01

    if {$force || ![info exists licenseUrn]} then {
      set licenseUrn get_license_01
    }

    #
    # NOTE: The URI where license certificate requests should be sent.
    #
    variable licenseUri; # DEFAULT: ${baseUri}/${urn}

    if {$force || ![info exists licenseUri]} then {
      set licenseUri {${baseUri}/${urn}}
    }
  }

  #
  # NOTE: This procedure attempts to download and extract the Package Client
  #       Toolset.  The optional channel argument is the output channel where
  #       diagnostic information is sent.  The optional quiet argument should
  #       be non-zero to prevent diagnostic information from being emitted.
105
106
107
108
109
110
111























































































































































































































































































112
113
114
115
116
117
118
119
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
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
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+









      writeFile $fileName $data
    }

    set extractDirectory [extractZipArchive $fileName $extractRootDirectory]
    return [file join $extractDirectory pkgr_an_d client 1.0 neutral]
  }

  #
  # NOTE: This procedure attempts to download and extract a native TclKit DLL
  #       for the current platform.  The optional channel argument is the
  #       output channel where diagnostic information is sent.  The optional
  #       quiet argument should be non-zero to prevent diagnostic information
  #       from being emitted.  This procedure may raise script errors.  The
  #       return value is the full path to the native TclKit DLL file.
  #
  proc downloadAndExtractNativeTclKitDll {
          {channel stdout} {quiet false} } {
    setupPackageToolsetVars false

    variable baseUri
    variable tclKitDllUri
    variable tclKitDllUrn

    package require Eagle.Test
    package require Eagle.Unzip

    set extractRootDirectory [getTemporaryPath]

    set directory [file join $extractRootDirectory [appendArgs \
        ea-td-di- [pid] - [string trim [clock seconds] -]]]

    set platform [machineToPlatform $::tcl_platform(machine) true]
    set urn [subst $tclKitDllUrn]; set uri [subst $tclKitDllUri]
    set fileName [getTemporaryFileName]

    if {[isEagle]} then {
      uri download $uri $fileName
    } else {
      package require Eagle.Tools.Common

      namespace import \
          ::Eagle::Tools::Common::getFileViaHttp \
          ::Eagle::Tools::Common::writeFile

      set data [getFileViaHttp $uri 20 $channel $quiet -binary true]

      writeFile $fileName $data
    }

    set extractDirectory [extractZipArchive $fileName $extractRootDirectory]

    return [lindex [glob -nocomplain \
        [file join $extractDirectory lib *[info sharedlibextension]]] 0]
  }

  #
  # NOTE: This procedure attempts to download and extract the Security Toolset,
  #       which includes the Harpy and Badge plugins.  The optional channel
  #       argument is the output channel where diagnostic information is sent.
  #       The optional quiet argument should be non-zero to prevent diagnostic
  #       information from being emitted.  This procedure may raise script
  #       errors.  The return value is the full path to a directory that should
  #       contain the "Harpy1.0" and "Badge1.0" plugin directories.
  #
  proc downloadAndExtractSecurityToolset {
          {channel stdout} {quiet false} } {
    setupPackageToolsetVars false

    variable baseUri
    variable securityToolsetUri
    variable securityToolsetUrn

    package require Eagle.Test
    package require Eagle.Unzip

    set extractRootDirectory [getTemporaryPath]

    set directory [file join $extractRootDirectory [appendArgs \
        ea-st-di- [pid] - [string trim [clock seconds] -]]]

    if {[info exists ::eagle_platform(text)]} then {
      set platform [string tolower $::eagle_platform(text)]
    } else {
      set platform [string tolower netFx20]; # TODO: Good default?
    }

    set dir [string map [list fx ""] $platform]; # netfx20 -> net20
    set urn [subst $securityToolsetUrn]; set uri [subst $securityToolsetUri]
    set fileName [getTemporaryFileName]

    if {[isEagle]} then {
      uri download $uri $fileName
    } else {
      package require Eagle.Tools.Common

      namespace import \
          ::Eagle::Tools::Common::getFileViaHttp \
          ::Eagle::Tools::Common::writeFile

      set data [getFileViaHttp $uri 20 $channel $quiet -binary true]

      writeFile $fileName $data
    }

    set extractDirectory [extractZipArchive $fileName $extractRootDirectory]
    return [file join $extractDirectory build $dir lib]
  }

  #
  # NOTE: This procedure attempts to request a license certificate for Eagle,
  #       which includes the Harpy and Badge plugins.  The optional channel
  #       argument is the output channel where diagnostic information is sent.
  #       The optional quiet argument should be non-zero to prevent diagnostic
  #       information from being emitted.  This procedure may raise script
  #       errors.  The return value is the fully qualified file name for the
  #       resulting license certificate.
  #
  # WARNING: This procedure will send the short name and display name of the
  #          currently logged on user to the Eagle license server as they are
  #          required for a new license certificate to be issued.  Abuse of
  #          this service may result in a permanent ban from the service and
  #          revocation of any previously issued license certificates.
  #
  proc requestLicenseCertificate {
          {channel stdout} {quiet false} } {
    setupPackageToolsetVars false

    variable baseUri
    variable licenseUri
    variable licenseUrn

    package require Eagle.Test

    set certificateRootDirectory [getTemporaryPath]

    set processDirectoryPrefix [file join $certificateRootDirectory \
        [appendArgs ea-lc-di- [pid] -]]

    #
    # NOTE: Issue a warning to the user if it appears there is already a
    #       license certificate in a temporary directory that was created
    #       by this process.  Hopefully, this should reduce the number of
    #       duplicate requests.
    #
    set varName1 YES_PLEASE_FORCE_A_LICENSE_CERTIFICATE_REQUEST

    if {![info exists ::env($varName1)] && [isWindows]} then {
      set processFileNames [list]

      foreach processDirectory [findDirectories \
          [appendArgs $processDirectoryPrefix *]] {
        eval lappend processFileNames [findFiles \
            [file join $processDirectory *]]
      }

      if {[llength $processFileNames] > 0} then {
        set warningCommand [list]

        if {[isEagle]} then {
          lappend warningCommand host result Error
        } else {
          lappend warningCommand puts stderr
        }

        set varName2 Master_Certificate

        lappend warningCommand [appendArgs \
            "One or more temporary license certificate files " \
            "apparently belonging to this process were found.  " \
            "If you wish to override this warning and force a " \
            "new license certificate request to be submitted, " \
            "set the \"" $varName1 "\" environment variable " \
            "(to anything); however, please keep in mind that " \
            "requesting too many license certificates and/or " \
            "requesting license certificates too fast MAY be " \
            "considered abusive behavior.  Upon success, the " \
            "resulting temporary license certificate file " \
            "SHOULD be saved to a secure location on the local " \
            "file system, e.g. the home directory associated " \
            "with the user submitting the license certificate " \
            "request.  The fully qualified file name for the " \
            "temporary license certificate MUST used as the " \
            "value for the \"" $varName2 "\" environment " \
            "variable; otherwise, it MAY NOT be found when one " \
            "of its associated plugins attempts to load.\n"]

        #
        # NOTE: Emit our carefully worded license warning message.
        #
        eval $warningCommand

        #
        # NOTE: Return the first pre-existing license certificate file
        #       name that was found.
        #
        return [lindex $processFileNames 0]
      }
    }

    set directory [appendArgs \
        $processDirectoryPrefix [string trim [clock seconds] -]]

    set urn [subst $licenseUrn]; set uri [subst $licenseUri]

    if {![isEagle] || [catch {
      object invoke System.Security.Principal.WindowsIdentity \
          GetCurrent.Name
    } userName]} then {
      #
      # HACK: Fallback to using a value from the "tcl_platform" array.
      #       For native Tcl, this is the only choice.  For Eagle, it
      #       is used as a fallback.
      #
      if {[info exists ::tcl_platform(user)]} then {
        set userName $::tcl_platform(user)
      } else {
        set userName "NO USER NAME"
      }
    }

    if {![isEagle] || [catch {
      object load System.DirectoryServices.AccountManagement

      object invoke \
          System.DirectoryServices.AccountManagement.UserPrincipal \
          Current.DisplayName
    } displayName]} then {
      #
      # HACK: Fallback to using a value from the "tcl_platform" array.
      #       This value is not set by native Tcl or Eagle; therefore,
      #       the user would have to set it manually prior to calling
      #       this procedure.
      #
      if {[info exists ::tcl_platform(userDisplayName)]} then {
        set displayName $::tcl_platform(userDisplayName)
      } else {
        set displayName "NO DISPLAY NAME"
      }
    }

    #
    # NOTE: Add the necessary query parameters to the license request
    #       URI, making sure to properly escape their values.
    #
    if {[isEagle]} then {
      append uri ?userName= [uri escape data $userName]
      append uri &displayName= [uri escape data $displayName]
    } else {
      package require http 2.0

      append uri ? [::http::formatQuery \
          userName $userName displayName $displayName]
    }

    if {[isEagle]} then {
      set data [uri download -inline $uri]
    } else {
      package require Eagle.Tools.Common

      namespace import \
          ::Eagle::Tools::Common::getFileViaHttp \
          ::Eagle::Tools::Common::writeFile

      set data [getFileViaHttp $uri 20 $channel $quiet -binary true]
      package require Eagle.Auxiliary
    }

    if {[getDictionaryValue $data returnCode] ne "Ok"} then {
      if {[string length $data] > 0} then {
        error [appendArgs \
            "request failed with error information: " $data]
      } else {
        error "request failed without providing error information"
      }
    }

    set fileName [getTemporaryFileName]
    writeFile $fileName [getDictionaryValue $data result]
    set newFileName [file join $directory [file tail $fileName]]

    file mkdir $directory; file copy $fileName $newFileName
    file delete $fileName

    return $newFileName
  }

  #
  # NOTE: Provide the Eagle "package toolset" package to the interpreter.
  #
  package provide Eagle.Package.Toolset \
    [expr {[isEagle] ? [info engine PatchLevel] : "1.0"}]
}

Changes to Externals/Eagle/lib/Eagle1.0/platform.eagle.
20
21
22
23
24
25
26
27


28
29
30
31
32
33
34
20
21
22
23
24
25
26

27
28
29
30
31
32
33
34
35







-
+
+







#       namespace if this script actually ends up being evaluated in Tcl.
#
namespace eval ::Eagle {
  #
  # NOTE: This is the procedure that detects whether or not we are running
  #       in Eagle (otherwise, it is assumed that we are running in vanilla
  #       Tcl).  This procedure must work correctly in both Tcl and Eagle
  #       and must return non-zero only when running in Eagle.
  #       and must return non-zero only when running in Eagle.  The same
  #       procedure is also defined in the "init.eagle" file.
  #
  proc isEagle {} {
    #
    # NOTE: Nothing too fancy or expensive should be done here.  In theory,
    #       use of this procedure should be rare; however, in practice, this
    #       procedure is actually used quite a bit (e.g. by the test suite).
    #
Changes to Externals/Eagle/lib/Eagle1.0/safe.eagle.
22
23
24
25
26
27
28
29


30
31
32
33
34
35
36
22
23
24
25
26
27
28

29
30
31
32
33
34
35
36
37







-
+
+







namespace eval ::Eagle {
  #
  # NOTE: This is the procedure that detects whether or not we are
  #       running in Eagle (otherwise, we are running in vanilla Tcl).
  #       This procedure must function correctly in both Tcl and Eagle
  #       and must return non-zero only when running in Eagle.  This
  #       procedure must be defined in this script file because it is
  #       needed while this script file is being evaluated.
  #       needed while this script file is being evaluated.  The same
  #       procedure is also defined in the "init.eagle" file.
  #
  # <bootstrap>
  proc isEagle {} {
    #
    # NOTE: Nothing too fancy or expensive should be done in here.  In
    #       theory, use of this routine should be rare; however, in
    #       practice, this routine is actually used quite a bit (e.g.
Changes to Externals/Eagle/lib/Eagle1.0/test.eagle.
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
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







+
+
+

















+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







    #
    # NOTE: Returns the results of [array get] in a well-defined order.
    #
    if {[string length $varName] == 0} then {
      return [list]
    }

    #
    # NOTE: Refer to the array in the context of the caller.
    #
    upvar 1 $varName array

    #
    # NOTE: Build the command that will sort the array names into order.
    #
    set command [list lsort]
    if {$integer} then {lappend command -integer}
    lappend command [array names array]

    set result [list]

    foreach name [eval $command] {
      lappend result $name $array($name)
    }

    return $result
  }

  proc testResultGet { script } {
    set code [catch {uplevel 1 $script} result]
    return [expr {$code == 0 ? $result : "<error>"}]
  }

  proc testValueGet { varName {integer false} } {
    #
    # NOTE: Returns the results of [array get] in a well-defined order
    #       -OR- the value of the scalar variable.
    #
    if {[string length $varName] == 0} then {
      return [list]
    }

    #
    # NOTE: Is the specified variable (in the context of the caller) an
    #       array?
    #
    if {[uplevel 1 [list array exists $varName]]} then {
      #
      # NOTE: Refer to the array in the context of the caller.
      #
      upvar 1 $varName array

      #
      # NOTE: Build the command that will sort the array names into order.
      #
      set command [list lsort]
      if {$integer} then {lappend command -integer}
      lappend command [array names array]

      set result [list]

      foreach name [eval $command] {
        lappend result $name $array($name)
      }
    } else {
      #
      # NOTE: Grab the value of the scalar variable in the context of the
      #       caller and then return both the name and the value.
      #
      set varValue [uplevel 1 [list set $varName]]
      set result [list $varValue]
    }

    return $result
  }

  proc getFirstLineOfError { error } {
    set error [string map [list \r\n \n] $error]
    set index [string first \n $error]

    if {$index != -1} then {
      incr index -1

      if {$index > 0} then {
        return [string range $error 0 $index]
      }
    }

    return $error
  }

  proc calculateBogoCops { {milliseconds 2000} {legacy false} } {
    #
    # NOTE: Verify that the number of milliseconds requested is greater than
    #       zero.
    #
    if {$milliseconds <= 0} then {
377
378
379
380
381
382
383
384

385
386
387
388
389
390
391
443
444
445
446
447
448
449

450
451
452
453
454
455
456
457







-
+







              return 0
            }
          } finally {
            if {[info exists event]} then {
              catch {after cancel $event}
            }

            after flags =$flags
            after flags [appendArgs = $flags]
          }
        } finally {
          interp bgerror {} $bgerror
        }
      } finally {
        interp readylimit {} $readylimit
      }
1378
1379
1380
1381
1382
1383
1384








1385
1386
1387
1388
1389
1390
1391
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465







+
+
+
+
+
+
+
+







  }

  proc isBreakOnLeak {} {
    return [expr {[info exists ::test_break_on_leak] && \
                  [string is boolean -strict $::test_break_on_leak] && \
                  $::test_break_on_leak}]
  }

  proc isBreakOnDemand {} {
    global env

    return [expr {[info exists env(isBreakOnDemand)] && \
                  [string is boolean -strict $env(isBreakOnDemand)] && \
                  $env(isBreakOnDemand)}]
  }

  proc isStopOnFailure {} {
    return [expr {[info exists ::test_stop_on_failure] && \
                  [string is boolean -strict $::test_stop_on_failure] && \
                  $::test_stop_on_failure}]
  }

1558
1559
1560
1561
1562
1563
1564








1565
1566
1567
1568
1569
1570
1571
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653







+
+
+
+
+
+
+
+







      #
      if {$code != 0 && [isStopOnFailure]} then {
        tresult Error "OVERALL RESULT: STOP-ON-FAILURE\n"

        unset -nocomplain ::test_suite_running
        error ""; # no message
      }

      #
      # NOTE: Unless forbidden from doing so, attempt to automatically
      #       cleanup any stale (e.g. temporary) object references now.
      #
      if {![info exists ::no(cleanupReferences)]} then {
        catch {object cleanup -references}
      }
    } else {
      if {$error} then {
        #
        # HACK: Prevent spurious errors dealing with [test] command options
        #       that are missing from native Tcl.
        #
        set badOptionPattern {^bad option ".*?":\
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756





1757
1758
1759
1760
1761
1762
1763
1826
1827
1828
1829
1830
1831
1832






1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844







-
-
-
-
-
-
+
+
+
+
+







      catch {set array(connections,$index) [llength [info connections]]}
      catch {set array(transactions,$index) [llength [info transactions]]}
      catch {set array(modules,$index) [llength [info modules]]}
      catch {set array(delegates,$index) [llength [info delegates]]}

      if {[llength [info commands tcl]] > 0} then {
        catch {set array(tcl,$index) [tcl ready]}
      }

      catch {set array(tclInterps,$index) [llength [tcl interps]]}
      catch {set array(tclThreads,$index) [llength [tcl threads]]}
      catch {set array(tclCommands,$index) [llength [tcl command list]]}

        catch {set array(tclInterps,$index) [llength [tcl interps]]}
        catch {set array(tclThreads,$index) [llength [tcl threads]]}
        catch {set array(tclCommands,$index) [llength [tcl command list]]}
      }

      #
      # NOTE: Grab the number of active threads that are active because
      #       of ScriptThread object instances.  This only works if Eagle
      #       is Beta 31 or higher.
      #
      catch {
        set array(scriptThreads,$index) \
2172
2173
2174
2175
2176
2177
2178
2179

2180
2181








2182
2183
2184
2185
2186
2187
2188
2253
2254
2255
2256
2257
2258
2259

2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277







-
+


+
+
+
+
+
+
+
+







    #
    set failed [list]
    set leaked [list]

    #
    # NOTE: Process each file name we have been given by the caller...
    #
    set total [llength $fileNames]; set lastPercent -1
    set total 0; set lastPercent -1

    foreach fileName $fileNames {
      #
      # NOTE: If configured to break into the debugger before running the
      #       test file, do it now.
      #
      if {[isBreakOnDemand]} then {
        testDebugBreak
      }

      #
      # NOTE: In terms of files, not tests, what percent done are we now?
      #
      set percent [formatDecimal \
          [expr {$total != 0 ? 100.0 * ($count / double($total)) : 100}]]

      if {$percent != $lastPercent} then {
2353
2354
2355
2356
2357
2358
2359











2360
2361
2362
2363
2364
2365
2366
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







+
+
+
+
+
+
+
+
+
+
+







            #
            # NOTE: Log that this test file has ended.
            #
            if {![info exists ::no(runEndFile)]} then {
              tputs $channel [appendArgs "==== \"" $fileName "\" END\n"]
            }

            #
            # NOTE: At this point, we know that another test file was
            #       processed successfully.
            #
            incr total

            if {![info exists ::no(runPercent)]} then {
              reportTestPercent $channel $percent \
                  $total [llength $failed] [llength $leaked]
            }

            #
            # NOTE: Are we being prevented from waiting after the file?
            #
            if {![info exists ::no(postWait)]} then {
              if {[info exists ::test_wait(post)] && \
                  [string is integer -strict $::test_wait(post)]} then {
                if {![info exists ::no(runMetadata)]} then {
2419
2420
2421
2422
2423
2424
2425
2426

2427
2428
2429
2430
2431
2432
2433
2519
2520
2521
2522
2523
2524
2525

2526
2527
2528
2529
2530
2531
2532
2533







-
+







              #       probably caused it to skip a bunch of tests -AND- the
              #       option to stop-testing-on-error is not enabled.  That
              #       being said, we must not simply ignore the error.  The
              #       overall results of the test suite run must now reflect
              #       the failure.  Set a special variable for the epilogue
              #       to pick up on (later).
              #
              lappend ::test_suite_errors $error
              lappend ::test_suite_errors [list $fileName $error]
            }
          }

          #
          # NOTE: We evaluated another test file.
          #
          incr count
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2591
2592
2593
2594
2595
2596
2597






2598
2599
2600
2601
2602
2603
2604







-
-
-
-
-
-







          # NOTE: This entire file has been skipped.  Record that fact in the
          #       test suite log file.
          #
          if {![info exists ::no(runNonTestFile)]} then {
            tputs $channel [appendArgs \
                "==== \"" $fileName "\" NON_TEST_FILE\n"]
          }

          #
          # NOTE: This file does not actually count towards the total (i.e.
          #       it contains no actual tests).
          #
          incr total -1
        }

        #
        # NOTE: In terms of files, not tests, what percent done are we now?
        #
        set percent [formatDecimal \
            [expr {$total != 0 ? 100.0 * ($count / double($total)) : 100}]]
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2624
2625
2626
2627
2628
2629
2630






2631
2632
2633
2634
2635
2636
2637







-
-
-
-
-
-







        #
        # NOTE: This entire file has been skipped.  Record that fact in the
        #       test suite log file.
        #
        if {![info exists ::no(runSkippedFile)]} then {
          tputs $channel [appendArgs "==== \"" $fileName "\" SKIPPED\n"]
        }

        #
        # NOTE: This file does not actually count towards the total (i.e.
        #       it is part of the test suite infrastructure).
        #
        incr total -1
      }

      #
      # NOTE: In terms of files, not tests, what percent done are we now?
      #
      set percent [formatDecimal \
          [expr {$total != 0 ? 100.0 * ($count / double($total)) : 100}]]
3333
3334
3335
3336
3337
3338
3339






3340
3341
3342
3343
3344
3345
3346
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440







+
+
+
+
+
+







      tputs $channel [appendArgs \
          "---- purge \"" $name "\" results: " $result \n]

      catch {uplevel 1 [list debug cleanup]} result

      tputs $channel [appendArgs \
          "---- cleanup \"" $name "\" results: " $result \n]

      catch {uplevel 1 [list object invoke -flags +NonPublic \
          Eagle._Components.Private.ProcessOps ClearOutputCache]} result

      tputs $channel [appendArgs \
          "---- ProcessOps cleanup results: " $result \n]

      catch {uplevel 1 [list object invoke -flags +NonPublic \
          Eagle._Components.Private.EnumOps ClearEnumCache]} result

      tputs $channel [appendArgs \
          "---- EnumOps cleanup results: " $result \n]

3369
3370
3371
3372
3373
3374
3375


3376

3377
3378

3379
3380




3381
3382
3383
3384
3385
3386
3387
3463
3464
3465
3466
3467
3468
3469
3470
3471

3472

3473
3474


3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485







+
+
-
+
-

+
-
-
+
+
+
+







      #       zero.
      #
      if {$milliseconds <= 0} then {
        error "number of milliseconds must be greater than zero"
      }

      #
      # NOTE: Force any [vwait] that may be in the contained script to stop
      #       when it hits the script cancellation, saving the preexisting
      # NOTE: Save the current background error handler for later restoration
      #       event wait flags first for later restoration.
      #       and then reset the current background error handler to nothing.
      #
      set savedEventWaitFlags [object invoke -flags +NonPublic \
      set bgerror [interp bgerror {}]
      interp bgerror {} ""
          Interpreter.GetActive eventWaitFlags]

      object invoke -flags +NonPublic Interpreter.GetActive \
          eventWaitFlags [combineFlags $savedEventWaitFlags StopOnError]

      try {
        #
        # NOTE: Save the current [after] flags for later restoration and then
        #       reset them to process events immediately.
        #
        set flags [after flags]
3401
3402
3403
3404
3405
3406
3407
3408
3409


3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423

3424
3425






3426















































3427
3428
3429
3430
3431
3432
3433
3499
3500
3501
3502
3503
3504
3505


3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520

3521
3522
3523
3524
3525
3526
3527
3528
3529

3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583







-
-
+
+













-
+


+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







            # NOTE: First, make sure that the [after] event queue for the
            #       interpreter is totally empty.
            #
            catch {foreach id [after info] {after cancel $id}}

            #
            # NOTE: Schedule the event to cancel the script we are about to
            #       evaluate, capturing the name so we can cancel it later, if
            #       necessary.
            #       evaluate, capturing the name so we can cancel it later,
            #       if necessary.
            #
            set event [after $milliseconds [list interp cancel]]

            #
            # NOTE: Evaluate the script in the context of the caller.
            #
            uplevel 1 $script
          } result]
        } finally {
          if {[info exists event]} then {
            catch {after cancel $event}
          }

          after flags =$flags
          after flags [appendArgs = $flags]
        }
      } finally {
        if {[info exists savedEventWaitFlags]} then {
          object invoke -flags +NonPublic Interpreter.GetActive \
              eventWaitFlags $savedEventWaitFlags
        }
      }
    }
        interp bgerror {} $bgerror

    proc vwaitWithTimeout { varName {milliseconds 2000} } {
      #
      # NOTE: Verify that the number of milliseconds requested is positive or
      #       zero.
      #
      if {$milliseconds < 0} then {
        error "number of milliseconds cannot be negative"
      }

      try {
        #
        # NOTE: Schedule the event to cancel the script we are about to
        #       evaluate, capturing the name so we can cancel it later,
        #       if necessary.
        #
        set event [after $milliseconds [list interp cancel]]

        if {[catch {
          #
          # NOTE: Refer to the specified variable in the context of our
          #       caller.
          #
          upvar 1 $varName variable

          #
          # NOTE: Wait for the variable to be changed -OR- for the wait
          #       to be canceled.
          #
          vwait -eventwaitflags {+NoBgError StopOnError} -- variable
        }] == 0} then {
          #
          # NOTE: The wait completed successfully, the variable should
          #       have been changed.
          #
          return true
        } else {
          #
          # NOTE: The wait did not complete, it may have been canceled
          #       and the variable may or may not have been changed.
          #
          return false
        }
      } finally {
        if {[info exists event]} then {
          catch {after cancel $event}
        }
      }
    }

    proc tclLoadForTest { {varName ""} {findFlags ""} {loadFlags ""} } {
      if {[string length $varName] > 0} then {
        upvar 1 $varName loaded
      }
3795
3796
3797
3798
3799
3800
3801
3802

3803
3804
3805
3806
3807
3808
3809
3945
3946
3947
3948
3949
3950
3951

3952
3953
3954
3955
3956
3957
3958
3959







-
+







        fixConstraints fixTimingConstraints calculateBogoCops \
        calculateRelativePerformance formatTimeStamp formatElapsedTime \
        sourceIfValid processTestArguments getTclShellFileName \
        getTemporaryPath getFiles getTestFiles getTestRunId getTestLogId \
        getDefaultTestLog getTestLog getLastTestLog getTestSuite \
        getTestMachine getTestPlatform getTestConfiguration getTestSuffix \
        getTestUncountedLeaks getTestAssemblyName canTestExec testExec \
        testClrExec execTestShell isRandomOrder isBreakOnLeak \
        testClrExec execTestShell isRandomOrder isBreakOnDemand isBreakOnLeak \
        isStopOnFailure isStopOnLeak isExitOnComplete returnInfoScript \
        runTestPrologue runTestEpilogue hookPuts unhookPuts runTest \
        testDebugBreak testArrayGet testShim tsource recordTestStatistics \
        reportTestStatistics formatList formatListAsDict pathToRegexp \
        inverseLsearchGlob removePathFromFileNames formatDecimal \
        clearTestPercent reportTestPercent runAllTests isTestSuiteRunning \
        getTestChannelOrDefault tryVerifyTestPath checkForAndSetTestPath \
Changes to Externals/Eagle/lib/Eagle1.0/vendor.eagle.
29
30
31
32
33
34
35

















36
37
38
39
40
41
42
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







#
# NOTE: Use our own namespace here because even though we do not directly
#       support namespaces ourselves, we do not want to pollute the global
#       namespace if this script actually ends up being evaluated in Tcl.
#
namespace eval ::Eagle {
  if {[isEagle]} then {
    proc checkForVendorQuiet { {name ""} } {
      if {[info exists ::env(checkForVendorQuiet)]} then {
        return true
      }

      if {[string length $name] > 0} then {
        set envVarName [appendArgs quiet [string toupper \
            [string index $name 0]] [string range $name 1 end]]

        if {[info exists ::env($envVarName)]} then {
          return true
        }
      }

      return false
    }

    proc checkForTestOverrides { channel varNames quiet } {
      set result 0

      foreach varName $varNames {
        if {![uplevel 1 [list info exists $varName]]} then {
          continue
        }
341
342
343
344
345
346
347
348

349
350
351
352
353
354
355
358
359
360
361
362
363
364

365
366
367
368
369
370
371
372







-
+







        interop_assembly_file_names native_library_file_names release_version \
        scratch_directory temporary_directory test_clr test_clr_v2 \
        test_clr_v4 test_configuration test_configurations test_constraints \
        test_machine test_net_fx test_net_fx_2005 test_net_fx_2008 \
        test_net_fx_2010 test_net_fx_2012 test_net_fx_2013 test_net_fx_2015 \
        test_overrides test_platform test_suite test_year test_years \
        test_year_clr_v2 test_year_clr_v4 vendor_directory \
        vendor_test_directory]}] false
        vendor_test_directory]}] [checkForVendorQuiet checkForTestOverrides]

    #
    # NOTE: Set the name of the running test suite, if necessary.
    #
    if {![info exists test_suite]} then {
      set test_suite "System.Data.SQLite Test Suite for Eagle"
    }
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
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







-
+











-
+









-
-
+
+







      #       current interpreter.  Normally, this will also set the variable
      #       created above to point to the directory added to the auto-path;
      #       however, this will not be done if the variable was not created
      #       by us.
      #
      addTestSuiteToAutoPath stdout \
          [expr {$have_vendor_directory ? "" : "vendor_directory"}] \
          [info exists ::env(quietAddTestSuiteToAutoPath)]
          [checkForVendorQuiet addTestSuiteToAutoPath]

      unset have_vendor_directory

      #
      # NOTE: This procedure will attempt to find the vendor-specific testing
      #       directory.  Normally, this will also set the variable created
      #       above to point to the directory; however, this will not be done
      #       if the variable was not created by us.
      #
      findInterpreterTestPath stdout $vendor_directory \
          [expr {$have_vendor_test_directory ? "" : "vendor_test_directory"}] \
          [info exists ::env(quietFindInterpreterTestPath)]
          [checkForVendorQuiet findInterpreterTestPath]

      unset have_vendor_test_directory

      #
      # NOTE: If we actually found a vendor-specific testing infrastructure
      #       directory then modify the TestPath property of the current
      #       interpreter to point directly to it.
      #
      if {[string length $vendor_test_directory] > 0} then {
        setupInterpreterTestPath stdout $vendor_test_directory [info exists \
            ::env(quietSetupInterpreterTestPath)]
        setupInterpreterTestPath stdout $vendor_test_directory \
            [checkForVendorQuiet setupInterpreterTestPath]
      }
    }

    #
    # HACK: Prevent the Eagle core test suite infrastructure from checking
    #       test constraints that are time-consuming and/or most likely to
    #       be superfluous to third-party test suites (i.e. those that are
Changes to Externals/Eagle/lib/Test1.0/constraints.eagle.
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
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







-
-
+
+




-
-
-
+
+
+





-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







#       support namespaces ourselves, we do not want to pollute the global
#       namespace if this script actually ends up being evaluated in Tcl.
#
namespace eval ::Eagle {
  proc getKnownBuildTypes {} {
    return [list \
        NetFx20 NetFx35 NetFx40 NetFx45 NetFx451 NetFx452 \
        NetFx46 NetFx461 NetFx462 NetFx47 Bare LeanAndMean \
        Database MonoOnUnix Development]
        NetFx46 NetFx461 NetFx462 NetFx47 NetFx471 Bare \
        LeanAndMean Database MonoOnUnix Development]
  }

  proc getKnownCompileOptions {} {
    return [list \
        APPDOMAINS APPROVED_VERBS ARGUMENT_CACHE ARM ARM64 ASSEMBLY_RELEASE \
        ASSEMBLY_STRONG_NAME_TAG ASSEMBLY_TAG ASSEMBLY_TEXT ASSEMBLY_URI \
        BREAK_ON_EXITING BREAKPOINTS CACHE_ARGUMENT_TOSTRING \
        APPDOMAINS APPROVED_VERBS ARGUMENT_CACHE ARM ARM64 ASSEMBLY_DATETIME \
        ASSEMBLY_RELEASE ASSEMBLY_STRONG_NAME_TAG ASSEMBLY_TAG ASSEMBLY_TEXT \
        ASSEMBLY_URI BREAK_ON_EXITING BREAKPOINTS CACHE_ARGUMENT_TOSTRING \
        CACHE_ARGUMENTLIST_TOSTRING CACHE_DICTIONARY CACHE_RESULT_TOSTRING \
        CACHE_STATISTICS CACHE_STRINGLIST_TOSTRING CALLBACK_QUEUE CAS_POLICY \
        CERTIFICATE_PLUGIN CERTIFICATE_POLICY CERTIFICATE_RENEWAL \
        CODE_ANALYSIS COM_TYPE_CACHE CONSOLE DAEMON DATA DEAD_CODE DEBUG \
        DEBUGGER DEBUGGER_ARGUMENTS DEBUGGER_ENGINE DEBUGGER_EXECUTE \
        DEBUGGER_EXPRESSION DEBUGGER_VARIABLE DEBUG_TRACE DEBUG_WRITE DRAWING \
        DYNAMIC EAGLE EMBEDDED_LIBRARY EMBED_CERTIFICATES ENTERPRISE_LOCKDOWN \
        EXECUTE_CACHE EXPRESSION_FLAGS FAST_ERRORCODE FAST_ERRORINFO \
        FOR_TEST_USE_ONLY HAVE_SIZEOF HISTORY IA64 INTERACTIVE_COMMANDS \
        INTERNALS_VISIBLE_TO ISOLATED_INTERPRETERS ISOLATED_PLUGINS LIBRARY \
        LICENSING LICENSE_MANAGER LIMITED_EDITION LIST_CACHE MONO MONO_BUILD \
        MONO_HACKS MONO_LEGACY NATIVE NATIVE_PACKAGE NATIVE_THREAD_ID \
        NATIVE_UTILITY NATIVE_UTILITY_BSTR NETWORK NET_20 NET_20_FAST_ENUM \
        NET_20_ONLY NET_20_SP1 NET_20_SP2 NET_30 NET_35 NET_40 NET_45 NET_451 \
        NET_452 NET_46 NET_461 NET_462 NET_47 NON_WORKING_CODE NOTIFY \
        NOTIFY_ACTIVE NOTIFY_ARGUMENTS NOTIFY_EXCEPTION NOTIFY_EXECUTE \
        NOTIFY_EXPRESSION NOTIFY_GLOBAL NOTIFY_OBJECT OBSOLETE OBFUSCATION \
        OFFICIAL PARSE_CACHE PATCHLEVEL PLUGIN_COMMANDS POLICY_TRACE \
        PREVIOUS_RESULT RANDOMIZE_ID REMOTING SAMPLE SECURITY SERIALIZATION \
        SHARED_ID_POOL SHELL SOURCE_ID SOURCE_TIMESTAMP STATIC TCL TCL_KITS \
        TCL_THREADED TCL_THREADS TCL_UNICODE TCL_WRAPPER TEST TEST_PLUGIN \
        THREADING THROW_ON_DISPOSED TRACE TYPE_CACHE UNIX \
        USE_APPDOMAIN_FOR_ID USE_NAMESPACES VERBOSE WEB WINDOWS WINFORMS \
        WIX_30 WIX_35 WIX_36 WIX_37 WIX_38 WIX_39 WIX_310 X64 X86 XML]
        DEBUGGER_EXPRESSION DEBUGGER_VARIABLE DEBUG_TRACE DEBUG_WRITE \
        DEMO_EDITION DRAWING DYNAMIC EAGLE EMBEDDED_LIBRARY \
        EMBED_CERTIFICATES ENTERPRISE_LOCKDOWN EXECUTE_CACHE EXPRESSION_FLAGS \
        FAST_ERRORCODE FAST_ERRORINFO FOR_TEST_USE_ONLY HAVE_SIZEOF HISTORY \
        IA64 INTERACTIVE_COMMANDS INTERNALS_VISIBLE_TO ISOLATED_INTERPRETERS \
        ISOLATED_PLUGINS LIBRARY LICENSING LICENSE_MANAGER LIMITED_EDITION \
        LIST_CACHE MONO MONO_BUILD MONO_HACKS MONO_LEGACY NATIVE \
        NATIVE_PACKAGE NATIVE_THREAD_ID NATIVE_UTILITY NATIVE_UTILITY_BSTR \
        NETWORK NET_20 NET_20_FAST_ENUM NET_20_ONLY NET_20_SP1 NET_20_SP2 \
        NET_30 NET_35 NET_40 NET_45 NET_451 NET_452 NET_46 NET_461 NET_462 \
        NET_47 NET_471 NON_WORKING_CODE NOTIFY NOTIFY_ACTIVE NOTIFY_ARGUMENTS \
        NOTIFY_EXCEPTION NOTIFY_EXECUTE NOTIFY_EXPRESSION NOTIFY_GLOBAL \
        NOTIFY_OBJECT OBSOLETE OBFUSCATION OFFICIAL PARSE_CACHE PATCHLEVEL \
        PLUGIN_COMMANDS POLICY_TRACE PREVIOUS_RESULT RANDOMIZE_ID REMOTING \
        RESULT_LIMITS SAMPLE SECURITY SERIALIZATION SHARED_ID_POOL SHELL \
        SOURCE_ID SOURCE_TIMESTAMP STATIC TCL TCL_KITS TCL_THREADED \
        TCL_THREADS TCL_UNICODE TCL_WRAPPER TEST TEST_PLUGIN THREADING \
        THROW_ON_DISPOSED TRACE TYPE_CACHE UNIX USE_APPDOMAIN_FOR_ID \
        USE_NAMESPACES VERBOSE WEB WINDOWS WINFORMS WIX_30 WIX_35 WIX_36 \
        WIX_37 WIX_38 WIX_39 WIX_310 WIX_311 X64 X86 XML]
  }

  proc getKnownMonoVersions { {force false} } {
    #
    # NOTE: This job of this procedure is to return the list of "known"
    #       versions of Mono supported by the test suite infrastructure.
    #
436
437
438
439
440
441
442





























443
444
445
446
447
448
449
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







      #
      return true
    }

    set reason "skipped, need Eagle"
    return false
  }

  proc cleanConstraintName { name } {
    #
    # NOTE: Start with the original constraint name, removing surrounding
    #       whitespace.  If this results in an empty string, we are done.
    #
    set result [string trim $name]

    if {[string length $result] == 0} then {
      return $result
    }

    #
    # NOTE: The constraints for a test are actually a list; therefore, we
    #       must remove anything that might confuse the list parser.
    #
    set result [string map [list \" "" \\ "" \{ "" \} ""] $result]

    #
    # NOTE: In order to avoid semantic confusion, remove other characters
    #       that may be reserved by the test suite subsystems.
    #
    set result [string map [list ! "" # "" \$ "" \; "" \[ "" \] ""] $result]

    #
    # NOTE: Finally, remove all remaining whitespace.
    #
    regsub -all -- {\s} $result "" result; return $result
  }

  proc cleanPackageName { package full } {
    #
    # NOTE: Start out with the original package name, removing surrounding
    #       whitespace.  If this results in an empty string, we are done.
    #
    set result [string trim $package]
471
472
473
474
475
476
477













478
479
480
481
482
483
484
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527







+
+
+
+
+
+
+
+
+
+
+
+
+







    #       names.  For now, they are all replaced with underscores by this
    #       procedure.  Any existing underscores in the string are doubled.
    #
    set charMap [list _ __ " " _ + _ , _ . _ = _ \[ _ \\ _ \] _ ` _]

    return [string map $charMap $result]
  }

  proc haveTclPlatformOsExtraUpdateName { name } {
    if {[info exists ::tcl_platform(osExtra)]} then {
      set updateNames [getDictionaryValue $::tcl_platform(osExtra) \
          UpdateNames]

      if {[lsearch -exact $updateNames $name] != -1} then {
        return true
      }
    }

    return false
  }

  proc checkForTestSuiteFiles { channel } {
    tputs $channel "---- checking for test suite files... "

    #
    # NOTE: Start out with no test suite files to check.
    #
729
730
731
732
733
734
735

















736
737
738
739
740
741
742
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







        #
        return
      }
    }

    tputs $channel no\n
  }

  proc checkForOperatingSystemUpdate { channel name } {
    tputs $channel [appendArgs \
        "---- checking for operating system update \"" \
        $name "\"... "]

    #
    # NOTE: Is the specific OS update currently installed?
    #
    if {[haveTclPlatformOsExtraUpdateName $name]} then {
      addConstraint [appendArgs osUpdate . [cleanConstraintName $name]]

      tputs $channel yes\n
    } else {
      tputs $channel no\n
    }
  }

  proc checkForScriptLibrary { channel } {
    tputs $channel "---- checking for script library... "

    #
    # NOTE: See if the variable containing the script library location
    #       exists.
1942
1943
1944
1945
1946
1947
1948























1949
1950
1951
1952
1953
1954
1955
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







    #
    # NOTE: Does the interpreter have TIP #405 (i.e. [lmap])?
    #
    catch {lmap} error

    if {$error ne "invalid command name \"lmap\""} then {
      addConstraint tip405

      tputs $channel yes\n
    } else {
      tputs $channel no\n
    }
  }

  proc checkForTip421 { channel } {
    tputs $channel "---- checking for TIP #421... "

    #
    # NOTE: Is the interpreter TIP #421 ready?
    #
    if {[catch {
      set array(1) one; set list [list]

      array for {name value} array {
        lappend list $name $value
      }

      set list
    } result] == 0 && $result eq [list 1 one]} then {
      addConstraint tip421

      tputs $channel yes\n
    } else {
      tputs $channel no\n
    }
  }

3957
3958
3959
3960
3961
3962
3963
3964

3965
3966
3967
3968
3969
3970
3971
4040
4041
4042
4043
4044
4045
4046

4047
4048
4049
4050
4051
4052
4053
4054







-
+







          #
          set key [appendArgs HKEY_LOCAL_MACHINE\\ \
              [getSoftwareRegistryKey true] {\Microsoft\Windows Installer XML}]

          #
          # NOTE: The versions of WiX that we support.
          #
          set versions [list 3.7 3.6 3.5 3.0]
          set versions [list 3.11 3.10 3.9 3.8 3.7 3.6 3.5 3.0]

          #
          # NOTE: Check each version, stopping when one is found.
          #
          foreach version $versions {
            #
            # NOTE: Attempt to fetch the WiX install directory value from the
4161
4162
4163
4164
4165
4166
4167




















4168
4169
4170
4171
4172



4173

4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189



4190


4191
4192
4193
4194

4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206



4207


4208
4209
4210
4211

4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223



4224


4225
4226
4227
4228

4229
4230
4231
4232
4233
4234
4235





















4236
4237
4238
4239
4240
4241
4242
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278

4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298

4299
4300
4301
4302
4303

4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319

4320
4321
4322
4323
4324

4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340

4341
4342
4343
4344
4345

4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+





+
+
+
-
+
















+
+
+
-
+
+



-
+












+
+
+
-
+
+



-
+












+
+
+
-
+
+



-
+







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







          #
          return
        }
      }

      tputs $channel no\n
    }

    proc getFrameworkSetup451Value {} {
      #
      # NOTE: Check if we are running on Windows 8.1.
      #
      # BUGBUG: Is exact matching correct here?
      #
      if {[isWindows] && [info exists ::tcl_platform(osVersion)] && \
          $::tcl_platform(osVersion) == 6.3} then {
        #
        # NOTE: We are running on Windows 8.1, return the special value.
        #
        return 378675
      }

      #
      # NOTE: We are not running on Windows 8.1, return the normal value.
      #
      return 378758
    }

    proc getFrameworkSetup46Value {} {
      #
      # NOTE: Check if we are running on Windows 10 or later.
      #
      # BUGBUG: Is greater-than-or-equal-to matching correct here?
      #
      if {[isWindows] && [info exists ::tcl_platform(osVersion)] && \
      if {[isWindows] && $::tcl_platform(osVersion) >= 10.0} then {
          $::tcl_platform(osVersion) >= 10.0} then {
        #
        # NOTE: We are running on Windows 10, return the special value.
        #
        return 393295
      }

      #
      # NOTE: We are not running on Windows 10, return the normal value.
      #
      return 393297
    }

    proc getFrameworkSetup461Value {} {
      #
      # NOTE: Check if we are running on Windows 10 or later.
      #
      # BUGBUG: Is greater-than-or-equal-to matching correct here?
      #
      if {[isWindows] && [info exists ::tcl_platform(osVersion)] && \
      if {[isWindows] && $::tcl_platform(osVersion) >= 10.0} then {
          $::tcl_platform(osVersion) >= 10.0 && \
          [haveTclPlatformOsExtraUpdateName "November Update"]} then {
        #
        # NOTE: We are running on Windows 10, return the special value.
        #
        return 394254
        return 394254; # BUGBUG: November Update only?
      }

      #
      # NOTE: We are not running on Windows 10, return the normal value.
      #
      return 394271
    }

    proc getFrameworkSetup462Value {} {
      #
      # NOTE: Check if we are running on Windows 10 or later.
      #
      # BUGBUG: Is greater-than-or-equal-to matching correct here?
      #
      if {[isWindows] && [info exists ::tcl_platform(osVersion)] && \
      if {[isWindows] && $::tcl_platform(osVersion) >= 10.0} then {
          $::tcl_platform(osVersion) >= 10.0 && \
          [haveTclPlatformOsExtraUpdateName "Anniversary Update"]} then {
        #
        # NOTE: We are running on Windows 10, return the special value.
        #
        return 394802
        return 394802; # BUGBUG: Anniversary Update only?
      }

      #
      # NOTE: We are not running on Windows 10, return the normal value.
      #
      return 394806
    }

    proc getFrameworkSetup47Value {} {
      #
      # NOTE: Check if we are running on Windows 10 or later.
      #
      # BUGBUG: Is greater-than-or-equal-to matching correct here?
      #
      if {[isWindows] && [info exists ::tcl_platform(osVersion)] && \
      if {[isWindows] && $::tcl_platform(osVersion) >= 10.0} then {
          $::tcl_platform(osVersion) >= 10.0 && \
          [haveTclPlatformOsExtraUpdateName "Creators Update"]} then {
        #
        # NOTE: We are running on Windows 10, return the special value.
        #
        return 460798
        return 460798; # BUGBUG: Creators Update only?
      }

      #
      # NOTE: We are not running on Windows 10, return the normal value.
      #
      return 460805
    }

    proc getFrameworkSetup471Value {} {
      #
      # NOTE: Check if we are running on Windows 10 or later.
      #
      # BUGBUG: Is greater-than-or-equal-to matching correct here?
      #
      if {[isWindows] && [info exists ::tcl_platform(osVersion)] && \
          $::tcl_platform(osVersion) >= 10.0 && \
          [haveTclPlatformOsExtraUpdateName "Fall Creators Update"]} then {
        #
        # NOTE: We are running on Windows 10, return the special value.
        #
        return 461308; # BUGBUG: Fall Creators Update only?
      }

      #
      # NOTE: We are not running on Windows 10, return the normal value.
      #
      return 461310
    }

    proc checkForNetFx4x { channel } {
      tputs $channel "---- checking for .NET Framework 4.x... "

      #
      # NOTE: Platform must be Windows for this constraint to even be
      #       checked (i.e. we require the registry).
4275
4276
4277
4278
4279
4280
4281
4282

4283
4284
4285
4286
4287












4288
4289
4290
4291
4292
4293
4294
4414
4415
4416
4417
4418
4419
4420

4421
4422
4423
4424
4425

4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444







-
+




-
+
+
+
+
+
+
+
+
+
+
+
+







          #       is installed.  However, if the "release" value is also
          #       greater than or equal to 379893, then the .NET Framework
          #       4.5.2 is installed, which is an in-place upgrade to 4.5.1
          #       (and 4.5).  If the "release" value is also greater than or
          #       equal to 393297 (393295 on Windows 10), then the .NET
          #       Framework 4.6 is installed, which is an in-place upgrade
          #       to 4.5.x.  Similar handling is necessary for the .NET
          #       Framework 4.6.1, 4.6.2, and 4.7.  For more information,
          #       Framework 4.6.1, 4.6.2, 4.7, and 4.7.1.  For information,
          #       see:
          #
          #       https://msdn.microsoft.com/en-us/library/hh925568.aspx
          #
          if {$release >= [getFrameworkSetup47Value]} then {
          if {$release >= [getFrameworkSetup471Value]} then {
            addConstraint dotNet451OrHigher
            addConstraint dotNet452OrHigher
            addConstraint dotNet46OrHigher
            addConstraint dotNet461OrHigher
            addConstraint dotNet462OrHigher
            addConstraint dotNet47OrHigher
            addConstraint dotNet471
            addConstraint dotNet471OrHigher

            set version 4.7.1
          } elseif {$release >= [getFrameworkSetup47Value]} then {
            addConstraint dotNet451OrHigher
            addConstraint dotNet452OrHigher
            addConstraint dotNet46OrHigher
            addConstraint dotNet461OrHigher
            addConstraint dotNet462OrHigher
            addConstraint dotNet47
            addConstraint dotNet47OrHigher
4320
4321
4322
4323
4324
4325
4326
4327

4328
4329
4330
4331
4332
4333
4334
4470
4471
4472
4473
4474
4475
4476

4477
4478
4479
4480
4481
4482
4483
4484







-
+







            set version 4.6
          } elseif {$release >= 379893} then {
            addConstraint dotNet451OrHigher
            addConstraint dotNet452
            addConstraint dotNet452OrHigher

            set version 4.5.2
          } elseif {$release >= 378675} then {
          } elseif {$release >= [getFrameworkSetup451Value]} then {
            addConstraint dotNet451
            addConstraint dotNet451OrHigher

            set version 4.5.1
          } else {
            addConstraint dotNet45

4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586














4587
4588
4589
4590
4591
4592
4593
4718
4719
4720
4721
4722
4723
4724












4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745







-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+







    # NOTE: We need several of our test constraint related commands in the
    #       global namespace.
    #
    exportAndImportPackageCommands [namespace current] [list \
        getKnownBuildTypes getKnownCompileOptions getKnownMonoVersions \
        addKnownMonoConstraints lpermute alwaysFullInterpReady canExecComSpec \
        canExecWhoAmI canExecTclShell canExecFossil canExecVsWhere isTestMono \
        isTestAdministrator canPing cleanPackageName checkForTestSuiteFiles \
        checkForPlatform checkForWindowsVersion checkForScriptLibrary \
        checkForVariable checkForTclOptions checkForWindowsCommandProcessor \
        checkForPackage checkForFossil checkForVisualStudioViaVsWhere \
        checkForEagle checkForSymbols checkForLogFile checkForGaruda \
        checkForShell checkForOfficialStableReleaseInProgress checkForDebug \
        checkForTk checkForVersion checkForCommand checkForSubCommand \
        checkForNamespaces checkForTestExec checkForTestMachine \
        checkForTestPlatform checkForTestConfiguration checkForTestSuffix \
        checkForFile checkForPathFile checkForNativeCode checkForTip127 \
        checkForTip194 checkForTip207 checkForTip241 checkForTip285 \
        checkForTip405 checkForTip426 checkForTip429 checkForTip440 \
        isTestAdministrator canPing cleanConstraintName cleanPackageName \
        haveTclPlatformOsExtraUpdateName checkForTestSuiteFiles \
        checkForPlatform checkForWindowsVersion checkForOperatingSystemUpdate \
        checkForScriptLibrary checkForVariable checkForTclOptions \
        checkForWindowsCommandProcessor checkForPackage checkForFossil \
        checkForVisualStudioViaVsWhere checkForEagle checkForSymbols \
        checkForLogFile checkForGaruda checkForShell \
        checkForOfficialStableReleaseInProgress checkForDebug checkForTk \
        checkForVersion checkForCommand checkForSubCommand checkForNamespaces \
        checkForTestExec checkForTestMachine checkForTestPlatform \
        checkForTestConfiguration checkForTestSuffix checkForFile \
        checkForPathFile checkForNativeCode checkForTip127 checkForTip194 \
        checkForTip207 checkForTip241 checkForTip285 checkForTip405 \
        checkForTip421 checkForTip426 checkForTip429 checkForTip440 \
        checkForTip461 checkForTip463 checkForTip471 checkForTiming \
        checkForPerformance checkForBigLists checkForProcessorIntensive \
        checkForTimeIntensive checkForFullTest checkForMemoryIntensive \
        checkForStackIntensive checkForStackSize checkForInteractive \
        checkForInteractiveCommand checkForUserInteraction checkForNetwork \
        checkForCompileOption checkForKnownCompileOptions] false false

Changes to Externals/Eagle/lib/Test1.0/prologue.eagle.
1697
1698
1699
1700
1701
1702
1703












1704
1705
1706
1707
1708
1709
1710
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722







+
+
+
+
+
+
+
+
+
+
+
+







        #
        if {![info exists no(compileLimitedEdition)]} then {
          #
          # NOTE: This is not currently used by any tests.
          #
          checkForCompileOption $test_channel LIMITED_EDITION
        }

        #
        # NOTE: Has runtime "demo edition" checking support been
        #       disabled (at compile-time)?  This only applies to
        #       third-party plugins and applications.
        #
        if {![info exists no(compileDemoEdition)]} then {
          #
          # NOTE: This is not currently used by any tests.
          #
          checkForCompileOption $test_channel DEMO_EDITION
        }
      }
    }

    #
    # NOTE: Has dynamic loading testing support been disabled?
    #
    if {![info exists no(dynamic)]} then {
1971
1972
1973
1974
1975
1976
1977











1978
1979
1980
1981
1982
1983
1984
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007







+
+
+
+
+
+
+
+
+
+
+







        checkForObjectMember $test_channel Eagle._Tests.Default \
            *TestRemotingHaveChannel*

        checkForObjectMember $test_channel Eagle._Tests.Default \
            *TestRemotingTryGetChannel*
      }

      #
      # NOTE: Has embedded resource testing support been disabled?
      #
      if {![info exists no(testResources)]} then {
        #
        # NOTE: For test "interp-1.400".
        #
        checkForObjectMember $test_channel Eagle._Tests.Default \
            *TestGetResourceString*
      }

      #
      # NOTE: Has asynchronous testing support been disabled?
      #
      if {![info exists no(testAsynchronous)]} then {
        #
        # NOTE: For tests "basic-1.20" and "basic-1.21".
        #
2060
2061
2062
2063
2064
2065
2066

















2067
2068
2069
2070
2071
2072
2073
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







      if {![info exists no(testSetComplain)]} then {
        #
        # NOTE: This is not currently used by any tests.
        #
        checkForObjectMember $test_channel Eagle._Tests.Default \
            *TestSetComplain*
      }

      #
      # NOTE: Has enumerable variable testing support been disabled?
      #
      if {![info exists no(testEnumerableVariables)]} then {
        #
        # NOTE: For test "basic-1.105".
        #
        checkForObjectMember $test_channel Eagle._Tests.Default \
            *TestSetupIntArray*

        checkForObjectMember $test_channel Eagle._Tests.Default \
            *TestSetVariableEnumerable*

        checkForObjectMember $test_channel Eagle._Tests.Default \
            *TestUnsetVariableEnumerable*
      }

      #
      # NOTE: Has linked variable testing support been disabled?
      #
      if {![info exists no(testLinkedVariables)]} then {
        #
        # NOTE: For tests "basic-1.39", "basic-1.40", "basic-1.41",
2242
2243
2244
2245
2246
2247
2248






2249
2250
2251
2252
2253
2254
2255
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301







+
+
+
+
+
+








        #
        # NOTE: For tests "object-3.14" and "object-3.15".
        #
        checkForObjectMember $test_channel Eagle._Tests.Default \
            *TestReturnOfSelf*

        #
        # NOTE: For test "object-3.17".
        #
        checkForObjectMember $test_channel Eagle._Tests.Default \
            *TestByRefByteArray*

        #
        # NOTE: For test "object-4.1".
        #
        checkForObjectMember $test_channel Eagle._Tests.Default \
            *TestExpr*

        #
3065
3066
3067
3068
3069
3070
3071













3072
3073
3074
3075
3076
3077
3078
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137







+
+
+
+
+
+
+
+
+
+
+
+
+







  if {![info exists no(platform)]} then {
    checkForPlatform $test_channel
  }

  if {![info exists no(windowsVersion)]} then {
    checkForWindowsVersion $test_channel
  }

  if {![info exists no(operatingSystemUpdates)]} then {
    if {[isEagle] && [info exists tcl_platform(osExtra)]} then {
      vwaitWithTimeout tcl_platform(osExtra) $test_timeout
    }

    checkForOperatingSystemUpdate $test_channel KB936929
    checkForOperatingSystemUpdate $test_channel KB976932
    checkForOperatingSystemUpdate $test_channel "November Update"
    checkForOperatingSystemUpdate $test_channel "Anniversary Update"
    checkForOperatingSystemUpdate $test_channel "Creators Update"
    checkForOperatingSystemUpdate $test_channel "Fall Creators Update"
  }

  if {![info exists no(scriptLibrary)]} then {
    checkForScriptLibrary $test_channel
  }

  if {![info exists no(tclOptions)]} then {
    checkForTclOptions $test_channel
3309
3310
3311
3312
3313
3314
3315




3316
3317
3318
3319
3320
3321
3322
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385







+
+
+
+







  if {![info exists no(tip285)]} then {
    checkForTip285 $test_channel
  }

  if {![info exists no(tip405)]} then {
    checkForTip405 $test_channel
  }

  if {![info exists no(tip421)]} then {
    checkForTip421 $test_channel
  }

  if {![info exists no(tip426)]} then {
    checkForTip426 $test_channel
  }

  if {![info exists no(tip429)]} then {
    checkForTip429 $test_channel
Changes to NuGet/SQLite.Beta.nuspec.
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
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













-
+










-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+





<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.Beta.nuspec -
 *
 * Written by Joe Mistachkin.
 * Released to the public domain, use at your own risk!
 *
-->
<package>
  <metadata>
    <id>System.Data.SQLite.Beta</id>
    <title>System.Data.SQLite (x86/x64) Beta</title>
    <version>1.0.106.0</version>
    <version>1.0.107.0</version>
    <authors>SQLite Development Team</authors>
    <description>This is a &quot;beta&quot; package and is not intended for production use.  The official SQLite database engine for both x86 and x64 along with the ADO.NET provider.  This package includes support for LINQ and Entity Framework 6.</description>
    <language>en-US</language>
    <projectUrl>https://system.data.sqlite.org/</projectUrl>
    <iconUrl>https://system.data.sqlite.org/images/sqlite128.png</iconUrl>
    <licenseUrl>https://www.sqlite.org/copyright.html</licenseUrl>
    <tags>sqlite database ado.net provider interop</tags>
    <copyright>Public Domain</copyright>
    <dependencies>
      <group targetFramework="net20">
        <dependency id="System.Data.SQLite.Core.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net40">
        <dependency id="System.Data.SQLite.Core.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net45">
        <dependency id="System.Data.SQLite.Core.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net451">
        <dependency id="System.Data.SQLite.Core.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net46">
        <dependency id="System.Data.SQLite.Core.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net20">
        <dependency id="System.Data.SQLite.Linq.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net40">
        <dependency id="System.Data.SQLite.Linq.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net45">
        <dependency id="System.Data.SQLite.Linq.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net451">
        <dependency id="System.Data.SQLite.Linq.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net46">
        <dependency id="System.Data.SQLite.Linq.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net40">
        <dependency id="System.Data.SQLite.EF6.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net45">
        <dependency id="System.Data.SQLite.EF6.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net451">
        <dependency id="System.Data.SQLite.EF6.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net46">
        <dependency id="System.Data.SQLite.EF6.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6.Beta" version="1.0.107.0" />
      </group>
    </dependencies>
  </metadata>
  <files />
</package>
Changes to NuGet/SQLite.Core.Beta.nuspec.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.Core.Beta.nuspec -
 *
 * Written by Joe Mistachkin.
 * Released to the public domain, use at your own risk!
 *
-->
<package>
  <metadata>
    <id>System.Data.SQLite.Core.Beta</id>
    <title>System.Data.SQLite Core (x86/x64) Beta</title>
    <version>1.0.106.0</version>
    <version>1.0.107.0</version>
    <authors>SQLite Development Team</authors>
    <description>This is a &quot;beta&quot; package and is not intended for production use.  The official SQLite database engine for both x86 and x64 along with the ADO.NET provider.</description>
    <language>en-US</language>
    <projectUrl>https://system.data.sqlite.org/</projectUrl>
    <iconUrl>https://system.data.sqlite.org/images/sqlite128.png</iconUrl>
    <licenseUrl>https://www.sqlite.org/copyright.html</licenseUrl>
    <tags>sqlite database ado.net provider interop</tags>
Changes to NuGet/SQLite.Core.MSIL.Beta.nuspec.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.Core.MSIL.Beta.nuspec -
 *
 * Written by Joe Mistachkin.
 * Released to the public domain, use at your own risk!
 *
-->
<package>
  <metadata>
    <id>System.Data.SQLite.Core.MSIL.Beta</id>
    <title>System.Data.SQLite (MSIL) Beta</title>
    <version>1.0.106.0</version>
    <version>1.0.107.0</version>
    <authors>SQLite Development Team</authors>
    <description>This is a &quot;beta&quot; package and is not intended for production use.  An ADO.NET provider for SQLite (managed-only).</description>
    <language>en-US</language>
    <projectUrl>https://system.data.sqlite.org/</projectUrl>
    <iconUrl>https://system.data.sqlite.org/images/sqlite128.png</iconUrl>
    <licenseUrl>https://www.sqlite.org/copyright.html</licenseUrl>
    <tags>sqlite database ado.net provider interop</tags>
Changes to NuGet/SQLite.Core.MSIL.Test.nuspec.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.Core.MSIL.Test.nuspec -
 *
 * Written by Joe Mistachkin.
 * Released to the public domain, use at your own risk!
 *
-->
<package>
  <metadata>
    <id>System.Data.SQLite.Core.MSIL.Test</id>
    <title>System.Data.SQLite (MSIL) Test</title>
    <version>1.0.106.0</version>
    <version>1.0.107.0</version>
    <authors>SQLite Development Team</authors>
    <description>This is a pre-release package and is not intended for production use.  An ADO.NET provider for SQLite (managed-only).</description>
    <language>en-US</language>
    <projectUrl>https://system.data.sqlite.org/</projectUrl>
    <iconUrl>https://system.data.sqlite.org/images/sqlite128.png</iconUrl>
    <licenseUrl>https://www.sqlite.org/copyright.html</licenseUrl>
    <tags>sqlite database ado.net provider interop</tags>
Changes to NuGet/SQLite.Core.MSIL.nuspec.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.Core.MSIL.nuspec -
 *
 * Written by Joe Mistachkin.
 * Released to the public domain, use at your own risk!
 *
-->
<package>
  <metadata>
    <id>System.Data.SQLite.Core.MSIL</id>
    <title>System.Data.SQLite Core (MSIL)</title>
    <version>1.0.106.0</version>
    <version>1.0.107.0</version>
    <authors>SQLite Development Team</authors>
    <description>An ADO.NET provider for SQLite (managed-only).</description>
    <language>en-US</language>
    <projectUrl>https://system.data.sqlite.org/</projectUrl>
    <iconUrl>https://system.data.sqlite.org/images/sqlite128.png</iconUrl>
    <licenseUrl>https://www.sqlite.org/copyright.html</licenseUrl>
    <tags>sqlite database ado.net provider interop</tags>
Changes to NuGet/SQLite.Core.Test.nuspec.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.Core.Test.nuspec -
 *
 * Written by Joe Mistachkin.
 * Released to the public domain, use at your own risk!
 *
-->
<package>
  <metadata>
    <id>System.Data.SQLite.Core.Test</id>
    <title>System.Data.SQLite Core (x86/x64) Test</title>
    <version>1.0.106.0</version>
    <version>1.0.107.0</version>
    <authors>SQLite Development Team</authors>
    <description>This is a pre-release package and is not intended for production use.  The official SQLite database engine for both x86 and x64 along with the ADO.NET provider.</description>
    <language>en-US</language>
    <projectUrl>https://system.data.sqlite.org/</projectUrl>
    <iconUrl>https://system.data.sqlite.org/images/sqlite128.png</iconUrl>
    <licenseUrl>https://www.sqlite.org/copyright.html</licenseUrl>
    <tags>sqlite database ado.net provider interop</tags>
Changes to NuGet/SQLite.Core.nuspec.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.Core.nuspec -
 *
 * Written by Joe Mistachkin.
 * Released to the public domain, use at your own risk!
 *
-->
<package>
  <metadata>
    <id>System.Data.SQLite.Core</id>
    <title>System.Data.SQLite Core (x86/x64)</title>
    <version>1.0.106.0</version>
    <version>1.0.107.0</version>
    <authors>SQLite Development Team</authors>
    <description>The official SQLite database engine for both x86 and x64 along with the ADO.NET provider.</description>
    <language>en-US</language>
    <projectUrl>https://system.data.sqlite.org/</projectUrl>
    <iconUrl>https://system.data.sqlite.org/images/sqlite128.png</iconUrl>
    <licenseUrl>https://www.sqlite.org/copyright.html</licenseUrl>
    <tags>sqlite database ado.net provider interop</tags>
Changes to NuGet/SQLite.EF6.Beta.nuspec.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.EF6.Beta.nuspec -
 *
 * Written by Joe Mistachkin.
 * Released to the public domain, use at your own risk!
 *
-->
<package>
  <metadata>
    <id>System.Data.SQLite.EF6.Beta</id>
    <title>System.Data.SQLite EF6 Beta</title>
    <version>1.0.106.0</version>
    <version>1.0.107.0</version>
    <authors>SQLite Development Team</authors>
    <description>This is a &quot;beta&quot; package and is not intended for production use.  Support for Entity Framework 6 using System.Data.SQLite.</description>
    <language>en-US</language>
    <projectUrl>https://system.data.sqlite.org/</projectUrl>
    <iconUrl>https://system.data.sqlite.org/images/sqlite128.png</iconUrl>
    <licenseUrl>https://www.sqlite.org/copyright.html</licenseUrl>
    <tags>sqlite database ado.net provider interop</tags>
Changes to NuGet/SQLite.EF6.Test.nuspec.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.EF6.Test.nuspec -
 *
 * Written by Joe Mistachkin.
 * Released to the public domain, use at your own risk!
 *
-->
<package>
  <metadata>
    <id>System.Data.SQLite.EF6.Test</id>
    <title>System.Data.SQLite EF6 Test</title>
    <version>1.0.106.0</version>
    <version>1.0.107.0</version>
    <authors>SQLite Development Team</authors>
    <description>This is a pre-release package and is not intended for production use.  Support for Entity Framework 6 using System.Data.SQLite.</description>
    <language>en-US</language>
    <projectUrl>https://system.data.sqlite.org/</projectUrl>
    <iconUrl>https://system.data.sqlite.org/images/sqlite128.png</iconUrl>
    <licenseUrl>https://www.sqlite.org/copyright.html</licenseUrl>
    <tags>sqlite database ado.net provider interop</tags>
Changes to NuGet/SQLite.EF6.nuspec.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.EF6.nuspec -
 *
 * Written by Joe Mistachkin.
 * Released to the public domain, use at your own risk!
 *
-->
<package>
  <metadata>
    <id>System.Data.SQLite.EF6</id>
    <title>System.Data.SQLite EF6</title>
    <version>1.0.106.0</version>
    <version>1.0.107.0</version>
    <authors>SQLite Development Team</authors>
    <description>Support for Entity Framework 6 using System.Data.SQLite.</description>
    <language>en-US</language>
    <projectUrl>https://system.data.sqlite.org/</projectUrl>
    <iconUrl>https://system.data.sqlite.org/images/sqlite128.png</iconUrl>
    <licenseUrl>https://www.sqlite.org/copyright.html</licenseUrl>
    <tags>sqlite database ado.net provider interop</tags>
Changes to NuGet/SQLite.Linq.Beta.nuspec.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.Linq.Beta.nuspec -
 *
 * Written by Joe Mistachkin.
 * Released to the public domain, use at your own risk!
 *
-->
<package>
  <metadata>
    <id>System.Data.SQLite.Linq.Beta</id>
    <title>System.Data.SQLite LINQ Beta</title>
    <version>1.0.106.0</version>
    <version>1.0.107.0</version>
    <authors>SQLite Development Team</authors>
    <description>This is a &quot;beta&quot; package and is not intended for production use.  Support for LINQ using System.Data.SQLite.</description>
    <language>en-US</language>
    <projectUrl>https://system.data.sqlite.org/</projectUrl>
    <iconUrl>https://system.data.sqlite.org/images/sqlite128.png</iconUrl>
    <licenseUrl>https://www.sqlite.org/copyright.html</licenseUrl>
    <tags>sqlite database ado.net provider interop</tags>
Changes to NuGet/SQLite.Linq.Test.nuspec.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.Linq.Test.nuspec -
 *
 * Written by Joe Mistachkin.
 * Released to the public domain, use at your own risk!
 *
-->
<package>
  <metadata>
    <id>System.Data.SQLite.Linq.Test</id>
    <title>System.Data.SQLite LINQ Test</title>
    <version>1.0.106.0</version>
    <version>1.0.107.0</version>
    <authors>SQLite Development Team</authors>
    <description>This is a pre-release package and is not intended for production use.  Support for LINQ using System.Data.SQLite.</description>
    <language>en-US</language>
    <projectUrl>https://system.data.sqlite.org/</projectUrl>
    <iconUrl>https://system.data.sqlite.org/images/sqlite128.png</iconUrl>
    <licenseUrl>https://www.sqlite.org/copyright.html</licenseUrl>
    <tags>sqlite database ado.net provider interop</tags>
Changes to NuGet/SQLite.Linq.nuspec.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21













-
+







<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.Linq.nuspec -
 *
 * Written by Joe Mistachkin.
 * Released to the public domain, use at your own risk!
 *
-->
<package>
  <metadata>
    <id>System.Data.SQLite.Linq</id>
    <title>System.Data.SQLite LINQ</title>
    <version>1.0.106.0</version>
    <version>1.0.107.0</version>
    <authors>SQLite Development Team</authors>
    <description>Support for LINQ using System.Data.SQLite.</description>
    <language>en-US</language>
    <projectUrl>https://system.data.sqlite.org/</projectUrl>
    <iconUrl>https://system.data.sqlite.org/images/sqlite128.png</iconUrl>
    <licenseUrl>https://www.sqlite.org/copyright.html</licenseUrl>
    <tags>sqlite database ado.net provider interop</tags>
Changes to NuGet/SQLite.MSIL.Beta.nuspec.
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
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













-
+










-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+





<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.MSIL.Beta.nuspec -
 *
 * Written by Joe Mistachkin.
 * Released to the public domain, use at your own risk!
 *
-->
<package>
  <metadata>
    <id>System.Data.SQLite.MSIL.Beta</id>
    <title>System.Data.SQLite (MSIL) Beta</title>
    <version>1.0.106.0</version>
    <version>1.0.107.0</version>
    <authors>SQLite Development Team</authors>
    <description>This is a &quot;beta&quot; package and is not intended for production use.  This is a legacy package; if possible, please use either the &quot;System.Data.SQLite.Beta&quot; or &quot;System.Data.SQLite.Core.Beta&quot; package instead.  An ADO.NET provider for SQLite (managed-only).</description>
    <language>en-US</language>
    <projectUrl>https://system.data.sqlite.org/</projectUrl>
    <iconUrl>https://system.data.sqlite.org/images/sqlite128.png</iconUrl>
    <licenseUrl>https://www.sqlite.org/copyright.html</licenseUrl>
    <tags>sqlite database ado.net provider interop</tags>
    <copyright>Public Domain</copyright>
    <dependencies>
      <group targetFramework="net20">
        <dependency id="System.Data.SQLite.Core.MSIL.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.MSIL.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net40">
        <dependency id="System.Data.SQLite.Core.MSIL.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.MSIL.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net45">
        <dependency id="System.Data.SQLite.Core.MSIL.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.MSIL.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net451">
        <dependency id="System.Data.SQLite.Core.MSIL.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.MSIL.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net46">
        <dependency id="System.Data.SQLite.Core.MSIL.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.MSIL.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net20">
        <dependency id="System.Data.SQLite.Linq.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net40">
        <dependency id="System.Data.SQLite.Linq.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net45">
        <dependency id="System.Data.SQLite.Linq.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net451">
        <dependency id="System.Data.SQLite.Linq.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net46">
        <dependency id="System.Data.SQLite.Linq.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net40">
        <dependency id="System.Data.SQLite.EF6.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net45">
        <dependency id="System.Data.SQLite.EF6.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net451">
        <dependency id="System.Data.SQLite.EF6.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6.Beta" version="1.0.107.0" />
      </group>
      <group targetFramework="net46">
        <dependency id="System.Data.SQLite.EF6.Beta" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6.Beta" version="1.0.107.0" />
      </group>
    </dependencies>
  </metadata>
  <files />
</package>
Changes to NuGet/SQLite.MSIL.Test.nuspec.
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
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













-
+










-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+





<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.MSIL.Test.nuspec -
 *
 * Written by Joe Mistachkin.
 * Released to the public domain, use at your own risk!
 *
-->
<package>
  <metadata>
    <id>System.Data.SQLite.MSIL.Test</id>
    <title>System.Data.SQLite (MSIL) Test</title>
    <version>1.0.106.0</version>
    <version>1.0.107.0</version>
    <authors>SQLite Development Team</authors>
    <description>This is a pre-release package and is not intended for production use.  This is a legacy package; if possible, please use either the &quot;System.Data.SQLite.Test&quot; or &quot;System.Data.SQLite.Core.Test&quot; package instead.  An ADO.NET provider for SQLite (managed-only).</description>
    <language>en-US</language>
    <projectUrl>https://system.data.sqlite.org/</projectUrl>
    <iconUrl>https://system.data.sqlite.org/images/sqlite128.png</iconUrl>
    <licenseUrl>https://www.sqlite.org/copyright.html</licenseUrl>
    <tags>sqlite database ado.net provider interop</tags>
    <copyright>Public Domain</copyright>
    <dependencies>
      <group targetFramework="net20">
        <dependency id="System.Data.SQLite.Core.MSIL.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.MSIL.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net40">
        <dependency id="System.Data.SQLite.Core.MSIL.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.MSIL.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net45">
        <dependency id="System.Data.SQLite.Core.MSIL.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.MSIL.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net451">
        <dependency id="System.Data.SQLite.Core.MSIL.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.MSIL.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net46">
        <dependency id="System.Data.SQLite.Core.MSIL.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.MSIL.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net20">
        <dependency id="System.Data.SQLite.Linq.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net40">
        <dependency id="System.Data.SQLite.Linq.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net45">
        <dependency id="System.Data.SQLite.Linq.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net451">
        <dependency id="System.Data.SQLite.Linq.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net46">
        <dependency id="System.Data.SQLite.Linq.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net40">
        <dependency id="System.Data.SQLite.EF6.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net45">
        <dependency id="System.Data.SQLite.EF6.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net451">
        <dependency id="System.Data.SQLite.EF6.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net46">
        <dependency id="System.Data.SQLite.EF6.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6.Test" version="1.0.107.0" />
      </group>
    </dependencies>
  </metadata>
  <files />
</package>
Changes to NuGet/SQLite.MSIL.nuspec.
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
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













-
+










-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+





<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.MSIL.nuspec -
 *
 * Written by Joe Mistachkin.
 * Released to the public domain, use at your own risk!
 *
-->
<package>
  <metadata>
    <id>System.Data.SQLite.MSIL</id>
    <title>System.Data.SQLite (MSIL)</title>
    <version>1.0.106.0</version>
    <version>1.0.107.0</version>
    <authors>SQLite Development Team</authors>
    <description>This is a legacy package; if possible, please use either the &quot;System.Data.SQLite&quot; or &quot;System.Data.SQLite.Core&quot; package instead.  An ADO.NET provider for SQLite (managed-only).</description>
    <language>en-US</language>
    <projectUrl>https://system.data.sqlite.org/</projectUrl>
    <iconUrl>https://system.data.sqlite.org/images/sqlite128.png</iconUrl>
    <licenseUrl>https://www.sqlite.org/copyright.html</licenseUrl>
    <tags>sqlite database ado.net provider interop</tags>
    <copyright>Public Domain</copyright>
    <dependencies>
      <group targetFramework="net20">
        <dependency id="System.Data.SQLite.Core.MSIL" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.MSIL" version="1.0.107.0" />
      </group>
      <group targetFramework="net40">
        <dependency id="System.Data.SQLite.Core.MSIL" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.MSIL" version="1.0.107.0" />
      </group>
      <group targetFramework="net45">
        <dependency id="System.Data.SQLite.Core.MSIL" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.MSIL" version="1.0.107.0" />
      </group>
      <group targetFramework="net451">
        <dependency id="System.Data.SQLite.Core.MSIL" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.MSIL" version="1.0.107.0" />
      </group>
      <group targetFramework="net46">
        <dependency id="System.Data.SQLite.Core.MSIL" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.MSIL" version="1.0.107.0" />
      </group>
      <group targetFramework="net20">
        <dependency id="System.Data.SQLite.Linq" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq" version="1.0.107.0" />
      </group>
      <group targetFramework="net40">
        <dependency id="System.Data.SQLite.Linq" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq" version="1.0.107.0" />
      </group>
      <group targetFramework="net45">
        <dependency id="System.Data.SQLite.Linq" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq" version="1.0.107.0" />
      </group>
      <group targetFramework="net451">
        <dependency id="System.Data.SQLite.Linq" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq" version="1.0.107.0" />
      </group>
      <group targetFramework="net46">
        <dependency id="System.Data.SQLite.Linq" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq" version="1.0.107.0" />
      </group>
      <group targetFramework="net40">
        <dependency id="System.Data.SQLite.EF6" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6" version="1.0.107.0" />
      </group>
      <group targetFramework="net45">
        <dependency id="System.Data.SQLite.EF6" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6" version="1.0.107.0" />
      </group>
      <group targetFramework="net451">
        <dependency id="System.Data.SQLite.EF6" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6" version="1.0.107.0" />
      </group>
      <group targetFramework="net46">
        <dependency id="System.Data.SQLite.EF6" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6" version="1.0.107.0" />
      </group>
    </dependencies>
  </metadata>
  <files />
</package>
Changes to NuGet/SQLite.Test.nuspec.
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
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













-
+










-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+





<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.Test.nuspec -
 *
 * Written by Joe Mistachkin.
 * Released to the public domain, use at your own risk!
 *
-->
<package>
  <metadata>
    <id>System.Data.SQLite.Test</id>
    <title>System.Data.SQLite (x86/x64) Test</title>
    <version>1.0.106.0</version>
    <version>1.0.107.0</version>
    <authors>SQLite Development Team</authors>
    <description>This is a pre-release package and is not intended for production use.  The official SQLite database engine for both x86 and x64 along with the ADO.NET provider.  This package includes support for LINQ and Entity Framework 6.</description>
    <language>en-US</language>
    <projectUrl>https://system.data.sqlite.org/</projectUrl>
    <iconUrl>https://system.data.sqlite.org/images/sqlite128.png</iconUrl>
    <licenseUrl>https://www.sqlite.org/copyright.html</licenseUrl>
    <tags>sqlite database ado.net provider interop</tags>
    <copyright>Public Domain</copyright>
    <dependencies>
      <group targetFramework="net20">
        <dependency id="System.Data.SQLite.Core.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net40">
        <dependency id="System.Data.SQLite.Core.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net45">
        <dependency id="System.Data.SQLite.Core.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net451">
        <dependency id="System.Data.SQLite.Core.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net46">
        <dependency id="System.Data.SQLite.Core.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net20">
        <dependency id="System.Data.SQLite.Linq.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net40">
        <dependency id="System.Data.SQLite.Linq.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net45">
        <dependency id="System.Data.SQLite.Linq.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net451">
        <dependency id="System.Data.SQLite.Linq.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net46">
        <dependency id="System.Data.SQLite.Linq.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net40">
        <dependency id="System.Data.SQLite.EF6.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net45">
        <dependency id="System.Data.SQLite.EF6.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net451">
        <dependency id="System.Data.SQLite.EF6.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6.Test" version="1.0.107.0" />
      </group>
      <group targetFramework="net46">
        <dependency id="System.Data.SQLite.EF6.Test" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6.Test" version="1.0.107.0" />
      </group>
    </dependencies>
  </metadata>
  <files />
</package>
Changes to NuGet/SQLite.nuspec.
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
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













-
+










-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+





<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.nuspec -
 *
 * Written by Joe Mistachkin.
 * Released to the public domain, use at your own risk!
 *
-->
<package>
  <metadata>
    <id>System.Data.SQLite</id>
    <title>System.Data.SQLite (x86/x64)</title>
    <version>1.0.106.0</version>
    <version>1.0.107.0</version>
    <authors>SQLite Development Team</authors>
    <description>The official SQLite database engine for both x86 and x64 along with the ADO.NET provider.  This package includes support for LINQ and Entity Framework 6.</description>
    <language>en-US</language>
    <projectUrl>https://system.data.sqlite.org/</projectUrl>
    <iconUrl>https://system.data.sqlite.org/images/sqlite128.png</iconUrl>
    <licenseUrl>https://www.sqlite.org/copyright.html</licenseUrl>
    <tags>sqlite database ado.net provider interop</tags>
    <copyright>Public Domain</copyright>
    <dependencies>
      <group targetFramework="net20">
        <dependency id="System.Data.SQLite.Core" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core" version="1.0.107.0" />
      </group>
      <group targetFramework="net40">
        <dependency id="System.Data.SQLite.Core" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core" version="1.0.107.0" />
      </group>
      <group targetFramework="net45">
        <dependency id="System.Data.SQLite.Core" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core" version="1.0.107.0" />
      </group>
      <group targetFramework="net451">
        <dependency id="System.Data.SQLite.Core" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core" version="1.0.107.0" />
      </group>
      <group targetFramework="net46">
        <dependency id="System.Data.SQLite.Core" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Core" version="1.0.107.0" />
      </group>
      <group targetFramework="net20">
        <dependency id="System.Data.SQLite.Linq" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq" version="1.0.107.0" />
      </group>
      <group targetFramework="net40">
        <dependency id="System.Data.SQLite.Linq" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq" version="1.0.107.0" />
      </group>
      <group targetFramework="net45">
        <dependency id="System.Data.SQLite.Linq" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq" version="1.0.107.0" />
      </group>
      <group targetFramework="net451">
        <dependency id="System.Data.SQLite.Linq" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq" version="1.0.107.0" />
      </group>
      <group targetFramework="net46">
        <dependency id="System.Data.SQLite.Linq" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq" version="1.0.107.0" />
      </group>
      <group targetFramework="net40">
        <dependency id="System.Data.SQLite.EF6" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6" version="1.0.107.0" />
      </group>
      <group targetFramework="net45">
        <dependency id="System.Data.SQLite.EF6" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6" version="1.0.107.0" />
      </group>
      <group targetFramework="net451">
        <dependency id="System.Data.SQLite.EF6" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6" version="1.0.107.0" />
      </group>
      <group targetFramework="net46">
        <dependency id="System.Data.SQLite.EF6" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6" version="1.0.107.0" />
      </group>
    </dependencies>
  </metadata>
  <files />
</package>
Changes to NuGet/SQLite.x64.nuspec.
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
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












-
+










-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+







<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.x64.nuspec -
 *
 * Written by Joe Mistachkin.
 * Released to the public domain, use at your own risk!
 *
-->
<package>
  <metadata>
    <id>System.Data.SQLite.x64</id>
    <version>1.0.106.0</version>
    <version>1.0.107.0</version>
    <authors>SQLite Development Team</authors>
    <description>This is a legacy package; if possible, please use either the &quot;System.Data.SQLite&quot; or &quot;System.Data.SQLite.Core&quot; package instead.  The official SQLite database engine combined with a complete ADO.NET provider all rolled into a single mixed-mode assembly for x64.</description>
    <language>en-US</language>
    <projectUrl>https://system.data.sqlite.org/</projectUrl>
    <iconUrl>https://system.data.sqlite.org/images/sqlite128.png</iconUrl>
    <licenseUrl>https://www.sqlite.org/copyright.html</licenseUrl>
    <tags>sqlite database ado.net provider interop</tags>
    <copyright>Public Domain</copyright>
    <dependencies>
      <group targetFramework="net20">
        <dependency id="System.Data.SQLite.Linq" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq" version="1.0.107.0" />
      </group>
      <group targetFramework="net40">
        <dependency id="System.Data.SQLite.Linq" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq" version="1.0.107.0" />
      </group>
      <group targetFramework="net45">
        <dependency id="System.Data.SQLite.Linq" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq" version="1.0.107.0" />
      </group>
      <group targetFramework="net451">
        <dependency id="System.Data.SQLite.Linq" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq" version="1.0.107.0" />
      </group>
      <group targetFramework="net46">
        <dependency id="System.Data.SQLite.Linq" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq" version="1.0.107.0" />
      </group>
      <group targetFramework="net40">
        <dependency id="System.Data.SQLite.EF6" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6" version="1.0.107.0" />
      </group>
      <group targetFramework="net45">
        <dependency id="System.Data.SQLite.EF6" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6" version="1.0.107.0" />
      </group>
      <group targetFramework="net451">
        <dependency id="System.Data.SQLite.EF6" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6" version="1.0.107.0" />
      </group>
      <group targetFramework="net46">
        <dependency id="System.Data.SQLite.EF6" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6" version="1.0.107.0" />
      </group>
    </dependencies>
  </metadata>
  <files>
    <file src="..\bin\2008\x64\ReleaseStatic\System.Data.SQLite.dll" target="lib\net20" />
    <file src="..\bin\2008\Release\bin\System.Data.SQLite.xml" target="lib\net20" />
    <file src="..\bin\2010\x64\ReleaseStatic\System.Data.SQLite.dll" target="lib\net40" />
Changes to NuGet/SQLite.x86.nuspec.
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
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












-
+










-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+


-
+







<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.x86.nuspec -
 *
 * Written by Joe Mistachkin.
 * Released to the public domain, use at your own risk!
 *
-->
<package>
  <metadata>
    <id>System.Data.SQLite.x86</id>
    <version>1.0.106.0</version>
    <version>1.0.107.0</version>
    <authors>SQLite Development Team</authors>
    <description>This is a legacy package; if possible, please use either the &quot;System.Data.SQLite&quot; or &quot;System.Data.SQLite.Core&quot; package instead.  The official SQLite database engine combined with a complete ADO.NET provider all rolled into a single mixed-mode assembly for x86.</description>
    <language>en-US</language>
    <projectUrl>https://system.data.sqlite.org/</projectUrl>
    <iconUrl>https://system.data.sqlite.org/images/sqlite128.png</iconUrl>
    <licenseUrl>https://www.sqlite.org/copyright.html</licenseUrl>
    <tags>sqlite database ado.net provider interop</tags>
    <copyright>Public Domain</copyright>
    <dependencies>
      <group targetFramework="net20">
        <dependency id="System.Data.SQLite.Linq" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq" version="1.0.107.0" />
      </group>
      <group targetFramework="net40">
        <dependency id="System.Data.SQLite.Linq" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq" version="1.0.107.0" />
      </group>
      <group targetFramework="net45">
        <dependency id="System.Data.SQLite.Linq" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq" version="1.0.107.0" />
      </group>
      <group targetFramework="net451">
        <dependency id="System.Data.SQLite.Linq" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq" version="1.0.107.0" />
      </group>
      <group targetFramework="net46">
        <dependency id="System.Data.SQLite.Linq" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.Linq" version="1.0.107.0" />
      </group>
      <group targetFramework="net40">
        <dependency id="System.Data.SQLite.EF6" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6" version="1.0.107.0" />
      </group>
      <group targetFramework="net45">
        <dependency id="System.Data.SQLite.EF6" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6" version="1.0.107.0" />
      </group>
      <group targetFramework="net451">
        <dependency id="System.Data.SQLite.EF6" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6" version="1.0.107.0" />
      </group>
      <group targetFramework="net46">
        <dependency id="System.Data.SQLite.EF6" version="1.0.106.0" />
        <dependency id="System.Data.SQLite.EF6" version="1.0.107.0" />
      </group>
    </dependencies>
  </metadata>
  <files>
    <file src="..\bin\2008\Win32\ReleaseStatic\System.Data.SQLite.dll" target="lib\net20" />
    <file src="..\bin\2008\Release\bin\System.Data.SQLite.xml" target="lib\net20" />
    <file src="..\bin\2010\Win32\ReleaseStatic\System.Data.SQLite.dll" target="lib\net40" />
Changes to SQLite.Designer/AssemblyInfo.cs.
39
40
41
42
43
44
45
46
47


39
40
41
42
43
44
45


46
47







-
-
+
+
//      Major Version
//      Minor Version 
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Revision and Build Numbers 
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.0.106.0")]
[assembly: AssemblyFileVersion("1.0.106.0")]
[assembly: AssemblyVersion("1.0.107.0")]
[assembly: AssemblyFileVersion("1.0.107.0")]
Changes to SQLite.Designer/SQLiteOptions.cs.
47
48
49
50
51
52
53
54

55
56
57
58
59
60
61
47
48
49
50
51
52
53

54
55
56
57
58
59
60
61







-
+







        /// design-time components.  It is also the default value for the
        /// associated option key.
        /// </summary>
        private static readonly string LegacyProviderName = "System.Data.SQLite";

        ///////////////////////////////////////////////////////////////////////

#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
        /// <summary>
        /// This is the provider name used when Entity Framework 6.x support is
        /// required for use with the System.Data.SQLite design-time components.
        /// This provider name is only available when this class is compiled for
        /// the .NET Framework 4.0 or later.
        /// </summary>
        private static readonly string Ef6ProviderName = "System.Data.SQLite.EF6";
112
113
114
115
116
117
118
119

120
121
122
123
124
125
126
112
113
114
115
116
117
118

119
120
121
122
123
124
125
126







-
+








                string key = ProviderNameKey;
                string value = Environment.GetEnvironmentVariable(
                    ProviderNameEnvVarName);

                if (IsValidValue(key, value))
                    options[key] = value;
#if !NET_40 && !NET_45 && !NET_451 && !NET_452 && !NET_46 && !NET_461 && !NET_462 && !NET_47
#if !NET_40 && !NET_45 && !NET_451 && !NET_452 && !NET_46 && !NET_461 && !NET_462 && !NET_47 && !NET_471
                else
                    options[key] = LegacyProviderName;
#endif
            }
        }
        #endregion

135
136
137
138
139
140
141
142

143
144
145
146
147
148
149
135
136
137
138
139
140
141

142
143
144
145
146
147
148
149







-
+







        /// <returns>
        /// The configured ADO.NET provider name for System.Data.SQLite -OR-
        /// the default ADO.NET provider name for System.Data.SQLite in the
        /// event of any failure.  This method cannot return null.
        /// </returns>
        public static string GetProviderName()
        {
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
            return GetProviderName(Ef6ProviderName);
#else
            return GetProviderName(LegacyProviderName);
#endif
        }

        ///////////////////////////////////////////////////////////////////////
351
352
353
354
355
356
357
358

359
360
361
362
363
364
365
351
352
353
354
355
356
357

358
359
360
361
362
363
364
365







-
+







            int result = 0;

            if (items == null)
                return result;

            IList<string> names = new List<string>();

#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
            names.Add(Ef6ProviderName);
#endif

            names.Add(LegacyProviderName);

            foreach (string name in names)
            {
428
429
430
431
432
433
434
435

436
437
438
439
440
441
442
428
429
430
431
432
433
434

435
436
437
438
439
440
441
442







-
+







            string value
            )
        {
            if (String.Equals(
                    key, ProviderNameKey, StringComparison.Ordinal) &&
                (String.Equals(
                    value, LegacyProviderName, StringComparison.Ordinal)
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
                || String.Equals(
                    value, Ef6ProviderName, StringComparison.Ordinal)
#endif
                ))
            {
                return true;
            }
Changes to SQLite.Designer/source.extension.vsixmanifest.
1
2
3
4
5
6

7
8
9
10
11
12
13
1
2
3
4
5

6
7
8
9
10
11
12
13





-
+







<?xml version="1.0" encoding="utf-8"?>
<Vsix Version="1.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2010">
  <Identifier Id="67b5f3a9-cde1-430f-a12b-af95bb064851">
    <Name>System.Data.SQLite Designer</Name>
    <Author>https://system.data.sqlite.org/</Author>
    <Version>1.0.106.0</Version>
    <Version>1.0.107.0</Version>
    <Description>ADO.NET Data Designer for SQLite</Description>
    <Locale>1033</Locale>
    <InstalledByMsi>false</InstalledByMsi>
    <SupportedProducts>
      <VisualStudio Version="10.0">
        <Edition>Pro</Edition>
      </VisualStudio>
Changes to SQLite.Interop/props/SQLite.Interop.2005.vsprops.
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
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







-
+









-
+




-
+







	<UserMacro
		Name="ConfigurationYear"
		Value="2005"
		PerformEnvironmentSet="true"
	/>
	<UserMacro
		Name="INTEROP_BUILD_NUMBER"
		Value="106"
		Value="107"
		PerformEnvironmentSet="true"
	/>
	<UserMacro
		Name="INTEROP_LINKER_VERSION"
		Value="1.0"
		PerformEnvironmentSet="true"
	/>
	<UserMacro
		Name="INTEROP_MANIFEST_VERSION"
		Value="1.0.106.0"
		Value="1.0.107.0"
		PerformEnvironmentSet="true"
	/>
	<UserMacro
		Name="INTEROP_RC_VERSION"
		Value="1,0,106,0"
		Value="1,0,107,0"
		PerformEnvironmentSet="true"
	/>
	<UserMacro
		Name="INTEROP_INCLUDE_DIRECTORIES"
		Value="src\core"
		PerformEnvironmentSet="true"
	/>
55
56
57
58
59
60
61
62

63
64
65
66
67
68
69
55
56
57
58
59
60
61

62
63
64
65
66
67
68
69







-
+







	<UserMacro
		Name="INTEROP_DEBUG_DEFINES"
		Value="INTEROP_DEBUG=0x31F;INTEROP_LOG=1;INTEROP_TEST_EXTENSION=1"
		PerformEnvironmentSet="true"
	/>
	<UserMacro
		Name="INTEROP_EXTRA_DEFINES"
		Value="INTEROP_PLACEHOLDER=1;INTEROP_EXTENSION_FUNCTIONS=1;INTEROP_VIRTUAL_TABLE=1;INTEROP_FTS5_EXTENSION=1;INTEROP_PERCENTILE_EXTENSION=1;INTEROP_TOTYPE_EXTENSION=1;INTEROP_REGEXP_EXTENSION=1;INTEROP_JSON1_EXTENSION=1;INTEROP_SHA1_EXTENSION=1;INTEROP_SESSION_EXTENSION=1"
		Value="INTEROP_PLACEHOLDER=1;INTEROP_EXTENSION_FUNCTIONS=1;INTEROP_CODEC=1;INTEROP_VIRTUAL_TABLE=1;INTEROP_FTS5_EXTENSION=1;INTEROP_PERCENTILE_EXTENSION=1;INTEROP_TOTYPE_EXTENSION=1;INTEROP_REGEXP_EXTENSION=1;INTEROP_JSON1_EXTENSION=1;INTEROP_SHA1_EXTENSION=1;INTEROP_SESSION_EXTENSION=1"
		PerformEnvironmentSet="true"
	/>
	<UserMacro
		Name="INTEROP_ASSEMBLY_RESOURCES"
		Value="/ASSEMBLYRESOURCE:..\System.Data.SQLite\Resources\SQLiteCommand.bmp,System.Data.SQLite.SQLiteCommand.bmp /ASSEMBLYRESOURCE:..\System.Data.SQLite\Resources\SQLiteConnection.bmp,System.Data.SQLite.SQLiteConnection.bmp /ASSEMBLYRESOURCE:..\System.Data.SQLite\Resources\SQLiteDataAdapter.bmp,System.Data.SQLite.SQLiteDataAdapter.bmp"
		PerformEnvironmentSet="true"
	/>
Changes to SQLite.Interop/props/SQLite.Interop.2008.vsprops.
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
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







-
+









-
+




-
+







	<UserMacro
		Name="ConfigurationYear"
		Value="2008"
		PerformEnvironmentSet="true"
	/>
	<UserMacro
		Name="INTEROP_BUILD_NUMBER"
		Value="106"
		Value="107"
		PerformEnvironmentSet="true"
	/>
	<UserMacro
		Name="INTEROP_LINKER_VERSION"
		Value="1.0"
		PerformEnvironmentSet="true"
	/>
	<UserMacro
		Name="INTEROP_MANIFEST_VERSION"
		Value="1.0.106.0"
		Value="1.0.107.0"
		PerformEnvironmentSet="true"
	/>
	<UserMacro
		Name="INTEROP_RC_VERSION"
		Value="1,0,106,0"
		Value="1,0,107,0"
		PerformEnvironmentSet="true"
	/>
	<UserMacro
		Name="INTEROP_INCLUDE_DIRECTORIES"
		Value="src\core"
		PerformEnvironmentSet="true"
	/>
55
56
57
58
59
60
61
62

63
64
65
66
67
68
69
55
56
57
58
59
60
61

62
63
64
65
66
67
68
69







-
+







	<UserMacro
		Name="INTEROP_DEBUG_DEFINES"
		Value="INTEROP_DEBUG=0x31F;INTEROP_LOG=1;INTEROP_TEST_EXTENSION=1"
		PerformEnvironmentSet="true"
	/>
	<UserMacro
		Name="INTEROP_EXTRA_DEFINES"
		Value="INTEROP_PLACEHOLDER=1;INTEROP_EXTENSION_FUNCTIONS=1;INTEROP_VIRTUAL_TABLE=1;INTEROP_FTS5_EXTENSION=1;INTEROP_PERCENTILE_EXTENSION=1;INTEROP_TOTYPE_EXTENSION=1;INTEROP_REGEXP_EXTENSION=1;INTEROP_JSON1_EXTENSION=1;INTEROP_SHA1_EXTENSION=1;INTEROP_SESSION_EXTENSION=1"
		Value="INTEROP_PLACEHOLDER=1;INTEROP_EXTENSION_FUNCTIONS=1;INTEROP_CODEC=1;INTEROP_VIRTUAL_TABLE=1;INTEROP_FTS5_EXTENSION=1;INTEROP_PERCENTILE_EXTENSION=1;INTEROP_TOTYPE_EXTENSION=1;INTEROP_REGEXP_EXTENSION=1;INTEROP_JSON1_EXTENSION=1;INTEROP_SHA1_EXTENSION=1;INTEROP_SESSION_EXTENSION=1"
		PerformEnvironmentSet="true"
	/>
	<UserMacro
		Name="INTEROP_ASSEMBLY_RESOURCES"
		Value="/ASSEMBLYRESOURCE:..\System.Data.SQLite\Resources\SQLiteCommand.bmp,System.Data.SQLite.SQLiteCommand.bmp /ASSEMBLYRESOURCE:..\System.Data.SQLite\Resources\SQLiteConnection.bmp,System.Data.SQLite.SQLiteConnection.bmp /ASSEMBLYRESOURCE:..\System.Data.SQLite\Resources\SQLiteDataAdapter.bmp,System.Data.SQLite.SQLiteDataAdapter.bmp"
		PerformEnvironmentSet="true"
	/>
Changes to SQLite.Interop/props/SQLite.Interop.2010.props.
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
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












-
+

-
-
+
+




-
+







<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.Interop.2010.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">
    <ConfigurationYear>2010</ConfigurationYear>
    <INTEROP_BUILD_NUMBER>106</INTEROP_BUILD_NUMBER>
    <INTEROP_BUILD_NUMBER>107</INTEROP_BUILD_NUMBER>
    <INTEROP_LINKER_VERSION>1.0</INTEROP_LINKER_VERSION>
    <INTEROP_MANIFEST_VERSION>1.0.106.0</INTEROP_MANIFEST_VERSION>
    <INTEROP_RC_VERSION>1,0,106,0</INTEROP_RC_VERSION>
    <INTEROP_MANIFEST_VERSION>1.0.107.0</INTEROP_MANIFEST_VERSION>
    <INTEROP_RC_VERSION>1,0,107,0</INTEROP_RC_VERSION>
    <INTEROP_INCLUDE_DIRECTORIES>src\core</INTEROP_INCLUDE_DIRECTORIES>
    <INTEROP_LIBRARY_DIRECTORIES></INTEROP_LIBRARY_DIRECTORIES>
    <INTEROP_LIBRARY_DEPENDENCIES></INTEROP_LIBRARY_DEPENDENCIES>
    <INTEROP_DEBUG_DEFINES>INTEROP_DEBUG=0x31F;INTEROP_LOG=1;INTEROP_TEST_EXTENSION=1</INTEROP_DEBUG_DEFINES>
    <INTEROP_EXTRA_DEFINES>INTEROP_PLACEHOLDER=1;INTEROP_EXTENSION_FUNCTIONS=1;INTEROP_VIRTUAL_TABLE=1;INTEROP_FTS5_EXTENSION=1;INTEROP_PERCENTILE_EXTENSION=1;INTEROP_TOTYPE_EXTENSION=1;INTEROP_REGEXP_EXTENSION=1;INTEROP_JSON1_EXTENSION=1;INTEROP_SHA1_EXTENSION=1;INTEROP_SESSION_EXTENSION=1</INTEROP_EXTRA_DEFINES>
    <INTEROP_EXTRA_DEFINES>INTEROP_PLACEHOLDER=1;INTEROP_EXTENSION_FUNCTIONS=1;INTEROP_CODEC=1;INTEROP_VIRTUAL_TABLE=1;INTEROP_FTS5_EXTENSION=1;INTEROP_PERCENTILE_EXTENSION=1;INTEROP_TOTYPE_EXTENSION=1;INTEROP_REGEXP_EXTENSION=1;INTEROP_JSON1_EXTENSION=1;INTEROP_SHA1_EXTENSION=1;INTEROP_SESSION_EXTENSION=1</INTEROP_EXTRA_DEFINES>
    <INTEROP_ASSEMBLY_RESOURCES>/ASSEMBLYRESOURCE:..\System.Data.SQLite\Resources\SQLiteCommand.bmp,System.Data.SQLite.SQLiteCommand.bmp /ASSEMBLYRESOURCE:..\System.Data.SQLite\Resources\SQLiteConnection.bmp,System.Data.SQLite.SQLiteConnection.bmp /ASSEMBLYRESOURCE:..\System.Data.SQLite\Resources\SQLiteDataAdapter.bmp,System.Data.SQLite.SQLiteDataAdapter.bmp</INTEROP_ASSEMBLY_RESOURCES>
    <INTEROP_KEY_FILE>$(ProjectDir)..\Keys\System.Data.SQLite.snk</INTEROP_KEY_FILE>
    <INTEROP_NATIVE_NAME>SQLite.Interop</INTEROP_NATIVE_NAME>
    <INTEROP_MIXED_NAME>System.Data.SQLite</INTEROP_MIXED_NAME>
  </PropertyGroup>
  <ItemGroup>
    <BuildMacro Include="ConfigurationYear">
Changes to SQLite.Interop/props/SQLite.Interop.2012.props.
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
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












-
+

-
-
+
+




-
+







<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.Interop.2012.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">
    <ConfigurationYear>2012</ConfigurationYear>
    <INTEROP_BUILD_NUMBER>106</INTEROP_BUILD_NUMBER>
    <INTEROP_BUILD_NUMBER>107</INTEROP_BUILD_NUMBER>
    <INTEROP_LINKER_VERSION>1.0</INTEROP_LINKER_VERSION>
    <INTEROP_MANIFEST_VERSION>1.0.106.0</INTEROP_MANIFEST_VERSION>
    <INTEROP_RC_VERSION>1,0,106,0</INTEROP_RC_VERSION>
    <INTEROP_MANIFEST_VERSION>1.0.107.0</INTEROP_MANIFEST_VERSION>
    <INTEROP_RC_VERSION>1,0,107,0</INTEROP_RC_VERSION>
    <INTEROP_INCLUDE_DIRECTORIES>src\core</INTEROP_INCLUDE_DIRECTORIES>
    <INTEROP_LIBRARY_DIRECTORIES></INTEROP_LIBRARY_DIRECTORIES>
    <INTEROP_LIBRARY_DEPENDENCIES></INTEROP_LIBRARY_DEPENDENCIES>
    <INTEROP_DEBUG_DEFINES>INTEROP_DEBUG=0x31F;INTEROP_LOG=1;INTEROP_TEST_EXTENSION=1</INTEROP_DEBUG_DEFINES>
    <INTEROP_EXTRA_DEFINES>INTEROP_PLACEHOLDER=1;INTEROP_EXTENSION_FUNCTIONS=1;INTEROP_VIRTUAL_TABLE=1;INTEROP_FTS5_EXTENSION=1;INTEROP_PERCENTILE_EXTENSION=1;INTEROP_TOTYPE_EXTENSION=1;INTEROP_REGEXP_EXTENSION=1;INTEROP_JSON1_EXTENSION=1;INTEROP_SHA1_EXTENSION=1;INTEROP_SESSION_EXTENSION=1</INTEROP_EXTRA_DEFINES>
    <INTEROP_EXTRA_DEFINES>INTEROP_PLACEHOLDER=1;INTEROP_EXTENSION_FUNCTIONS=1;INTEROP_CODEC=1;INTEROP_VIRTUAL_TABLE=1;INTEROP_FTS5_EXTENSION=1;INTEROP_PERCENTILE_EXTENSION=1;INTEROP_TOTYPE_EXTENSION=1;INTEROP_REGEXP_EXTENSION=1;INTEROP_JSON1_EXTENSION=1;INTEROP_SHA1_EXTENSION=1;INTEROP_SESSION_EXTENSION=1</INTEROP_EXTRA_DEFINES>
    <INTEROP_ASSEMBLY_RESOURCES>/ASSEMBLYRESOURCE:..\System.Data.SQLite\Resources\SQLiteCommand.bmp,System.Data.SQLite.SQLiteCommand.bmp /ASSEMBLYRESOURCE:..\System.Data.SQLite\Resources\SQLiteConnection.bmp,System.Data.SQLite.SQLiteConnection.bmp /ASSEMBLYRESOURCE:..\System.Data.SQLite\Resources\SQLiteDataAdapter.bmp,System.Data.SQLite.SQLiteDataAdapter.bmp</INTEROP_ASSEMBLY_RESOURCES>
    <INTEROP_KEY_FILE>$(ProjectDir)..\Keys\System.Data.SQLite.snk</INTEROP_KEY_FILE>
    <INTEROP_NATIVE_NAME>SQLite.Interop</INTEROP_NATIVE_NAME>
    <INTEROP_MIXED_NAME>System.Data.SQLite</INTEROP_MIXED_NAME>
  </PropertyGroup>
  <ItemGroup>
    <BuildMacro Include="ConfigurationYear">
Changes to SQLite.Interop/props/SQLite.Interop.2013.props.
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
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












-
+

-
-
+
+




-
+







<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.Interop.2013.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="12.0">
  <PropertyGroup Label="UserMacros">
    <ConfigurationYear>2013</ConfigurationYear>
    <INTEROP_BUILD_NUMBER>106</INTEROP_BUILD_NUMBER>
    <INTEROP_BUILD_NUMBER>107</INTEROP_BUILD_NUMBER>
    <INTEROP_LINKER_VERSION>1.0</INTEROP_LINKER_VERSION>
    <INTEROP_MANIFEST_VERSION>1.0.106.0</INTEROP_MANIFEST_VERSION>
    <INTEROP_RC_VERSION>1,0,106,0</INTEROP_RC_VERSION>
    <INTEROP_MANIFEST_VERSION>1.0.107.0</INTEROP_MANIFEST_VERSION>
    <INTEROP_RC_VERSION>1,0,107,0</INTEROP_RC_VERSION>
    <INTEROP_INCLUDE_DIRECTORIES>src\core</INTEROP_INCLUDE_DIRECTORIES>
    <INTEROP_LIBRARY_DIRECTORIES></INTEROP_LIBRARY_DIRECTORIES>
    <INTEROP_LIBRARY_DEPENDENCIES></INTEROP_LIBRARY_DEPENDENCIES>
    <INTEROP_DEBUG_DEFINES>INTEROP_DEBUG=0x31F;INTEROP_LOG=1;INTEROP_TEST_EXTENSION=1</INTEROP_DEBUG_DEFINES>
    <INTEROP_EXTRA_DEFINES>INTEROP_PLACEHOLDER=1;INTEROP_EXTENSION_FUNCTIONS=1;INTEROP_VIRTUAL_TABLE=1;INTEROP_FTS5_EXTENSION=1;INTEROP_PERCENTILE_EXTENSION=1;INTEROP_TOTYPE_EXTENSION=1;INTEROP_REGEXP_EXTENSION=1;INTEROP_JSON1_EXTENSION=1;INTEROP_SHA1_EXTENSION=1;INTEROP_SESSION_EXTENSION=1</INTEROP_EXTRA_DEFINES>
    <INTEROP_EXTRA_DEFINES>INTEROP_PLACEHOLDER=1;INTEROP_EXTENSION_FUNCTIONS=1;INTEROP_CODEC=1;INTEROP_VIRTUAL_TABLE=1;INTEROP_FTS5_EXTENSION=1;INTEROP_PERCENTILE_EXTENSION=1;INTEROP_TOTYPE_EXTENSION=1;INTEROP_REGEXP_EXTENSION=1;INTEROP_JSON1_EXTENSION=1;INTEROP_SHA1_EXTENSION=1;INTEROP_SESSION_EXTENSION=1</INTEROP_EXTRA_DEFINES>
    <INTEROP_ASSEMBLY_RESOURCES>/ASSEMBLYRESOURCE:..\System.Data.SQLite\Resources\SQLiteCommand.bmp,System.Data.SQLite.SQLiteCommand.bmp /ASSEMBLYRESOURCE:..\System.Data.SQLite\Resources\SQLiteConnection.bmp,System.Data.SQLite.SQLiteConnection.bmp /ASSEMBLYRESOURCE:..\System.Data.SQLite\Resources\SQLiteDataAdapter.bmp,System.Data.SQLite.SQLiteDataAdapter.bmp</INTEROP_ASSEMBLY_RESOURCES>
    <INTEROP_KEY_FILE>$(ProjectDir)..\Keys\System.Data.SQLite.snk</INTEROP_KEY_FILE>
    <INTEROP_NATIVE_NAME>SQLite.Interop</INTEROP_NATIVE_NAME>
    <INTEROP_MIXED_NAME>System.Data.SQLite</INTEROP_MIXED_NAME>
  </PropertyGroup>
  <ItemGroup>
    <BuildMacro Include="ConfigurationYear">
Changes to SQLite.Interop/props/SQLite.Interop.2015.props.
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
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












-
+

-
-
+
+




-
+







<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.Interop.2015.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="14.0">
  <PropertyGroup Label="UserMacros">
    <ConfigurationYear>2015</ConfigurationYear>
    <INTEROP_BUILD_NUMBER>106</INTEROP_BUILD_NUMBER>
    <INTEROP_BUILD_NUMBER>107</INTEROP_BUILD_NUMBER>
    <INTEROP_LINKER_VERSION>1.0</INTEROP_LINKER_VERSION>
    <INTEROP_MANIFEST_VERSION>1.0.106.0</INTEROP_MANIFEST_VERSION>
    <INTEROP_RC_VERSION>1,0,106,0</INTEROP_RC_VERSION>
    <INTEROP_MANIFEST_VERSION>1.0.107.0</INTEROP_MANIFEST_VERSION>
    <INTEROP_RC_VERSION>1,0,107,0</INTEROP_RC_VERSION>
    <INTEROP_INCLUDE_DIRECTORIES>src\core</INTEROP_INCLUDE_DIRECTORIES>
    <INTEROP_LIBRARY_DIRECTORIES></INTEROP_LIBRARY_DIRECTORIES>
    <INTEROP_LIBRARY_DEPENDENCIES></INTEROP_LIBRARY_DEPENDENCIES>
    <INTEROP_DEBUG_DEFINES>INTEROP_DEBUG=0x31F;INTEROP_LOG=1;INTEROP_TEST_EXTENSION=1</INTEROP_DEBUG_DEFINES>
    <INTEROP_EXTRA_DEFINES>INTEROP_PLACEHOLDER=1;INTEROP_EXTENSION_FUNCTIONS=1;INTEROP_VIRTUAL_TABLE=1;INTEROP_FTS5_EXTENSION=1;INTEROP_PERCENTILE_EXTENSION=1;INTEROP_TOTYPE_EXTENSION=1;INTEROP_REGEXP_EXTENSION=1;INTEROP_JSON1_EXTENSION=1;INTEROP_SHA1_EXTENSION=1;INTEROP_SESSION_EXTENSION=1</INTEROP_EXTRA_DEFINES>
    <INTEROP_EXTRA_DEFINES>INTEROP_PLACEHOLDER=1;INTEROP_EXTENSION_FUNCTIONS=1;INTEROP_CODEC=1;INTEROP_VIRTUAL_TABLE=1;INTEROP_FTS5_EXTENSION=1;INTEROP_PERCENTILE_EXTENSION=1;INTEROP_TOTYPE_EXTENSION=1;INTEROP_REGEXP_EXTENSION=1;INTEROP_JSON1_EXTENSION=1;INTEROP_SHA1_EXTENSION=1;INTEROP_SESSION_EXTENSION=1</INTEROP_EXTRA_DEFINES>
    <INTEROP_ASSEMBLY_RESOURCES>/ASSEMBLYRESOURCE:..\System.Data.SQLite\Resources\SQLiteCommand.bmp,System.Data.SQLite.SQLiteCommand.bmp /ASSEMBLYRESOURCE:..\System.Data.SQLite\Resources\SQLiteConnection.bmp,System.Data.SQLite.SQLiteConnection.bmp /ASSEMBLYRESOURCE:..\System.Data.SQLite\Resources\SQLiteDataAdapter.bmp,System.Data.SQLite.SQLiteDataAdapter.bmp</INTEROP_ASSEMBLY_RESOURCES>
    <INTEROP_KEY_FILE>$(ProjectDir)..\Keys\System.Data.SQLite.snk</INTEROP_KEY_FILE>
    <INTEROP_NATIVE_NAME>SQLite.Interop</INTEROP_NATIVE_NAME>
    <INTEROP_MIXED_NAME>System.Data.SQLite</INTEROP_MIXED_NAME>
  </PropertyGroup>
  <ItemGroup>
    <BuildMacro Include="ConfigurationYear">
Changes to SQLite.Interop/props/SQLite.Interop.2017.props.
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
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












-
+

-
-
+
+




-
+







<?xml version="1.0" encoding="utf-8"?>
<!--
 *
 * SQLite.Interop.2017.props -
 *
 * Written by Joe Mistachkin.
 * Released to the public domain, use at your own risk!
 *
-->
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Label="UserMacros">
    <ConfigurationYear>2017</ConfigurationYear>
    <INTEROP_BUILD_NUMBER>106</INTEROP_BUILD_NUMBER>
    <INTEROP_BUILD_NUMBER>107</INTEROP_BUILD_NUMBER>
    <INTEROP_LINKER_VERSION>1.0</INTEROP_LINKER_VERSION>
    <INTEROP_MANIFEST_VERSION>1.0.106.0</INTEROP_MANIFEST_VERSION>
    <INTEROP_RC_VERSION>1,0,106,0</INTEROP_RC_VERSION>
    <INTEROP_MANIFEST_VERSION>1.0.107.0</INTEROP_MANIFEST_VERSION>
    <INTEROP_RC_VERSION>1,0,107,0</INTEROP_RC_VERSION>
    <INTEROP_INCLUDE_DIRECTORIES>src\core</INTEROP_INCLUDE_DIRECTORIES>
    <INTEROP_LIBRARY_DIRECTORIES></INTEROP_LIBRARY_DIRECTORIES>
    <INTEROP_LIBRARY_DEPENDENCIES></INTEROP_LIBRARY_DEPENDENCIES>
    <INTEROP_DEBUG_DEFINES>INTEROP_DEBUG=0x31F;INTEROP_LOG=1;INTEROP_TEST_EXTENSION=1</INTEROP_DEBUG_DEFINES>
    <INTEROP_EXTRA_DEFINES>INTEROP_PLACEHOLDER=1;INTEROP_EXTENSION_FUNCTIONS=1;INTEROP_VIRTUAL_TABLE=1;INTEROP_FTS5_EXTENSION=1;INTEROP_PERCENTILE_EXTENSION=1;INTEROP_TOTYPE_EXTENSION=1;INTEROP_REGEXP_EXTENSION=1;INTEROP_JSON1_EXTENSION=1;INTEROP_SHA1_EXTENSION=1;INTEROP_SESSION_EXTENSION=1</INTEROP_EXTRA_DEFINES>
    <INTEROP_EXTRA_DEFINES>INTEROP_PLACEHOLDER=1;INTEROP_EXTENSION_FUNCTIONS=1;INTEROP_CODEC=1;INTEROP_VIRTUAL_TABLE=1;INTEROP_FTS5_EXTENSION=1;INTEROP_PERCENTILE_EXTENSION=1;INTEROP_TOTYPE_EXTENSION=1;INTEROP_REGEXP_EXTENSION=1;INTEROP_JSON1_EXTENSION=1;INTEROP_SHA1_EXTENSION=1;INTEROP_SESSION_EXTENSION=1</INTEROP_EXTRA_DEFINES>
    <INTEROP_ASSEMBLY_RESOURCES>/ASSEMBLYRESOURCE:..\System.Data.SQLite\Resources\SQLiteCommand.bmp,System.Data.SQLite.SQLiteCommand.bmp /ASSEMBLYRESOURCE:..\System.Data.SQLite\Resources\SQLiteConnection.bmp,System.Data.SQLite.SQLiteConnection.bmp /ASSEMBLYRESOURCE:..\System.Data.SQLite\Resources\SQLiteDataAdapter.bmp,System.Data.SQLite.SQLiteDataAdapter.bmp</INTEROP_ASSEMBLY_RESOURCES>
    <INTEROP_KEY_FILE>$(ProjectDir)..\Keys\System.Data.SQLite.snk</INTEROP_KEY_FILE>
    <INTEROP_NATIVE_NAME>SQLite.Interop</INTEROP_NATIVE_NAME>
    <INTEROP_MIXED_NAME>System.Data.SQLite</INTEROP_MIXED_NAME>
  </PropertyGroup>
  <ItemGroup>
    <BuildMacro Include="ConfigurationYear">
Changes to SQLite.Interop/props/sqlite3.props.
8
9
10
11
12
13
14
15

16
17
18
19
20
21
22
8
9
10
11
12
13
14

15
16
17
18
19
20
21
22







-
+







 *
-->
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
  <PropertyGroup Label="UserMacros">
    <SQLITE_MANIFEST_VERSION>3.20.1.0</SQLITE_MANIFEST_VERSION>
    <SQLITE_RC_VERSION>3,20,1,0</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_ENABLE_API_ARMOR=1;SQLITE_ENABLE_DBSTAT_VTAB=1;SQLITE_ENABLE_STMTVTAB=1</SQLITE_COMMON_DEFINES>
    <SQLITE_EXTRA_DEFINES>SQLITE_PLACEHOLDER=1</SQLITE_EXTRA_DEFINES>
    <SQLITE_EXTRA_DEFINES>SQLITE_PLACEHOLDER=1;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>
    <SQLITE_DISABLE_X64_WARNINGS></SQLITE_DISABLE_X64_WARNINGS>
  </PropertyGroup>
Changes to SQLite.Interop/props/sqlite3.vsprops.
25
26
27
28
29
30
31
32

33
34
35
36
37
38
39
25
26
27
28
29
30
31

32
33
34
35
36
37
38
39







-
+







	<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;SQLITE_ENABLE_API_ARMOR=1;SQLITE_ENABLE_DBSTAT_VTAB=1;SQLITE_ENABLE_STMTVTAB=1"
		PerformEnvironmentSet="true"
	/>
	<UserMacro
		Name="SQLITE_EXTRA_DEFINES"
		Value="SQLITE_PLACEHOLDER=1"
		Value="SQLITE_PLACEHOLDER=1;SQLITE_HAS_CODEC=1"
		PerformEnvironmentSet="true"
	/>
	<UserMacro
		Name="SQLITE_WINCE_200X_DEFINES"
		Value="SQLITE_OMIT_WAL=1"
		PerformEnvironmentSet="true"
	/>
Changes to SQLite.Interop/src/core/sqlite3.c.
1145
1146
1147
1148
1149
1150
1151
1152

1153
1154
1155
1156
1157
1158
1159
1145
1146
1147
1148
1149
1150
1151

1152
1153
1154
1155
1156
1157
1158
1159







-
+







**
** See also: [sqlite3_libversion()],
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
** [sqlite_version()] and [sqlite_source_id()].
*/
#define SQLITE_VERSION        "3.21.0"
#define SQLITE_VERSION_NUMBER 3021000
#define SQLITE_SOURCE_ID      "2017-10-16 11:50:12 700a3c694438ca6cca185d0097f24799e82717ef38cb47bd83666c80f0e3cb2f"
#define SQLITE_SOURCE_ID      "2017-10-24 18:55:49 1a584e499906b5c87ec7d43d4abce641fdf017c42125b083109bc77c4de48827"

/*
** 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
48683
48684
48685
48686
48687
48688
48689


48690
48691
48692
48693
48694
48695
48696
48683
48684
48685
48686
48687
48688
48689
48690
48691
48692
48693
48694
48695
48696
48697
48698







+
+








#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \
 || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE)
  int dc;                           /* Device characteristics */

  assert( isOpen(pPager->fd) );
  dc = sqlite3OsDeviceCharacteristics(pPager->fd);
#else
  UNUSED_PARAMETER(pPager);
#endif

#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE
  if( dc&SQLITE_IOCAP_BATCH_ATOMIC ){
    return -1;
  }
#endif
64491
64492
64493
64494
64495
64496
64497
64498

64499
64500
64501
64502
64503
64504
64505
64506

64507
64508
64509







64510
64511
64512
64513
64514
64515
64516
64493
64494
64495
64496
64497
64498
64499

64500
64501
64502
64503
64504
64505
64506
64507
64508
64509



64510
64511
64512
64513
64514
64515
64516
64517
64518
64519
64520
64521
64522
64523







-
+








+
-
-
-
+
+
+
+
+
+
+







** page of the database.  The data might change or move the next time
** any btree routine is called.
*/
static const void *fetchPayload(
  BtCursor *pCur,      /* Cursor pointing to entry to read from */
  u32 *pAmt            /* Write the number of available bytes here */
){
  u32 amt;
  int amt;
  assert( pCur!=0 && pCur->iPage>=0 && pCur->pPage);
  assert( pCur->eState==CURSOR_VALID );
  assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
  assert( cursorOwnsBtShared(pCur) );
  assert( pCur->ix<pCur->pPage->nCell );
  assert( pCur->info.nSize>0 );
  assert( pCur->info.pPayload>pCur->pPage->aData || CORRUPT_DB );
  assert( pCur->info.pPayload<pCur->pPage->aDataEnd ||CORRUPT_DB);
  amt = pCur->info.nLocal;
  amt = (int)(pCur->pPage->aDataEnd - pCur->info.pPayload);
  if( pCur->info.nLocal<amt ) amt = pCur->info.nLocal;
  *pAmt = amt;
  if( amt>(int)(pCur->pPage->aDataEnd - pCur->info.pPayload) ){
    /* There is too little space on the page for the expected amount
    ** of local content. Database must be corrupt. */
    assert( CORRUPT_DB );
    amt = MAX(0, (int)(pCur->pPage->aDataEnd - pCur->info.pPayload));
  }
  *pAmt = (u32)amt;
  return (void*)pCur->info.pPayload;
}


/*
** For the entry that cursor pCur is point to, return as
** many bytes of the key or data as are available on the local
83582
83583
83584
83585
83586
83587
83588
83589
83590
83591
83592
83593
83594
83595



83596
83597
83598
83599
83600
83601
83602
83603
83589
83590
83591
83592
83593
83594
83595







83596
83597
83598

83599
83600
83601
83602
83603
83604
83605







-
-
-
-
-
-
-
+
+
+
-







    sqlite3VdbePreUpdateHook(p, pC, SQLITE_INSERT, zDb, pTab, x.nKey, pOp->p2);
  }
  if( pOp->p5 & OPFLAG_ISNOOP ) break;
#endif

  if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++;
  if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = x.nKey;
  if( pData->flags & MEM_Null ){
    x.pData = 0;
    x.nData = 0;
  }else{
    assert( pData->flags & (MEM_Blob|MEM_Str) );
    x.pData = pData->z;
    x.nData = pData->n;
  assert( pData->flags & (MEM_Blob|MEM_Str) );
  x.pData = pData->z;
  x.nData = pData->n;
  }
  seekResult = ((pOp->p5 & OPFLAG_USESEEKRESULT) ? pC->seekResult : 0);
  if( pData->flags & MEM_Zero ){
    x.nZero = pData->u.nZero;
  }else{
    x.nZero = 0;
  }
  x.pKey = 0;
86460
86461
86462
86463
86464
86465
86466
86467

86468
86469
86470
86471



86472
86473
86474
86475
86476
86477
86478
86462
86463
86464
86465
86466
86467
86468

86469
86470
86471


86472
86473
86474
86475
86476
86477
86478
86479
86480
86481







-
+


-
-
+
+
+







  /* Set the value of register r[1] in the SQL statement to integer iRow. 
  ** This is done directly as a performance optimization
  */
  v->aMem[1].flags = MEM_Int;
  v->aMem[1].u.i = iRow;

  /* If the statement has been run before (and is paused at the OP_ResultRow)
  ** then back it up to the point where it does the OP_SeekRowid.  This could
  ** then back it up to the point where it does the OP_NotExists.  This could
  ** have been down with an extra OP_Goto, but simply setting the program
  ** counter is faster. */
  if( v->pc>3 ){
    v->pc = 3;
  if( v->pc>4 ){
    v->pc = 4;
    assert( v->aOp[v->pc].opcode==OP_NotExists );
    rc = sqlite3VdbeExec(v);
  }else{
    rc = sqlite3_step(p->pStmt);
  }
  if( rc==SQLITE_ROW ){
    VdbeCursor *pC = v->apCsr[0];
    u32 type = pC->nHdrParsed>p->iCol ? pC->aType[p->iCol] : 0;
91219
91220
91221
91222
91223
91224
91225
91226
91227
91228
91229
91230
91231
91232
91233
91234
91235
91236
91237
91238
91222
91223
91224
91225
91226
91227
91228

91229
91230
91231
91232

91233
91234
91235
91236
91237
91238
91239







-




-







  ExprList *pEList;
  sqlite3 *db;
  int moreToDo = 1;

  pOrderBy = pSelect->pOrderBy;
  if( pOrderBy==0 ) return 0;
  db = pParse->db;
#if SQLITE_MAX_COLUMN
  if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){
    sqlite3ErrorMsg(pParse, "too many terms in ORDER BY clause");
    return 1;
  }
#endif
  for(i=0; i<pOrderBy->nExpr; i++){
    pOrderBy->a[i].done = 0;
  }
  pSelect->pNext = 0;
  while( pSelect->pPrior ){
    pSelect->pPrior->pNext = pSelect;
    pSelect = pSelect->pPrior;
91316
91317
91318
91319
91320
91321
91322
91323
91324
91325
91326
91327
91328
91329
91330
91331
91332
91333
91334
91335
91317
91318
91319
91320
91321
91322
91323

91324
91325
91326
91327

91328
91329
91330
91331
91332
91333
91334







-




-







){
  int i;
  sqlite3 *db = pParse->db;
  ExprList *pEList;
  struct ExprList_item *pItem;

  if( pOrderBy==0 || pParse->db->mallocFailed ) return 0;
#if SQLITE_MAX_COLUMN
  if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){
    sqlite3ErrorMsg(pParse, "too many terms in %s BY clause", zType);
    return 1;
  }
#endif
  pEList = pSelect->pEList;
  assert( pEList!=0 );  /* sqlite3SelectNew() guarantees this */
  for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){
    if( pItem->u.x.iOrderByCol ){
      if( pItem->u.x.iOrderByCol>pEList->nExpr ){
        resolveOutOfRangeError(pParse, zType, i+1, pEList->nExpr);
        return 1;
94476
94477
94478
94479
94480
94481
94482
94483

94484
94485
94486
94487
94488
94489
94490
94475
94476
94477
94478
94479
94480
94481

94482
94483
94484
94485
94486
94487
94488
94489







-
+







          assert( sqlite3KeyInfoIsWriteable(pKeyInfo) );
          pKeyInfo->aColl[0] = sqlite3ExprCollSeq(pParse, pExpr->pLeft);
        }

        /* Loop through each expression in <exprlist>. */
        r1 = sqlite3GetTempReg(pParse);
        r2 = sqlite3GetTempReg(pParse);
        if( isRowid ) sqlite3VdbeAddOp2(v, OP_Null, 0, r2);
        if( isRowid ) sqlite3VdbeAddOp4(v, OP_Blob, 0, r2, 0, "", P4_STATIC);
        for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){
          Expr *pE2 = pItem->pExpr;
          int iValToIns;

          /* If the expression is not constant then we will need to
          ** disable the test that was generated above that makes sure
          ** this code only executes once.  Because for a non-constant
101758
101759
101760
101761
101762
101763
101764
101765
101766
101767
101768
101769
101770
101771
101772
101773
101774
101775
101776
101777
101757
101758
101759
101760
101761
101762
101763

101764
101765
101766
101767

101768
101769
101770
101771
101772
101773
101774







-




-







  Table *p;
  int i;
  char *z;
  char *zType;
  Column *pCol;
  sqlite3 *db = pParse->db;
  if( (p = pParse->pNewTable)==0 ) return;
#if SQLITE_MAX_COLUMN
  if( p->nCol+1>db->aLimit[SQLITE_LIMIT_COLUMN] ){
    sqlite3ErrorMsg(pParse, "too many columns on %s", p->zName);
    return;
  }
#endif
  z = sqlite3DbMallocRaw(db, pName->n + pType->n + 2);
  if( z==0 ) return;
  memcpy(z, pName->z, pName->n);
  z[pName->n] = 0;
  sqlite3Dequote(z);
  for(i=0; i<p->nCol; i++){
    if( sqlite3_stricmp(z, p->aCol[i].zName)==0 ){
112416
112417
112418
112419
112420
112421
112422
112423

112424
112425
112426
112427
112428
112429
112430
112413
112414
112415
112416
112417
112418
112419

112420
112421
112422
112423
112424
112425
112426
112427







-
+







  void  (*result_text16be)(sqlite3_context*,const void*,int,void(*)(void*));
  void  (*result_text16le)(sqlite3_context*,const void*,int,void(*)(void*));
  void  (*result_value)(sqlite3_context*,sqlite3_value*);
  void * (*rollback_hook)(sqlite3*,void(*)(void*),void*);
  int  (*set_authorizer)(sqlite3*,int(*)(void*,int,const char*,const char*,
                         const char*,const char*),void*);
  void  (*set_auxdata)(sqlite3_context*,int,void*,void (*)(void*));
  char * (*snprintf)(int,char*,const char*,...);
  char * (*xsnprintf)(int,char*,const char*,...);
  int  (*step)(sqlite3_stmt*);
  int  (*table_column_metadata)(sqlite3*,const char*,const char*,const char*,
                                char const**,char const**,int*,int*,int*);
  void  (*thread_cleanup)(void);
  int  (*total_changes)(sqlite3*);
  void * (*trace)(sqlite3*,void(*xTrace)(void*,const char*),void*);
  int  (*transfer_bindings)(sqlite3_stmt*,sqlite3_stmt*);
112700
112701
112702
112703
112704
112705
112706
112707

112708
112709
112710
112711
112712
112713
112714
112697
112698
112699
112700
112701
112702
112703

112704
112705
112706
112707
112708
112709
112710
112711







-
+







#define sqlite3_result_text16          sqlite3_api->result_text16
#define sqlite3_result_text16be        sqlite3_api->result_text16be
#define sqlite3_result_text16le        sqlite3_api->result_text16le
#define sqlite3_result_value           sqlite3_api->result_value
#define sqlite3_rollback_hook          sqlite3_api->rollback_hook
#define sqlite3_set_authorizer         sqlite3_api->set_authorizer
#define sqlite3_set_auxdata            sqlite3_api->set_auxdata
#define sqlite3_snprintf               sqlite3_api->snprintf
#define sqlite3_snprintf               sqlite3_api->xsnprintf
#define sqlite3_step                   sqlite3_api->step
#define sqlite3_table_column_metadata  sqlite3_api->table_column_metadata
#define sqlite3_thread_cleanup         sqlite3_api->thread_cleanup
#define sqlite3_total_changes          sqlite3_api->total_changes
#define sqlite3_trace                  sqlite3_api->trace
#ifndef SQLITE_OMIT_DEPRECATED
#define sqlite3_transfer_bindings      sqlite3_api->transfer_bindings
119375
119376
119377
119378
119379
119380
119381

119382
119383
119384
119385
119386
119387
119388
119372
119373
119374
119375
119376
119377
119378
119379
119380
119381
119382
119383
119384
119385
119386







+







  Hash ht;                    /* Hash table of column names */

  sqlite3HashInit(&ht);
  if( pEList ){
    nCol = pEList->nExpr;
    aCol = sqlite3DbMallocZero(db, sizeof(aCol[0])*nCol);
    testcase( aCol==0 );
    if( nCol>32767 ) nCol = 32767;
  }else{
    nCol = 0;
    aCol = 0;
  }
  assert( nCol==(i16)nCol );
  *pnCol = nCol;
  *paCol = aCol;
122282
122283
122284
122285
122286
122287
122288
122289
122290
122291
122292
122293
122294
122295
122296
122297
122298
122299
122300
122301
122280
122281
122282
122283
122284
122285
122286

122287
122288
122289
122290

122291
122292
122293
122294
122295
122296
122297







-




-







          }
        }
      }
    }
    sqlite3ExprListDelete(db, pEList);
    p->pEList = pNew;
  }
#if SQLITE_MAX_COLUMN
  if( p->pEList && p->pEList->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){
    sqlite3ErrorMsg(pParse, "too many columns in result set");
    return WRC_Abort;
  }
#endif
  return WRC_Continue;
}

/*
** No-op routine for the parse-tree walker.
**
** When this routine is the Walker.xExprCallback then expression trees
201075
201076
201077
201078
201079
201080
201081
201082

201083
201084
201085
201086
201087
201088
201089
201071
201072
201073
201074
201075
201076
201077

201078
201079
201080
201081
201082
201083
201084
201085







-
+







static void fts5SourceIdFunc(
  sqlite3_context *pCtx,          /* Function call context */
  int nArg,                       /* Number of args */
  sqlite3_value **apUnused        /* Function arguments */
){
  assert( nArg==0 );
  UNUSED_PARAM2(nArg, apUnused);
  sqlite3_result_text(pCtx, "fts5: 2017-10-16 11:50:12 700a3c694438ca6cca185d0097f24799e82717ef38cb47bd83666c80f0e3cb2f", -1, SQLITE_TRANSIENT);
  sqlite3_result_text(pCtx, "fts5: 2017-10-24 18:55:49 1a584e499906b5c87ec7d43d4abce641fdf017c42125b083109bc77c4de48827", -1, SQLITE_TRANSIENT);
}

static int fts5Init(sqlite3 *db){
  static const sqlite3_module fts5Mod = {
    /* iVersion      */ 2,
    /* xCreate       */ fts5CreateMethod,
    /* xConnect      */ fts5ConnectMethod,
205343
205344
205345
205346
205347
205348
205349
205350

205351
205352

205353
205354
205355
205356
205339
205340
205341
205342
205343
205344
205345

205346
205347

205348
205349
205350
205351
205352







-
+

-
+




#endif
  return rc;
}
#endif /* SQLITE_CORE */
#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */

/************** End of stmt.c ************************************************/
#if __LINE__!=205350
#if __LINE__!=205346
#undef SQLITE_SOURCE_ID
#define SQLITE_SOURCE_ID      "2017-10-16 11:50:12 700a3c694438ca6cca185d0097f24799e82717ef38cb47bd83666c80f0e3alt2"
#define SQLITE_SOURCE_ID      "2017-10-24 18:55:49 1a584e499906b5c87ec7d43d4abce641fdf017c42125b083109bc77c4de4alt2"
#endif
/* Return the source-id for this library */
SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
/************************** End of sqlite3.c ******************************/
Changes to SQLite.Interop/src/core/sqlite3.h.
121
122
123
124
125
126
127
128

129
130
131
132
133
134
135
121
122
123
124
125
126
127

128
129
130
131
132
133
134
135







-
+







**
** See also: [sqlite3_libversion()],
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
** [sqlite_version()] and [sqlite_source_id()].
*/
#define SQLITE_VERSION        "3.21.0"
#define SQLITE_VERSION_NUMBER 3021000
#define SQLITE_SOURCE_ID      "2017-10-16 11:50:12 700a3c694438ca6cca185d0097f24799e82717ef38cb47bd83666c80f0e3cb2f"
#define SQLITE_SOURCE_ID      "2017-10-24 18:55:49 1a584e499906b5c87ec7d43d4abce641fdf017c42125b083109bc77c4de48827"

/*
** 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 SQLite.Interop/src/core/sqlite3ext.h.
130
131
132
133
134
135
136
137

138
139
140
141
142
143
144
130
131
132
133
134
135
136

137
138
139
140
141
142
143
144







-
+







  void  (*result_text16be)(sqlite3_context*,const void*,int,void(*)(void*));
  void  (*result_text16le)(sqlite3_context*,const void*,int,void(*)(void*));
  void  (*result_value)(sqlite3_context*,sqlite3_value*);
  void * (*rollback_hook)(sqlite3*,void(*)(void*),void*);
  int  (*set_authorizer)(sqlite3*,int(*)(void*,int,const char*,const char*,
                         const char*,const char*),void*);
  void  (*set_auxdata)(sqlite3_context*,int,void*,void (*)(void*));
  char * (*snprintf)(int,char*,const char*,...);
  char * (*xsnprintf)(int,char*,const char*,...);
  int  (*step)(sqlite3_stmt*);
  int  (*table_column_metadata)(sqlite3*,const char*,const char*,const char*,
                                char const**,char const**,int*,int*,int*);
  void  (*thread_cleanup)(void);
  int  (*total_changes)(sqlite3*);
  void * (*trace)(sqlite3*,void(*xTrace)(void*,const char*),void*);
  int  (*transfer_bindings)(sqlite3_stmt*,sqlite3_stmt*);
414
415
416
417
418
419
420
421

422
423
424
425
426
427
428
414
415
416
417
418
419
420

421
422
423
424
425
426
427
428







-
+







#define sqlite3_result_text16          sqlite3_api->result_text16
#define sqlite3_result_text16be        sqlite3_api->result_text16be
#define sqlite3_result_text16le        sqlite3_api->result_text16le
#define sqlite3_result_value           sqlite3_api->result_value
#define sqlite3_rollback_hook          sqlite3_api->rollback_hook
#define sqlite3_set_authorizer         sqlite3_api->set_authorizer
#define sqlite3_set_auxdata            sqlite3_api->set_auxdata
#define sqlite3_snprintf               sqlite3_api->snprintf
#define sqlite3_snprintf               sqlite3_api->xsnprintf
#define sqlite3_step                   sqlite3_api->step
#define sqlite3_table_column_metadata  sqlite3_api->table_column_metadata
#define sqlite3_thread_cleanup         sqlite3_api->thread_cleanup
#define sqlite3_total_changes          sqlite3_api->total_changes
#define sqlite3_trace                  sqlite3_api->trace
#ifndef SQLITE_OMIT_DEPRECATED
#define sqlite3_transfer_bindings      sqlite3_api->transfer_bindings
Changes to SQLite.Interop/src/ext/fts5.c.
17315
17316
17317
17318
17319
17320
17321
17322

17323
17324
17325
17326
17327
17328
17329
17315
17316
17317
17318
17319
17320
17321

17322
17323
17324
17325
17326
17327
17328
17329







-
+







static void fts5SourceIdFunc(
  sqlite3_context *pCtx,          /* Function call context */
  int nArg,                       /* Number of args */
  sqlite3_value **apUnused        /* Function arguments */
){
  assert( nArg==0 );
  UNUSED_PARAM2(nArg, apUnused);
  sqlite3_result_text(pCtx, "fts5: 2017-10-16 11:50:12 700a3c694438ca6cca185d0097f24799e82717ef38cb47bd83666c80f0e3cb2f", -1, SQLITE_TRANSIENT);
  sqlite3_result_text(pCtx, "fts5: 2017-10-24 18:55:49 1a584e499906b5c87ec7d43d4abce641fdf017c42125b083109bc77c4de48827", -1, SQLITE_TRANSIENT);
}

static int fts5Init(sqlite3 *db){
  static const sqlite3_module fts5Mod = {
    /* iVersion      */ 2,
    /* xCreate       */ fts5CreateMethod,
    /* xConnect      */ fts5ConnectMethod,
Changes to SQLite.Interop/src/generic/interop.h.
1
2
3
4
5
6
7
8
9

10
11
12
13
14
15
16
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
16








-
+







/*
 * interop.h -
 *
 * Written by Joe Mistachkin.
 * Released to the public domain, use at your own risk!
 */

#ifndef INTEROP_VERSION
#define INTEROP_VERSION          "1.0.106.0"
#define INTEROP_VERSION          "1.0.107.0"
#endif

#ifndef INTEROP_SOURCE_ID
#define INTEROP_SOURCE_ID        "0000000000000000000000000000000000000000"
#endif

#ifndef INTEROP_SOURCE_TIMESTAMP
Changes to SQLite.Interop/src/win/crypt.c.
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
30
31
32
33
34
35
36




37
38
39
40
41
42
43







-
-
-
-








/* Needed for re-keying */
static void * sqlite3pager_get_codecarg(Pager *pPager)
{
  return (pPager->xCodec) ? pPager->pCodec: NULL;
}

void sqlite3_activate_see(const char *info)
{
}

/* Create a cryptographic context.  Use the enhanced provider because it is available on
** most platforms
*/
static BOOL InitializeProvider()
{
  MUTEX_LOGIC( sqlite3_mutex *pMaster = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER); )
  sqlite3_mutex_enter(pMaster);
148
149
150
151
152
153
154
155

156
157
158
159
160
161
162
144
145
146
147
148
149
150

151
152
153
154
155
156
157
158







-
+







  {
    CreateCryptBlock(pBlock->hReadKey, pBlock->pPager, pageSize, pBlock);
    /* If this fails, pvCrypt will be NULL, and the next time sqlite3Codec() is called, it will result in an error */
  }
}

/* Encrypt/Decrypt functionality, called by pager.c */
void * sqlite3Codec(void *pArg, void *data, Pgno nPageNum, int nMode)
static void *sqlite3Codec(void *pArg, void *data, Pgno nPageNum, int nMode)
{
  LPCRYPTBLOCK pBlock = (LPCRYPTBLOCK)pArg;
  DWORD dwPageSize;
  LPVOID pvTemp = NULL;

  if (!pBlock) return data;
  if (pBlock->pvCrypt == NULL) return NULL; /* This only happens if CreateCryptBlock() failed to make scratch space */
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
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







+
+
+
+











+
+
+
+
+







  Btree *pbt = db->aDb[0].pBt;
  Pager *p = sqlite3BtreePager(pbt);
  LPCRYPTBLOCK pBlock = (LPCRYPTBLOCK)sqlite3pager_get_codecarg(p);

  if (ppKey) *ppKey = 0;
  if (pnKeyLen) *pnKeyLen = pBlock ? 1: 0;
}

SQLITE_API void sqlite3_activate_see(const char *info)
{
}

/* We do not attach this key to the temp store, only the main database. */
SQLITE_API int sqlite3_key_v2(sqlite3 *db, const char *zDbName, const void *pKey, int nKey)
{
  return sqlite3CodecAttach(db, 0, pKey, nKey);
}

SQLITE_API int sqlite3_key(sqlite3 *db, const void *pKey, int nKey)
{
  return sqlite3_key_v2(db, 0, pKey, nKey);
}

SQLITE_API int sqlite3_rekey(sqlite3 *db, const void *pKey, int nKey)
{
  return sqlite3_rekey_v2(db, 0, pKey, nKey);
}

/* Changes the encryption key for an existing database. */
SQLITE_API int sqlite3_rekey_v2(sqlite3 *db, const char *zDbName, const void *pKey, int nKey)
{
  Btree *pbt = db->aDb[0].pBt;
  Pager *p = sqlite3BtreePager(pbt);
  LPCRYPTBLOCK pBlock = (LPCRYPTBLOCK)sqlite3pager_get_codecarg(p);
452
453
454
455
456
457
458
459
460
461
462
463
464
465
457
458
459
460
461
462
463





464
465







-
-
-
-
-


  }

  sqlite3_mutex_leave(db->mutex);

  return rc;
}

SQLITE_API int sqlite3_rekey(sqlite3 *db, const void *pKey, int nKey)
{
  return sqlite3_rekey_v2(db, 0, pKey, nKey);
}

#endif /* SQLITE_HAS_CODEC */
#endif /* SQLITE_OMIT_DISKIO */
Changes to Setup/build.bat.
211
212
213
214
215
216
217









218
219
220
221
222
223
224
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233







+
+
+
+
+
+
+
+
+







  CALL :fn_CheckMsBuildDir 14.0
  GOTO setup_buildToolDir
)

IF DEFINED NETFX47ONLY (
  %_AECHO% Forcing the use of the .NET Framework 4.7...
  SET YEAR=2017
  CALL :fn_CheckFrameworkDir v4.0.30319
  CALL :fn_CheckMsBuildDir 14.0
  CALL :fn_CheckVisualStudioMsBuildDir 15.0 15.0
  GOTO setup_buildToolDir
)

IF DEFINED NETFX471ONLY (
  %_AECHO% Forcing the use of the .NET Framework 4.7.1...
  SET YEAR=2017
  CALL :fn_CheckFrameworkDir v4.0.30319
  CALL :fn_CheckMsBuildDir 14.0
  CALL :fn_CheckVisualStudioMsBuildDir 15.0 15.0
  GOTO setup_buildToolDir
)

REM
Changes to Setup/data/SQLite.iss.
124
125
126
127
128
129
130
131

132
133
134

135
136
137

138
139
140
141


142
143
144

145
146
147

148
149
150
151
152
153
154

155
156
157

158
159
160
161


162
163
164

165
166
167

168
169
170

171
172
173
174
175
176
177
124
125
126
127
128
129
130

131
132
133

134
135
136

137
138
139


140
141
142
143

144
145
146

147
148
149
150
151
152
153

154
155
156

157
158
159


160
161
162
163

164
165
166

167
168
169

170
171
172
173
174
175
176
177







-
+


-
+


-
+


-
-
+
+


-
+


-
+






-
+


-
+


-
-
+
+


-
+


-
+


-
+








#if Year != "2005" && Year != "2008"
Components: Application\EF6; Tasks: ngen; Filename: {code:GetNetFx4InstallRoot|Ngen.exe}; Parameters: "install ""{app}\bin\System.Data.SQLite.EF6.dll"" /nologo"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup()
#endif

#if Pos("NativeOnly", AppConfiguration) == 0 && AppProcessor == "x86"
#if Year == "2005"
Components: {#InstallerCondition}; Tasks: gac\vs2005; Filename: {app}\bin\Installer.exe; Parameters: "-install true -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx35 true -noNetFx40 true -noNetFx45 true -noNetFx451 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noVs2008 true -noVs2010 true -noVs2012 true -noVs2013 true -noVs2015 true -noVs2017 true -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx2Setup()
Components: {#InstallerCondition}; Tasks: gac\vs2005; Filename: {app}\bin\Installer.exe; Parameters: "-install true -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx35 true -noNetFx40 true -noNetFx45 true -noNetFx451 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noNetFx471 true -noVs2008 true -noVs2010 true -noVs2012 true -noVs2013 true -noVs2015 true -noVs2017 true -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx2Setup()
#endif
#if Year == "2008"
Components: {#InstallerCondition}; Tasks: gac\vs2008; Filename: {app}\bin\Installer.exe; Parameters: "-install true -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx40 true -noNetFx45 true -noNetFx451 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noVs2005 true -noVs2010 true -noVs2012 true -noVs2013 true -noVs2015 true -noVs2017 true -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx2Setup()
Components: {#InstallerCondition}; Tasks: gac\vs2008; Filename: {app}\bin\Installer.exe; Parameters: "-install true -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx40 true -noNetFx45 true -noNetFx451 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noNetFx471 true -noVs2005 true -noVs2010 true -noVs2012 true -noVs2013 true -noVs2015 true -noVs2017 true -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx2Setup()
#endif
#if Year == "2010"
Components: {#InstallerCondition}; Tasks: gac\vs2010; Filename: {app}\bin\Installer.exe; Parameters: "-install true -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx35 true -noNetFx45 true -noNetFx451 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noVs2005 true -noVs2008 true -noVs2012 true -noVs2013 true -noVs2015 true -noVs2017 true -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup()
Components: {#InstallerCondition}; Tasks: gac\vs2010; Filename: {app}\bin\Installer.exe; Parameters: "-install true -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx35 true -noNetFx45 true -noNetFx451 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noNetFx471 true -noVs2005 true -noVs2008 true -noVs2012 true -noVs2013 true -noVs2015 true -noVs2017 true -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup()
#endif
#if Year == "2012"
Components: {#InstallerCondition}; Tasks: gac\vs2012; Filename: {app}\bin\Installer.exe; Parameters: "-install true -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx35 true -noNetFx40 true -noNetFx451 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noVs2005 true -noVs2008 true -noVs2010 true -noVs2013 true -noVs2015 true -noVs2017 true -configVersion 4.0.30319 -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup()
Components: {#InstallerCondition}; Tasks: gac\vs2012; Filename: {app}\bin\Installer.exe; Parameters: "-perUser true -install true -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx35 true -noNetFx40 true -noNetFx451 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noVs2005 true -noVs2008 true -noVs2010 true -noVs2013 true -noVs2015 true -noVs2017 true -configVersion 4.0.30319 -vsVersionSuffix _Config -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup()
Components: {#InstallerCondition}; Tasks: gac\vs2012; Filename: {app}\bin\Installer.exe; Parameters: "-install true -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx35 true -noNetFx40 true -noNetFx451 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noNetFx471 true -noVs2005 true -noVs2008 true -noVs2010 true -noVs2013 true -noVs2015 true -noVs2017 true -configVersion 4.0.30319 -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup()
Components: {#InstallerCondition}; Tasks: gac\vs2012; Filename: {app}\bin\Installer.exe; Parameters: "-perUser true -install true -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx35 true -noNetFx40 true -noNetFx451 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noNetFx471 true -noVs2005 true -noVs2008 true -noVs2010 true -noVs2013 true -noVs2015 true -noVs2017 true -configVersion 4.0.30319 -vsVersionSuffix _Config -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup()
#endif
#if Year == "2013"
Components: {#InstallerCondition}; Tasks: gac\vs2013; Filename: {app}\bin\Installer.exe; Parameters: "-install true -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx35 true -noNetFx40 true -noNetFx45 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noVs2005 true -noVs2008 true -noVs2010 true -noVs2012 true -noVs2015 true -noVs2017 true -configVersion 4.0.30319 -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup()
Components: {#InstallerCondition}; Tasks: gac\vs2013; Filename: {app}\bin\Installer.exe; Parameters: "-install true -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx35 true -noNetFx40 true -noNetFx45 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noNetFx471 true -noVs2005 true -noVs2008 true -noVs2010 true -noVs2012 true -noVs2015 true -noVs2017 true -configVersion 4.0.30319 -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup()
#endif
#if Year == "2015"
Components: {#InstallerCondition}; Tasks: gac\vs2015; Filename: {app}\bin\Installer.exe; Parameters: "-install true -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx35 true -noNetFx40 true -noNetFx45 true -noNetFx451 true -noNetFx452 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noVs2005 true -noVs2008 true -noVs2010 true -noVs2012 true -noVs2013 true -noVs2017 true -configVersion 4.0.30319 -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup()
Components: {#InstallerCondition}; Tasks: gac\vs2015; Filename: {app}\bin\Installer.exe; Parameters: "-install true -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx35 true -noNetFx40 true -noNetFx45 true -noNetFx451 true -noNetFx452 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noNetFx471 true -noVs2005 true -noVs2008 true -noVs2010 true -noVs2012 true -noVs2013 true -noVs2017 true -configVersion 4.0.30319 -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup()
#endif
#endif

[UninstallRun]
#if Pos("NativeOnly", AppConfiguration) == 0 && AppProcessor == "x86"
#if Year == "2015"
Components: {#InstallerCondition}; Tasks: gac\vs2015; Filename: {app}\bin\Installer.exe; Parameters: "-install false -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx35 true -noNetFx40 true -noNetFx45 true -noNetFx451 true -noNetFx452 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noVs2005 true -noVs2008 true -noVs2010 true -noVs2012 true -noVs2013 true -noVs2017 true -configVersion 4.0.30319 -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup()
Components: {#InstallerCondition}; Tasks: gac\vs2015; Filename: {app}\bin\Installer.exe; Parameters: "-install false -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx35 true -noNetFx40 true -noNetFx45 true -noNetFx451 true -noNetFx452 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noNetFx471 true -noVs2005 true -noVs2008 true -noVs2010 true -noVs2012 true -noVs2013 true -noVs2017 true -configVersion 4.0.30319 -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup()
#endif
#if Year == "2013"
Components: {#InstallerCondition}; Tasks: gac\vs2013; Filename: {app}\bin\Installer.exe; Parameters: "-install false -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx35 true -noNetFx40 true -noNetFx45 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noVs2005 true -noVs2008 true -noVs2010 true -noVs2012 true -noVs2015 true -noVs2017 true -configVersion 4.0.30319 -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup()
Components: {#InstallerCondition}; Tasks: gac\vs2013; Filename: {app}\bin\Installer.exe; Parameters: "-install false -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx35 true -noNetFx40 true -noNetFx45 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noNetFx471 true -noVs2005 true -noVs2008 true -noVs2010 true -noVs2012 true -noVs2015 true -noVs2017 true -configVersion 4.0.30319 -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup()
#endif
#if Year == "2012"
Components: {#InstallerCondition}; Tasks: gac\vs2012; Filename: {app}\bin\Installer.exe; Parameters: "-perUser true -install false -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx35 true -noNetFx40 true -noNetFx451 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noVs2005 true -noVs2008 true -noVs2010 true -noVs2013 true -noVs2015 true -noVs2017 true -configVersion 4.0.30319 -vsVersionSuffix _Config -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup()
Components: {#InstallerCondition}; Tasks: gac\vs2012; Filename: {app}\bin\Installer.exe; Parameters: "-install false -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx35 true -noNetFx40 true -noNetFx451 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noVs2005 true -noVs2008 true -noVs2010 true -noVs2013 true -noVs2015 true -noVs2017 true -configVersion 4.0.30319 -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup()
Components: {#InstallerCondition}; Tasks: gac\vs2012; Filename: {app}\bin\Installer.exe; Parameters: "-perUser true -install false -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx35 true -noNetFx40 true -noNetFx451 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noNetFx471 true -noVs2005 true -noVs2008 true -noVs2010 true -noVs2013 true -noVs2015 true -noVs2017 true -configVersion 4.0.30319 -vsVersionSuffix _Config -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup()
Components: {#InstallerCondition}; Tasks: gac\vs2012; Filename: {app}\bin\Installer.exe; Parameters: "-install false -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx35 true -noNetFx40 true -noNetFx451 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noNetFx471 true -noVs2005 true -noVs2008 true -noVs2010 true -noVs2013 true -noVs2015 true -noVs2017 true -configVersion 4.0.30319 -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup()
#endif
#if Year == "2010"
Components: {#InstallerCondition}; Tasks: gac\vs2010; Filename: {app}\bin\Installer.exe; Parameters: "-install false -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx35 true -noNetFx45 true -noNetFx451 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noVs2005 true -noVs2008 true -noVs2012 true -noVs2013 true -noVs2015 true -noVs2017 true -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup()
Components: {#InstallerCondition}; Tasks: gac\vs2010; Filename: {app}\bin\Installer.exe; Parameters: "-install false -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx35 true -noNetFx45 true -noNetFx451 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noNetFx471 true -noVs2005 true -noVs2008 true -noVs2012 true -noVs2013 true -noVs2015 true -noVs2017 true -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup()
#endif
#if Year == "2008"
Components: {#InstallerCondition}; Tasks: gac\vs2008; Filename: {app}\bin\Installer.exe; Parameters: "-install false -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx40 true -noNetFx45 true -noNetFx451 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noVs2005 true -noVs2010 true -noVs2012 true -noVs2013 true -noVs2015 true -noVs2017 true -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx2Setup()
Components: {#InstallerCondition}; Tasks: gac\vs2008; Filename: {app}\bin\Installer.exe; Parameters: "-install false -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx40 true -noNetFx45 true -noNetFx451 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noNetFx471 true -noVs2005 true -noVs2010 true -noVs2012 true -noVs2013 true -noVs2015 true -noVs2017 true -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx2Setup()
#endif
#if Year == "2005"
Components: {#InstallerCondition}; Tasks: gac\vs2005; Filename: {app}\bin\Installer.exe; Parameters: "-install false -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx35 true -noNetFx40 true -noNetFx45 true -noNetFx451 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noVs2008 true -noVs2010 true -noVs2012 true -noVs2013 true -noVs2015 true -noVs2017 true -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx2Setup()
Components: {#InstallerCondition}; Tasks: gac\vs2005; Filename: {app}\bin\Installer.exe; Parameters: "-install false -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx35 true -noNetFx40 true -noNetFx45 true -noNetFx451 true -noNetFx452 true -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true -noNetFx471 true -noVs2008 true -noVs2010 true -noVs2012 true -noVs2013 true -noVs2015 true -noVs2017 true -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx2Setup()
#endif
#endif

#if Year != "2005" && Year != "2008"
Components: Application\EF6; Tasks: ngen; Filename: {code:GetNetFx4InstallRoot|Ngen.exe}; Parameters: "uninstall ""{app}\bin\System.Data.SQLite.EF6.dll"" /nologo"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup()
#endif

Changes to Setup/data/verify.lst.
340
341
342
343
344
345
346

347
348
349
350
351
352
353
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354







+







  Setup/set_netFx45.bat
  Setup/set_netFx451.bat
  Setup/set_netFx452.bat
  Setup/set_netFx46.bat
  Setup/set_netFx461.bat
  Setup/set_netFx462.bat
  Setup/set_netFx47.bat
  Setup/set_netFx471.bat
  Setup/set_Release.bat
  Setup/set_Release_ARMV7.bat
  "Setup/set_Release_CEPC DevPlatform.bat"
  "Setup/set_Release_Pocket PC 2003 (ARMV4).bat"
  Setup/set_Release_Win32.bat
  Setup/set_Release_x64.bat
  Setup/set_Release_x64_2005.bat
830
831
832
833
834
835
836

837
838
839
840
841
842
843
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845







+







  Tests/stress.eagle
  Tests/template/
  Tests/template/empty.eagle
  Tests/thread.eagle
  Tests/tkt-00f86f9739.eagle
  Tests/tkt-0a32885109.eagle
  Tests/tkt-0d5b1ef362.eagle
  Tests/tkt-0e48e80333.eagle
  Tests/tkt-0ed01c447c.eagle
  Tests/tkt-17045010df.eagle
  Tests/tkt-1c456ae75f.eagle
  Tests/tkt-1f7bfff467.eagle
  Tests/tkt-201128cc88.eagle
  Tests/tkt-2556655d1b.eagle
  Tests/tkt-2abbf2c244.eagle
2012
2013
2014
2015
2016
2017
2018






































































2019
2020
2021
2022
2023
2024
2025
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







    setupEf6Bundle setupX86Vs2017]

###############################################################################

set manifests(sqlite-netFx47-setup-bundle-x64-2017-.exe) [list sds \
    setupCore setupBundle setupLinqCore setupEf6Core setupLinqBundle \
    setupEf6Bundle setupX64Vs2017]

###############################################################################
################## Visual Studio 2017 / .NET Framework 4.7.1 ##################
############################### Binary Packages ###############################
###############################################################################

set manifests(sqlite-netFx471-binary-Win32-2017-.zip) [list sds \
    binaryCore binaryLinq binaryEf6 binaryExtra binaryInterop]

###############################################################################

set manifests(sqlite-netFx471-binary-x64-2017-.zip) [list sds \
    binaryCore binaryLinq binaryEf6 binaryExtra binaryInterop]

###############################################################################

set manifests(sqlite-netFx471-binary-bundle-Win32-2017-.zip) [list sds \
    binaryCore binaryLinq binaryEf6 binaryExtra]

###############################################################################

set manifests(sqlite-netFx471-binary-bundle-x64-2017-.zip) [list sds \
    binaryCore binaryLinq binaryEf6 binaryExtra]

###############################################################################

set manifests(sqlite-netFx471-static-binary-Win32-2017-.zip) [list sds \
    binaryCore binaryLinq binaryEf6 binaryExtra binaryInterop]

###############################################################################

set manifests(sqlite-netFx471-static-binary-x64-2017-.zip) [list sds \
    binaryCore binaryLinq binaryEf6 binaryExtra binaryInterop]

###############################################################################

set manifests(sqlite-netFx471-static-binary-bundle-Win32-2017-.zip) [list sds \
    binaryCore binaryLinq binaryEf6 binaryExtra]

###############################################################################

set manifests(sqlite-netFx471-static-binary-bundle-x64-2017-.zip) [list sds \
    binaryCore binaryLinq binaryEf6 binaryExtra]

###############################################################################
################## Visual Studio 2017 / .NET Framework 4.7.1 ##################
############################### Setup Packages ################################
###############################################################################

set manifests(sqlite-netFx471-setup-x86-2017-.exe) [list sds \
    setupCore setupInterop setupLinqCore setupEf6Core setupLinqInterop \
    setupEf6Interop setupX86Vs2017]

###############################################################################

set manifests(sqlite-netFx471-setup-x64-2017-.exe) [list sds \
    setupCore setupInterop setupLinqCore setupEf6Core setupLinqInterop \
    setupEf6Interop setupX64Vs2017]

###############################################################################

set manifests(sqlite-netFx471-setup-bundle-x86-2017-.exe) [list sds \
    setupCore setupBundle setupLinqCore setupEf6Core setupLinqBundle \
    setupEf6Bundle setupX86Vs2017]

###############################################################################

set manifests(sqlite-netFx471-setup-bundle-x64-2017-.exe) [list sds \
    setupCore setupBundle setupLinqCore setupEf6Core setupLinqBundle \
    setupEf6Bundle setupX64Vs2017]

###############################################################################
############################### NuGet Packages ################################
###############################################################################

set manifests(System.Data.SQLite..nupkg) [list sds \
    nuGetMetadata nuGetPrimary]
Changes to Setup/set_2005.bat.
13
14
15
16
17
18
19

20
21
22
13
14
15
16
17
18
19
20
21
22
23







+



SET NETFX45ONLY=
SET NETFX451ONLY=
SET NETFX452ONLY=
SET NETFX46ONLY=
SET NETFX461ONLY=
SET NETFX462ONLY=
SET NETFX47ONLY=
SET NETFX471ONLY=
SET BUILD_ARGS=

VERIFY > NUL
Changes to Setup/set_2008.bat.
13
14
15
16
17
18
19

20
21
22
13
14
15
16
17
18
19
20
21
22
23







+



SET NETFX45ONLY=
SET NETFX451ONLY=
SET NETFX452ONLY=
SET NETFX46ONLY=
SET NETFX461ONLY=
SET NETFX462ONLY=
SET NETFX47ONLY=
SET NETFX471ONLY=
SET BUILD_ARGS=

VERIFY > NUL
Changes to Setup/set_2010.bat.
13
14
15
16
17
18
19

20
21
22
13
14
15
16
17
18
19
20
21
22
23







+



SET NETFX45ONLY=
SET NETFX451ONLY=
SET NETFX452ONLY=
SET NETFX46ONLY=
SET NETFX461ONLY=
SET NETFX462ONLY=
SET NETFX47ONLY=
SET NETFX471ONLY=
SET BUILD_ARGS=

VERIFY > NUL
Changes to Setup/set_2012.bat.
13
14
15
16
17
18
19

20
21
22
23
24
25
26
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27







+







SET NETFX45ONLY=1
SET NETFX451ONLY=
SET NETFX452ONLY=
SET NETFX46ONLY=
SET NETFX461ONLY=
SET NETFX462ONLY=
SET NETFX47ONLY=
SET NETFX471ONLY=

REM
REM HACK: Evidently, installing Visual Studio 2013 breaks using MSBuild to
REM       build native projects that specify a platform toolset of "v110".
REM
SET BUILD_ARGS=/property:VisualStudioVersion=11.0

Changes to Setup/set_2013.bat.
13
14
15
16
17
18
19

20
21
22
23
24
25
26
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27







+







SET NETFX45ONLY=
SET NETFX451ONLY=1
SET NETFX452ONLY=
SET NETFX46ONLY=
SET NETFX461ONLY=
SET NETFX462ONLY=
SET NETFX47ONLY=
SET NETFX471ONLY=

REM
REM HACK: Evidently, using MSBuild with Visual Studio 2013 requires some
REM       extra magic to make it recognize the "v120" platform toolset.
REM
SET BUILD_ARGS=/property:VisualStudioVersion=12.0

Changes to Setup/set_2015.bat.
13
14
15
16
17
18
19

20
21
22
23
24
25
26
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27







+







SET NETFX45ONLY=
SET NETFX451ONLY=
SET NETFX452ONLY=
SET NETFX46ONLY=1
SET NETFX461ONLY=
SET NETFX462ONLY=
SET NETFX47ONLY=
SET NETFX471ONLY=

REM
REM HACK: Evidently, using MSBuild with Visual Studio 2015 requires some
REM       extra magic to make it recognize the "v140" platform toolset.
REM
SET BUILD_ARGS=/property:VisualStudioVersion=14.0

Changes to Setup/set_2017.bat.
13
14
15
16
17
18
19

20
21
22
23
24
25
26
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27







+







SET NETFX45ONLY=
SET NETFX451ONLY=
SET NETFX452ONLY=
SET NETFX46ONLY=
SET NETFX461ONLY=
SET NETFX462ONLY=
SET NETFX47ONLY=1
SET NETFX471ONLY=

REM
REM HACK: Evidently, using MSBuild with Visual Studio 2017 requires some
REM       extra magic to make it recognize the "v141" platform toolset.
REM
SET BUILD_ARGS=/property:VisualStudioVersion=15.0

Changes to Setup/set_common.bat.
84
85
86
87
88
89
90

91
92
93
94
95
96
97
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98







+







  SET FRAMEWORK2015=netFx46
  REM SET FRAMEWORK2015=netFx461
  REM SET FRAMEWORK2015=netFx462
)

IF NOT DEFINED FRAMEWORK2017 (
  SET FRAMEWORK2017=netFx47
  REM SET FRAMEWORK2015=netFx471
)

IF DEFINED YEARS GOTO end_of_file

IF NOT DEFINED NOVS2005 (
  IF DEFINED VS2005SP (
    SET YEARS=%YEARS% 2005
Changes to Setup/set_netFx47.bat.
8
9
10
11
12
13
14
15

16
17
18
19
20
21
22
8
9
10
11
12
13
14

15
16
17
18
19
20
21
22







-
+







::

IF NOT DEFINED ISNETFX2 (
  SET ISNETFX2=False
)

IF NOT DEFINED VCRUNTIME (
  SET VCRUNTIME=2017_VCU1
  SET VCRUNTIME=2017_VCU3
)

IF NOT DEFINED CONFIGURATION (
  SET CONFIGURATION=Release
)

IF NOT DEFINED PLATFORM (
Added Setup/set_netFx471.bat.






































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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@ECHO OFF

::
:: set_netFx471.bat --
::
:: Written by Joe Mistachkin.
:: Released to the public domain, use at your own risk!
::

IF NOT DEFINED ISNETFX2 (
  SET ISNETFX2=False
)

IF NOT DEFINED VCRUNTIME (
  SET VCRUNTIME=2017_VCU3
)

IF NOT DEFINED CONFIGURATION (
  SET CONFIGURATION=Release
)

IF NOT DEFINED PLATFORM (
  SET PLATFORM=Win32
)

IF NOT DEFINED PROCESSOR (
  SET PROCESSOR=x86
)

IF NOT DEFINED YEAR (
  SET YEAR=2017
)

IF NOT DEFINED FRAMEWORK (
  SET FRAMEWORK=netFx471
)

:end_of_file
Changes to Setup/set_x64_2017.bat.
1
2
3
4
5
6
7
8
9
10
11

12
13
14
1
2
3
4
5
6
7
8
9
10

11
12
13
14










-
+



@ECHO OFF

::
:: set_x64_2017.bat --
::
:: Written by Joe Mistachkin.
:: Released to the public domain, use at your own risk!
::

SET ISNETFX2=False
SET VCRUNTIME=2017_VCU1
SET VCRUNTIME=2017_VCU3
SET PLATFORM=x64
SET PROCESSOR=x64
SET YEAR=2017
Changes to Setup/set_x86_2017.bat.
1
2
3
4
5
6
7
8
9
10
11

12
13
14
1
2
3
4
5
6
7
8
9
10

11
12
13
14










-
+



@ECHO OFF

::
:: set_x86_2017.bat --
::
:: Written by Joe Mistachkin.
:: Released to the public domain, use at your own risk!
::

SET ISNETFX2=False
SET VCRUNTIME=2017_VCU1
SET VCRUNTIME=2017_VCU3
SET PLATFORM=Win32
SET PROCESSOR=x86
SET YEAR=2017
Changes to System.Data.SQLite.Linq/AssemblyInfo.cs.
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


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







-
+















-
-
+
+

// Setting ComVisible to false makes the types in this assembly not visible
// to COM components.  If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
[assembly: CLSCompliant(true)]

#if !NET_40 && !NET_45 && !NET_451 && !NET_452 && !NET_46 && !NET_461 && !NET_462 && !NET_47
#if !NET_40 && !NET_45 && !NET_451 && !NET_452 && !NET_46 && !NET_461 && !NET_462 && !NET_47 && !NET_471
[assembly: AllowPartiallyTrustedCallers]
#endif

[assembly: ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.106.0")]
[assembly: AssemblyFileVersion("1.0.106.0")]
[assembly: AssemblyVersion("1.0.107.0")]
[assembly: AssemblyFileVersion("1.0.107.0")]
Changes to System.Data.SQLite.Linq/SQL Generation/InternalBase.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
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









-
+












-
+














-
+







/********************************************************
 * 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!
 ********************************************************/

using System.Text;

#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
using System.Runtime;
#endif

#if USE_ENTITY_FRAMEWORK_6
namespace System.Data.SQLite.EF6
#else
namespace System.Data.SQLite.Linq
#endif
{
	internal abstract class InternalBase
	{
		// Methods
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
		[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
#endif
		protected InternalBase()
		{
		}

		internal abstract void ToCompactString(StringBuilder builder);
		internal virtual string ToFullString()
		{
			StringBuilder builder = new StringBuilder();
			this.ToFullString(builder);
			return builder.ToString();
		}

#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
		[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
#endif
		internal virtual void ToFullString(StringBuilder builder)
		{
			this.ToCompactString(builder);
		}

Changes to System.Data.SQLite.Linq/SQL Generation/KeyToListMap.cs.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







/********************************************************
 * 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!
 ********************************************************/

using System.Collections.Generic;
using System.Text;
using System.Collections.ObjectModel;
using System.Collections;

#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
using System.Runtime;
#endif

#if USE_ENTITY_FRAMEWORK_6
namespace System.Data.SQLite.EF6
#else
namespace System.Data.SQLite.Linq
119
120
121
122
123
124
125
126

127
128
129
130
131
132
133
134
135
119
120
121
122
123
124
125

126
127
128
129
130
131
132
133
134
135







-
+









			{
				return this.m_map.Keys;
			}
		}

		internal IEnumerable<KeyValuePair<TKey, List<TValue>>> KeyValuePairs
		{
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
			[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
#endif
			get
			{
				return this.m_map;
			}
		}
	}
}
Changes to System.Data.SQLite.Linq/SQL Generation/SqlChecker.cs.
24
25
26
27
28
29
30
31

32
33
34
35
36
37
38
24
25
26
27
28
29
30

31
32
33
34
35
36
37
38







-
+







  {
#if false
    private static Type sql8rewriter;

    static SqlChecker()
    {
        string version =
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
            "4.0.0.0";
#else
            "3.5.0.0";
#endif

        sql8rewriter = Type.GetType(String.Format("System.Data.SqlClient.SqlGen.Sql8ExpressionRewriter, System.Data.Entity, Version={0}, Culture=neutral, PublicKeyToken=b77a5c561934e089", version), false);
    }
Changes to System.Data.SQLite.Linq/SQL Generation/StringUtil.cs.
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20












-
+







/********************************************************
 * 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!
 ********************************************************/

using System.Collections.Generic;
using System.Text;
using System.Globalization;
using System.Collections;

#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
using System.Runtime;
#endif

#if USE_ENTITY_FRAMEWORK_6
namespace System.Data.SQLite.EF6
#else
namespace System.Data.SQLite.Linq
85
86
87
88
89
90
91
92

93
94
95
96
97
98
99
85
86
87
88
89
90
91

92
93
94
95
96
97
98
99







-
+







		}

		private static string InvariantConvertToString<T>(T value)
		{
			return string.Format(CultureInfo.InvariantCulture, "{0}", new object[] { value });
		}

#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
		[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
#endif
		internal static bool IsNullOrEmptyOrWhiteSpace(string value)
		{
			return IsNullOrEmptyOrWhiteSpace(value, 0);
		}

165
166
167
168
169
170
171
172

173
174
175
176
177
178
179
165
166
167
168
169
170
171

172
173
174
175
176
177
178
179







-
+







		}

		internal static void ToSeparatedString(StringBuilder builder, IEnumerable list, string separator)
		{
			ToSeparatedStringPrivate(builder, list, separator, string.Empty, false);
		}

#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
		[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
#endif
		internal static void ToSeparatedString(StringBuilder stringBuilder, IEnumerable list, string separator, string nullValue)
		{
			ToSeparatedStringPrivate(stringBuilder, list, separator, nullValue, false);
		}

Changes to System.Data.SQLite.Linq/SQLiteProviderFactory.cs.
9
10
11
12
13
14
15

16
17
18
19
20
21
22
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23







+







namespace System.Data.SQLite.EF6
#else
namespace System.Data.SQLite.Linq
#endif
{
    using System;
    using System.Data.Common;
    using System.Globalization;

#if USE_ENTITY_FRAMEWORK_6
    using System.Data.Entity.Core.Common;
#endif

    /// <summary>
    /// SQLite implementation of <see cref="DbProviderFactory" />.
136
137
138
139
140
141
142





143
144





145
146
147
148
149
150
151
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







+
+
+
+
+


+
+
+
+
+







        public object GetService(
            Type serviceType
            )
        {
            if ((serviceType == typeof(ISQLiteSchemaExtensions)) ||
                (serviceType == typeof(DbProviderServices)))
            {
                SQLiteLog.LogMessage(HelperMethods.StringFormat(
                    CultureInfo.CurrentCulture,
                    "IServiceProvider.GetService for type \"{0}\" (success).",
                    serviceType));

                return SQLiteProviderServices.Instance;
            }

            SQLiteLog.LogMessage(HelperMethods.StringFormat(
                CultureInfo.CurrentCulture,
                "IServiceProvider.GetService for type \"{0}\" (failure).",
                serviceType));

            return null;
        }
        #endregion

        ///////////////////////////////////////////////////////////////////////

Changes to System.Data.SQLite.Linq/System.Data.SQLite.Core.2012.csproj.
62
63
64
65
66
67
68
69


70
71
72
73
74
75
76
62
63
64
65
66
67
68

69
70
71
72
73
74
75
76
77







-
+
+







    <Reference Include="EntityFramework"
               Condition="'$(NetFx45)' != 'false' Or
                          '$(NetFx451)' != 'false' Or
                          '$(NetFx452)' != 'false' Or
                          '$(NetFx46)' != 'false' Or
                          '$(NetFx461)' != 'false' Or
                          '$(NetFx462)' != 'false' Or
                          '$(NetFx47)' != 'false'">
                          '$(NetFx47)' != 'false' Or
                          '$(NetFx471)' != 'false'">
      <HintPath>$(SQLiteNetDir)\Externals\EntityFramework\lib\net45\EntityFramework.dll</HintPath>
    </Reference>
  </ItemGroup>
  <ItemGroup>
    <Compile Include="AssemblyInfo.cs" />
    <Compile Include="Properties\Resources.Designer.cs">
      <AutoGen>True</AutoGen>
Changes to System.Data.SQLite.Linq/System.Data.SQLite.Core.2013.csproj.
62
63
64
65
66
67
68
69


70
71
72
73
74
75
76
62
63
64
65
66
67
68

69
70
71
72
73
74
75
76
77







-
+
+







    <Reference Include="EntityFramework"
               Condition="'$(NetFx45)' != 'false' Or
                          '$(NetFx451)' != 'false' Or
                          '$(NetFx452)' != 'false' Or
                          '$(NetFx46)' != 'false' Or
                          '$(NetFx461)' != 'false' Or
                          '$(NetFx462)' != 'false' Or
                          '$(NetFx47)' != 'false'">
                          '$(NetFx47)' != 'false' Or
                          '$(NetFx471)' != 'false'">
      <HintPath>$(SQLiteNetDir)\Externals\EntityFramework\lib\net45\EntityFramework.dll</HintPath>
    </Reference>
  </ItemGroup>
  <ItemGroup>
    <Compile Include="AssemblyInfo.cs" />
    <Compile Include="Properties\Resources.Designer.cs">
      <AutoGen>True</AutoGen>
Changes to System.Data.SQLite.Linq/System.Data.SQLite.Core.2015.csproj.
62
63
64
65
66
67
68
69


70
71
72
73
74
75
76
62
63
64
65
66
67
68

69
70
71
72
73
74
75
76
77







-
+
+







    <Reference Include="EntityFramework"
               Condition="'$(NetFx45)' != 'false' Or
                          '$(NetFx451)' != 'false' Or
                          '$(NetFx452)' != 'false' Or
                          '$(NetFx46)' != 'false' Or
                          '$(NetFx461)' != 'false' Or
                          '$(NetFx462)' != 'false' Or
                          '$(NetFx47)' != 'false'">
                          '$(NetFx47)' != 'false' Or
                          '$(NetFx471)' != 'false'">
      <HintPath>$(SQLiteNetDir)\Externals\EntityFramework\lib\net45\EntityFramework.dll</HintPath>
    </Reference>
  </ItemGroup>
  <ItemGroup>
    <Compile Include="AssemblyInfo.cs" />
    <Compile Include="Properties\Resources.Designer.cs">
      <AutoGen>True</AutoGen>
Changes to System.Data.SQLite/AssemblyInfo.cs.
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
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







-
+






-
+





-
+
















-
+

-
+

//  Setting ComVisible to false makes the types in this assembly not visible
//  to COM componenets.  If you need to access a type in this assembly from
//  COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
[assembly: CLSCompliant(true)]
[assembly: InternalsVisibleTo("System.Data.SQLite.Linq, PublicKey=" + System.Data.SQLite.SQLite3.PublicKey)]

#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
[assembly: InternalsVisibleTo("System.Data.SQLite.EF6, PublicKey=" + System.Data.SQLite.SQLite3.PublicKey)]
#endif

[assembly: NeutralResourcesLanguage("en")]

#if !PLATFORM_COMPACTFRAMEWORK
#if !NET_40 && !NET_45 && !NET_451 && !NET_452 && !NET_46 && !NET_461 && !NET_462 && !NET_47
#if !NET_40 && !NET_45 && !NET_451 && !NET_452 && !NET_46 && !NET_461 && !NET_462 && !NET_47 && !NET_471
[assembly: AllowPartiallyTrustedCallers]
#endif

[assembly: ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]

#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
//
// NOTE: This attribute is only available in .NET Framework 4.0 or higher.
//
[assembly: SecurityRules(SecurityRuleSet.Level1)]
#endif
#endif

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.0.106.0")]
[assembly: AssemblyVersion("1.0.107.0")]
#if !PLATFORM_COMPACTFRAMEWORK
[assembly: AssemblyFileVersion("1.0.106.0")]
[assembly: AssemblyFileVersion("1.0.107.0")]
#endif
Changes to System.Data.SQLite/Configurations/System.Data.SQLite.dll.config.
152
153
154
155
156
157
158









159
160
161
162
163
164
165
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174







+
+
+
+
+
+
+
+
+







              useful in ASP.NET and other hosted environments where direct
              control of the location of the managed assemblies is not under
              the control of the application.
    -->
    <!--
    <add key="PreLoadSQLite_BaseDirectory" value="" />
    -->

    <!--
        NOTE: If this configuration variable is set [to anything], the native
              library pre-loader subsystem will attempt to give the interactive
              user an opportunity to attach a debugger to the current process.
    -->
    <!--
    <add key="PreLoadSQLite_BreakIntoDebugger" value="1" />
    -->

    <!--
        NOTE: If this configuration variable is set [to anything], it will be
              used as the base file name (without directory information) for
              the native SQLite library to be pre-loaded (e.g. "sqlite3.dll"
              or "libsqlite3.so.0").
    -->
Changes to System.Data.SQLite/ISQLiteNativeModule.cs.
92
93
94
95
96
97
98
99

100
101
102
103
104
105
106
92
93
94
95
96
97
98

99
100
101
102
103
104
105
106







-
+







        /// been reported up to the application.
        /// </para>
        /// <para>
        /// If the xCreate method is omitted (left as a NULL pointer) then the
        /// virtual table is an eponymous-only virtual table.  New instances of
        /// the virtual table cannot be created using CREATE VIRTUAL TABLE and the
        /// virtual table can only be used via its module name.
        /// Note that SQLite versions prior to 3.9.0 do not understand
        /// Note that SQLite versions prior to 3.9.0 (2015-10-14) do not understand
        /// eponymous-only virtual tables and will segfault if an attempt is made
        /// to CREATE VIRTUAL TABLE on an eponymous-only virtual table because
        /// the xCreate method was not checked for null.
        /// </para>
        /// <para>
        /// If the xCreate method is the exact same pointer as the xConnect method,
        /// that indicates that the virtual table does not need to initialize backing
199
200
201
202
203
204
205
206
207
208
209









210
211
212
213
214
215
216
199
200
201
202
203
204
205




206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221







-
-
-
-
+
+
+
+
+
+
+
+
+







        /// virtual table implementation.  But SQLite does assume that the PRIMARY KEY
        /// constraint is valid - that the identified columns really are UNIQUE and
        /// NOT NULL - and it uses that assumption to optimize queries against the
        /// virtual table.
        /// </para>
        /// <para>
        /// The rowid column is not accessible on a
        /// WITHOUT ROWID virtual table (of course).  Furthermore, since the
        /// xUpdate method depends on having a valid rowid, the xUpdate method 
        /// must be NULL for a WITHOUT ROWID virtual table.  That in turn means that
        /// WITHOUT ROWID virtual tables must be read-only.
        /// WITHOUT ROWID virtual table (of course).
        /// </para>
        /// <para>
        /// The xUpdate method was originally designed around having a
        /// ROWID as a single value.  The xUpdate method has been expanded to
        /// accommodate an arbitrary PRIMARY KEY in place of the ROWID, but the
        /// PRIMARY KEY must still be only one column.  For this reason, SQLite
        /// will reject any WITHOUT ROWID virtual table that has more than one
        /// PRIMARY KEY column and a non-NULL xUpdate method.
        /// </para>
        /// </summary>
        /// <param name="pDb">
        /// The native database connection handle.
        /// </param>
        /// <param name="pAux">
        /// The original native pointer value that was provided to the
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420















421
422
423
424
425
426
427
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







-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







        /// to access these fields in an sqlite3_index_info structure created by an 
        /// older version of SQLite are undefined.
        /// </para>
        /// <para>
        /// In addition, there are some defined constants:
        /// </para>
        /// <para><code>
        /// #define SQLITE_INDEX_CONSTRAINT_EQ      2
        /// #define SQLITE_INDEX_CONSTRAINT_GT      4
        /// #define SQLITE_INDEX_CONSTRAINT_LE      8
        /// #define SQLITE_INDEX_CONSTRAINT_LT     16
        /// #define SQLITE_INDEX_CONSTRAINT_GE     32
        /// #define SQLITE_INDEX_CONSTRAINT_MATCH  64
        /// #define SQLITE_INDEX_CONSTRAINT_LIKE   65     /* 3.10.0 and later only */
        /// #define SQLITE_INDEX_CONSTRAINT_GLOB   66     /* 3.10.0 and later only */
        /// #define SQLITE_INDEX_CONSTRAINT_REGEXP 67     /* 3.10.0 and later only */
        /// #define SQLITE_INDEX_SCAN_UNIQUE        1     /* Scan visits at most 1 row */
        /// #define SQLITE_INDEX_CONSTRAINT_EQ         2
        /// #define SQLITE_INDEX_CONSTRAINT_GT         4
        /// #define SQLITE_INDEX_CONSTRAINT_LE         8
        /// #define SQLITE_INDEX_CONSTRAINT_LT        16
        /// #define SQLITE_INDEX_CONSTRAINT_GE        32
        /// #define SQLITE_INDEX_CONSTRAINT_MATCH     64
        /// #define SQLITE_INDEX_CONSTRAINT_LIKE      65  /* 3.10.0 and later */
        /// #define SQLITE_INDEX_CONSTRAINT_GLOB      66  /* 3.10.0 and later */
        /// #define SQLITE_INDEX_CONSTRAINT_REGEXP    67  /* 3.10.0 and later */
        /// #define SQLITE_INDEX_CONSTRAINT_NE        68  /* 3.21.0 and later */
        /// #define SQLITE_INDEX_CONSTRAINT_ISNOT     69  /* 3.21.0 and later */
        /// #define SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70  /* 3.21.0 and later */
        /// #define SQLITE_INDEX_CONSTRAINT_ISNULL    71  /* 3.21.0 and later */
        /// #define SQLITE_INDEX_CONSTRAINT_IS        72  /* 3.21.0 and later */
        /// #define SQLITE_INDEX_SCAN_UNIQUE           1  /* Scan visits at most 1 row */
        /// </code></para>
        /// <para>
        /// The SQLite core calls the xBestIndex method when it is compiling a query
        /// that involves a virtual table. In other words, SQLite calls this method 
        /// when it is running sqlite3_prepare() or the equivalent. 
        /// By calling this method, the 
        /// SQLite core is saying to the virtual table that it needs to access 
1042
1043
1044
1045
1046
1047
1048
1049
1050



1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065




1066
1067
1068
1069






1070
1071
1072



1073
1074


1075
1076
1077
1078
1079
1080
1081
1052
1053
1054
1055
1056
1057
1058


1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074


1075
1076
1077
1078
1079



1080
1081
1082
1083
1084
1085
1086


1087
1088
1089
1090

1091
1092
1093
1094
1095
1096
1097
1098
1099







-
-
+
+
+













-
-
+
+
+
+

-
-
-
+
+
+
+
+
+

-
-
+
+
+

-
+
+







        /// must choose a rowid for the newly inserted row. Subsequent argv[] 
        /// entries contain values of the columns of the virtual table, in the 
        /// order that the columns were declared. The number of columns will
        /// match the table declaration that the xConnect or xCreate method made 
        /// using the sqlite3_declare_vtab() call.  All hidden columns are included.
        /// </para>
        /// <para>
        /// When doing an insert without a rowid (argc>1, argv[1] is an SQL NULL), the 
        /// implementation must set *pRowid to the rowid of the newly inserted row; 
        /// When doing an insert without a rowid (argc>1, argv[1] is an SQL NULL),
        /// on a virtual table that uses ROWID (but not on a WITHOUT ROWID virtual table,
        /// the implementation must set *pRowid to the rowid of the newly inserted row; 
        /// this will become the value returned by the sqlite3_last_insert_rowid()
        /// function. Setting this value in all the other cases is a harmless no-op;
        /// the SQLite engine ignores the *pRowid return value if argc==1 or 
        /// argv[1] is not an SQL NULL.
        /// </para>
        /// <para>
        /// Each call to xUpdate will fall into one of cases shown below.
        /// Not that references to <![CDATA[<b>]]>argv[i]<![CDATA[</b>]]> mean the SQL value
        /// held within the argv[i] object, not the argv[i]
        /// object itself.
        /// </para>
        /// <para><code>
        /// <![CDATA[<dl>]]>
        /// <![CDATA[<dt>]]><![CDATA[<b>]]>argc = 1<![CDATA[</b>]]>
        /// <![CDATA[</dt>]]><![CDATA[<dd>]]>The single row with rowid equal to argv[0] is deleted. No insert occurs.
        /// <![CDATA[<dt>]]><![CDATA[<b>]]>argc = 1 <![CDATA[<br>]]> argv[0] &#8800; NULL<![CDATA[</b>]]>
        /// <![CDATA[</dt>]]><![CDATA[<dd>]]>
        /// The single row with rowid or PRIMARY KEY equal to argv[0] is deleted. 
        /// No insert occurs.
        /// <![CDATA[</dd>]]><![CDATA[<dt>]]><![CDATA[<b>]]>argc &gt; 1 <![CDATA[<br>]]> argv[0] = NULL<![CDATA[</b>]]>
        /// <![CDATA[</dt>]]><![CDATA[<dd>]]>A new row is inserted with a rowid argv[1] and column values in
        ///        argv[2] and following.  If argv[1] is an SQL NULL,
        ///        the a new unique rowid is generated automatically.
        /// <![CDATA[</dt>]]><![CDATA[<dd>]]>
        /// A new row is inserted with column values taken from
        /// argv[2] and following.  In a rowid virtual table, if argv[1] is an SQL NULL,
        /// then a new unique rowid is generated automatically.  The argv[1] will be NULL
        /// for a WITHOUT ROWID virtual table, in which case the implementation should
        /// take the PRIMARY KEY value from the appropiate column in argv[2] and following.
        /// <![CDATA[</dd>]]><![CDATA[<dt>]]><![CDATA[<b>]]>argc &gt; 1 <![CDATA[<br>]]> argv[0] &#8800; NULL <![CDATA[<br>]]> argv[0] = argv[1]<![CDATA[</b>]]>
        /// <![CDATA[</dt>]]><![CDATA[<dd>]]>The row with rowid argv[0] is updated with new values 
        ///        in argv[2] and following parameters.
        /// <![CDATA[</dt>]]><![CDATA[<dd>]]>
        /// The row with rowid or PRIMARY KEY argv[0] is updated with new values 
        /// in argv[2] and following parameters.
        /// <![CDATA[</dd>]]><![CDATA[<dt>]]><![CDATA[<b>]]>argc &gt; 1 <![CDATA[<br>]]> argv[0] &#8800; NULL <![CDATA[<br>]]> argv[0] &#8800; argv[1]<![CDATA[</b>]]>
        /// <![CDATA[</dt>]]><![CDATA[<dd>]]> The row with rowid argv[0] is updated with rowid argv[1] 
        /// <![CDATA[</dt>]]><![CDATA[<dd>]]> The row with rowid or PRIMARY KEY argv[0] is updated with 
        /// the rowid or PRIMARY KEY in argv[1] 
        /// and new values in argv[2] and following parameters. This will occur 
        /// when an SQL statement updates a rowid, as in the statement:
        /// <para><code>
        ///    UPDATE table SET rowid=rowid+1 WHERE ...; 
        /// </code></para>
        /// <![CDATA[</dd>]]><![CDATA[</dl>]]>
        /// </code></para>
Changes to System.Data.SQLite/LINQ/SQLiteFactory_Linq.cs.
50
51
52
53
54
55
56
57

58
59
60
61
62
63
64
50
51
52
53
54
55
56

57
58
59
60
61
62
63
64







-
+







                SQLiteErrorCode.Ok, SQLiteConvert.ToUTF8("logging initialized."));
        }
#endif

        SQLiteLog.Initialize();

        string version =
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
            "4.0.0.0";
#else
            "3.5.0.0";
#endif

        _dbProviderServicesType = Type.GetType(HelperMethods.StringFormat(CultureInfo.InvariantCulture, "System.Data.Common.DbProviderServices, System.Data.Entity, Version={0}, Culture=neutral, PublicKeyToken=b77a5c561934e089", version), false);
    }
Changes to System.Data.SQLite/SQLite3.cs.
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
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







-
+








+




-
+







    internal const string PublicKey =
        "002400000480000094000000060200000024000052534131000400000100010005a288de5687c4e1" +
        "b621ddff5d844727418956997f475eb829429e411aff3e93f97b70de698b972640925bdd44280df0" +
        "a25a843266973704137cbb0e7441c1fe7cae4e2440ae91ab8cde3933febcb1ac48dd33b40e13c421" +
        "d8215c18a4349a436dd499e3c385cc683015f886f6c10bd90115eb2bd61b67750839e3a19941dc9c";

#if !PLATFORM_COMPACTFRAMEWORK
    internal const string DesignerVersion = "1.0.106.0";
    internal const string DesignerVersion = "1.0.107.0";
#endif

    /// <summary>
    /// The opaque pointer returned to us by the sqlite provider
    /// </summary>
    protected internal SQLiteConnectionHandle _sql;
    protected string _fileName;
    protected SQLiteConnectionFlags _flags;
    private bool _setLogCallback;
    protected bool _usePool;
    protected int _poolVersion;
    private int _cancelCount;

#if (NET_35 || NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47) && !PLATFORM_COMPACTFRAMEWORK
#if (NET_35 || NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471) && !PLATFORM_COMPACTFRAMEWORK
    private bool _buildingSchema;
#endif

    /// <summary>
    /// The user-defined functions registered on this connection
    /// </summary>
    protected Dictionary<SQLiteFunctionAttribute, SQLiteFunction> _functions;
188
189
190
191
192
193
194
195

196
197
198
199
200
201
202
189
190
191
192
193
194
195

196
197
198
199
200
201
202
203







-
+







                // release unmanaged resources here...
                //////////////////////////////////////

#if INTEROP_VIRTUAL_TABLE
                DisposeModules();
#endif

                Close(false); /* Disposing, cannot throw. */
                Close(true); /* Disposing, cannot throw. */
            }
        }
        finally
        {
            base.Dispose(disposing);

            //
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
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







-
+











+
+



-
+
+








    ///////////////////////////////////////////////////////////////////////////////////////////////

    // It isn't necessary to cleanup any functions we've registered.  If the connection
    // goes to the pool and is resurrected later, re-registered functions will overwrite the
    // previous functions.  The SQLiteFunctionCookieHandle will take care of freeing unmanaged
    // resources belonging to the previously-registered functions.
    internal override void Close(bool canThrow)
    internal override void Close(bool disposing)
    {
      if (_sql != null)
      {
          if (!_sql.OwnHandle)
          {
              _sql = null;
              return;
          }

          bool unbindFunctions = ((_flags & SQLiteConnectionFlags.UnbindFunctionsOnClose)
                == SQLiteConnectionFlags.UnbindFunctionsOnClose);

      retry:

          if (_usePool)
          {
              if (SQLiteBase.ResetConnection(_sql, _sql, canThrow))
              if (SQLiteBase.ResetConnection(_sql, _sql, !disposing) &&
                  UnhookNativeCallbacks(true, !disposing))
              {
                  if (unbindFunctions)
                  {
                      if (SQLiteFunction.UnbindAllFunctions(this, _flags, false))
                      {
#if !NET_COMPACT_20 && TRACE_CONNECTION
                          Trace.WriteLine(HelperMethods.StringFormat(
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
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







-
+








-


+




+
-
-
+
+
+
+
+
+
+
+
+



+
+
+







#endif

                  SQLiteConnectionPool.Add(_fileName, _sql, _poolVersion);

                  SQLiteConnection.OnChanged(null, new ConnectionEventArgs(
                      SQLiteConnectionEventType.ClosedToPool, null, null,
                      null, null, _sql, _fileName, new object[] {
                      typeof(SQLite3), canThrow, _fileName, _poolVersion }));
                      typeof(SQLite3), !disposing, _fileName, _poolVersion }));

#if !NET_COMPACT_20 && TRACE_CONNECTION
                  Trace.WriteLine(HelperMethods.StringFormat(
                      CultureInfo.CurrentCulture,
                      "Close (Pool) Success: {0}",
                      HandleToString()));
#endif
              }
#if !NET_COMPACT_20 && TRACE_CONNECTION
              else
              {
#if !NET_COMPACT_20 && TRACE_CONNECTION
                  Trace.WriteLine(HelperMethods.StringFormat(
                      CultureInfo.CurrentCulture,
                      "Close (Pool) Failure: {0}",
                      HandleToString()));
#endif
              }
#endif

                  //
                  // NOTE: This connection cannot be added to the pool;
                  //       therefore, just use the normal disposal
                  //       procedure on it.
                  //
                  _usePool = false;
                  goto retry;
              }
          }
          else
          {
              /* IGNORED */
              UnhookNativeCallbacks(disposing, !disposing);

              if (unbindFunctions)
              {
                  if (SQLiteFunction.UnbindAllFunctions(this, _flags, false))
                  {
#if !NET_COMPACT_20 && TRACE_CONNECTION
                      Trace.WriteLine(HelperMethods.StringFormat(
                          CultureInfo.CurrentCulture,
943
944
945
946
947
948
949
950

951
952
953
954
955
956
957
958
959
960
961
962
963
964

965
966
967
968
969
970
971
972







-
+







    {
      //
      // NOTE: If the database connection is currently open, attempt to
      //       close it now.  This must be done because the file name or
      //       other parameters that may impact the underlying database
      //       connection may have changed.
      //
      if (_sql != null) Close(true);
      if (_sql != null) Close(false);

      //
      // NOTE: If the connection was not closed successfully, throw an
      //       exception now.
      //
      if (_sql != null)
          throw new SQLiteException("connection handle is still active");
1451
1452
1453
1454
1455
1456
1457
1458

1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472

1473
1474
1475
1476
1477
1478
1479
1480







-
+







              }

              if (cmd != null)
                cmd.SetTypes(typedefs);

              return cmd;
            }
#if (NET_35 || NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47) && !PLATFORM_COMPACTFRAMEWORK
#if (NET_35 || NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471) && !PLATFORM_COMPACTFRAMEWORK
            else if (_buildingSchema == false && String.Compare(GetLastError(), 0, "no such table: TEMP.SCHEMA", 0, 26, StringComparison.OrdinalIgnoreCase) == 0)
            {
              strRemain = String.Empty;
              _buildingSchema = true;
              try
              {
                ISQLiteSchemaExtensions ext = ((IServiceProvider)SQLiteFactory.Instance).GetService(typeof(ISQLiteSchemaExtensions)) as ISQLiteSchemaExtensions;
2940
2941
2942
2943
2944
2945
2946



2947
2948









































































































































































































































































































































2949
2950
2951
2952
2953
2954
2955
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302







+
+
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







    /// <param name="func">The callback function to invoke.</param>
    /// <returns>Returns a result code</returns>
    internal override SQLiteErrorCode SetLogCallback(SQLiteLogCallback func)
    {
        SQLiteErrorCode rc = UnsafeNativeMethods.sqlite3_config_log(
            SQLiteConfigOpsEnum.SQLITE_CONFIG_LOG, func, IntPtr.Zero);

        if (rc == SQLiteErrorCode.Ok)
            _setLogCallback = (func != null);

        return rc;
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////

    /// <summary>
    /// Appends an error message and an appropriate line-ending to a <see cref="StringBuilder" />
    /// instance.  This is useful because the .NET Compact Framework has a slightly different set
    /// of supported methods for the <see cref="StringBuilder" /> class.
    /// </summary>
    /// <param name="builder">
    /// The <see cref="StringBuilder" /> instance to append to.
    /// </param>
    /// <param name="message">
    /// The message to append.  It will be followed by an appropriate line-ending.
    /// </param>
    private static void AppendError(
        StringBuilder builder,
        string message
        )
    {
        if (builder == null)
            return;

#if !PLATFORM_COMPACTFRAMEWORK
        builder.AppendLine(message);
#else
        builder.Append(message);
        builder.Append("\r\n");
#endif
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////

    /// <summary>
    /// This method attempts to cause the SQLite native library to invalidate
    /// its function pointers that refer to this instance.  This is necessary
    /// to prevent calls from native code into delegates that may have been
    /// garbage collected.  Normally, these types of issues can only arise for
    /// connections that are added to the pool; howver, it is good practice to
    /// unconditionally invalidate function pointers that may refer to objects
    /// being disposed.
    /// <param name="includeGlobal">
    /// Non-zero to also invalidate global function pointers (i.e. those that
    /// are not directly associated with this connection on the native side).
    /// </param>
    /// <param name="canThrow">
    /// Non-zero if this method is being executed within a context where it can
    /// throw an exception in the event of failure; otherwise, zero.
    /// </param>
    /// </summary>
    /// <returns>
    /// Non-zero if this method was successful; otherwise, zero.
    /// </returns>
    private bool UnhookNativeCallbacks(
        bool includeGlobal,
        bool canThrow
        )
    {
        //
        // NOTE: Initially, this method assumes success.  Then, if any attempt
        //       to invalidate a function pointer fails, the overall result is
        //       set to failure.  However, this will not prevent further
        //       attempts, if any, to invalidate subsequent function pointers.
        //
        bool result = true;
        SQLiteErrorCode rc = SQLiteErrorCode.Ok;
        StringBuilder builder = new StringBuilder();

        ///////////////////////////////////////////////////////////////////////////////////////////

        #region Rollback Hook (Per-Connection)
        try
        {
            SetRollbackHook(null); /* throw */
        }
#if !NET_COMPACT_20 && TRACE_CONNECTION
        catch (Exception e)
#else
        catch (Exception)
#endif
        {
#if !NET_COMPACT_20 && TRACE_CONNECTION
            try
            {
                Trace.WriteLine(HelperMethods.StringFormat(
                    CultureInfo.CurrentCulture,
                    "Failed to unset rollback hook: {0}",
                    e)); /* throw */
            }
            catch
            {
                // do nothing.
            }
#endif

            AppendError(builder, "failed to unset rollback hook");
            rc = SQLiteErrorCode.Error;

            result = false;
        }
        #endregion

        ///////////////////////////////////////////////////////////////////////////////////////////

        #region Trace Callback (Per-Connection)
        try
        {
            SetTraceCallback(null); /* throw */
        }
#if !NET_COMPACT_20 && TRACE_CONNECTION
        catch (Exception e)
#else
        catch (Exception)
#endif
        {
#if !NET_COMPACT_20 && TRACE_CONNECTION
            try
            {
                Trace.WriteLine(HelperMethods.StringFormat(
                    CultureInfo.CurrentCulture,
                    "Failed to unset trace callback: {0}",
                    e)); /* throw */
            }
            catch
            {
                // do nothing.
            }
#endif

            AppendError(builder, "failed to unset trace callback");
            rc = SQLiteErrorCode.Error;

            result = false;
        }
        #endregion

        ///////////////////////////////////////////////////////////////////////////////////////////

        #region Commit Hook (Per-Connection)
        try
        {
            SetCommitHook(null); /* throw */
        }
#if !NET_COMPACT_20 && TRACE_CONNECTION
        catch (Exception e)
#else
        catch (Exception)
#endif
        {
#if !NET_COMPACT_20 && TRACE_CONNECTION
            try
            {
                Trace.WriteLine(HelperMethods.StringFormat(
                    CultureInfo.CurrentCulture,
                    "Failed to unset commit hook: {0}",
                    e)); /* throw */
            }
            catch
            {
                // do nothing.
            }
#endif

            AppendError(builder, "failed to unset commit hook");
            rc = SQLiteErrorCode.Error;

            result = false;
        }
        #endregion

        ///////////////////////////////////////////////////////////////////////////////////////////

        #region Update Hook (Per-Connection)
        try
        {
            SetUpdateHook(null); /* throw */
        }
#if !NET_COMPACT_20 && TRACE_CONNECTION
        catch (Exception e)
#else
        catch (Exception)
#endif
        {
#if !NET_COMPACT_20 && TRACE_CONNECTION
            try
            {
                Trace.WriteLine(HelperMethods.StringFormat(
                    CultureInfo.CurrentCulture,
                    "Failed to unset update hook: {0}",
                    e)); /* throw */
            }
            catch
            {
                // do nothing.
            }
#endif

            AppendError(builder, "failed to unset update hook");
            rc = SQLiteErrorCode.Error;

            result = false;
        }
        #endregion

        ///////////////////////////////////////////////////////////////////////////////////////////

        #region Authorizer Hook (Per-Connection)
        try
        {
            SetAuthorizerHook(null); /* throw */
        }
#if !NET_COMPACT_20 && TRACE_CONNECTION
        catch (Exception e)
#else
        catch (Exception)
#endif
        {
#if !NET_COMPACT_20 && TRACE_CONNECTION
            try
            {
                Trace.WriteLine(HelperMethods.StringFormat(
                    CultureInfo.CurrentCulture,
                    "Failed to unset authorizer hook: {0}",
                    e)); /* throw */
            }
            catch
            {
                // do nothing.
            }
#endif

            AppendError(builder, "failed to unset authorizer hook");
            rc = SQLiteErrorCode.Error;

            result = false;
        }
        #endregion

        ///////////////////////////////////////////////////////////////////////////////////////////

        #region Progress Hook (Per-Connection)
        try
        {
            SetProgressHook(0, null); /* throw */
        }
#if !NET_COMPACT_20 && TRACE_CONNECTION
        catch (Exception e)
#else
        catch (Exception)
#endif
        {
#if !NET_COMPACT_20 && TRACE_CONNECTION
            try
            {
                Trace.WriteLine(HelperMethods.StringFormat(
                    CultureInfo.CurrentCulture,
                    "Failed to unset progress hook: {0}",
                    e)); /* throw */
            }
            catch
            {
                // do nothing.
            }
#endif

            AppendError(builder, "failed to unset progress hook");
            rc = SQLiteErrorCode.Error;

            result = false;
        }
        #endregion

        ///////////////////////////////////////////////////////////////////////////////////////////

        #region Log Callback (Global)
        //
        // NOTE: We have to be careful here because the log callback
        //       is not per-connection on the native side.  It should
        //       only be unset by this method if this instance was
        //       responsible for setting it.
        //
        if (includeGlobal && _setLogCallback)
        {
            try
            {
                SQLiteErrorCode rc2 = SetLogCallback(null); /* throw */

                if (rc2 != SQLiteErrorCode.Ok)
                {
                    AppendError(builder, "could not unset log callback");
                    rc = rc2;

                    result = false;
                }
            }
#if !NET_COMPACT_20 && TRACE_CONNECTION
            catch (Exception e)
#else
            catch (Exception)
#endif
            {
#if !NET_COMPACT_20 && TRACE_CONNECTION
                try
                {
                    Trace.WriteLine(HelperMethods.StringFormat(
                        CultureInfo.CurrentCulture,
                        "Failed to unset log callback: {0}",
                        e)); /* throw */
                }
                catch
                {
                    // do nothing.
                }
#endif

                AppendError(builder, "failed to unset log callback");
                rc = SQLiteErrorCode.Error;

                result = false;
            }
        }
        #endregion

        ///////////////////////////////////////////////////////////////////////////////////////////

        if (!result && canThrow)
            throw new SQLiteException(rc, builder.ToString());

        return result;
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////

    /// <summary>
    /// Creates a new SQLite backup object based on the provided destination
    /// database connection.  The source database connection is the one
    /// associated with this object.  The source and destination database
Changes to System.Data.SQLite/SQLite3_UTF16.cs.
134
135
136
137
138
139
140
141

142
143
144
145
146
147
148
134
135
136
137
138
139
140

141
142
143
144
145
146
147
148







-
+







    {
      //
      // NOTE: If the database connection is currently open, attempt to
      //       close it now.  This must be done because the file name or
      //       other parameters that may impact the underlying database
      //       connection may have changed.
      //
      if (_sql != null) Close(true);
      if (_sql != null) Close(false);

      //
      // NOTE: If the connection was not closed successfully, throw an
      //       exception now.
      //
      if (_sql != null)
          throw new SQLiteException("connection handle is still active");
Changes to System.Data.SQLite/SQLiteBase.cs.
125
126
127
128
129
130
131
132
133


134
135
136
137
138
139
140
125
126
127
128
129
130
131


132
133
134
135
136
137
138
139
140







-
-
+
+







    /// <summary>
    /// Closes the currently-open database.
    /// </summary>
    /// <remarks>
    /// After the database has been closed implemeters should call SQLiteFunction.UnbindFunctions() to deallocate all interop allocated
    /// memory associated with the user-defined functions and collating sequences tied to the closed connection.
    /// </remarks>
    /// <param name="canThrow">Non-zero if the operation is allowed to throw exceptions, zero otherwise.</param>
    internal abstract void Close(bool canThrow);
    /// <param name="disposing">Non-zero if connection is being disposed, zero otherwise.</param>
    internal abstract void Close(bool disposing);
    /// <summary>
    /// Sets the busy timeout on the connection.  SQLiteCommand will call this before executing any command.
    /// </summary>
    /// <param name="nTimeoutMS">The number of milliseconds to wait before returning SQLITE_BUSY</param>
    internal abstract void SetTimeout(int nTimeoutMS);
    /// <summary>
    /// Returns the text of the last error issued by SQLite
1255
1256
1257
1258
1259
1260
1261












1262
1263
1264
1265
1266
1267
1268
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







+
+
+
+
+
+
+
+
+
+
+
+







      /// <summary>
      /// When returning column values, always return <see cref="Decimal" />
      /// values as though they were plain text (i.e. not <see cref="Double" />,
      /// which is the legacy behavior).
      /// </summary>
      GetDecimalAsText = 0x20000000000,

      /// <summary>
      /// When binding <see cref="Decimal" /> parameter values, always use
      /// the invariant culture when converting their values to strings.
      /// </summary>
      BindInvariantDecimal = 0x40000000000,

      /// <summary>
      /// When returning <see cref="Decimal" /> column values, always use
      /// the invariant culture when converting their values from strings.
      /// </summary>
      GetInvariantDecimal = 0x80000000000,

      /// <summary>
      /// When binding parameter values or returning column values, always
      /// treat them as though they were plain text (i.e. no numeric,
      /// date/time, or other conversions should be attempted).
      /// </summary>
      BindAndGetAllAsText = BindAllAsText | GetAllAsText,

1312
1313
1314
1315
1316
1317
1318
1319

1320
1321
1322

1323
1324

1325
1326





1327
1328
1329
1330
1331
1332
1333
1324
1325
1326
1327
1328
1329
1330

1331
1332
1333

1334
1335

1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350







-
+


-
+

-
+


+
+
+
+
+







               LogModuleException,
#else
      LogAll = LogPrepare | LogPreBind | LogBind |
               LogCallbackException | LogBackup,
#endif

      /// <summary>
      /// The default extra flags for new connections.
      /// The default logging related flags for new connections.
      /// </summary>
#if INTEROP_VIRTUAL_TABLE
      Default = LogCallbackException | LogModuleException,
      LogDefault = LogCallbackException | LogModuleException,
#else
      Default = LogCallbackException,
      LogDefault = LogCallbackException,
#endif

      /// <summary>
      /// The default extra flags for new connections.
      /// </summary>
      Default = LogDefault | BindInvariantDecimal | GetInvariantDecimal,

      /// <summary>
      /// The default extra flags for new connections with all logging enabled.
      /// </summary>
      DefaultAndLogAll = Default | LogAll
  }

  /// <summary>
Changes to System.Data.SQLite/SQLiteConnection.cs.
1929
1930
1931
1932
1933
1934
1935
1936



1937
1938
1939
1940


1941
1942
1943
1944
1945
1946
1947
1929
1930
1931
1932
1933
1934
1935

1936
1937
1938
1939
1940
1941

1942
1943
1944
1945
1946
1947
1948
1949
1950







-
+
+
+



-
+
+







    /// Backs up the database, using the specified database connection as the
    /// destination.
    /// </summary>
    /// <param name="destination">The destination database connection.</param>
    /// <param name="destinationName">The destination database name.</param>
    /// <param name="sourceName">The source database name.</param>
    /// <param name="pages">
    /// The number of pages to copy or negative to copy all remaining pages.
    /// The number of pages to copy at a time -OR- a negative value to copy all
    /// pages.  When a negative value is used, the <paramref name="callback" />
    /// may never be invoked.
    /// </param>
    /// <param name="callback">
    /// The method to invoke between each step of the backup process.  This
    /// parameter may be null (i.e. no callbacks will be performed).
    /// parameter may be null (i.e. no callbacks will be performed).  If the
    /// callback returns false -OR- throws an exception, the backup is canceled.
    /// </param>
    /// <param name="retryMilliseconds">
    /// The number of milliseconds to sleep after encountering a locking error
    /// during the backup process.  A value less than zero means that no sleep
    /// should be performed.
    /// </param>
    public void BackupDatabase(
2914
2915
2916
2917
2918
2919
2920
2921

2922
2923
2924
2925
2926
2927
2928
2917
2918
2919
2920
2921
2922
2923

2924
2925
2926
2927
2928
2929
2930
2931







-
+








          _sql = null;
          _enlistment = null;
        }
#endif
        if (_sql != null)
        {
          _sql.Close(!_disposing);
          _sql.Close(_disposing);
          _sql = null;
        }
        _transactionLevel = 0;
        _transactionSequence = 0;
      }

      StateChangeEventArgs eventArgs = null;
4167
4168
4169
4170
4171
4172
4173
4174

4175
4176
4177
4178
4179
4180
4181
4170
4171
4172
4173
4174
4175
4176

4177
4178
4179
4180
4181
4182
4183
4184







-
+







          _connectionState = oldstate;

          StateChangeEventArgs eventArgs = null;
          OnStateChange(ConnectionState.Open, ref eventArgs);

          OnChanged(this, new ConnectionEventArgs(
              SQLiteConnectionEventType.Opened, eventArgs, null, null, null,
              null, null, null));
              null, _connectionString, new object[] { opts }));
        }
        catch
        {
          _connectionState = oldstate;
          throw;
        }
      }
4840
4841
4842
4843
4844
4845
4846
4847

4848
4849
4850
4851
4852
4853
4854
4843
4844
4845
4846
4847
4848
4849

4850
4851
4852
4853
4854
4855
4856
4857







-
+







    public SQLiteErrorCode Shutdown()
    {
        CheckDisposed();

        if (_sql == null)
            throw new InvalidOperationException("Database connection not valid for shutdown.");

        _sql.Close(true); /* NOTE: MUST be closed before shutdown. */
        _sql.Close(false); /* NOTE: MUST be closed before shutdown. */
        SQLiteErrorCode rc = _sql.Shutdown();

#if !NET_COMPACT_20 && TRACE_CONNECTION
        if (rc != SQLiteErrorCode.Ok)
            System.Diagnostics.Trace.WriteLine(HelperMethods.StringFormat(
                CultureInfo.CurrentCulture,
                "Shutdown (Instance) Failed: {0}", rc));
5428
5429
5430
5431
5432
5433
5434
5435

5436
5437
5438
5439
5440
5441
5442
5431
5432
5433
5434
5435
5436
5437

5438
5439
5440
5441
5442
5443
5444
5445







-
+







      return tbl;
    }

    /// <summary>
    /// Build a Columns schema
    /// </summary>
    /// <param name="strCatalog">The catalog (attached database) to query, can be null</param>
    /// <param name="strTable">The table to retrieve schema information for, must not be null</param>
    /// <param name="strTable">The table to retrieve schema information for, can be null</param>
    /// <param name="strColumn">The column to retrieve schema information for, can be null</param>
    /// <returns>DataTable</returns>
    private DataTable Schema_Columns(string strCatalog, string strTable, string strColumn)
    {
      DataTable tbl = new DataTable("Columns");
      DataRow row;

Changes to System.Data.SQLite/SQLiteConvert.cs.
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568

1569


1570

1571
1572
1573
1574
1575
1576
1577
1555
1556
1557
1558
1559
1560
1561

1562



1563
1564
1565

1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576







-

-
-
-


+
-
+
+

+







#if !NET_COMPACT_20 && TRACE_WARNING
            DefaultTypeNameWarning(dbType, flags, defaultTypeName);
#endif

            return defaultTypeName;
        }

        lock (_syncRoot)
        {
            if (_typeNames == null)
                _typeNames = GetSQLiteDbTypeMap();

            SQLiteDbTypeMapping value;

            if ((_typeNames != null) &&
            if (_typeNames.TryGetValue(dbType, out value))
                _typeNames.TryGetValue(dbType, out value))
            {
                return value.typeName;
            }
        }

        if (defaultTypeName != null)
            return defaultTypeName;

        defaultTypeName = GetDefaultTypeName(connection);

2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117

2118
2119
2120
2121
2122
2123
2124
2104
2105
2106
2107
2108
2109
2110

2111




2112
2113
2114
2115
2116
2117
2118
2119







-

-
-
-
-
+







#if !NET_COMPACT_20 && TRACE_WARNING
            DefaultDbTypeWarning(typeName, flags, defaultDbType);
#endif

            return (DbType)defaultDbType;
        }

        lock (_syncRoot)
        {
            if (_typeNames == null)
                _typeNames = GetSQLiteDbTypeMap();

            if (typeName != null)
            if ((_typeNames != null) && (typeName != null))
            {
                SQLiteDbTypeMapping value;

                if (_typeNames.TryGetValue(typeName, out value))
                {
                    return value.dataType;
                }
2144
2145
2146
2147
2148
2149
2150
2151
2152

2153
2154
2155
2156
2157
2158
2159
2139
2140
2141
2142
2143
2144
2145


2146
2147
2148
2149
2150
2151
2152
2153







-
-
+







        DefaultDbTypeWarning(typeName, flags, defaultDbType);
#endif

        return (DbType)defaultDbType;
    }
    #endregion

    private static object _syncRoot = new object();
    private static SQLiteDbTypeMap _typeNames = null;
    private static readonly SQLiteDbTypeMap _typeNames = GetSQLiteDbTypeMap();
  }

  /// <summary>
  /// SQLite has very limited types, and is inherently text-based.  The first 5 types below represent the sum of all types SQLite
  /// understands.  The DateTime extension to the spec is for internal use only.
  /// </summary>
  public enum TypeAffinity
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947

2948
2949
2950
2951
2952
2953
2954
2955
2931
2932
2933
2934
2935
2936
2937




2938

2939
2940
2941
2942
2943
2944
2945







-
-
-
-
+
-







      //
      // NOTE: The only thing that we must guarantee here, according
      //       to the MSDN documentation for IEqualityComparer, is
      //       that for two given strings, if Equals return true then
      //       the two strings must hash to the same value.
      //
      if (value != null)
#if !PLATFORM_COMPACTFRAMEWORK
        return value.ToLowerInvariant().GetHashCode();
#else
        return value.ToLower().GetHashCode();
        return StringComparer.OrdinalIgnoreCase.GetHashCode(value);
#endif
      else
        throw new ArgumentNullException("value");
    }
    #endregion

    ///////////////////////////////////////////////////////////////////////////

Changes to System.Data.SQLite/SQLiteDataReader.cs.
867
868
869
870
871
872
873






874

875
876
877
878
879
880
881
867
868
869
870
871
872
873
874
875
876
877
878
879

880
881
882
883
884
885
886
887







+
+
+
+
+
+
-
+







            }
        }

        if (i >= PrivateVisibleFieldCount && _keyInfo != null)
            return _keyInfo.GetDecimal(i - PrivateVisibleFieldCount);

        VerifyType(i, DbType.Decimal);

        CultureInfo cultureInfo = CultureInfo.CurrentCulture;

        if ((_flags & SQLiteConnectionFlags.GetInvariantDecimal) == SQLiteConnectionFlags.GetInvariantDecimal)
            cultureInfo = CultureInfo.InvariantCulture;

        return Decimal.Parse(_activeStatement._sql.GetText(_activeStatement, i), NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture);
        return Decimal.Parse(_activeStatement._sql.GetText(_activeStatement, i), NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent | NumberStyles.AllowLeadingSign, cultureInfo);
    }

    /// <summary>
    /// Returns the column as a double
    /// </summary>
    /// <param name="i">The index of the column.</param>
    /// <returns>double</returns>
Changes to System.Data.SQLite/SQLiteDefineConstants.cs.
131
132
133
134
135
136
137




138
139
140
141
142
143
144
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148







+
+
+
+







#if NET_462
            "NET_462",
#endif

#if NET_47
            "NET_47",
#endif

#if NET_471
            "NET_471",
#endif

#if NET_COMPACT_20
            "NET_COMPACT_20",
#endif

#if PLATFORM_COMPACTFRAMEWORK
            "PLATFORM_COMPACTFRAMEWORK",
Changes to System.Data.SQLite/SQLiteModule.cs.
751
752
753
754
755
756
757
758


























759
760
761
762
763
764
765
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







-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







        /// This value represents the GLOB operator.
        /// </summary>
        Glob = 66,

        /// <summary>
        /// This value represents the REGEXP operator.
        /// </summary>
        Regexp = 67
        Regexp = 67,

        /// <summary>
        /// This value represents the inequality operator.
        /// </summary>
        NotEqualTo = 68,

        /// <summary>
        /// This value represents the IS NOT operator.
        /// </summary>
        IsNot = 69,

        /// <summary>
        /// This value represents the IS NOT NULL operator.
        /// </summary>
        IsNotNull = 70,

        /// <summary>
        /// This value represents the IS NULL operator.
        /// </summary>
        IsNull = 71,

        /// <summary>
        /// This value represents the IS operator.
        /// </summary>
        Is = 72
    }
    #endregion

    ///////////////////////////////////////////////////////////////////////////

    #region SQLiteIndexFlags Enumeration
    /// <summary>
1956
1957
1958
1959
1960
1961
1962
1963


1964
1965
1966
1967
1968
1969
1970
1981
1982
1983
1984
1985
1986
1987

1988
1989
1990
1991
1992
1993
1994
1995
1996







-
+
+







            SQLiteMarshal.WriteInt32(pIndex, offset,
                outputs.IndexNumber);

            offset = SQLiteMarshal.NextOffsetOf(
                offset, sizeof(int), IntPtr.Size);

            SQLiteMarshal.WriteIntPtr(pIndex, offset,
                SQLiteString.Utf8IntPtrFromString(outputs.IndexString));
                SQLiteString.Utf8IntPtrFromString(
                    outputs.IndexString, false)); /* OK: FREED BY CORE*/

            offset = SQLiteMarshal.NextOffsetOf(
                offset, IntPtr.Size, sizeof(int));

            //
            // NOTE: We just allocated the IndexString field; therefore, we
            //       need to set make sure the NeedToFreeIndexString field
3259
3260
3261
3262
3263
3264
3265
3266



3267
3268
3269
3270
3271
3272
3273
3285
3286
3287
3288
3289
3290
3291

3292
3293
3294
3295
3296
3297
3298
3299
3300
3301







-
+
+
+








        ///////////////////////////////////////////////////////////////////////

        #region Memory Allocation Helper Methods
        /// <summary>
        /// Allocates at least the specified number of bytes of native memory
        /// via the SQLite core library sqlite3_malloc() function and returns
        /// the resulting native pointer.
        /// the resulting native pointer.  If the TRACK_MEMORY_BYTES option
        /// was enabled at compile-time, adjusts the number of bytes currently
        /// allocated by this class.
        /// </summary>
        /// <param name="size">
        /// The number of bytes to allocate.
        /// </param>
        /// <returns>
        /// The native pointer that points to a block of memory of at least the
        /// specified size -OR- <see cref="IntPtr.Zero" /> if the memory could
3297
3298
3299
3300
3301
3302
3303























3304
3305




3306
3307
3308
3309


3310
3311
3312
3313
3314
3315
3316
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354


3355
3356
3357
3358
3359
3360
3361

3362
3363
3364
3365
3366
3367
3368
3369
3370







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+



-
+
+








            return pMemory;
        }

        ///////////////////////////////////////////////////////////////////////

        /// <summary>
        /// Allocates at least the specified number of bytes of native memory
        /// via the SQLite core library sqlite3_malloc() function and returns
        /// the resulting native pointer without adjusting the number of
        /// allocated bytes currently tracked by this class.  This is useful
        /// when dealing with blocks of memory that will be freed directly by
        /// the SQLite core library.
        /// </summary>
        /// <param name="size">
        /// The number of bytes to allocate.
        /// </param>
        /// <returns>
        /// The native pointer that points to a block of memory of at least the
        /// specified size -OR- <see cref="IntPtr.Zero" /> if the memory could
        /// not be allocated.
        /// </returns>
        public static IntPtr AllocateUntracked(int size)
        {
            return UnsafeNativeMethods.sqlite3_malloc(size);
        }

        ///////////////////////////////////////////////////////////////////////

        /// <summary>
        /// Gets and returns the actual size of the specified memory block that
        /// was previously obtained from the <see cref="Allocate" /> method.
        /// Gets and returns the actual size of the specified memory block
        /// that was previously obtained from the <see cref="Allocate" /> or
        /// <see cref="AllocateUntracked" /> methods or directly from the
        /// SQLite core library.
        /// </summary>
        /// <param name="pMemory">
        /// The native pointer to the memory block previously obtained from the
        /// <see cref="Allocate" /> method.
        /// <see cref="Allocate" /> or <see cref="AllocateUntracked" /> methods
        /// or directly from the SQLite core library.
        /// </param>
        /// <returns>
        /// The actual size, in bytes, of the memory block specified via the
        /// native pointer.
        /// </returns>
        public static int Size(IntPtr pMemory)
        {
3327
3328
3329
3330
3331
3332
3333
3334



3335
3336
3337
3338
3339
3340
3341
3381
3382
3383
3384
3385
3386
3387

3388
3389
3390
3391
3392
3393
3394
3395
3396
3397







-
+
+
+







#endif
        }

        ///////////////////////////////////////////////////////////////////////

        /// <summary>
        /// Frees a memory block previously obtained from the
        /// <see cref="Allocate" /> method.
        /// <see cref="Allocate" /> method.  If the TRACK_MEMORY_BYTES option
        /// was enabled at compile-time, adjusts the number of bytes currently
        /// allocated by this class.
        /// </summary>
        /// <param name="pMemory">
        /// The native pointer to the memory block previously obtained from the
        /// <see cref="Allocate" /> method.
        /// </param>
        public static void Free(IntPtr pMemory)
        {
3350
3351
3352
3353
3354
3355
3356

















3357
3358
3359
3360
3361
3362
3363
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







                    {
                        bytesAllocated -= blockSize;
                    }
                }
            }
#endif

            UnsafeNativeMethods.sqlite3_free(pMemory);
        }

        ///////////////////////////////////////////////////////////////////////

        /// <summary>
        /// Frees a memory block previously obtained from the SQLite core
        /// library without adjusting the number of allocated bytes currently
        /// tracked by this class.  This is useful when dealing with blocks of
        /// memory that were not allocated using this class.
        /// </summary>
        /// <param name="pMemory">
        /// The native pointer to the memory block previously obtained from the
        /// SQLite core library.
        /// </param>
        public static void FreeUntracked(IntPtr pMemory)
        {
            UnsafeNativeMethods.sqlite3_free(pMemory);
        }
        #endregion
    }
    #endregion

    ///////////////////////////////////////////////////////////////////////////
3546
3547
3548
3549
3550
3551
3552
3553



























3554
3555
3556


























3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568





3569
3570
3571
3572
3573
3574
3575
3576
3577

3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591

3592



3593
3594
3595
3596
3597
3598
3599
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655

3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723

3724
3725
3726
3727
3728
3729
3730
3731
3732
3733








+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+


-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+












+
+
+
+
+









+














+
-
+
+
+







        /// <returns>
        /// The native NUL-terminated UTF-8 string pointer or
        /// <see cref="IntPtr.Zero" /> upon failure.
        /// </returns>
        public static IntPtr Utf8IntPtrFromString(
            string value
            )
        {
            return Utf8IntPtrFromString(value, true);
        }

        ///////////////////////////////////////////////////////////////////////

        /// <summary>
        /// Converts the specified managed string into a native NUL-terminated
        /// UTF-8 string pointer using memory obtained from the SQLite core
        /// library.
        /// </summary>
        /// <param name="value">
        /// The managed string to convert.
        /// </param>
        /// <param name="tracked">
        /// Non-zero to obtain memory from the SQLite core library without
        /// adjusting the number of allocated bytes currently being tracked
        /// by the <see cref="SQLiteMemory" /> class.
        /// </param>
        /// <returns>
        /// The native NUL-terminated UTF-8 string pointer or
        /// <see cref="IntPtr.Zero" /> upon failure.
        /// </returns>
        public static IntPtr Utf8IntPtrFromString(
            string value,
            bool tracked
            )
        {
            int length = 0;

            return Utf8IntPtrFromString(value, ref length);
            return Utf8IntPtrFromString(value, tracked, ref length);
        }

        ///////////////////////////////////////////////////////////////////////

        /// <summary>
        /// Converts the specified managed string into a native NUL-terminated
        /// UTF-8 string pointer using memory obtained from the SQLite core
        /// library.
        /// </summary>
        /// <param name="value">
        /// The managed string to convert.
        /// </param>
        /// <param name="length">
        /// The length of the native string, in bytes.
        /// </param>
        /// <returns>
        /// The native NUL-terminated UTF-8 string pointer or
        /// <see cref="IntPtr.Zero" /> upon failure.
        /// </returns>
        public static IntPtr Utf8IntPtrFromString(
            string value,
            ref int length
            )
        {
            return Utf8IntPtrFromString(value, true, ref length);
        }

        ///////////////////////////////////////////////////////////////////////

        /// <summary>
        /// Converts the specified managed string into a native NUL-terminated
        /// UTF-8 string pointer using memory obtained from the SQLite core
        /// library.
        /// </summary>
        /// <param name="value">
        /// The managed string to convert.
        /// </param>
        /// <param name="tracked">
        /// Non-zero to obtain memory from the SQLite core library without
        /// adjusting the number of allocated bytes currently being tracked
        /// by the <see cref="SQLiteMemory" /> class.
        /// </param>
        /// <param name="length">
        /// The length of the native string, in bytes.
        /// </param>
        /// <returns>
        /// The native NUL-terminated UTF-8 string pointer or
        /// <see cref="IntPtr.Zero" /> upon failure.
        /// </returns>
        public static IntPtr Utf8IntPtrFromString(
            string value,
            bool tracked,
            ref int length
            )
        {
            if (value == null)
                return IntPtr.Zero;

            IntPtr result = IntPtr.Zero;
            byte[] bytes = GetUtf8BytesFromString(value);

            if (bytes == null)
                return IntPtr.Zero;

            length = bytes.Length;

            if (tracked)
            result = SQLiteMemory.Allocate(length + 1);
                result = SQLiteMemory.Allocate(length + 1);
            else
                result = SQLiteMemory.AllocateUntracked(length + 1);

            if (result == IntPtr.Zero)
                return IntPtr.Zero;

            Marshal.Copy(bytes, 0, result, length);
            Marshal.WriteByte(result, length, 0);

3650
3651
3652
3653
3654
3655
3656





3657
3658
3659
3660
3661
3662


3663
3664
3665
3666
3667
3668
3669
3670
3671

3672
3673
3674
3675
3676
3677
3678
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800

3801
3802
3803
3804
3805
3806
3807
3808
3809
3810

3811
3812
3813
3814
3815
3816
3817
3818







+
+
+
+
+





-
+
+








-
+







        /// <summary>
        /// Converts an array of managed strings into an array of native
        /// NUL-terminated UTF-8 string pointers.
        /// </summary>
        /// <param name="values">
        /// The array of managed strings to convert.
        /// </param>
        /// <param name="tracked">
        /// Non-zero to obtain memory from the SQLite core library without
        /// adjusting the number of allocated bytes currently being tracked
        /// by the <see cref="SQLiteMemory" /> class.
        /// </param>
        /// <returns>
        /// The array of native NUL-terminated UTF-8 string pointers or null
        /// upon failure.
        /// </returns>
        public static IntPtr[] Utf8IntPtrArrayFromStringArray(
            string[] values
            string[] values,
            bool tracked
            )
        {
            if (values == null)
                return null;

            IntPtr[] result = new IntPtr[values.Length];

            for (int index = 0; index < result.Length; index++)
                result[index] = Utf8IntPtrFromString(values[index]);
                result[index] = Utf8IntPtrFromString(values[index], tracked);

            return result;
        }
        #endregion
    }
    #endregion

Changes to System.Data.SQLite/SQLiteSession.cs.
2372
2373
2374
2375
2376
2377
2378
2379

2380
2381
2382
2383
2384
2385
2386
2372
2373
2374
2375
2376
2377
2378

2379
2380
2381
2382
2383
2384
2385
2386







-
+








                rawData = SQLiteBytes.FromIntPtr(pData, nData);
            }
            finally
            {
                if (pData != IntPtr.Zero)
                {
                    SQLiteMemory.Free(pData);
                    SQLiteMemory.FreeUntracked(pData);
                    pData = IntPtr.Zero;
                }
            }
        }

        ///////////////////////////////////////////////////////////////////////

2954
2955
2956
2957
2958
2959
2960
2961

2962
2963
2964
2965
2966
2967
2968
2954
2955
2956
2957
2958
2959
2960

2961
2962
2963
2964
2965
2966
2967
2968







-
+








                rawData = SQLiteBytes.FromIntPtr(pData, nData);
            }
            finally
            {
                if (pData != IntPtr.Zero)
                {
                    SQLiteMemory.Free(pData);
                    SQLiteMemory.FreeUntracked(pData);
                    pData = IntPtr.Zero;
                }
            }
        }

        ///////////////////////////////////////////////////////////////////////

3030
3031
3032
3033
3034
3035
3036
3037

3038
3039
3040
3041
3042
3043
3044
3030
3031
3032
3033
3034
3035
3036

3037
3038
3039
3040
3041
3042
3043
3044







-
+








                rawData = SQLiteBytes.FromIntPtr(pData, nData);
            }
            finally
            {
                if (pData != IntPtr.Zero)
                {
                    SQLiteMemory.Free(pData);
                    SQLiteMemory.FreeUntracked(pData);
                    pData = IntPtr.Zero;
                }
            }
        }

        ///////////////////////////////////////////////////////////////////////

3132
3133
3134
3135
3136
3137
3138
3139

3140
3141
3142
3143
3144
3145
3146
3132
3133
3134
3135
3136
3137
3138

3139
3140
3141
3142
3143
3144
3145
3146







-
+







                        "sqlite3session_diff", error));
                }
            }
            finally
            {
                if (pError != IntPtr.Zero)
                {
                    SQLiteMemory.Free(pError);
                    SQLiteMemory.FreeUntracked(pError);
                    pError = IntPtr.Zero;
                }
            }
        }
        #endregion

        ///////////////////////////////////////////////////////////////////////
3590
3591
3592
3593
3594
3595
3596
3597

3598
3599
3600
3601
3602
3603
3604
3590
3591
3592
3593
3594
3595
3596

3597
3598
3599
3600
3601
3602
3603
3604







-
+







                return new SQLiteMemoryChangeSet(
                    newData, GetHandle(), GetFlags());
            }
            finally
            {
                if (pOutData != IntPtr.Zero)
                {
                    SQLiteMemory.Free(pOutData);
                    SQLiteMemory.FreeUntracked(pOutData);
                    pOutData = IntPtr.Zero;
                }

                if (pInData != IntPtr.Zero)
                {
                    SQLiteMemory.Free(pInData);
                    pInData = IntPtr.Zero;
3667
3668
3669
3670
3671
3672
3673
3674

3675
3676
3677
3678
3679
3680
3681
3667
3668
3669
3670
3671
3672
3673

3674
3675
3676
3677
3678
3679
3680
3681







-
+







                return new SQLiteMemoryChangeSet(
                    newData, GetHandle(), GetFlags());
            }
            finally
            {
                if (pOutData != IntPtr.Zero)
                {
                    SQLiteMemory.Free(pOutData);
                    SQLiteMemory.FreeUntracked(pOutData);
                    pOutData = IntPtr.Zero;
                }

                if (pInData2 != IntPtr.Zero)
                {
                    SQLiteMemory.Free(pInData2);
                    pInData2 = IntPtr.Zero;
Changes to System.Data.SQLite/SQLiteStatement.cs.
436
437
438
439
440
441
442



443
444
445
446
447
448

449
450
451
452
453
454
455
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450

451
452
453
454
455
456
457
458







+
+
+





-
+







              _sql.Bind_Text(this, _flags, index, invariantText ?
                  SQLiteConvert.ToStringWithProvider(obj, invariantCultureInfo) :
                  SQLiteConvert.ToStringWithProvider(obj, cultureInfo));
          }

          return;
      }

      bool invariantDecimal = ((_flags & SQLiteConnectionFlags.BindInvariantDecimal)
          == SQLiteConnectionFlags.BindInvariantDecimal);

      if ((_flags & SQLiteConnectionFlags.BindDecimalAsText) == SQLiteConnectionFlags.BindDecimalAsText)
      {
          if (obj is Decimal)
          {
              _sql.Bind_Text(this, _flags, index, invariantText ?
              _sql.Bind_Text(this, _flags, index, invariantText || invariantDecimal ?
                  SQLiteConvert.ToStringWithProvider(obj, invariantCultureInfo) :
                  SQLiteConvert.ToStringWithProvider(obj, cultureInfo));

              return;
          }
      }

491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519



520
521
522
523
524
525
526
494
495
496
497
498
499
500

501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518



519
520
521
522
523
524
525
526
527
528







-


















-
-
-
+
+
+







          break;
        case DbType.UInt64:
          _sql.Bind_UInt64(this, _flags, index, Convert.ToUInt64(obj, cultureInfo));
          break;
        case DbType.Single:
        case DbType.Double:
        case DbType.Currency:
        //case DbType.Decimal: // Dont store decimal as double ... loses precision
          _sql.Bind_Double(this, _flags, index, Convert.ToDouble(obj, cultureInfo));
          break;
        case DbType.Binary:
          _sql.Bind_Blob(this, _flags, index, (byte[])obj);
          break;
        case DbType.Guid:
          if (_command.Connection._binaryGuid == true)
          {
            _sql.Bind_Blob(this, _flags, index, ((Guid)obj).ToByteArray());
          }
          else
          {
            _sql.Bind_Text(this, _flags, index, invariantText ?
              SQLiteConvert.ToStringWithProvider(obj, invariantCultureInfo) :
              SQLiteConvert.ToStringWithProvider(obj, cultureInfo));
          }
          break;
        case DbType.Decimal: // Dont store decimal as double ... loses precision
          _sql.Bind_Text(this, _flags, index, invariantText ?
              SQLiteConvert.ToStringWithProvider(Convert.ToDecimal(obj, cultureInfo), invariantCultureInfo) :
              SQLiteConvert.ToStringWithProvider(Convert.ToDecimal(obj, cultureInfo), cultureInfo));
          _sql.Bind_Text(this, _flags, index, invariantText || invariantDecimal ?
            SQLiteConvert.ToStringWithProvider(Convert.ToDecimal(obj, cultureInfo), invariantCultureInfo) :
            SQLiteConvert.ToStringWithProvider(Convert.ToDecimal(obj, cultureInfo), cultureInfo));
          break;
        default:
          _sql.Bind_Text(this, _flags, index, invariantText ?
              SQLiteConvert.ToStringWithProvider(obj, invariantCultureInfo) :
              SQLiteConvert.ToStringWithProvider(obj, cultureInfo));
          break;
      }
Changes to System.Data.SQLite/Targets/System.Data.SQLite.Files.targets.
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
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







-
+
+











-
+
+







                        '$(NetFx40)' != 'false' Or
                        '$(NetFx45)' != 'false' Or
                        '$(NetFx451)' != 'false' Or
                        '$(NetFx452)' != 'false' Or
                        '$(NetFx46)' != 'false' Or
                        '$(NetFx461)' != 'false' Or
                        '$(NetFx462)' != 'false' Or
                        '$(NetFx47)' != 'false'"
                        '$(NetFx47)' != 'false' Or
                        '$(NetFx471)' != 'false'"
             Include="LINQ\SQLiteConnection_Linq.cs">
      <SubType>Component</SubType>
    </Compile>
    <Compile Condition="'$(NetFx35)' != 'false' Or
                        '$(NetFx40)' != 'false' Or
                        '$(NetFx45)' != 'false' Or
                        '$(NetFx451)' != 'false' Or
                        '$(NetFx452)' != 'false' Or
                        '$(NetFx46)' != 'false' Or
                        '$(NetFx461)' != 'false' Or
                        '$(NetFx462)' != 'false' Or
                        '$(NetFx47)' != 'false'"
                        '$(NetFx47)' != 'false' Or
                        '$(NetFx471)' != 'false'"
             Include="LINQ\SQLiteFactory_Linq.cs">
      <SubType>Code</SubType>
    </Compile>
    <EmbeddedResource Include="Resources\SQLiteCommand.bmp" />
    <EmbeddedResource Include="Resources\SQLiteConnection.bmp" />
    <EmbeddedResource Include="Resources\SQLiteDataAdapter.bmp" />
  </ItemGroup>
Changes to System.Data.SQLite/Targets/System.Data.SQLite.Properties.targets.
113
114
115
116
117
118
119











120
121
122
123
124
125
126
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







+
+
+
+
+
+
+
+
+
+
+







            Framework 4.7 (if necessary, it will typically be enabled from
            within the project file itself).
  -->
  <PropertyGroup Condition="'$(NetFx47)' != 'false'">
    <DefineConstants>$(DefineConstants);NET_47</DefineConstants>
  </PropertyGroup>

  <!--
      NOTE: Only use functionality available in the .NET Framework 4.7.1?  By
            default, this is disabled.  This must be enabled to successfully
            build the project using Visual Studio 2017 and/or the .NET
            Framework 4.7.1 (if necessary, it will typically be enabled from
            within the project file itself).
  -->
  <PropertyGroup Condition="'$(NetFx471)' != 'false'">
    <DefineConstants>$(DefineConstants);NET_471</DefineConstants>
  </PropertyGroup>

  <!--
      NOTE: Only use functionality available in the .NET Compact Framework 2.0?
            By default, this is disabled.  This must be enabled to successfully
            build the project using Visual Studio 2005 and/or the .NET Compact
            Framework 2.0 (if necessary, it will typically be enabled from
            within the project file itself).
  -->
Changes to System.Data.SQLite/UnsafeNativeMethods.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
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












-
+













-
+







/********************************************************
 * 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.Globalization;

#if !NET_COMPACT_20 && (TRACE_DETECTION || TRACE_SHARED || TRACE_PRELOAD || TRACE_HANDLE)
#if TRACE_DETECTION || TRACE_SHARED || TRACE_PRELOAD || TRACE_HANDLE
  using System.Diagnostics;
#endif

  using System.Collections.Generic;
  using System.IO;
  using System.Reflection;

#if !PLATFORM_COMPACTFRAMEWORK
  using System.Security;
#endif

  using System.Runtime.InteropServices;

#if (NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47) && !PLATFORM_COMPACTFRAMEWORK
#if (NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471) && !PLATFORM_COMPACTFRAMEWORK
  using System.Runtime.Versioning;
#endif

  using System.Text;

#if !PLATFORM_COMPACTFRAMEWORK || COUNT_HANDLE
  using System.Threading;
268
269
270
271
272
273
274








275
276
277
278
279


















280
281
282
283
284
285
286
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







+
+
+
+
+
+
+
+





+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







      /////////////////////////////////////////////////////////////////////////
      /// <summary>
      /// Keeps track of whether we are running on Mono.  Initially null, it is
      /// set by the <see cref="IsMono" /> method on its first call.  Later, it
      /// is returned verbatim by the <see cref="IsMono" /> method.
      /// </summary>
      private static bool? isMono = null;

      /////////////////////////////////////////////////////////////////////////
      /// <summary>
      /// Keeps track of whether we successfully invoked the
      /// <see cref="Debugger.Break" /> method.  Initially null, it is set by
      /// the <see cref="MaybeBreakIntoDebugger" /> method on its first call.
      /// </summary>
      private static bool? debuggerBreak = null;
      #endregion

      /////////////////////////////////////////////////////////////////////////

      #region Private Methods
      /// <summary>
      /// Determines the ID of the current process.  Only used for debugging.
      /// </summary>
      /// <returns>
      /// The ID of the current process -OR- zero if it cannot be determined.
      /// </returns>
      private static int GetProcessId()
      {
          Process process = Process.GetCurrentProcess();

          if (process == null)
              return 0;

          return process.Id;
      }

      ///////////////////////////////////////////////////////////////////////

      /// <summary>
      /// Determines whether or not this assembly is running on Mono.
      /// </summary>
      /// <returns>
      /// Non-zero if this assembly is running on Mono.
      /// </returns>
      private static bool IsMono()
303
304
305
306
307
308
309



















































































310
311
312
313
314
315
316
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







          return false;
      }
      #endregion

      /////////////////////////////////////////////////////////////////////////

      #region Internal Methods
      /// <summary>
      /// If the "PreLoadSQLite_BreakIntoDebugger" configuration setting is
      /// present (e.g. via the environment), give the interactive user an
      /// opportunity to attach a debugger to the current process; otherwise,
      /// do nothing.
      /// </summary>
      internal static void MaybeBreakIntoDebugger()
      {
          lock (staticSyncRoot)
          {
              if (debuggerBreak != null)
                  return;
          }

          if (UnsafeNativeMethods.GetSettingValue(
                "PreLoadSQLite_BreakIntoDebugger", null) != null)
          {
              //
              // NOTE: Attempt to use the Console in order to prompt the
              //       interactive user (if any).  This may fail for any
              //       number of reasons.  Even in those cases, we still
              //       want to issue the actual request to break into the
              //       debugger.
              //
              try
              {
                  Console.WriteLine(StringFormat(
                      CultureInfo.CurrentCulture,
                      "Attach a debugger to process {0} " +
                      "and press any key to continue.",
                      GetProcessId()));

#if PLATFORM_COMPACTFRAMEWORK
                  Console.ReadLine();
#else
                  Console.ReadKey();
#endif
              }
#if !NET_COMPACT_20 && TRACE_SHARED
              catch (Exception e)
#else
              catch (Exception)
#endif
              {
#if !NET_COMPACT_20 && TRACE_SHARED
                  try
                  {
                      Trace.WriteLine(HelperMethods.StringFormat(
                          CultureInfo.CurrentCulture,
                          "Failed to issue debugger prompt, " +
                          "{0} may be unusable: {1}",
                          typeof(Console), e)); /* throw */
                  }
                  catch
                  {
                      // do nothing.
                  }
#endif
              }

              try
              {
                  Debugger.Break();

                  lock (staticSyncRoot)
                  {
                      debuggerBreak = true;
                  }
              }
              catch
              {
                  lock (staticSyncRoot)
                  {
                      debuggerBreak = false;
                  }

                  throw;
              }
          }
      }

      /////////////////////////////////////////////////////////////////////////

      /// <summary>
      /// Determines if preparing a query should be logged.
      /// </summary>
      /// <param name="flags">
      /// The flags associated with the parent connection object.
      /// </param>
      /// <returns>
974
975
976
977
978
979
980






981
982
983
984
985

986
987
988
989
990
991
992
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099

1100
1101
1102
1103
1104
1105
1106
1107







+
+
+
+
+
+




-
+







      /////////////////////////////////////////////////////////////////////////
      /// <summary>
      /// Attempts to initialize this class by pre-loading the native SQLite
      /// library for the processor architecture of the current process.
      /// </summary>
      internal static void Initialize()
      {
          //
          // NOTE: Check if a debugger needs to be attached before doing any
          //       real work.
          //
          HelperMethods.MaybeBreakIntoDebugger();

#if SQLITE_STANDARD || USE_INTEROP_DLL || PLATFORM_COMPACTFRAMEWORK
#if PRELOAD_NATIVE_LIBRARY
          //
          // NOTE: If the "No_PreLoadSQLite" environment variable is set (to
          //       anything), skip all our special code and simply return.
          //       anything), skip all of our special code and simply return.
          //
          if (GetSettingValue("No_PreLoadSQLite", null) != null)
              return;
#endif
#endif

          #region Debug Build Only
1382
1383
1384
1385
1386
1387
1388
1389

1390
1391
1392
1393
1394
1395
1396
1497
1498
1499
1500
1501
1502
1503

1504
1505
1506
1507
1508
1509
1510
1511







-
+







      /// </returns>
      private static string GetAssemblyTargetFramework(
          Assembly assembly
          )
      {
          if (assembly != null)
          {
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
              try
              {
                  if (assembly.IsDefined(
                          typeof(TargetFrameworkAttribute), false))
                  {
                      TargetFrameworkAttribute targetFramework =
                          (TargetFrameworkAttribute)
2621
2622
2623
2624
2625
2626
2627
2628

2629
2630
2631
2632
2633
2634
2635
2736
2737
2738
2739
2740
2741
2742

2743
2744
2745
2746
2747
2748
2749
2750







-
+







    //
    // NOTE: On the .NET Compact Framework, the native interop assembly must
    //       be used because it provides several workarounds to .NET Compact
    //       Framework limitations important for proper operation of the core
    //       System.Data.SQLite functionality (e.g. being able to bind
    //       parameters and handle column values of types Int64 and Double).
    //
    internal const string SQLITE_DLL = "SQLite.Interop.106.dll";
    internal const string SQLITE_DLL = "SQLite.Interop.107.dll";
#elif SQLITE_STANDARD
    //
    // NOTE: Otherwise, if the standard SQLite library is enabled, use it.
    //
    internal const string SQLITE_DLL = "sqlite3";
#elif USE_INTEROP_DLL
    //
Changes to Targets/SQLite.NET.Settings.targets.
90
91
92
93
94
95
96





97
98
99
100
101
102
103
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108







+
+
+
+
+







                     Exists('$(SQLiteNetDir)\Targets\SQLite.NET.Settings.targets.netFx462')" />

  <Import Project="$(SQLiteNetDir)\Targets\SQLite.NET.Settings.targets.netFx47"
          Condition="'$(NetFx47)' != '' And '$(NetFx47)' != 'false' And
                     ('$(NetFx47Settings)' == '' Or '$(NetFx47Settings)' != 'false') And
                     Exists('$(SQLiteNetDir)\Targets\SQLite.NET.Settings.targets.netFx47')" />

  <Import Project="$(SQLiteNetDir)\Targets\SQLite.NET.Settings.targets.netFx471"
          Condition="'$(NetFx471)' != '' And '$(NetFx471)' != 'false' And
                     ('$(NetFx471Settings)' == '' Or '$(NetFx471Settings)' != 'false') And
                     Exists('$(SQLiteNetDir)\Targets\SQLite.NET.Settings.targets.netFx471')" />

  <!--
  ******************************************************************************
  **                       [Fairly] Generic Properties                        **
  ******************************************************************************
  -->

  <PropertyGroup>
223
224
225
226
227
228
229









230
231
232
233
234
235
236
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250







+
+
+
+
+
+
+
+
+







              default, this is disabled.  This must be enabled to successfully
              build the project using Visual Studio 2017 and/or the .NET
              Framework 4.7 (if necessary, it will typically be enabled from
              within the project file itself).
    -->
    <NetFx47 Condition="'$(NetFx47)' == ''">false</NetFx47>

    <!--
        NOTE: Only use functionality available in the .NET Framework 4.7.1?  By
              default, this is disabled.  This must be enabled to successfully
              build the project using Visual Studio 2017 and/or the .NET
              Framework 4.7.1 (if necessary, it will typically be enabled from
              within the project file itself).
    -->
    <NetFx471 Condition="'$(NetFx471)' == ''">false</NetFx471>

    <!--
        NOTE: Load the version-specific settings for the .NET Framework 2.0?
              By default, this is disabled.  If this is enabled when compiling
              for the .NET Framework 2.0, the version-specific settings file
              "SQLite.NET.Settings.targets.netFx20" will be loaded if it is
              actually present, before any other settings in this file are
              processed.
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







+
+
+
+
+
+
+
+
+
+







              By default, this is disabled.  If this is enabled when compiling
              for the .NET Framework 4.7, the version-specific settings file
              "SQLite.NET.Settings.targets.netFx47" will be loaded if it is
              actually present, before any other settings in this file are
              processed.
    -->
    <NetFx47Settings Condition="'$(NetFx47Settings)' == ''">false</NetFx47Settings>

    <!--
        NOTE: Load the version-specific settings for the .NET Framework 4.7.1?
              By default, this is disabled.  If this is enabled when compiling
              for the .NET Framework 4.7.1, the version-specific settings file
              "SQLite.NET.Settings.targets.netFx471" will be loaded if it is
              actually present, before any other settings in this file are
              processed.
    -->
    <NetFx471Settings Condition="'$(NetFx471Settings)' == ''">false</NetFx471Settings>
  </PropertyGroup>

  <!--
  ******************************************************************************
  **                            Feature Properties                            **
  ******************************************************************************
  -->
539
540
541
542
543
544
545
546
547


548
549
550
551
552
553
554
555
556
557
558
559
560
561

562
563
564
565
566
567
568
563
564
565
566
567
568
569


570
571
572
573
574
575
576
577
578
579
580
581
582
583
584

585
586
587
588
589
590
591
592







-
-
+
+













-
+







              for the corresponding version(s) of Visual Studio.
    -->
    <InteropToTypeExtension Condition="'$(InteropToTypeExtension)' == ''">true</InteropToTypeExtension>

    <!--
        NOTE: Enable exposing the CryptoAPI based codec from the custom built
              interop DLL (i.e. "SQLite.Interop.dll")?  By default, this is
              disabled.  If this is enabled, support for databases encrypted
              using the CryptoAPI will be available.  If this is enabled, it
              enabled.  If this is disabled, support for databases encrypted
              using the CryptoAPI will be unavailable.  If this is enabled, it
              must also be enabled via the "SQLITE_HAS_CODEC=1" preprocessor
              define being present in the "SQLITE_EXTRA_DEFINES" macro in the
              build properties file:

                  "SQLite.Interop\props\sqlite3.[vs]props"

              AND via the "INTEROP_CODEC=1" preprocessor define being present in
              the "INTEROP_EXTRA_DEFINES" macro in the build properties file:

                  "SQLite.Interop\props\SQLite.Interop.20YY.[vs]props"

              both for the corresponding version(s) of Visual Studio.
    -->
    <InteropCodec Condition="'$(InteropCodec)' == ''">false</InteropCodec>
    <InteropCodec Condition="'$(InteropCodec)' == ''">true</InteropCodec>

    <!--
        NOTE: Enable including SEE with the custom built interop DLL (i.e.
              "SQLite.Interop.dll")?  By default, this is disabled.  If this is
              enabled, the "see.c" file will be included from the extensions
              directory.  If this is enabled, it must also be enabled via the
              "SQLITE_HAS_CODEC=1" preprocessor define being present in the
Changes to Targets/SQLite.NET.Settings.targets.netFx35.
36
37
38
39
40
41
42

43
44
45
46
47
48
36
37
38
39
40
41
42
43
44
45
46
47
48
49







+






    <NetFx45>false</NetFx45>
    <NetFx451>false</NetFx451>
    <NetFx452>false</NetFx452>
    <NetFx46>false</NetFx46>
    <NetFx461>false</NetFx461>
    <NetFx462>false</NetFx462>
    <NetFx47>false</NetFx47>
    <NetFx471>false</NetFx471>
    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
    <TargetFrameworkProfile></TargetFrameworkProfile>
    <Prefer32Bit>false</Prefer32Bit>
    <!-- <PlatformToolset>v110</PlatformToolset> -->
  </PropertyGroup>
</Project>
Changes to Targets/SQLite.NET.Settings.targets.netFx40.
38
39
40
41
42
43
44

45
46
47
48
49
38
39
40
41
42
43
44
45
46
47
48
49
50







+





    <NetFx45>false</NetFx45>
    <NetFx451>false</NetFx451>
    <NetFx452>false</NetFx452>
    <NetFx46>false</NetFx46>
    <NetFx461>false</NetFx461>
    <NetFx462>false</NetFx462>
    <NetFx47>false</NetFx47>
    <NetFx471>false</NetFx471>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    <Prefer32Bit>false</Prefer32Bit>
    <!-- <PlatformToolset>v100</PlatformToolset> -->
  </PropertyGroup>
</Project>
Changes to Tests/all.eagle.
24
25
26
27
28
29
30

31
32
33
34
35
36
37
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38







+







#
# NOTE: Pre-load the assembly and the necessary helper procedures now, so that
#       they do not count as being "leaked" (i.e. the test framework has no way
#       to know who procedures actually belong to).
#
package require System.Data.SQLite.Test
runSQLiteTestPrologue
runSQLiteTestFilesPrologue

###############################################################################

set no(prologue.eagle) true
set no(epilogue.eagle) true

#
65
66
67
68
69
70
71

72
73
66
67
68
69
70
71
72
73
74
75







+


unset no(epilogue.eagle)
unset no(prologue.eagle)

if {[array size no] == 0} then {unset no}

###############################################################################

runSQLiteTestFilesEpilogue
runSQLiteTestEpilogue
runTestEpilogue
Changes to Tests/basic.eagle.
29
30
31
32
33
34
35
36
37


38
39
40
41
42
43
44
29
30
31
32
33
34
35


36
37
38
39
40
41
42
43
44







-
-
+
+








  set code [catch {
    #
    # NOTE: For the sake of backward compatibility, the "-autoRun" argument
    #       must be first.
    #
    testClrExec $testExeFile [list -eventflags Wait -directory \
        [file dirname $testExeFile] -stdout output -success 0] -autoRun \
        -fileName [appendArgs \" [file nativename $fileName] \"]
        [file dirname $testExeFile] -stdout output -success Success] \
        -autoRun -fileName [appendArgs \" [file nativename $fileName] \"]
  } error]

  set successCount [regexp -all -- {\tSucceeded\t} $output]
  set failureCount [regexp -all -- {\tFailed\t} $output]
  set totalCount [expr {$successCount + $failureCount}]

  tputs $test_channel [appendArgs \
73
74
75
76
77
78
79
80

81
82
83
84
85
86
87
73
74
75
76
77
78
79

80
81
82
83
84
85
86
87







-
+








  object invoke Console OutputEncoding $encoding
} -body {
  set output ""

  set code [catch {
    testClrExec $testLinqExeFile [list -eventflags Wait -directory \
        [file dirname $testLinqExeFile] -stdout output -success 0]
        [file dirname $testLinqExeFile] -stdout output -success Success]
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  list $code [string equal $output [readFile $testLinqOutFile]] \
109
110
111
112
113
114
115
116

117
118
119
120
121
122
123
109
110
111
112
113
114
115

116
117
118
119
120
121
122
123







-
+








  object invoke Console OutputEncoding $encoding
} -body {
  set output ""

  set code [catch {
    testClrExec $testEf6ExeFile [list -eventflags Wait -directory \
        [file dirname $testEf6ExeFile] -stdout output -success 0]
        [file dirname $testEf6ExeFile] -stdout output -success Success]
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  list $code [string equal $output [readFile $testLinqOutFile]] \
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
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







-
+


-
+


-
+


-
+


-
+


-
+







  sql execute $db \
      "INSERT INTO t1 (x, y) VALUES(3, 'Wednesday, 16 December 2009 12:00:00');"

  sql execute $db "INSERT INTO t1 (x, y) VALUES(4, '12/16/2009');"
  sql execute $db "INSERT INTO t1 (x, y) VALUES(5, '12:00');"
  sql execute $db "INSERT INTO t1 (x, y) VALUES(6, '12/16/2009 12:00');"

  sql execute $db "INSERT INTO t1 (x, y) VALUES(7, ?);" \
  sql execute -datetimekind Utc $db "INSERT INTO t1 (x, y) VALUES(7, ?);" \
      [list param1 DateTime "Wednesday, 16 December 2009"]

  sql execute $db "INSERT INTO t1 (x, y) VALUES(8, ?);" \
  sql execute -datetimekind Utc $db "INSERT INTO t1 (x, y) VALUES(8, ?);" \
      [list param1 DateTime 12:00:00]

  sql execute $db "INSERT INTO t1 (x, y) VALUES(9, ?);" \
  sql execute -datetimekind Utc $db "INSERT INTO t1 (x, y) VALUES(9, ?);" \
      [list param1 DateTime "Wednesday, 16 December 2009 12:00:00"]

  sql execute $db "INSERT INTO t1 (x, y) VALUES(10, ?);" \
  sql execute -datetimekind Utc $db "INSERT INTO t1 (x, y) VALUES(10, ?);" \
      [list param1 DateTime 12/16/2009]

  sql execute $db "INSERT INTO t1 (x, y) VALUES(11, ?);" \
  sql execute -datetimekind Utc $db "INSERT INTO t1 (x, y) VALUES(11, ?);" \
      [list param1 DateTime 12:00]

  sql execute $db "INSERT INTO t1 (x, y) VALUES(12, ?);" \
  sql execute -datetimekind Utc $db "INSERT INTO t1 (x, y) VALUES(12, ?);" \
      [list param1 DateTime "12/16/2009 12:00"]

  sql execute -execute reader -datetimeformat [getDateTimeFormat] $db \
      "SELECT x, CAST(y AS TEXT) AS y2 FROM t1 ORDER BY x;"

  foreach name [lsort -integer [array names rows -regexp {^\d+$}]] {
    lappend result [list $name $rows($name)]
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
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







-
+


-
+


-
+


-
+


-
+


-
+







  sql execute $db \
      "INSERT INTO t1 (x, y) VALUES(3, 'Wednesday, 16 December 2009 12:00:00');"

  sql execute $db "INSERT INTO t1 (x, y) VALUES(4, '12/16/2009');"
  sql execute $db "INSERT INTO t1 (x, y) VALUES(5, '12:00');"
  sql execute $db "INSERT INTO t1 (x, y) VALUES(6, '12/16/2009 12:00');"

  sql execute $db "INSERT INTO t1 (x, y) VALUES(7, ?);" \
  sql execute -datetimekind Utc $db "INSERT INTO t1 (x, y) VALUES(7, ?);" \
      [list param1 DateTime "Wednesday, 16 December 2009"]

  sql execute $db "INSERT INTO t1 (x, y) VALUES(8, ?);" \
  sql execute -datetimekind Utc $db "INSERT INTO t1 (x, y) VALUES(8, ?);" \
      [list param1 DateTime 12:00:00]

  sql execute $db "INSERT INTO t1 (x, y) VALUES(9, ?);" \
  sql execute -datetimekind Utc $db "INSERT INTO t1 (x, y) VALUES(9, ?);" \
      [list param1 DateTime "Wednesday, 16 December 2009 12:00:00"]

  sql execute $db "INSERT INTO t1 (x, y) VALUES(10, ?);" \
  sql execute -datetimekind Utc $db "INSERT INTO t1 (x, y) VALUES(10, ?);" \
      [list param1 DateTime 12/16/2009]

  sql execute $db "INSERT INTO t1 (x, y) VALUES(11, ?);" \
  sql execute -datetimekind Utc $db "INSERT INTO t1 (x, y) VALUES(11, ?);" \
      [list param1 DateTime 12:00]

  sql execute $db "INSERT INTO t1 (x, y) VALUES(12, ?);" \
  sql execute -datetimekind Utc $db "INSERT INTO t1 (x, y) VALUES(12, ?);" \
      [list param1 DateTime "12/16/2009 12:00"]

  sql execute -execute reader -datetimeformat [getDateTimeFormat] $db \
      "SELECT x, CAST(y AS TEXT) AS y2 FROM t1 ORDER BY x;"

  foreach name [lsort -integer [array names rows -regexp {^\d+$}]] {
    lappend result [list $name $rows($name)]
1969
1970
1971
1972
1973
1974
1975
1976
1977


1978
1979
1980
1981
1982
1983
1984
1969
1970
1971
1972
1973
1974
1975


1976
1977
1978
1979
1980
1981
1982
1983
1984







-
-
+
+








  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -result {1 {file is encrypted or is not\
a database} 1 {file is encrypted or is not a database} 0 1 0 2}}
compile.DATA SQLite System.Data.SQLite} -result {1 {file is not a database} 1\
{file is not a database} 0 1 0 2}}

###############################################################################

runTest {test data-1.40 {encrypted database, wrong password} -setup {
  setupDb [set fileName data-1.40.db] "" "" "" "" "Password=12345;"
} -body {
  sql execute $db "CREATE TABLE t1(x);"
2010
2011
2012
2013
2014
2015
2016
2017
2018


2019
2020
2021
2022
2023
2024
2025
2010
2011
2012
2013
2014
2015
2016


2017
2018
2019
2020
2021
2022
2023
2024
2025







-
-
+
+








  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -result {1 {file is encrypted or is not\
a database} 1 {file is encrypted or is not a database} 0 1 0 2}}
compile.DATA SQLite System.Data.SQLite} -result {1 {file is not a database} 1\
{file is not a database} 0 1 0 2}}

###############################################################################

runTest {test data-1.41 {encrypted database, password w/start-space} -setup {
  setupDb [set fileName data-1.41.db] "" "" "" "" "Password= 1234;"
} -body {
  sql execute $db "CREATE TABLE t1(x);"
2087
2088
2089
2090
2091
2092
2093
2094
2095


2096
2097
2098
2099
2100
2101
2102
2087
2088
2089
2090
2091
2092
2093


2094
2095
2096
2097
2098
2099
2100
2101
2102







-
-
+
+








  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -result {1 {file is encrypted or is not\
a database} 1 {file is encrypted or is not a database} 0 1 0 2}}
compile.DATA SQLite System.Data.SQLite} -result {1 {file is not a database} 1\
{file is not a database} 0 1 0 2}}

###############################################################################

runTest {test data-1.43 {encrypted database, password w/mid-space} -setup {
  setupDb [set fileName data-1.43.db] "" "" "" "" "Password=12 45;"
} -body {
  sql execute $db "CREATE TABLE t1(x);"
2128
2129
2130
2131
2132
2133
2134
2135
2136


2137
2138
2139
2140
2141
2142
2143
2128
2129
2130
2131
2132
2133
2134


2135
2136
2137
2138
2139
2140
2141
2142
2143







-
-
+
+








  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -result {1 {file is encrypted or is not\
a database} 1 {file is encrypted or is not a database} 0 1 0 2}}
compile.DATA SQLite System.Data.SQLite} -result {1 {file is not a database} 1\
{file is not a database} 0 1 0 2}}

###############################################################################

runTest {test data-1.44 {encrypted database, password w/end-space} -setup {
  setupDb [set fileName data-1.44.db] "" "" "" "" "Password=1234 ;"
} -body {
  sql execute $db "CREATE TABLE t1(x);"
2205
2206
2207
2208
2209
2210
2211
2212
2213


2214
2215
2216
2217
2218
2219
2220
2205
2206
2207
2208
2209
2210
2211


2212
2213
2214
2215
2216
2217
2218
2219
2220







-
-
+
+








  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -result {1 {file is encrypted or is not\
a database} 1 {file is encrypted or is not a database} 0 1 0 2}}
compile.DATA SQLite System.Data.SQLite} -result {1 {file is not a database} 1\
{file is not a database} 0 1 0 2}}

###############################################################################

runTest {test data-1.46 {encrypted database, password via builder} -setup {
  setupDb [set fileName data-1.46.db] "" "" "" "" "Password=67 89;"
} -body {
  sql execute $db "CREATE TABLE t1(x);"
3186
3187
3188
3189
3190
3191
3192
3193

3194
3195
3196
3197
3198
3199
3200
3186
3187
3188
3189
3190
3191
3192

3193
3194
3195
3196
3197
3198
3199
3200







-
+








  set result [list]
  set output ""

  set code [catch {
    testClrExec $testLinqExeFile [list -eventflags Wait -directory \
        [file dirname $testLinqExeFile] -nocarriagereturns -stdout output \
        -success 0] -substring
        -success Success] -substring
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  lappend result $code
4146
4147
4148
4149
4150
4151
4152
4153

4154
4155

4156
4157
4158
4159
4160
4161
4162
4146
4147
4148
4149
4150
4151
4152

4153
4154

4155
4156
4157
4158
4159
4160
4161
4162







-
+

-
+







      $code(5) [extractSystemDataSQLiteExceptionMessage $result(5)] \
      $code(6) [extractSystemDataSQLiteExceptionMessage $result(6)] \
      $code(7) [extractSystemDataSQLiteExceptionMessage $result(7)] \
      $code(8) [extractSystemDataSQLiteExceptionMessage $result(8)] \
      $code(9) [extractSystemDataSQLiteExceptionMessage $result(9)] \
      $result(10)
} -cleanup {
  cleanupDb $fileName
  freeDbConnection

  freeDbConnection
  cleanupDb $fileName

  unset -nocomplain result code command connection db fileName
} -constraints {eagle command.object monoBug28 command.sql compile.DATA SQLite\
System.Data.SQLite} -match regexp -result {^0 \{\} 0 \{\} 0 \{\} 1 \{SQL logic\
error( or missing database)? -- no such table: t2\} 1 \{SQL logic error( or\
missing database)? -- near "BAD": syntax error\} 0 \{\} 1 \{SQL logic error( or\
missing database)? -- no such table: t2\} 1 \{SQL logic error( or missing\
4719
4720
4721
4722
4723
4724
4725
4726
4727


4728
4729
4730
4731
4732
4733
4734
4719
4720
4721
4722
4723
4724
4725


4726
4727
4728
4729
4730
4731
4732
4733
4734







-
-
+
+







  unset -nocomplain reader

  cleanupDb $fileName

  unset -nocomplain result db fileName
} -constraints {eagle command.object monoBug28 command.sql compile.DATA SQLite\
System.Data.SQLite SQLiteInterop} -match regexp -result {^\{\{SELECT \* FROM\
sqlite_stmt;\} 11 1 1 0 0 0 0 0 1 \d+ \{SELECT \* FROM t1;\} 1 1 1 0 0 0 9 0 1\
\d+\} \{\{SELECT \* FROM sqlite_stmt;\} 11 1 1 0 0 0 0 0 1 \d+\}$}}
sqlite_stmt;\} 11 1 1 0 0 0 0 0 1 \d+ \{SELECT \* FROM t1;\} 1 1 1 0 0 0\
(?:7|9) 0 1 \d+\} \{\{SELECT \* FROM sqlite_stmt;\} 11 1 1 0 0 0 0 0 1 \d+\}$}}

###############################################################################

runTest {test data-1.91 {Password error (no encryption support)} -body {
  list [catch {
    setupDb [set fileName data-1.91.db] "" "" "" "" "Password=1234;"
  } msg] [extractSystemDataSQLiteExceptionMessage $msg]
Changes to Tests/installer.eagle.
33
34
35
36
37
38
39
40

41
42
43
44
45


46
47
48
49
50
51
52
33
34
35
36
37
38
39

40
41
42
43


44
45
46
47
48
49
50
51
52







-
+



-
-
+
+








  cleanupFile $fileName
} -body {
  set output ""

  set code [catch {
    testClrExec $installerExeFile [list -eventflags Wait -stdout output \
        -success 0] -debugPriority Lowest -tracePriority MediumHigh \
        -success Success] -debugPriority Lowest -tracePriority MediumHigh \
        -noRuntimeVersion true -noCompact true -noNetFx35 true \
        -noNetFx40 true -noNetFx45 true -noNetFx451 true -noNetFx452 true \
        -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true \
        -noVs2008 true -noVs2010 true -noVs2012 true -noVs2013 true \
        -noVs2015 true -noVs2017 true \
        -noNetFx471 true -noVs2008 true -noVs2010 true -noVs2012 true \
        -noVs2013 true -noVs2015 true -noVs2017 true \
        -whatIf true -verbose true -confirm true -install true -debug true \
        -wow64 true -directory [file nativename [getBuildDirectory false]] \
        -logFileName [appendArgs \" [file nativename $fileName] \"] \
        -traceFormat [appendArgs \" "#{0}: {2}" \"]
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
76
77
78
79
80
81
82
83

84
85
86
87
88


89
90
91
92
93
94
95
76
77
78
79
80
81
82

83
84
85
86


87
88
89
90
91
92
93
94
95







-
+



-
-
+
+








  cleanupFile $fileName
} -body {
  set output ""

  set code [catch {
    testClrExec $installerExeFile [list -eventflags Wait -stdout output \
        -success 0] -debugPriority Lowest -tracePriority MediumHigh \
        -success Success] -debugPriority Lowest -tracePriority MediumHigh \
        -noRuntimeVersion true -noCompact true -noNetFx35 true \
        -noNetFx40 true -noNetFx45 true -noNetFx451 true -noNetFx452 true \
        -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true \
        -noVs2008 true -noVs2010 true -noVs2012 true -noVs2013 true \
        -noVs2015 true -noVs2017 true \
        -noNetFx471 true -noVs2008 true -noVs2010 true -noVs2012 true \
        -noVs2013 true -noVs2015 true -noVs2017 true \
        -whatIf true -verbose true -confirm true -install false -debug true \
        -wow64 true -directory [file nativename [getBuildDirectory false]] \
        -logFileName [appendArgs \" [file nativename $fileName] \"] \
        -traceFormat [appendArgs \" "#{0}: {2}" \"]
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
119
120
121
122
123
124
125
126

127
128
129
130
131



132
133
134
135
136
137
138
119
120
121
122
123
124
125

126
127
128



129
130
131
132
133
134
135
136
137
138







-
+


-
-
-
+
+
+








  cleanupFile $fileName
} -body {
  set output ""

  set code [catch {
    testClrExec $installerExeFile [list -eventflags Wait -stdout output \
        -success 0] -debugPriority Lowest -tracePriority MediumHigh \
        -success Success] -debugPriority Lowest -tracePriority MediumHigh \
        -noRuntimeVersion true -noCompact true -noNetFx40 true \
        -noNetFx45 true -noNetFx451 true -noNetFx452 true -noNetFx46 true \
        -noNetFx461 true -noNetFx462 true -noNetFx47 true -noVs2005 true \
        -noVs2010 true -noVs2012 true -noVs2013 true -noVs2015 true \
        -noVs2017 true -whatIf true \
        -noNetFx461 true -noNetFx462 true -noNetFx47 true -noNetFx471 true \
        -noVs2005 true -noVs2010 true -noVs2012 true -noVs2013 true \
        -noVs2015 true -noVs2017 true -whatIf true \
        -verbose true -confirm true -install true -debug true -wow64 true \
        -directory [file nativename [getBuildDirectory false]] \
        -logFileName [appendArgs \" [file nativename $fileName] \"] \
        -traceFormat [appendArgs \" "#{0}: {2}" \"]
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
162
163
164
165
166
167
168
169

170
171
172
173
174



175
176
177
178
179
180
181
162
163
164
165
166
167
168

169
170
171



172
173
174
175
176
177
178
179
180
181







-
+


-
-
-
+
+
+








  cleanupFile $fileName
} -body {
  set output ""

  set code [catch {
    testClrExec $installerExeFile [list -eventflags Wait -stdout output \
        -success 0] -debugPriority Lowest -tracePriority MediumHigh \
        -success Success] -debugPriority Lowest -tracePriority MediumHigh \
        -noRuntimeVersion true -noCompact true -noNetFx40 true \
        -noNetFx45 true -noNetFx451 true -noNetFx452 true -noNetFx46 true \
        -noNetFx461 true -noNetFx462 true -noNetFx47 true -noVs2005 true \
        -noVs2010 true -noVs2012 true -noVs2013 true -noVs2015 true \
        -noVs2017 true -whatIf true \
        -noNetFx461 true -noNetFx462 true -noNetFx47 true -noNetFx471 true \
        -noVs2005 true -noVs2010 true -noVs2012 true -noVs2013 true \
        -noVs2015 true -noVs2017 true -whatIf true \
        -verbose true -confirm true -install false -debug true -wow64 true \
        -directory [file nativename [getBuildDirectory false]] \
        -logFileName [appendArgs \" [file nativename $fileName] \"] \
        -traceFormat [appendArgs \" "#{0}: {2}" \"]
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
205
206
207
208
209
210
211
212

213
214
215
216
217


218
219
220
221
222
223
224
205
206
207
208
209
210
211

212
213
214
215


216
217
218
219
220
221
222
223
224







-
+



-
-
+
+








  cleanupFile $fileName
} -body {
  set output ""

  set code [catch {
    testClrExec $installerExeFile [list -eventflags Wait -stdout output \
        -success 0] -debugPriority Lowest -tracePriority MediumHigh \
        -success Success] -debugPriority Lowest -tracePriority MediumHigh \
        -noRuntimeVersion true -noCompact true -noNetFx20 true \
        -noNetFx35 true -noNetFx45 true -noNetFx451 true -noNetFx452 true \
        -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true \
        -noVs2005 true -noVs2008 true -noVs2012 true -noVs2013 true \
        -noVs2015 true -noVs2017 true \
        -noNetFx471 true -noVs2005 true -noVs2008 true -noVs2012 true \
        -noVs2013 true -noVs2015 true -noVs2017 true \
        -whatIf true -verbose true -confirm true -install true -debug true \
        -wow64 true -directory [file nativename [getBuildDirectory false]] \
        -logFileName [appendArgs \" [file nativename $fileName] \"] \
        -traceFormat [appendArgs \" "#{0}: {2}" \"]
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
249
250
251
252
253
254
255
256

257
258
259
260
261


262
263
264
265
266
267
268
249
250
251
252
253
254
255

256
257
258
259


260
261
262
263
264
265
266
267
268







-
+



-
-
+
+








  cleanupFile $fileName
} -body {
  set output ""

  set code [catch {
    testClrExec $installerExeFile [list -eventflags Wait -stdout output \
        -success 0] -debugPriority Lowest -tracePriority MediumHigh \
        -success Success] -debugPriority Lowest -tracePriority MediumHigh \
        -noRuntimeVersion true -noCompact true -noNetFx20 true \
        -noNetFx35 true -noNetFx45 true -noNetFx451 true -noNetFx452 true \
        -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true \
        -noVs2005 true -noVs2008 true -noVs2012 true -noVs2013 true \
        -noVs2015 true -noVs2017 true \
        -noNetFx471 true -noVs2005 true -noVs2008 true -noVs2012 true \
        -noVs2013 true -noVs2015 true -noVs2017 true \
        -whatIf true -verbose true -confirm true -install false -debug true \
        -wow64 true -directory [file nativename [getBuildDirectory false]] \
        -logFileName [appendArgs \" [file nativename $fileName] \"] \
        -traceFormat [appendArgs \" "#{0}: {2}" \"]
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
293
294
295
296
297
298
299
300

301
302
303
304
305


306
307
308
309
310
311
312
293
294
295
296
297
298
299

300
301
302
303


304
305
306
307
308
309
310
311
312







-
+



-
-
+
+








  cleanupFile $fileName
} -body {
  set output ""

  set code [catch {
    testClrExec $installerExeFile [list -eventflags Wait -stdout output \
        -success 0] -debugPriority Lowest -tracePriority MediumHigh \
        -success Success] -debugPriority Lowest -tracePriority MediumHigh \
        -noRuntimeVersion true -noCompact true -noNetFx20 true \
        -noNetFx35 true -noNetFx40 true -noNetFx451 true -noNetFx452 true \
        -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true \
        -noVs2005 true -noVs2008 true -noVs2010 true -noVs2013 true \
        -noVs2015 true -noVs2017 true \
        -noNetFx471 true -noVs2005 true -noVs2008 true -noVs2010 true \
        -noVs2013 true -noVs2015 true -noVs2017 true \
        -whatIf true -verbose true -confirm true -install true -debug true \
        -wow64 true -configVersion 4.0.30319 \
        -directory [file nativename [getBuildDirectory false]] \
        -logFileName [appendArgs \" [file nativename $fileName] \"] \
        -traceFormat [appendArgs \" "#{0}: {2}" \"]
  } error]

338
339
340
341
342
343
344
345

346
347
348
349
350


351
352
353
354
355
356
357
338
339
340
341
342
343
344

345
346
347
348


349
350
351
352
353
354
355
356
357







-
+



-
-
+
+








  cleanupFile $fileName
} -body {
  set output ""

  set code [catch {
    testClrExec $installerExeFile [list -eventflags Wait -stdout output \
        -success 0] -debugPriority Lowest -tracePriority MediumHigh \
        -success Success] -debugPriority Lowest -tracePriority MediumHigh \
        -noRuntimeVersion true -noCompact true -noNetFx20 true \
        -noNetFx35 true -noNetFx40 true -noNetFx451 true -noNetFx452 true \
        -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true \
        -noVs2005 true -noVs2008 true -noVs2010 true -noVs2013 true \
        -noVs2015 true -noVs2017 true \
        -noNetFx471 true -noVs2005 true -noVs2008 true -noVs2010 true \
        -noVs2013 true -noVs2015 true -noVs2017 true \
        -whatIf true -verbose true -confirm true -install false -debug true \
        -wow64 true -configVersion 4.0.30319 \
        -directory [file nativename [getBuildDirectory false]] \
        -logFileName [appendArgs \" [file nativename $fileName] \"] \
        -traceFormat [appendArgs \" "#{0}: {2}" \"]
  } error]

383
384
385
386
387
388
389
390

391
392
393
394
395


396
397
398
399
400
401
402
383
384
385
386
387
388
389

390
391
392
393


394
395
396
397
398
399
400
401
402







-
+



-
-
+
+








  cleanupFile $fileName
} -body {
  set output ""

  set code [catch {
    testClrExec $installerExeFile [list -eventflags Wait -stdout output \
        -success 0] -debugPriority Lowest -tracePriority MediumHigh \
        -success Success] -debugPriority Lowest -tracePriority MediumHigh \
        -noRuntimeVersion true -noCompact true -noNetFx20 true \
        -noNetFx35 true -noNetFx40 true -noNetFx45 true -noNetFx452 true \
        -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true \
        -noVs2005 true -noVs2008 true -noVs2010 true -noVs2012 true \
        -noVs2015 true -noVs2017 true \
        -noNetFx471 true -noVs2005 true -noVs2008 true -noVs2010 true \
        -noVs2012 true -noVs2015 true -noVs2017 true \
        -whatIf true -verbose true -confirm true -install true -debug true \
        -wow64 true -configVersion 4.0.30319 \
        -directory [file nativename [getBuildDirectory false]] \
        -logFileName [appendArgs \" [file nativename $fileName] \"] \
        -traceFormat [appendArgs \" "#{0}: {2}" \"]
  } error]

428
429
430
431
432
433
434
435

436
437
438
439
440


441
442
443
444
445
446
447
428
429
430
431
432
433
434

435
436
437
438


439
440
441
442
443
444
445
446
447







-
+



-
-
+
+








  cleanupFile $fileName
} -body {
  set output ""

  set code [catch {
    testClrExec $installerExeFile [list -eventflags Wait -stdout output \
        -success 0] -debugPriority Lowest -tracePriority MediumHigh \
        -success Success] -debugPriority Lowest -tracePriority MediumHigh \
        -noRuntimeVersion true -noCompact true -noNetFx20 true \
        -noNetFx35 true -noNetFx40 true -noNetFx45 true -noNetFx452 true \
        -noNetFx46 true -noNetFx461 true -noNetFx462 true -noNetFx47 true \
        -noVs2005 true -noVs2008 true -noVs2010 true -noVs2012 true \
        -noVs2015 true -noVs2017 true \
        -noNetFx471 true -noVs2005 true -noVs2008 true -noVs2010 true \
        -noVs2012 true -noVs2015 true -noVs2017 true \
        -whatIf true -verbose true -confirm true -install false -debug true \
        -wow64 true -configVersion 4.0.30319 \
        -directory [file nativename [getBuildDirectory false]] \
        -logFileName [appendArgs \" [file nativename $fileName] \"] \
        -traceFormat [appendArgs \" "#{0}: {2}" \"]
  } error]

473
474
475
476
477
478
479
480

481
482
483
484
485


486
487
488
489
490
491
492
473
474
475
476
477
478
479

480
481
482
483


484
485
486
487
488
489
490
491
492







-
+



-
-
+
+








  cleanupFile $fileName
} -body {
  set output ""

  set code [catch {
    testClrExec $installerExeFile [list -eventflags Wait -stdout output \
        -success 0] -debugPriority Lowest -tracePriority MediumHigh \
        -success Success] -debugPriority Lowest -tracePriority MediumHigh \
        -noRuntimeVersion true -noCompact true -noNetFx20 true \
        -noNetFx35 true -noNetFx40 true -noNetFx45 true -noNetFx451 true \
        -noNetFx452 true -noNetFx461 true -noNetFx462 true -noNetFx47 true \
        -noVs2005 true -noVs2008 true -noVs2010 true -noVs2012 true \
        -noVs2013 true -noVs2017 true \
        -noNetFx471 true -noVs2005 true -noVs2008 true -noVs2010 true \
        -noVs2012 true -noVs2013 true -noVs2017 true \
        -whatIf true -verbose true -confirm true -install true -debug true \
        -wow64 true -configVersion 4.0.30319 \
        -directory [file nativename [getBuildDirectory false]] \
        -logFileName [appendArgs \" [file nativename $fileName] \"] \
        -traceFormat [appendArgs \" "#{0}: {2}" \"]
  } error]

518
519
520
521
522
523
524
525

526
527
528
529
530


531
532
533
534
535
536
537
518
519
520
521
522
523
524

525
526
527
528


529
530
531
532
533
534
535
536
537







-
+



-
-
+
+








  cleanupFile $fileName
} -body {
  set output ""

  set code [catch {
    testClrExec $installerExeFile [list -eventflags Wait -stdout output \
        -success 0] -debugPriority Lowest -tracePriority MediumHigh \
        -success Success] -debugPriority Lowest -tracePriority MediumHigh \
        -noRuntimeVersion true -noCompact true -noNetFx20 true \
        -noNetFx35 true -noNetFx40 true -noNetFx45 true -noNetFx451 true \
        -noNetFx452 true -noNetFx461 true -noNetFx462 true -noNetFx47 true \
        -noVs2005 true -noVs2008 true -noVs2010 true -noVs2012 true \
        -noVs2013 true -noVs2017 true \
        -noNetFx471 true -noVs2005 true -noVs2008 true -noVs2010 true \
        -noVs2012 true -noVs2013 true -noVs2017 true \
        -whatIf true -verbose true -confirm true -install false -debug true \
        -wow64 true -configVersion 4.0.30319 \
        -directory [file nativename [getBuildDirectory false]] \
        -logFileName [appendArgs \" [file nativename $fileName] \"] \
        -traceFormat [appendArgs \" "#{0}: {2}" \"]
  } error]

Changes to Tests/linq.eagle.
26
27
28
29
30
31
32
33

34
35
36
37
38
39
40
26
27
28
29
30
31
32

33
34
35
36
37
38
39
40







-
+








  set result [list]
  set output ""

  set code [catch {
    testClrExec $testLinqExeFile [list -eventflags Wait -directory \
        [file dirname $testLinqExeFile] -nocarriagereturns -stdout output \
        -success 0] -update
        -success Success] -update
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  lappend result $code
59
60
61
62
63
64
65
66

67
68
69
70
71
72
73
59
60
61
62
63
64
65

66
67
68
69
70
71
72
73







-
+








  set result [list]
  set output ""

  set code [catch {
    testClrExec $testLinqExeFile [list -eventflags Wait -directory \
        [file dirname $testLinqExeFile] -nocarriagereturns -stdout output \
        -success 0] -round
        -success Success] -round
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  lappend result $code
Changes to Tests/session.eagle.
18
19
20
21
22
23
24
25





26
27
28
29
30
31
32
18
19
20
21
22
23
24

25
26
27
28
29
30
31
32
33
34
35
36







-
+
+
+
+
+







package require System.Data.SQLite.Test
runSQLiteTestPrologue

###############################################################################

#
# HACK: When running on Mono, always insert a "-parametertypes" option when
#       calling method overloads that require a Stream.
#       calling method overloads that require a Stream, due to their broken
#       (as of 5.0) implementation of the Type.IsAssignableFrom method.
#       Without this option, the Eagle core marshaller will select the wrong
#       method overload, which will cause all tests that use a stream-based
#       method overload to fail.
#
proc useStreamMaybeWithMono { args } {
  if {[isMono]} then {
    set args [linsert $args 1 -parametertypes [list System.IO.Stream]]
  }

  return [uplevel 1 $args]
Changes to Tests/tkt-00f86f9739.eagle.
28
29
30
31
32
33
34
35

36
37
38
39
40
41
42
28
29
30
31
32
33
34

35
36
37
38
39
40
41
42







-
+








  foreach value [list "" a b z 1+1 don notthere] {
    set output ""

    set code [catch {
      testClrExec $testLinqExeFile [list -eventflags Wait -directory \
          [file dirname $testLinqExeFile] -nocarriagereturns -stdout output \
          -success 0] -startsWith $value
          -success Success] -startsWith $value
    } error]

    tlog "---- BEGIN STDOUT OUTPUT\n"
    tlog $output
    tlog "\n---- END STDOUT OUTPUT\n"

    lappend result $code
68
69
70
71
72
73
74
75

76
77
78
79
80
81
82
68
69
70
71
72
73
74

75
76
77
78
79
80
81
82







-
+








  foreach value [list "" a b z 1+1 don notthere] {
    set output ""

    set code [catch {
      testClrExec $testEf6ExeFile [list -eventflags Wait -directory \
          [file dirname $testEf6ExeFile] -nocarriagereturns -stdout output \
          -success 0] -startsWith $value
          -success Success] -startsWith $value
    } error]

    tlog "---- BEGIN STDOUT OUTPUT\n"
    tlog $output
    tlog "\n---- END STDOUT OUTPUT\n"

    lappend result $code
Changes to Tests/tkt-0a32885109.eagle.
26
27
28
29
30
31
32
33

34
35
36
37
38
39
40
26
27
28
29
30
31
32

33
34
35
36
37
38
39
40







-
+








  set result [list]
  set output ""

  set code [catch {
    testClrExec $testLinqExeFile [list -eventflags Wait -directory \
        [file dirname $testLinqExeFile] -nocarriagereturns -stdout output \
        -success 0] -unionall
        -success Success] -unionall
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  lappend result $code
Added Tests/tkt-0e48e80333.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
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
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
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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
###############################################################################
#
# tkt-0e48e80333.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-0e48e80333-1.1 {unhook delegates on pooled close} -setup {
  moveEagleShellMdaConfig false
  saveMdaConfigEnvironment
} -body {
  set configFileName [writeEagleShellMdaConfig [string trim {
    <?xml version="1.0" encoding="UTF-8" ?>
    <mdaConfig xmlns="http://schemas.microsoft.com/CLR/2004/10/mda">
      <assistants>
        <callbackOnCollectedDelegate listSize="50" />
      </assistants>
    </mdaConfig>
  }]]

  set scriptFileName [file tempname]

  writeFile $scriptFileName [string trim {
    package require Eagle
    package require Eagle.Library
    package require Eagle.Test
    package require System.Data.SQLite.Test

    proc traceCallback { sender e } {
      lappend ::result [$e Statement]
      lappend ::result [$sender IsReadOnly null]
    }

    object load System.Data.SQLite
    set ::test_channel stdout

    setupDb [set fileName tkt-0e48e80333-1.1.db]
    sql execute $db {CREATE TABLE t1(x);}
    cleanupDb $fileName db true false false

    set ::result ""

    set count 10

    set sql [string trim { \
      INSERT INTO t1 (x) VALUES(1); \
    }]

    for {set i 0} {$i < $count} {incr i} {
      setupDb $fileName \
          "" "" "" "" "Pooling=True;" true false

      set connection [getDbConnection]
      $connection add_Trace traceCallback

      sql execute $db $sql

      freeDbConnection
      cleanupDb $fileName db true false false
    }

    if {$::result eq [lrepeat $count $sql False]} then {
      exit Success
    } else {
      exit Failure
    }
  }]

  set env(COMPLUS_MDA) 1; # enable MDA config file.

  set code [catch {
    execTestShell [list \
        -eventflags Wait -success Success -stdout output] \
        -preInitialize [appendArgs \" "set no(logFileName) 1" \"] \
        -file [appendArgs \" $scriptFileName \"] \
        -logFile [appendArgs \" [getTestLog] \"]
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  set code
} -cleanup {
  cleanupDb tkt-0e48e80333-1.1.db

  catch {file delete $scriptFileName}
  catch {file delete $configFileName}

  unset -nocomplain code output error scriptFileName configFileName

  restoreMdaConfigEnvironment
  moveEagleShellMdaConfig true
} -constraints {eagle dotNet testExec command.object monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -result {0}}

###############################################################################

runTest {test tkt-0e48e80333-1.2 {delegate MDA on pooled close} -setup {
  moveEagleShellMdaConfig false
  saveEnvironmentVariables [list checkForVendorQuiet]
  saveMdaConfigEnvironment

  setupDb [set fileName tkt-0e48e80333-1.2.db]
} -body {
  set configFileName [writeEagleShellMdaConfig [string trim {
    <?xml version="1.0" encoding="UTF-8" ?>
    <mdaConfig xmlns="http://schemas.microsoft.com/CLR/2004/10/mda">
      <assistants>
        <callbackOnCollectedDelegate listSize="50" />
      </assistants>
    </mdaConfig>
  }]]

  set scriptFileName [file tempname]

  writeFile $scriptFileName [string trim {
    package require Eagle
    package require Eagle.Library
    package require Eagle.Test
    package require System.Data.SQLite.Test

    set ::test_channel ""; # disable [tputs]

    set id [object invoke Interpreter.GetActive NextId]
    set dataSource [file join [getDatabaseDirectory] $fileName]

    set count(1) 1000; # thread work-item count
    set count(2) 1000; # per-thread query count
    set count(3) [expr {$count(1) * $count(2)}]; # total query count
    set count(4) [expr {0.00002 * $count(3)}]; # timeout in seconds
    set count(5) 10; # busy loop sleep milliseconds

    set sql { \
      SELECT 1; \
    }

    unset -nocomplain results errors

    set code [compileCSharpWith [subst {
      using System;
      using System.Data;
      using System.Data.SQLite;
      using System.Threading;

      namespace _Dynamic${id}
      {
        public static class Test${id}
        {
          #region Private Static Data
          private static long count;

          /////////////////////////////////////////////////////////////////////

          private static SQLiteTraceEventHandler handler;
          #endregion

          /////////////////////////////////////////////////////////////////////

          #region Public Static Methods
          public static void TraceEventHandler(
            object sender,
            TraceEventArgs e
            )
          {
            /* IGNORED */
            Interlocked.Increment(ref count);
          }

          /////////////////////////////////////////////////////////////////////

          public static SQLiteConnection MakeConnection()
          {
            SQLiteConnection connection = new SQLiteConnection(
                "Data Source=${dataSource};Journal Mode=Wal;Pooling=true;" +
                "[getFlagsProperty AllowNestedTransactions]");

            connection.Open();
            connection.Trace += handler;

            return connection;
          }

          /////////////////////////////////////////////////////////////////////

          public static long ThreadedPoolTraceTest()
          {
            for (int index1 = 0; index1 < ${count(1)}; index1++)
            {
              ThreadPool.QueueUserWorkItem(delegate(object state) {
                using (SQLiteConnection connection = MakeConnection())
                {
                  for (int index2 = 0; index2 < ${count(2)}; index2++)
                  {
                    using (SQLiteTransaction transaction =
                        connection.BeginTransaction())
                    {
                      using (SQLiteCommand command =
                          connection.CreateCommand())
                      {
                        command.CommandText = "[subst ${sql}]";
                        command.ExecuteNonQuery();
                      }
                    }
                  }
                }
              });

              GC.Collect();
            }

            DateTime start = DateTime.UtcNow;

            while (true)
            {
              if (Interlocked.CompareExchange(ref count, 0, 0) >= ${count(3)})
                  break;

              if (DateTime.UtcNow.Subtract(start).TotalSeconds >= ${count(4)})
                  break;

              Thread.Sleep(${count(5)});
            }

            return Interlocked.CompareExchange(ref count, 0, 0);
          }

          /////////////////////////////////////////////////////////////////////

          public static void Main()
          {
            handler = new SQLiteTraceEventHandler(TraceEventHandler);
          }
          #endregion
        }
      }
    }] true true true results errors System.Data.SQLite.dll]

    puts stdout [list $code $results \
        [expr {[info exists errors] ? $errors : ""}] \
        [expr {$code eq "Ok" ? [catch {
          object invoke _Dynamic${id}.Test${id} Main
        } result] : [set result ""]}] $result \
        [expr {$code eq "Ok" ? [catch {
          object invoke _Dynamic${id}.Test${id} ThreadedPoolTraceTest
        } result] : [set result ""]}] $result]
  }]

  set env(checkForVendorQuiet) 1
  set env(COMPLUS_MDA) 1; # enable MDA config file.

  set code [catch {
    execTestShell [list \
        -eventflags Wait -success Success -stdout output] \
        -preInitialize [appendArgs \" "set fileName {" $fileName }\"] \
        -preInitialize [appendArgs \" "set no(logFileName) 1" \"] \
        -file [appendArgs \" $scriptFileName \"] \
        -logFile [appendArgs \" [getTestLog] \"]
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  set error [string trim $error]

  if {![regexp -- {0 (\d+)$} $error dummy count]} then {
    set count <unknown>
  }

  tputs $test_channel [appendArgs \
      "---- executed a total of " $count " queries\n"]

  list $code $error
} -cleanup {
  cleanupDb $fileName

  catch {file delete $scriptFileName}
  catch {file delete $configFileName}

  unset -nocomplain dummy count
  unset -nocomplain code output error scriptFileName configFileName
  unset -nocomplain db fileName

  restoreMdaConfigEnvironment
  restoreEnvironmentVariables [list checkForVendorQuiet]
  moveEagleShellMdaConfig true
} -constraints {eagle command.object monoBug28 command.sql compile.DATA SQLite\
System.Data.SQLite compileCSharp} -match regexp -result {^0 \{Ok\
System#CodeDom#Compiler#CompilerResults#\d+ \{\} 0 \{\} 0 \d+\}$}}

###############################################################################

runSQLiteTestEpilogue
runTestEpilogue
Changes to Tests/tkt-1c456ae75f.eagle.
52
53
54
55
56
57
58
59
60


61
62
63
64
65
66
67
52
53
54
55
56
57
58


59
60
61
62
63
64
65
66
67







-
-
+
+








  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -result {1 {file is encrypted or is not\
a database} 1 {file is encrypted or is not a database} 0 1 0 2}}
compile.DATA SQLite System.Data.SQLite} -result {1 {file is not a database} 1\
{file is not a database} 0 1 0 2}}

###############################################################################

runTest {test tkt-1c456ae75f-1.2 {database, hex password} -setup {
  setupDb [set fileName tkt-1c456ae75f-1.2.db] "" "" "" "" \
      "HexPassword=3132333435;"
} -body {
131
132
133
134
135
136
137
138
139


140
141
142
143
144
145
146
131
132
133
134
135
136
137


138
139
140
141
142
143
144
145
146







-
-
+
+








  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -result {1 {file is encrypted or is not\
a database} 1 {file is encrypted or is not a database} 0 1 0 2}}
compile.DATA SQLite System.Data.SQLite} -result {1 {file is not a database} 1\
{file is not a database} 0 1 0 2}}

###############################################################################

runTest {test tkt-1c456ae75f-1.4 {database, hex password via builder} -setup {
  setupDb [set fileName tkt-1c456ae75f-1.4.db] "" "" "" "" \
      "HexPassword=3132333435;"
} -body {
Changes to Tests/tkt-41aea496e0.eagle.
26
27
28
29
30
31
32
33

34
35
36
37
38
39
40
26
27
28
29
30
31
32

33
34
35
36
37
38
39
40







-
+








  set result [list]
  set output ""

  set code [catch {
    testClrExec $testLinqExeFile [list -eventflags Wait -directory \
        [file dirname $testLinqExeFile] -nocarriagereturns -stdout output \
        -success 0] -complexprimarykey
        -success Success] -complexprimarykey
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  lappend result $code
Changes to Tests/tkt-59edc1018b.eagle.
28
29
30
31
32
33
34
35

36
37
38
39
40
41
42
28
29
30
31
32
33
34

35
36
37
38
39
40
41
42







-
+








  foreach value [list "" a b z 1+1 don notthere] {
    set output ""

    set code [catch {
      testClrExec $testLinqExeFile [list -eventflags Wait -directory \
          [file dirname $testLinqExeFile] -nocarriagereturns -stdout output \
          -success 0] -endsWith $value
          -success Success] -endsWith $value
    } error]

    tlog "---- BEGIN STDOUT OUTPUT\n"
    tlog $output
    tlog "\n---- END STDOUT OUTPUT\n"

    lappend result $code
67
68
69
70
71
72
73
74

75
76
77
78
79
80
81
67
68
69
70
71
72
73

74
75
76
77
78
79
80
81







-
+








  foreach value [list "" a b z 1+1 don notthere] {
    set output ""

    set code [catch {
      testClrExec $testEf6ExeFile [list -eventflags Wait -directory \
          [file dirname $testEf6ExeFile] -nocarriagereturns -stdout output \
          -success 0] -endsWith $value
          -success Success] -endsWith $value
    } error]

    tlog "---- BEGIN STDOUT OUTPUT\n"
    tlog $output
    tlog "\n---- END STDOUT OUTPUT\n"

    lappend result $code
Changes to Tests/tkt-8b7d179c3c.eagle.
28
29
30
31
32
33
34
35

36
37
38
39
40
41
42
28
29
30
31
32
33
34

35
36
37
38
39
40
41
42







-
+








  for {set pageSize 0} {$pageSize <= 2} {incr pageSize} {
    set output ""

    set code [catch {
      testClrExec $testLinqExeFile [list -eventflags Wait -directory \
          [file dirname $testLinqExeFile] -nocarriagereturns -stdout output \
          -success 0] -skip $pageSize
          -success Success] -skip $pageSize
    } error]

    tlog "---- BEGIN STDOUT OUTPUT\n"
    tlog $output
    tlog "\n---- END STDOUT OUTPUT\n"

    lappend result $code
78
79
80
81
82
83
84
85

86
87
88
89
90
91
92
78
79
80
81
82
83
84

85
86
87
88
89
90
91
92







-
+








  for {set pageSize 0} {$pageSize <= 2} {incr pageSize} {
    set output ""

    set code [catch {
      testClrExec $testEf6ExeFile [list -eventflags Wait -directory \
          [file dirname $testEf6ExeFile] -nocarriagereturns -stdout output \
          -success 0] -skip $pageSize
          -success Success] -skip $pageSize
    } error]

    tlog "---- BEGIN STDOUT OUTPUT\n"
    tlog $output
    tlog "\n---- END STDOUT OUTPUT\n"

    lappend result $code
Changes to Tests/tkt-8d928c3e88.eagle.
26
27
28
29
30
31
32
33

34
35
36
37
38
39
40
26
27
28
29
30
31
32

33
34
35
36
37
38
39
40







-
+








  set result [list]
  set output ""

  set code [catch {
    testClrExec $testLinqExeFile [list -eventflags Wait -directory \
        [file dirname $testLinqExeFile] -nocarriagereturns -stdout output \
        -success 0] -binaryguid false
        -success Success] -binaryguid false
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  lappend result $code
59
60
61
62
63
64
65
66

67
68
69
70
71
72
73
59
60
61
62
63
64
65

66
67
68
69
70
71
72
73







-
+








  set result [list]
  set output ""

  set code [catch {
    testClrExec $testLinqExeFile [list -eventflags Wait -directory \
        [file dirname $testLinqExeFile] -nocarriagereturns -stdout output \
        -success 0] -binaryguid true
        -success Success] -binaryguid true
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  lappend result $code
92
93
94
95
96
97
98
99

100
101
102
103
104
105
106
92
93
94
95
96
97
98

99
100
101
102
103
104
105
106







-
+








  set result [list]
  set output ""

  set code [catch {
    testClrExec $testLinqExeFile [list -eventflags Wait -directory \
        [file dirname $testLinqExeFile] -nocarriagereturns -stdout output \
        -success 0] -datetime2 Ticks
        -success Success] -datetime2 Ticks
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  lappend result $code
126
127
128
129
130
131
132
133

134
135
136
137
138
139
140
126
127
128
129
130
131
132

133
134
135
136
137
138
139
140







-
+








  set result [list]
  set output ""

  set code [catch {
    testClrExec $testLinqExeFile [list -eventflags Wait -directory \
        [file dirname $testLinqExeFile] -nocarriagereturns -stdout output \
        -success 0] -datetime2 JulianDay
        -success Success] -datetime2 JulianDay
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  lappend result $code
159
160
161
162
163
164
165
166

167
168
169
170
171
172
173
159
160
161
162
163
164
165

166
167
168
169
170
171
172
173







-
+








  set result [list]
  set output ""

  set code [catch {
    testClrExec $testLinqExeFile [list -eventflags Wait -directory \
        [file dirname $testLinqExeFile] -nocarriagereturns -stdout output \
        -success 0] -datetime2 UnixEpoch
        -success Success] -datetime2 UnixEpoch
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  lappend result $code
192
193
194
195
196
197
198
199

200
201
202
203
204
205
206
192
193
194
195
196
197
198

199
200
201
202
203
204
205
206







-
+








  set result [list]
  set output ""

  set code [catch {
    testClrExec $testLinqExeFile [list -eventflags Wait -directory \
        [file dirname $testLinqExeFile] -nocarriagereturns -stdout output \
        -success 0] -datetime2 ISO8601
        -success Success] -datetime2 ISO8601
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  lappend result $code
Changes to Tests/tkt-9d353b0bd8.eagle.
26
27
28
29
30
31
32
33

34
35
36
37
38
39
40
26
27
28
29
30
31
32

33
34
35
36
37
38
39
40







-
+








  set result [list]
  set output ""

  set code [catch {
    testClrExec $testLinqExeFile [list -eventflags Wait -directory \
        [file dirname $testLinqExeFile] -nocarriagereturns -stdout output \
        -success 0] -insert
        -success Success] -insert
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  lappend result $code
Changes to Tests/tkt-a4d9c7ee94.eagle.
26
27
28
29
30
31
32
33

34
35
36
37
38
39
40
26
27
28
29
30
31
32

33
34
35
36
37
38
39
40







-
+








  set result [list]
  set output ""

  set code [catch {
    testClrExec $testLinqExeFile [list -eventflags Wait -directory \
        [file dirname $testLinqExeFile] -nocarriagereturns -stdout output \
        -success 0] -binaryguid2 false
        -success Success] -binaryguid2 false
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  lappend result $code
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
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







-
+
+

















-
+







-constraintExpression {[haveConstraint buildFramework.netFx40] || \
[haveConstraint buildFramework.netFx45] || \
[haveConstraint buildFramework.netFx451] || \
[haveConstraint buildFramework.netFx452] || \
[haveConstraint buildFramework.netFx46] || \
[haveConstraint buildFramework.netFx461] || \
[haveConstraint buildFramework.netFx462] || \
[haveConstraint buildFramework.netFx47]} \
[haveConstraint buildFramework.netFx47] || \
[haveConstraint buildFramework.netFx471]} \
-result {0 {1581 1730 1833 2116 2139 2184 2903 3049 3801 6897 7960 8837 10019\
10038 11747 14450 19428 19713 20852 27403 27511 29202 30346 31406 32859 33607\
40222 44122 45839 48075 48084 48304 53404 55113 55439 60179 60601 72716 75234\
78759 80202 80909 85014 85251 90405 94025 94105 95008 95054 95060 98004 98052\
98104}}}

###############################################################################

runTest {test tkt-a4d9c7ee94-1.2 {LINQ w/BinaryGUID=true} -body {
  copySampleDatabaseFiles

  set result [list]
  set output ""

  set code [catch {
    testClrExec $testLinqExeFile [list -eventflags Wait -directory \
        [file dirname $testLinqExeFile] -nocarriagereturns -stdout output \
        -success 0] -binaryguid2 true
        -success Success] -binaryguid2 true
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  lappend result $code
98
99
100
101
102
103
104
105


106
107
108
109
110
111
112
113
114
115
116
99
100
101
102
103
104
105

106
107
108
109
110
111
112
113
114
115
116
117
118







-
+
+











-constraintExpression {[haveConstraint buildFramework.netFx40] || \
[haveConstraint buildFramework.netFx45] || \
[haveConstraint buildFramework.netFx451] || \
[haveConstraint buildFramework.netFx452] || \
[haveConstraint buildFramework.netFx46] || \
[haveConstraint buildFramework.netFx461] || \
[haveConstraint buildFramework.netFx462] || \
[haveConstraint buildFramework.netFx47]} \
[haveConstraint buildFramework.netFx47] || \
[haveConstraint buildFramework.netFx471]} \
-result {0 {1581 1730 1833 2116 2139 2184 2903 3049 3801 6897 7960 8837 10019\
10038 11747 14450 19428 19713 20852 27403 27511 29202 30346 31406 32859 33607\
40222 44122 45839 48075 48084 48304 53404 55113 55439 60179 60601 72716 75234\
78759 80202 80909 85014 85251 90405 94025 94105 95008 95054 95060 98004 98052\
98104}}}

###############################################################################

runSQLiteTestFilesEpilogue
runSQLiteTestEpilogue
runTestEpilogue
Changes to Tests/tkt-ccfa69fc32.eagle.
28
29
30
31
32
33
34
35

36
37
38
39
40
41
42
28
29
30
31
32
33
34

35
36
37
38
39
40
41
42







-
+








  foreach add [list false true false] {
    set output ""

    set code [catch {
      testClrExec $testLinqExeFile [list -eventflags Wait -directory \
          [file dirname $testLinqExeFile] -nocarriagereturns -stdout output \
          -success 0] -efTransaction $add
          -success Success] -efTransaction $add
    } error]

    tlog "---- BEGIN STDOUT OUTPUT\n"
    tlog $output
    tlog "\n---- END STDOUT OUTPUT\n"

    lappend result $code
68
69
70
71
72
73
74
75

76
77
78
79
80
81
82
68
69
70
71
72
73
74

75
76
77
78
79
80
81
82







-
+








  foreach add [list false true false] {
    set output ""

    set code [catch {
      testClrExec $testEf6ExeFile [list -eventflags Wait -directory \
          [file dirname $testEf6ExeFile] -nocarriagereturns -stdout output \
          -success 0] -efTransaction $add
          -success Success] -efTransaction $add
    } error]

    tlog "---- BEGIN STDOUT OUTPUT\n"
    tlog $output
    tlog "\n---- END STDOUT OUTPUT\n"

    lappend result $code
Changes to Tests/tkt-d4728aecb7.eagle.
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
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







-
+
-
-
-











-
+







    [getAppDomainPreamble] -body {
  package require Eagle.Library
  package require Eagle.Test
  package require System.Data.SQLite.Test

  moveSystemDataSQLiteDllConfig false

  set fileName [file join \
  set fileName [writeSystemDataSQLiteDllConfig [string trim {
      [getBinaryDirectory] System.Data.SQLite.dll.config]

  writeFile $fileName [string trim {
    <?xml version="1.0"?>
    <configuration>
      <appSettings>
        <add key="d472_1"
             value="prfx1/%PreLoadSQLite_AssemblyDirectory%/sufx1" />
        <add key="d472_2"
             value="prfx2/%PreLoadSQLite_TargetFramework%/sufx2" />
        <add key="d472_3"
             value="prfx3/%PreLoadSQLite_XmlConfigDirectory%/sufx3" />
      </appSettings>
    </configuration>
  }]
  }]]

  object load -loadtype Bytes [base64 encode [readFile [file join \
      [getBinaryDirectory] System.Data.SQLite.dll]]]

  set result [list]

  lappend result [string map [list \\ /] [object invoke -flags +NonPublic \
Changes to Tests/tkt-da9f18d039.eagle.
26
27
28
29
30
31
32
33

34
35
36
37
38
39
40
26
27
28
29
30
31
32

33
34
35
36
37
38
39
40







-
+








  set result [list]
  set output ""

  set code [catch {
    testClrExec $testLinqExeFile [list -eventflags Wait -directory \
        [file dirname $testLinqExeFile] -nocarriagereturns -stdout output \
        -success 0] -datetime
        -success Success] -datetime
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  lappend result $code
63
64
65
66
67
68
69
70

71
72
73
74
75
76
77
63
64
65
66
67
68
69

70
71
72
73
74
75
76
77







-
+








  set result [list]
  set output ""

  set code [catch {
    testClrExec $testEf6ExeFile [list -eventflags Wait -directory \
        [file dirname $testEf6ExeFile] -nocarriagereturns -stdout output \
        -success 0] -datetime
        -success Success] -datetime
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  lappend result $code
Changes to Tests/types.eagle.
175
176
177
178
179
180
181



182
183
184
185
186
187
188
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191







+
+
+







        System.Data.SQLite.SQLiteBlob System.Data.SQLite.SQLiteBlob}]

###############################################################################

set savedDateTimeFormat [object invoke Interpreter.GetActive DateTimeFormat]
if {![isObjectHandle $savedDateTimeFormat]} then {set savedDateTimeFormat null}
object invoke Interpreter.GetActive DateTimeFormat [getDateTimeFormat]

set savedDateTimeKind [object invoke Interpreter.GetActive DateTimeKind]
object invoke Interpreter.GetActive DateTimeKind Utc

###############################################################################

for {set i 0} {$i < [llength $params]} {incr i} {
  foreach {
    typeName methodName isArray propertyName isRequired value
  } [lindex $params $i] break
342
343
344
345
346
347
348



349
350
351
352
353
354
355
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361







+
+
+







  rename readValueCallback2 ""
}

###############################################################################

object invoke Interpreter.GetActive DateTimeFormat $savedDateTimeFormat
unset -nocomplain savedDateTimeFormat

object invoke Interpreter.GetActive DateTimeKind $savedDateTimeKind
unset -nocomplain savedDateTimeKind

###############################################################################

unset -nocomplain i readArgs params typeName methodName isArray propertyName \
    isRequired expectedResults expectedResult

###############################################################################
Changes to Tests/version.eagle.
27
28
29
30
31
32
33
34

35
36
37
38
39
40
41
27
28
29
30
31
32
33

34
35
36
37
38
39
40
41







-
+







# NOTE: For these unit tests to be useful and accurate, the following version
#       numbers must be manually kept synchronized with the version numbers for
#       the source code files, the built binaries, and the release packages.
#       The revision number is reserved for NuGet package versioning.
#
set version(major)             1
set version(minor)             0
set version(build)           106; # NOTE: Incremented with each release.
set version(build)           107; # NOTE: Incremented with each release.
set version(revision)          0

###############################################################################

#
# NOTE: What is the full version of the EntityFramework NuGet package (which
#       is not [necessarily] the same version as the assembly itself) in use
Changes to lib/System.Data.SQLite/common.eagle.
237
238
239
240
241
242
243
244

245
246
247
248
249
250
251
237
238
239
240
241
242
243

244
245
246
247
248
249
250
251







-
+







            2013 {
              return netFx451; # TODO: Or "netFx452"?
            }
            2015 {
              return netFx46; # TODO: Or "netFx461" / "netFx462"?
            }
            2017 {
              return netFx47
              return netFx47; # TODO: Or "netFx471"?
            }
            default {
              return netFx35; # TODO: Good "fallback" default?
            }
          }
        }
      }
1196
1197
1198
1199
1200
1201
1202









































































































1203
1204
1205
1206
1207
1208
1209
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
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
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
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







            tputs $::test_channel [appendArgs \
                "---- skipped moving \"" $fileName(1) \
                "\", it does not exist\n"]
          }
        }
      }
    }

    proc writeSystemDataSQLiteDllConfig { data {verbose true} } {
      set directory [getBinaryDirectory]

      if {[string length $directory] == 0} then {
        if {$verbose} then {
          tputs $::test_channel [appendArgs \
              "---- skipped moving \"System.Data.SQLite.dll.config\", " \
              "no binary directory\n"]
        }

        return
      }

      set fileName [file normalize \
          [file join $directory System.Data.SQLite.dll.config]]

      writeFile $fileName $data

      if {$verbose} then {
        tputs $::test_channel \
            "---- wrote \"System.Data.SQLite.dll.config\"\n"
      }

      return $fileName
    }

    proc moveEagleShellMdaConfig { {restore false} {verbose true} } {
      set directory [getBinaryDirectory]

      if {[string length $directory] == 0} then {
        if {$verbose} then {
          tputs $::test_channel [appendArgs \
              "---- skipped moving \"EagleShell.exe.mda.config\", " \
              "no binary directory\n"]
        }

        return
      }

      set fileName(1) [file normalize \
          [file join $directory EagleShell.exe.mda.config]]

      set fileName(2) [appendArgs $fileName(1) .moved]

      if {$restore} then {
        if {[file exists $fileName(2)]} then {
          file rename $fileName(2) $fileName(1)

          if {$verbose} then {
            tputs $::test_channel [appendArgs \
                "---- moved \"" $fileName(2) "\" to \"" \
                $fileName(1) \"\n]
          }
        } else {
          if {$verbose} then {
            tputs $::test_channel [appendArgs \
                "---- skipped moving \"" $fileName(2) \
                "\", it does not exist\n"]
          }
        }
      } else {
        if {[file exists $fileName(1)]} then {
          file rename $fileName(1) $fileName(2)

          if {$verbose} then {
            tputs $::test_channel [appendArgs \
                "---- moved \"" $fileName(1) "\" to \"" \
                $fileName(2) \"\n]
          }
        } else {
          if {$verbose} then {
            tputs $::test_channel [appendArgs \
                "---- skipped moving \"" $fileName(1) \
                "\", it does not exist\n"]
          }
        }
      }
    }

    proc writeEagleShellMdaConfig { data {verbose true} } {
      set directory [getBinaryDirectory]

      if {[string length $directory] == 0} then {
        if {$verbose} then {
          tputs $::test_channel [appendArgs \
              "---- skipped moving \"EagleShell.exe.mda.config\", " \
              "no binary directory\n"]
        }

        return
      }

      set fileName [file normalize \
          [file join $directory EagleShell.exe.mda.config]]

      writeFile $fileName $data

      if {$verbose} then {
        tputs $::test_channel \
            "---- wrote \"EagleShell.exe.mda.config\"\n"
      }

      return $fileName
    }

    proc getAppDomainPreamble { {prefix ""} {suffix ""} } {
      #
      # NOTE: This procedure returns a test setup script fragment suitable for
      #       evaluation by an interpreter created in an isolated application
      #       domain.  The script fragment being returned will be surrounded by
      #       the prefix and suffix "script fragments" specified by our caller,
2829
2830
2831
2832
2833
2834
2835
2836


2837


2838
2839
2840
2841
2842
2843

2844















































2845
2846
2847

2848
2849
2850
2851
2852
2853


2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872

2873
2874
2875
2876
2877
2878
2879
2934
2935
2936
2937
2938
2939
2940

2941
2942
2943
2944
2945
2946
2947
2948
2949
2950

2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001

3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015


3016
3017
3018
3019





3020
3021

3022
3023
3024
3025
3026
3027
3028
3029







-
+
+

+
+





-
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+


-
+






+
+





-
-




-
-
-
-
-


-
+







      #       database files are stored in the temporary directory.
      #
      if {!$isMemory && $qualify} then {
        set fileName [file join [getDatabaseDirectory] [file tail $fileName]]
      }

      #
      # NOTE: Check if the file still exists.
      # NOTE: Check if the file still exists; initially, assume all files will
      #       be deleted successfully, if necessary.
      #
      set success true

      if {!$isMemory && $delete && [file exists $fileName]} then {
        #
        # NOTE: Skip deleting database files if somebody sets the global
        #       variable to prevent it.
        #
        if {![info exists ::no(cleanupDbFile)]} then {
        if {![info exists ::no(cleanupDbFiles)]} then {
          #
          # NOTE: Attempt to delete the test WAL file, if any, now.
          #
          set walFileName [appendArgs $fileName -wal]

          if {[file exists $walFileName]} then {
            #
            # NOTE: If there is a WAL file, it should be zero bytes at this
            #       point.
            #
            if {[set size [file size $walFileName]] == 0} then {
              #
              # NOTE: We somehow failed to delete the WAL file, report why.
              #
              if {[catch {file delete $walFileName} error]} then {
                tputs $::test_channel [appendArgs \
                    "==== WARNING: failed to delete WAL file \"" $walFileName \
                    "\" during cleanup, error: " \n\t $error \n]

                set success false
              }
            } else {
              tputs $::test_channel [appendArgs \
                  "==== WARNING: WAL file \"" $walFileName "\" is " $size \
                  " bytes in size, skipping all file deletions...\n"]

              return 1; # error
            }
          }

          #
          # NOTE: Attempt to delete the test SHM file, if any, now.
          #
          set shmFileName [appendArgs $fileName -shm]

          if {[file exists $shmFileName] && \
              [catch {file delete $shmFileName} error]} then {
            #
            # NOTE: We somehow failed to delete the SHM file, report why.
            #
            tputs $::test_channel [appendArgs \
                "==== WARNING: failed to delete SHM file \"" $shmFileName \
                "\" during cleanup, error: " \n\t $error \n]

            set success false
          }

          #
          # NOTE: Attempt to delete the test database file now.
          #
          if {[set code [catch {file delete $fileName} error]]} then {
          if {[catch {file delete $fileName} error]} then {
            #
            # NOTE: We somehow failed to delete the file, report why.
            #
            tputs $::test_channel [appendArgs \
                "==== WARNING: failed to delete database file \"" $fileName \
                "\" during cleanup, error: " \n\t $error \n]

            set success false
          }
        } else {
          #
          # NOTE: Show that we skipped deleting the file.
          #
          set code 0

          tputs $::test_channel [appendArgs \
              "==== WARNING: skipped deleting database file \"" $fileName \
              "\" during cleanup\n"]
        }
      } else {
        #
        # NOTE: The file does not exist, success!
        #
        set code 0
      }

      return $code
      return [expr {$success ? 0 : 1}]
    }

    proc saveEnvironmentVariables { names {varName ""} } {
      #
      # NOTE: For each name, does the live environment variable exist?  If
      #       so, save the value for later; otherwise, make sure the saved
      #       value does not exist either.  The live environment variables
2929
2930
2931
2932
2933
2934
2935












2936
2937
2938
2939
2940
2941
2942
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104







+
+
+
+
+
+
+
+
+
+
+
+







      # NOTE: This is self-cleaning.  If no saved environment variables now
      #       exist, remove the array.
      #
      if {[array size savedEnv] == 0} then {
        unset -nocomplain savedEnv
      }
    }

    proc saveMdaConfigEnvironment {} {
      upvar 1 savedEnv savedEnv

      saveEnvironmentVariables [list COMPLUS_MDA] savedEnv
    }

    proc restoreMdaConfigEnvironment {} {
      upvar 1 savedEnv savedEnv

      restoreEnvironmentVariables [list COMPLUS_MDA] savedEnv
    }

    proc saveGetSettingValueEnvironment {} {
      upvar 1 savedEnv savedEnv

      saveEnvironmentVariables [list \
          No_Expand No_SQLiteGetSettingValue No_SQLiteXmlConfigFile] \
          savedEnv
4032
4033
4034
4035
4036
4037
4038
4039
4040


4041
4042
4043
4044
4045
4046
4047
4194
4195
4196
4197
4198
4199
4200


4201
4202
4203
4204
4205
4206
4207
4208
4209







-
-
+
+







        # NOTE: Build the list of external files that we handle.  Some of
        #       these files may be native and/or managed assemblies that are
        #       required to perform various tests.
        #
        set externalFileNames [list \
            [file join EntityFramework lib [string map [list Fx ""] \
            [string map [list netFx451 netFx45 netFx452 netFx45 netFx46 \
            netFx45 netFx461 netFx45 netFx462 netFx45 netFx47 netFx45] \
            [getBuildNetFx]]] EntityFramework.dll]]
            netFx45 netFx461 netFx45 netFx462 netFx45 netFx47 netFx45 \
            netFx471 netFx45] [getBuildNetFx]]] EntityFramework.dll]]

        #
        # NOTE: Build the list of native assembly files that we handle.
        #
        set nativeFileNames [list]

        eval lappend nativeFileNames [getNativeLibraryFileNamesOnly]
4582
4583
4584
4585
4586
4587
4588
4589

4590
4591
4592
4593
4594
4595
4596
4744
4745
4746
4747
4748
4749
4750

4751
4752
4753
4754
4755
4756
4757
4758







-
+







            INTEROP_INCLUDE_CEROD INTEROP_INCLUDE_EXTRA INTEROP_INCLUDE_SEE \
            INTEROP_INCLUDE_ZIPVFS INTEROP_JSON1_EXTENSION \
            INTEROP_LEGACY_CLOSE INTEROP_LOG INTEROP_PERCENTILE_EXTENSION \
            INTEROP_REGEXP_EXTENSION INTEROP_SESSION_EXTENSION \
            INTEROP_SHA1_EXTENSION INTEROP_TEST_EXTENSION \
            INTEROP_TOTYPE_EXTENSION INTEROP_VIRTUAL_TABLE \
            NET_20 NET_35 NET_40 NET_45 NET_451 NET_452 NET_46 NET_461 \
            NET_462 NET_47 NET_COMPACT_20 PLATFORM_COMPACTFRAMEWORK \
            NET_462 NET_47 NET_471 NET_COMPACT_20 PLATFORM_COMPACTFRAMEWORK \
            PRELOAD_NATIVE_LIBRARY RETARGETABLE SQLITE_STANDARD \
            THROW_ON_DISPOSED TRACE TRACE_CONNECTION TRACE_DETECTION \
            TRACE_HANDLE TRACE_PRELOAD TRACE_SHARED TRACE_STATEMENT \
            TRACE_WARNING TRACK_MEMORY_BYTES USE_ENTITY_FRAMEWORK_6 \
            USE_INTEROP_DLL USE_PREPARE_V2 WINDOWS] {
          #
          # NOTE: Check if the compile-time option is listed in the list of
4776
4777
4778
4779
4780
4781
4782





4783
4784
4785
4786
4787
4788
4789







4790
4791
4792


4793
4794
4795


4796
4797
4798


4799
4800
4801


4802
4803
4804


4805
4806
4807
4808



4809
4810
4811
4812
4813
4814
4815






4816
4817
4818
4819



4820
4821
4822


4823
4824
4825


4826
4827
4828
4829
4830
4831
4832






4833
4834
4835


4836
4837
4838


4839
4840
4841


4842
4843
4844


4845
4846
4847


4848
4849
4850


4851
4852
4853


4854
4855
4856


4857
4858
4859


4860
4861
4862


4863
4864
4865


4866
4867
4868


4869
4870
4871


4872
4873

4874

4875
4876
4877
4878




4879
4880
4881
4882
4883




4884
4885
4886
4887
4888




4889
4890
4891
4892
4893




4894
4895
4896
4897
4898




4899
4900
4901
4902
4903




4904
4905
4906
4907
4908




4909
4910
4911
4912
4913




4914
4915
4916
4917
4918




4919
4920
4921
4922
4923




4924
4925
4926
4927
4928




4929
4930
4931
4932
4933




4934
4935
4936
4937
4938




4939
4940
4941
4942
4943




4944
4945
4946
4947
4948




4949
4950
4951
4952
4953




4954
4955
4956
4957
4958




4959
4960
4961
4962
4963




4964
4965
4966
4967
4968




4969
4970
4971
4972
4973




4974
4975
4976
4977
4978




4979
4980
4981
4982
4983




4984
4985
4986
4987
4988




4989
4990
4991
4992
4993




4994
4995
4996
4997
4998




4999
5000
5001
5002
5003




5004
5005
5006
5007





5008
5009
5010
5011
5012





5013
5014
5015
5016
5017
5018
5019
5020
5021









5022
5023
5024
5025



5026
5027
5028
5029
5030
5031
5032







5033
5034
5035
5036
5037
5038
5039
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949







4950
4951
4952
4953
4954
4955
4956
4957


4958
4959
4960


4961
4962
4963


4964
4965
4966


4967
4968
4969


4970
4971
4972



4973
4974
4975
4976






4977
4978
4979
4980
4981
4982
4983



4984
4985
4986
4987


4988
4989
4990


4991
4992
4993






4994
4995
4996
4997
4998
4999
5000


5001
5002
5003


5004
5005
5006


5007
5008
5009


5010
5011
5012


5013
5014
5015


5016
5017
5018


5019
5020
5021


5022
5023
5024


5025
5026
5027


5028
5029
5030


5031
5032
5033


5034
5035
5036


5037
5038
5039

5040
5041
5042




5043
5044
5045
5046
5047




5048
5049
5050
5051
5052




5053
5054
5055
5056
5057




5058
5059
5060
5061
5062




5063
5064
5065
5066
5067




5068
5069
5070
5071
5072




5073
5074
5075
5076
5077




5078
5079
5080
5081
5082




5083
5084
5085
5086
5087




5088
5089
5090
5091
5092




5093
5094
5095
5096
5097




5098
5099
5100
5101
5102




5103
5104
5105
5106
5107




5108
5109
5110
5111
5112




5113
5114
5115
5116
5117




5118
5119
5120
5121
5122




5123
5124
5125
5126
5127




5128
5129
5130
5131
5132




5133
5134
5135
5136
5137




5138
5139
5140
5141
5142




5143
5144
5145
5146
5147




5148
5149
5150
5151
5152




5153
5154
5155
5156
5157




5158
5159
5160
5161
5162




5163
5164
5165
5166
5167




5168
5169
5170
5171
5172



5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187









5188
5189
5190
5191
5192
5193
5194
5195
5196
5197



5198
5199
5200
5201






5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215







+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+

-
-
+
+

-
-
+
+

-
-
+
+

-
-
+
+

-
-
+
+

-
-
-
+
+
+

-
-
-
-
-
-
+
+
+
+
+
+

-
-
-
+
+
+

-
-
+
+

-
-
+
+

-
-
-
-
-
-
+
+
+
+
+
+

-
-
+
+

-
-
+
+

-
-
+
+

-
-
+
+

-
-
+
+

-
-
+
+

-
-
+
+

-
-
+
+

-
-
+
+

-
-
+
+

-
-
+
+

-
-
+
+

-
-
+
+

-
+

+
-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
+
+
+
+
+





+
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+

-
-
-
+
+
+

-
-
-
-
-
-
+
+
+
+
+
+
+







        tputs $::test_channel [appendArgs \
            "---- System.Data.SQLite tests began at " \
            [clock format [clock seconds]] \n]
      }
    }

    proc runSQLiteTestFilesPrologue {} {
      #
      # NOTE: Skip running our custom files prologue if the main one has been
      #       skipped.
      #
      if {![info exists ::no(prologue.eagle)]} then {
      uplevel 1 {
        #
        # NOTE: Setup the variables that refer to the various non-data files
        #       required by the tests in this file.
        #
        set entityFrameworkDllFile \
            [getBuildFileName EntityFramework.dll false]
        uplevel 1 {
          #
          # NOTE: Setup the variables that refer to the various non-data files
          #       required by the tests in this file.
          #
          set entityFrameworkDllFile \
              [getBuildFileName EntityFramework.dll false]

        set installerExeFile \
            [getBuildFileName Installer.exe false]
          set installerExeFile \
              [getBuildFileName Installer.exe false]

        set sqliteDesignerDllFile \
            [getBuildFileName SQLite.Designer.dll false]
          set sqliteDesignerDllFile \
              [getBuildFileName SQLite.Designer.dll false]

        set systemDataSQLiteDllFile \
            [getBuildFileName System.Data.SQLite.dll false]
          set systemDataSQLiteDllFile \
              [getBuildFileName System.Data.SQLite.dll false]

        set systemDataSQLiteLinqDllFile \
            [getBuildFileName System.Data.SQLite.Linq.dll false]
          set systemDataSQLiteLinqDllFile \
              [getBuildFileName System.Data.SQLite.Linq.dll false]

        set systemDataSQLiteEf6DllFile \
            [getBuildFileName System.Data.SQLite.EF6.dll false]
          set systemDataSQLiteEf6DllFile \
              [getBuildFileName System.Data.SQLite.EF6.dll false]

        set testExeFile [getBuildFileName test.exe false]
        set testLinqExeFile [getBuildFileName testlinq.exe false]
        set testEf6ExeFile [getBuildFileName testef6.exe false]
          set testExeFile [getBuildFileName test.exe false]
          set testLinqExeFile [getBuildFileName testlinq.exe false]
          set testEf6ExeFile [getBuildFileName testef6.exe false]

        #
        # NOTE: Setup the variables that refer to the various data files
        #       required by the tests in this file.
        #
        set testLinqOutFile [file nativename [file join \
            [getSQLiteTestDataPath] testlinq.out]]
          #
          # NOTE: Setup the variables that refer to the various data files
          #       required by the tests in this file.
          #
          set testLinqOutFile [file nativename [file join \
              [getSQLiteTestDataPath] testlinq.out]]

        set northwindEfDbFile [file nativename [file join \
            [file dirname [file dirname [getSQLiteTestDataPath]]] \
            testlinq northwindEF.db]]
          set northwindEfDbFile [file nativename [file join \
              [file dirname [file dirname [getSQLiteTestDataPath]]] \
              testlinq northwindEF.db]]

        set nonWalDbFile [file nativename [file join \
            [getSQLiteTestDataPath] nonWal.db]]
          set nonWalDbFile [file nativename [file join \
              [getSQLiteTestDataPath] nonWal.db]]

        set walDbFile [file nativename [file join \
            [getSQLiteTestDataPath] wal.db]]
          set walDbFile [file nativename [file join \
              [getSQLiteTestDataPath] wal.db]]

        #
        # NOTE: The various install/uninstall log files used to test the
        #       design-time component installer.
        #
        set testInstallVs2005LogFile [file nativename [file join \
            [getSQLiteTestDataPath] Installer_Test_Vs2005.log]]
          #
          # NOTE: The various install/uninstall log files used to test the
          #       design-time component installer.
          #
          set testInstallVs2005LogFile [file nativename [file join \
              [getSQLiteTestDataPath] Installer_Test_Vs2005.log]]

        set testInstallVs2008LogFile [file nativename [file join \
            [getSQLiteTestDataPath] Installer_Test_Vs2008.log]]
          set testInstallVs2008LogFile [file nativename [file join \
              [getSQLiteTestDataPath] Installer_Test_Vs2008.log]]

        set testInstallVs2010LogFile [file nativename [file join \
            [getSQLiteTestDataPath] Installer_Test_Vs2010.log]]
          set testInstallVs2010LogFile [file nativename [file join \
              [getSQLiteTestDataPath] Installer_Test_Vs2010.log]]

        set testInstallVs2012LogFile [file nativename [file join \
            [getSQLiteTestDataPath] Installer_Test_Vs2012.log]]
          set testInstallVs2012LogFile [file nativename [file join \
              [getSQLiteTestDataPath] Installer_Test_Vs2012.log]]

        set testInstallVs2013LogFile [file nativename [file join \
            [getSQLiteTestDataPath] Installer_Test_Vs2013.log]]
          set testInstallVs2013LogFile [file nativename [file join \
              [getSQLiteTestDataPath] Installer_Test_Vs2013.log]]

        set testInstallVs2015LogFile [file nativename [file join \
            [getSQLiteTestDataPath] Installer_Test_Vs2015.log]]
          set testInstallVs2015LogFile [file nativename [file join \
              [getSQLiteTestDataPath] Installer_Test_Vs2015.log]]

        set testInstallVs2017LogFile [file nativename [file join \
            [getSQLiteTestDataPath] Installer_Test_Vs2017.log]]
          set testInstallVs2017LogFile [file nativename [file join \
              [getSQLiteTestDataPath] Installer_Test_Vs2017.log]]

        set testUninstallVs2005LogFile [file nativename [file join \
            [getSQLiteTestDataPath] Uninstaller_Test_Vs2005.log]]
          set testUninstallVs2005LogFile [file nativename [file join \
              [getSQLiteTestDataPath] Uninstaller_Test_Vs2005.log]]

        set testUninstallVs2008LogFile [file nativename [file join \
            [getSQLiteTestDataPath] Uninstaller_Test_Vs2008.log]]
          set testUninstallVs2008LogFile [file nativename [file join \
              [getSQLiteTestDataPath] Uninstaller_Test_Vs2008.log]]

        set testUninstallVs2010LogFile [file nativename [file join \
            [getSQLiteTestDataPath] Uninstaller_Test_Vs2010.log]]
          set testUninstallVs2010LogFile [file nativename [file join \
              [getSQLiteTestDataPath] Uninstaller_Test_Vs2010.log]]

        set testUninstallVs2012LogFile [file nativename [file join \
            [getSQLiteTestDataPath] Uninstaller_Test_Vs2012.log]]
          set testUninstallVs2012LogFile [file nativename [file join \
              [getSQLiteTestDataPath] Uninstaller_Test_Vs2012.log]]

        set testUninstallVs2013LogFile [file nativename [file join \
            [getSQLiteTestDataPath] Uninstaller_Test_Vs2013.log]]
          set testUninstallVs2013LogFile [file nativename [file join \
              [getSQLiteTestDataPath] Uninstaller_Test_Vs2013.log]]

        set testUninstallVs2015LogFile [file nativename [file join \
            [getSQLiteTestDataPath] Uninstaller_Test_Vs2015.log]]
          set testUninstallVs2015LogFile [file nativename [file join \
              [getSQLiteTestDataPath] Uninstaller_Test_Vs2015.log]]

        set testUninstallVs2017LogFile [file nativename [file join \
            [getSQLiteTestDataPath] Uninstaller_Test_Vs2017.log]]
          set testUninstallVs2017LogFile [file nativename [file join \
              [getSQLiteTestDataPath] Uninstaller_Test_Vs2017.log]]

        #######################################################################
          #####################################################################

          if {![info exists ::no(checkForSqliteFiles)]} then {
        if {![haveConstraint [appendArgs file_ \
            [file tail $entityFrameworkDllFile]]]} then {
          checkForFile $test_channel $entityFrameworkDllFile
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $entityFrameworkDllFile]]]} then {
              checkForFile $test_channel $entityFrameworkDllFile
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $installerExeFile]]]} then {
          checkForFile $test_channel $installerExeFile Installer.exe
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $installerExeFile]]]} then {
              checkForFile $test_channel $installerExeFile Installer.exe
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $sqliteDesignerDllFile]]]} then {
          checkForFile $test_channel $sqliteDesignerDllFile
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $sqliteDesignerDllFile]]]} then {
              checkForFile $test_channel $sqliteDesignerDllFile
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $systemDataSQLiteDllFile]]]} then {
          checkForFile $test_channel $systemDataSQLiteDllFile
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $systemDataSQLiteDllFile]]]} then {
              checkForFile $test_channel $systemDataSQLiteDllFile
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $systemDataSQLiteLinqDllFile]]]} then {
          checkForFile $test_channel $systemDataSQLiteLinqDllFile
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $systemDataSQLiteLinqDllFile]]]} then {
              checkForFile $test_channel $systemDataSQLiteLinqDllFile
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $systemDataSQLiteEf6DllFile]]]} then {
          checkForFile $test_channel $systemDataSQLiteEf6DllFile
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $systemDataSQLiteEf6DllFile]]]} then {
              checkForFile $test_channel $systemDataSQLiteEf6DllFile
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $testExeFile]]]} then {
          checkForFile $test_channel $testExeFile test.exe
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $testExeFile]]]} then {
              checkForFile $test_channel $testExeFile test.exe
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $testLinqExeFile]]]} then {
          checkForFile $test_channel $testLinqExeFile testlinq.exe
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $testLinqExeFile]]]} then {
              checkForFile $test_channel $testLinqExeFile testlinq.exe
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $testEf6ExeFile]]]} then {
          checkForFile $test_channel $testEf6ExeFile testef6.exe
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $testEf6ExeFile]]]} then {
              checkForFile $test_channel $testEf6ExeFile testef6.exe
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $testLinqOutFile]]]} then {
          checkForFile $test_channel $testLinqOutFile
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $testLinqOutFile]]]} then {
              checkForFile $test_channel $testLinqOutFile
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $northwindEfDbFile]]]} then {
          checkForFile $test_channel $northwindEfDbFile
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $northwindEfDbFile]]]} then {
              checkForFile $test_channel $northwindEfDbFile
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $nonWalDbFile]]]} then {
          checkForFile $test_channel $nonWalDbFile
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $nonWalDbFile]]]} then {
              checkForFile $test_channel $nonWalDbFile
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $walDbFile]]]} then {
          checkForFile $test_channel $walDbFile
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $walDbFile]]]} then {
              checkForFile $test_channel $walDbFile
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $testInstallVs2005LogFile]]]} then {
          checkForFile $test_channel $testInstallVs2005LogFile
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $testInstallVs2005LogFile]]]} then {
              checkForFile $test_channel $testInstallVs2005LogFile
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $testInstallVs2008LogFile]]]} then {
          checkForFile $test_channel $testInstallVs2008LogFile
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $testInstallVs2008LogFile]]]} then {
              checkForFile $test_channel $testInstallVs2008LogFile
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $testInstallVs2010LogFile]]]} then {
          checkForFile $test_channel $testInstallVs2010LogFile
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $testInstallVs2010LogFile]]]} then {
              checkForFile $test_channel $testInstallVs2010LogFile
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $testInstallVs2012LogFile]]]} then {
          checkForFile $test_channel $testInstallVs2012LogFile
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $testInstallVs2012LogFile]]]} then {
              checkForFile $test_channel $testInstallVs2012LogFile
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $testInstallVs2013LogFile]]]} then {
          checkForFile $test_channel $testInstallVs2013LogFile
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $testInstallVs2013LogFile]]]} then {
              checkForFile $test_channel $testInstallVs2013LogFile
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $testInstallVs2015LogFile]]]} then {
          checkForFile $test_channel $testInstallVs2015LogFile
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $testInstallVs2015LogFile]]]} then {
              checkForFile $test_channel $testInstallVs2015LogFile
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $testInstallVs2017LogFile]]]} then {
          checkForFile $test_channel $testInstallVs2017LogFile
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $testInstallVs2017LogFile]]]} then {
              checkForFile $test_channel $testInstallVs2017LogFile
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $testUninstallVs2005LogFile]]]} then {
          checkForFile $test_channel $testUninstallVs2005LogFile
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $testUninstallVs2005LogFile]]]} then {
              checkForFile $test_channel $testUninstallVs2005LogFile
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $testUninstallVs2008LogFile]]]} then {
          checkForFile $test_channel $testUninstallVs2008LogFile
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $testUninstallVs2008LogFile]]]} then {
              checkForFile $test_channel $testUninstallVs2008LogFile
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $testUninstallVs2010LogFile]]]} then {
          checkForFile $test_channel $testUninstallVs2010LogFile
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $testUninstallVs2010LogFile]]]} then {
              checkForFile $test_channel $testUninstallVs2010LogFile
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $testUninstallVs2012LogFile]]]} then {
          checkForFile $test_channel $testUninstallVs2012LogFile
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $testUninstallVs2012LogFile]]]} then {
              checkForFile $test_channel $testUninstallVs2012LogFile
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $testUninstallVs2013LogFile]]]} then {
          checkForFile $test_channel $testUninstallVs2013LogFile
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $testUninstallVs2013LogFile]]]} then {
              checkForFile $test_channel $testUninstallVs2013LogFile
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $testUninstallVs2015LogFile]]]} then {
          checkForFile $test_channel $testUninstallVs2015LogFile
        }
            if {![haveConstraint [appendArgs file_ \
                [file tail $testUninstallVs2015LogFile]]]} then {
              checkForFile $test_channel $testUninstallVs2015LogFile
            }

        if {![haveConstraint [appendArgs file_ \
            [file tail $testUninstallVs2017LogFile]]]} then {
          checkForFile $test_channel $testUninstallVs2017LogFile
            if {![haveConstraint [appendArgs file_ \
                [file tail $testUninstallVs2017LogFile]]]} then {
              checkForFile $test_channel $testUninstallVs2017LogFile
            }
          }
        }
      }
    }

    proc runSQLiteTestFilesEpilogue {} {
      #
      # NOTE: Skip running our custom files epilogue if the main one has been
      #       skipped.
      #
      if {![info exists ::no(epilogue.eagle)]} then {
      uplevel 1 {
        unset -nocomplain \
            testUninstallVs2017LogFile testUninstallVs2015LogFile \
            testUninstallVs2013LogFile testUninstallVs2012LogFile \
            testUninstallVs2010LogFile testUninstallVs2008LogFile \
            testUninstallVs2005LogFile testInstallVs2017LogFile \
            testInstallVs2015LogFile testInstallVs2013LogFile \
            testInstallVs2012LogFile testInstallVs2010LogFile \
            testInstallVs2008LogFile testInstallVs2005LogFile
        uplevel 1 {
          unset -nocomplain \
              testUninstallVs2017LogFile testUninstallVs2015LogFile \
              testUninstallVs2013LogFile testUninstallVs2012LogFile \
              testUninstallVs2010LogFile testUninstallVs2008LogFile \
              testUninstallVs2005LogFile testInstallVs2017LogFile \
              testInstallVs2015LogFile testInstallVs2013LogFile \
              testInstallVs2012LogFile testInstallVs2010LogFile \
              testInstallVs2008LogFile testInstallVs2005LogFile

        unset -nocomplain \
            northwindEfDbFile testLinqOutFile \
            walDbFile nonWalDbFile
          unset -nocomplain \
              northwindEfDbFile testLinqOutFile \
              walDbFile nonWalDbFile

        unset -nocomplain \
            testEf6ExeFile testLinqExeFile \
            testExeFile systemDataSQLiteEf6DllFile \
            systemDataSQLiteLinqDllFile systemDataSQLiteDllFile \
            sqliteDesignerDllFile installerExeFile \
            entityFrameworkDllFile
          unset -nocomplain \
              testEf6ExeFile testLinqExeFile \
              testExeFile systemDataSQLiteEf6DllFile \
              systemDataSQLiteLinqDllFile systemDataSQLiteDllFile \
              sqliteDesignerDllFile installerExeFile \
              entityFrameworkDllFile
        }
      }
    }

    proc runSQLiteTestEpilogue {} {
      #
      # NOTE: Skip running our custom epilogue if the main one has been
      #       skipped.
Changes to readme.htm.
1
2
3
4
5
6
7
8
9


10
11
12
13
14
15
16
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.106.0 - October XX, 2017 <font color="red">(release scheduled)</font><br />
Using <a href="https://www.sqlite.org/draft/releaselog/3_21_0.html">SQLite 3.21.0</a><br />Originally written by Robert Simpson<br />
Version 1.0.107.0 - January XX, 2018 <font color="red">(release scheduled)</font><br />
Using <a href="https://www.sqlite.org/draft/releaselog/3_22_0.html">SQLite 3.22.0</a><br />Originally written by Robert Simpson<br />
Released to the public domain, use at your own risk!<br />
Official provider website:&nbsp;<a href="https://system.data.sqlite.org/">https://system.data.sqlite.org/</a><br />
Legacy versions:&nbsp;<a href="https://sourceforge.net/projects/sqlite-dotnet2/">https://sourceforge.net/projects/sqlite-dotnet2/</a><br />
<br />
The current development version can be downloaded from <a href="https://system.data.sqlite.org/index.html/timeline?y=ci">
https://system.data.sqlite.org/index.html/timeline?y=ci</a>
<br />
141
142
143
144
145
146
147
148

149
150
151
152
153
154
155
141
142
143
144
145
146
147

148
149
150
151
152
153
154
155







-
+







app.config file:<br />
<pre>
&lt;configuration&gt;
    &lt;system.data&gt;
        &lt;DbProviderFactories&gt;
            &lt;remove invariant="System.Data.SQLite" /&gt;
            &lt;add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite"
                 type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.106.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" /&gt;
                 type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.107.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" /&gt;
        &lt;/DbProviderFactories&gt;
    &lt;/system.data&gt;
&lt;/configuration&gt;
</pre>
<p>
See the help documentation for further details on implementing both version-specific
(GAC enabled) and version independent DBProviderFactories support.
204
205
206
207
208
209
210
211

212
213
214











215
216

217
218
219
220
221
222
223
204
205
206
207
208
209
210

211
212
213

214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234







-
+


-
+
+
+
+
+
+
+
+
+
+
+


+







designed for robustness and maximum backward compatibility with previously
released versions of System.Data.SQLite.
</p>

<h2><b>Version History</b></h2>

<p>
    <b>1.0.106.0 - October XX, 2017 <font color="red">(release scheduled)</font></b>
    <b>1.0.107.0 - January XX, 2018 <font color="red">(release scheduled)</font></b>
</p>
<ul>
    <li>Updated to <a href="https://www.sqlite.org/draft/releaselog/3_21_0.html">SQLite 3.21.0</a>.</li>
    <li>Updated to <a href="https://www.sqlite.org/draft/releaselog/3_22_0.html">SQLite 3.22.0</a>.</li>
    <li>Improve performance of type name lookups by removing superfluous locking and string creation.</li>
    <li>Fix some internal memory accounting present only in the debug build.</li>
    <li>Make sure inbound native delegates are unhooked before adding a connection to the pool. Fix for [0e48e80333].</li>
    <li>Add preliminary support for the .NET Framework 4.7.1.</li>
</ul>
<p>
    <b>1.0.106.0 - November 2, 2017</b>
</p>
<ul>
    <li>Updated to <a href="https://www.sqlite.org/releaselog/3_21_0.html">SQLite 3.21.0</a>.</li>
    <li>Add full support for the native <a href="https://www.sqlite.org/sessionintro.html">session</a> extension.</li>
    <li>Add BindDecimalAsText and GetDecimalAsText connection flags to force binding and returning of decimal values as text. Pursuant to [b167206ad3].</li>
    <li>Add BindInvariantDecimal and GetInvariantDecimal connection flags, enabled by default, to force binding and returning of decimal values using the invariant culture. Pursuant to [b167206ad3].&nbsp;<b>** Potentially Incompatible Change **</b></li>
    <li>Add preliminary support for Visual Studio 2017 and the .NET Framework 4.7. This does <b>not</b> include support for the design-time components for Visual Studio, see [8292431f51].</li>
</ul>
<p>
    <b>1.0.105.2 - June 12, 2017</b>
</p>
<ul>
    <li>Updated to <a href="https://www.sqlite.org/releaselog/3_19_3.html">SQLite 3.19.3</a>.</li>
Changes to test/AssemblyInfo.cs.
34
35
36
37
38
39
40
41
42


34
35
36
37
38
39
40


41
42







-
-
+
+
// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version 
//      Build Number
//      Revision
//
[assembly: AssemblyVersion("1.0.106.0")]
[assembly: AssemblyFileVersion("1.0.106.0")]
[assembly: AssemblyVersion("1.0.107.0")]
[assembly: AssemblyFileVersion("1.0.107.0")]
Changes to test/app.config.
1
2
3
4
5

6
7
8
1
2
3
4

5
6
7
8




-
+



<configuration>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite" />
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.106.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.107.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </DbProviderFactories>
  </system.data>
</configuration>
Changes to testce/AssemblyInfo.cs.
34
35
36
37
38
39
40
41
42


34
35
36
37
38
39
40


41
42







-
-
+
+
// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version 
//      Build Number
//      Revision
//
[assembly: AssemblyVersion("1.0.106.0")]
// [assembly: AssemblyFileVersion("1.0.106.0")]
[assembly: AssemblyVersion("1.0.107.0")]
// [assembly: AssemblyFileVersion("1.0.107.0")]
Changes to testlinq/2008/LINQ/App.config.
1
2
3
4
5
6

7
8
9
10
11
12
1
2
3
4
5

6
7
8
9
10
11
12





-
+






<?xml version="1.0"?>
<configuration>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite.Linq" />
      <add name="SQLite Data Provider (LINQ)" invariant="System.Data.SQLite.Linq" description=".NET Framework Data Provider for SQLite (LINQ)" type="System.Data.SQLite.Linq.SQLiteProviderFactory, System.Data.SQLite.Linq, Version=1.0.106.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
      <add name="SQLite Data Provider (LINQ)" invariant="System.Data.SQLite.Linq" description=".NET Framework Data Provider for SQLite (LINQ)" type="System.Data.SQLite.Linq.SQLiteProviderFactory, System.Data.SQLite.Linq, Version=1.0.107.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="northwindEFEntities" connectionString="metadata=res://*/NorthwindModel.Linq.2008.csdl|res://*/NorthwindModel.Linq.2008.ssdl|res://*/NorthwindModel.Linq.2008.msl;provider=System.Data.SQLite.Linq;provider connection string=&quot;data source=.\northwindEF.db&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>
Changes to testlinq/2010/EF6/App.config.
1
2
3
4
5
6
7
8
9

10
11
12
13
14
15
16
17

18
19
20
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
16

17
18
19
20








-
+







-
+



<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite.EF6" />
      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6, Version=1.0.106.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6, Version=1.0.107.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="northwindEFEntities" connectionString="metadata=res://*/NorthwindModel.EF6.2010.csdl|res://*/NorthwindModel.EF6.2010.ssdl|res://*/NorthwindModel.EF6.2010.msl;provider=System.Data.SQLite.EF6;provider connection string=&quot;data source=.\northwindEF.db&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <entityFramework>
    <providers>
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6, Version=1.0.106.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6, Version=1.0.107.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </providers>
  </entityFramework>
</configuration>
Changes to testlinq/2010/LINQ/App.config.
1
2
3
4
5
6

7
8
9
10
11
12
1
2
3
4
5

6
7
8
9
10
11
12





-
+






<?xml version="1.0"?>
<configuration>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite.Linq" />
      <add name="SQLite Data Provider (LINQ)" invariant="System.Data.SQLite.Linq" description=".NET Framework Data Provider for SQLite (LINQ)" type="System.Data.SQLite.Linq.SQLiteProviderFactory, System.Data.SQLite.Linq, Version=1.0.106.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
      <add name="SQLite Data Provider (LINQ)" invariant="System.Data.SQLite.Linq" description=".NET Framework Data Provider for SQLite (LINQ)" type="System.Data.SQLite.Linq.SQLiteProviderFactory, System.Data.SQLite.Linq, Version=1.0.107.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="northwindEFEntities" connectionString="metadata=res://*/NorthwindModel.Linq.2010.csdl|res://*/NorthwindModel.Linq.2010.ssdl|res://*/NorthwindModel.Linq.2010.msl;provider=System.Data.SQLite.Linq;provider connection string=&quot;data source=.\northwindEF.db&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>
Changes to testlinq/2012/EF6/App.config.
1
2
3
4
5
6
7
8
9

10
11
12
13
14
15
16
17

18
19
20
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
16

17
18
19
20








-
+







-
+



<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite.EF6" />
      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6, Version=1.0.106.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6, Version=1.0.107.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="northwindEFEntities" connectionString="metadata=res://*/NorthwindModel.EF6.2012.csdl|res://*/NorthwindModel.EF6.2012.ssdl|res://*/NorthwindModel.EF6.2012.msl;provider=System.Data.SQLite.EF6;provider connection string=&quot;data source=.\northwindEF.db&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <entityFramework>
    <providers>
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6, Version=1.0.106.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6, Version=1.0.107.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </providers>
  </entityFramework>
</configuration>
Changes to testlinq/2012/LINQ/App.config.
1
2
3
4
5
6

7
8
9
10
11
12
1
2
3
4
5

6
7
8
9
10
11
12





-
+






<?xml version="1.0"?>
<configuration>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite.Linq" />
      <add name="SQLite Data Provider (LINQ)" invariant="System.Data.SQLite.Linq" description=".NET Framework Data Provider for SQLite (LINQ)" type="System.Data.SQLite.Linq.SQLiteProviderFactory, System.Data.SQLite.Linq, Version=1.0.106.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
      <add name="SQLite Data Provider (LINQ)" invariant="System.Data.SQLite.Linq" description=".NET Framework Data Provider for SQLite (LINQ)" type="System.Data.SQLite.Linq.SQLiteProviderFactory, System.Data.SQLite.Linq, Version=1.0.107.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="northwindEFEntities" connectionString="metadata=res://*/NorthwindModel.Linq.2012.csdl|res://*/NorthwindModel.Linq.2012.ssdl|res://*/NorthwindModel.Linq.2012.msl;provider=System.Data.SQLite.Linq;provider connection string=&quot;data source=.\northwindEF.db&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>
Changes to testlinq/2013/EF6/App.config.
1
2
3
4
5
6
7
8
9

10
11
12
13
14
15
16
17

18
19
20
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
16

17
18
19
20








-
+







-
+



<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite.EF6" />
      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6, Version=1.0.106.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6, Version=1.0.107.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="northwindEFEntities" connectionString="metadata=res://*/NorthwindModel.EF6.2013.csdl|res://*/NorthwindModel.EF6.2013.ssdl|res://*/NorthwindModel.EF6.2013.msl;provider=System.Data.SQLite.EF6;provider connection string=&quot;data source=.\northwindEF.db&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <entityFramework>
    <providers>
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6, Version=1.0.106.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6, Version=1.0.107.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </providers>
  </entityFramework>
</configuration>
Changes to testlinq/2013/LINQ/App.config.
1
2
3
4
5
6

7
8
9
10
11
12
1
2
3
4
5

6
7
8
9
10
11
12





-
+






<?xml version="1.0"?>
<configuration>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite.Linq" />
      <add name="SQLite Data Provider (LINQ)" invariant="System.Data.SQLite.Linq" description=".NET Framework Data Provider for SQLite (LINQ)" type="System.Data.SQLite.Linq.SQLiteProviderFactory, System.Data.SQLite.Linq, Version=1.0.106.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
      <add name="SQLite Data Provider (LINQ)" invariant="System.Data.SQLite.Linq" description=".NET Framework Data Provider for SQLite (LINQ)" type="System.Data.SQLite.Linq.SQLiteProviderFactory, System.Data.SQLite.Linq, Version=1.0.107.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="northwindEFEntities" connectionString="metadata=res://*/NorthwindModel.Linq.2013.csdl|res://*/NorthwindModel.Linq.2013.ssdl|res://*/NorthwindModel.Linq.2013.msl;provider=System.Data.SQLite.Linq;provider connection string=&quot;data source=.\northwindEF.db&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>
Changes to testlinq/2015/EF6/App.config.
1
2
3
4
5
6
7
8
9

10
11
12
13
14
15
16
17

18
19
20
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
16

17
18
19
20








-
+







-
+



<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite.EF6" />
      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6, Version=1.0.106.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6, Version=1.0.107.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="northwindEFEntities" connectionString="metadata=res://*/NorthwindModel.EF6.2015.csdl|res://*/NorthwindModel.EF6.2015.ssdl|res://*/NorthwindModel.EF6.2015.msl;provider=System.Data.SQLite.EF6;provider connection string=&quot;data source=.\northwindEF.db&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <entityFramework>
    <providers>
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6, Version=1.0.106.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6, Version=1.0.107.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </providers>
  </entityFramework>
</configuration>
Changes to testlinq/2015/LINQ/App.config.
1
2
3
4
5
6

7
8
9
10
11
12
1
2
3
4
5

6
7
8
9
10
11
12





-
+






<?xml version="1.0"?>
<configuration>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite.Linq" />
      <add name="SQLite Data Provider (LINQ)" invariant="System.Data.SQLite.Linq" description=".NET Framework Data Provider for SQLite (LINQ)" type="System.Data.SQLite.Linq.SQLiteProviderFactory, System.Data.SQLite.Linq, Version=1.0.106.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
      <add name="SQLite Data Provider (LINQ)" invariant="System.Data.SQLite.Linq" description=".NET Framework Data Provider for SQLite (LINQ)" type="System.Data.SQLite.Linq.SQLiteProviderFactory, System.Data.SQLite.Linq, Version=1.0.107.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="northwindEFEntities" connectionString="metadata=res://*/NorthwindModel.Linq.2015.csdl|res://*/NorthwindModel.Linq.2015.ssdl|res://*/NorthwindModel.Linq.2015.msl;provider=System.Data.SQLite.Linq;provider connection string=&quot;data source=.\northwindEF.db&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>
Changes to testlinq/2017/EF6/App.config.
1
2
3
4
5
6
7
8
9

10
11
12
13
14
15
16
17

18
19
20
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
16

17
18
19
20








-
+







-
+



<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite.EF6" />
      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6, Version=1.0.106.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6, Version=1.0.107.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="northwindEFEntities" connectionString="metadata=res://*/NorthwindModel.EF6.2017.csdl|res://*/NorthwindModel.EF6.2017.ssdl|res://*/NorthwindModel.EF6.2017.msl;provider=System.Data.SQLite.EF6;provider connection string=&quot;data source=.\northwindEF.db&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <entityFramework>
    <providers>
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6, Version=1.0.106.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6, Version=1.0.107.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </providers>
  </entityFramework>
</configuration>
Changes to testlinq/2017/LINQ/App.config.
1
2
3
4
5
6

7
8
9
10
11
12
1
2
3
4
5

6
7
8
9
10
11
12





-
+






<?xml version="1.0"?>
<configuration>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite.Linq" />
      <add name="SQLite Data Provider (LINQ)" invariant="System.Data.SQLite.Linq" description=".NET Framework Data Provider for SQLite (LINQ)" type="System.Data.SQLite.Linq.SQLiteProviderFactory, System.Data.SQLite.Linq, Version=1.0.106.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
      <add name="SQLite Data Provider (LINQ)" invariant="System.Data.SQLite.Linq" description=".NET Framework Data Provider for SQLite (LINQ)" type="System.Data.SQLite.Linq.SQLiteProviderFactory, System.Data.SQLite.Linq, Version=1.0.107.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="northwindEFEntities" connectionString="metadata=res://*/NorthwindModel.Linq.2017.csdl|res://*/NorthwindModel.Linq.2017.ssdl|res://*/NorthwindModel.Linq.2017.msl;provider=System.Data.SQLite.Linq;provider connection string=&quot;data source=.\northwindEF.db&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>
Changes to testlinq/Program.cs.
170
171
172
173
174
175
176
177

178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197

198
199
200
201
202
203
204
170
171
172
173
174
175
176

177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196

197
198
199
200
201
202
203
204







-
+



















-
+








                              return 1;
                          }
                      }

                      return BinaryGuidTest(value);
                  }
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
              case "binaryguid2":
                  {
                      bool value = false;

                      if (args.Length > 1)
                      {
                          if (!bool.TryParse(args[1], out value))
                          {
                              Console.WriteLine(
                                  "cannot parse \"{0}\" as boolean",
                                  args[1]);

                              return 1;
                          }
                      }

                      return BinaryGuidTest2(value);
                  }
#endif
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
              case "round":
                  {
                      return RoundTest();
                  }
#endif
              case "complexprimarykey":
                  {
492
493
494
495
496
497
498
499

500
501
502
503
504
505
506
492
493
494
495
496
497
498

499
500
501
502
503
504
505
506







-
+







                          territories.Regions = db.Regions.First();

                          db.AddObject("Territories", territories);
                      }

                      try
                      {
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
                          db.SaveChanges(SaveOptions.None);
#else
                          db.SaveChanges(false);
#endif
                      }
                      catch (Exception e)
                      {
515
516
517
518
519
520
521
522

523
524
525
526
527
528
529
515
516
517
518
519
520
521

522
523
524
525
526
527
528
529







-
+







              }
          }
          else
          {
              using (northwindEFEntities db = new northwindEFEntities())
              {
                  bool once = false;
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
                  var query = from t in db.Territories
                    where territoryIds.AsQueryable<long>().Contains<long>(t.TerritoryID)
                    orderby t.TerritoryID
                    select t;

                  foreach (Territories territories in query)
                  {
728
729
730
731
732
733
734
735

736
737
738
739
740
741
742
728
729
730
731
732
733
734

735
736
737
738
739
740
741
742







-
+







          Environment.SetEnvironmentVariable(
              "AppendManifestToken_SQLiteProviderManifest",
              null);

          return 0;
      }

#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
      //
      // NOTE: Used to test the BinaryGUID connection string property with
      //       the Contains() function (ticket [a4d9c7ee94]).  We cannot
      //       use the Contains extension method within a LINQ query with
      //       the .NET Framework 3.5.
      //
      private static int BinaryGuidTest2(bool binaryGuid)
921
922
923
924
925
926
927
928

929
930
931
932
933
934
935
921
922
923
924
925
926
927

928
929
930
931
932
933
934
935







-
+







                  null);
          }

          Environment.SetEnvironmentVariable("SQLite_ForceLogPrepare", null);
          Trace.Listeners.Remove(listener);
      }

#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
      //
      // NOTE: Used to test the ROUND fix (i.e. being able to properly handle
      //       the two argument form).
      //
      private static int RoundTest()
      {
            using (northwindEFEntities db = new northwindEFEntities())
Changes to testlinq/Properties/AssemblyInfo.cs.
42
43
44
45
46
47
48
49
50


42
43
44
45
46
47
48


49
50







-
-
+
+
//      Minor Version
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.106.0")]
[assembly: AssemblyFileVersion("1.0.106.0")]
[assembly: AssemblyVersion("1.0.107.0")]
[assembly: AssemblyFileVersion("1.0.107.0")]
Changes to testlinq/test.2012.csproj.
61
62
63
64
65
66
67
68


69
70
71
72
73
74
75
61
62
63
64
65
66
67

68
69
70
71
72
73
74
75
76







-
+
+







    <Reference Include="EntityFramework"
               Condition="'$(NetFx45)' != 'false' Or
                          '$(NetFx451)' != 'false' Or
                          '$(NetFx452)' != 'false' Or
                          '$(NetFx46)' != 'false' Or
                          '$(NetFx461)' != 'false' Or
                          '$(NetFx462)' != 'false' Or
                          '$(NetFx47)' != 'false'">
                          '$(NetFx47)' != 'false' Or
                          '$(NetFx471)' != 'false'">
      <HintPath>$(SQLiteNetDir)\Externals\EntityFramework\lib\net45\EntityFramework.dll</HintPath>
    </Reference>
  </ItemGroup>
  <ItemGroup>
    <Compile Condition="'$(TargetFrameworkVersion)' == 'v3.5'"
             Include="NorthwindModel.Linq.2008.Designer.cs">
      <AutoGen>True</AutoGen>
Changes to testlinq/test.2013.csproj.
61
62
63
64
65
66
67
68


69
70
71
72
73
74
75
61
62
63
64
65
66
67

68
69
70
71
72
73
74
75
76







-
+
+







    <Reference Include="EntityFramework"
               Condition="'$(NetFx45)' != 'false' Or
                          '$(NetFx451)' != 'false' Or
                          '$(NetFx452)' != 'false' Or
                          '$(NetFx46)' != 'false' Or
                          '$(NetFx461)' != 'false' Or
                          '$(NetFx462)' != 'false' Or
                          '$(NetFx47)' != 'false'">
                          '$(NetFx47)' != 'false' Or
                          '$(NetFx471)' != 'false'">
      <HintPath>$(SQLiteNetDir)\Externals\EntityFramework\lib\net45\EntityFramework.dll</HintPath>
    </Reference>
  </ItemGroup>
  <ItemGroup>
    <Compile Condition="'$(TargetFrameworkVersion)' == 'v3.5'"
             Include="NorthwindModel.Linq.2008.Designer.cs">
      <AutoGen>True</AutoGen>
Changes to testlinq/test.2015.csproj.
61
62
63
64
65
66
67
68


69
70
71
72
73
74
75
61
62
63
64
65
66
67

68
69
70
71
72
73
74
75
76







-
+
+







    <Reference Include="EntityFramework"
               Condition="'$(NetFx45)' != 'false' Or
                          '$(NetFx451)' != 'false' Or
                          '$(NetFx452)' != 'false' Or
                          '$(NetFx46)' != 'false' Or
                          '$(NetFx461)' != 'false' Or
                          '$(NetFx462)' != 'false' Or
                          '$(NetFx47)' != 'false'">
                          '$(NetFx47)' != 'false' Or
                          '$(NetFx471)' != 'false'">
      <HintPath>$(SQLiteNetDir)\Externals\EntityFramework\lib\net45\EntityFramework.dll</HintPath>
    </Reference>
  </ItemGroup>
  <ItemGroup>
    <Compile Condition="'$(TargetFrameworkVersion)' == 'v3.5'"
             Include="NorthwindModel.Linq.2008.Designer.cs">
      <AutoGen>True</AutoGen>
Changes to testlinq/test.2017.csproj.
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
167
168
169
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
167

168
169
170
171
172
173
174
175
176







-
+
+


















-
+
+













-
+
+



















-
+
+









-
+
+

















-
+
+












-
+
+







    <Reference Include="EntityFramework"
               Condition="'$(NetFx45)' != 'false' Or
                          '$(NetFx451)' != 'false' Or
                          '$(NetFx452)' != 'false' Or
                          '$(NetFx46)' != 'false' Or
                          '$(NetFx461)' != 'false' Or
                          '$(NetFx462)' != 'false' Or
                          '$(NetFx47)' != 'false'">
                          '$(NetFx47)' != 'false' Or
                          '$(NetFx471)' != 'false'">
      <HintPath>$(SQLiteNetDir)\Externals\EntityFramework\lib\net45\EntityFramework.dll</HintPath>
    </Reference>
  </ItemGroup>
  <ItemGroup>
    <Compile Condition="'$(TargetFrameworkVersion)' == 'v3.5'"
             Include="NorthwindModel.Linq.2008.Designer.cs">
      <AutoGen>True</AutoGen>
      <DesignTime>True</DesignTime>
      <DependentUpon>NorthwindModel.Linq.2008.edmx</DependentUpon>
    </Compile>
    <Compile Condition="'$(UseEntityFramework6)' == 'false' And
                        ('$(TargetFrameworkVersion)' == 'v4.0' Or
                         '$(TargetFrameworkVersion)' == 'v4.5' Or
                         '$(TargetFrameworkVersion)' == 'v4.5.1' Or
                         '$(TargetFrameworkVersion)' == 'v4.5.2' Or
                         '$(TargetFrameworkVersion)' == 'v4.6' Or
                         '$(TargetFrameworkVersion)' == 'v4.6.1' Or
                         '$(TargetFrameworkVersion)' == 'v4.6.2' Or
                         '$(TargetFrameworkVersion)' == 'v4.7')"
                         '$(TargetFrameworkVersion)' == 'v4.7' Or
                         '$(TargetFrameworkVersion)' == 'v4.7.1')"
             Include="NorthwindModel.Linq.2017.Designer.cs">
      <AutoGen>True</AutoGen>
      <DesignTime>True</DesignTime>
      <DependentUpon>NorthwindModel.Linq.2017.edmx</DependentUpon>
    </Compile>
    <Compile Condition="'$(UseEntityFramework6)' != 'false' And
                        ('$(TargetFrameworkVersion)' == 'v4.0' Or
                         '$(TargetFrameworkVersion)' == 'v4.5' Or
                         '$(TargetFrameworkVersion)' == 'v4.5.1' Or
                         '$(TargetFrameworkVersion)' == 'v4.5.2' Or
                         '$(TargetFrameworkVersion)' == 'v4.6' Or
                         '$(TargetFrameworkVersion)' == 'v4.6.1' Or
                         '$(TargetFrameworkVersion)' == 'v4.6.2' Or
                         '$(TargetFrameworkVersion)' == 'v4.7')"
                         '$(TargetFrameworkVersion)' == 'v4.7' Or
                         '$(TargetFrameworkVersion)' == 'v4.7.1')"
             Include="NorthwindModel.EF6.2017.Designer.cs">
      <AutoGen>True</AutoGen>
      <DesignTime>True</DesignTime>
      <DependentUpon>NorthwindModel.EF6.2017.edmx</DependentUpon>
    </Compile>
    <Compile Include="Program.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
  <ItemGroup>
    <None Condition="'$(TargetFrameworkVersion)' == 'v3.5'"
          Include="2008\LINQ\App.Config" />
    <None Condition="'$(UseEntityFramework6)' == 'false' And
                     ('$(TargetFrameworkVersion)' == 'v4.0' Or
                      '$(TargetFrameworkVersion)' == 'v4.5' Or
                      '$(TargetFrameworkVersion)' == 'v4.5.1' Or
                      '$(TargetFrameworkVersion)' == 'v4.5.2' Or
                      '$(TargetFrameworkVersion)' == 'v4.6' Or
                      '$(TargetFrameworkVersion)' == 'v4.6.1' Or
                      '$(TargetFrameworkVersion)' == 'v4.6.2' Or
                      '$(TargetFrameworkVersion)' == 'v4.7')"
                      '$(TargetFrameworkVersion)' == 'v4.7' Or
                      '$(TargetFrameworkVersion)' == 'v4.7.1')"
          Include="2017\LINQ\App.Config" />
    <None Condition="'$(UseEntityFramework6)' != 'false' And
                     ('$(TargetFrameworkVersion)' == 'v4.0' Or
                      '$(TargetFrameworkVersion)' == 'v4.5' Or
                      '$(TargetFrameworkVersion)' == 'v4.5.1' Or
                      '$(TargetFrameworkVersion)' == 'v4.5.2' Or
                      '$(TargetFrameworkVersion)' == 'v4.6' Or
                      '$(TargetFrameworkVersion)' == 'v4.6.1' Or
                      '$(TargetFrameworkVersion)' == 'v4.6.2' Or
                      '$(TargetFrameworkVersion)' == 'v4.7')"
                      '$(TargetFrameworkVersion)' == 'v4.7' Or
                      '$(TargetFrameworkVersion)' == 'v4.7.1')"
          Include="2017\EF6\App.Config" />
    <None Include="northwindEF.db">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <EntityDeploy Condition="'$(TargetFrameworkVersion)' == 'v3.5'"
                  Include="NorthwindModel.Linq.2008.edmx">
      <Generator>EntityModelCodeGenerator</Generator>
      <LastGenOutput>NorthwindModel.Linq.2008.Designer.cs</LastGenOutput>
    </EntityDeploy>
    <EntityDeploy Condition="'$(UseEntityFramework6)' == 'false' And
                             ('$(TargetFrameworkVersion)' == 'v4.0' Or
                              '$(TargetFrameworkVersion)' == 'v4.5' Or
                              '$(TargetFrameworkVersion)' == 'v4.5.1' Or
                              '$(TargetFrameworkVersion)' == 'v4.5.2' Or
                              '$(TargetFrameworkVersion)' == 'v4.6' Or
                              '$(TargetFrameworkVersion)' == 'v4.6.1' Or
                              '$(TargetFrameworkVersion)' == 'v4.6.2' Or
                              '$(TargetFrameworkVersion)' == 'v4.7')"
                              '$(TargetFrameworkVersion)' == 'v4.7' Or
                              '$(TargetFrameworkVersion)' == 'v4.7.1')"
                  Include="NorthwindModel.Linq.2017.edmx">
      <Generator>EntityModelCodeGenerator</Generator>
      <LastGenOutput>NorthwindModel.Linq.2017.Designer.cs</LastGenOutput>
    </EntityDeploy>
    <EntityDeploy Condition="'$(UseEntityFramework6)' != 'false' And
                             ('$(TargetFrameworkVersion)' == 'v4.0' Or
                              '$(TargetFrameworkVersion)' == 'v4.5' Or
                              '$(TargetFrameworkVersion)' == 'v4.5.1' Or
                              '$(TargetFrameworkVersion)' == 'v4.5.2' Or
                              '$(TargetFrameworkVersion)' == 'v4.6' Or
                              '$(TargetFrameworkVersion)' == 'v4.6.1' Or
                              '$(TargetFrameworkVersion)' == 'v4.6.2' Or
                              '$(TargetFrameworkVersion)' == 'v4.7')"
                              '$(TargetFrameworkVersion)' == 'v4.7' Or
                              '$(TargetFrameworkVersion)' == 'v4.7.1')"
                  Include="NorthwindModel.EF6.2017.edmx">
      <Generator>EntityModelCodeGenerator</Generator>
      <LastGenOutput>NorthwindModel.EF6.2017.Designer.cs</LastGenOutput>
    </EntityDeploy>
  </ItemGroup>
  <ItemGroup>
    <Service Include="{C8F2D6AC-F9F4-4E40-A399-22F9A9A5CBD2}" />
Changes to tools/install/Installer.cs.
199
200
201
202
203
204
205
206

207
208
209
210
211
212
213
199
200
201
202
203
204
205

206
207
208
209
210
211
212
213







-
+







        #endregion
    }
    #endregion

    ///////////////////////////////////////////////////////////////////////////

    #region Installer Class
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471
    [SecurityCritical()]
#else
    [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
#endif
    internal static class Installer
    {
        #region Unsafe Native Methods Class
293
294
295
296
297
298
299





















300
301







302
303
304
305
306
307
308
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







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
+
+
+
+
+
+
+







#endif
        }
        #endregion

        ///////////////////////////////////////////////////////////////////////

        #region Private Helper Classes
        #region ObjectHelper Class
        private static class ObjectHelper
        {
            public static bool AreEqual(
                object value1,
                object value2
                )
            {
                if ((value1 == null) || (value2 == null))
                    return ((value1 == null) && (value2 == null));

                if (Object.ReferenceEquals(value1, value2))
                    return true;

                return value1.Equals(value2);
            }
        }
        #endregion

        ///////////////////////////////////////////////////////////////////////

        #region AnyPair Class
        private sealed class AnyPair<T1, T2>
        private sealed class AnyPair<T1, T2> :
            IComparer<AnyPair<T1, T2>>,
            IComparable<AnyPair<T1, T2>>,
            IComparable,
            IEquatable<AnyPair<T1, T2>>,
            IEqualityComparer<AnyPair<T1, T2>>,
            ICloneable
        {
            #region Public Constructors
            //
            // WARNING: This constructor produces an immutable "empty" pair
            //          object.
            //
            public AnyPair()
341
342
343
344
345
346
347


























































































































































348
349
350
351
352
353
354
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+








            private T2 y;
            public T2 Y
            {
                get { return y; }
            }
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region System.Object Overrides
            public override bool Equals(
                object obj
                )
            {
                AnyPair<T1, T2> anyPair = obj as AnyPair<T1, T2>;

                if (anyPair != null)
                {
                    if (!ObjectHelper.AreEqual(X, anyPair.X))
                        return false;

                    if (!ObjectHelper.AreEqual(Y, anyPair.Y))
                        return false;

                    return true;
                }

                return false;
            }

            ///////////////////////////////////////////////////////////////////

            public override string ToString()
            {
                //
                // TODO: The delimiter here is hard-coded to a space.  This
                //       may need to be changed, e.g. if the use-cases for
                //       this class change.
                //
                return String.Format("{0} {1}", X, Y);
            }

            ///////////////////////////////////////////////////////////////////

            public override int GetHashCode()
            {
                int result = 0;
                T1 x = X;

                if (x != null)
                    result ^= x.GetHashCode();

                T2 y = Y;

                if (y != null)
                    result ^= y.GetHashCode();

                return result;
            }
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region IComparer<AnyPair<T1,T2>> Members
            public int Compare(
                AnyPair<T1, T2> x,
                AnyPair<T1, T2> y
                )
            {
                if ((x == null) && (y == null))
                {
                    return 0;
                }
                else if (x == null)
                {
                    return -1;
                }
                else if (y == null)
                {
                    return 1;
                }
                else
                {
                    int result = Comparer<T1>.Default.Compare(x.X, y.X);

                    if (result != 0)
                        return result;

                    return Comparer<T2>.Default.Compare(x.Y, y.Y);
                }
            }
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region IComparable<AnyPair<T1,T2>> Members
            public int CompareTo(
                AnyPair<T1, T2> other
                )
            {
                return Compare(this, other);
            }
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region IComparable Members
            public int CompareTo(
                object obj
                )
            {
                AnyPair<T1, T2> anyPair = obj as AnyPair<T1, T2>;

                if (anyPair == null)
                    throw new ArgumentException();

                return CompareTo(anyPair);
            }
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region IEquatable<AnyPair<T1,T2>> Members
            public bool Equals(
                AnyPair<T1, T2> other
                )
            {
                return CompareTo(other) == 0;
            }
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region IEqualityComparer<AnyPair<T1,T2>> Members
            public bool Equals(
                AnyPair<T1, T2> x,
                AnyPair<T1, T2> y
                )
            {
                return ObjectHelper.AreEqual(x, y);
            }

            ///////////////////////////////////////////////////////////////////

            public int GetHashCode(
                AnyPair<T1, T2> obj
                )
            {
                return (obj != null) ? obj.GetHashCode() : 0;
            }
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region ICloneable Members
            public object Clone()
            {
                return new AnyPair<T1, T2>(X, Y);
            }
            #endregion
        }
        #endregion

        ///////////////////////////////////////////////////////////////////////

        #region TraceOps Class
        private static class TraceOps
485
486
487
488
489
490
491
492

493
494
495
496
497
498
499
666
667
668
669
670
671
672

673
674
675
676
677
678
679
680







-
+







            {
                return dateTime.ToString(Iso8601DateTimeOutputFormat);
            }

            ///////////////////////////////////////////////////////////////////

            [MethodImpl(MethodImplOptions.NoInlining)]
            private static string GetMethodName(
            public static string GetMethodName(
                StackTrace stackTrace,
                int level
                )
            {
                try
                {
                    //
553
554
555
556
557
558
559
560

561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580

581
582
583
584
585
586
587
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







-
+



















-
+







            ///////////////////////////////////////////////////////////////////

            public static void DebugCore(
                string message,
                string category
                )
            {
                lock (syncRoot)
                lock (syncRoot) /* TRANSACTIONAL */
                {
                    if (debugListeners != null)
                    {
                        foreach (TraceListener listener in debugListeners)
                        {
                            listener.WriteLine(message, category);
                            listener.Flush();
                        }
                    }
                }
            }

            ///////////////////////////////////////////////////////////////////

            public static void TraceCore(
                string message,
                string category
                )
            {
                lock (syncRoot)
                lock (syncRoot) /* TRANSACTIONAL */
                {
                    //
                    // NOTE: Write the message to all the active trace
                    //       listeners.
                    //
                    Trace.WriteLine(message, category);
                    Trace.Flush();
1184
1185
1186
1187
1188
1189
1190
























1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205

1206
1207
1208
1209
1210
1211
1212
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409

1410
1411
1412
1413
1414
1415
1416
1417







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+














-
+







                //       should be just like calling Dispose.
                //
                Dispose(true);
            }

            ///////////////////////////////////////////////////////////////////

            public void DisableClose()
            {
                CheckDisposed();

                noClose = true;
            }

            ///////////////////////////////////////////////////////////////////

            public MockRegistryKey Clone(
                bool whatIf,
                bool readOnly,
                bool safe
                )
            {
                CheckDisposed();

                return new MockRegistryKey(
                    key, this.whatIf || whatIf, this.readOnly || readOnly,
                    this.safe || safe);
            }

            ///////////////////////////////////////////////////////////////////

            public MockRegistryKey CreateSubKey(
                string subKeyName
                )
            {
                CheckDisposed();
                CheckReadOnly();

                if (key == null)
                    return null;

                if (whatIf)
                {
                    //
                    // HACK: Attempt to open the specified sub-key.  If this
                    //       fails, we will simply return the wrapped root key
                    //       fails, we'll simply return the wrapped root key
                    //       itself since no writes are allowed in "what-if"
                    //       mode anyhow.
                    //
                    RegistryKey subKey = key.OpenSubKey(subKeyName);

                    if (subKey != null)
                    {
1421
1422
1423
1424
1425
1426
1427








1428
1429
1430
1431
1432
1433
1434
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647







+
+
+
+
+
+
+
+







            ///////////////////////////////////////////////////////////////////

            public bool safe;
            public bool Safe
            {
                get { CheckDisposed(); return safe; }
            }

            ///////////////////////////////////////////////////////////////////

            public bool noClose;
            public bool NoClose
            {
                get { CheckDisposed(); return noClose; }
            }
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region Private Methods
            private void CheckReadOnly()
            {
1462
1463
1464
1465
1466
1467
1468




















































































































































































































1469
1470
1471
1472
1473
1474
1475
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
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
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







            public override string ToString()
            {
                CheckDisposed();

                return this.Name;
            }
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region Public Static Methods
            public static bool NameEquals(
                string name1,
                string name2
                )
            {
                return String.Equals(
                    name1, name2, StringComparison.OrdinalIgnoreCase);
            }

            ///////////////////////////////////////////////////////////////////

            public static bool ValueEquals(
                object value1,
                object value2
                )
            {
                if ((value1 == null) || (value2 == null))
                    return ((value1 == null) && (value2 == null));

                if (Object.ReferenceEquals(value1, value2))
                    return true;

                Type type1 = value1.GetType();
                Type type2 = value2.GetType();

                if (!Object.ReferenceEquals(type1, type2))
                    return false;

                if (type1 == typeof(int)) // DWord
                {
                    return ((int)value1 == (int)value2);
                }
                else if (type1 == typeof(long)) // QWord
                {
                    return ((long)value1 == (long)value2);
                }
                else if (type1 == typeof(string)) // String / ExpandString
                {
                    return String.Equals(
                        (string)value1, (string)value2,
                        StringComparison.Ordinal);
                }
                else if (type1 == typeof(string[])) // MultiString
                {
                    string[] array1 = (string[])value1;
                    string[] array2 = (string[])value2;

                    int length1 = array1.Length;

                    if (length1 != array2.Length)
                        return false;

                    for (int index1 = 0; index1 < length1; index1++)
                    {
                        if (!String.Equals(
                                array1[index1], array2[index1],
                                StringComparison.Ordinal))
                        {
                            return false;
                        }
                    }

                    return true;
                }
                else if (type1 == typeof(byte[])) // Binary
                {
                    byte[] array1 = (byte[])value1;
                    byte[] array2 = (byte[])value2;

                    int length1 = array1.Length;

                    if (length1 != array2.Length)
                        return false;

                    for (int index1 = 0; index1 < length1; index1++)
                        if (array1[index1] != array2[index1])
                            return false;

                    return true;
                }

                return false;
            }

            ///////////////////////////////////////////////////////////////////

            public static int ValueHashCode(
                object value
                )
            {
                int result = 0;

                if (value != null)
                {
                    Type type = value.GetType();

                    if ((type == typeof(int)) || // DWord
                        (type == typeof(long)) || // QWord
                        (type == typeof(string))) // String / ExpandString
                    {
                        result = value.GetHashCode();
                    }
                    else if ((type == typeof(string[])) || // MultiString
                        (type == typeof(byte[]))) // Binary
                    {
                        Array array = (Array)value;
                        int length = array.Length;

                        for (int index = 0; index < length; index++)
                        {
                            object element = array.GetValue(index);

                            if (element == null)
                                continue;

                            result ^= element.GetHashCode();
                        }
                    }
                }

                return result;
            }

            ///////////////////////////////////////////////////////////////////

            public static string ValueToString(
                object value,
                string delimiter,
                string nullValue
                )
            {
                string result = null;

                if (value != null)
                {
                    Type type = value.GetType();

                    if ((type == typeof(int)) || // DWord
                        (type == typeof(long)) || // QWord
                        (type == typeof(string))) // String / ExpandString
                    {
                        result = value.ToString();
                    }
                    else if ((type == typeof(string[])) || // MultiString
                        (type == typeof(byte[]))) // Binary
                    {
                        StringBuilder builder = new StringBuilder();
                        Array array = (Array)value;
                        int length = array.Length;

                        for (int index = 0; index < length; index++)
                        {
                            if ((index > 0) && (delimiter != null))
                                builder.Append(delimiter);

                            object element = array.GetValue(index);

                            if (element == null)
                            {
                                if (nullValue != null)
                                    builder.Append(nullValue);

                                continue;
                            }

                            builder.Append(element.ToString());
                        }

                        result = builder.ToString();
                    }
                }

                return result;
            }

            ///////////////////////////////////////////////////////////////////

            public static bool Equals(
                MockRegistryKey key1,
                MockRegistryKey key2
                )
            {
                if ((key1 == null) || (key2 == null))
                    return ((key1 == null) && (key2 == null));

                if (Object.ReferenceEquals(key1, key2))
                    return true;

                return NameEquals(key1.Name, key2.Name);
            }

            ///////////////////////////////////////////////////////////////////

            public static int GetHashCode(
                MockRegistryKey key
                )
            {
                if (key != null)
                {
                    string name = key.Name;

                    if (name != null)
                        return name.GetHashCode();
                }

                return 0;
            }
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region Implicit Conversion Operators
            //
            // BUGBUG: Remove me?  This should be safe because in "what-if"
            //         mode all keys are opened read-only.
1507
1508
1509
1510
1511
1512
1513

1514


1515
1516
1517
1518
1519
1520
1521
1932
1933
1934
1935
1936
1937
1938
1939

1940
1941
1942
1943
1944
1945
1946
1947
1948







+
-
+
+







                    {
                        ////////////////////////////////////
                        // dispose managed resources here...
                        ////////////////////////////////////

                        if (key != null)
                        {
                            if (!noClose)
                            key.Close();
                                key.Close();

                            key = null;
                        }
                    }

                    //////////////////////////////////////
                    // release unmanaged resources here...
                    //////////////////////////////////////
1602
1603
1604
1605
1606
1607
1608
















1609
1610
1611
1612
1613
1614
1615
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







        };
        #endregion

        ///////////////////////////////////////////////////////////////////////

        private static class RegistryHelper
        {
            #region Private Data
            //
            // NOTE: This is used to synchronize access to the list of logged
            //       registry operations (just below).
            //
            private static object syncRoot = new object();

            //
            // NOTE: This is the list of registry write operations when it is
            //       set to non-null.
            //
            private static RegistryOperationList operationList;
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region Public Static Properties
            private static MockRegistry readOnlyRegistry;
            public static MockRegistry ReadOnlyRegistry
            {
                get { return readOnlyRegistry; }
            }

1661
1662
1663
1664
1665
1666
1667





















1668
1669
1670
1671
1672
1673
1674
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







                get { return keyValuesDeleted; }
            }
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region Public Static Methods
            public static void EnableOrDisableOperationList(
                bool enable
                )
            {
                lock (syncRoot) /* TRANSACTIONAL */
                {
                    if (enable)
                    {
                        if (operationList == null)
                            operationList = new RegistryOperationList();
                    }
                    else if (operationList != null)
                    {
                        operationList.Dispose();
                        operationList = null;
                    }
                }
            }

            ///////////////////////////////////////////////////////////////////

            public static void ReinitializeDefaultRegistries(
                bool whatIf,
                bool safe
                )
            {
                if (readOnlyRegistry != null)
                {
1710
1711
1712
1713
1714
1715
1716
1717
1718


1719
1720
1721


1722
1723
1724
1725
1726
1727


1728
1729
1730


1731
1732
1733
1734
1735
1736


1737
1738
1739


1740
1741
1742
1743
1744
1745


1746
1747
1748


1749
1750
1751
1752
1753
1754


1755
1756
1757


1758
1759
1760
1761
1762
1763


1764
1765
1766


1767
1768
1769
1770
1771
1772


1773
1774
1775


1776
1777
1778
1779
1780
1781
1782
1783
2174
2175
2176
2177
2178
2179
2180


2181
2182



2183
2184

2185
2186
2187


2188
2189



2190
2191

2192
2193
2194


2195
2196



2197
2198

2199
2200
2201


2202
2203



2204
2205

2206
2207
2208


2209
2210



2211
2212

2213
2214
2215


2216
2217



2218
2219

2220
2221
2222


2223
2224



2225
2226

2227
2228
2229
2230
2231
2232
2233







-
-
+
+
-
-
-
+
+
-



-
-
+
+
-
-
-
+
+
-



-
-
+
+
-
-
-
+
+
-



-
-
+
+
-
-
-
+
+
-



-
-
+
+
-
-
-
+
+
-



-
-
+
+
-
-
-
+
+
-



-
-
+
+
-
-
-
+
+
-







                MockRegistry registry,
                string name
                )
            {
                if (registry == null)
                    return null;

                if (String.Equals(
                        name, RegistryRootKeyNames.HKEY_CLASSES_ROOT,
                if (MockRegistryKey.NameEquals(
                        name, RegistryRootKeyNames.HKEY_CLASSES_ROOT) ||
                        StringComparison.OrdinalIgnoreCase) ||
                    String.Equals(
                        name, RegistryRootKeyNames.HKCR,
                    MockRegistryKey.NameEquals(
                        name, RegistryRootKeyNames.HKCR))
                        StringComparison.OrdinalIgnoreCase))
                {
                    return registry.ClassesRoot;
                }
                else if (String.Equals(
                        name, RegistryRootKeyNames.HKEY_CURRENT_CONFIG,
                else if (MockRegistryKey.NameEquals(
                        name, RegistryRootKeyNames.HKEY_CURRENT_CONFIG) ||
                        StringComparison.OrdinalIgnoreCase) ||
                    String.Equals(
                        name, RegistryRootKeyNames.HKCC,
                    MockRegistryKey.NameEquals(
                        name, RegistryRootKeyNames.HKCC))
                        StringComparison.OrdinalIgnoreCase))
                {
                    return registry.CurrentConfig;
                }
                else if (String.Equals(
                        name, RegistryRootKeyNames.HKEY_CURRENT_USER,
                else if (MockRegistryKey.NameEquals(
                        name, RegistryRootKeyNames.HKEY_CURRENT_USER) ||
                        StringComparison.OrdinalIgnoreCase) ||
                    String.Equals(
                        name, RegistryRootKeyNames.HKCU,
                    MockRegistryKey.NameEquals(
                        name, RegistryRootKeyNames.HKCU))
                        StringComparison.OrdinalIgnoreCase))
                {
                    return registry.CurrentUser;
                }
                else if (String.Equals(
                        name, RegistryRootKeyNames.HKEY_DYN_DATA,
                else if (MockRegistryKey.NameEquals(
                        name, RegistryRootKeyNames.HKEY_DYN_DATA) ||
                        StringComparison.OrdinalIgnoreCase) ||
                    String.Equals(
                        name, RegistryRootKeyNames.HKDD,
                    MockRegistryKey.NameEquals(
                        name, RegistryRootKeyNames.HKDD))
                        StringComparison.OrdinalIgnoreCase))
                {
                    return registry.DynData;
                }
                else if (String.Equals(
                        name, RegistryRootKeyNames.HKEY_LOCAL_MACHINE,
                else if (MockRegistryKey.NameEquals(
                        name, RegistryRootKeyNames.HKEY_LOCAL_MACHINE) ||
                        StringComparison.OrdinalIgnoreCase) ||
                    String.Equals(
                        name, RegistryRootKeyNames.HKLM,
                    MockRegistryKey.NameEquals(
                        name, RegistryRootKeyNames.HKLM))
                        StringComparison.OrdinalIgnoreCase))
                {
                    return registry.LocalMachine;
                }
                else if (String.Equals(
                        name, RegistryRootKeyNames.HKEY_PERFORMANCE_DATA,
                else if (MockRegistryKey.NameEquals(
                        name, RegistryRootKeyNames.HKEY_PERFORMANCE_DATA) ||
                        StringComparison.OrdinalIgnoreCase) ||
                    String.Equals(
                        name, RegistryRootKeyNames.HKPD,
                    MockRegistryKey.NameEquals(
                        name, RegistryRootKeyNames.HKPD))
                        StringComparison.OrdinalIgnoreCase))
                {
                    return registry.PerformanceData;
                }
                else if (String.Equals(
                        name, RegistryRootKeyNames.HKEY_USERS,
                else if (MockRegistryKey.NameEquals(
                        name, RegistryRootKeyNames.HKEY_USERS) ||
                        StringComparison.OrdinalIgnoreCase) ||
                    String.Equals(
                        name, RegistryRootKeyNames.HKU,
                    MockRegistryKey.NameEquals(
                        name, RegistryRootKeyNames.HKU))
                        StringComparison.OrdinalIgnoreCase))
                {
                    return registry.Users;
                }

                return null;
            }

1935
1936
1937
1938
1939
1940
1941


1942
1943
1944
1945
1946
1947
1948
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400







+
+







                        return new MockRegistryKey(
                            rootKey.CreateSubKey(subKeyName), whatIf, false,
                            false);
                    }
                }
                finally
                {
                    MaybeLogOperation(GetMethodName(), rootKey, subKeyName);

                    subKeysCreated++;
                }
            }

            ///////////////////////////////////////////////////////////////////

            [MethodImpl(MethodImplOptions.NoInlining)]
1965
1966
1967
1968
1969
1970
1971


1972
1973
1974
1975
1976
1977
1978
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432







+
+








                if (rootKey == null)
                    return;

                if (!whatIf)
                    rootKey.DeleteSubKey(subKeyName, throwOnMissing);

                MaybeLogOperation(GetMethodName(), rootKey, subKeyName);

                subKeysDeleted++;
            }

            ///////////////////////////////////////////////////////////////////

            [MethodImpl(MethodImplOptions.NoInlining)]
            public static void DeleteSubKeyTree(
1992
1993
1994
1995
1996
1997
1998


1999
2000
2001
2002
2003
2004
2005
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461







+
+







                }

                if (rootKey == null)
                    return;

                if (!whatIf)
                    rootKey.DeleteSubKeyTree(subKeyName);

                MaybeLogOperation(GetMethodName(), rootKey, subKeyName);

                subKeysDeleted++;
            }

            ///////////////////////////////////////////////////////////////////

            [MethodImpl(MethodImplOptions.NoInlining)]
2074
2075
2076
2077
2078
2079
2080


2081
2082
2083
2084
2085
2086
2087
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545







+
+








                if (key == null)
                    return;

                if (!whatIf)
                    key.SetValue(name, value);

                MaybeLogOperation(GetMethodName(), key, name, value);

                keyValuesWritten++;
            }

            ///////////////////////////////////////////////////////////////////

            [MethodImpl(MethodImplOptions.NoInlining)]
            public static void DeleteValue(
2102
2103
2104
2105
2106
2107
2108


2109
2110



















































































































































































































































































































































































































































































2111
2112
2113
2114
2115
2116
2117
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044







+
+


+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+








                if (key == null)
                    return;

                if (!whatIf)
                    key.DeleteValue(name, throwOnMissing);

                MaybeLogOperation(GetMethodName(), key, name, null);

                keyValuesDeleted++;
            }

            ///////////////////////////////////////////////////////////////////

            [MethodImpl(MethodImplOptions.NoInlining)]
            public static int WriteOperationList(
                string fileName,
                bool verbose
                )
            {
                int count = 0;

                if (String.IsNullOrEmpty(fileName))
                {
                    if (verbose)
                    {
                        TraceOps.DebugAndTrace(TracePriority.Highest,
                            debugCallback, traceCallback,
                            "Registry operation log file name not set.",
                            traceCategory);
                    }

                    return count;
                }

                lock (syncRoot) /* TRANSACTIONAL */
                {
                    if (operationList == null)
                    {
                        if (verbose)
                        {
                            TraceOps.DebugAndTrace(TracePriority.Highest,
                                debugCallback, traceCallback,
                                "Registry operation list is invalid.",
                                traceCategory);
                        }

                        return count;
                    }

                    using (StreamWriter streamWriter = new StreamWriter(
                            fileName))
                    {
                        foreach (RegistryOperation operation in operationList)
                        {
                            if (operation == null)
                                continue;

                            streamWriter.WriteLine(operation.ToString());
                            count++;
                        }

                        streamWriter.Flush();
                    }
                }

                if (verbose)
                {
                    TraceOps.DebugAndTrace(TracePriority.Highest,
                        debugCallback, traceCallback, String.Format(
                        "Wrote {0} registry operations to its log file.",
                        count), traceCategory);
                }

                return count;
            }
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region Private Static Methods
            [MethodImpl(MethodImplOptions.NoInlining)]
            private static string GetMethodName()
            {
                return TraceOps.GetMethodName(null, 1);
            }

            ///////////////////////////////////////////////////////////////////

            private static void MaybeLogOperation(
                string methodName,
                MockRegistryKey key,
                string subKeyName
                )
            {
                MaybeLogOperation(methodName, key, subKeyName, null, null);
            }

            ///////////////////////////////////////////////////////////////////

            private static void MaybeLogOperation(
                string methodName,
                MockRegistryKey key,
                string valueName,
                object value
                )
            {
                MaybeLogOperation(methodName, key, null, valueName, value);
            }

            ///////////////////////////////////////////////////////////////////

            private static void MaybeLogOperation(
                string methodName,
                MockRegistryKey key,
                string subKeyName,
                string valueName,
                object value
                )
            {
                lock (syncRoot) /* TRANSACTIONAL */
                {
                    if (operationList == null)
                        return;

                    if (methodName != null)
                    {
                        string typePrefix = String.Format(
                            "{0}{1}", typeof(RegistryHelper).Name,
                            Type.Delimiter);

                        if (methodName.StartsWith(
                                typePrefix, StringComparison.Ordinal))
                        {
                            methodName = methodName.Substring(
                                typePrefix.Length);
                        }
                    }

                    operationList.Add(new RegistryOperation(
                        methodName, key, subKeyName, valueName, value));
                }
            }
            #endregion
        }
        #endregion

        ///////////////////////////////////////////////////////////////////////

        #region RegistryOperationList Class
        [Serializable()]
        private sealed class RegistryOperationList :
            List<RegistryOperation>, IDisposable
        {
            #region Public Constructors
            public RegistryOperationList()
            {
                // do nothing.
            }
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region IDisposable "Pattern" Members
            private bool disposed;
            private void CheckDisposed() /* throw */
            {
                if (!disposed)
                    return;

                throw new ObjectDisposedException(
                    typeof(RegistryOperationList).Name);
            }

            ///////////////////////////////////////////////////////////////////

            private /* protected virtual */ void Dispose(
                bool disposing
                )
            {
                if (!disposed)
                {
                    if (disposing)
                    {
                        ////////////////////////////////////
                        // dispose managed resources here...
                        ////////////////////////////////////

                        foreach (RegistryOperation operation in this)
                        {
                            if (operation == null)
                                continue;

                            operation.Dispose();
                        }

                        Clear();
                    }

                    //////////////////////////////////////
                    // release unmanaged resources here...
                    //////////////////////////////////////

                    //
                    // NOTE: This object is now disposed.
                    //
                    disposed = true;
                }
            }
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region IDisposable Members
            public void Dispose()
            {
                Dispose(true);
                GC.SuppressFinalize(this);
            }
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region Destructor
            ~RegistryOperationList()
            {
                Dispose(false);
            }
            #endregion
        }
        #endregion

        ///////////////////////////////////////////////////////////////////////

        #region RegistryOperation Class
        private sealed class RegistryOperation
        {
            #region Private Constants
            private const char FieldDelimiter = '\t';
            private const string ListElementDelimiter = ", ";
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region Public Constructors
            public RegistryOperation(
                string methodName,
                MockRegistryKey key,
                string subKeyName,
                string valueName,
                object value
                )
            {
                this.methodName = methodName;
                this.subKeyName = subKeyName;
                this.valueName = valueName;
                this.value = value;

                SetKey(key);
            }
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region Private Methods
            private void SetKey(
                MockRegistryKey key
                )
            {
                if (key != null)
                {
                    //
                    // NOTE: Make sure this copy of the root registry key
                    //       cannot be used to accidentally make registry
                    //       changes.  Also, prevent this MockRegistryKey
                    //       object from closing its underlying registry
                    //       key as we will need it later.  This instance
                    //       will close it.
                    //
                    this.key = key.Clone(true, true, true);

                    key.DisableClose();
                }
                else
                {
                    this.key = null;
                }
            }
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region Public Properties
            private string methodName;
            public string MethodName
            {
                get { CheckDisposed(); return methodName; }
            }

            ///////////////////////////////////////////////////////////////////

            private MockRegistryKey key;
            public MockRegistryKey Key
            {
                get { CheckDisposed(); return key; }
            }

            ///////////////////////////////////////////////////////////////////

            private string subKeyName;
            public string SubKeyName
            {
                get { CheckDisposed(); return subKeyName; }
            }

            ///////////////////////////////////////////////////////////////////

            private string valueName;
            public string ValueName
            {
                get { CheckDisposed(); return valueName; }
            }

            ///////////////////////////////////////////////////////////////////

            private object value;
            public object Value
            {
                get { CheckDisposed(); return value; }
            }
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region System.Object Overrides
            public override bool Equals(
                object obj
                )
            {
                CheckDisposed();

                RegistryOperation operation = obj as RegistryOperation;

                if (operation == null)
                    return false;

                if (!String.Equals(operation.methodName, methodName))
                    return false;

                if (!MockRegistryKey.Equals(operation.key, key))
                    return false;

                if (!MockRegistryKey.NameEquals(
                        operation.subKeyName, subKeyName))
                {
                    return false;
                }

                if (!String.Equals(operation.valueName, valueName))
                    return false;

                if (!MockRegistryKey.ValueEquals(operation.value, value))
                    return false;

                return true;
            }

            ///////////////////////////////////////////////////////////////////

            public override int GetHashCode()
            {
                CheckDisposed();

                int result = 0;

                if (methodName != null)
                    result ^= methodName.GetHashCode();

                result ^= MockRegistryKey.GetHashCode(key);

                if (subKeyName != null)
                    result ^= subKeyName.GetHashCode();

                if (valueName != null)
                    result ^= valueName.GetHashCode();

                result ^= MockRegistryKey.ValueHashCode(value);

                return result;
            }

            ///////////////////////////////////////////////////////////////////

            public override string ToString()
            {
                CheckDisposed();

                StringBuilder builder = new StringBuilder();

                builder.Append(ForDisplay(methodName));
                builder.Append(FieldDelimiter);
                builder.Append(ForDisplay(key));
                builder.Append(FieldDelimiter);
                builder.Append(ForDisplay(subKeyName));
                builder.Append(FieldDelimiter);
                builder.Append(ForDisplay(valueName));
                builder.Append(FieldDelimiter);

                builder.Append(ForDisplay(MockRegistryKey.ValueToString(
                    value, ListElementDelimiter, DisplayNull)));

                return builder.ToString();
            }
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region IDisposable "Pattern" Members
            private bool disposed;
            private void CheckDisposed() /* throw */
            {
                if (!disposed)
                    return;

                throw new ObjectDisposedException(
                    typeof(RegistryOperation).Name);
            }

            ///////////////////////////////////////////////////////////////////

            private /* protected virtual */ void Dispose(
                bool disposing
                )
            {
                if (!disposed)
                {
                    if (disposing)
                    {
                        ////////////////////////////////////
                        // dispose managed resources here...
                        ////////////////////////////////////

                        if (key != null)
                        {
                            key.Close();
                            key = null;
                        }
                    }

                    //////////////////////////////////////
                    // release unmanaged resources here...
                    //////////////////////////////////////

                    //
                    // NOTE: This object is now disposed.
                    //
                    disposed = true;
                }
            }
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region IDisposable Members
            public void Dispose()
            {
                Dispose(true);
                GC.SuppressFinalize(this);
            }
            #endregion

            ///////////////////////////////////////////////////////////////////

            #region Destructor
            ~RegistryOperation()
            {
                Dispose(false);
            }
            #endregion
        }
        #endregion

        ///////////////////////////////////////////////////////////////////////

        #region StringList Class
2330
2331
2332
2333
2334
2335
2336

2337
2338
2339
2340
2341
2342
2343
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271







+








            ///////////////////////////////////////////////////////////////////

            #region Private Constructors
            private Configuration(
                Assembly assembly,
                string logFileName,
                string registryLogFileName,
                string directory,
                string coreFileName,
                string linqFileName,
                string ef6FileName,
                string designerFileName,
                string registryVersion,
                string configVersion,
2360
2361
2362
2363
2364
2365
2366

2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385

2386
2387
2388
2389
2390
2391
2392
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322







+



















+







                bool noNetFx45,
                bool noNetFx451,
                bool noNetFx452,
                bool noNetFx46,
                bool noNetFx461,
                bool noNetFx462,
                bool noNetFx47,
                bool noNetFx471,
                bool noVs2005,
                bool noVs2008,
                bool noVs2010,
                bool noVs2012,
                bool noVs2013,
                bool noVs2015,
                bool noVs2017,
                bool noTrace,
                bool noConsole,
                bool noLog,
                bool throwOnMissing,
                bool whatIf,
                bool debug,
                bool verbose,
                bool confirm
                )
            {
                this.assembly = assembly;
                this.logFileName = logFileName;
                this.registryLogFileName = registryLogFileName;
                this.directory = directory;
                this.coreFileName = coreFileName;
                this.linqFileName = linqFileName;
                this.ef6FileName = ef6FileName;
                this.designerFileName = designerFileName;
                this.registryVersion = registryVersion;
                this.configVersion = configVersion;
2409
2410
2411
2412
2413
2414
2415

2416
2417
2418
2419
2420
2421
2422
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353







+







                this.noNetFx45 = noNetFx45;
                this.noNetFx451 = noNetFx451;
                this.noNetFx452 = noNetFx452;
                this.noNetFx46 = noNetFx46;
                this.noNetFx461 = noNetFx461;
                this.noNetFx462 = noNetFx462;
                this.noNetFx47 = noNetFx47;
                this.noNetFx471 = noNetFx471;
                this.noVs2005 = noVs2005;
                this.noVs2008 = noVs2008;
                this.noVs2010 = noVs2010;
                this.noVs2012 = noVs2012;
                this.noVs2013 = noVs2013;
                this.noVs2015 = noVs2015;
                this.noVs2017 = noVs2017;
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614



2615
2616
2617
2618
2619
2620

2621
2622
2623
2624
2625
2626
2627
3536
3537
3538
3539
3540
3541
3542



3543
3544
3545
3546
3547
3548
3549
3550

3551
3552
3553
3554
3555
3556
3557
3558







-
-
-
+
+
+





-
+







                string designerFileName = null;

                GetDefaultFileNames(
                    ref directory, ref coreFileName, ref linqFileName,
                    ref ef6FileName, ref designerFileName);

                return new Configuration(
                    thisAssembly, null, directory, coreFileName, linqFileName,
                    ef6FileName, designerFileName, null, null, null,
                    TraceOps.DebugFormat, TraceOps.TraceFormat,
                    thisAssembly, null, null, directory, coreFileName,
                    linqFileName, ef6FileName, designerFileName, null, null,
                    null, TraceOps.DebugFormat, TraceOps.TraceFormat,
                    InstallFlags.Default, ProviderFlags.Default,
                    TracePriority.Default, TracePriority.Default, false, true,
                    false, false, false, false, false, false, false, false,
                    false, false, false, false, false, false, false, false,
                    false, false, false, false, false, false, false, false,
                    true, true, false, false, false);
                    false, true, true, false, false, false);
            }

            ///////////////////////////////////////////////////////////////////

            [MethodImpl(MethodImplOptions.NoInlining)]
            public static bool FromArgs(
                string[] args,
3215
3216
3217
3218
3219
3220
3221





















3222
3223
3224
3225
3226
3227
3228
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







                                if (strict)
                                    return false;

                                continue;
                            }

                            configuration.noNetFx47 = (bool)value;
                        }
                        else if (MatchOption(newArg, "noNetFx471"))
                        {
                            bool? value = ParseBoolean(text);

                            if (value == null)
                            {
                                error = TraceOps.DebugAndTrace(
                                    TracePriority.Lowest, debugCallback,
                                    traceCallback, String.Format(
                                    "Invalid {0} boolean value: {1}",
                                    ForDisplay(arg), ForDisplay(text)),
                                    traceCategory);

                                if (strict)
                                    return false;

                                continue;
                            }

                            configuration.noNetFx471 = (bool)value;
                        }
                        else if (MatchOption(newArg, "noRuntimeVersion"))
                        {
                            bool? value = ParseBoolean(text);

                            if (value == null)
                            {
3447
3448
3449
3450
3451
3452
3453




3454
3455
3456
3457
3458
3459
3460
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416







+
+
+
+







                                if (strict)
                                    return false;

                                continue;
                            }

                            configuration.providerFlags = (ProviderFlags)value;
                        }
                        else if (MatchOption(newArg, "registryLogFileName"))
                        {
                            configuration.registryLogFileName = text;
                        }
                        else if (MatchOption(newArg, "registryVersion"))
                        {
                            configuration.registryVersion = text;
                        }
                        else if (MatchOption(newArg, "strict"))
                        {
3760
3761
3762
3763
3764
3765
3766



















3767
3768
3769
3770
3771
3772
3773
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







                    {
                        TraceOps.DebugAndTrace(TracePriority.MediumHigh,
                            debugCallback, traceCallback,
                            "No actual changes will be made to this " +
                            "system because \"what-if\" mode is enabled.",
                            traceCategory);
                    }

                    //
                    // NOTE: If the registry log file name has been set, its
                    //       value will be used verbatim as the place where
                    //       all registry write operations will (eventually)
                    //       be logged.  Make sure the registry helper class
                    //       has a valid operation list; otherwise, it will
                    //       not perform any logging.
                    //
                    if (configuration.registryLogFileName != null)
                    {
                        RegistryHelper.EnableOrDisableOperationList(true);

                        TraceOps.DebugAndTrace(TracePriority.MediumHigh,
                            debugCallback, traceCallback, String.Format(
                            "Registry logging to file {0} enabled.",
                            ForDisplay(configuration.registryLogFileName)),
                            traceCategory);
                    }

                    //
                    // NOTE: If the command line has not been manually
                    //       confirmed (i.e. via the explicit command line
                    //       option), then stop processing now.  We enforce
                    //       this rule so that simply double-clicking the
                    //       executable will not result in any changes being
3866
3867
3868
3869
3870
3871
3872

3873
3874
3875
3876
3877
3878
3879
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855







+







                        configuration.noNetFx45 = true;
                        configuration.noNetFx451 = true;
                        configuration.noNetFx452 = true;
                        configuration.noNetFx46 = true;
                        configuration.noNetFx461 = true;
                        configuration.noNetFx462 = true;
                        configuration.noNetFx47 = true;
                        configuration.noNetFx471 = true;
                        configuration.noVs2010 = true;
                        configuration.noVs2012 = true;
                        configuration.noVs2013 = true;
                        configuration.noVs2015 = true;
                        configuration.noVs2017 = true;

                        TraceOps.DebugAndTrace(TracePriority.Medium,
4067
4068
4069
4070
4071
4072
4073
4074


4075
4076
4077
4078
4079
4080
4081
5043
5044
5045
5046
5047
5048
5049

5050
5051
5052
5053
5054
5055
5056
5057
5058







-
+
+







                // NOTE: Return non-zero if the System.Data.SQLite.Linq
                //       assembly should be processed during the install.
                //       If the target is Visual Studio 2005, this must
                //       return zero.
                //
                return !noNetFx35 || !noNetFx40 || !noNetFx45 ||
                    !noNetFx451 || !noNetFx452 || !noNetFx46 ||
                    !noNetFx461 || !noNetFx462 || !noNetFx47;
                    !noNetFx461 || !noNetFx462 || !noNetFx47 ||
                    !noNetFx471;
            }

            ///////////////////////////////////////////////////////////////////

            public bool IsEf6Supported(
                bool trace
                )
4120
4121
4122
4123
4124
4125
4126
4127

4128
4129
4130
4131
4132
4133
4134
5097
5098
5099
5100
5101
5102
5103

5104
5105
5106
5107
5108
5109
5110
5111







-
+







                // NOTE: Return non-zero if the System.Data.SQLite.EF6
                //       assembly should be processed during the install.
                //       If the target is Visual Studio 2005 or Visual
                //       Studio 2008, this must return zero.
                //
                if (noNetFx40 &&
                    noNetFx45 && noNetFx451 && noNetFx452 && noNetFx46 &&
                    noNetFx461 && noNetFx462 && noNetFx47)
                    noNetFx461 && noNetFx462 && noNetFx47 && noNetFx471)
                {
                    return false;
                }

                //
                // NOTE: Also, if the EF6 core assembly is unavailable, this
                //       must return zero.
4293
4294
4295
4296
4297
4298
4299





4300
4301
4302
4303
4304
4305
4306
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288







+
+
+
+
+







                    traceCallback(String.Format(NameAndValueFormat,
                        "Assembly", ForDisplay(assembly)),
                        traceCategory);

                    traceCallback(String.Format(NameAndValueFormat,
                        "LogFileName", ForDisplay(logFileName)),
                        traceCategory);

                    traceCallback(String.Format(NameAndValueFormat,
                        "RegistryLogFileName",
                        ForDisplay(registryLogFileName)),
                        traceCategory);

                    traceCallback(String.Format(NameAndValueFormat,
                        "Directory", ForDisplay(directory)),
                        traceCategory);

                    traceCallback(String.Format(NameAndValueFormat,
                        "CoreFileName", ForDisplay(coreFileName)),
4413
4414
4415
4416
4417
4418
4419




4420
4421
4422
4423
4424
4425
4426
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412







+
+
+
+







                    traceCallback(String.Format(NameAndValueFormat,
                        "NoNetFx462", ForDisplay(noNetFx462)),
                        traceCategory);

                    traceCallback(String.Format(NameAndValueFormat,
                        "NoNetFx47", ForDisplay(noNetFx47)),
                        traceCategory);

                    traceCallback(String.Format(NameAndValueFormat,
                        "NoNetFx471", ForDisplay(noNetFx471)),
                        traceCategory);

                    traceCallback(String.Format(NameAndValueFormat,
                        "NoVs2005", ForDisplay(noVs2005)),
                        traceCategory);

                    traceCallback(String.Format(NameAndValueFormat,
                        "NoVs2008", ForDisplay(noVs2008)),
4634
4635
4636
4637
4638
4639
4640









4641
4642
4643
4644
4645
4646
4647
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642







+
+
+
+
+
+
+
+
+








            private string logFileName;
            public string LogFileName
            {
                get { return logFileName; }
                set { logFileName = value; }
            }

            ///////////////////////////////////////////////////////////////////

            private string registryLogFileName;
            public string RegistryLogFileName
            {
                get { return registryLogFileName; }
                set { registryLogFileName = value; }
            }

            ///////////////////////////////////////////////////////////////////

            private string directory;
            public string Directory
            {
                get { return directory; }
4907
4908
4909
4910
4911
4912
4913









4914
4915
4916
4917
4918
4919
4920
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924







+
+
+
+
+
+
+
+
+







            {
                get { return noNetFx47; }
                set { noNetFx47 = value; }
            }

            ///////////////////////////////////////////////////////////////////

            private bool noNetFx471;
            public bool NoNetFx471
            {
                get { return noNetFx471; }
                set { noNetFx471 = value; }
            }

            ///////////////////////////////////////////////////////////////////

            private bool noVs2005;
            public bool NoVs2005
            {
                get { return noVs2005; }
                set { noVs2005 = value; }
            }

5150
5151
5152
5153
5154
5155
5156





5157
5158
5159
5160
5161
5162
5163
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172







+
+
+
+
+








        private const string Description =
            ".NET Framework Data Provider for SQLite";
        #endregion

        ///////////////////////////////////////////////////////////////////////

        private const string DisplayNull = "<null>";
        private const string DisplayEmpty = "<empty>";

        ///////////////////////////////////////////////////////////////////////

        private const string CLRv2ImageRuntimeVersion = "v2.0.50727";
        private const string CLRv4ImageRuntimeVersion = "v4.0.30319";

        ///////////////////////////////////////////////////////////////////////

        private const string SystemEf6AssemblyName = "EntityFramework, " +
            "Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
5374
5375
5376
5377
5378
5379
5380
5381

5382
5383
5384
5385
5386
5387
5388
6383
6384
6385
6386
6387
6388
6389

6390
6391
6392
6393
6394
6395
6396
6397







-
+








        #region Generic String Handling
        private static string ForDisplay(
            object value
            )
        {
            if (value == null)
                return "<null>";
                return DisplayNull;

            string result;
            Type type = value.GetType();

            if (type == typeof(XmlElement))
            {
                XmlElement element = (XmlElement)value;
5417
5418
5419
5420
5421
5422
5423






5424
5425
5426
5427
5428
5429

5430
5431
5432
5433
5434
5435
5436
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443

6444
6445
6446
6447
6448
6449
6450
6451







+
+
+
+
+
+





-
+







            }
            else if (type == typeof(DataReceivedEventArgs))
            {
                DataReceivedEventArgs eventArgs = (DataReceivedEventArgs)value;

                result = ForDisplay(eventArgs.Data); /* RECURSIVE */
            }
            else if (type == typeof(MockRegistryKey))
            {
                MockRegistryKey key = (MockRegistryKey)value;

                result = ForDisplay(key.ToString()); /* RECURSIVE */
            }
            else
            {
                result = value.ToString();

                if (result.Length == 0)
                    return "<empty>";
                    return DisplayEmpty;

                if (type.IsSubclassOf(typeof(Exception)))
                {
                    result = String.Format(
                        "{0}{1}{0}", Environment.NewLine, result);
                }
                else if (!type.IsSubclassOf(typeof(ValueType)))
5697
5698
5699
5700
5701
5702
5703








5704
5705
5706
5707
5708
5709
5710
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733







+
+
+
+
+
+
+
+







                    // NOTE: The .NET Framework 4.7 does not have its own
                    //       directory; however, it still may have assembly
                    //       folders for use in Visual Studio, etc.
                    //
                    if ((configuration == null) || !configuration.NoNetFx47)
                        desktopVersionList.Add(new Version(4, 7));

                    //
                    // NOTE: The .NET Framework 4.7.1 does not have its own
                    //       directory; however, it still may have assembly
                    //       folders for use in Visual Studio, etc.
                    //
                    if ((configuration == null) || !configuration.NoNetFx471)
                        desktopVersionList.Add(new Version(4, 7, 1));

                    frameworkList.Versions.Add(".NETFramework",
                        desktopVersionList);
                }

                if ((configuration == null) || !configuration.NoCompact)
                {
                    frameworkList.Versions.Add(".NETCompactFramework",
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591



6592
6593
6594
6595
6596
6597
6598
7605
7606
7607
7608
7609
7610
7611



7612
7613
7614
7615
7616
7617
7618
7619
7620
7621







-
-
-
+
+
+







                "v" + frameworkVersion.ToString() : null;

            //
            // NOTE: This registry key appears to always be 32-bit only
            //       (i.e. probably because it is only used by Visual
            //       Studio, which is currently always 32-bit only).
            //
            return String.Format(GetRootKeyName(perUser, wow64),
                "Microsoft", frameworkName, frameworkVersionString,
                platformName, "AssemblyFoldersEx");
            return RegistryHelper.JoinKeyNames(
                GetRootKeyName(perUser, wow64), "Microsoft", frameworkName,
                frameworkVersionString, platformName, "AssemblyFoldersEx");
        }

        ///////////////////////////////////////////////////////////////////////

        private static bool AddToAssemblyFolders(
            MockRegistryKey rootKey,
            string frameworkName,
8316
8317
8318
8319
8320
8321
8322














8323
8324
8325
8326
8327
8328
8329
9339
9340
9341
9342
9343
9344
9345
9346
9347
9348
9349
9350
9351
9352
9353
9354
9355
9356
9357
9358
9359
9360
9361
9362
9363
9364
9365
9366







+
+
+
+
+
+
+
+
+
+
+
+
+
+







                    TraceOps.DebugAndTrace(TracePriority.MediumHigh,
                        debugCallback, traceCallback, String.Format(
                        "filesCreated = {0}, filesModified = {1}, " +
                        "filesDeleted = {2}", ForDisplay(filesCreated),
                        ForDisplay(filesModified), ForDisplay(filesDeleted)),
                        traceCategory);
                    #endregion

                    ///////////////////////////////////////////////////////////

                    #region Write Registry Log (Optional)
                    //
                    // NOTE: If applicable, write the list of registry write
                    //       operations now.
                    //
                    RegistryHelper.WriteOperationList(
                        configuration.RegistryLogFileName,
                        configuration.Verbose);

                    RegistryHelper.EnableOrDisableOperationList(false);
                    #endregion

                    ///////////////////////////////////////////////////////////

                    TraceOps.DebugAndTrace(TracePriority.MediumHigh,
                        debugCallback, traceCallback, "Success.",
                        traceCategory);

Changes to tools/install/Properties/AssemblyInfo.cs.
24
25
26
27
28
29
30
31
32


24
25
26
27
28
29
30


31
32







-
-
+
+
// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version 
//      Build Number
//      Revision
//
[assembly: AssemblyVersion("1.0.106.0")]
[assembly: AssemblyFileVersion("1.0.106.0")]
[assembly: AssemblyVersion("1.0.107.0")]
[assembly: AssemblyFileVersion("1.0.107.0")]
Changes to www/downloads.wiki.
439
440
441
442
443
444
445
446

447
448

449
450
451
452
453

454
455

456
457
458
459
460
461
462
463

464
465

466
467
468
469
470

471
472
473

474
475
476
477
478
479
480
481
482
483
484
485
486
487

488
489

490
491
492
493
494
495

496
497
498
499
500
501
502
503
504
505
506
507
508

509
510
511
512
513
514
515
516

517
518

519
520
521
522
523
524


525
526
527

528
529
530
531
532
533
534
535
536
537
538
539
540
541

542
543

544
545
546
547
548
549

550
551
552
553

554
555
556
557
558
559
560
561

562
563

564
565
566
567
568
569


570
571
572

573
574
575
576
577
578
579
580
581
582
583
584
585
586

587
588

589
590
591
592
593
594

595
596
597
598
599
600
601
602
603
604
605
606
607

608
609
610
611
612
613
614
615

616
617

618
619
620
621
622
623


624
625
626

627
628
629
630
631
632
633
634
635
636
637
638
639
640

641
642

643
644
645
646
647
648

649
650
651
652

653
654
655
656
657
658
659
660

661
662

663
664
665
666
667
668


669
670
671

672
673
674
675
676
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
704
705

706
707
708
709
710
711
712
713

714
715

716
717
718
719
720
721


722
723
724

725
726
727
728
729
730
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
847
848
849
850

851
852
853
854

855
856
857
858
859
860
861
862

863
864

865
866
867
868
869
870


871
872
873

874
875
876
877
878
879
880
881
882
883
884
885
886
887

888
889

890
891
892
893
894
895

896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914

915
916
917
918
919
920
921
922

923
924

925
926
927
928
929
930


931
932
933

934
935
936
937
938
939
940
941
942
943
944
945
946
947

948
949

950
951
952
953
954
955

956
957
958
959

960
961
962
963
964
965
966
967

968
969

970
971
972
973
974
975


976
977
978

979
980
981
982
983
984
985
986
987
988
989
990
991
992

993
994

995
996
997
998
999
1000

1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013

1014
1015
1016
1017
1018
1019
1020
1021

1022
1023

1024
1025
1026
1027
1028
1029


1030
1031
1032

1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046

1047
1048

1049
1050
1051
1052
1053
1054

1055
1056
1057
1058

1059
1060
1061
1062
1063
1064
1065
1066

1067
1068

1069
1070
1071
1072
1073
1074


1075
1076
1077

1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091

1092
1093

1094
1095
1096
1097
1098
1099


1100
1101
1102

1103
1104
1105
1106
1107
1108
1109
1110

1111
1112

1113
1114
1115
1116
1117

1118
1119
1120

1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134

1135
1136

1137
1138
1139
1140
1141
1142


1143
1144
1145

1146
1147
1148
1149
1150
1151
1152
1153

1154
1155

1156
1157
1158
1159
1160

1161
1162
1163

1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177

1178
1179

1180
1181
1182
1183
1184
1185


1186
1187
1188

1189
1190
1191
1192
1193
1194
1195
1196

1197
1198

1199
1200
1201
1202
1203

1204
1205
1206

1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220

1221
1222

1223
1224
1225
1226
1227
1228


1229
1230
1231

1232
1233
1234
1235
1236
1237
1238
1239

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
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
1304
1305
1306

1307
1308

1309
1310
1311
1312
1313
1314


1315
1316
1317

1318
1319
1320
1321
1322
1323
1324
1325

1326
1327

1328
1329
1330
1331
1332

1333
1334
1335

1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349

1350
1351

1352
1353
1354
1355
1356
1357


1358
1359
1360

1361
1362
1363
1364
1365
1366
1367
1368

1369
1370

1371
1372
1373
1374
1375

1376
1377
1378

1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392

1393
1394

1395
1396
1397
1398
1399
1400


1401
1402
1403

1404
1405
1406
1407
1408
1409
1410
1411

1412
1413

1414
1415
1416
1417
1418

1419
1420
1421

1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435

1436
1437

1438
1439
1440
1441
1442
1443


1444
1445
1446

1447
1448
1449
1450
1451
1452
1453
1454

1455
1456

1457
1458
1459
1460
1461

1462
1463
1464

1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478

1479
1480

1481
1482
1483
1484
1485
1486


1487
1488
1489

1490
1491
1492
1493
1494
1495
1496
1497

1498
1499

1500
1501
1502
1503
1504

1505
1506
1507

1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521

1522
1523

1524
1525
1526
1527
1528
1529


1530
1531
1532

1533
1534
1535
1536
1537
1538
1539
1540

1541
1542

1543
1544
1545
1546
1547

1548
1549
1550

1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564

1565
1566

1567
1568
1569
1570
1571
1572


1573
1574
1575

1576
1577
1578
1579
1580
1581
1582
1583

1584
1585

1586
1587
1588
1589
1590

1591
1592
1593

1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607

1608
1609

1610
1611
1612
1613
1614

1615
1616
1617
1618

1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632

1633
1634

1635
1636
1637
1638
1639
1640


1641
1642
1643

1644
1645
1646
1647
1648
1649
1650
1651

1652
1653

1654
1655
1656
1657
1658

1659
1660
1661
1662

1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676

1677
1678

1679
1680
1681
1682
1683
1684


1685
1686
1687

1688
1689
1690
1691
1692
1693
1694
1695

1696
1697

1698
1699
1700
1701
1702

1703
1704
1705
1706

1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720

1721
1722

1723
1724
1725
1726
1727
1728


1729
1730
1731

1732
1733
1734
1735
1736
1737
1738
1739

1740
1741

1742
1743
1744
1745
1746

1747
1748
1749
1750

1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764

1765
1766

1767
1768
1769
1770
1771
1772


1773
1774
1775

1776
1777
1778
1779
1780
1781
1782
1783

1784
1785

1786
1787
1788
1789
1790

1791
1792
1793
1794

1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
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
1844
1845
1846
1847
1848
1849
1850
1851
1852

1853
1854

1855
1856
1857
1858
1859
1860


1861
1862
1863

1864
1865
1866
1867
1868
1869
1870
1871

1872
1873

1874
1875
1876
1877
1878

1879
1880
1881
1882

1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896

1897
1898

1899
1900
1901
1902
1903
1904


1905
1906
1907

1908
1909
1910
1911
1912
1913
1914
1915

1916
1917

1918
1919
1920
1921
1922

1923
1924
1925
1926

1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940

1941
1942

1943
1944
1945
1946
1947
1948


1949
1950
1951

1952
1953
1954
1955
1956
1957
1958
1959

1960
1961

1962
1963
1964
1965
1966

1967
1968
1969
1970

1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984

1985
1986

1987
1988
1989
1990
1991
1992


1993
1994
1995

1996
1997
1998
1999
2000
2001
2002
2003

2004
2005

2006
2007
2008
2009
2010

2011
2012
2013
2014

2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028

2029
2030

2031
2032
2033
2034
2035
2036


2037
2038
2039

2040
2041
2042
2043
2044
2045
2046
2047

2048
2049

2050
2051
2052
2053
2054

2055
2056
2057
2058

2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072

2073
2074

2075
2076
2077
2078
2079
2080


2081
2082
2083

2084
2085
2086
2087
2088
2089
2090
2091

2092
2093

2094
2095
2096
2097
2098

2099
2100
2101
2102

2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116

2117
2118

2119
2120
2121
2122
2123
2124


2125
2126
2127

2128
2129
2130
2131
2132
2133
2134
2135

2136
2137

2138
2139
2140
2141
2142

2143
2144
2145
2146

2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160

2161
2162

2163
2164
2165
2166
2167

2168
2169
2170
2171
2172

2173
2174
2175
2176
2177
2178
2179
2180

2181
2182

2183
2184
2185
2186
2187

2188
2189
2190

2191
2192
2193
2194
2195
2196
2197
2198

2199
2200

2201
2202
2203
2204
2205

2206
2207
2208

2209
2210
2211
2212
2213
2214
2215
439
440
441
442
443
444
445

446
447

448
449
450
451
452

453
454

455
456
457
458
459
460
461
462

463
464

465
466
467
468
469

470
471
472

473
474
475
476
477
478
479
480
481
482
483
484
485
486

487
488

489
490
491
492
493
494

495
496
497
498
499
500
501
502
503
504
505
506
507

508
509
510
511
512
513
514
515

516
517

518
519
520
521
522


523
524
525
526

527
528
529
530
531
532
533
534
535
536
537
538
539
540

541
542

543
544
545
546
547
548

549
550
551
552

553
554
555
556
557
558
559
560

561
562

563
564
565
566
567


568
569
570
571

572
573
574
575
576
577
578
579
580
581
582
583
584
585

586
587

588
589
590
591
592
593

594
595
596
597
598
599
600
601
602
603
604
605
606

607
608
609
610
611
612
613
614

615
616

617
618
619
620
621


622
623
624
625

626
627
628
629
630
631
632
633
634
635
636
637
638
639

640
641

642
643
644
645
646
647

648
649
650
651

652
653
654
655
656
657
658
659

660
661

662
663
664
665
666


667
668
669
670

671
672
673
674
675
676
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
704

705
706
707
708
709
710
711
712

713
714

715
716
717
718
719


720
721
722
723

724
725
726
727
728
729
730
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
847
848
849

850
851
852
853

854
855
856
857
858
859
860
861

862
863

864
865
866
867
868


869
870
871
872

873
874
875
876
877
878
879
880
881
882
883
884
885
886

887
888

889
890
891
892
893
894

895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913

914
915
916
917
918
919
920
921

922
923

924
925
926
927
928


929
930
931
932

933
934
935
936
937
938
939
940
941
942
943
944
945
946

947
948

949
950
951
952
953
954

955
956
957
958

959
960
961
962
963
964
965
966

967
968

969
970
971
972
973


974
975
976
977

978
979
980
981
982
983
984
985
986
987
988
989
990
991

992
993

994
995
996
997
998
999

1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012

1013
1014
1015
1016
1017
1018
1019
1020

1021
1022

1023
1024
1025
1026
1027


1028
1029
1030
1031

1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045

1046
1047

1048
1049
1050
1051
1052
1053

1054
1055
1056
1057

1058
1059
1060
1061
1062
1063
1064
1065

1066
1067

1068
1069
1070
1071
1072


1073
1074
1075
1076

1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090

1091
1092

1093
1094
1095
1096
1097


1098
1099
1100
1101

1102
1103
1104
1105
1106
1107
1108
1109

1110
1111

1112
1113
1114
1115
1116

1117
1118
1119

1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133

1134
1135

1136
1137
1138
1139
1140


1141
1142
1143
1144

1145
1146
1147
1148
1149
1150
1151
1152

1153
1154

1155
1156
1157
1158
1159

1160
1161
1162

1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176

1177
1178

1179
1180
1181
1182
1183


1184
1185
1186
1187

1188
1189
1190
1191
1192
1193
1194
1195

1196
1197

1198
1199
1200
1201
1202

1203
1204
1205

1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219

1220
1221

1222
1223
1224
1225
1226


1227
1228
1229
1230

1231
1232
1233
1234
1235
1236
1237
1238

1239
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
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
1304
1305

1306
1307

1308
1309
1310
1311
1312


1313
1314
1315
1316

1317
1318
1319
1320
1321
1322
1323
1324

1325
1326

1327
1328
1329
1330
1331

1332
1333
1334

1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348

1349
1350

1351
1352
1353
1354
1355


1356
1357
1358
1359

1360
1361
1362
1363
1364
1365
1366
1367

1368
1369

1370
1371
1372
1373
1374

1375
1376
1377

1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391

1392
1393

1394
1395
1396
1397
1398


1399
1400
1401
1402

1403
1404
1405
1406
1407
1408
1409
1410

1411
1412

1413
1414
1415
1416
1417

1418
1419
1420

1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434

1435
1436

1437
1438
1439
1440
1441


1442
1443
1444
1445

1446
1447
1448
1449
1450
1451
1452
1453

1454
1455

1456
1457
1458
1459
1460

1461
1462
1463

1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477

1478
1479

1480
1481
1482
1483
1484


1485
1486
1487
1488

1489
1490
1491
1492
1493
1494
1495
1496

1497
1498

1499
1500
1501
1502
1503

1504
1505
1506

1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520

1521
1522

1523
1524
1525
1526
1527


1528
1529
1530
1531

1532
1533
1534
1535
1536
1537
1538
1539

1540
1541

1542
1543
1544
1545
1546

1547
1548
1549

1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563

1564
1565

1566
1567
1568
1569
1570


1571
1572
1573
1574

1575
1576
1577
1578
1579
1580
1581
1582

1583
1584

1585
1586
1587
1588
1589

1590
1591
1592

1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606

1607
1608

1609
1610
1611
1612
1613

1614
1615
1616
1617

1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631

1632
1633

1634
1635
1636
1637
1638


1639
1640
1641
1642

1643
1644
1645
1646
1647
1648
1649
1650

1651
1652

1653
1654
1655
1656
1657

1658
1659
1660
1661

1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675

1676
1677

1678
1679
1680
1681
1682


1683
1684
1685
1686

1687
1688
1689
1690
1691
1692
1693
1694

1695
1696

1697
1698
1699
1700
1701

1702
1703
1704
1705

1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719

1720
1721

1722
1723
1724
1725
1726


1727
1728
1729
1730

1731
1732
1733
1734
1735
1736
1737
1738

1739
1740

1741
1742
1743
1744
1745

1746
1747
1748
1749

1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763

1764
1765

1766
1767
1768
1769
1770


1771
1772
1773
1774

1775
1776
1777
1778
1779
1780
1781
1782

1783
1784

1785
1786
1787
1788
1789

1790
1791
1792
1793

1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
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
1844
1845
1846
1847
1848
1849
1850
1851

1852
1853

1854
1855
1856
1857
1858


1859
1860
1861
1862

1863
1864
1865
1866
1867
1868
1869
1870

1871
1872

1873
1874
1875
1876
1877

1878
1879
1880
1881

1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895

1896
1897

1898
1899
1900
1901
1902


1903
1904
1905
1906

1907
1908
1909
1910
1911
1912
1913
1914

1915
1916

1917
1918
1919
1920
1921

1922
1923
1924
1925

1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939

1940
1941

1942
1943
1944
1945
1946


1947
1948
1949
1950

1951
1952
1953
1954
1955
1956
1957
1958

1959
1960

1961
1962
1963
1964
1965

1966
1967
1968
1969

1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983

1984
1985

1986
1987
1988
1989
1990


1991
1992
1993
1994

1995
1996
1997
1998
1999
2000
2001
2002

2003
2004

2005
2006
2007
2008
2009

2010
2011
2012
2013

2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027

2028
2029

2030
2031
2032
2033
2034


2035
2036
2037
2038

2039
2040
2041
2042
2043
2044
2045
2046

2047
2048

2049
2050
2051
2052
2053

2054
2055
2056
2057

2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071

2072
2073

2074
2075
2076
2077
2078


2079
2080
2081
2082

2083
2084
2085
2086
2087
2088
2089
2090

2091
2092

2093
2094
2095
2096
2097

2098
2099
2100
2101

2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115

2116
2117

2118
2119
2120
2121
2122


2123
2124
2125
2126

2127
2128
2129
2130
2131
2132
2133
2134

2135
2136

2137
2138
2139
2140
2141

2142
2143
2144
2145

2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159

2160
2161

2162
2163
2164
2165
2166

2167
2168
2169
2170
2171

2172
2173
2174
2175
2176
2177
2178
2179

2180
2181

2182
2183
2184
2185
2186

2187
2188
2189

2190
2191
2192
2193
2194
2195
2196
2197

2198
2199

2200
2201
2202
2203
2204

2205
2206
2207

2208
2209
2210
2211
2212
2213
2214
2215







-
+

-
+




-
+

-
+







-
+

-
+




-
+


-
+













-
+

-
+





-
+












-
+







-
+

-
+




-
-
+
+


-
+













-
+

-
+





-
+



-
+







-
+

-
+




-
-
+
+


-
+













-
+

-
+





-
+












-
+







-
+

-
+




-
-
+
+


-
+













-
+

-
+





-
+



-
+







-
+

-
+




-
-
+
+


-
+













-
+

-
+





-
+











-
+







-
+

-
+




-
-
+
+


-
+













-
+

-
+





-
+


-
+







-
+

-
+




-
-
+
+


-
+













-
+

-
+





-
+


















-
+







-
+

-
+




-
-
+
+


-
+













-
+

-
+





-
+



-
+







-
+

-
+




-
-
+
+


-
+













-
+

-
+





-
+


















-
+







-
+

-
+




-
-
+
+


-
+













-
+

-
+





-
+



-
+







-
+

-
+




-
-
+
+


-
+













-
+

-
+





-
+












-
+







-
+

-
+




-
-
+
+


-
+













-
+

-
+





-
+



-
+







-
+

-
+




-
-
+
+


-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+


-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+


-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+


-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+


-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+


-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+


-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+


-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+


-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+


-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+


-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+


-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+


-
+













-
+

-
+




-
+



-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+



-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+



-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+



-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+



-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+



-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+



-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+



-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+



-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+



-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+



-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+



-
+













-
+

-
+




-
-
+
+


-
+







-
+

-
+




-
+



-
+













-
+

-
+




-
+




-
+







-
+

-
+




-
+


-
+







-
+

-
+




-
+


-
+







      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx-source"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx-source-1.0.105.2.zip">sqlite-netFx-source-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx-source-1.0.106.0.zip">sqlite-netFx-source-1.0.106.0.zip</a>
        <br />
        (6.03 MiB)
        (6.20 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This ZIP archive contains all current source code for System.Data.SQLite
        1.0.105.2 (3.19.3) combined into a single archive file.
        1.0.106.0 (3.21.0) combined into a single archive file.
        <br />
        (sha1: a58bed040da0e9d54ff0c39553ffc6e4babd7591)
        (sha1: d20e73361e275b579df40ed84f1826e6c467aa6d)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx-full-source"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx-full-source-1.0.105.2.zip">sqlite-netFx-full-source-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx-full-source-1.0.106.0.zip">sqlite-netFx-full-source-1.0.106.0.zip</a>
        <br />
        (7.45 MiB)
        (7.84 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This ZIP archive contains all current source code for System.Data.SQLite
        1.0.105.2 (3.19.3) and the extra files needed to run the unit test suite,
        1.0.106.0 (3.21.0) and the extra files needed to run the unit test suite,
        combined into a single archive file.
        <br />
        (sha1: 92a7d8263dcfd8060e7ab34adf55d030d2903c88)
        (sha1: dbda776a70d94698a784b2ac431027545dfb6736)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Setups for 32-bit Windows (.NET Framework 2.0 SP2)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx20-setup-bundle-x86-2005"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx20-setup-bundle-x86-2005-1.0.105.2.exe">sqlite-netFx20-setup-bundle-x86-2005-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx20-setup-bundle-x86-2005-1.0.106.0.exe">sqlite-netFx20-setup-bundle-x86-2005-1.0.106.0.exe</a>
        <br />
        (5.41 MiB)
        (5.50 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package features the mixed-mode assembly and will install all
        the necessary runtime components and dependencies for the x86 version of
        the System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2005
        the System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2005
        SP1 runtime for x86 is included.  The .NET Framework 2.0 SP2 is
        required.
        <br />
        <big><b>This is the only setup package that is capable of installing the
        design-time components for Visual Studio 2005.
        <br />
        <br />
        However, if you do not require the design-time components, please
        consider downloading the associated &quot;Precompiled Binaries&quot;
        instead.</b></big>
        <br />
        <br />
        (sha1: 51a0855996baf221f58f27ea6795cd938376fff8)
        (sha1: 70466798b57bc6faedf90107e7de6c805f05524e)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx20-setup-x86-2005"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx20-setup-x86-2005-1.0.105.2.exe">sqlite-netFx20-setup-x86-2005-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx20-setup-x86-2005-1.0.106.0.exe">sqlite-netFx20-setup-x86-2005-1.0.106.0.exe</a>
        <br />
        (5.40 MiB)
        (5.49 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package will install all the necessary runtime components and
        dependencies for the x86 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2005 SP1 runtime for x86 is included.
        dependencies for the x86 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2005 SP1 runtime for x86 is included.
        The .NET Framework 2.0 SP2 is required.
        <br />
        (sha1: f5e641c52f853aed32771cbbc93f9b2ccd6c115e)
        (sha1: 19a28259d206043b36ee52f484ca29438fafb337)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Setups for 64-bit Windows (.NET Framework 2.0 SP2)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx20-setup-bundle-x64-2005"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx20-setup-bundle-x64-2005-1.0.105.2.exe">sqlite-netFx20-setup-bundle-x64-2005-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx20-setup-bundle-x64-2005-1.0.106.0.exe">sqlite-netFx20-setup-bundle-x64-2005-1.0.106.0.exe</a>
        <br />
        (6.05 MiB)
        (6.14 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package features the mixed-mode assembly and will install all
        the necessary runtime components and dependencies for the x64 version of
        the System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2005
        the System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2005
        SP1 runtime for x64 is included.  The .NET Framework 2.0 SP2 is
        required.
        <br />
        (sha1: eee3784617b3de0637dc025699402f00e5b3d939)
        (sha1: 42d9df8d8c30c2ed3eb61f1c316e14faeda7bb1f)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx20-setup-x64-2005"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx20-setup-x64-2005-1.0.105.2.exe">sqlite-netFx20-setup-x64-2005-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx20-setup-x64-2005-1.0.106.0.exe">sqlite-netFx20-setup-x64-2005-1.0.106.0.exe</a>
        <br />
        (6.04 MiB)
        (6.14 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package will install all the necessary runtime components and
        dependencies for the x64 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2005 SP1 runtime for x64 is included.
        dependencies for the x64 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2005 SP1 runtime for x64 is included.
        The .NET Framework 2.0 SP2 is required.
        <br />
        (sha1: d56b3068f3163602f455fc9a6ffabf3ef86e31f0)
        (sha1: 2f22518c97a1ce6e56bebd2aa5331af7ae26c233)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Setups for 32-bit Windows (.NET Framework 3.5 SP1)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx35-setup-bundle-x86-2008"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx35-setup-bundle-x86-2008-1.0.105.2.exe">sqlite-netFx35-setup-bundle-x86-2008-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx35-setup-bundle-x86-2008-1.0.106.0.exe">sqlite-netFx35-setup-bundle-x86-2008-1.0.106.0.exe</a>
        <br />
        (7.44 MiB)
        (7.53 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package features the mixed-mode assembly and will install all
        the necessary runtime components and dependencies for the x86 version of
        the System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2008
        the System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2008
        SP1 runtime for x86 is included.  The .NET Framework 3.5 SP1 is
        required.
        <br />
        <big><b>This is the only setup package that is capable of installing the
        design-time components for Visual Studio 2008.
        <br />
        <br />
        However, if you do not require the design-time components, please
        consider downloading the associated &quot;Precompiled Binaries&quot;
        instead.</b></big>
        <br />
        <br />
        (sha1: e397ad5f1d575bb2bb40b23f0834261c9bcf69d0)
        (sha1: 119bd7b8b7da73ad7e96fad4bbfa42ef8b639366)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx35-setup-x86-2008"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx35-setup-x86-2008-1.0.105.2.exe">sqlite-netFx35-setup-x86-2008-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx35-setup-x86-2008-1.0.106.0.exe">sqlite-netFx35-setup-x86-2008-1.0.106.0.exe</a>
        <br />
        (7.43 MiB)
        (7.52 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package will install all the necessary runtime components and
        dependencies for the x86 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2008 SP1 runtime for x86 is included.
        dependencies for the x86 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2008 SP1 runtime for x86 is included.
        The .NET Framework 3.5 SP1 is required.
        <br />
        (sha1: 7f1f645cff7c618b6f9def9ccf12a362312410dc)
        (sha1: 225c655d175ed32ca0f71da9cc2a08fc1268b430)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Setups for 64-bit Windows (.NET Framework 3.5 SP1)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx35-setup-bundle-x64-2008"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx35-setup-bundle-x64-2008-1.0.105.2.exe">sqlite-netFx35-setup-bundle-x64-2008-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx35-setup-bundle-x64-2008-1.0.106.0.exe">sqlite-netFx35-setup-bundle-x64-2008-1.0.106.0.exe</a>
        <br />
        (8.21 MiB)
        (8.30 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package features the mixed-mode assembly and will install all
        the necessary runtime components and dependencies for the x64 version of
        the System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2008
        the System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2008
        SP1 runtime for x64 is included.  The .NET Framework 3.5 SP1 is
        required.
        <br />
        (sha1: 49c5481e8f75184c2719270abff65e16cd1ef7ad)
        (sha1: 64b237bf4e1566f4f8df40dccb403f4b1606ef6d)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx35-setup-x64-2008"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx35-setup-x64-2008-1.0.105.2.exe">sqlite-netFx35-setup-x64-2008-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx35-setup-x64-2008-1.0.106.0.exe">sqlite-netFx35-setup-x64-2008-1.0.106.0.exe</a>
        <br />
        (8.20 MiB)
        (8.29 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package will install all the necessary runtime components and
        dependencies for the x64 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2008 SP1 runtime for x64 is included.
        dependencies for the x64 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2008 SP1 runtime for x64 is included.
        The .NET Framework 3.5 SP1 is required.
        <br />
        (sha1: 71471844acfa21a34836067db1f98783a22b3def)
        (sha1: 2b58d23d34e5e9171e4363c2e73ab11e34b6c09d)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Setups for 32-bit Windows (.NET Framework 4.0)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx40-setup-bundle-x86-2010"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx40-setup-bundle-x86-2010-1.0.105.2.exe">sqlite-netFx40-setup-bundle-x86-2010-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx40-setup-bundle-x86-2010-1.0.106.0.exe">sqlite-netFx40-setup-bundle-x86-2010-1.0.106.0.exe</a>
        <br />
        (13.02 MiB)
        (13.11 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package features the mixed-mode assembly and will install all
        the necessary runtime components and dependencies for the x86 version of
        the System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2010
        the System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2010
        SP1 runtime for x86 is included.  The .NET Framework 4.0 is required.
        <br />
        <big><b>This is the only setup package that is capable of installing the
        design-time components for Visual Studio 2010.
        <br />
        <br />
        However, if you do not require the design-time components, please
        consider downloading the associated &quot;Precompiled Binaries&quot;
        instead.</b></big>
        <br />
        <br />
        (sha1: d86e1f43f3bc3eea0d8ad6230cf90d85c03bcd9a)
        (sha1: 86fa0ba4c39bf6394ee6539f5532edae9933d95a)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx40-setup-x86-2010"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx40-setup-x86-2010-1.0.105.2.exe">sqlite-netFx40-setup-x86-2010-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx40-setup-x86-2010-1.0.106.0.exe">sqlite-netFx40-setup-x86-2010-1.0.106.0.exe</a>
        <br />
        (13.01 MiB)
        (13.10 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package will install all the necessary runtime components and
        dependencies for the x86 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2010 SP1 runtime for x86 is included.
        dependencies for the x86 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2010 SP1 runtime for x86 is included.
        The .NET Framework 4.0 is required.
        <br />
        (sha1: bda84aae8dfed30503b197c28bf5bf8c7a9ac9b7)
        (sha1: 80f5ed6f41e46c479f2d6d4f3d7e9505dbba9b63)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Setups for 64-bit Windows (.NET Framework 4.0)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx40-setup-bundle-x64-2010"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx40-setup-bundle-x64-2010-1.0.105.2.exe">sqlite-netFx40-setup-bundle-x64-2010-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx40-setup-bundle-x64-2010-1.0.106.0.exe">sqlite-netFx40-setup-bundle-x64-2010-1.0.106.0.exe</a>
        <br />
        (14.29 MiB)
        (14.38 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package features the mixed-mode assembly and will install all
        the necessary runtime components and dependencies for the x64 version of
        the System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2010
        the System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2010
        SP1 runtime for x64 is included.  The .NET Framework 4.0 is required.
        <br />
        (sha1: 8f825be91342b6e741e62ad69c6b7da0ecb26717)
        (sha1: 49d7272c6d443871e0fb0af6b31a24c751d7bb9f)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx40-setup-x64-2010"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx40-setup-x64-2010-1.0.105.2.exe">sqlite-netFx40-setup-x64-2010-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx40-setup-x64-2010-1.0.106.0.exe">sqlite-netFx40-setup-x64-2010-1.0.106.0.exe</a>
        <br />
        (14.28 MiB)
        (14.37 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package will install all the necessary runtime components and
        dependencies for the x64 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2010 SP1 runtime for x64 is included.
        dependencies for the x64 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2010 SP1 runtime for x64 is included.
        The .NET Framework 4.0 is required.
        <br />
        (sha1: 4e729bc7c9fe01cc491a15735ad66ec5459781f0)
        (sha1: 24b0c0f164d15f9d14bef2f57c77cc7dc9522f29)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Setups for 32-bit Windows (.NET Framework 4.5)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx45-setup-bundle-x86-2012"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx45-setup-bundle-x86-2012-1.0.105.2.exe">sqlite-netFx45-setup-bundle-x86-2012-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx45-setup-bundle-x86-2012-1.0.106.0.exe">sqlite-netFx45-setup-bundle-x86-2012-1.0.106.0.exe</a>
        <br />
        (10.44 MiB)
        (10.53 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package features the mixed-mode assembly and will install all
        the necessary runtime components and dependencies for the x86 version of
        the System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2012
        the System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2012
        Update 4 runtime for x86 is included.  The .NET Framework 4.5 is
        required.
        <br />
        <big><b>This is the only setup package that is capable of installing the
        design-time components for Visual Studio 2012.
        <br />
        <br />
        However, if you do not require the design-time components, please
        consider downloading the associated &quot;Precompiled Binaries&quot;
        instead.</b></big>
        <br />
        <br />
        <big><b>Using Entity Framework 6 design-time support may require
        installing the Visual Studio 2012 &quot;flavor&quot; of the
        <a href="https://www.microsoft.com/en-us/download/details.aspx?id=40762">
        Entity Framework 6 Tools for Visual Studio 2012 &amp; 2013</a>.</b></big>
        <br />
        <br />
        (sha1: 09d47fef648dcbd846b564f2fba3f113523469ba)
        (sha1: a1fb30afbee582acd728c7359eba23c5830a7ae6)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx45-setup-x86-2012"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx45-setup-x86-2012-1.0.105.2.exe">sqlite-netFx45-setup-x86-2012-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx45-setup-x86-2012-1.0.106.0.exe">sqlite-netFx45-setup-x86-2012-1.0.106.0.exe</a>
        <br />
        (10.48 MiB)
        (10.57 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package will install all the necessary runtime components and
        dependencies for the x86 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2012 Update 4 runtime for x86 is
        dependencies for the x86 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2012 Update 4 runtime for x86 is
        included.  The .NET Framework 4.5 is required.
        <br />
        (sha1: 3f302340ae1c639862c87630a871a147b9cb1f0a)
        (sha1: f976f9780b84c4f9281955c003804d7eafd166a3)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Setups for 64-bit Windows (.NET Framework 4.5)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx45-setup-bundle-x64-2012"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx45-setup-bundle-x64-2012-1.0.105.2.exe">sqlite-netFx45-setup-bundle-x64-2012-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx45-setup-bundle-x64-2012-1.0.106.0.exe">sqlite-netFx45-setup-bundle-x64-2012-1.0.106.0.exe</a>
        <br />
        (11.11 MiB)
        (11.20 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package features the mixed-mode assembly and will install all
        the necessary runtime components and dependencies for the x64 version of
        the System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2012
        the System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2012
        Update 4 runtime for x64 is included.  The .NET Framework 4.5 is
        required.
        <br />
        (sha1: bf2bc9ad65bcaffb8eb1120b84c5d72426ac2d6c)
        (sha1: 32154b539b7522efe22f6f7b8891b9e8bc265e97)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx45-setup-x64-2012"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx45-setup-x64-2012-1.0.105.2.exe">sqlite-netFx45-setup-x64-2012-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx45-setup-x64-2012-1.0.106.0.exe">sqlite-netFx45-setup-x64-2012-1.0.106.0.exe</a>
        <br />
        (11.17 MiB)
        (11.27 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package will install all the necessary runtime components and
        dependencies for the x64 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2012 Update 4 runtime for x64 is
        dependencies for the x64 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2012 Update 4 runtime for x64 is
        included.  The .NET Framework 4.5 is required.
        <br />
        (sha1: b5d2b14927771a1749dfa6bd5f7389d7c4c56acd)
        (sha1: d0669fad200538376bb18ba91efef24bf3162432)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Setups for 32-bit Windows (.NET Framework 4.5.1)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx451-setup-bundle-x86-2013"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx451-setup-bundle-x86-2013-1.0.105.2.exe">sqlite-netFx451-setup-bundle-x86-2013-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx451-setup-bundle-x86-2013-1.0.106.0.exe">sqlite-netFx451-setup-bundle-x86-2013-1.0.106.0.exe</a>
        <br />
        (10.40 MiB)
        (10.49 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package features the mixed-mode assembly and will install all
        the necessary runtime components and dependencies for the x86 version of
        the System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2013
        the System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2013
        Update 2 runtime for x86 is included.  The .NET Framework 4.5.1 is
        required.
        <br />
        <big><b>This is the only setup package that is capable of installing the
        design-time components for Visual Studio 2013.
        <br />
        <br />
        However, if you do not require the design-time components, please
        consider downloading the associated &quot;Precompiled Binaries&quot;
        instead.</b></big>
        <br />
        <br />
        <big><b>Using Entity Framework 6 design-time support may require
        installing the Visual Studio 2013 &quot;flavor&quot; of the
        <a href="https://www.microsoft.com/en-us/download/details.aspx?id=40762">
        Entity Framework 6 Tools for Visual Studio 2012 &amp; 2013</a>.</b></big>
        <br />
        <br />
        (sha1: 7e03f11e9ee7f7b1e6bd643510ed68d433604b31)
        (sha1: 878db3ead8d47727189b65b843f67794706d401e)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx451-setup-x86-2013"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx451-setup-x86-2013-1.0.105.2.exe">sqlite-netFx451-setup-x86-2013-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx451-setup-x86-2013-1.0.106.0.exe">sqlite-netFx451-setup-x86-2013-1.0.106.0.exe</a>
        <br />
        (10.43 MiB)
        (10.52 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package will install all the necessary runtime components and
        dependencies for the x86 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2013 Update 2 runtime for x86 is
        dependencies for the x86 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2013 Update 2 runtime for x86 is
        included.  The .NET Framework 4.5.1 is required.
        <br />
        (sha1: 1288f8ae2cac4e7a0739121fbfcefe29377fb6aa)
        (sha1: 5ae596f15ca424cc3bfc0c6cb08eec0a4e31e03d)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Setups for 64-bit Windows (.NET Framework 4.5.1)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx451-setup-bundle-x64-2013"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx451-setup-bundle-x64-2013-1.0.105.2.exe">sqlite-netFx451-setup-bundle-x64-2013-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx451-setup-bundle-x64-2013-1.0.106.0.exe">sqlite-netFx451-setup-bundle-x64-2013-1.0.106.0.exe</a>
        <br />
        (11.10 MiB)
        (11.18 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package features the mixed-mode assembly and will install all
        the necessary runtime components and dependencies for the x64 version of
        the System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2013
        the System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2013
        Update 2 runtime for x64 is included.  The .NET Framework 4.5.1 is
        required.
        <br />
        (sha1: 585c5e40058f7b3d1337af04e9e18a5dd7cd3c69)
        (sha1: 4968bc3ffeb69e63c04d899273c7569d0cb07f64)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx451-setup-x64-2013"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx451-setup-x64-2013-1.0.105.2.exe">sqlite-netFx451-setup-x64-2013-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx451-setup-x64-2013-1.0.106.0.exe">sqlite-netFx451-setup-x64-2013-1.0.106.0.exe</a>
        <br />
        (11.16 MiB)
        (11.25 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package will install all the necessary runtime components and
        dependencies for the x64 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2013 Update 2 runtime for x64 is
        dependencies for the x64 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2013 Update 2 runtime for x64 is
        included.  The .NET Framework 4.5.1 is required.
        <br />
        (sha1: bf5d821ebb96359d80fa51c08ff6e8483955b334)
        (sha1: 873c33a0deeda9d038d1f85e0699486b8df23279)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Setups for 32-bit Windows (.NET Framework 4.6)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx46-setup-bundle-x86-2015"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx46-setup-bundle-x86-2015-1.0.105.2.exe">sqlite-netFx46-setup-bundle-x86-2015-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx46-setup-bundle-x86-2015-1.0.106.0.exe">sqlite-netFx46-setup-bundle-x86-2015-1.0.106.0.exe</a>
        <br />
        (16.94 MiB)
        (17.04 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package features the mixed-mode assembly and will install all
        the necessary runtime components and dependencies for the x86 version of
        the System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2015
        the System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2015
        Update 3 runtime for x86 is included.  The .NET Framework 4.6 is
        required.
        <br />
        <big><b>This is the only setup package that is capable of installing the
        design-time components for Visual Studio 2015.
        <br />
        <br />
        However, if you do not require the design-time components, please
        consider downloading the associated &quot;Precompiled Binaries&quot;
        instead.</b></big>
        <br />
        <br />
        (sha1: 6e9711c2d84ecd9695632eb90fc750719ac66fab)
        (sha1: 0464c521e075c171c7aa2ec4747179a753182998)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx46-setup-x86-2015"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx46-setup-x86-2015-1.0.105.2.exe">sqlite-netFx46-setup-x86-2015-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx46-setup-x86-2015-1.0.106.0.exe">sqlite-netFx46-setup-x86-2015-1.0.106.0.exe</a>
        <br />
        (17.12 MiB)
        (17.24 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package will install all the necessary runtime components and
        dependencies for the x86 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2015 Update 3 runtime for x86 is
        dependencies for the x86 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2015 Update 3 runtime for x86 is
        included.  The .NET Framework 4.6 is required.
        <br />
        (sha1: cb0761146b69e5bed61c38e4bcb86b7b87f3f1b2)
        (sha1: 15ba9c396e0ea63d3eeb92559883f54cba2668c8)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Setups for 64-bit Windows (.NET Framework 4.6)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx46-setup-bundle-x64-2015"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx46-setup-bundle-x64-2015-1.0.105.2.exe">sqlite-netFx46-setup-bundle-x64-2015-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx46-setup-bundle-x64-2015-1.0.106.0.exe">sqlite-netFx46-setup-bundle-x64-2015-1.0.106.0.exe</a>
        <br />
        (17.80 MiB)
        (17.90 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package features the mixed-mode assembly and will install all
        the necessary runtime components and dependencies for the x64 version of
        the System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2015
        the System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2015
        Update 3 runtime for x64 is included.  The .NET Framework 4.6 is
        required.
        <br />
        (sha1: 3fe173990a49941e56b098b2bd82785464bd75a8)
        (sha1: 0fb2362b92a3164dcec122a2fe6e418a52b9199c)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx46-setup-x64-2015"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx46-setup-x64-2015-1.0.105.2.exe">sqlite-netFx46-setup-x64-2015-1.0.105.2.exe</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx46-setup-x64-2015-1.0.106.0.exe">sqlite-netFx46-setup-x64-2015-1.0.106.0.exe</a>
        <br />
        (18.03 MiB)
        (18.15 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This setup package will install all the necessary runtime components and
        dependencies for the x64 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2015 Update 3 runtime for x64 is
        dependencies for the x64 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2015 Update 3 runtime for x64 is
        included.  The .NET Framework 4.6 is required.
        <br />
        (sha1: e719ba640a371851bcfd19f01d2a9aa2ef29187d)
        (sha1: 3613fdc35a112332a12b392ba095b5cffab28092)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Binaries for 32-bit Windows (.NET Framework 2.0 SP2)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx20-binary-bundle-Win32-2005"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx20-binary-bundle-Win32-2005-1.0.105.2.zip">sqlite-netFx20-binary-bundle-Win32-2005-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx20-binary-bundle-Win32-2005-1.0.106.0.zip">sqlite-netFx20-binary-bundle-Win32-2005-1.0.106.0.zip</a>
        <br />
        (1.78 MiB)
        (1.87 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x86 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2005 SP1 runtime for x86 and the .NET
        the binaries for the x86 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2005 SP1 runtime for x86 and the .NET
        Framework 2.0 SP2 are required.
        <br />
        (sha1: 5edddc419a4a17713951a12303ce0c49094d7ad5)
        (sha1: 2f9695ae562ad35bf07416f0488f1d7d6f998069)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx20-binary-Win32-2005"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx20-binary-Win32-2005-1.0.105.2.zip">sqlite-netFx20-binary-Win32-2005-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx20-binary-Win32-2005-1.0.106.0.zip">sqlite-netFx20-binary-Win32-2005-1.0.106.0.zip</a>
        <br />
        (1.78 MiB)
        (1.87 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x86 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2005 SP1
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2005 SP1
        runtime for x86 and the .NET Framework 2.0 SP2 are required.
        <br />
        (sha1: 84209458c00ec6a2ad5602fa8c352a281325a201)
        (sha1: 48a574994f98c0ec674841dd989f0e8eaed49795)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Binaries for 64-bit Windows (.NET Framework 2.0 SP2)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx20-binary-bundle-x64-2005"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx20-binary-bundle-x64-2005-1.0.105.2.zip">sqlite-netFx20-binary-bundle-x64-2005-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx20-binary-bundle-x64-2005-1.0.106.0.zip">sqlite-netFx20-binary-bundle-x64-2005-1.0.106.0.zip</a>
        <br />
        (2.05 MiB)
        (2.16 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x64 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2005 SP1 runtime for x64 and the .NET
        the binaries for the x64 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2005 SP1 runtime for x64 and the .NET
        Framework 2.0 SP2 are required.
        <br />
        (sha1: 586a318fbb43d1ed897636dd2435e25926a8f14c)
        (sha1: b92cbe1d211691fcd5abdd202e0bd4c88eb049cb)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx20-binary-x64-2005"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx20-binary-x64-2005-1.0.105.2.zip">sqlite-netFx20-binary-x64-2005-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx20-binary-x64-2005-1.0.106.0.zip">sqlite-netFx20-binary-x64-2005-1.0.106.0.zip</a>
        <br />
        (2.04 MiB)
        (2.15 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x64 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2005 SP1
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2005 SP1
        runtime for x64 and the .NET Framework 2.0 SP2 are required.
        <br />
        (sha1: 3e9869d05285bee6d46dd1817abb895a348100d6)
        (sha1: 18db6d42cd101da6fb2f3d746beefbde49492b3e)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Binaries for 32-bit Windows (.NET Framework 3.5 SP1)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx35-binary-bundle-Win32-2008"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx35-binary-bundle-Win32-2008-1.0.105.2.zip">sqlite-netFx35-binary-bundle-Win32-2008-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx35-binary-bundle-Win32-2008-1.0.106.0.zip">sqlite-netFx35-binary-bundle-Win32-2008-1.0.106.0.zip</a>
        <br />
        (2.23 MiB)
        (2.32 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x86 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2008 SP1 runtime for x86 and the .NET
        the binaries for the x86 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2008 SP1 runtime for x86 and the .NET
        Framework 3.5 SP1 are required.
        <br />
        (sha1: 5dcea70e78ca11f081766aa2dd8f28f6c5538187)
        (sha1: b2095b81f05613160d705ec4f259becb98bebdd9)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx35-binary-Win32-2008"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx35-binary-Win32-2008-1.0.105.2.zip">sqlite-netFx35-binary-Win32-2008-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx35-binary-Win32-2008-1.0.106.0.zip">sqlite-netFx35-binary-Win32-2008-1.0.106.0.zip</a>
        <br />
        (2.22 MiB)
        (2.31 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x86 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2008 SP1
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2008 SP1
        runtime for x86 and the .NET Framework 3.5 SP1 are required.
        <br />
        (sha1: efce5ee79fd8a5b2c6bbaf47531ed0a9c5407ae9)
        (sha1: ef5a94e6d381384727b06bc501d45fd9cf25598c)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Binaries for 64-bit Windows (.NET Framework 3.5 SP1)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx35-binary-bundle-x64-2008"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx35-binary-bundle-x64-2008-1.0.105.2.zip">sqlite-netFx35-binary-bundle-x64-2008-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx35-binary-bundle-x64-2008-1.0.106.0.zip">sqlite-netFx35-binary-bundle-x64-2008-1.0.106.0.zip</a>
        <br />
        (2.34 MiB)
        (2.44 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x64 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2008 SP1 runtime for x64 and the .NET
        the binaries for the x64 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2008 SP1 runtime for x64 and the .NET
        Framework 3.5 SP1 are required.
        <br />
        (sha1: aede328c84b0daf7396deff87bae494aa3d24244)
        (sha1: 1ca9f3519d05c20baef6b0f4e63cf11b5675d1ae)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx35-binary-x64-2008"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx35-binary-x64-2008-1.0.105.2.zip">sqlite-netFx35-binary-x64-2008-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx35-binary-x64-2008-1.0.106.0.zip">sqlite-netFx35-binary-x64-2008-1.0.106.0.zip</a>
        <br />
        (2.33 MiB)
        (2.43 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x64 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2008 SP1
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2008 SP1
        runtime for x64 and the .NET Framework 3.5 SP1 are required.
        <br />
        (sha1: 740365a07f8b8b35749038e7f8a88711f2aa1a5c)
        (sha1: 9d1504a86aad805c8cebdaa35c0ac82d0959e8f1)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Binaries for 32-bit Windows (.NET Framework 4.0)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx40-binary-bundle-Win32-2010"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx40-binary-bundle-Win32-2010-1.0.105.2.zip">sqlite-netFx40-binary-bundle-Win32-2010-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx40-binary-bundle-Win32-2010-1.0.106.0.zip">sqlite-netFx40-binary-bundle-Win32-2010-1.0.106.0.zip</a>
        <br />
        (2.46 MiB)
        (2.56 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x86 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2010 SP1 runtime for x86 and the .NET
        the binaries for the x86 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2010 SP1 runtime for x86 and the .NET
        Framework 4.0 are required.
        <br />
        (sha1: a6e0fb2d1cedcbaf365e2420a69104fd359461c3)
        (sha1: 4ceffda2c4395cc006b61eb759617c52faa48929)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx40-binary-Win32-2010"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx40-binary-Win32-2010-1.0.105.2.zip">sqlite-netFx40-binary-Win32-2010-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx40-binary-Win32-2010-1.0.106.0.zip">sqlite-netFx40-binary-Win32-2010-1.0.106.0.zip</a>
        <br />
        (2.46 MiB)
        (2.55 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x86 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2010 SP1
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2010 SP1
        runtime for x86 and the .NET Framework 4.0 are required.
        <br />
        (sha1: 31c6d486b7e8017cbde144b51389cad1807f4d92)
        (sha1: ff59ffe96f5f14014f5f50ad647a1c2549908bbc)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Binaries for 64-bit Windows (.NET Framework 4.0)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx40-binary-bundle-x64-2010"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx40-binary-bundle-x64-2010-1.0.105.2.zip">sqlite-netFx40-binary-bundle-x64-2010-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx40-binary-bundle-x64-2010-1.0.106.0.zip">sqlite-netFx40-binary-bundle-x64-2010-1.0.106.0.zip</a>
        <br />
        (2.51 MiB)
        (2.61 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x64 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2010 SP1 runtime for x64 and the .NET
        the binaries for the x64 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2010 SP1 runtime for x64 and the .NET
        Framework 4.0 are required.
        <br />
        (sha1: 293b0844189e47256e191a43454fd397a3f779f9)
        (sha1: a53dcdee64b0a539e3a616943be71fed3fb219ae)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx40-binary-x64-2010"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx40-binary-x64-2010-1.0.105.2.zip">sqlite-netFx40-binary-x64-2010-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx40-binary-x64-2010-1.0.106.0.zip">sqlite-netFx40-binary-x64-2010-1.0.106.0.zip</a>
        <br />
        (2.51 MiB)
        (2.60 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x64 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2010 SP1
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2010 SP1
        runtime for x64 and the .NET Framework 4.0 are required.
        <br />
        (sha1: 001860575c4390f13d205fd93c2a4634bba8a082)
        (sha1: 506f06f586e7f9b9aedf9299e6b055cb6c9ae240)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Binaries for 32-bit Windows (.NET Framework 4.5)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx45-binary-bundle-Win32-2012"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx45-binary-bundle-Win32-2012-1.0.105.2.zip">sqlite-netFx45-binary-bundle-Win32-2012-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx45-binary-bundle-Win32-2012-1.0.106.0.zip">sqlite-netFx45-binary-bundle-Win32-2012-1.0.106.0.zip</a>
        <br />
        (2.37 MiB)
        (2.46 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x86 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2012 Update 4 runtime for x86 and
        the binaries for the x86 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2012 Update 4 runtime for x86 and
        the .NET Framework 4.5 are required.
        <br />
        (sha1: f89b548cfc2f3d29d02fa6bc7dafc18e0b464989)
        (sha1: f7a1b2bd76a1ced35ca8031676a12548a0d89428)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx45-binary-Win32-2012"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx45-binary-Win32-2012-1.0.105.2.zip">sqlite-netFx45-binary-Win32-2012-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx45-binary-Win32-2012-1.0.106.0.zip">sqlite-netFx45-binary-Win32-2012-1.0.106.0.zip</a>
        <br />
        (2.42 MiB)
        (2.52 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x86 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2012
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2012
        Update 4 runtime for x86 and the .NET Framework 4.5 are required.
        <br />
        (sha1: 31c4df4a4a2ba1331465f387f1debe2b69bd8f3f)
        (sha1: 90808188b6fe307fdc44fcb3316d1fd15bacf4a6)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Binaries for 64-bit Windows (.NET Framework 4.5)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx45-binary-bundle-x64-2012"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx45-binary-bundle-x64-2012-1.0.105.2.zip">sqlite-netFx45-binary-bundle-x64-2012-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx45-binary-bundle-x64-2012-1.0.106.0.zip">sqlite-netFx45-binary-bundle-x64-2012-1.0.106.0.zip</a>
        <br />
        (2.42 MiB)
        (2.51 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x64 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2012 Update 4 runtime for x64 and
        the binaries for the x64 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2012 Update 4 runtime for x64 and
        the .NET Framework 4.5 are required.
        <br />
        (sha1: 27c02e2b946960b6f90baf9c876dd0ca0abbf3cd)
        (sha1: 745d5ebd4b0f73b448686a13695b558be8ae6d52)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx45-binary-x64-2012"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx45-binary-x64-2012-1.0.105.2.zip">sqlite-netFx45-binary-x64-2012-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx45-binary-x64-2012-1.0.106.0.zip">sqlite-netFx45-binary-x64-2012-1.0.106.0.zip</a>
        <br />
        (2.51 MiB)
        (2.61 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x64 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2012
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2012
        Update 4 runtime for x64 and the .NET Framework 4.5 are required.
        <br />
        (sha1: 1f431f94e286841475e7a246cf4fe00c428fcb30)
        (sha1: 7554e5e7fc1c236d7a4cce0c06d0084679ee28c2)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Binaries for 32-bit Windows (.NET Framework 4.5.1)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx451-binary-bundle-Win32-2013"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx451-binary-bundle-Win32-2013-1.0.105.2.zip">sqlite-netFx451-binary-bundle-Win32-2013-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx451-binary-bundle-Win32-2013-1.0.106.0.zip">sqlite-netFx451-binary-bundle-Win32-2013-1.0.106.0.zip</a>
        <br />
        (2.38 MiB)
        (2.47 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x86 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2013 Update 2 runtime for x86 and the
        the binaries for the x86 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2013 Update 2 runtime for x86 and the
        .NET Framework 4.5.1 are required.
        <br />
        (sha1: 5f9aabcf21cf2920379471b24a78755620e68017)
        (sha1: 1113c0f3c4c44f046e610675e5f6b6a6d2e1e5f7)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx451-binary-Win32-2013"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx451-binary-Win32-2013-1.0.105.2.zip">sqlite-netFx451-binary-Win32-2013-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx451-binary-Win32-2013-1.0.106.0.zip">sqlite-netFx451-binary-Win32-2013-1.0.106.0.zip</a>
        <br />
        (2.43 MiB)
        (2.52 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x86 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2013
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2013
        Update 2 runtime for x86 and the .NET Framework 4.5.1 are required.
        <br />
        (sha1: a79ed2a21886b0edced9372d697f3649f7275551)
        (sha1: 5471518410f724ee9330ad1f3e477c1b11353618)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Binaries for 64-bit Windows (.NET Framework 4.5.1)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx451-binary-bundle-x64-2013"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx451-binary-bundle-x64-2013-1.0.105.2.zip">sqlite-netFx451-binary-bundle-x64-2013-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx451-binary-bundle-x64-2013-1.0.106.0.zip">sqlite-netFx451-binary-bundle-x64-2013-1.0.106.0.zip</a>
        <br />
        (2.43 MiB)
        (2.51 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x64 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2013 Update 2 runtime for x64 and the
        the binaries for the x64 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2013 Update 2 runtime for x64 and the
        .NET Framework 4.5.1 are required.
        <br />
        (sha1: 239905b7b514bff6b6eee9232c33d2f655407710)
        (sha1: 3baf8bb44e714acf641414a8780b19f07ed93570)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx451-binary-x64-2013"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx451-binary-x64-2013-1.0.105.2.zip">sqlite-netFx451-binary-x64-2013-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx451-binary-x64-2013-1.0.106.0.zip">sqlite-netFx451-binary-x64-2013-1.0.106.0.zip</a>
        <br />
        (2.52 MiB)
        (2.61 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x64 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2013
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2013
        Update 2 runtime for x64 and the .NET Framework 4.5.1 are required.
        <br />
        (sha1: 2fc6be6822490ea385adc115d57c478e5671a80f)
        (sha1: 0d07d039d5481f05e25d9f3a3d7b39859c0f430e)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Binaries for 32-bit Windows (.NET Framework 4.6)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx46-binary-bundle-Win32-2015"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx46-binary-bundle-Win32-2015-1.0.105.2.zip">sqlite-netFx46-binary-bundle-Win32-2015-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx46-binary-bundle-Win32-2015-1.0.106.0.zip">sqlite-netFx46-binary-bundle-Win32-2015-1.0.106.0.zip</a>
        <br />
        (2.94 MiB)
        (3.06 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x86 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2015 Update 3 runtime for x86 and the
        the binaries for the x86 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2015 Update 3 runtime for x86 and the
        .NET Framework 4.6 are required.
        <br />
        (sha1: 43bbab20b1d4bab7dcee62baaa8ea74346046592)
        (sha1: 8e56e0a08013ca68d4a125ab8383170ed7697411)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx46-binary-Win32-2015"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx46-binary-Win32-2015-1.0.105.2.zip">sqlite-netFx46-binary-Win32-2015-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx46-binary-Win32-2015-1.0.106.0.zip">sqlite-netFx46-binary-Win32-2015-1.0.106.0.zip</a>
        <br />
        (3.18 MiB)
        (3.32 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x86 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2015
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2015
        Update 3 runtime for x86 and the .NET Framework 4.6 are required.
        <br />
        (sha1: b5d14c7afb4261eee1fd7f728b7ea7a3d3362e1a)
        (sha1: 7d363b2a5eedb2d327d41e991ed5871526140872)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Binaries for 64-bit Windows (.NET Framework 4.6)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx46-binary-bundle-x64-2015"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx46-binary-bundle-x64-2015-1.0.105.2.zip">sqlite-netFx46-binary-bundle-x64-2015-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx46-binary-bundle-x64-2015-1.0.106.0.zip">sqlite-netFx46-binary-bundle-x64-2015-1.0.106.0.zip</a>
        <br />
        (3.00 MiB)
        (3.11 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x64 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2015 Update 3 runtime for x64 and the
        the binaries for the x64 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2015 Update 3 runtime for x64 and the
        .NET Framework 4.6 are required.
        <br />
        (sha1: d53f68fbef7675ef897030aa2b73bf23867253b4)
        (sha1: 7a197bbb6b6a72c5a5fd696a964bd1d768b6dbe9)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx46-binary-x64-2015"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx46-binary-x64-2015-1.0.105.2.zip">sqlite-netFx46-binary-x64-2015-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx46-binary-x64-2015-1.0.106.0.zip">sqlite-netFx46-binary-x64-2015-1.0.106.0.zip</a>
        <br />
        (3.30 MiB)
        (3.44 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x64 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2015
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2015
        Update 3 runtime for x64 and the .NET Framework 4.6 are required.
        <br />
        (sha1: b0f6d4727fc349ca28cfab6dfe7084de0a0c3dae)
        (sha1: afa59ae61b84330e69235f29e4afad3eae69348f)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Binaries for Mono on POSIX (.NET Framework 4.5.1)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx451-binary-Mono-2013"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx451-binary-Mono-2013-1.0.105.2.zip">sqlite-netFx451-binary-Mono-2013-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx451-binary-Mono-2013-1.0.106.0.zip">sqlite-netFx451-binary-Mono-2013-1.0.106.0.zip</a>
        <br />
        (1.22 MiB)
        (1.26 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the managed binaries for the Mono
        version of the System.Data.SQLite 1.0.105.2 (3.19.3) package.  The
        version of the System.Data.SQLite 1.0.106.0 (3.21.0) package.  The
        <a href="https://www.mono-project.com/">Mono runtime</a> (4.2.3.4 or
        higher) is required.
        <br />
        (sha1: 01b306cc7c66cdae9b6a6bc2fc119e7f1ff9143a)
        (sha1: 4613b06f0894717e84fe894280e409eddf1caaf0)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Statically-Linked Binaries for 32-bit Windows (.NET Framework 2.0 SP2)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx20-static-binary-bundle-Win32-2005"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx20-static-binary-bundle-Win32-2005-1.0.105.2.zip">sqlite-netFx20-static-binary-bundle-Win32-2005-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx20-static-binary-bundle-Win32-2005-1.0.106.0.zip">sqlite-netFx20-static-binary-bundle-Win32-2005-1.0.106.0.zip</a>
        <br />
        (1.97 MiB)
        (2.07 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x86 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2005 SP1 runtime for x86 is statically
        the binaries for the x86 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2005 SP1 runtime for x86 is statically
        linked.  The .NET Framework 2.0 SP2 is required.
        <br />
        (sha1: abc6eacbe96b45ce3e5b00faf006865895c152d0)
        (sha1: 08c3277253da05c853d18d379992156e72908618)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx20-static-binary-Win32-2005"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx20-static-binary-Win32-2005-1.0.105.2.zip">sqlite-netFx20-static-binary-Win32-2005-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx20-static-binary-Win32-2005-1.0.106.0.zip">sqlite-netFx20-static-binary-Win32-2005-1.0.106.0.zip</a>
        <br />
        (1.97 MiB)
        (2.06 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x86 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2005 SP1
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2005 SP1
        runtime for x86 is statically linked.  The .NET Framework 2.0 SP2 is
        required.
        <br />
        (sha1: b1c73292b5033b861d8238f0e63947cccc1f290c)
        (sha1: ef1682d421eb20efbc88a9b02da213971e8ec727)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Statically-Linked Binaries for 64-bit Windows (.NET Framework 2.0 SP2)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx20-static-binary-bundle-x64-2005"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx20-static-binary-bundle-x64-2005-1.0.105.2.zip">sqlite-netFx20-static-binary-bundle-x64-2005-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx20-static-binary-bundle-x64-2005-1.0.106.0.zip">sqlite-netFx20-static-binary-bundle-x64-2005-1.0.106.0.zip</a>
        <br />
        (2.19 MiB)
        (2.30 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x64 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2005 SP1 runtime for x64 is statically
        the binaries for the x64 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2005 SP1 runtime for x64 is statically
        linked.  The .NET Framework 2.0 SP2 is required.
        <br />
        (sha1: caaccb2296fc42e9e1198dce178b8f7edd8e5c58)
        (sha1: 58edf74bb3907a607d0b6b77f752eb06cbeff378)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx20-static-binary-x64-2005"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx20-static-binary-x64-2005-1.0.105.2.zip">sqlite-netFx20-static-binary-x64-2005-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx20-static-binary-x64-2005-1.0.106.0.zip">sqlite-netFx20-static-binary-x64-2005-1.0.106.0.zip</a>
        <br />
        (2.18 MiB)
        (2.29 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x64 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2005 SP1
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2005 SP1
        runtime for x64 is statically linked.  The .NET Framework 2.0 SP2 is
        required.
        <br />
        (sha1: 3432bda228648fc25ab887f8a7de040f38e02e49)
        (sha1: 60ae240ff2fb7304c1281ef1de9c09c8e052f3d3)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Statically-Linked Binaries for 32-bit Windows (.NET Framework 3.5 SP1)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx35-static-binary-bundle-Win32-2008"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx35-static-binary-bundle-Win32-2008-1.0.105.2.zip">sqlite-netFx35-static-binary-bundle-Win32-2008-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx35-static-binary-bundle-Win32-2008-1.0.106.0.zip">sqlite-netFx35-static-binary-bundle-Win32-2008-1.0.106.0.zip</a>
        <br />
        (2.43 MiB)
        (2.52 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x86 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2008 SP1 runtime for x86 is statically
        the binaries for the x86 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2008 SP1 runtime for x86 is statically
        linked.  The .NET Framework 3.5 SP1 is required.
        <br />
        (sha1: a188b2ba523abdb243e05c57c41ccba963b9b042)
        (sha1: 0a2572aa6d6a696baa20ce6fcf44eee2343b56b4)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx35-static-binary-Win32-2008"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx35-static-binary-Win32-2008-1.0.105.2.zip">sqlite-netFx35-static-binary-Win32-2008-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx35-static-binary-Win32-2008-1.0.106.0.zip">sqlite-netFx35-static-binary-Win32-2008-1.0.106.0.zip</a>
        <br />
        (2.42 MiB)
        (2.51 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x86 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2008 SP1
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2008 SP1
        runtime for x86 is statically linked.  The .NET Framework 3.5 SP1 is
        required.
        <br />
        (sha1: 81f194eb26cf315d24fcbea179870c3ff14be9e7)
        (sha1: 3393b639a759ec45030857c393538fdab88ab00f)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Statically-Linked Binaries for 64-bit Windows (.NET Framework 3.5 SP1)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx35-static-binary-bundle-x64-2008"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx35-static-binary-bundle-x64-2008-1.0.105.2.zip">sqlite-netFx35-static-binary-bundle-x64-2008-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx35-static-binary-bundle-x64-2008-1.0.106.0.zip">sqlite-netFx35-static-binary-bundle-x64-2008-1.0.106.0.zip</a>
        <br />
        (2.50 MiB)
        (2.60 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x64 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2008 SP1 runtime for x64 is statically
        the binaries for the x64 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2008 SP1 runtime for x64 is statically
        linked.  The .NET Framework 3.5 SP1 is required.
        <br />
        (sha1: f35554f34bae4f7d4e7c0a038fa3663ad5489dde)
        (sha1: e1da8f16e4d7b68acf0ce94e72f9f07f03c40d96)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx35-static-binary-x64-2008"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx35-static-binary-x64-2008-1.0.105.2.zip">sqlite-netFx35-static-binary-x64-2008-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx35-static-binary-x64-2008-1.0.106.0.zip">sqlite-netFx35-static-binary-x64-2008-1.0.106.0.zip</a>
        <br />
        (2.49 MiB)
        (2.59 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x64 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2008 SP1
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2008 SP1
        runtime for x64 is statically linked.  The .NET Framework 3.5 SP1 is
        required.
        <br />
        (sha1: fe2ef88bfd925bdfcf3f92811756b96afabb7d2c)
        (sha1: d13b283d6f4dd8e09f8a5af59442bf59958dd84c)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Statically-Linked Binaries for 32-bit Windows (.NET Framework 4.0)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx40-static-binary-bundle-Win32-2010"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx40-static-binary-bundle-Win32-2010-1.0.105.2.zip">sqlite-netFx40-static-binary-bundle-Win32-2010-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx40-static-binary-bundle-Win32-2010-1.0.106.0.zip">sqlite-netFx40-static-binary-bundle-Win32-2010-1.0.106.0.zip</a>
        <br />
        (2.66 MiB)
        (2.76 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x86 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2010 SP1 runtime for x86 is statically
        the binaries for the x86 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2010 SP1 runtime for x86 is statically
        linked.  The .NET Framework 4.0 is required.
        <br />
        (sha1: 863d426bb1fdd2ec2f435598ab9dbbca1a4e5276)
        (sha1: da500e7df38f8a354a415692320369fed79393de)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx40-static-binary-Win32-2010"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx40-static-binary-Win32-2010-1.0.105.2.zip">sqlite-netFx40-static-binary-Win32-2010-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx40-static-binary-Win32-2010-1.0.106.0.zip">sqlite-netFx40-static-binary-Win32-2010-1.0.106.0.zip</a>
        <br />
        (2.65 MiB)
        (2.75 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x86 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2010 SP1
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2010 SP1
        runtime for x86 is statically linked.  The .NET Framework 4.0 is
        required.
        <br />
        (sha1: 04a4ae4c48bf9308fc95187f473cad627e20aed4)
        (sha1: 0d7f6945167c9b71b6fa803fdbaa631517717eea)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Statically-Linked Binaries for 64-bit Windows (.NET Framework 4.0)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx40-static-binary-bundle-x64-2010"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx40-static-binary-bundle-x64-2010-1.0.105.2.zip">sqlite-netFx40-static-binary-bundle-x64-2010-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx40-static-binary-bundle-x64-2010-1.0.106.0.zip">sqlite-netFx40-static-binary-bundle-x64-2010-1.0.106.0.zip</a>
        <br />
        (2.69 MiB)
        (2.79 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x64 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2010 SP1 runtime for x64 is statically
        the binaries for the x64 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2010 SP1 runtime for x64 is statically
        linked.  The .NET Framework 4.0 is required.
        <br />
        (sha1: e574cf8df0d9a18ef74c2e91106eeb04633cde26)
        (sha1: 4bd6e80e8fccfa2e890d52c22709d94162b384d3)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx40-static-binary-x64-2010"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx40-static-binary-x64-2010-1.0.105.2.zip">sqlite-netFx40-static-binary-x64-2010-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx40-static-binary-x64-2010-1.0.106.0.zip">sqlite-netFx40-static-binary-x64-2010-1.0.106.0.zip</a>
        <br />
        (2.68 MiB)
        (2.78 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x64 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2010 SP1
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2010 SP1
        runtime for x64 is statically linked.  The .NET Framework 4.0 is
        required.
        <br />
        (sha1: 5c79021d15fa22c69baf692c65b9428648f342ee)
        (sha1: 731b86c0a0fbd185acc2be756d3c7ace5a2ab4bb)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Statically-Linked Binaries for 32-bit Windows (.NET Framework 4.5)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx45-static-binary-bundle-Win32-2012"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx45-static-binary-bundle-Win32-2012-1.0.105.2.zip">sqlite-netFx45-static-binary-bundle-Win32-2012-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx45-static-binary-bundle-Win32-2012-1.0.106.0.zip">sqlite-netFx45-static-binary-bundle-Win32-2012-1.0.106.0.zip</a>
        <br />
        (2.70 MiB)
        (2.78 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x86 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2012 Update 4 runtime for x86 is
        the binaries for the x86 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2012 Update 4 runtime for x86 is
        statically linked.  The .NET Framework 4.5 is required.
        <br />
        (sha1: 88f8c39025f3256ccba229c20765146520fdd27e)
        (sha1: e77a3c687dab03a3932c57c9564bc3e73d7de2db)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx45-static-binary-Win32-2012"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx45-static-binary-Win32-2012-1.0.105.2.zip">sqlite-netFx45-static-binary-Win32-2012-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx45-static-binary-Win32-2012-1.0.106.0.zip">sqlite-netFx45-static-binary-Win32-2012-1.0.106.0.zip</a>
        <br />
        (2.75 MiB)
        (2.84 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x86 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2012
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2012
        Update 4 runtime for x86 is statically linked.  The .NET Framework 4.5
        is required.
        <br />
        (sha1: b268e07d8a1342f66f43a955c788580035c9a05d)
        (sha1: 4cb714d513b69b11c723f0531a42df274db0bc3c)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Statically-Linked Binaries for 64-bit Windows (.NET Framework 4.5)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx45-static-binary-bundle-x64-2012"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx45-static-binary-bundle-x64-2012-1.0.105.2.zip">sqlite-netFx45-static-binary-bundle-x64-2012-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx45-static-binary-bundle-x64-2012-1.0.106.0.zip">sqlite-netFx45-static-binary-bundle-x64-2012-1.0.106.0.zip</a>
        <br />
        (2.68 MiB)
        (2.77 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x64 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2012 Update 4 runtime for x64 is
        the binaries for the x64 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2012 Update 4 runtime for x64 is
        statically linked.  The .NET Framework 4.5 is required.
        <br />
        (sha1: 1136edf7e0609f09ce92966c971a61b2c81ffb86)
        (sha1: 2e2a82b9228466e6c5a57eabab9c38a27b9e03c5)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx45-static-binary-x64-2012"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx45-static-binary-x64-2012-1.0.105.2.zip">sqlite-netFx45-static-binary-x64-2012-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx45-static-binary-x64-2012-1.0.106.0.zip">sqlite-netFx45-static-binary-x64-2012-1.0.106.0.zip</a>
        <br />
        (2.77 MiB)
        (2.87 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x64 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2012
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2012
        Update 4 runtime for x64 is statically linked.  The .NET Framework 4.5
        is required.
        <br />
        (sha1: 833d58c4883e66f9d38b5f3fad503092bebe6e35)
        (sha1: ee5e0220bfb220db5b4d683b641cc69225f4cf80)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Statically-Linked Binaries for 32-bit Windows (.NET Framework 4.5.1)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx451-static-binary-bundle-Win32-2013"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx451-static-binary-bundle-Win32-2013-1.0.105.2.zip">sqlite-netFx451-static-binary-bundle-Win32-2013-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx451-static-binary-bundle-Win32-2013-1.0.106.0.zip">sqlite-netFx451-static-binary-bundle-Win32-2013-1.0.106.0.zip</a>
        <br />
        (2.72 MiB)
        (2.81 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x86 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2013 Update 2 runtime for x86 is
        the binaries for the x86 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2013 Update 2 runtime for x86 is
        statically linked.  The .NET Framework 4.5.1 is required.
        <br />
        (sha1: 3fded66bf9157d12d4c5d8b88ff30b48289c1bdf)
        (sha1: fa8ccb51bfe8bbe1294033a13c05f2d6bbd1bb77)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx451-static-binary-Win32-2013"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx451-static-binary-Win32-2013-1.0.105.2.zip">sqlite-netFx451-static-binary-Win32-2013-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx451-static-binary-Win32-2013-1.0.106.0.zip">sqlite-netFx451-static-binary-Win32-2013-1.0.106.0.zip</a>
        <br />
        (2.77 MiB)
        (2.87 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x86 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2013
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2013
        Update 2 runtime for x86 is statically linked.  The .NET Framework 4.5.1
        is required.
        <br />
        (sha1: 52aedfecbccc4858ce6f0a6bdee6ed6de6a5afb1)
        (sha1: 106d0a5b76664bc448c9f0faf87384cf0e593304)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Statically-Linked Binaries for 64-bit Windows (.NET Framework 4.5.1)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx451-static-binary-bundle-x64-2013"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx451-static-binary-bundle-x64-2013-1.0.105.2.zip">sqlite-netFx451-static-binary-bundle-x64-2013-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx451-static-binary-bundle-x64-2013-1.0.106.0.zip">sqlite-netFx451-static-binary-bundle-x64-2013-1.0.106.0.zip</a>
        <br />
        (2.72 MiB)
        (2.81 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x64 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2013 Update 2 runtime for x64 is
        the binaries for the x64 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2013 Update 2 runtime for x64 is
        statically linked.  The .NET Framework 4.5.1 is required.
        <br />
        (sha1: 98d30eb4829e1ca7f00142ce40d65737375e3eac)
        (sha1: 9d48f53610556f29d63cd920afacb4d04baa0790)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx451-static-binary-x64-2013"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx451-static-binary-x64-2013-1.0.105.2.zip">sqlite-netFx451-static-binary-x64-2013-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx451-static-binary-x64-2013-1.0.106.0.zip">sqlite-netFx451-static-binary-x64-2013-1.0.106.0.zip</a>
        <br />
        (2.81 MiB)
        (2.91 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x64 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2013
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2013
        Update 2 runtime for x64 is statically linked.  The .NET Framework 4.5.1
        is required.
        <br />
        (sha1: 4b1b2ea50af7f2f541047fabca31d8f87c3d6801)
        (sha1: 039dda41d7e0eb2200f22f00c0be7237d9f7f010)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Statically-Linked Binaries for 32-bit Windows (.NET Framework 4.6)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx46-static-binary-bundle-Win32-2015"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx46-static-binary-bundle-Win32-2015-1.0.105.2.zip">sqlite-netFx46-static-binary-bundle-Win32-2015-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx46-static-binary-bundle-Win32-2015-1.0.106.0.zip">sqlite-netFx46-static-binary-bundle-Win32-2015-1.0.106.0.zip</a>
        <br />
        (3.46 MiB)
        (3.57 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x86 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2015 Update 3 runtime for x86 is
        the binaries for the x86 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2015 Update 3 runtime for x86 is
        statically linked.  The .NET Framework 4.6 is required.
        <br />
        (sha1: fe5721af0ce9c9a73f357e94e15cc77271c888b1)
        (sha1: 81bbf276a8799b00fb7aec582637460f2d16b4e4)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx46-static-binary-Win32-2015"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx46-static-binary-Win32-2015-1.0.105.2.zip">sqlite-netFx46-static-binary-Win32-2015-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx46-static-binary-Win32-2015-1.0.106.0.zip">sqlite-netFx46-static-binary-Win32-2015-1.0.106.0.zip</a>
        <br />
        (3.70 MiB)
        (3.84 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x86 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2015
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2015
        Update 3 runtime for x86 is statically linked.  The .NET Framework 4.6
        is required.
        <br />
        (sha1: 665516bf95b60e393b41eeb8bf8d7727c8f26a7c)
        (sha1: 63b707fdcfa5b6598cf2b0f62924a52a5bbf6a08)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Statically-Linked Binaries for 64-bit Windows (.NET Framework 4.6)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx46-static-binary-bundle-x64-2015"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx46-static-binary-bundle-x64-2015-1.0.105.2.zip">sqlite-netFx46-static-binary-bundle-x64-2015-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx46-static-binary-bundle-x64-2015-1.0.106.0.zip">sqlite-netFx46-static-binary-bundle-x64-2015-1.0.106.0.zip</a>
        <br />
        (3.48 MiB)
        (3.59 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package features the mixed-mode assembly and contains all
        the binaries for the x64 version of the System.Data.SQLite 1.0.105.2
        (3.19.3) package.  The Visual C++ 2015 Update 3 runtime for x64 is
        the binaries for the x64 version of the System.Data.SQLite 1.0.106.0
        (3.21.0) package.  The Visual C++ 2015 Update 3 runtime for x64 is
        statically linked.  The .NET Framework 4.6 is required.
        <br />
        (sha1: b8a3de1b9623663d1a82c2467ccc4d2a0d984099)
        (sha1: 3885707a4c43fd9826c5bec74e492cea6d988e1b)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx46-static-binary-x64-2015"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx46-static-binary-x64-2015-1.0.105.2.zip">sqlite-netFx46-static-binary-x64-2015-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx46-static-binary-x64-2015-1.0.106.0.zip">sqlite-netFx46-static-binary-x64-2015-1.0.106.0.zip</a>
        <br />
        (3.78 MiB)
        (3.92 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the x64 version of the
        System.Data.SQLite 1.0.105.2 (3.19.3) package.  The Visual C++ 2015
        System.Data.SQLite 1.0.106.0 (3.21.0) package.  The Visual C++ 2015
        Update 3 runtime for x64 is statically linked.  The .NET Framework 4.6
        is required.
        <br />
        (sha1: c93f9db87245e1a37587f6043d1ec3f466b9d07f)
        (sha1: d2dd60658c8aac2e191ccf6cb688e0fb2aed71fe)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <b>Precompiled Binaries for Windows CE (.NET Compact Framework)</b>
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx35-binary-PocketPC-ARM-2008"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx35-binary-PocketPC-ARM-2008-1.0.105.2.zip">sqlite-netFx35-binary-PocketPC-ARM-2008-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx35-binary-PocketPC-ARM-2008-1.0.106.0.zip">sqlite-netFx35-binary-PocketPC-ARM-2008-1.0.106.0.zip</a>
        <br />
        (1.35 MiB)
        (1.44 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the PocketPC version
        of the System.Data.SQLite 1.0.105.2 (3.19.3) package.  The included native
        of the System.Data.SQLite 1.0.106.0 (3.21.0) package.  The included native
        binaries should work on all supported ARM versions of Windows CE prior
        to Windows Embedded Compact 2013.  The .NET Compact Framework 3.5 is
        required.
        <br />
        (sha1: 4f1efd87249ea4665d033a55cb52f64f49fc194a)
        (sha1: 9ceec0958660335fa73b9fae2d216980c6977157)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx39-binary-WinCE-ARM-2012"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx39-binary-WinCE-ARM-2012-1.0.105.2.zip">sqlite-netFx39-binary-WinCE-ARM-2012-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx39-binary-WinCE-ARM-2012-1.0.106.0.zip">sqlite-netFx39-binary-WinCE-ARM-2012-1.0.106.0.zip</a>
        <br />
        (1.50 MiB)
        (1.59 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the Windows Embedded
        Compact 2013 (ARM) version of the System.Data.SQLite 1.0.105.2 (3.19.3)
        Compact 2013 (ARM) version of the System.Data.SQLite 1.0.106.0 (3.21.0)
        package.  The .NET Compact Framework 3.9 is required.
        <br />
        (sha1: a1cb9ca1fc60e283e046f1970551a1dda9f4c1e0)
        (sha1: 4ed7a12b8f1f2bf38faa54318104ace6f6f00d26)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a name="sqlite-netFx39-binary-WinCE-x86-2012"></a>
        <a href="/downloads/1.0.105.2/sqlite-netFx39-binary-WinCE-x86-2012-1.0.105.2.zip">sqlite-netFx39-binary-WinCE-x86-2012-1.0.105.2.zip</a>
        <a href="/downloads/1.0.106.0/sqlite-netFx39-binary-WinCE-x86-2012-1.0.106.0.zip">sqlite-netFx39-binary-WinCE-x86-2012-1.0.106.0.zip</a>
        <br />
        (1.55 MiB)
        (1.64 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This binary package contains all the binaries for the Windows Embedded
        Compact 2013 (x86) version of the System.Data.SQLite 1.0.105.2 (3.19.3)
        Compact 2013 (x86) version of the System.Data.SQLite 1.0.106.0 (3.21.0)
        package.  The .NET Compact Framework 3.9 is required.
        <br />
        (sha1: 81a86753584035aea5869a14e5bb5336f2047827)
        (sha1: 619eb650073677872489d925251291be6dbb8619)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <a name="nuGetPackages"></a>
        <b>Official NuGet Packages</b>
2226
2227
2228
2229
2230
2231
2232
2233

2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244





2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258

2259
2260
2261
2262
2263
2264
2265

2266
2267

2268
2269
2270
2271
2272

2273
2274
2275
2276
2277




2278
2279
2280
2281

2282
2283
2284
2285
2286
2287
2288

2289
2290

2291
2292
2293
2294
2295
2296


2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308

2309
2310
2311
2312
2313
2314
2315

2316
2317
2318
2319
2320
2321
2322
2323



2324
2325
2326
2327
2328

2329
2330
2331
2332
2333
2334
2335

2336
2337
2338
2339
2340
2341
2342
2343


2344
2345
2346
2347

2348
2349
2350
2351
2352
2353
2354

2355
2356
2357
2358
2359
2360
2361
2362


2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383

2384
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
2226
2227
2228
2229
2230
2231
2232

2233
2234
2235
2236
2237
2238
2239





2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257

2258
2259
2260
2261
2262
2263
2264

2265
2266

2267
2268
2269
2270
2271

2272
2273




2274
2275
2276
2277
2278
2279
2280

2281
2282
2283
2284
2285
2286
2287

2288
2289

2290
2291
2292
2293
2294


2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307

2308
2309
2310
2311
2312
2313
2314

2315
2316
2317
2318
2319
2320
2321


2322
2323
2324
2325
2326
2327
2328

2329
2330
2331
2332
2333
2334
2335

2336
2337
2338
2339
2340
2341
2342


2343
2344
2345
2346
2347

2348
2349
2350
2351
2352
2353
2354

2355
2356
2357
2358
2359
2360
2361


2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383

2384
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







-
+






-
-
-
-
-
+
+
+
+
+













-
+






-
+

-
+




-
+

-
-
-
-
+
+
+
+



-
+






-
+

-
+




-
-
+
+











-
+






-
+






-
-
+
+
+




-
+






-
+






-
-
+
+



-
+






-
+






-
-
+
+




















-
+






-
+

-
+




-
-
-
+
+
+







-
+






-
+

-
+




-
-
-
+
+
+







-
+







        below may be used for comparison purposes.
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a href="/downloads/1.0.105.2/System.Data.SQLite.1.0.105.2.nupkg">System.Data.SQLite.1.0.105.2.nupkg</a>
        <a href="/downloads/1.0.106.0/System.Data.SQLite.1.0.106.0.nupkg">System.Data.SQLite.1.0.106.0.nupkg</a>
        <br />
        (0.00 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This NuGet package includes all the binaries for both the x86 and x64
        versions of System.Data.SQLite 1.0.105.2 (3.19.3).  The .NET Framework
        3.5 SP1, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, or 4.7 is required.
        For the included native binaries, the version of the Visual C++ runtime
        corresponding to the .NET Framework used by the associated managed
        assembly is statically linked.
        versions of System.Data.SQLite 1.0.106.0 (3.21.0).  The .NET Framework
        3.5 SP1, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, or 4.7.1 is
        required.  For the included native binaries, the version of the Visual
        C++ runtime corresponding to the .NET Framework used by the associated
        managed assembly is statically linked.
        <br />
        <big><b>This package depends on the &quot;EntityFramework&quot;
        package, version 6.0 or higher (indirectly via the
        &quot;System.Data.SQLite.EF6&quot; package).</b></big>
        <br />
        <br />
        <big><b><i>As of version 1.0.92.0, this package will not directly
        contain any of the required binaries.  Instead, this package will
        depend on the &quot;System.Data.SQLite.Core&quot;,
        &quot;System.Data.SQLite.Linq&quot;, and
        &quot;System.Data.SQLite.EF6&quot; packages.</i></b></big>
        <br />
        <br />
        (sha1: 369eaa95c54bd82fd1c44fbe9ddf27ceaa03c893)
        (sha1: 27782460c500f2831efb343d3ddeb7d2dbc7a7a5)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a href="/downloads/1.0.105.2/System.Data.SQLite.Core.1.0.105.2.nupkg">System.Data.SQLite.Core.1.0.105.2.nupkg</a>
        <a href="/downloads/1.0.106.0/System.Data.SQLite.Core.1.0.106.0.nupkg">System.Data.SQLite.Core.1.0.106.0.nupkg</a>
        <br />
        (7.67 MiB)
        (8.04 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This NuGet package contains all the binaries for both the x86 and x64
        versions of System.Data.SQLite 1.0.105.2 (3.19.3), <big><b>except those
        versions of System.Data.SQLite 1.0.106.0 (3.21.0), <big><b>except those
        needed to support LINQ and Entity Framework 6</b></big>.  The .NET
        Framework 3.5 SP1, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, or 4.7 is
        required.  For the included native binaries, the version of the Visual
        C++ runtime corresponding to the .NET Framework used by the associated
        managed assembly is statically linked.
        Framework 3.5 SP1, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, or
        4.7.1 is required.  For the included native binaries, the version of the
        Visual C++ runtime corresponding to the .NET Framework used by the
        associated managed assembly is statically linked.
        <br />
        <big><b>This package does not depend on any other package.</b></big>
        <br />
        (sha1: 9b707a420ee112f246309eef4ab48d77d61a69f6)
        (sha1: 679d3f23aba204f739847cc9f25c0aded48e9ce1)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a href="/downloads/1.0.105.2/System.Data.SQLite.Core.MSIL.1.0.105.2.nupkg">System.Data.SQLite.Core.MSIL.1.0.105.2.nupkg</a>
        <a href="/downloads/1.0.106.0/System.Data.SQLite.Core.MSIL.1.0.106.0.nupkg">System.Data.SQLite.Core.MSIL.1.0.106.0.nupkg</a>
        <br />
        (1.03 MiB)
        (1.14 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This NuGet package contains the managed binaries for System.Data.SQLite
        1.0.105.2.  The .NET Framework 3.5 SP1, 4.0, 4.5, 4.5.1, 4.5.2, 4.6,
        4.6.1, 4.6.2, or 4.7 is required.
        1.0.106.0.  The .NET Framework 3.5 SP1, 4.0, 4.5, 4.5.1, 4.5.2, 4.6,
        4.6.1, 4.6.2, 4.7, or 4.7.1 is required.
        <br />
        <big><b>This package does not depend on any other package.</b></big>
        <br />
        <br />
        <big><b><i>This NuGet package does not include any code from the native
        SQLite core library and will not work properly without the native
        assembly &quot;SQLite.Interop.dll&quot; compiled for the processor
        architecture of the host process being present in a directory in the
        native library search path.</i></b></big>
        <br />
        <br />
        (sha1: 33dcea530a8a549ee4c774b0094a214f2685b7ec)
        (sha1: f5b269b572e0b654971be22e8deee4bdcc26dec9)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a href="/downloads/1.0.105.2/System.Data.SQLite.EF6.1.0.105.2.nupkg">System.Data.SQLite.EF6.1.0.105.2.nupkg</a>
        <a href="/downloads/1.0.106.0/System.Data.SQLite.EF6.1.0.106.0.nupkg">System.Data.SQLite.EF6.1.0.106.0.nupkg</a>
        <br />
        (0.18 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This NuGet package contains just the binaries to support Entity
        Framework 6 using System.Data.SQLite 1.0.105.2 (3.19.3).  The .NET
        Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, or 4.7 is required.
        Framework 6 using System.Data.SQLite 1.0.106.0 (3.21.0).  The .NET
        Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, or 4.7.1 is
        required.
        <br />
        <big><b>This package depends on the &quot;EntityFramework&quot;
        package, version 6.0 or higher.</b></big>
        <br />
        (sha1: 6767891bea7915d70872298299491be6592142dd)
        (sha1: 5241eae3563c5e58d98384515dbf7fda1f7ef332)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a href="/downloads/1.0.105.2/System.Data.SQLite.Linq.1.0.105.2.nupkg">System.Data.SQLite.Linq.1.0.105.2.nupkg</a>
        <a href="/downloads/1.0.106.0/System.Data.SQLite.Linq.1.0.106.0.nupkg">System.Data.SQLite.Linq.1.0.106.0.nupkg</a>
        <br />
        (0.22 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This NuGet package contains just the binaries to support LINQ using
        System.Data.SQLite 1.0.105.2 (3.19.3).  The .NET Framework 3.5 SP1, 4.0,
        4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, or 4.7 is required.
        System.Data.SQLite 1.0.106.0 (3.21.0).  The .NET Framework 3.5 SP1, 4.0,
        4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, or 4.7.1 is required.
        <br />
        <big><b>This package does not depend on any other package.</b></big>
        <br />
        (sha1: 166af795a47676318cf40f274b5c7b4147184c0e)
        (sha1: 0bc8fb854053f8a24d0dc95aec05302066eb7175)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a href="/downloads/1.0.105.2/System.Data.SQLite.MSIL.1.0.105.2.nupkg">System.Data.SQLite.MSIL.1.0.105.2.nupkg</a>
        <a href="/downloads/1.0.106.0/System.Data.SQLite.MSIL.1.0.106.0.nupkg">System.Data.SQLite.MSIL.1.0.106.0.nupkg</a>
        <br />
        (0.00 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This NuGet package contains the managed binaries for System.Data.SQLite
        1.0.105.2.  The .NET Framework 3.5 SP1, 4.0, 4.5, 4.5.1, 4.5.2, 4.6,
        4.6.1, 4.6.2, or 4.7 is required.
        1.0.106.0.  The .NET Framework 3.5 SP1, 4.0, 4.5, 4.5.1, 4.5.2, 4.6,
        4.6.1, 4.6.2, 4.7, or 4.7.1 is required.
        <br />
        <big><b>This is a legacy package; if possible, please use either the
        &quot;System.Data.SQLite&quot; or &quot;System.Data.SQLite.Core&quot;
        package instead.</b></big>
        <br />
        <br />
        <big><b><i>This NuGet package does not include any code from the native
        SQLite core library and will not work properly without the native
        assembly &quot;SQLite.Interop.dll&quot; compiled for the processor
        architecture of the host process being present in a directory in the
        native library search path.</i></b></big>
        <br />
        <br />
        <big><b><i>As of version 1.0.95.0, this package will not directly
        contain any of the required binaries. Instead, this package will
        depend on the &quot;System.Data.SQLite.Core.MSIL&quot;,
        &quot;System.Data.SQLite.Linq&quot;, and
        &quot;System.Data.SQLite.EF6&quot; packages.</i></b></big>
        <br />
        <br />
        (sha1: e4f61413ad74ddb5bd253986e688920bd2301f8c)
        (sha1: fcb79a4cd228642248807ea79cb2d868dae3225b)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a href="/downloads/1.0.105.2/System.Data.SQLite.x86.1.0.105.2.nupkg">System.Data.SQLite.x86.1.0.105.2.nupkg</a>
        <a href="/downloads/1.0.106.0/System.Data.SQLite.x86.1.0.106.0.nupkg">System.Data.SQLite.x86.1.0.106.0.nupkg</a>
        <br />
        (3.85 MiB)
        (4.06 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This NuGet package contains all the binaries for the x86 version of
        System.Data.SQLite 1.0.105.2 (3.19.3).  The .NET Framework 3.5 SP1,
        4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, or 4.7 is required.  For the
        included native binaries, the version of the Visual C++ runtime
        System.Data.SQLite 1.0.106.0 (3.21.0).  The .NET Framework 3.5 SP1,
        4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, or 4.7.1 is required.
        For the included native binaries, the version of the Visual C++ runtime
        corresponding to the .NET Framework used by the associated managed
        assembly is statically linked.
        <br />
        <big><b>This is a legacy package; if possible, please use either the
        &quot;System.Data.SQLite&quot; or &quot;System.Data.SQLite.Core&quot;
        package instead.</b></big>
        <br />
        (sha1: c9e5cf463cffeae46c1efd40a6e75e53c278c257)
        (sha1: b335f967a80b53ae965faac04c692ec80633fa5f)
      </td>
    </tr>

    <tr>
      <td width="10">&nbsp;</td>
      <td width="30%" valign="top" align="right">
        <a href="/downloads/1.0.105.2/System.Data.SQLite.x64.1.0.105.2.nupkg">System.Data.SQLite.x64.1.0.105.2.nupkg</a>
        <a href="/downloads/1.0.106.0/System.Data.SQLite.x64.1.0.106.0.nupkg">System.Data.SQLite.x64.1.0.106.0.nupkg</a>
        <br />
        (4.38 MiB)
        (4.61 MiB)
      </td>
      <td width="5"></td>
      <td valign="top">
        This NuGet package contains all the binaries for the x64 version of
        System.Data.SQLite 1.0.105.2 (3.19.3).  The .NET Framework 3.5 SP1,
        4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, or 4.7 is required.  For the
        included native binaries, the version of the Visual C++ runtime
        System.Data.SQLite 1.0.106.0 (3.21.0).  The .NET Framework 3.5 SP1,
        4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, or 4.7.1 is required.
        For the included native binaries, the version of the Visual C++ runtime
        corresponding to the .NET Framework used by the associated managed
        assembly is statically linked.
        <br />
        <big><b>This is a legacy package; if possible, please use either the
        &quot;System.Data.SQLite&quot; or &quot;System.Data.SQLite.Core&quot;
        package instead.</b></big>
        <br />
        (sha1: 4973079c795c1a613b68de414ddd59689e17ab91)
        (sha1: 726da7205f2ee93dba6d04b0ee384c457e4ccb05)
      </td>
    </tr>

    <tr>
      <td colspan="4">
        <a name="legacyVersions"></a>
        <b>Legacy Versions</b>
2508
2509
2510
2511
2512
2513
2514
2515

2516
2517
2518
2519
2520
2521
2522
2509
2510
2511
2512
2513
2514
2515

2516
2517
2518
2519
2520
2521
2522
2523







-
+







  <p>
    Templates (13), (14), and (15) are used for the official NuGet packages.
  </p>

  <p>
    The <b>framework</b> in templates (5), (6), (7), (8), (9), and (10) will
    be one of netFx20, netFx35, netFx40, netFx45, netFx451, netFx452, netFx46,
    netFx461, netFx462, netFx47.
    netFx461, netFx462, netFx47, netFx471.
  </p>

  <p>
    The <b>cpu</b> in templates (5) and (6) will be one of x86, x64, arm, ia64.
  </p>

  <p>
Changes to www/news.wiki.
41
42
43
44
45
46
47
48

49
50
51











52
53

54
55
56
57
58
59
60
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







-
+


-
+
+
+
+
+
+
+
+
+
+
+


+







    Access to archived release packages will be granted on a case-by-case basis.
  </li>
</ul>

<div align="center"><h2><b>Version History</b></h2></div>

<p>
    <b>1.0.106.0 - October XX, 2017 <font color="red">(release scheduled)</font></b>
    <b>1.0.107.0 - January XX, 2018 <font color="red">(release scheduled)</font></b>
</p>
<ul>
    <li>Updated to [https://www.sqlite.org/draft/releaselog/3_21_0.html|SQLite 3.21.0].</li>
    <li>Updated to [https://www.sqlite.org/draft/releaselog/3_22_0.html|SQLite 3.22.0].</li>
    <li>Improve performance of type name lookups by removing superfluous locking and string creation.</li>
    <li>Fix some internal memory accounting present only in the debug build.</li>
    <li>Make sure inbound native delegates are unhooked before adding a connection to the pool. Fix for [0e48e80333].</li>
    <li>Add preliminary support for the .NET Framework 4.7.1.</li>
</ul>
<p>
    <b>1.0.106.0 - November 2, 2017</b>
</p>
<ul>
    <li>Updated to [https://www.sqlite.org/releaselog/3_21_0.html|SQLite 3.21.0].</li>
    <li>Add full support for the native [https://www.sqlite.org/sessionintro.html|session] extension.</li>
    <li>Add BindDecimalAsText and GetDecimalAsText connection flags to force binding and returning of decimal values as text. Pursuant to [b167206ad3].</li>
    <li>Add BindInvariantDecimal and GetInvariantDecimal connection flags, enabled by default, to force binding and returning of decimal values using the invariant culture. Pursuant to [b167206ad3].&nbsp;<b>** Potentially Incompatible Change **</b></li>
    <li>Add preliminary support for Visual Studio 2017 and the .NET Framework 4.7. This does <b>not</b> include support for the design-time components for Visual Studio, see [8292431f51].</li>
</ul>
<p>
    <b>1.0.105.2 - June 12, 2017</b>
</p>
<ul>
    <li>Updated to [https://www.sqlite.org/releaselog/3_19_3.html|SQLite 3.19.3].</li>