System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact e88bc19faf27f571b3744b69a8595e58d34ea354:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 74 6b 74 2d 37 32 39 30 35 63  .#..# tkt-72905c
0060: 39 61 37 37 2e 65 61 67 6c 65 20 2d 2d 0d 0a 23  9a77.eagle --..#
0070: 0d 0a 23 20 57 72 69 74 74 65 6e 20 62 79 20 4a  ..# Written by J
0080: 6f 65 20 4d 69 73 74 61 63 68 6b 69 6e 2e 0d 0a  oe Mistachkin...
0090: 23 20 52 65 6c 65 61 73 65 64 20 74 6f 20 74 68  # Released to th
00a0: 65 20 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e 2c  e public domain,
00b0: 20 75 73 65 20 61 74 20 79 6f 75 72 20 6f 77 6e   use at your own
00c0: 20 72 69 73 6b 21 0d 0a 23 0d 0a 23 23 23 23 23   risk!..#..#####
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 70 61  ##########....pa
0120: 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61  ckage require Ea
0130: 67 6c 65 0d 0a 70 61 63 6b 61 67 65 20 72 65 71  gle..package req
0140: 75 69 72 65 20 45 61 67 6c 65 2e 4c 69 62 72 61  uire Eagle.Libra
0150: 72 79 0d 0a 70 61 63 6b 61 67 65 20 72 65 71 75  ry..package requ
0160: 69 72 65 20 45 61 67 6c 65 2e 54 65 73 74 0d 0a  ire Eagle.Test..
0170: 0d 0a 72 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75  ..runTestPrologu
0180: 65 0d 0a 0d 0a 23 23 23 23 23 23 23 23 23 23 23  e....###########
0190: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01d0: 23 23 23 23 0d 0a 0d 0a 70 61 63 6b 61 67 65 20  ####....package 
01e0: 72 65 71 75 69 72 65 20 53 79 73 74 65 6d 2e 44  require System.D
01f0: 61 74 61 2e 53 51 4c 69 74 65 2e 54 65 73 74 0d  ata.SQLite.Test.
0200: 0a 72 75 6e 53 51 4c 69 74 65 54 65 73 74 50 72  .runSQLiteTestPr
0210: 6f 6c 6f 67 75 65 0d 0a 0d 0a 23 23 23 23 23 23  ologue....######
0220: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0230: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 23 0d 0a  #########....#..
0270: 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72  # NOTE: Make sur
0280: 65 20 74 68 61 74 20 53 51 4c 69 74 65 20 63 6f  e that SQLite co
0290: 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f  re library is co
02a0: 6d 70 6c 65 74 65 6c 79 20 73 68 75 74 64 6f 77  mpletely shutdow
02b0: 6e 20 70 72 69 6f 72 20 74 6f 0d 0a 23 20 20 20  n prior to..#   
02c0: 20 20 20 20 73 74 61 72 74 69 6e 67 20 61 6e 79      starting any
02d0: 20 6f 66 20 74 68 65 20 74 65 73 74 73 20 69 6e   of the tests in
02e0: 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a 23 0d 0a   this file...#..
02f0: 73 68 75 74 64 6f 77 6e 53 51 4c 69 74 65 20 24  shutdownSQLite $
0300: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0330: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0340: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0350: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0360: 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a 20 54 68  ...#..# NOTE: Th
0370: 69 73 20 76 61 6c 75 65 20 69 73 20 6e 65 65 64  is value is need
0380: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
0390: 65 20 74 65 73 74 20 72 65 73 75 6c 74 3b 20 74  e test result; t
03a0: 68 65 72 65 66 6f 72 65 2c 20 69 74 20 6d 75 73  herefore, it mus
03b0: 74 20 62 65 0d 0a 23 20 20 20 20 20 20 20 73 65  t be..#       se
03c0: 74 20 6f 75 74 73 69 64 65 20 6f 66 20 74 68 65  t outside of the
03d0: 20 74 65 73 74 20 73 65 74 75 70 2e 0d 0a 23 0d   test setup...#.
03e0: 0a 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65  .if {[haveSQLite
03f0: 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
0400: 74 68 65 6e 20 7b 0d 0a 20 20 73 65 74 20 69 64  then {..  set id
0410: 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
0420: 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
0430: 63 74 69 76 65 20 4e 65 78 74 49 64 5d 0d 0a 7d  ctive NextId]..}
0440: 20 65 6c 73 65 20 7b 0d 0a 20 20 73 65 74 20 69   else {..  set i
0450: 64 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73  d [clock seconds
0460: 5d 0d 0a 7d 0d 0a 0d 0a 23 23 23 23 23 23 23 23  ]..}....########
0470: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0480: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0490: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04b0: 23 23 23 23 23 23 23 0d 0a 0d 0a 23 0d 0a 23 20  #######....#..# 
04c0: 4e 4f 54 45 3a 20 2a 57 41 52 4e 49 4e 47 2a 20  NOTE: *WARNING* 
04d0: 54 68 69 73 20 74 65 73 74 20 68 61 73 20 62 65  This test has be
04e0: 65 6e 20 65 78 74 72 65 6d 65 6c 79 20 63 61 72  en extremely car
04f0: 65 66 75 6c 6c 79 20 64 65 73 69 67 6e 65 64 3b  efully designed;
0500: 20 68 6f 77 65 76 65 72 2c 20 69 74 0d 0a 23 20   however, it..# 
0510: 20 20 20 20 20 20 69 73 20 73 74 69 6c 6c 20 71        is still q
0520: 75 69 74 65 20 73 65 6e 73 69 74 69 76 65 20 74  uite sensitive t
0530: 6f 20 6d 61 63 68 69 6e 65 20 74 69 6d 69 6e 67  o machine timing
0540: 2c 20 72 65 73 6f 75 72 63 65 20 61 76 61 69 6c  , resource avail
0550: 61 62 69 6c 69 74 79 2c 20 65 74 63 2e 0d 0a 23  ability, etc...#
0560: 20 20 20 20 20 20 20 54 68 69 73 20 74 65 73 74         This test
0570: 20 4d 41 59 20 70 61 73 73 20 65 76 65 6e 20 69   MAY pass even i
0580: 66 20 74 68 65 20 62 75 67 20 75 6e 64 65 72 20  f the bug under 
0590: 74 65 73 74 20 68 61 73 20 6e 6f 74 20 62 65 65  test has not bee
05a0: 6e 20 66 69 78 65 64 20 28 6f 72 0d 0a 23 20 20  n fixed (or..#  
05b0: 20 20 20 20 20 68 61 73 20 62 65 65 6e 20 72 65       has been re
05c0: 67 72 65 73 73 65 64 20 73 6f 6d 65 68 6f 77 29  gressed somehow)
05d0: 2e 20 20 48 6f 77 65 76 65 72 2c 20 64 75 65 20  .  However, due 
05e0: 74 6f 20 74 68 65 20 75 6e 70 72 65 64 69 63 74  to the unpredict
05f0: 61 62 6c 65 20 6e 61 74 75 72 65 0d 0a 23 20 20  able nature..#  
0600: 20 20 20 20 20 6f 66 20 72 61 63 65 20 63 6f 6e       of race con
0610: 64 69 74 69 6f 6e 73 2c 20 69 74 20 72 65 61 6c  ditions, it real
0620: 6c 79 20 69 73 20 74 68 65 20 62 65 73 74 20 74  ly is the best t
0630: 68 61 74 20 63 61 6e 20 62 65 20 64 6f 6e 65 2e  hat can be done.
0640: 20 20 54 68 69 73 20 74 65 73 74 0d 0a 23 20 20    This test..#  
0650: 20 20 20 20 20 77 69 6c 6c 20 6f 6e 6c 79 20 77       will only w
0660: 6f 72 6b 20 61 73 20 69 6e 74 65 6e 64 65 64 20  ork as intended 
0670: 69 66 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f  if the version o
0680: 66 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  f System.Data.SQ
0690: 4c 69 74 65 20 62 65 69 6e 67 0d 0a 23 20 20 20  Lite being..#   
06a0: 20 20 20 20 74 65 73 74 65 64 20 69 73 20 31 2e      tested is 1.
06b0: 30 2e 37 37 2e 30 20 6f 72 20 68 69 67 68 65 72  0.77.0 or higher
06c0: 2e 0d 0a 23 0d 0a 72 75 6e 54 65 73 74 20 7b 74  ...#..runTest {t
06d0: 65 73 74 20 74 6b 74 2d 37 32 39 30 35 63 39 61  est tkt-72905c9a
06e0: 37 37 2d 31 2e 31 20 7b 53 74 61 74 69 63 49 73  77-1.1 {StaticIs
06f0: 49 6e 69 74 69 61 6c 69 7a 65 64 20 72 61 63 65  Initialized race
0700: 20 63 6f 6e 64 69 74 69 6f 6e 7d 20 2d 73 65 74   condition} -set
0710: 75 70 20 7b 0d 0a 20 20 73 65 74 20 66 69 6c 65  up {..  set file
0720: 4e 61 6d 65 20 74 6b 74 2d 37 32 39 30 35 63 39  Name tkt-72905c9
0730: 61 37 37 2d 31 2e 31 2e 64 62 0d 0a 7d 20 2d 62  a77-1.1.db..} -b
0740: 6f 64 79 20 7b 0d 0a 20 20 73 65 74 20 64 61 74  ody {..  set dat
0750: 61 53 6f 75 72 63 65 20 5b 66 69 6c 65 20 6a 6f  aSource [file jo
0760: 69 6e 20 5b 67 65 74 44 61 74 61 62 61 73 65 44  in [getDatabaseD
0770: 69 72 65 63 74 6f 72 79 5d 20 24 66 69 6c 65 4e  irectory] $fileN
0780: 61 6d 65 5d 0d 0a 0d 0a 20 20 75 6e 73 65 74 20  ame]....  unset 
0790: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 72 65 73 75  -nocomplain resu
07a0: 6c 74 73 20 65 72 72 6f 72 73 0d 0a 0d 0a 20 20  lts errors....  
07b0: 73 65 74 20 63 6f 64 65 20 5b 63 6f 6d 70 69 6c  set code [compil
07c0: 65 43 53 68 61 72 70 57 69 74 68 20 5b 73 75 62  eCSharpWith [sub
07d0: 73 74 20 7b 0d 0a 20 20 20 20 75 73 69 6e 67 20  st {..    using 
07e0: 53 79 73 74 65 6d 3b 0d 0a 20 20 20 20 75 73 69  System;..    usi
07f0: 6e 67 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ng System.Data.S
0800: 51 4c 69 74 65 3b 0d 0a 20 20 20 20 75 73 69 6e  QLite;..    usin
0810: 67 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73  g System.Diagnos
0820: 74 69 63 73 3b 0d 0a 20 20 20 20 75 73 69 6e 67  tics;..    using
0830: 20 53 79 73 74 65 6d 2e 49 4f 3b 0d 0a 20 20 20   System.IO;..   
0840: 20 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 52 65   using System.Re
0850: 66 6c 65 63 74 69 6f 6e 3b 0d 0a 20 20 20 20 75  flection;..    u
0860: 73 69 6e 67 20 53 79 73 74 65 6d 2e 54 65 78 74  sing System.Text
0870: 3b 0d 0a 20 20 20 20 75 73 69 6e 67 20 53 79 73  ;..    using Sys
0880: 74 65 6d 2e 54 68 72 65 61 64 69 6e 67 3b 0d 0a  tem.Threading;..
0890: 0d 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20  ..    namespace 
08a0: 5f 44 79 6e 61 6d 69 63 24 7b 69 64 7d 0d 0a 20  _Dynamic${id}.. 
08b0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 70 75 62 6c     {..      publ
08c0: 69 63 20 73 74 61 74 69 63 20 63 6c 61 73 73 20  ic static class 
08d0: 54 65 73 74 24 7b 69 64 7d 0d 0a 20 20 20 20 20  Test${id}..     
08e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 70 75 62 6c   {..        publ
08f0: 69 63 20 73 74 61 74 69 63 20 73 74 72 69 6e 67  ic static string
0900: 20 47 65 74 54 72 61 63 65 4f 75 74 70 75 74 28   GetTraceOutput(
0910: 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  )..        {..  
0920: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
0930: 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 43        // NOTE: C
0940: 72 65 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 73  reate a memory s
0950: 74 72 65 61 6d 20 74 6f 20 63 61 70 74 75 72 65  tream to capture
0960: 20 61 6c 6c 20 74 68 65 20 74 72 61 63 65 20 6f   all the trace o
0970: 75 74 70 75 74 20 66 6f 72 0d 0a 20 20 20 20 20  utput for..     
0980: 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 74 68       //       th
0990: 69 73 20 74 65 73 74 2e 0d 0a 20 20 20 20 20 20  is test...      
09a0: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
09b0: 20 20 4d 65 6d 6f 72 79 53 74 72 65 61 6d 20 6d    MemoryStream m
09c0: 65 6d 6f 72 79 53 74 72 65 61 6d 20 3d 20 6e 65  emoryStream = ne
09d0: 77 20 4d 65 6d 6f 72 79 53 74 72 65 61 6d 28 29  w MemoryStream()
09e0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 2f  ;....          /
09f0: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20  /..          // 
0a00: 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 74 68 65  NOTE: Create the
0a10: 20 74 72 61 63 65 20 6c 69 73 74 65 6e 65 72 20   trace listener 
0a20: 75 73 69 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79  using the memory
0a30: 20 73 74 72 65 61 6d 20 77 65 20 6a 75 73 74 0d   stream we just.
0a40: 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20  .          //   
0a50: 20 20 20 20 63 72 65 61 74 65 64 2e 0d 0a 20 20      created...  
0a60: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
0a70: 20 20 20 20 20 20 75 73 69 6e 67 20 28 54 72 61        using (Tra
0a80: 63 65 4c 69 73 74 65 6e 65 72 20 6c 69 73 74 65  ceListener liste
0a90: 6e 65 72 20 3d 20 6e 65 77 20 54 65 78 74 57 72  ner = new TextWr
0aa0: 69 74 65 72 54 72 61 63 65 4c 69 73 74 65 6e 65  iterTraceListene
0ab0: 72 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  r(..            
0ac0: 20 20 6d 65 6d 6f 72 79 53 74 72 65 61 6d 29 29    memoryStream))
0ad0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20  ..          {.. 
0ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
0af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f             // NO
0b00: 54 45 3a 20 41 64 64 20 74 68 65 20 74 72 61 63  TE: Add the trac
0b10: 65 20 6c 69 73 74 65 6e 65 72 20 74 6f 20 74 68  e listener to th
0b20: 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20  e collection of 
0b30: 61 63 74 69 76 65 20 74 72 61 63 65 0d 0a 20 20  active trace..  
0b40: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
0b50: 20 20 20 6c 69 73 74 65 6e 65 72 73 20 28 66 6f     listeners (fo
0b60: 72 20 74 68 69 73 20 61 70 70 6c 69 63 61 74 69  r this applicati
0b70: 6f 6e 20 64 6f 6d 61 69 6e 29 2e 0d 0a 20 20 20  on domain)...   
0b80: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
0b90: 20 20 20 20 20 20 20 20 20 54 72 61 63 65 2e 4c           Trace.L
0ba0: 69 73 74 65 6e 65 72 73 2e 41 64 64 28 6c 69 73  isteners.Add(lis
0bb0: 74 65 6e 65 72 29 3b 0d 0a 0d 0a 20 20 20 20 20  tener);....     
0bc0: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
0bd0: 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20         // NOTE: 
0be0: 41 74 74 65 6d 70 74 20 74 6f 20 6c 6f 6f 6b 75  Attempt to looku
0bf0: 70 20 74 68 65 20 74 79 70 65 20 66 6f 72 20 74  p the type for t
0c00: 68 65 20 70 72 69 76 61 74 65 20 53 51 4c 69 74  he private SQLit
0c10: 65 33 20 63 6c 61 73 73 0d 0a 20 20 20 20 20 20  e3 class..      
0c20: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 69        //       i
0c30: 6e 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74  n the System.Dat
0c40: 61 2e 53 51 4c 69 74 65 20 61 73 73 65 6d 62 6c  a.SQLite assembl
0c50: 79 2e 20 20 57 65 20 6e 65 65 64 20 74 68 65 20  y.  We need the 
0c60: 74 79 70 65 20 69 6e 0d 0a 20 20 20 20 20 20 20  type in..       
0c70: 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 6f 72       //       or
0c80: 64 65 72 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  der to lookup th
0c90: 65 20 70 72 69 6d 61 72 79 20 6d 65 74 68 6f 64  e primary method
0ca0: 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 74   used for this t
0cb0: 65 73 74 20 28 76 69 61 0d 0a 20 20 20 20 20 20  est (via..      
0cc0: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 72        //       r
0cd0: 65 66 6c 65 63 74 69 6f 6e 29 2e 20 20 54 68 69  eflection).  Thi
0ce0: 73 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73  s is only necess
0cf0: 61 72 79 20 62 65 63 61 75 73 65 20 74 68 65 20  ary because the 
0d00: 6d 65 74 68 6f 64 0d 0a 20 20 20 20 20 20 20 20  method..        
0d10: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 75 6e 64      //       und
0d20: 65 72 20 74 65 73 74 20 69 73 20 70 72 69 76 61  er test is priva
0d30: 74 65 20 61 6e 64 20 63 61 6e 6e 6f 74 20 6e 6f  te and cannot no
0d40: 72 6d 61 6c 6c 79 20 62 65 20 65 78 65 63 75 74  rmally be execut
0d50: 65 64 20 66 72 6f 6d 0d 0a 20 20 20 20 20 20 20  ed from..       
0d60: 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 43 23       //       C#
0d70: 20 64 69 72 65 63 74 6c 79 2e 20 20 49 66 20 74   directly.  If t
0d80: 68 69 73 20 66 61 69 6c 73 2c 20 74 68 65 20 66  his fails, the f
0d90: 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
0da0: 6e 74 20 77 69 6c 6c 0d 0a 20 20 20 20 20 20 20  nt will..       
0db0: 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 74 68       //       th
0dc0: 72 6f 77 20 61 20 4e 75 6c 6c 52 65 66 65 72 65  row a NullRefere
0dd0: 6e 63 65 45 78 63 65 70 74 69 6f 6e 2c 20 77 68  nceException, wh
0de0: 69 63 68 20 69 73 20 66 69 6e 65 20 61 73 20 74  ich is fine as t
0df0: 68 61 74 20 77 69 6c 6c 0d 0a 20 20 20 20 20 20  hat will..      
0e00: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 63        //       c
0e10: 61 75 73 65 20 74 68 65 20 77 68 6f 6c 65 20 74  ause the whole t
0e20: 65 73 74 20 74 6f 20 66 61 69 6c 2e 0d 0a 20 20  est to fail...  
0e30: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
0e40: 20 20 20 20 20 20 20 20 20 20 54 79 70 65 20 74            Type t
0e50: 79 70 65 20 3d 20 54 79 70 65 2e 47 65 74 54 79  ype = Type.GetTy
0e60: 70 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  pe(..           
0e70: 20 20 20 20 20 22 53 79 73 74 65 6d 2e 44 61 74       "System.Dat
0e80: 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33  a.SQLite.SQLite3
0e90: 2c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  , System.Data.SQ
0ea0: 4c 69 74 65 22 29 3b 0d 0a 0d 0a 20 20 20 20 20  Lite");....     
0eb0: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
0ec0: 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20         // NOTE: 
0ed0: 41 74 74 65 6d 70 74 20 74 6f 20 6c 6f 6f 6b 75  Attempt to looku
0ee0: 70 20 74 68 65 20 6d 65 74 68 6f 64 20 6f 62 6a  p the method obj
0ef0: 65 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 76  ect for the priv
0f00: 61 74 65 20 6d 65 74 68 6f 64 0d 0a 20 20 20 20  ate method..    
0f10: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
0f20: 20 77 65 20 6e 65 65 64 20 66 6f 72 20 74 68 69   we need for thi
0f30: 73 20 74 65 73 74 2e 20 20 49 66 20 74 68 69 73  s test.  If this
0f40: 20 66 61 69 6c 73 2c 20 74 68 65 20 66 69 72 73   fails, the firs
0f50: 74 20 61 74 74 65 6d 70 74 0d 0a 20 20 20 20 20  t attempt..     
0f60: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
0f70: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 6d 65  to invoke the me
0f80: 74 68 6f 64 20 75 73 69 6e 67 20 74 68 69 73 20  thod using this 
0f90: 76 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 74 68  variable will th
0fa0: 72 6f 77 20 61 0d 0a 20 20 20 20 20 20 20 20 20  row a..         
0fb0: 20 20 20 2f 2f 20 20 20 20 20 20 20 4e 75 6c 6c     //       Null
0fc0: 52 65 66 65 72 65 6e 63 65 45 78 63 65 70 74 69  ReferenceExcepti
0fd0: 6f 6e 2c 20 77 68 69 63 68 20 69 73 20 66 69 6e  on, which is fin
0fe0: 65 20 61 73 20 74 68 61 74 20 77 69 6c 6c 20 63  e as that will c
0ff0: 61 75 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20  ause..          
1000: 20 20 2f 2f 20 20 20 20 20 20 20 74 68 65 20 77    //       the w
1010: 68 6f 6c 65 20 74 65 73 74 20 74 6f 20 66 61 69  hole test to fai
1020: 6c 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l...            
1030: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
1040: 4d 65 74 68 6f 64 49 6e 66 6f 20 6d 65 74 68 6f  MethodInfo metho
1050: 64 49 6e 66 6f 20 3d 20 74 79 70 65 2e 47 65 74  dInfo = type.Get
1060: 4d 65 74 68 6f 64 28 22 53 74 61 74 69 63 49 73  Method("StaticIs
1070: 49 6e 69 74 69 61 6c 69 7a 65 64 22 2c 0d 0a 20  Initialized",.. 
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 42                 B
1090: 69 6e 64 69 6e 67 46 6c 61 67 73 2e 53 74 61 74  indingFlags.Stat
10a0: 69 63 20 7c 20 42 69 6e 64 69 6e 67 46 6c 61 67  ic | BindingFlag
10b0: 73 2e 4e 6f 6e 50 75 62 6c 69 63 29 3b 0d 0a 0d  s.NonPublic);...
10c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d  .            //.
10d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
10e0: 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 74 68 65  NOTE: Create the
10f0: 20 65 76 65 6e 74 20 74 68 61 74 20 77 69 6c 6c   event that will
1100: 20 62 65 20 75 73 65 64 20 74 6f 20 73 79 6e 63   be used to sync
1110: 68 72 6f 6e 69 7a 65 20 61 6c 6c 20 74 68 65 0d  hronize all the.
1120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
1130: 20 20 20 20 20 20 63 72 65 61 74 65 64 20 74 68        created th
1140: 72 65 61 64 73 20 73 6f 20 74 68 61 74 20 74 68  reads so that th
1150: 65 79 20 73 74 61 72 74 20 64 6f 69 6e 67 20 74  ey start doing t
1160: 68 65 69 72 20 61 63 74 75 61 6c 20 74 65 73 74  heir actual test
1170: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
1180: 20 20 20 20 20 20 20 22 77 6f 72 6b 22 20 61 74         "work" at
1190: 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 74   approximately t
11a0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0d 0a 20  he same time... 
11b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
11c0: 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67             using
11d0: 20 28 4d 61 6e 75 61 6c 52 65 73 65 74 45 76 65   (ManualResetEve
11e0: 6e 74 20 67 6f 45 76 65 6e 74 20 3d 20 6e 65 77  nt goEvent = new
11f0: 20 4d 61 6e 75 61 6c 52 65 73 65 74 45 76 65 6e   ManualResetEven
1200: 74 28 66 61 6c 73 65 29 29 0d 0a 20 20 20 20 20  t(false))..     
1210: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1220: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
1230: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54            // NOT
1240: 45 3a 20 43 72 65 61 74 65 20 34 20 74 68 72 65  E: Create 4 thre
1250: 61 64 73 20 66 6f 72 20 65 61 63 68 20 70 72 6f  ads for each pro
1260: 63 65 73 73 6f 72 20 6f 6e 20 74 68 65 20 6d 61  cessor on the ma
1270: 63 68 69 6e 65 2e 0d 0a 20 20 20 20 20 20 20 20  chine...        
1280: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 55        //       U
1290: 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63  nder normal circ
12a0: 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69 73 20  umstances, this 
12b0: 73 68 6f 75 6c 64 20 67 69 76 65 20 75 73 20 61  should give us a
12c0: 20 67 6f 6f 64 0d 0a 20 20 20 20 20 20 20 20 20   good..         
12d0: 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 63 68       //       ch
12e0: 61 6e 63 65 20 6f 66 20 74 72 69 67 67 65 72 69  ance of triggeri
12f0: 6e 67 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64  ng the race cond
1300: 69 74 69 6f 6e 20 62 65 69 6e 67 20 74 65 73 74  ition being test
1310: 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed...           
1320: 20 20 20 2f 2f 20 20 20 20 20 20 20 48 6f 77 65     //       Howe
1330: 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20  ver, since this 
1340: 74 65 73 74 20 77 61 73 20 6f 72 69 67 69 6e 61  test was origina
1350: 6c 6c 79 20 64 65 73 69 67 6e 65 64 20 6f 6e 20  lly designed on 
1360: 61 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a..             
1370: 20 2f 2f 20 20 20 20 20 20 20 6d 61 63 68 69 6e   //       machin
1380: 65 20 77 69 74 68 20 34 20 70 72 6f 63 65 73 73  e with 4 process
1390: 6f 72 73 2c 20 6c 69 6d 69 74 20 74 68 65 20 74  ors, limit the t
13a0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0d 0a  otal number of..
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
13c0: 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20 74         threads t
13d0: 6f 20 31 36 2e 0d 0a 20 20 20 20 20 20 20 20 20  o 16...         
13e0: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
13f0: 20 20 20 20 20 20 20 69 6e 74 20 63 6f 75 6e 74         int count
1400: 20 3d 20 4d 61 74 68 2e 4d 69 6e 28 34 20 2a 20   = Math.Min(4 * 
1410: 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 50 72 6f 63  Environment.Proc
1420: 65 73 73 6f 72 43 6f 75 6e 74 2c 20 31 36 29 3b  essorCount, 16);
1430: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1440: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
1450: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 43 72 65      // NOTE: Cre
1460: 61 74 65 20 61 20 28 72 65 75 73 61 62 6c 65 29  ate a (reusable)
1470: 20 64 65 6c 65 67 61 74 65 20 74 68 61 74 20 77   delegate that w
1480: 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  ill contain the 
1490: 63 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 20 20  code..          
14a0: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 74 68 61      //       tha
14b0: 74 20 65 61 63 68 20 63 72 65 61 74 65 64 20 74  t each created t
14c0: 68 72 65 61 64 20 69 73 20 74 6f 20 65 78 65 63  hread is to exec
14d0: 75 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ute...          
14e0: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
14f0: 20 20 20 20 20 20 54 68 72 65 61 64 53 74 61 72        ThreadStar
1500: 74 20 74 68 72 65 61 64 53 74 61 72 74 20 3d 20  t threadStart = 
1510: 64 65 6c 65 67 61 74 65 28 29 0d 0a 20 20 20 20  delegate()..    
1520: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
1540: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1550: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1560: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
1580: 4e 4f 54 45 3a 20 57 61 69 74 20 66 6f 72 65 76  NOTE: Wait forev
1590: 65 72 20 66 6f 72 20 74 68 65 20 22 47 4f 22 20  er for the "GO" 
15a0: 73 69 67 6e 61 6c 20 73 6f 20 74 68 61 74 20 61  signal so that a
15b0: 6c 6c 20 74 68 72 65 61 64 73 0d 0a 20 20 20 20  ll threads..    
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
15d0: 20 20 20 20 20 20 20 63 61 6e 20 73 74 61 72 74         can start
15e0: 20 77 6f 72 6b 69 6e 67 20 61 74 20 61 70 70 72   working at appr
15f0: 6f 78 69 6d 61 74 65 6c 79 20 74 68 65 20 73 61  oximately the sa
1600: 6d 65 20 74 69 6d 65 2e 0d 0a 20 20 20 20 20 20  me time...      
1610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1630: 20 20 67 6f 45 76 65 6e 74 2e 57 61 69 74 4f 6e    goEvent.WaitOn
1640: 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  e();....        
1650: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1670: 2f 2f 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20  // NOTE: Create 
1680: 61 20 70 73 65 75 64 6f 72 61 6e 64 6f 6d 20 6e  a pseudorandom n
1690: 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20  umber generator 
16a0: 73 75 69 74 61 62 6c 65 20 66 6f 72 0d 0a 20 20  suitable for..  
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 2f 2f 20 20 20 20 20 20 20 77 61 69 74 69 6e 67  //       waiting
16d0: 20 61 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72   a random number
16e0: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
16f0: 20 62 65 74 77 65 65 6e 20 65 61 63 68 0d 0a 20   between each.. 
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 2f 2f 20 20 20 20 20 20 20 61 74 74 65 6d 70   //       attemp
1720: 74 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 72  t to cause the r
1730: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 62 65  ace condition be
1740: 69 6e 67 20 74 65 73 74 65 64 20 6f 6e 0d 0a 20  ing tested on.. 
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1760: 20 2f 2f 20 20 20 20 20 20 20 61 20 67 69 76 65   //       a give
1770: 6e 20 74 68 72 65 61 64 2e 0d 0a 20 20 20 20 20  n thread...     
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d               //.
1790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17a0: 20 20 20 52 61 6e 64 6f 6d 20 72 61 6e 64 6f 6d     Random random
17b0: 20 3d 20 6e 65 77 20 52 61 6e 64 6f 6d 28 29 3b   = new Random();
17c0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
17d0: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e              // N
17f0: 4f 54 45 3a 20 46 6f 72 63 65 20 74 68 65 20 53  OTE: Force the S
1800: 51 4c 69 74 65 4c 6f 67 2e 53 74 61 74 69 63 49  QLiteLog.StaticI
1810: 73 49 6e 69 74 69 61 6c 69 7a 65 64 20 6d 65 74  sInitialized met
1820: 68 6f 64 20 74 6f 0d 0a 20 20 20 20 20 20 20 20  hod to..        
1830: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
1840: 20 20 20 62 65 20 72 65 70 65 61 74 65 64 6c 79     be repeatedly
1850: 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79   called on every
1860: 20 74 68 72 65 61 64 20 72 69 67 68 74 20 61 77   thread right aw
1870: 61 79 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 20  ay to..         
1880: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
1890: 20 20 74 68 6f 72 6f 75 67 68 6c 79 20 74 65 73    thoroughly tes
18a0: 74 20 69 74 73 20 6c 6f 63 6b 69 6e 67 20 73 65  t its locking se
18b0: 6d 61 6e 74 69 63 73 2e 20 20 41 6c 73 6f 2c 20  mantics.  Also, 
18c0: 75 73 65 20 61 0d 0a 20 20 20 20 20 20 20 20 20  use a..         
18d0: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
18e0: 20 20 72 61 6e 64 6f 6d 20 64 65 6c 61 79 2c 20    random delay, 
18f0: 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  in milliseconds,
1900: 20 62 65 74 77 65 65 6e 20 7a 65 72 6f 20 61 6e   between zero an
1910: 64 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20  d the..         
1920: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
1930: 20 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 73 74    number of test
1940: 20 74 68 72 65 61 64 73 20 73 71 75 61 72 65 64   threads squared
1950: 20 61 66 74 65 72 20 65 61 63 68 20 61 74 74 65   after each atte
1960: 6d 70 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  mpt...          
1970: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
1990: 72 20 28 69 6e 74 20 69 6e 64 65 78 20 3d 20 30  r (int index = 0
19a0: 3b 20 69 6e 64 65 78 20 3c 20 28 63 6f 75 6e 74  ; index < (count
19b0: 20 2a 20 63 6f 75 6e 74 29 3b 20 69 6e 64 65 78   * count); index
19c0: 2b 2b 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ++)..           
19d0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
19f0: 74 68 6f 64 49 6e 66 6f 2e 49 6e 76 6f 6b 65 28  thodInfo.Invoke(
1a00: 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0d 0a 20 20  null, null);..  
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a20: 20 20 54 68 72 65 61 64 2e 53 6c 65 65 70 28 72    Thread.Sleep(r
1a30: 61 6e 64 6f 6d 2e 4e 65 78 74 28 30 2c 20 28 63  andom.Next(0, (c
1a40: 6f 75 6e 74 20 2a 20 63 6f 75 6e 74 29 29 29 3b  ount * count)));
1a50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a60: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1a70: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 2f 2f 20 4e 4f 54 45 3a 20 43 72 65 61 74 65   // NOTE: Create
1aa0: 20 61 6e 64 20 6f 70 65 6e 20 61 20 63 6f 6e 6e   and open a conn
1ab0: 65 63 74 69 6f 6e 20 61 6e 64 20 75 73 65 20 69  ection and use i
1ac0: 74 20 74 6f 20 6c 6f 67 20 61 0d 0a 20 20 20 20  t to log a..    
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
1ae0: 20 20 20 20 20 20 20 74 65 73 74 20 6d 65 73 73         test mess
1af0: 61 67 65 20 6a 75 73 74 20 74 6f 20 6d 61 6b 65  age just to make
1b00: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c   sure that the l
1b10: 6f 67 67 69 6e 67 0d 0a 20 20 20 20 20 20 20 20  ogging..        
1b20: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
1b30: 20 20 20 73 79 73 74 65 6d 20 69 73 20 69 6e 69     system is ini
1b40: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 69 6e 20  tialized and in 
1b50: 77 6f 72 6b 69 6e 67 20 6f 72 64 65 72 2e 0d 0a  working order...
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b70: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
1b80: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 53          using (S
1b90: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  QLiteConnection 
1ba0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 6e 65 77  connection = new
1bb0: 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
1bc0: 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n(..            
1bd0: 20 20 20 20 20 20 20 20 20 20 22 44 61 74 61 20            "Data 
1be0: 53 6f 75 72 63 65 3d 24 7b 64 61 74 61 53 6f 75  Source=${dataSou
1bf0: 72 63 65 7d 3b 5b 67 65 74 54 65 73 74 50 72 6f  rce};[getTestPro
1c00: 70 65 72 74 69 65 73 5d 22 29 29 0d 0a 20 20 20  perties]"))..   
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
1c20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c30: 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
1c40: 2e 4f 70 65 6e 28 29 3b 0d 0a 20 20 20 20 20 20  .Open();..      
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
1c60: 6e 6e 65 63 74 69 6f 6e 2e 4c 6f 67 4d 65 73 73  nnection.LogMess
1c70: 61 67 65 28 30 2c 20 22 54 45 53 54 20 24 7b 69  age(0, "TEST ${i
1c80: 64 7d 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  d}");..         
1c90: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
1cc0: 61 74 63 68 20 28 45 78 63 65 70 74 69 6f 6e 20  atch (Exception 
1cd0: 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e)..            
1ce0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1cf0: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d10: 2f 20 4e 4f 54 45 3a 20 57 65 20 63 61 75 67 68  / NOTE: We caugh
1d20: 74 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20  t an exception. 
1d30: 20 53 69 6e 63 65 20 74 68 69 73 20 77 69 6c 6c   Since this will
1d40: 20 69 6d 70 61 63 74 20 74 68 65 0d 0a 20 20 20   impact the..   
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d60: 2f 20 20 20 20 20 20 20 63 61 70 74 75 72 65 64  /       captured
1d70: 20 74 72 61 63 65 20 6f 75 74 70 75 74 2c 20 74   trace output, t
1d80: 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74  his will cause t
1d90: 68 65 20 74 65 73 74 20 74 6f 0d 0a 20 20 20 20  he test to..    
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
1db0: 20 20 20 20 20 20 20 66 61 69 6c 20 28 6a 75 73         fail (jus
1dc0: 74 20 61 73 20 69 74 20 73 68 6f 75 6c 64 29 2e  t as it should).
1dd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1de0: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
1df0: 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 2e            Trace.
1e00: 57 72 69 74 65 4c 69 6e 65 28 53 74 72 69 6e 67  WriteLine(String
1e10: 2e 46 6f 72 6d 61 74 28 22 43 41 55 47 48 54 3a  .Format("CAUGHT:
1e20: 20 7b 30 7d 22 2c 20 65 29 29 3b 0d 0a 20 20 20   {0}", e));..   
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 3b                };
1e50: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1e60: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
1e70: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 43 72 65      // NOTE: Cre
1e80: 61 74 65 20 74 68 65 20 61 72 72 61 79 20 6f 66  ate the array of
1e90: 20 74 68 72 65 61 64 20 6f 62 6a 65 63 74 73 2e   thread objects.
1ea0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1eb0: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
1ec0: 20 20 54 68 72 65 61 64 5c 5b 5c 5d 20 74 68 72    Thread\[\] thr
1ed0: 65 61 64 20 3d 20 6e 65 77 20 54 68 72 65 61 64  ead = new Thread
1ee0: 5c 5b 63 6f 75 6e 74 5c 5d 3b 0d 0a 0d 0a 20 20  \[count\];....  
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
1f10: 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 65 61   NOTE: Create ea
1f20: 63 68 20 6f 66 20 74 68 65 20 74 65 73 74 20 74  ch of the test t
1f30: 68 72 65 61 64 73 20 77 69 74 68 20 61 20 73 75  hreads with a su
1f40: 69 74 61 62 6c 65 20 73 74 61 63 6b 0d 0a 20 20  itable stack..  
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
1f60: 20 20 20 20 20 73 69 7a 65 2e 20 20 57 65 20 6d       size.  We m
1f70: 75 73 74 20 73 70 65 63 69 66 79 20 61 20 73 74  ust specify a st
1f80: 61 63 6b 20 73 69 7a 65 20 68 65 72 65 20 62 65  ack size here be
1f90: 63 61 75 73 65 20 74 68 65 0d 0a 20 20 20 20 20  cause the..     
1fa0: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
1fb0: 20 20 64 65 66 61 75 6c 74 20 6f 6e 65 20 66 6f    default one fo
1fc0: 72 20 74 68 65 20 70 72 6f 63 65 73 73 20 77 6f  r the process wo
1fd0: 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20  uld be the same 
1fe0: 61 73 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  as the..        
1ff0: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 70        //       p
2000: 61 72 65 6e 74 20 65 78 65 63 75 74 61 62 6c 65  arent executable
2010: 20 28 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c   (the Eagle shel
2020: 6c 29 2c 20 77 68 69 63 68 20 69 73 20 31 36 4d  l), which is 16M
2030: 42 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  B,..            
2040: 20 20 2f 2f 20 20 20 20 20 20 20 74 6f 6f 20 6c    //       too l
2050: 61 72 67 65 20 74 6f 20 62 65 20 75 73 65 66 75  arge to be usefu
2060: 6c 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l...            
2070: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
2080: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 6e 64      for (int ind
2090: 65 78 20 3d 20 30 3b 20 69 6e 64 65 78 20 3c 20  ex = 0; index < 
20a0: 63 6f 75 6e 74 3b 20 69 6e 64 65 78 2b 2b 29 0d  count; index++).
20b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
20c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20d0: 20 20 74 68 72 65 61 64 5c 5b 69 6e 64 65 78 5c    thread\[index\
20e0: 5d 20 3d 20 6e 65 77 20 54 68 72 65 61 64 28 74  ] = new Thread(t
20f0: 68 72 65 61 64 53 74 61 72 74 2c 20 31 30 34 38  hreadStart, 1048
2100: 35 37 36 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  576);....       
2110: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
2130: 4e 4f 54 45 3a 20 4e 61 6d 65 20 65 61 63 68 20  NOTE: Name each 
2140: 74 68 72 65 61 64 20 66 6f 72 20 61 20 62 65 74  thread for a bet
2150: 74 65 72 20 64 65 62 75 67 67 69 6e 67 20 65 78  ter debugging ex
2160: 70 65 72 69 65 6e 63 65 2e 0d 0a 20 20 20 20 20  perience...     
2170: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2190: 68 72 65 61 64 5c 5b 69 6e 64 65 78 5c 5d 2e 4e  hread\[index\].N
21a0: 61 6d 65 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72  ame = String.For
21b0: 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
21c0: 20 20 20 20 20 20 20 20 20 20 22 5b 66 69 6c 65            "[file
21d0: 20 72 6f 6f 74 6e 61 6d 65 20 24 7b 66 69 6c 65   rootname ${file
21e0: 4e 61 6d 65 7d 5d 20 23 7b 30 7d 22 2c 20 69 6e  Name}] #{0}", in
21f0: 64 65 78 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  dex);..         
2200: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2210: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
2220: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54            // NOT
2230: 45 3a 20 46 6f 72 63 65 20 6c 6f 67 67 69 6e 67  E: Force logging
2240: 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   to be initializ
2250: 65 64 20 6e 6f 77 3b 20 6f 74 68 65 72 77 69 73  ed now; otherwis
2260: 65 2c 20 74 68 65 72 65 20 69 73 0d 0a 20 20 20  e, there is..   
2270: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
2280: 20 20 20 20 6e 6f 20 77 61 79 20 66 6f 72 20 74      no way for t
2290: 68 65 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65  he native SQLite
22a0: 20 6c 69 62 72 61 72 79 20 74 6f 20 69 6d 70 61   library to impa
22b0: 63 74 20 74 68 65 20 74 72 61 63 65 0d 0a 20 20  ct the trace..  
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
22d0: 20 20 20 20 20 6c 69 73 74 65 6e 65 72 20 77 65       listener we
22e0: 20 61 72 65 20 6d 6f 6e 69 74 6f 72 69 6e 67 20   are monitoring 
22f0: 66 6f 72 20 6f 75 74 70 75 74 2e 0d 0a 20 20 20  for output...   
2300: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
2320: 69 74 65 4c 6f 67 2e 49 6e 69 74 69 61 6c 69 7a  iteLog.Initializ
2330: 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  e();....        
2340: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
2350: 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a          // NOTE:
2360: 20 53 74 61 72 74 20 61 6c 6c 20 74 68 65 20 74   Start all the t
2370: 68 72 65 61 64 73 20 6e 6f 77 2e 20 20 54 68 65  hreads now.  The
2380: 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 63 74  y should not act
2390: 75 61 6c 6c 79 20 64 6f 0d 0a 20 20 20 20 20 20  ually do..      
23a0: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
23b0: 20 61 6e 79 20 6f 66 20 74 68 65 20 74 65 73 74   any of the test
23c0: 20 22 77 6f 72 6b 22 20 75 6e 74 69 6c 20 77 65   "work" until we
23d0: 20 73 69 67 6e 61 6c 20 74 68 65 20 65 76 65 6e   signal the even
23e0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t...            
23f0: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
2400: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 6e 64      for (int ind
2410: 65 78 20 3d 20 30 3b 20 69 6e 64 65 78 20 3c 20  ex = 0; index < 
2420: 63 6f 75 6e 74 3b 20 69 6e 64 65 78 2b 2b 29 0d  count; index++).
2430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2440: 20 74 68 72 65 61 64 5c 5b 69 6e 64 65 78 5c 5d   thread\[index\]
2450: 2e 53 74 61 72 74 28 29 3b 0d 0a 0d 0a 20 20 20  .Start();....   
2460: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
2480: 4e 4f 54 45 3a 20 53 65 6e 64 20 74 68 65 20 73  NOTE: Send the s
2490: 69 67 6e 61 6c 20 74 68 61 74 20 61 6c 6c 20 74  ignal that all t
24a0: 68 72 65 61 64 73 20 73 68 6f 75 6c 64 20 73 74  hreads should st
24b0: 61 72 74 20 64 6f 69 6e 67 0d 0a 20 20 20 20 20  art doing..     
24c0: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
24d0: 20 20 74 68 65 69 72 20 74 65 73 74 20 22 77 6f    their test "wo
24e0: 72 6b 22 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  rk" now...      
24f0: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
2500: 20 20 20 20 20 20 20 20 20 20 67 6f 45 76 65 6e            goEven
2510: 74 2e 53 65 74 28 29 3b 20 2f 2a 20 47 4f 20 2a  t.Set(); /* GO *
2520: 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
2530: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
2540: 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 57 61       // NOTE: Wa
2550: 69 74 20 66 6f 72 65 76 65 72 20 66 6f 72 20 65  it forever for e
2560: 61 63 68 20 74 68 72 65 61 64 20 74 6f 20 66 69  ach thread to fi
2570: 6e 69 73 68 20 69 74 73 20 74 65 73 74 20 22 77  nish its test "w
2580: 6f 72 6b 22 0d 0a 20 20 20 20 20 20 20 20 20 20  ork"..          
2590: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 61 6e 64      //       and
25a0: 20 74 68 65 6e 20 64 69 65 2e 0d 0a 20 20 20 20   then die...    
25b0: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
25d0: 28 69 6e 74 20 69 6e 64 65 78 20 3d 20 30 3b 20  (int index = 0; 
25e0: 69 6e 64 65 78 20 3c 20 63 6f 75 6e 74 3b 20 69  index < count; i
25f0: 6e 64 65 78 2b 2b 29 0d 0a 20 20 20 20 20 20 20  ndex++)..       
2600: 20 20 20 20 20 20 20 20 20 74 68 72 65 61 64 5c           thread\
2610: 5b 69 6e 64 65 78 5c 5d 2e 4a 6f 69 6e 28 29 3b  [index\].Join();
2620: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2630: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
2640: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  /..            /
2650: 2f 20 4e 4f 54 45 3a 20 2a 52 45 51 55 49 52 45  / NOTE: *REQUIRE
2660: 44 2a 20 46 6f 72 63 65 20 61 6c 6c 20 74 68 65  D* Force all the
2670: 20 74 72 61 63 65 20 6c 69 73 74 65 6e 65 72 73   trace listeners
2680: 20 74 6f 20 62 65 20 66 6c 75 73 68 65 64 20 74   to be flushed t
2690: 6f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  o..            /
26a0: 2f 20 20 20 20 20 20 20 64 69 73 6b 20 6e 6f 77  /       disk now
26b0: 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 20 6e   so that we do n
26c0: 6f 74 20 6c 6f 73 65 20 61 6e 79 20 6f 75 74 70  ot lose any outp
26d0: 75 74 2e 20 20 57 69 74 68 6f 75 74 20 74 68 69  ut.  Without thi
26e0: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  s..            /
26f0: 2f 20 20 20 20 20 20 20 6d 65 74 68 6f 64 20 63  /       method c
2700: 61 6c 6c 2c 20 6c 6f 73 73 20 6f 66 20 74 72 61  all, loss of tra
2710: 63 65 20 6f 75 74 70 75 74 20 77 61 73 20 6f 62  ce output was ob
2720: 73 65 72 76 65 64 2e 0d 0a 20 20 20 20 20 20 20  served...       
2730: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
2740: 20 20 20 20 20 54 72 61 63 65 2e 46 6c 75 73 68       Trace.Flush
2750: 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ();....         
2760: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
2770: 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 54 68 65 20     // NOTE: The 
2780: 74 72 61 63 65 20 6c 69 73 74 65 6e 65 72 20 75  trace listener u
2790: 73 65 64 20 62 79 20 74 68 69 73 20 74 65 73 74  sed by this test
27a0: 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20   can be removed 
27b0: 6e 6f 77 0d 0a 20 20 20 20 20 20 20 20 20 20 20  now..           
27c0: 20 2f 2f 20 20 20 20 20 20 20 61 73 20 61 6c 6c   //       as all
27d0: 20 74 68 65 20 74 72 61 63 65 20 6f 75 74 70 75   the trace outpu
27e0: 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  t should have be
27f0: 65 6e 20 66 6c 75 73 68 65 64 20 74 6f 20 74 68  en flushed to th
2800: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e..            /
2810: 2f 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 73  /       memory s
2820: 74 72 65 61 6d 20 6e 6f 77 2e 0d 0a 20 20 20 20  tream now...    
2830: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
2840: 20 20 20 20 20 20 20 20 54 72 61 63 65 2e 4c 69          Trace.Li
2850: 73 74 65 6e 65 72 73 2e 52 65 6d 6f 76 65 28 6c  steners.Remove(l
2860: 69 73 74 65 6e 65 72 29 3b 0d 0a 0d 0a 20 20 20  istener);....   
2870: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
2880: 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45           // NOTE
2890: 3a 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e  : Return a strin
28a0: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c  g containing all
28b0: 20 74 68 65 20 74 72 61 63 65 20 6f 75 74 70 75   the trace outpu
28c0: 74 20 77 65 20 73 61 77 0d 0a 20 20 20 20 20 20  t we saw..      
28d0: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 28        //       (
28e0: 66 72 6f 6d 20 61 6c 6c 20 74 68 72 65 61 64 73  from all threads
28f0: 29 20 64 75 72 69 6e 67 20 74 68 65 20 61 62 6f  ) during the abo
2900: 76 65 20 74 65 73 74 20 63 6f 64 65 2e 0d 0a 20  ve test code... 
2910: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
2920: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2930: 6e 20 45 6e 63 6f 64 69 6e 67 2e 55 54 46 38 2e  n Encoding.UTF8.
2940: 47 65 74 53 74 72 69 6e 67 28 6d 65 6d 6f 72 79  GetString(memory
2950: 53 74 72 65 61 6d 2e 54 6f 41 72 72 61 79 28 29  Stream.ToArray()
2960: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  );..          }.
2970: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
2980: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
2990: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
29a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
29b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
29c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
29d0: 0a 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20  .        public 
29e0: 73 74 61 74 69 63 20 76 6f 69 64 20 4d 61 69 6e  static void Main
29f0: 28 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  ()..        {.. 
2a00: 20 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e           // do n
2a10: 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  othing...       
2a20: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
2a30: 20 7d 0d 0a 20 20 7d 5d 20 74 72 75 65 20 66 61   }..  }] true fa
2a40: 6c 73 65 20 74 72 75 65 20 72 65 73 75 6c 74 73  lse true results
2a50: 20 65 72 72 6f 72 73 20 53 79 73 74 65 6d 2e 44   errors System.D
2a60: 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 0d  ata.SQLite.dll].
2a70: 0a 0d 0a 20 20 6c 69 73 74 20 24 63 6f 64 65 20  ...  list $code 
2a80: 24 72 65 73 75 6c 74 73 20 5c 0d 0a 20 20 20 20  $results \..    
2a90: 20 20 5b 65 78 70 72 20 7b 5b 69 6e 66 6f 20 65    [expr {[info e
2aa0: 78 69 73 74 73 20 65 72 72 6f 72 73 5d 20 3f 20  xists errors] ? 
2ab0: 24 65 72 72 6f 72 73 20 3a 20 22 22 7d 5d 20 5c  $errors : ""}] \
2ac0: 0d 0a 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24  ..      [expr {$
2ad0: 63 6f 64 65 20 65 71 20 22 4f 6b 22 20 3f 20 5b  code eq "Ok" ? [
2ae0: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
2af0: 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 5f   object invoke _
2b00: 44 79 6e 61 6d 69 63 24 7b 69 64 7d 2e 54 65 73  Dynamic${id}.Tes
2b10: 74 24 7b 69 64 7d 20 47 65 74 54 72 61 63 65 4f  t${id} GetTraceO
2b20: 75 74 70 75 74 0d 0a 20 20 20 20 20 20 7d 20 72  utput..      } r
2b30: 65 73 75 6c 74 5d 20 3a 20 5b 73 65 74 20 72 65  esult] : [set re
2b40: 73 75 6c 74 20 22 22 5d 7d 5d 20 5b 73 74 72 69  sult ""]}] [stri
2b50: 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 5c 72 5c  ng map [list \r\
2b60: 6e 20 5c 6e 5d 20 24 72 65 73 75 6c 74 5d 0d 0a  n \n] $result]..
2b70: 7d 20 2d 63 6c 65 61 6e 75 70 20 7b 0d 0a 20 20  } -cleanup {..  
2b80: 63 6c 65 61 6e 75 70 44 62 20 24 66 69 6c 65 4e  cleanupDb $fileN
2b90: 61 6d 65 0d 0a 0d 0a 20 20 75 6e 73 65 74 20 2d  ame....  unset -
2ba0: 6e 6f 63 6f 6d 70 6c 61 69 6e 20 72 65 73 75 6c  nocomplain resul
2bb0: 74 20 63 6f 64 65 20 72 65 73 75 6c 74 73 20 65  t code results e
2bc0: 72 72 6f 72 73 20 64 61 74 61 53 6f 75 72 63 65  rrors dataSource
2bd0: 20 66 69 6c 65 4e 61 6d 65 0d 0a 7d 20 2d 63 6f   fileName..} -co
2be0: 6e 73 74 72 61 69 6e 74 73 20 5c 0d 0a 5b 66 69  nstraints \..[fi
2bf0: 78 43 6f 6e 73 74 72 61 69 6e 74 73 20 7b 66 61  xConstraints {fa
2c00: 69 6c 2e 66 61 6c 73 65 20 65 61 67 6c 65 20 63  il.false eagle c
2c10: 6f 6d 6d 61 6e 64 2e 6f 62 6a 65 63 74 20 6d 6f  ommand.object mo
2c20: 6e 6f 42 75 67 32 38 5c 0d 0a 62 75 69 6c 64 43  noBug28\..buildC
2c30: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 52 65 6c  onfiguration.Rel
2c40: 65 61 73 65 20 21 64 65 66 69 6e 65 43 6f 6e 73  ease !defineCons
2c50: 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61  tant.System.Data
2c60: 2e 53 51 4c 69 74 65 2e 49 4e 54 45 52 4f 50 5f  .SQLite.INTEROP_
2c70: 4c 4f 47 5c 0d 0a 63 6f 6d 6d 61 6e 64 2e 73 71  LOG\..command.sq
2c80: 6c 20 63 6f 6d 70 69 6c 65 2e 44 41 54 41 20 53  l compile.DATA S
2c90: 51 4c 69 74 65 20 53 79 73 74 65 6d 2e 44 61 74  QLite System.Dat
2ca0: 61 2e 53 51 4c 69 74 65 20 63 6f 6d 70 69 6c 65  a.SQLite compile
2cb0: 43 53 68 61 72 70 7d 5d 20 2d 6d 61 74 63 68 20  CSharp}] -match 
2cc0: 5c 0d 0a 72 65 67 65 78 70 20 2d 72 65 73 75 6c  \..regexp -resul
2cd0: 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  t [appendArgs \.
2ce0: 0a 22 5e 4f 6b 20 53 79 73 74 65 6d 23 43 6f 64  ."^Ok System#Cod
2cf0: 65 44 6f 6d 23 43 6f 6d 70 69 6c 65 72 23 43 6f  eDom#Compiler#Co
2d00: 6d 70 69 6c 65 72 52 65 73 75 6c 74 73 23 5c 5c  mpilerResults#\\
2d10: 64 2b 20 5c 5c 7b 5c 5c 7d 20 30 20 5c 5c 7b 22  d+ \\{\\} 0 \\{"
2d20: 20 5c 0d 0a 5b 73 74 72 69 6e 67 20 72 65 70 65   \..[string repe
2d30: 61 74 20 22 53 51 4c 69 74 65 20 6d 65 73 73 61  at "SQLite messa
2d40: 67 65 20 5c 5c 28 30 5c 5c 29 3a 20 54 45 53 54  ge \\(0\\): TEST
2d50: 20 24 69 64 5c 5c 6e 22 20 5c 0d 0a 5b 65 78 70   $id\\n" \..[exp
2d60: 72 20 7b 6d 69 6e 28 34 20 2a 20 5b 69 6e 66 6f  r {min(4 * [info
2d70: 20 70 72 6f 63 65 73 73 6f 72 73 5d 2c 20 31 36   processors], 16
2d80: 29 7d 5d 5d 20 22 5c 5c 7d 5c 24 22 5d 7d 0d 0a  )}]] "\\}\$"]}..
2d90: 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ..##############
2da0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2db0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2dc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2dd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2de0: 23 0d 0a 0d 0a 75 6e 73 65 74 20 2d 6e 6f 63 6f  #....unset -noco
2df0: 6d 70 6c 61 69 6e 20 69 64 0d 0a 0d 0a 23 23 23  mplain id....###
2e00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2e10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2e20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2e30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2e40: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
2e50: 72 75 6e 53 51 4c 69 74 65 54 65 73 74 45 70 69  runSQLiteTestEpi
2e60: 6c 6f 67 75 65 0d 0a 72 75 6e 54 65 73 74 45 70  logue..runTestEp
2e70: 69 6c 6f 67 75 65 0d 0a                          ilogue..