System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact f7eed0239496d12b881115ddf9f6ca5931ab12e5:


0000: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
0010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20 41 44 4f  *********. * ADO
0040: 2e 4e 45 54 20 32 2e 30 20 44 61 74 61 20 50 72  .NET 2.0 Data Pr
0050: 6f 76 69 64 65 72 20 66 6f 72 20 53 51 4c 69 74  ovider for SQLit
0060: 65 20 56 65 72 73 69 6f 6e 20 33 2e 58 0a 20 2a  e Version 3.X. *
0070: 20 57 72 69 74 74 65 6e 20 62 79 20 52 6f 62 65   Written by Robe
0080: 72 74 20 53 69 6d 70 73 6f 6e 20 28 72 6f 62 65  rt Simpson (robe
0090: 72 74 40 62 6c 61 63 6b 63 61 73 74 6c 65 73 6f  rt@blackcastleso
00a0: 66 74 2e 63 6f 6d 29 0a 20 2a 20 0a 20 2a 20 52  ft.com). * . * R
00b0: 65 6c 65 61 73 65 64 20 74 6f 20 74 68 65 20 70  eleased to the p
00c0: 75 62 6c 69 63 20 64 6f 6d 61 69 6e 2c 20 75 73  ublic domain, us
00d0: 65 20 61 74 20 79 6f 75 72 20 6f 77 6e 20 72 69  e at your own ri
00e0: 73 6b 21 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  sk!. ***********
00f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
0120: 6e 61 6d 65 73 70 61 63 65 20 53 79 73 74 65 6d  namespace System
0130: 2e 44 61 74 61 2e 53 51 4c 69 74 65 0a 7b 0a 20  .Data.SQLite.{. 
0140: 20 75 73 69 6e 67 20 53 79 73 74 65 6d 3b 0a 20   using System;. 
0150: 20 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 43 6f   using System.Co
0160: 6c 6c 65 63 74 69 6f 6e 73 2e 47 65 6e 65 72 69  llections.Generi
0170: 63 3b 0a 0a 20 20 69 6e 74 65 72 6e 61 6c 20 73  c;..  internal s
0180: 74 61 74 69 63 20 63 6c 61 73 73 20 53 51 4c 69  tatic class SQLi
0190: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f 6f 6c  teConnectionPool
01a0: 0a 20 20 7b 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  .  {.    /// <su
01b0: 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 4b  mmary>.    /// K
01c0: 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20 63 6f  eeps track of co
01d0: 6e 6e 65 63 74 69 6f 6e 73 20 6d 61 64 65 20 6f  nnections made o
01e0: 6e 20 61 20 73 70 65 63 69 66 69 65 64 20 66 69  n a specified fi
01f0: 6c 65 2e 20 20 54 68 65 20 50 6f 6f 6c 56 65 72  le.  The PoolVer
0200: 73 69 6f 6e 20 64 69 63 74 61 74 65 73 20 77 68  sion dictates wh
0210: 65 74 68 65 72 20 6f 6c 64 20 6f 62 6a 65 63 74  ether old object
0220: 73 20 67 65 74 0a 20 20 20 20 2f 2f 2f 20 72 65  s get.    /// re
0230: 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 70 6f  turned to the po
0240: 6f 6c 20 6f 72 20 64 69 73 63 61 72 64 65 64 20  ol or discarded 
0250: 77 68 65 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 69  when no longer i
0260: 6e 20 75 73 65 2e 0a 20 20 20 20 2f 2f 2f 20 3c  n use..    /// <
0270: 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 69 6e  /summary>.    in
0280: 74 65 72 6e 61 6c 20 63 6c 61 73 73 20 50 6f 6f  ternal class Poo
0290: 6c 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e  l.    {.      in
02a0: 74 65 72 6e 61 6c 20 72 65 61 64 6f 6e 6c 79 20  ternal readonly 
02b0: 51 75 65 75 65 3c 57 65 61 6b 52 65 66 65 72 65  Queue<WeakRefere
02c0: 6e 63 65 3e 20 51 75 65 75 65 20 3d 20 6e 65 77  nce> Queue = new
02d0: 20 51 75 65 75 65 3c 57 65 61 6b 52 65 66 65 72   Queue<WeakRefer
02e0: 65 6e 63 65 3e 28 29 3b 0a 20 20 20 20 20 20 69  ence>();.      i
02f0: 6e 74 65 72 6e 61 6c 20 69 6e 74 20 50 6f 6f 6c  nternal int Pool
0300: 56 65 72 73 69 6f 6e 3b 0a 20 20 20 20 20 20 69  Version;.      i
0310: 6e 74 65 72 6e 61 6c 20 69 6e 74 20 4d 61 78 50  nternal int MaxP
0320: 6f 6f 6c 53 69 7a 65 3b 0a 0a 20 20 20 20 20 20  oolSize;..      
0330: 69 6e 74 65 72 6e 61 6c 20 50 6f 6f 6c 28 69 6e  internal Pool(in
0340: 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e 74 20 6d  t version, int m
0350: 61 78 53 69 7a 65 29 0a 20 20 20 20 20 20 7b 0a  axSize).      {.
0360: 20 20 20 20 20 20 20 20 50 6f 6f 6c 56 65 72 73          PoolVers
0370: 69 6f 6e 20 3d 20 76 65 72 73 69 6f 6e 3b 0a 20  ion = version;. 
0380: 20 20 20 20 20 20 20 4d 61 78 50 6f 6f 6c 53 69         MaxPoolSi
0390: 7a 65 20 3d 20 6d 61 78 53 69 7a 65 3b 0a 20 20  ze = maxSize;.  
03a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
03b0: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20   /// <summary>. 
03c0: 20 20 20 2f 2f 2f 20 54 68 65 20 63 6f 6e 6e 65     /// The conne
03d0: 63 74 69 6f 6e 20 70 6f 6f 6c 20 6f 62 6a 65 63  ction pool objec
03e0: 74 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  t.    /// </summ
03f0: 61 72 79 3e 0a 20 20 20 20 70 72 69 76 61 74 65  ary>.    private
0400: 20 73 74 61 74 69 63 20 53 6f 72 74 65 64 4c 69   static SortedLi
0410: 73 74 3c 73 74 72 69 6e 67 2c 20 50 6f 6f 6c 3e  st<string, Pool>
0420: 20 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 3d 20   _connections = 
0430: 6e 65 77 20 53 6f 72 74 65 64 4c 69 73 74 3c 73  new SortedList<s
0440: 74 72 69 6e 67 2c 20 50 6f 6f 6c 3e 28 53 74 72  tring, Pool>(Str
0450: 69 6e 67 43 6f 6d 70 61 72 65 72 2e 4f 72 64 69  ingComparer.Ordi
0460: 6e 61 6c 49 67 6e 6f 72 65 43 61 73 65 29 3b 0a  nalIgnoreCase);.
0470: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
0480: 79 3e 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 64  y>.    /// The d
0490: 65 66 61 75 6c 74 20 76 65 72 73 69 6f 6e 20 6e  efault version n
04a0: 75 6d 62 65 72 20 6e 65 77 20 70 6f 6f 6c 73 20  umber new pools 
04b0: 77 69 6c 6c 20 67 65 74 0a 20 20 20 20 2f 2f 2f  will get.    ///
04c0: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20   </summary>.    
04d0: 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 69  private static i
04e0: 6e 74 20 5f 70 6f 6f 6c 56 65 72 73 69 6f 6e 20  nt _poolVersion 
04f0: 3d 20 31 3b 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73  = 1;..    /// <s
0500: 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20  ummary>.    /// 
0510: 41 74 74 65 6d 70 74 20 74 6f 20 70 75 6c 6c 20  Attempt to pull 
0520: 61 20 70 6f 6f 6c 65 64 20 63 6f 6e 6e 65 63 74  a pooled connect
0530: 69 6f 6e 20 6f 75 74 20 6f 66 20 74 68 65 20 71  ion out of the q
0540: 75 65 75 65 20 66 6f 72 20 61 63 74 69 76 65 20  ueue for active 
0550: 64 75 74 79 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  duty.    /// </s
0560: 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20  ummary>.    /// 
0570: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 66 69 6c  <param name="fil
0580: 65 4e 61 6d 65 22 3e 54 68 65 20 66 69 6c 65 6e  eName">The filen
0590: 61 6d 65 20 66 6f 72 20 61 20 64 65 73 69 72 65  ame for a desire
05a0: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 3c 2f 70 61  d connection</pa
05b0: 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  ram>.    /// <pa
05c0: 72 61 6d 20 6e 61 6d 65 3d 22 6d 61 78 50 6f 6f  ram name="maxPoo
05d0: 6c 53 69 7a 65 22 3e 54 68 65 20 6d 61 78 69 6d  lSize">The maxim
05e0: 75 6d 20 73 69 7a 65 20 74 68 65 20 63 6f 6e 6e  um size the conn
05f0: 65 63 74 69 6f 6e 20 70 6f 6f 6c 20 66 6f 72 20  ection pool for 
0600: 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 63 61 6e  the filename can
0610: 20 62 65 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20   be</param>.    
0620: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
0630: 22 76 65 72 73 69 6f 6e 22 3e 54 68 65 20 70 6f  "version">The po
0640: 6f 6c 20 76 65 72 73 69 6f 6e 20 74 68 65 20 72  ol version the r
0650: 65 74 75 72 6e 65 64 20 63 6f 6e 6e 65 63 74 69  eturned connecti
0660: 6f 6e 20 77 69 6c 6c 20 62 65 6c 6f 6e 67 20 74  on will belong t
0670: 6f 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f  o</param>.    //
0680: 2f 20 3c 72 65 74 75 72 6e 73 3e 52 65 74 75 72  / <returns>Retur
0690: 6e 73 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 63 6f  ns NULL if no co
06a0: 6e 6e 65 63 74 69 6f 6e 73 20 77 65 72 65 20 61  nnections were a
06b0: 76 61 69 6c 61 62 6c 65 2e 20 20 45 76 65 6e 20  vailable.  Even 
06c0: 69 66 20 6e 6f 6e 65 20 61 72 65 2c 20 74 68 65  if none are, the
06d0: 20 70 6f 6f 6c 76 65 72 73 69 6f 6e 20 77 69 6c   poolversion wil
06e0: 6c 20 73 74 69 6c 6c 20 62 65 20 61 20 76 61 6c  l still be a val
06f0: 69 64 20 70 6f 6f 6c 20 76 65 72 73 69 6f 6e 3c  id pool version<
0700: 2f 72 65 74 75 72 6e 73 3e 0a 20 20 20 20 69 6e  /returns>.    in
0710: 74 65 72 6e 61 6c 20 73 74 61 74 69 63 20 53 51  ternal static SQ
0720: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 48 61  LiteConnectionHa
0730: 6e 64 6c 65 20 52 65 6d 6f 76 65 28 73 74 72 69  ndle Remove(stri
0740: 6e 67 20 66 69 6c 65 4e 61 6d 65 2c 20 69 6e 74  ng fileName, int
0750: 20 6d 61 78 50 6f 6f 6c 53 69 7a 65 2c 20 6f 75   maxPoolSize, ou
0760: 74 20 69 6e 74 20 76 65 72 73 69 6f 6e 29 0a 20  t int version). 
0770: 20 20 20 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 20     {.      lock 
0780: 28 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73 29 0a 20  (_connections). 
0790: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 50       {.        P
07a0: 6f 6f 6c 20 71 75 65 75 65 3b 0a 0a 20 20 20 20  ool queue;..    
07b0: 20 20 20 20 2f 2f 20 44 65 66 61 75 6c 74 20 74      // Default t
07c0: 6f 20 74 68 65 20 68 69 67 68 65 73 74 20 70 6f  o the highest po
07d0: 6f 6c 20 76 65 72 73 69 6f 6e 0a 20 20 20 20 20  ol version.     
07e0: 20 20 20 76 65 72 73 69 6f 6e 20 3d 20 5f 70 6f     version = _po
07f0: 6f 6c 56 65 72 73 69 6f 6e 3b 0a 0a 20 20 20 20  olVersion;..    
0800: 20 20 20 20 2f 2f 20 49 66 20 77 65 20 64 69 64      // If we did
0810: 6e 27 74 20 66 69 6e 64 20 61 20 70 6f 6f 6c 20  n't find a pool 
0820: 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 63  for this file, c
0830: 72 65 61 74 65 20 6f 6e 65 20 65 76 65 6e 20 74  reate one even t
0840: 68 6f 75 67 68 20 69 74 20 77 69 6c 6c 20 62 65  hough it will be
0850: 20 65 6d 70 74 79 2e 0a 20 20 20 20 20 20 20 20   empty..        
0860: 2f 2f 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f  // We have to do
0870: 20 74 68 69 73 20 68 65 72 65 20 62 65 63 61 75   this here becau
0880: 73 65 20 6f 74 68 65 72 77 69 73 65 20 63 61 6c  se otherwise cal
0890: 6c 69 6e 67 20 43 6c 65 61 72 50 6f 6f 6c 28 29  ling ClearPool()
08a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 77 69 6c   on the file wil
08b0: 6c 20 6e 6f 74 20 77 6f 72 6b 20 66 6f 72 20 61  l not work for a
08c0: 63 74 69 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  ctive connection
08d0: 73 0a 20 20 20 20 20 20 20 20 2f 2f 20 74 68 61  s.        // tha
08e0: 74 20 68 61 76 65 20 6e 65 76 65 72 20 73 65 65  t have never see
08f0: 6e 20 74 68 65 20 70 6f 6f 6c 20 79 65 74 2e 0a  n the pool yet..
0900: 20 20 20 20 20 20 20 20 69 66 20 28 5f 63 6f 6e          if (_con
0910: 6e 65 63 74 69 6f 6e 73 2e 54 72 79 47 65 74 56  nections.TryGetV
0920: 61 6c 75 65 28 66 69 6c 65 4e 61 6d 65 2c 20 6f  alue(fileName, o
0930: 75 74 20 71 75 65 75 65 29 20 3d 3d 20 66 61 6c  ut queue) == fal
0940: 73 65 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  se).        {.  
0950: 20 20 20 20 20 20 20 20 71 75 65 75 65 20 3d 20          queue = 
0960: 6e 65 77 20 50 6f 6f 6c 28 5f 70 6f 6f 6c 56 65  new Pool(_poolVe
0970: 72 73 69 6f 6e 2c 20 6d 61 78 50 6f 6f 6c 53 69  rsion, maxPoolSi
0980: 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 5f  ze);.          _
0990: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 41 64 64 28  connections.Add(
09a0: 66 69 6c 65 4e 61 6d 65 2c 20 71 75 65 75 65 29  fileName, queue)
09b0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ;..          ret
09c0: 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20  urn null;.      
09d0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20    }..        // 
09e0: 57 65 20 66 6f 75 6e 64 20 61 20 70 6f 6f 6c 20  We found a pool 
09f0: 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 73  for this file, s
0a00: 6f 20 75 73 65 20 69 74 73 20 76 65 72 73 69 6f  o use its versio
0a10: 6e 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20  n number.       
0a20: 20 76 65 72 73 69 6f 6e 20 3d 20 71 75 65 75 65   version = queue
0a30: 2e 50 6f 6f 6c 56 65 72 73 69 6f 6e 3b 0a 20 20  .PoolVersion;.  
0a40: 20 20 20 20 20 20 71 75 65 75 65 2e 4d 61 78 50        queue.MaxP
0a50: 6f 6f 6c 53 69 7a 65 20 3d 20 6d 61 78 50 6f 6f  oolSize = maxPoo
0a60: 6c 53 69 7a 65 3b 0a 0a 20 20 20 20 20 20 20 20  lSize;..        
0a70: 52 65 73 69 7a 65 50 6f 6f 6c 28 71 75 65 75 65  ResizePool(queue
0a80: 2c 20 66 61 6c 73 65 29 3b 0a 0a 20 20 20 20 20  , false);..     
0a90: 20 20 20 2f 2f 20 54 72 79 20 61 6e 64 20 67 65     // Try and ge
0aa0: 74 20 61 20 70 6f 6f 6c 65 64 20 63 6f 6e 6e 65  t a pooled conne
0ab0: 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 71  ction from the q
0ac0: 75 65 75 65 0d 0a 20 20 20 20 20 20 20 20 51 75  ueue..        Qu
0ad0: 65 75 65 3c 57 65 61 6b 52 65 66 65 72 65 6e 63  eue<WeakReferenc
0ae0: 65 3e 20 70 6f 6f 6c 51 75 65 75 65 20 3d 20 71  e> poolQueue = q
0af0: 75 65 75 65 2e 51 75 65 75 65 3b 0d 0a 20 20 20  ueue.Queue;..   
0b00: 20 20 20 20 20 69 66 20 28 70 6f 6f 6c 51 75 65       if (poolQue
0b10: 75 65 20 3d 3d 20 6e 75 6c 6c 29 20 72 65 74 75  ue == null) retu
0b20: 72 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20  rn null;....    
0b30: 20 20 20 20 77 68 69 6c 65 20 28 70 6f 6f 6c 51      while (poolQ
0b40: 75 65 75 65 2e 43 6f 75 6e 74 20 3e 20 30 29 0a  ueue.Count > 0).
0b50: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
0b60: 20 20 20 20 20 57 65 61 6b 52 65 66 65 72 65 6e       WeakReferen
0b70: 63 65 20 63 6e 6e 20 3d 20 70 6f 6f 6c 51 75 65  ce cnn = poolQue
0b80: 75 65 2e 44 65 71 75 65 75 65 28 29 3b 0a 20 20  ue.Dequeue();.  
0b90: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 43 6f          SQLiteCo
0ba0: 6e 6e 65 63 74 69 6f 6e 48 61 6e 64 6c 65 20 68  nnectionHandle h
0bb0: 64 6c 20 3d 20 63 6e 6e 2e 54 61 72 67 65 74 20  dl = cnn.Target 
0bc0: 61 73 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  as SQLiteConnect
0bd0: 69 6f 6e 48 61 6e 64 6c 65 3b 0a 20 20 20 20 20  ionHandle;.     
0be0: 20 20 20 20 20 69 66 20 28 28 68 64 6c 20 21 3d       if ((hdl !=
0bf0: 20 6e 75 6c 6c 29 20 26 26 20 21 68 64 6c 2e 49   null) && !hdl.I
0c00: 73 43 6c 6f 73 65 64 29 0a 20 20 20 20 20 20 20  sClosed).       
0c10: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20     {.           
0c20: 20 72 65 74 75 72 6e 20 68 64 6c 3b 0a 20 20 20   return hdl;.   
0c30: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
0c40: 20 20 20 20 47 43 2e 4b 65 65 70 41 6c 69 76 65      GC.KeepAlive
0c50: 28 68 64 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  (hdl);.        }
0c60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0c70: 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  null;.      }.  
0c80: 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75    }..    /// <su
0c90: 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 43  mmary>.    /// C
0ca0: 6c 65 61 72 73 20 6f 75 74 20 61 6c 6c 20 70 6f  lears out all po
0cb0: 6f 6c 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  oled connections
0cc0: 20 61 6e 64 20 72 65 76 27 73 20 75 70 20 74 68   and rev's up th
0cd0: 65 20 64 65 66 61 75 6c 74 20 70 6f 6f 6c 20 76  e default pool v
0ce0: 65 72 73 69 6f 6e 20 74 6f 20 66 6f 72 63 65 20  ersion to force 
0cf0: 61 6c 6c 20 6f 6c 64 20 61 63 74 69 76 65 20 6f  all old active o
0d00: 62 6a 65 63 74 73 0a 20 20 20 20 2f 2f 2f 20 6e  bjects.    /// n
0d10: 6f 74 20 69 6e 20 74 68 65 20 70 6f 6f 6c 20 74  ot in the pool t
0d20: 6f 20 67 65 74 20 64 69 73 63 61 72 64 65 64 20  o get discarded 
0d30: 72 61 74 68 65 72 20 74 68 61 6e 20 72 65 74 75  rather than retu
0d40: 72 6e 65 64 20 74 6f 20 74 68 65 69 72 20 70 6f  rned to their po
0d50: 6f 6c 73 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  ols..    /// </s
0d60: 75 6d 6d 61 72 79 3e 0a 20 20 20 20 69 6e 74 65  ummary>.    inte
0d70: 72 6e 61 6c 20 73 74 61 74 69 63 20 76 6f 69 64  rnal static void
0d80: 20 43 6c 65 61 72 41 6c 6c 50 6f 6f 6c 73 28 29   ClearAllPools()
0d90: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 6c 6f 63  .    {.      loc
0da0: 6b 20 28 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73 29  k (_connections)
0db0: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
0dc0: 20 66 6f 72 65 61 63 68 20 28 4b 65 79 56 61 6c   foreach (KeyVal
0dd0: 75 65 50 61 69 72 3c 73 74 72 69 6e 67 2c 20 50  uePair<string, P
0de0: 6f 6f 6c 3e 20 70 61 69 72 20 69 6e 20 5f 63 6f  ool> pair in _co
0df0: 6e 6e 65 63 74 69 6f 6e 73 29 0a 20 20 20 20 20  nnections).     
0e00: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 77     {.          w
0e10: 68 69 6c 65 20 28 70 61 69 72 2e 56 61 6c 75 65  hile (pair.Value
0e20: 2e 51 75 65 75 65 2e 43 6f 75 6e 74 20 3e 20 30  .Queue.Count > 0
0e30: 29 0a 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20  ).          {.  
0e40: 20 20 20 20 20 20 20 20 20 20 57 65 61 6b 52 65            WeakRe
0e50: 66 65 72 65 6e 63 65 20 63 6e 6e 20 3d 20 70 61  ference cnn = pa
0e60: 69 72 2e 56 61 6c 75 65 2e 51 75 65 75 65 2e 44  ir.Value.Queue.D
0e70: 65 71 75 65 75 65 28 29 3b 0a 20 20 20 20 20 20  equeue();.      
0e80: 20 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e        SQLiteConn
0e90: 65 63 74 69 6f 6e 48 61 6e 64 6c 65 20 68 64 6c  ectionHandle hdl
0ea0: 20 3d 20 63 6e 6e 2e 54 61 72 67 65 74 20 61 73   = cnn.Target as
0eb0: 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
0ec0: 6e 48 61 6e 64 6c 65 3b 0a 20 20 20 20 20 20 20  nHandle;.       
0ed0: 20 20 20 20 20 69 66 20 28 68 64 6c 20 21 3d 20       if (hdl != 
0ee0: 6e 75 6c 6c 29 0a 20 20 20 20 20 20 20 20 20 20  null).          
0ef0: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20    {.            
0f00: 20 20 68 64 6c 2e 44 69 73 70 6f 73 65 28 29 3b    hdl.Dispose();
0f10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 47 43 2e 4b              GC.K
0f30: 65 65 70 41 6c 69 76 65 28 68 64 6c 29 3b 0a 20  eepAlive(hdl);. 
0f40: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
0f50: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
0f60: 2f 2f 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66  // Keep track of
0f70: 20 74 68 65 20 68 69 67 68 65 73 74 20 72 65 76   the highest rev
0f80: 69 73 69 6f 6e 20 73 6f 20 77 65 20 63 61 6e 20  ision so we can 
0f90: 67 6f 20 6f 6e 65 20 68 69 67 68 65 72 20 77 68  go one higher wh
0fa0: 65 6e 20 77 65 27 72 65 20 66 69 6e 69 73 68 65  en we're finishe
0fb0: 64 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  d.          if (
0fc0: 5f 70 6f 6f 6c 56 65 72 73 69 6f 6e 20 3c 3d 20  _poolVersion <= 
0fd0: 70 61 69 72 2e 56 61 6c 75 65 2e 50 6f 6f 6c 56  pair.Value.PoolV
0fe0: 65 72 73 69 6f 6e 29 0a 20 20 20 20 20 20 20 20  ersion).        
0ff0: 20 20 20 20 5f 70 6f 6f 6c 56 65 72 73 69 6f 6e      _poolVersion
1000: 20 3d 20 70 61 69 72 2e 56 61 6c 75 65 2e 50 6f   = pair.Value.Po
1010: 6f 6c 56 65 72 73 69 6f 6e 20 2b 20 31 3b 0a 20  olVersion + 1;. 
1020: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1030: 20 2f 2f 20 41 6c 6c 20 70 6f 6f 6c 73 20 61 72   // All pools ar
1040: 65 20 63 6c 65 61 72 65 64 20 61 6e 64 20 77 65  e cleared and we
1050: 20 68 61 76 65 20 61 20 6e 65 77 20 68 69 67 68   have a new high
1060: 65 73 74 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  est version numb
1070: 65 72 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20  er to force all 
1080: 6f 6c 64 20 76 65 72 73 69 6f 6e 20 61 63 74 69  old version acti
1090: 76 65 20 69 74 65 6d 73 20 74 6f 20 67 65 74 20  ve items to get 
10a0: 64 69 73 63 61 72 64 65 64 0a 20 20 20 20 20 20  discarded.      
10b0: 20 20 2f 2f 20 69 6e 73 74 65 61 64 20 6f 66 20    // instead of 
10c0: 67 6f 69 6e 67 20 62 61 63 6b 20 74 6f 20 74 68  going back to th
10d0: 65 20 71 75 65 75 65 20 77 68 65 6e 20 74 68 65  e queue when the
10e0: 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 0a 20 20  y are closed..  
10f0: 20 20 20 20 20 20 2f 2f 20 57 65 20 63 61 6e 20        // We can 
1100: 67 65 74 20 61 77 61 79 20 77 69 74 68 20 74 68  get away with th
1110: 69 73 20 62 65 63 61 75 73 65 20 77 65 27 76 65  is because we've
1120: 20 70 75 6d 70 65 64 20 75 70 20 74 68 65 20 5f   pumped up the _
1130: 70 6f 6f 6c 56 65 72 73 69 6f 6e 20 6f 75 74 20  poolVersion out 
1140: 6f 66 20 72 61 6e 67 65 20 6f 66 20 61 6c 6c 20  of range of all 
1150: 61 63 74 69 76 65 20 63 6f 6e 6e 65 63 74 69 6f  active connectio
1160: 6e 73 2c 20 73 6f 20 74 68 65 79 0a 20 20 20 20  ns, so they.    
1170: 20 20 20 20 2f 2f 20 77 69 6c 6c 20 61 6c 6c 20      // will all 
1180: 67 65 74 20 64 69 73 63 61 72 64 65 64 20 77 68  get discarded wh
1190: 65 6e 20 74 68 65 79 20 74 72 79 20 74 6f 20 70  en they try to p
11a0: 75 74 20 74 68 65 6d 73 65 6c 76 65 73 20 62 61  ut themselves ba
11b0: 63 6b 20 69 6e 20 74 68 65 69 72 20 70 6f 6f 6c  ck in their pool
11c0: 2e 0a 20 20 20 20 20 20 20 20 5f 63 6f 6e 6e 65  ..        _conne
11d0: 63 74 69 6f 6e 73 2e 43 6c 65 61 72 28 29 3b 0a  ctions.Clear();.
11e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
11f0: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
1200: 0a 20 20 20 20 2f 2f 2f 20 43 6c 65 61 72 20 61  .    /// Clear a
1210: 20 67 69 76 65 6e 20 70 6f 6f 6c 20 66 6f 72 20   given pool for 
1220: 61 20 67 69 76 65 6e 20 66 69 6c 65 6e 61 6d 65  a given filename
1230: 2e 20 20 44 69 73 63 61 72 64 73 20 61 6e 79 74  .  Discards anyt
1240: 68 69 6e 67 20 69 6e 20 74 68 65 20 70 6f 6f 6c  hing in the pool
1250: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 66   for the given f
1260: 69 6c 65 2c 20 61 6e 64 20 72 65 76 73 20 74 68  ile, and revs th
1270: 65 20 70 6f 6f 6c 0a 20 20 20 20 2f 2f 2f 20 76  e pool.    /// v
1280: 65 72 73 69 6f 6e 20 73 6f 20 63 75 72 72 65 6e  ersion so curren
1290: 74 20 61 63 74 69 76 65 20 6f 62 6a 65 63 74 73  t active objects
12a0: 20 6f 6e 20 74 68 65 20 6f 6c 64 20 76 65 72 73   on the old vers
12b0: 69 6f 6e 20 6f 66 20 74 68 65 20 70 6f 6f 6c 20  ion of the pool 
12c0: 77 69 6c 6c 20 67 65 74 20 64 69 73 63 61 72 64  will get discard
12d0: 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 62  ed rather than b
12e0: 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  e returned to th
12f0: 65 20 70 6f 6f 6c 2e 0a 20 20 20 20 2f 2f 2f 20  e pool..    /// 
1300: 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f  </summary>.    /
1310: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
1320: 66 69 6c 65 4e 61 6d 65 22 3e 54 68 65 20 66 69  fileName">The fi
1330: 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 6f  lename of the po
1340: 6f 6c 20 74 6f 20 63 6c 65 61 72 3c 2f 70 61 72  ol to clear</par
1350: 61 6d 3e 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  am>.    internal
1360: 20 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65   static void Cle
1370: 61 72 50 6f 6f 6c 28 73 74 72 69 6e 67 20 66 69  arPool(string fi
1380: 6c 65 4e 61 6d 65 29 0a 20 20 20 20 7b 0a 20 20  leName).    {.  
1390: 20 20 20 20 6c 6f 63 6b 20 28 5f 63 6f 6e 6e 65      lock (_conne
13a0: 63 74 69 6f 6e 73 29 0a 20 20 20 20 20 20 7b 0a  ctions).      {.
13b0: 20 20 20 20 20 20 20 20 50 6f 6f 6c 20 71 75 65          Pool que
13c0: 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28  ue;.        if (
13d0: 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 54 72 79  _connections.Try
13e0: 47 65 74 56 61 6c 75 65 28 66 69 6c 65 4e 61 6d  GetValue(fileNam
13f0: 65 2c 20 6f 75 74 20 71 75 65 75 65 29 20 3d 3d  e, out queue) ==
1400: 20 74 72 75 65 29 0a 20 20 20 20 20 20 20 20 7b   true).        {
1410: 0a 20 20 20 20 20 20 20 20 20 20 71 75 65 75 65  .          queue
1420: 2e 50 6f 6f 6c 56 65 72 73 69 6f 6e 2b 2b 3b 0d  .PoolVersion++;.
1430: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 51 75 65  ...          Que
1440: 75 65 3c 57 65 61 6b 52 65 66 65 72 65 6e 63 65  ue<WeakReference
1450: 3e 20 70 6f 6f 6c 51 75 65 75 65 20 3d 20 71 75  > poolQueue = qu
1460: 65 75 65 2e 51 75 65 75 65 3b 0d 0a 20 20 20 20  eue.Queue;..    
1470: 20 20 20 20 20 20 69 66 20 28 70 6f 6f 6c 51 75        if (poolQu
1480: 65 75 65 20 3d 3d 20 6e 75 6c 6c 29 20 72 65 74  eue == null) ret
1490: 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  urn;....        
14a0: 20 20 77 68 69 6c 65 20 28 70 6f 6f 6c 51 75 65    while (poolQue
14b0: 75 65 2e 43 6f 75 6e 74 20 3e 20 30 29 0a 20 20  ue.Count > 0).  
14c0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
14d0: 20 20 20 20 20 20 20 57 65 61 6b 52 65 66 65 72         WeakRefer
14e0: 65 6e 63 65 20 63 6e 6e 20 3d 20 70 6f 6f 6c 51  ence cnn = poolQ
14f0: 75 65 75 65 2e 44 65 71 75 65 75 65 28 29 3b 0a  ueue.Dequeue();.
1500: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 69              SQLi
1510: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 48 61 6e 64  teConnectionHand
1520: 6c 65 20 68 64 6c 20 3d 20 63 6e 6e 2e 54 61 72  le hdl = cnn.Tar
1530: 67 65 74 20 61 73 20 53 51 4c 69 74 65 43 6f 6e  get as SQLiteCon
1540: 6e 65 63 74 69 6f 6e 48 61 6e 64 6c 65 3b 0a 20  nectionHandle;. 
1550: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 68             if (h
1560: 64 6c 20 21 3d 20 6e 75 6c 6c 29 0a 20 20 20 20  dl != null).    
1570: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
1580: 20 20 20 20 20 20 20 20 68 64 6c 2e 44 69 73 70          hdl.Disp
1590: 6f 73 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20  ose();.         
15a0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
15b0: 20 20 47 43 2e 4b 65 65 70 41 6c 69 76 65 28 68    GC.KeepAlive(h
15c0: 64 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  dl);.          }
15d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15e0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f   }.    }..    //
15f0: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20  / <summary>.    
1600: 2f 2f 2f 20 52 65 74 75 72 6e 20 61 20 63 6f 6e  /// Return a con
1610: 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 70  nection to the p
1620: 6f 6f 6c 20 66 6f 72 20 73 6f 6d 65 6f 6e 65 20  ool for someone 
1630: 65 6c 73 65 20 74 6f 20 75 73 65 2e 0a 20 20 20  else to use..   
1640: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a   /// </summary>.
1650: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
1660: 61 6d 65 3d 22 66 69 6c 65 4e 61 6d 65 22 3e 54  ame="fileName">T
1670: 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74  he filename of t
1680: 68 65 20 70 6f 6f 6c 20 74 6f 20 75 73 65 3c 2f  he pool to use</
1690: 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c  param>.    /// <
16a0: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 68 64 6c 22  param name="hdl"
16b0: 3e 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  >The connection 
16c0: 68 61 6e 64 6c 65 20 74 6f 20 70 6f 6f 6c 3c 2f  handle to pool</
16d0: 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c  param>.    /// <
16e0: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 76 65 72 73  param name="vers
16f0: 69 6f 6e 22 3e 54 68 65 20 70 6f 6f 6c 20 76 65  ion">The pool ve
1700: 72 73 69 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65  rsion the handle
1710: 20 77 61 73 20 63 72 65 61 74 65 64 20 75 6e 64   was created und
1720: 65 72 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f  er</param>.    /
1730: 2f 2f 20 3c 72 65 6d 61 72 6b 73 3e 0a 20 20 20  // <remarks>.   
1740: 20 2f 2f 2f 20 49 66 20 74 68 65 20 76 65 72 73   /// If the vers
1750: 69 6f 6e 20 6e 75 6d 62 65 72 73 20 64 6f 6e 27  ion numbers don'
1760: 74 20 6d 61 74 63 68 20 62 65 74 77 65 65 6e 20  t match between 
1770: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  the connection a
1780: 6e 64 20 74 68 65 20 70 6f 6f 6c 2c 20 74 68 65  nd the pool, the
1790: 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 69 73 20  n the handle is 
17a0: 64 69 73 63 61 72 64 65 64 2e 0a 20 20 20 20 2f  discarded..    /
17b0: 2f 2f 20 3c 2f 72 65 6d 61 72 6b 73 3e 0a 20 20  // </remarks>.  
17c0: 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 69    internal stati
17d0: 63 20 76 6f 69 64 20 41 64 64 28 73 74 72 69 6e  c void Add(strin
17e0: 67 20 66 69 6c 65 4e 61 6d 65 2c 20 53 51 4c 69  g fileName, SQLi
17f0: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 48 61 6e 64  teConnectionHand
1800: 6c 65 20 68 64 6c 2c 20 69 6e 74 20 76 65 72 73  le hdl, int vers
1810: 69 6f 6e 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  ion).    {.     
1820: 20 6c 6f 63 6b 20 28 5f 63 6f 6e 6e 65 63 74 69   lock (_connecti
1830: 6f 6e 73 29 0a 20 20 20 20 20 20 7b 0a 20 20 20  ons).      {.   
1840: 20 20 20 20 20 2f 2f 20 49 66 20 74 68 65 20 71       // If the q
1850: 75 65 75 65 20 64 6f 65 73 6e 27 74 20 65 78 69  ueue doesn't exi
1860: 73 74 20 69 6e 20 74 68 65 20 70 6f 6f 6c 2c 20  st in the pool, 
1870: 74 68 65 6e 20 69 74 20 6d 75 73 74 27 76 65 20  then it must've 
1880: 62 65 65 6e 20 63 6c 65 61 72 65 64 20 73 6f 6d  been cleared som
1890: 65 74 69 6d 65 20 61 66 74 65 72 20 74 68 65 20  etime after the 
18a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63  connection was c
18b0: 72 65 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20  reated..        
18c0: 50 6f 6f 6c 20 71 75 65 75 65 3b 0a 20 20 20 20  Pool queue;.    
18d0: 20 20 20 20 69 66 20 28 5f 63 6f 6e 6e 65 63 74      if (_connect
18e0: 69 6f 6e 73 2e 54 72 79 47 65 74 56 61 6c 75 65  ions.TryGetValue
18f0: 28 66 69 6c 65 4e 61 6d 65 2c 20 6f 75 74 20 71  (fileName, out q
1900: 75 65 75 65 29 20 3d 3d 20 74 72 75 65 20 26 26  ueue) == true &&
1910: 20 76 65 72 73 69 6f 6e 20 3d 3d 20 71 75 65 75   version == queu
1920: 65 2e 50 6f 6f 6c 56 65 72 73 69 6f 6e 29 0a 20  e.PoolVersion). 
1930: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
1940: 20 20 20 52 65 73 69 7a 65 50 6f 6f 6c 28 71 75     ResizePool(qu
1950: 65 75 65 2c 20 74 72 75 65 29 3b 0d 0a 0d 0a 20  eue, true);.... 
1960: 20 20 20 20 20 20 20 20 20 51 75 65 75 65 3c 57           Queue<W
1970: 65 61 6b 52 65 66 65 72 65 6e 63 65 3e 20 70 6f  eakReference> po
1980: 6f 6c 51 75 65 75 65 20 3d 20 71 75 65 75 65 2e  olQueue = queue.
1990: 51 75 65 75 65 3b 0d 0a 20 20 20 20 20 20 20 20  Queue;..        
19a0: 20 20 69 66 20 28 70 6f 6f 6c 51 75 65 75 65 20    if (poolQueue 
19b0: 3d 3d 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e 3b  == null) return;
19c0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 70 6f  ....          po
19d0: 6f 6c 51 75 65 75 65 2e 45 6e 71 75 65 75 65 28  olQueue.Enqueue(
19e0: 6e 65 77 20 57 65 61 6b 52 65 66 65 72 65 6e 63  new WeakReferenc
19f0: 65 28 68 64 6c 2c 20 66 61 6c 73 65 29 29 3b 0a  e(hdl, false));.
1a00: 20 20 20 20 20 20 20 20 20 20 47 43 2e 4b 65 65            GC.Kee
1a10: 70 41 6c 69 76 65 28 68 64 6c 29 3b 0a 20 20 20  pAlive(hdl);.   
1a20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65       }.        e
1a30: 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  lse.        {.  
1a40: 20 20 20 20 20 20 20 20 68 64 6c 2e 43 6c 6f 73          hdl.Clos
1a50: 65 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  e();.        }. 
1a60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1a70: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a    /// <summary>.
1a80: 20 20 20 20 2f 2f 2f 20 57 65 20 64 6f 6e 27 74      /// We don't
1a90: 20 68 61 76 65 20 74 6f 20 74 68 72 65 61 64 2d   have to thread-
1aa0: 6c 6f 63 6b 20 61 6e 79 74 68 69 6e 67 20 69 6e  lock anything in
1ab0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
1ac0: 62 65 63 61 75 73 65 20 69 74 27 73 20 6f 6e 6c  because it's onl
1ad0: 79 20 63 61 6c 6c 65 64 20 62 79 20 6f 74 68 65  y called by othe
1ae0: 72 20 66 75 6e 63 74 69 6f 6e 73 20 61 62 6f 76  r functions abov
1af0: 65 0a 20 20 20 20 2f 2f 2f 20 77 68 69 63 68 20  e.    /// which 
1b00: 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 74  already have a t
1b10: 68 72 65 61 64 2d 73 61 66 65 20 6c 6f 63 6b 2e  hread-safe lock.
1b20: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
1b30: 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  ry>.    /// <par
1b40: 61 6d 20 6e 61 6d 65 3d 22 71 75 65 75 65 22 3e  am name="queue">
1b50: 54 68 65 20 71 75 65 75 65 20 74 6f 20 72 65 73  The queue to res
1b60: 69 7a 65 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20  ize</param>.    
1b70: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
1b80: 22 66 6f 72 41 64 64 69 6e 67 22 3e 49 66 20 61  "forAdding">If a
1b90: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 74 65 6e 64   function intend
1ba0: 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  s to add to the 
1bb0: 70 6f 6f 6c 2c 20 74 68 69 73 20 69 73 20 74 72  pool, this is tr
1bc0: 75 65 2c 20 77 68 69 63 68 20 66 6f 72 63 65 73  ue, which forces
1bd0: 20 74 68 65 20 72 65 73 69 7a 65 0a 20 20 20 20   the resize.    
1be0: 2f 2f 2f 20 74 6f 20 74 61 6b 65 20 6f 6e 65 20  /// to take one 
1bf0: 6d 6f 72 65 20 74 68 61 6e 20 69 74 20 6e 65 65  more than it nee
1c00: 64 73 20 66 72 6f 6d 20 74 68 65 20 70 6f 6f 6c  ds from the pool
1c10: 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 70 72 69  </param>.    pri
1c20: 76 61 74 65 20 73 74 61 74 69 63 20 76 6f 69 64  vate static void
1c30: 20 52 65 73 69 7a 65 50 6f 6f 6c 28 50 6f 6f 6c   ResizePool(Pool
1c40: 20 71 75 65 75 65 2c 20 62 6f 6f 6c 20 66 6f 72   queue, bool for
1c50: 41 64 64 69 6e 67 29 0a 20 20 20 20 7b 0a 20 20  Adding).    {.  
1c60: 20 20 20 20 69 6e 74 20 74 61 72 67 65 74 20 3d      int target =
1c70: 20 71 75 65 75 65 2e 4d 61 78 50 6f 6f 6c 53 69   queue.MaxPoolSi
1c80: 7a 65 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 66  ze;..      if (f
1c90: 6f 72 41 64 64 69 6e 67 20 26 26 20 74 61 72 67  orAdding && targ
1ca0: 65 74 20 3e 20 30 29 20 74 61 72 67 65 74 2d 2d  et > 0) target--
1cb0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 51 75 65 75 65  ;....      Queue
1cc0: 3c 57 65 61 6b 52 65 66 65 72 65 6e 63 65 3e 20  <WeakReference> 
1cd0: 70 6f 6f 6c 51 75 65 75 65 20 3d 20 71 75 65 75  poolQueue = queu
1ce0: 65 2e 51 75 65 75 65 3b 0d 0a 20 20 20 20 20 20  e.Queue;..      
1cf0: 69 66 20 28 70 6f 6f 6c 51 75 65 75 65 20 3d 3d  if (poolQueue ==
1d00: 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e 3b 0d 0a   null) return;..
1d10: 0d 0a 20 20 20 20 20 20 77 68 69 6c 65 20 28 70  ..      while (p
1d20: 6f 6f 6c 51 75 65 75 65 2e 43 6f 75 6e 74 20 3e  oolQueue.Count >
1d30: 20 74 61 72 67 65 74 29 0a 20 20 20 20 20 20 7b   target).      {
1d40: 0d 0a 20 20 20 20 20 20 20 20 57 65 61 6b 52 65  ..        WeakRe
1d50: 66 65 72 65 6e 63 65 20 63 6e 6e 20 3d 20 70 6f  ference cnn = po
1d60: 6f 6c 51 75 65 75 65 2e 44 65 71 75 65 75 65 28  olQueue.Dequeue(
1d70: 29 3b 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74  );.        SQLit
1d80: 65 43 6f 6e 6e 65 63 74 69 6f 6e 48 61 6e 64 6c  eConnectionHandl
1d90: 65 20 68 64 6c 20 3d 20 63 6e 6e 2e 54 61 72 67  e hdl = cnn.Targ
1da0: 65 74 20 61 73 20 53 51 4c 69 74 65 43 6f 6e 6e  et as SQLiteConn
1db0: 65 63 74 69 6f 6e 48 61 6e 64 6c 65 3b 0a 20 20  ectionHandle;.  
1dc0: 20 20 20 20 20 20 69 66 20 28 68 64 6c 20 21 3d        if (hdl !=
1dd0: 20 6e 75 6c 6c 29 0a 20 20 20 20 20 20 20 20 7b   null).        {
1de0: 0a 20 20 20 20 20 20 20 20 20 20 68 64 6c 2e 44  .          hdl.D
1df0: 69 73 70 6f 73 65 28 29 3b 0a 20 20 20 20 20 20  ispose();.      
1e00: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 47 43 2e    }..        GC.
1e10: 4b 65 65 70 41 6c 69 76 65 28 68 64 6c 29 3b 0a  KeepAlive(hdl);.
1e20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e30: 7d 0a 7d 0a                                      }.}.