System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 6717d3ce8f0468b0e40c1c83fd9cdd491d664a9f:


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 0d 0a 20 2a 20 41 44  *********.. * AD
0040: 4f 2e 4e 45 54 20 32 2e 30 20 44 61 74 61 20 50  O.NET 2.0 Data P
0050: 72 6f 76 69 64 65 72 20 66 6f 72 20 53 51 4c 69  rovider for SQLi
0060: 74 65 20 56 65 72 73 69 6f 6e 20 33 2e 58 0d 0a  te Version 3.X..
0070: 20 2a 20 57 72 69 74 74 65 6e 20 62 79 20 52 6f   * Written by Ro
0080: 62 65 72 74 20 53 69 6d 70 73 6f 6e 20 28 72 6f  bert Simpson (ro
0090: 62 65 72 74 40 62 6c 61 63 6b 63 61 73 74 6c 65  bert@blackcastle
00a0: 73 6f 66 74 2e 63 6f 6d 29 0d 0a 20 2a 0d 0a 20  soft.com).. *.. 
00b0: 2a 20 52 65 6c 65 61 73 65 64 20 74 6f 20 74 68  * Released to th
00c0: 65 20 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e 2c  e public domain,
00d0: 20 75 73 65 20 61 74 20 79 6f 75 72 20 6f 77 6e   use at your own
00e0: 20 72 69 73 6b 21 0d 0a 20 2a 2a 2a 2a 2a 2a 2a   risk!.. *******
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 2a 2a 2a  ****************
0120: 2a 2f 0d 0a 0d 0a 6e 61 6d 65 73 70 61 63 65 20  */....namespace 
0130: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
0140: 74 65 0d 0a 7b 0d 0a 20 20 20 20 75 73 69 6e 67  te..{..    using
0150: 20 53 79 73 74 65 6d 3b 0d 0a 20 20 20 20 75 73   System;..    us
0160: 69 6e 67 20 53 79 73 74 65 6d 2e 43 6f 6c 6c 65  ing System.Colle
0170: 63 74 69 6f 6e 73 2e 47 65 6e 65 72 69 63 3b 0d  ctions.Generic;.
0180: 0a 20 20 20 20 75 73 69 6e 67 20 53 79 73 74 65  .    using Syste
0190: 6d 2e 44 61 74 61 3b 0d 0a 20 20 20 20 75 73 69  m.Data;..    usi
01a0: 6e 67 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 43  ng System.Data.C
01b0: 6f 6d 6d 6f 6e 3b 0d 0a 20 20 20 20 75 73 69 6e  ommon;..    usin
01c0: 67 20 53 79 73 74 65 6d 2e 54 68 72 65 61 64 69  g System.Threadi
01d0: 6e 67 3b 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 2f 2f  ng;....    /////
01e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
01f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0200: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0210: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0220: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0230: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
0240: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
0250: 0a 20 20 20 20 2f 2f 2f 20 53 51 4c 69 74 65 20  .    /// SQLite 
0260: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
0270: 66 20 44 62 54 72 61 6e 73 61 63 74 69 6f 6e 2e  f DbTransaction.
0280: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ..    /// </summ
0290: 61 72 79 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63  ary>..    public
02a0: 20 73 65 61 6c 65 64 20 63 6c 61 73 73 20 53 51   sealed class SQ
02b0: 4c 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 20  LiteTransaction 
02c0: 3a 20 44 62 54 72 61 6e 73 61 63 74 69 6f 6e 0d  : DbTransaction.
02d0: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20  .    {..        
02e0: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
02f0: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 63         /// The c
0300: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 77 68 69  onnection to whi
0310: 63 68 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  ch this transact
0320: 69 6f 6e 20 69 73 20 62 6f 75 6e 64 0d 0a 20 20  ion is bound..  
0330: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d        /// </summ
0340: 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 69 6e  ary>..        in
0350: 74 65 72 6e 61 6c 20 53 51 4c 69 74 65 43 6f 6e  ternal SQLiteCon
0360: 6e 65 63 74 69 6f 6e 20 5f 63 6e 6e 3b 0d 0a 0d  nection _cnn;...
0370: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75  .        /// <su
0380: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20  mmary>..        
0390: 2f 2f 2f 20 4d 61 74 63 68 65 73 20 74 68 65 20  /// Matches the 
03a0: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 63  version of the c
03b0: 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 20 20 20 20  onnection...    
03c0: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
03d0: 79 3e 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76  y>..        priv
03e0: 61 74 65 20 69 6e 74 20 5f 76 65 72 73 69 6f 6e  ate int _version
03f0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ;....        ///
0400: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
0410: 20 20 20 20 2f 2f 2f 20 54 68 65 20 69 73 6f 6c      /// The isol
0420: 61 74 69 6f 6e 20 6c 65 76 65 6c 20 66 6f 72 20  ation level for 
0430: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
0440: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
0450: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20  /summary>..     
0460: 20 20 20 70 72 69 76 61 74 65 20 49 73 6f 6c 61     private Isola
0470: 74 69 6f 6e 4c 65 76 65 6c 20 5f 6c 65 76 65 6c  tionLevel _level
0480: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ;....        ///
0490: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
04a0: 20 20 20 20 2f 2f 2f 20 54 68 65 20 6f 72 69 67      /// The orig
04b0: 69 6e 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  inal transaction
04c0: 20 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 61   level for the a
04d0: 73 73 6f 63 69 61 74 65 64 20 63 6f 6e 6e 65 63  ssociated connec
04e0: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  tion..        //
04f0: 2f 20 77 68 65 6e 20 74 68 69 73 20 74 72 61 6e  / when this tran
0500: 73 61 63 74 69 6f 6e 20 77 61 73 20 63 72 65 61  saction was crea
0510: 74 65 64 20 28 69 2e 65 2e 20 62 65 67 75 6e 29  ted (i.e. begun)
0520: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
0530: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20  /summary>..     
0540: 20 20 20 70 72 69 76 61 74 65 20 69 6e 74 20 5f     private int _
0550: 62 65 67 69 6e 4c 65 76 65 6c 3b 0d 0a 0d 0a 20  beginLevel;.... 
0560: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d         /// <summ
0570: 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ary>..        //
0580: 2f 20 54 68 65 20 53 41 56 45 50 4f 49 4e 54 20  / The SAVEPOINT 
0590: 6e 61 6d 65 20 66 6f 72 20 74 68 69 73 20 74 72  name for this tr
05a0: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 61 6e  ansaction, if an
05b0: 79 2e 20 20 54 68 69 73 20 77 69 6c 6c 0d 0a 20  y.  This will.. 
05c0: 20 20 20 20 20 20 20 2f 2f 2f 20 6f 6e 6c 79 20         /// only 
05d0: 62 65 20 6e 6f 6e 2d 6e 75 6c 6c 20 69 66 20 74  be non-null if t
05e0: 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
05f0: 69 73 20 61 20 6e 65 73 74 65 64 20 6f 6e 65 2e  is a nested one.
0600: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
0610: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
0620: 20 20 70 72 69 76 61 74 65 20 73 74 72 69 6e 67    private string
0630: 20 5f 73 61 76 65 50 6f 69 6e 74 4e 61 6d 65 3b   _savePointName;
0640: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f  ....        ////
0650: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0660: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0670: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0680: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0690: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
06a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
06b0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d         /// <summ
06c0: 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ary>..        //
06d0: 2f 20 43 6f 6e 73 74 72 75 63 74 73 20 74 68 65  / Constructs the
06e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 62 6a   transaction obj
06f0: 65 63 74 2c 20 62 69 6e 64 69 6e 67 20 69 74 20  ect, binding it 
0700: 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
0710: 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20  connection..    
0720: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
0730: 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  y>..        /// 
0740: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63 6f 6e  <param name="con
0750: 6e 65 63 74 69 6f 6e 22 3e 54 68 65 20 63 6f 6e  nection">The con
0760: 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 70 65 6e 20  nection to open 
0770: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  a transaction on
0780: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20  </param>..      
0790: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
07a0: 65 3d 22 64 65 66 65 72 72 65 64 4c 6f 63 6b 22  e="deferredLock"
07b0: 3e 54 52 55 45 20 74 6f 20 64 65 66 65 72 20 74  >TRUE to defer t
07c0: 68 65 20 77 72 69 74 65 6c 6f 63 6b 2c 20 6f 72  he writelock, or
07d0: 20 46 41 4c 53 45 20 74 6f 20 6c 6f 63 6b 20 69   FALSE to lock i
07e0: 6d 6d 65 64 69 61 74 65 6c 79 3c 2f 70 61 72 61  mmediately</para
07f0: 6d 3e 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 65  m>..        inte
0800: 72 6e 61 6c 20 53 51 4c 69 74 65 54 72 61 6e 73  rnal SQLiteTrans
0810: 61 63 74 69 6f 6e 28 53 51 4c 69 74 65 43 6f 6e  action(SQLiteCon
0820: 6e 65 63 74 69 6f 6e 20 63 6f 6e 6e 65 63 74 69  nection connecti
0830: 6f 6e 2c 20 62 6f 6f 6c 20 64 65 66 65 72 72 65  on, bool deferre
0840: 64 4c 6f 63 6b 29 0d 0a 20 20 20 20 20 20 20 20  dLock)..        
0850: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5f  {..            _
0860: 63 6e 6e 20 3d 20 63 6f 6e 6e 65 63 74 69 6f 6e  cnn = connection
0870: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5f  ;..            _
0880: 76 65 72 73 69 6f 6e 20 3d 20 5f 63 6e 6e 2e 5f  version = _cnn._
0890: 76 65 72 73 69 6f 6e 3b 0d 0a 0d 0a 20 20 20 20  version;....    
08a0: 20 20 20 20 20 20 20 20 5f 6c 65 76 65 6c 20 3d          _level =
08b0: 20 28 64 65 66 65 72 72 65 64 4c 6f 63 6b 20 3d   (deferredLock =
08c0: 3d 20 74 72 75 65 29 20 3f 0d 0a 20 20 20 20 20  = true) ?..     
08d0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74             SQLit
08e0: 65 43 6f 6e 6e 65 63 74 69 6f 6e 2e 44 65 66 65  eConnection.Defe
08f0: 72 72 65 64 49 73 6f 6c 61 74 69 6f 6e 4c 65 76  rredIsolationLev
0900: 65 6c 20 3a 0d 0a 20 20 20 20 20 20 20 20 20 20  el :..          
0910: 20 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e        SQLiteConn
0920: 65 63 74 69 6f 6e 2e 49 6d 6d 65 64 69 61 74 65  ection.Immediate
0930: 49 73 6f 6c 61 74 69 6f 6e 4c 65 76 65 6c 3b 0d  IsolationLevel;.
0940: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
0950: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 4c 65  nt transactionLe
0960: 76 65 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  vel;....        
0970: 20 20 20 20 69 66 20 28 28 74 72 61 6e 73 61 63      if ((transac
0980: 74 69 6f 6e 4c 65 76 65 6c 20 3d 20 5f 63 6e 6e  tionLevel = _cnn
0990: 2e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 4c 65 76  ._transactionLev
09a0: 65 6c 2b 2b 29 20 3d 3d 20 30 29 0d 0a 20 20 20  el++) == 0)..   
09b0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 0d              try.
09d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
09e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
09f0: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 53          using (S
0a00: 51 4c 69 74 65 43 6f 6d 6d 61 6e 64 20 63 6d 64  QLiteCommand cmd
0a10: 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f   = _cnn.CreateCo
0a20: 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20  mmand())..      
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
0a40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0a50: 20 20 20 20 20 20 20 20 20 69 66 20 28 21 64 65           if (!de
0a60: 66 65 72 72 65 64 4c 6f 63 6b 29 0d 0a 20 20 20  ferredLock)..   
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a80: 20 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d           cmd.Com
0a90: 6d 61 6e 64 54 65 78 74 20 3d 20 22 42 45 47 49  mandText = "BEGI
0aa0: 4e 20 49 4d 4d 45 44 49 41 54 45 3b 22 3b 0d 0a  N IMMEDIATE;";..
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20          else..  
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ae0: 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f            cmd.Co
0af0: 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 42 45 47  mmandText = "BEG
0b00: 49 4e 3b 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  IN;";....       
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b20: 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51   cmd.ExecuteNonQ
0b30: 75 65 72 79 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  uery();....     
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 5f 62 65 67 69 6e 4c 65 76 65 6c 20 3d     _beginLevel =
0b60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 4c 65 76 65   transactionLeve
0b70: 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l;..            
0b80: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
0b90: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
0bb0: 74 63 68 20 28 53 51 4c 69 74 65 45 78 63 65 70  tch (SQLiteExcep
0bc0: 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20 20  tion)..         
0bd0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 63                _c
0bf0: 6e 6e 2e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 4c  nn._transactionL
0c00: 65 76 65 6c 2d 2d 3b 0d 0a 20 20 20 20 20 20 20  evel--;..       
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 63 6e               _cn
0c20: 6e 20 3d 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20  n = null;....   
0c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c40: 20 74 68 72 6f 77 3b 0d 0a 20 20 20 20 20 20 20   throw;..       
0c50: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
0c60: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
0c70: 20 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20         else..   
0c80: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 0d              try.
0ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0cb0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
0cc0: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 53          using (S
0cd0: 51 4c 69 74 65 43 6f 6d 6d 61 6e 64 20 63 6d 64  QLiteCommand cmd
0ce0: 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f   = _cnn.CreateCo
0cf0: 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20  mmand())..      
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
0d10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0d20: 20 20 20 20 20 20 20 20 20 5f 73 61 76 65 50 6f           _savePo
0d30: 69 6e 74 4e 61 6d 65 20 3d 20 47 65 74 53 61 76  intName = GetSav
0d40: 65 50 6f 69 6e 74 4e 61 6d 65 28 29 3b 0d 0a 0d  ePointName();...
0d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0d60: 20 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d           cmd.Com
0d70: 6d 61 6e 64 54 65 78 74 20 3d 20 53 74 72 69 6e  mandText = Strin
0d80: 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0da0: 20 20 20 20 20 20 20 22 53 41 56 45 50 4f 49 4e         "SAVEPOIN
0db0: 54 20 7b 30 7d 3b 22 2c 20 5f 73 61 76 65 50 6f  T {0};", _savePo
0dc0: 69 6e 74 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20  intName);....   
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0de0: 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65       cmd.Execute
0df0: 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 0d 0a 20  NonQuery();.... 
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e10: 20 20 20 20 20 20 20 5f 62 65 67 69 6e 4c 65 76         _beginLev
0e20: 65 6c 20 3d 20 74 72 61 6e 73 61 63 74 69 6f 6e  el = transaction
0e30: 4c 65 76 65 6c 3b 0d 0a 20 20 20 20 20 20 20 20  Level;..        
0e40: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
0e60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
0e70: 20 20 63 61 74 63 68 20 28 53 51 4c 69 74 65 45    catch (SQLiteE
0e80: 78 63 65 70 74 69 6f 6e 29 0d 0a 20 20 20 20 20  xception)..     
0e90: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0eb0: 20 20 5f 63 6e 6e 2e 5f 74 72 61 6e 73 61 63 74    _cnn._transact
0ec0: 69 6f 6e 4c 65 76 65 6c 2d 2d 3b 0d 0a 20 20 20  ionLevel--;..   
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ee0: 20 5f 63 6e 6e 20 3d 20 6e 75 6c 6c 3b 0d 0a 0d   _cnn = null;...
0ef0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0f00: 20 20 20 20 20 74 68 72 6f 77 3b 0d 0a 20 20 20       throw;..   
0f10: 20 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 7d 0d 0a 20              }.. 
0f30: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
0f40: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
0f50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0f60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0f70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0f80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0f90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0fa0: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  ///....        #
0fb0: 72 65 67 69 6f 6e 20 49 44 69 73 70 6f 73 61 62  region IDisposab
0fc0: 6c 65 20 22 50 61 74 74 65 72 6e 22 20 4d 65 6d  le "Pattern" Mem
0fd0: 62 65 72 73 0d 0a 20 20 20 20 20 20 20 20 70 72  bers..        pr
0fe0: 69 76 61 74 65 20 62 6f 6f 6c 20 64 69 73 70 6f  ivate bool dispo
0ff0: 73 65 64 3b 0d 0a 20 20 20 20 20 20 20 20 70 72  sed;..        pr
1000: 69 76 61 74 65 20 76 6f 69 64 20 43 68 65 63 6b  ivate void Check
1010: 44 69 73 70 6f 73 65 64 28 29 20 2f 2a 20 74 68  Disposed() /* th
1020: 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20  row */..        
1030: 7b 0d 0a 23 69 66 20 54 48 52 4f 57 5f 4f 4e 5f  {..#if THROW_ON_
1040: 44 49 53 50 4f 53 45 44 0d 0a 20 20 20 20 20 20  DISPOSED..      
1050: 20 20 20 20 20 20 69 66 20 28 64 69 73 70 6f 73        if (dispos
1060: 65 64 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed)..           
1070: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 4f       throw new O
1080: 62 6a 65 63 74 44 69 73 70 6f 73 65 64 45 78 63  bjectDisposedExc
1090: 65 70 74 69 6f 6e 28 74 79 70 65 6f 66 28 53 51  eption(typeof(SQ
10a0: 4c 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 29  LiteTransaction)
10b0: 2e 4e 61 6d 65 29 3b 0d 0a 23 65 6e 64 69 66 0d  .Name);..#endif.
10c0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
10d0: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
10e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1100: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1110: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1120: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1130: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
1140: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
1150: 20 20 20 20 20 20 20 20 2f 2f 2f 20 44 69 73 70          /// Disp
1160: 6f 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63  oses the transac
1170: 74 69 6f 6e 2e 20 20 49 66 20 69 74 20 69 73 20  tion.  If it is 
1180: 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
1190: 2c 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72  , any changes ar
11a0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0d 0a  e rolled back...
11b0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 73 75          /// </su
11c0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20  mmary>..        
11d0: 70 72 6f 74 65 63 74 65 64 20 6f 76 65 72 72 69  protected overri
11e0: 64 65 20 76 6f 69 64 20 44 69 73 70 6f 73 65 28  de void Dispose(
11f0: 62 6f 6f 6c 20 64 69 73 70 6f 73 69 6e 67 29 0d  bool disposing).
1200: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
1210: 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20          try..   
1220: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
1230: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
1240: 21 64 69 73 70 6f 73 65 64 29 0d 0a 20 20 20 20  !disposed)..    
1250: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1270: 20 20 20 69 66 20 28 64 69 73 70 6f 73 69 6e 67     if (disposing
1280: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
1290: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
12a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b0: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
12c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12d0: 2f 2f 2f 2f 2f 2f 0d 0a 20 20 20 20 20 20 20 20  //////..        
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f0: 2f 2f 20 64 69 73 70 6f 73 65 20 6d 61 6e 61 67  // dispose manag
1300: 65 64 20 72 65 73 6f 75 72 63 65 73 20 68 65 72  ed resources her
1310: 65 2e 2e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  e.....          
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
1330: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1340: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1350: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
1360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1370: 20 28 49 73 56 61 6c 69 64 28 66 61 6c 73 65 29   (IsValid(false)
1380: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
1390: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b0: 20 20 20 20 20 20 20 20 20 20 49 73 73 75 65 52            IssueR
13c0: 6f 6c 6c 62 61 63 6b 28 66 61 6c 73 65 29 3b 0d  ollback(false);.
13d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13e0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
1410: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
1420: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1430: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
1440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1450: 20 20 20 20 20 2f 2f 20 72 65 6c 65 61 73 65 20       // release 
1460: 75 6e 6d 61 6e 61 67 65 64 20 72 65 73 6f 75 72  unmanaged resour
1470: 63 65 73 20 68 65 72 65 2e 2e 2e 0d 0a 20 20 20  ces here.....   
1480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1490: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
14a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14b0: 2f 2f 2f 2f 2f 2f 2f 0d 0a 20 20 20 20 20 20 20  ///////..       
14c0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
14d0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
14e0: 20 20 20 20 20 20 20 66 69 6e 61 6c 6c 79 0d 0a         finally..
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1510: 61 73 65 2e 44 69 73 70 6f 73 65 28 64 69 73 70  ase.Dispose(disp
1520: 6f 73 69 6e 67 29 3b 0d 0a 0d 0a 20 20 20 20 20  osing);....     
1530: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1550: 2f 20 4e 4f 54 45 3a 20 45 76 65 72 79 74 68 69  / NOTE: Everythi
1560: 6e 67 20 73 68 6f 75 6c 64 20 62 65 20 66 75 6c  ng should be ful
1570: 6c 79 20 64 69 73 70 6f 73 65 64 20 61 74 20 74  ly disposed at t
1580: 68 69 73 20 70 6f 69 6e 74 2e 0d 0a 20 20 20 20  his point...    
1590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b0: 64 69 73 70 6f 73 65 64 20 3d 20 74 72 75 65 3b  disposed = true;
15c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
15d0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
15e0: 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
15f0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f  ..        //////
1600: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1610: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1620: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1630: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1640: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1650: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
1660: 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72       /// <summar
1670: 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  y>..        /// 
1680: 43 6f 6d 6d 69 74 73 20 74 68 65 20 63 75 72 72  Commits the curr
1690: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
16a0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
16b0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
16c0: 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64    public overrid
16d0: 65 20 76 6f 69 64 20 43 6f 6d 6d 69 74 28 29 0d  e void Commit().
16e0: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
16f0: 20 20 20 20 20 20 20 20 43 68 65 63 6b 44 69 73          CheckDis
1700: 70 6f 73 65 64 28 29 3b 0d 0a 20 20 20 20 20 20  posed();..      
1710: 20 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e        SQLiteConn
1720: 65 63 74 69 6f 6e 2e 43 68 65 63 6b 28 5f 63 6e  ection.Check(_cn
1730: 6e 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n);..           
1740: 20 49 73 56 61 6c 69 64 28 74 72 75 65 29 3b 0d   IsValid(true);.
1750: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
1760: 66 20 28 5f 62 65 67 69 6e 4c 65 76 65 6c 20 3d  f (_beginLevel =
1770: 3d 20 30 29 0d 0a 20 20 20 20 20 20 20 20 20 20  = 0)..          
1780: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1790: 20 20 20 20 20 75 73 69 6e 67 20 28 53 51 4c 69       using (SQLi
17a0: 74 65 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20  teCommand cmd = 
17b0: 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61  _cnn.CreateComma
17c0: 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20  nd())..         
17d0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6d                cm
17f0: 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
1800: 22 43 4f 4d 4d 49 54 3b 22 3b 0d 0a 20 20 20 20  "COMMIT;";..    
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75  cmd.ExecuteNonQu
1830: 65 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ery();..        
1840: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 63 6e               _cn
1860: 6e 2e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 4c 65  n._transactionLe
1870: 76 65 6c 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20  vel = 0;..      
1880: 20 20 20 20 20 20 20 20 20 20 5f 63 6e 6e 20 3d            _cnn =
1890: 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20   null;..        
18a0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
18b0: 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20     else..       
18c0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
18d0: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 53          using (S
18e0: 51 4c 69 74 65 43 6f 6d 6d 61 6e 64 20 63 6d 64  QLiteCommand cmd
18f0: 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f   = _cnn.CreateCo
1900: 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20  mmand())..      
1910: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1930: 20 69 66 20 28 53 74 72 69 6e 67 2e 49 73 4e 75   if (String.IsNu
1940: 6c 6c 4f 72 45 6d 70 74 79 28 5f 73 61 76 65 50  llOrEmpty(_saveP
1950: 6f 69 6e 74 4e 61 6d 65 29 29 0d 0a 20 20 20 20  ointName))..    
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 53 51      throw new SQ
1980: 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 22 43  LiteException("C
1990: 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 2c 20 75 6e  annot commit, un
19a0: 6b 6e 6f 77 6e 20 53 41 56 45 50 4f 49 4e 54 22  known SAVEPOINT"
19b0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
19c0: 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f            cmd.Co
19d0: 6d 6d 61 6e 64 54 65 78 74 20 3d 20 53 74 72 69  mmandText = Stri
19e0: 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a00: 20 20 20 20 22 52 45 4c 45 41 53 45 20 7b 30 7d      "RELEASE {0}
1a10: 3b 22 2c 20 5f 73 61 76 65 50 6f 69 6e 74 4e 61  ;", _savePointNa
1a20: 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  me);....        
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e              cmd.
1a40: 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28  ExecuteNonQuery(
1a50: 29 3b 0d 0a 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 5f 63 6e 6e 2e 5f 74           _cnn._t
1a80: 72 61 6e 73 61 63 74 69 6f 6e 4c 65 76 65 6c 2d  ransactionLevel-
1a90: 2d 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  -;..            
1aa0: 20 20 20 20 5f 63 6e 6e 20 3d 20 6e 75 6c 6c 3b      _cnn = null;
1ab0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1ac0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1ad0: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
1ae0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1af0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b30: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
1b40: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
1b50: 20 20 20 20 20 20 20 20 2f 2f 2f 20 52 65 74 75          /// Retu
1b60: 72 6e 73 20 74 68 65 20 75 6e 64 65 72 6c 79 69  rns the underlyi
1b70: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  ng connection to
1b80: 20 77 68 69 63 68 20 74 68 69 73 20 74 72 61 6e   which this tran
1b90: 73 61 63 74 69 6f 6e 20 61 70 70 6c 69 65 73 2e  saction applies.
1ba0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
1bb0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
1bc0: 20 20 70 75 62 6c 69 63 20 6e 65 77 20 53 51 4c    public new SQL
1bd0: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 43 6f  iteConnection Co
1be0: 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20  nnection..      
1bf0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1c00: 20 67 65 74 20 7b 20 43 68 65 63 6b 44 69 73 70   get { CheckDisp
1c10: 6f 73 65 64 28 29 3b 20 72 65 74 75 72 6e 20 5f  osed(); return _
1c20: 63 6e 6e 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20  cnn; }..        
1c30: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  }....        ///
1c40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
1ca0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d          /// <sum
1cb0: 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f  mary>..        /
1cc0: 2f 2f 20 46 6f 72 77 61 72 64 73 20 74 6f 20 74  // Forwards to t
1cd0: 68 65 20 6c 6f 63 61 6c 20 43 6f 6e 6e 65 63 74  he local Connect
1ce0: 69 6f 6e 20 70 72 6f 70 65 72 74 79 0d 0a 20 20  ion property..  
1cf0: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d        /// </summ
1d00: 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 70 72  ary>..        pr
1d10: 6f 74 65 63 74 65 64 20 6f 76 65 72 72 69 64 65  otected override
1d20: 20 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 44 62   DbConnection Db
1d30: 43 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20  Connection..    
1d40: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1d50: 20 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20     get { return 
1d60: 43 6f 6e 6e 65 63 74 69 6f 6e 3b 20 7d 0d 0a 20  Connection; }.. 
1d70: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1d80: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
1d90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1da0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1db0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1dc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1dd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1de0: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f  ///....        /
1df0: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
1e00: 20 20 20 20 20 20 2f 2f 2f 20 47 65 74 73 20 74        /// Gets t
1e10: 68 65 20 69 73 6f 6c 61 74 69 6f 6e 20 6c 65 76  he isolation lev
1e20: 65 6c 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  el of the transa
1e30: 63 74 69 6f 6e 2e 20 20 53 51 4c 69 74 65 20 6f  ction.  SQLite o
1e40: 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 53 65 72  nly supports Ser
1e50: 69 61 6c 69 7a 61 62 6c 65 20 74 72 61 6e 73 61  ializable transa
1e60: 63 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20 20  ctions...       
1e70: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
1e80: 0a 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20  .        public 
1e90: 6f 76 65 72 72 69 64 65 20 49 73 6f 6c 61 74 69  override Isolati
1ea0: 6f 6e 4c 65 76 65 6c 20 49 73 6f 6c 61 74 69 6f  onLevel Isolatio
1eb0: 6e 4c 65 76 65 6c 0d 0a 20 20 20 20 20 20 20 20  nLevel..        
1ec0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  {..            g
1ed0: 65 74 20 7b 20 43 68 65 63 6b 44 69 73 70 6f 73  et { CheckDispos
1ee0: 65 64 28 29 3b 20 72 65 74 75 72 6e 20 5f 6c 65  ed(); return _le
1ef0: 76 65 6c 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20  vel; }..        
1f00: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  }....        ///
1f10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
1f70: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d          /// <sum
1f80: 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f  mary>..        /
1f90: 2f 2f 20 52 6f 6c 6c 73 20 62 61 63 6b 20 74 68  // Rolls back th
1fa0: 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  e active transac
1fb0: 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 2f  tion...        /
1fc0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
1fd0: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 6f 76         public ov
1fe0: 65 72 72 69 64 65 20 76 6f 69 64 20 52 6f 6c 6c  erride void Roll
1ff0: 62 61 63 6b 28 29 0d 0a 20 20 20 20 20 20 20 20  back()..        
2000: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43  {..            C
2010: 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0d  heckDisposed();.
2020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  .            SQL
2030: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2e 43 68  iteConnection.Ch
2040: 65 63 6b 28 5f 63 6e 6e 29 3b 0d 0a 20 20 20 20  eck(_cnn);..    
2050: 20 20 20 20 20 20 20 20 49 73 56 61 6c 69 64 28          IsValid(
2060: 74 72 75 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  true);..        
2070: 20 20 20 20 49 73 73 75 65 52 6f 6c 6c 62 61 63      IssueRollbac
2080: 6b 28 74 72 75 65 29 3b 0d 0a 20 20 20 20 20 20  k(true);..      
2090: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f    }....        /
20a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
20b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
20c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
20d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
20e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
20f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
2100: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73  ..        /// <s
2110: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20  ummary>..       
2120: 20 2f 2f 2f 20 49 73 73 75 65 20 61 20 52 4f 4c   /// Issue a ROL
2130: 4c 42 41 43 4b 20 63 6f 6d 6d 61 6e 64 20 61 67  LBACK command ag
2140: 61 69 6e 73 74 20 74 68 65 20 64 61 74 61 62 61  ainst the databa
2150: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 0d 0a  se connection,..
2160: 20 20 20 20 20 20 20 20 2f 2f 2f 20 6f 70 74 69          /// opti
2170: 6f 6e 61 6c 6c 79 20 72 65 2d 74 68 72 6f 77 69  onally re-throwi
2180: 6e 67 20 61 6e 79 20 63 61 75 67 68 74 20 65 78  ng any caught ex
2190: 63 65 70 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20  ception...      
21a0: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
21b0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
21c0: 61 72 61 6d 20 6e 61 6d 65 3d 22 74 68 72 6f 77  aram name="throw
21d0: 45 72 72 6f 72 22 3e 0d 0a 20 20 20 20 20 20 20  Error">..       
21e0: 20 2f 2f 2f 20 4e 6f 6e 2d 7a 65 72 6f 20 74 6f   /// Non-zero to
21f0: 20 72 65 2d 74 68 72 6f 77 20 63 61 75 67 68 74   re-throw caught
2200: 20 65 78 63 65 70 74 69 6f 6e 73 2e 0d 0a 20 20   exceptions...  
2210: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
2220: 6d 3e 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76  m>..        priv
2230: 61 74 65 20 76 6f 69 64 20 49 73 73 75 65 52 6f  ate void IssueRo
2240: 6c 6c 62 61 63 6b 28 62 6f 6f 6c 20 74 68 72 6f  llback(bool thro
2250: 77 45 72 72 6f 72 29 0d 0a 20 20 20 20 20 20 20  wError)..       
2260: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2270: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
2280: 20 63 6e 6e 20 3d 20 49 6e 74 65 72 6c 6f 63 6b   cnn = Interlock
2290: 65 64 2e 45 78 63 68 61 6e 67 65 28 72 65 66 20  ed.Exchange(ref 
22a0: 5f 63 6e 6e 2c 20 6e 75 6c 6c 29 3b 0d 0a 0d 0a  _cnn, null);....
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
22c0: 63 6e 6e 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20  cnn != null)..  
22d0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
22f0: 28 5f 62 65 67 69 6e 4c 65 76 65 6c 20 3d 3d 20  (_beginLevel == 
2300: 30 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0)..            
2310: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
2320: 20 20 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a             try..
2330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2340: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
2360: 73 69 6e 67 20 28 53 51 4c 69 74 65 43 6f 6d 6d  sing (SQLiteComm
2370: 61 6e 64 20 63 6d 64 20 3d 20 63 6e 6e 2e 43 72  and cmd = cnn.Cr
2380: 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a  eateCommand())..
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61         cmd.Comma
23d0: 6e 64 54 65 78 74 20 3d 20 22 52 4f 4c 4c 42 41  ndText = "ROLLBA
23e0: 43 4b 3b 22 3b 0d 0a 20 20 20 20 20 20 20 20 20  CK;";..         
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f     cmd.ExecuteNo
2410: 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20 20  nQuery();..     
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 63 6e 6e 2e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  cnn._transaction
2460: 4c 65 76 65 6c 20 3d 20 30 3b 0d 0a 20 20 20 20  Level = 0;..    
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
2490: 20 20 20 20 20 20 20 63 61 74 63 68 0d 0a 20 20         catch..  
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
24d0: 28 74 68 72 6f 77 45 72 72 6f 72 29 0d 0a 20 20  (throwError)..  
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 3b            throw;
2500: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2510: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2520: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2530: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
2540: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2550: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
2560: 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20           try..  
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2580: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69               usi
25a0: 6e 67 20 28 53 51 4c 69 74 65 43 6f 6d 6d 61 6e  ng (SQLiteComman
25b0: 64 20 63 6d 64 20 3d 20 63 6e 6e 2e 43 72 65 61  d cmd = cnn.Crea
25c0: 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20  teCommand())..  
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2600: 20 20 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e       if (String.
2610: 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 5f 73  IsNullOrEmpty(_s
2620: 61 76 65 50 6f 69 6e 74 4e 61 6d 65 29 29 0d 0a  avePointName))..
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65  throw new SQLite
2660: 45 78 63 65 70 74 69 6f 6e 28 22 43 61 6e 6e 6f  Exception("Canno
2670: 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 6b 6e  t rollback, unkn
2680: 6f 77 6e 20 53 41 56 45 50 4f 49 4e 54 22 29 3b  own SAVEPOINT");
2690: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20  cmd.CommandText 
26c0: 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  = String.Format(
26d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f0: 20 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 7b    "ROLLBACK TO {
2700: 30 7d 3b 22 2c 20 5f 73 61 76 65 50 6f 69 6e 74  0};", _savePoint
2710: 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  Name);....      
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2730: 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74        cmd.Execut
2740: 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20  eNonQuery();..  
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2760: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2780: 20 20 20 63 6e 6e 2e 5f 74 72 61 6e 73 61 63 74     cnn._transact
2790: 69 6f 6e 4c 65 76 65 6c 2d 2d 3b 0d 0a 20 20 20  ionLevel--;..   
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
27c0: 20 20 20 20 20 20 20 20 63 61 74 63 68 0d 0a 20          catch.. 
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2800: 20 28 74 68 72 6f 77 45 72 72 6f 72 29 0d 0a 20   (throwError).. 
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2820: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77             throw
2830: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
2840: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2850: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2860: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2870: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
2880: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
2890: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
28a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
28b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
28c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
28d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
28e0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ....        /// 
28f0: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20  <summary>..     
2900: 20 20 20 2f 2f 2f 20 43 6f 6e 73 74 72 75 63 74     /// Construct
2910: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
2920: 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 20 66 6f  new savepoint fo
2930: 72 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  r this transacti
2940: 6f 6e 2e 20 20 49 74 0d 0a 20 20 20 20 20 20 20  on.  It..       
2950: 20 2f 2f 2f 20 73 68 6f 75 6c 64 20 6f 6e 6c 79   /// should only
2960: 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   be called from 
2970: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 6f 72 20  the constructor 
2980: 6f 66 20 74 68 69 73 20 63 6c 61 73 73 2e 0d 0a  of this class...
2990: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 73 75          /// </su
29a0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20  mmary>..        
29b0: 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a 20  /// <returns>.. 
29c0: 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e         /// The n
29d0: 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 73  ame of the new s
29e0: 61 76 65 70 6f 69 6e 74 20 2d 4f 52 2d 20 6e 75  avepoint -OR- nu
29f0: 6c 6c 20 69 66 20 69 74 20 63 61 6e 6e 6f 74 20  ll if it cannot 
2a00: 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0d  be constructed..
2a10: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 72  .        /// </r
2a20: 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20  eturns>..       
2a30: 20 70 72 69 76 61 74 65 20 73 74 72 69 6e 67 20   private string 
2a40: 47 65 74 53 61 76 65 50 6f 69 6e 74 4e 61 6d 65  GetSavePointName
2a50: 28 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  ()..        {.. 
2a60: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 73             int s
2a70: 65 71 75 65 6e 63 65 20 3d 20 2b 2b 5f 63 6e 6e  equence = ++_cnn
2a80: 2e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 53 65 71  ._transactionSeq
2a90: 75 65 6e 63 65 3b 0d 0a 0d 0a 20 20 20 20 20 20  uence;....      
2aa0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 74 72        return Str
2ab0: 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20  ing.Format(..   
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73 71               "sq
2ad0: 6c 69 74 65 5f 64 6f 74 6e 65 74 5f 73 61 76 65  lite_dotnet_save
2ae0: 70 6f 69 6e 74 5f 7b 30 7d 22 2c 20 73 65 71 75  point_{0}", sequ
2af0: 65 6e 63 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  ence);..        
2b00: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  }....        ///
2b10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2b20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2b30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2b40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2b50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2b60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
2b70: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d          /// <sum
2b80: 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f  mary>..        /
2b90: 2f 2f 20 43 68 65 63 6b 73 20 74 68 65 20 73 74  // Checks the st
2ba0: 61 74 65 20 6f 66 20 74 68 69 73 20 74 72 61 6e  ate of this tran
2bb0: 73 61 63 74 69 6f 6e 2c 20 6f 70 74 69 6f 6e 61  saction, optiona
2bc0: 6c 6c 79 20 74 68 72 6f 77 69 6e 67 20 61 6e 20  lly throwing an 
2bd0: 65 78 63 65 70 74 69 6f 6e 20 69 66 20 61 20 73  exception if a s
2be0: 74 61 74 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e  tate inconsisten
2bf0: 63 79 20 69 73 20 66 6f 75 6e 64 2e 0d 0a 20 20  cy is found...  
2c00: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d        /// </summ
2c10: 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ary>..        //
2c20: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 74  / <param name="t
2c30: 68 72 6f 77 45 72 72 6f 72 22 3e 0d 0a 20 20 20  hrowError">..   
2c40: 20 20 20 20 20 2f 2f 2f 20 4e 6f 6e 2d 7a 65 72       /// Non-zer
2c50: 6f 20 74 6f 20 74 68 72 6f 77 20 61 6e 20 65 78  o to throw an ex
2c60: 63 65 70 74 69 6f 6e 20 69 66 20 61 20 73 74 61  ception if a sta
2c70: 74 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79  te inconsistency
2c80: 20 69 73 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20   is found...    
2c90: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
2ca0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 72  ..        /// <r
2cb0: 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20  eturns>..       
2cc0: 20 2f 2f 2f 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66   /// Non-zero if
2cd0: 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
2ce0: 6e 20 69 73 20 76 61 6c 69 64 3b 20 6f 74 68 65  n is valid; othe
2cf0: 72 77 69 73 65 2c 20 66 61 6c 73 65 2e 0d 0a 20  rwise, false... 
2d00: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74         /// </ret
2d10: 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20 69  urns>..        i
2d20: 6e 74 65 72 6e 61 6c 20 62 6f 6f 6c 20 49 73 56  nternal bool IsV
2d30: 61 6c 69 64 28 62 6f 6f 6c 20 74 68 72 6f 77 45  alid(bool throwE
2d40: 72 72 6f 72 29 0d 0a 20 20 20 20 20 20 20 20 7b  rror)..        {
2d50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
2d60: 20 28 5f 63 6e 6e 20 3d 3d 20 6e 75 6c 6c 29 0d   (_cnn == null).
2d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 69 66 20 28 74 68 72 6f 77 45 72 72 6f 72 20 3d  if (throwError =
2da0: 3d 20 74 72 75 65 29 20 74 68 72 6f 77 20 6e 65  = true) throw ne
2db0: 77 20 41 72 67 75 6d 65 6e 74 4e 75 6c 6c 45 78  w ArgumentNullEx
2dc0: 63 65 70 74 69 6f 6e 28 22 4e 6f 20 63 6f 6e 6e  ception("No conn
2dd0: 65 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65  ection associate
2de0: 64 20 77 69 74 68 20 74 68 69 73 20 74 72 61 6e  d with this tran
2df0: 73 61 63 74 69 6f 6e 22 29 3b 0d 0a 20 20 20 20  saction");..    
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
2e10: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a   return false;..
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
2e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
2e40: 28 5f 63 6e 6e 2e 5f 76 65 72 73 69 6f 6e 20 21  (_cnn._version !
2e50: 3d 20 5f 76 65 72 73 69 6f 6e 29 0d 0a 20 20 20  = _version)..   
2e60: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
2e80: 74 68 72 6f 77 45 72 72 6f 72 20 3d 3d 20 74 72  throwError == tr
2e90: 75 65 29 20 74 68 72 6f 77 20 6e 65 77 20 53 51  ue) throw new SQ
2ea0: 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 22 54  LiteException("T
2eb0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61  he connection wa
2ec0: 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 72 65 2d  s closed and re-
2ed0: 6f 70 65 6e 65 64 2c 20 63 68 61 6e 67 65 73 20  opened, changes 
2ee0: 77 65 72 65 20 61 6c 72 65 61 64 79 20 72 6f 6c  were already rol
2ef0: 6c 65 64 20 62 61 63 6b 22 29 3b 0d 0a 20 20 20  led back");..   
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73               els
2f10: 65 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d  e return false;.
2f20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
2f40: 5f 63 6e 6e 2e 53 74 61 74 65 20 21 3d 20 43 6f  _cnn.State != Co
2f50: 6e 6e 65 63 74 69 6f 6e 53 74 61 74 65 2e 4f 70  nnectionState.Op
2f60: 65 6e 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  en)..           
2f70: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2f80: 20 20 20 20 69 66 20 28 74 68 72 6f 77 45 72 72      if (throwErr
2f90: 6f 72 20 3d 3d 20 74 72 75 65 29 20 74 68 72 6f  or == true) thro
2fa0: 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65  w new SQLiteExce
2fb0: 70 74 69 6f 6e 28 22 43 6f 6e 6e 65 63 74 69 6f  ption("Connectio
2fc0: 6e 20 77 61 73 20 63 6c 6f 73 65 64 22 29 3b 0d  n was closed");.
2fd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2fe0: 20 65 6c 73 65 20 72 65 74 75 72 6e 20 66 61 6c   else return fal
2ff0: 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
3000: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
3010: 20 20 69 66 20 28 5f 63 6e 6e 2e 5f 74 72 61 6e    if (_cnn._tran
3020: 73 61 63 74 69 6f 6e 4c 65 76 65 6c 20 3d 3d 20  sactionLevel == 
3030: 30 20 7c 7c 20 5f 63 6e 6e 2e 5f 73 71 6c 2e 41  0 || _cnn._sql.A
3040: 75 74 6f 43 6f 6d 6d 69 74 20 3d 3d 20 74 72 75  utoCommit == tru
3050: 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e)..            
3060: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
3070: 20 20 20 5f 63 6e 6e 2e 5f 74 72 61 6e 73 61 63     _cnn._transac
3080: 74 69 6f 6e 4c 65 76 65 6c 20 3d 20 30 3b 20 2f  tionLevel = 0; /
3090: 2f 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  / Make sure the 
30a0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 65 76 65  transaction leve
30b0: 6c 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72  l is reset befor
30c0: 65 20 72 65 74 75 72 6e 69 6e 67 0d 0a 20 20 20  e returning..   
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
30e0: 28 74 68 72 6f 77 45 72 72 6f 72 20 3d 3d 20 74  (throwError == t
30f0: 72 75 65 29 20 74 68 72 6f 77 20 6e 65 77 20 53  rue) throw new S
3100: 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 22  QLiteException("
3110: 4e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  No transaction i
3120: 73 20 61 63 74 69 76 65 20 6f 6e 20 74 68 69 73  s active on this
3130: 20 63 6f 6e 6e 65 63 74 69 6f 6e 22 29 3b 0d 0a   connection");..
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3150: 65 6c 73 65 20 72 65 74 75 72 6e 20 66 61 6c 73  else return fals
3160: 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
3170: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
3180: 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a 20   return true;.. 
3190: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d         }..    }.
31a0: 0a 7d 0d 0a                                      .}..