System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 0a390ea7ef6a93af76c454912438cf9b015ed67c:


0000: ef bb bf 2f 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 2a 2a 2a 0a 20 2a 20  ************. * 
0040: 41 44 4f 2e 4e 45 54 20 32 2e 30 20 44 61 74 61  ADO.NET 2.0 Data
0050: 20 50 72 6f 76 69 64 65 72 20 66 6f 72 20 53 51   Provider for SQ
0060: 4c 69 74 65 20 56 65 72 73 69 6f 6e 20 33 2e 58  Lite Version 3.X
0070: 0a 20 2a 20 57 72 69 74 74 65 6e 20 62 79 20 52  . * Written by R
0080: 6f 62 65 72 74 20 53 69 6d 70 73 6f 6e 20 28 72  obert Simpson (r
0090: 6f 62 65 72 74 40 62 6c 61 63 6b 63 61 73 74 6c  obert@blackcastl
00a0: 65 73 6f 66 74 2e 63 6f 6d 29 0a 20 2a 20 0a 20  esoft.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 0a 20 2a 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: 2f 0a 0a 6e 61 6d 65 73 70 61 63 65 20 53 79 73  /..namespace Sys
0130: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0a  tem.Data.SQLite.
0140: 7b 0a 20 20 75 73 69 6e 67 20 53 79 73 74 65 6d  {.  using System
0150: 3b 0a 20 20 75 73 69 6e 67 20 53 79 73 74 65 6d  ;.  using System
0160: 2e 52 75 6e 74 69 6d 65 2e 49 6e 74 65 72 6f 70  .Runtime.Interop
0170: 53 65 72 76 69 63 65 73 3b 0a 0a 20 20 2f 2f 2f  Services;..  ///
0180: 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 2f 2f 2f   <summary>.  ///
0190: 20 41 6c 74 65 72 6e 61 74 65 20 53 51 4c 69 74   Alternate SQLit
01a0: 65 33 20 6f 62 6a 65 63 74 2c 20 6f 76 65 72 72  e3 object, overr
01b0: 69 64 69 6e 67 20 6d 61 6e 79 20 74 65 78 74 20  iding many text 
01c0: 62 65 68 61 76 69 6f 72 73 20 74 6f 20 73 75 70  behaviors to sup
01d0: 70 6f 72 74 20 55 54 46 2d 31 36 20 28 55 6e 69  port UTF-16 (Uni
01e0: 63 6f 64 65 29 0a 20 20 2f 2f 2f 20 3c 2f 73 75  code).  /// </su
01f0: 6d 6d 61 72 79 3e 0a 20 20 69 6e 74 65 72 6e 61  mmary>.  interna
0200: 6c 20 63 6c 61 73 73 20 53 51 4c 69 74 65 33 5f  l class SQLite3_
0210: 55 54 46 31 36 20 3a 20 53 51 4c 69 74 65 33 0a  UTF16 : SQLite3.
0220: 20 20 7b 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c    {.    internal
0230: 20 53 51 4c 69 74 65 33 5f 55 54 46 31 36 28 44   SQLite3_UTF16(D
0240: 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 20 66 6d  ateTimeFormat fm
0250: 74 29 0a 20 20 20 20 20 20 3a 20 62 61 73 65 28  t).      : base(
0260: 66 6d 74 29 0a 20 20 20 20 7b 0a 20 20 20 20 7d  fmt).    {.    }
0270: 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
0280: 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 4f 76 65 72  ry>.    /// Over
0290: 72 69 64 65 73 20 53 51 4c 69 74 65 43 6f 6e 76  rides SQLiteConv
02a0: 65 72 74 2e 54 6f 53 74 72 69 6e 67 28 29 20 74  ert.ToString() t
02b0: 6f 20 6d 61 72 73 68 61 6c 20 55 54 46 2d 31 36  o marshal UTF-16
02c0: 20 73 74 72 69 6e 67 73 20 69 6e 73 74 65 61 64   strings instead
02d0: 20 6f 66 20 55 54 46 2d 38 0a 20 20 20 20 2f 2f   of UTF-8.    //
02e0: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20  / </summary>.   
02f0: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
0300: 3d 22 62 22 3e 41 20 70 6f 69 6e 74 65 72 20 74  ="b">A pointer t
0310: 6f 20 61 20 55 54 46 2d 31 36 20 73 74 72 69 6e  o a UTF-16 strin
0320: 67 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f  g</param>.    //
0330: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 6e  / <param name="n
0340: 62 79 74 65 6c 65 6e 22 3e 54 68 65 20 6c 65 6e  bytelen">The len
0350: 67 74 68 20 28 49 4e 20 42 59 54 45 53 29 20 6f  gth (IN BYTES) o
0360: 66 20 74 68 65 20 73 74 72 69 6e 67 3c 2f 70 61  f the string</pa
0370: 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 72 65  ram>.    /// <re
0380: 74 75 72 6e 73 3e 41 20 2e 4e 45 54 20 73 74 72  turns>A .NET str
0390: 69 6e 67 3c 2f 72 65 74 75 72 6e 73 3e 0a 20 20  ing</returns>.  
03a0: 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64    public overrid
03b0: 65 20 73 74 72 69 6e 67 20 54 6f 53 74 72 69 6e  e string ToStrin
03c0: 67 28 49 6e 74 50 74 72 20 62 2c 20 69 6e 74 20  g(IntPtr b, int 
03d0: 6e 62 79 74 65 6c 65 6e 29 0a 20 20 20 20 7b 0a  nbytelen).    {.
03e0: 20 20 20 20 20 20 69 66 20 28 6e 62 79 74 65 6c        if (nbytel
03f0: 65 6e 20 3d 3d 20 30 29 20 72 65 74 75 72 6e 20  en == 0) return 
0400: 22 22 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  "";.      return
0410: 20 4d 61 72 73 68 61 6c 2e 50 74 72 54 6f 53 74   Marshal.PtrToSt
0420: 72 69 6e 67 55 6e 69 28 62 2c 20 6e 62 79 74 65  ringUni(b, nbyte
0430: 6c 65 6e 20 2f 20 32 29 3b 0a 20 20 20 20 7d 0a  len / 2);.    }.
0440: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
0450: 79 3e 0a 20 20 20 20 2f 2f 2f 20 41 6e 6f 74 68  y>.    /// Anoth
0460: 65 72 20 63 75 73 74 6f 6d 20 73 74 72 69 6e 67  er custom string
0470: 20 6d 61 72 73 68 61 6c 69 6e 67 20 66 75 6e 63   marshaling func
0480: 74 69 6f 6e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  tion.    /// </s
0490: 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20  ummary>.    /// 
04a0: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 62 22 3e  <param name="b">
04b0: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 7a  A pointer to a z
04c0: 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 55  ero-terminated U
04d0: 54 46 2d 31 36 20 73 74 72 69 6e 67 3c 2f 70 61  TF-16 string</pa
04e0: 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 72 65  ram>.    /// <re
04f0: 74 75 72 6e 73 3e 41 20 2e 4e 45 54 20 73 74 72  turns>A .NET str
0500: 69 6e 67 3c 2f 72 65 74 75 72 6e 73 3e 0a 20 20  ing</returns>.  
0510: 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 69    internal stati
0520: 63 20 73 74 72 69 6e 67 20 54 6f 53 74 72 69 6e  c string ToStrin
0530: 67 28 49 6e 74 50 74 72 20 62 29 0a 20 20 20 20  g(IntPtr b).    
0540: 7b 0a 20 20 20 20 20 20 69 66 20 28 62 20 3d 3d  {.      if (b ==
0550: 20 49 6e 74 50 74 72 2e 5a 65 72 6f 29 20 72 65   IntPtr.Zero) re
0560: 74 75 72 6e 20 22 22 3b 0a 20 20 20 20 20 20 72  turn "";.      r
0570: 65 74 75 72 6e 20 4d 61 72 73 68 61 6c 2e 50 74  eturn Marshal.Pt
0580: 72 54 6f 53 74 72 69 6e 67 55 6e 69 28 62 29 3b  rToStringUni(b);
0590: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
05a0: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f  rnal override vo
05b0: 69 64 20 4f 70 65 6e 28 73 74 72 69 6e 67 20 73  id Open(string s
05c0: 74 72 46 69 6c 65 6e 61 6d 65 29 0a 20 20 20 20  trFilename).    
05d0: 7b 0a 20 20 20 20 20 20 69 66 20 28 5f 73 71 6c  {.      if (_sql
05e0: 20 21 3d 20 30 29 20 72 65 74 75 72 6e 3b 0a 20   != 0) return;. 
05f0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73       int n = Uns
0600: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
0610: 2e 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 5f  .sqlite3_open16_
0620: 69 6e 74 65 72 6f 70 28 73 74 72 46 69 6c 65 6e  interop(strFilen
0630: 61 6d 65 2c 20 6f 75 74 20 5f 73 71 6c 29 3b 0a  ame, out _sql);.
0640: 20 20 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29        if (n > 0)
0650: 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74   throw new SQLit
0660: 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51  eException(n, SQ
0670: 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29 29  LiteLastError())
0680: 3b 0a 0a 20 20 20 20 20 20 5f 66 75 6e 63 74 69  ;..      _functi
0690: 6f 6e 73 41 72 72 61 79 20 3d 20 53 51 4c 69 74  onsArray = SQLit
06a0: 65 46 75 6e 63 74 69 6f 6e 2e 42 69 6e 64 46 75  eFunction.BindFu
06b0: 6e 63 74 69 6f 6e 73 28 74 68 69 73 29 3b 0a 20  nctions(this);. 
06c0: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
06d0: 61 6c 20 6f 76 65 72 72 69 64 65 20 73 74 72 69  al override stri
06e0: 6e 67 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72  ng SQLiteLastErr
06f0: 6f 72 28 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  or().    {.     
0700: 20 72 65 74 75 72 6e 20 54 6f 53 74 72 69 6e 67   return ToString
0710: 28 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  (UnsafeNativeMet
0720: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 65 72 72  hods.sqlite3_err
0730: 6d 73 67 31 36 5f 69 6e 74 65 72 6f 70 28 5f 73  msg16_interop(_s
0740: 71 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ql));.    }..   
0750: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
0760: 64 65 20 53 51 4c 69 74 65 53 74 61 74 65 6d 65  de SQLiteStateme
0770: 6e 74 20 50 72 65 70 61 72 65 28 73 74 72 69 6e  nt Prepare(strin
0780: 67 20 73 74 72 53 71 6c 2c 20 72 65 66 20 69 6e  g strSql, ref in
0790: 74 20 6e 50 61 72 61 6d 53 74 61 72 74 2c 20 6f  t nParamStart, o
07a0: 75 74 20 73 74 72 69 6e 67 20 73 74 72 52 65 6d  ut string strRem
07b0: 61 69 6e 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  ain).    {.     
07c0: 20 69 6e 74 20 73 74 6d 74 3b 0a 20 20 20 20 20   int stmt;.     
07d0: 20 49 6e 74 50 74 72 20 70 74 72 3b 0a 0a 20 20   IntPtr ptr;..  
07e0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61      int n = Unsa
07f0: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
0800: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31  sqlite3_prepare1
0810: 36 5f 69 6e 74 65 72 6f 70 28 5f 73 71 6c 2c 20  6_interop(_sql, 
0820: 73 74 72 53 71 6c 2c 20 73 74 72 53 71 6c 2e 4c  strSql, strSql.L
0830: 65 6e 67 74 68 2c 20 6f 75 74 20 73 74 6d 74 2c  ength, out stmt,
0840: 20 6f 75 74 20 70 74 72 29 3b 0a 20 20 20 20 20   out ptr);.     
0850: 20 69 66 20 28 6e 20 3e 20 30 29 20 74 68 72 6f   if (n > 0) thro
0860: 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65  w new SQLiteExce
0870: 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c  ption(n, SQLiteL
0880: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 0a 20 20  astError());..  
0890: 20 20 20 20 73 74 72 52 65 6d 61 69 6e 20 3d 20      strRemain = 
08a0: 54 6f 53 74 72 69 6e 67 28 70 74 72 29 3b 0a 0a  ToString(ptr);..
08b0: 20 20 20 20 20 20 53 51 4c 69 74 65 53 74 61 74        SQLiteStat
08c0: 65 6d 65 6e 74 20 63 6d 64 20 3d 20 6e 65 77 20  ement cmd = new 
08d0: 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 28  SQLiteStatement(
08e0: 74 68 69 73 2c 20 73 74 6d 74 2c 20 73 74 72 53  this, stmt, strS
08f0: 71 6c 2e 53 75 62 73 74 72 69 6e 67 28 30 2c 20  ql.Substring(0, 
0900: 73 74 72 53 71 6c 2e 4c 65 6e 67 74 68 20 2d 20  strSql.Length - 
0910: 73 74 72 52 65 6d 61 69 6e 2e 4c 65 6e 67 74 68  strRemain.Length
0920: 29 2c 20 72 65 66 20 6e 50 61 72 61 6d 53 74 61  ), ref nParamSta
0930: 72 74 29 3b 0a 0a 20 20 20 20 20 20 72 65 74 75  rt);..      retu
0940: 72 6e 20 63 6d 64 3b 0a 20 20 20 20 7d 0a 0a 20  rn cmd;.    }.. 
0950: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
0960: 72 69 64 65 20 76 6f 69 64 20 42 69 6e 64 5f 44  ride void Bind_D
0970: 61 74 65 54 69 6d 65 28 53 51 4c 69 74 65 53 74  ateTime(SQLiteSt
0980: 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e  atement stmt, in
0990: 74 20 69 6e 64 65 78 2c 20 44 61 74 65 54 69 6d  t index, DateTim
09a0: 65 20 64 74 29 0a 20 20 20 20 7b 0a 20 20 20 20  e dt).    {.    
09b0: 20 20 42 69 6e 64 5f 54 65 78 74 28 73 74 6d 74    Bind_Text(stmt
09c0: 2c 20 69 6e 64 65 78 2c 20 54 6f 53 74 72 69 6e  , index, ToStrin
09d0: 67 28 64 74 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  g(dt));.    }.. 
09e0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
09f0: 72 69 64 65 20 76 6f 69 64 20 42 69 6e 64 5f 54  ride void Bind_T
0a00: 65 78 74 28 53 51 4c 69 74 65 53 74 61 74 65 6d  ext(SQLiteStatem
0a10: 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e  ent stmt, int in
0a20: 64 65 78 2c 20 73 74 72 69 6e 67 20 76 61 6c 75  dex, string valu
0a30: 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  e).    {.      i
0a40: 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74  nt n = UnsafeNat
0a50: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
0a60: 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 5f 69  e3_bind_text16_i
0a70: 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c  nterop(stmt._sql
0a80: 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c  ite_stmt, index,
0a90: 20 76 61 6c 75 65 2c 20 76 61 6c 75 65 2e 4c 65   value, value.Le
0aa0: 6e 67 74 68 20 2a 20 32 2c 20 2d 31 29 3b 0a 20  ngth * 2, -1);. 
0ab0: 20 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20       if (n > 0) 
0ac0: 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65  throw new SQLite
0ad0: 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c  Exception(n, SQL
0ae0: 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b  iteLastError());
0af0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
0b00: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 73 74  rnal override st
0b10: 72 69 6e 67 20 43 6f 6c 75 6d 6e 4e 61 6d 65 28  ring ColumnName(
0b20: 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20  SQLiteStatement 
0b30: 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 29  stmt, int index)
0b40: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 65 74  .    {.      ret
0b50: 75 72 6e 20 54 6f 53 74 72 69 6e 67 28 55 6e 73  urn ToString(Uns
0b60: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
0b70: 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  .sqlite3_column_
0b80: 6e 61 6d 65 31 36 5f 69 6e 74 65 72 6f 70 28 73  name16_interop(s
0b90: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
0ba0: 2c 20 69 6e 64 65 78 29 29 3b 0a 20 20 20 20 7d  , index));.    }
0bb0: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
0bc0: 76 65 72 72 69 64 65 20 44 61 74 65 54 69 6d 65  verride DateTime
0bd0: 20 47 65 74 44 61 74 65 54 69 6d 65 28 53 51 4c   GetDateTime(SQL
0be0: 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d  iteStatement stm
0bf0: 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a 20 20  t, int index).  
0c00: 20 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e    {.      return
0c10: 20 54 6f 44 61 74 65 54 69 6d 65 28 47 65 74 54   ToDateTime(GetT
0c20: 65 78 74 28 73 74 6d 74 2c 20 69 6e 64 65 78 29  ext(stmt, index)
0c30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 74  );.    }.    int
0c40: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 73  ernal override s
0c50: 74 72 69 6e 67 20 47 65 74 54 65 78 74 28 53 51  tring GetText(SQ
0c60: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74  LiteStatement st
0c70: 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a 20  mt, int index). 
0c80: 20 20 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72     {.      retur
0c90: 6e 20 54 6f 53 74 72 69 6e 67 28 55 6e 73 61 66  n ToString(Unsaf
0ca0: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
0cb0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
0cc0: 78 74 31 36 5f 69 6e 74 65 72 6f 70 28 73 74 6d  xt16_interop(stm
0cd0: 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20  t._sqlite_stmt, 
0ce0: 69 6e 64 65 78 29 29 3b 0a 20 20 20 20 7d 0a 0a  index));.    }..
0cf0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
0d00: 72 72 69 64 65 20 73 74 72 69 6e 67 20 43 6f 6c  rride string Col
0d10: 75 6d 6e 54 79 70 65 28 53 51 4c 69 74 65 53 74  umnType(SQLiteSt
0d20: 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e  atement stmt, in
0d30: 74 20 69 6e 64 65 78 2c 20 6f 75 74 20 54 79 70  t index, out Typ
0d40: 65 41 66 66 69 6e 69 74 79 20 6e 41 66 66 69 6e  eAffinity nAffin
0d50: 69 74 79 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  ity).    {.     
0d60: 20 6e 41 66 66 69 6e 69 74 79 20 3d 20 54 79 70   nAffinity = Typ
0d70: 65 41 66 66 69 6e 69 74 79 2e 4e 6f 6e 65 3b 0a  eAffinity.None;.
0d80: 0a 20 20 20 20 20 20 49 6e 74 50 74 72 20 70 20  .      IntPtr p 
0d90: 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  = UnsafeNativeMe
0da0: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f  thods.sqlite3_co
0db0: 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 5f  lumn_decltype16_
0dc0: 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71  interop(stmt._sq
0dd0: 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78  lite_stmt, index
0de0: 29 3b 0a 20 20 20 20 20 20 69 66 20 28 70 20 21  );.      if (p !
0df0: 3d 20 49 6e 74 50 74 72 2e 5a 65 72 6f 29 20 72  = IntPtr.Zero) r
0e00: 65 74 75 72 6e 20 54 6f 53 74 72 69 6e 67 28 70  eturn ToString(p
0e10: 29 3b 0a 20 20 20 20 20 20 65 6c 73 65 0a 20 20  );.      else.  
0e20: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 6e 41      {.        nA
0e30: 66 66 69 6e 69 74 79 20 3d 20 55 6e 73 61 66 65  ffinity = Unsafe
0e40: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
0e50: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
0e60: 65 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f  e_interop(stmt._
0e70: 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64  sqlite_stmt, ind
0e80: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 73 77 69  ex);.        swi
0e90: 74 63 68 20 28 6e 41 66 66 69 6e 69 74 79 29 0a  tch (nAffinity).
0ea0: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
0eb0: 20 20 20 20 63 61 73 65 20 54 79 70 65 41 66 66      case TypeAff
0ec0: 69 6e 69 74 79 2e 49 6e 74 36 34 3a 0a 20 20 20  inity.Int64:.   
0ed0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
0ee0: 22 42 49 47 49 4e 54 22 3b 0a 20 20 20 20 20 20  "BIGINT";.      
0ef0: 20 20 20 20 63 61 73 65 20 54 79 70 65 41 66 66      case TypeAff
0f00: 69 6e 69 74 79 2e 44 6f 75 62 6c 65 3a 0a 20 20  inity.Double:.  
0f10: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
0f20: 20 22 44 4f 55 42 4c 45 22 3b 0a 20 20 20 20 20   "DOUBLE";.     
0f30: 20 20 20 20 20 63 61 73 65 20 54 79 70 65 41 66       case TypeAf
0f40: 66 69 6e 69 74 79 2e 42 6c 6f 62 3a 0a 20 20 20  finity.Blob:.   
0f50: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
0f60: 22 42 4c 4f 42 22 3b 0a 20 20 20 20 20 20 20 20  "BLOB";.        
0f70: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
0f80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 54         return "T
0f90: 45 58 54 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EXT";.        }.
0fa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
0fb0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
0fc0: 72 69 64 65 20 69 6e 74 20 43 72 65 61 74 65 46  ride int CreateF
0fd0: 75 6e 63 74 69 6f 6e 28 73 74 72 69 6e 67 20 73  unction(string s
0fe0: 74 72 46 75 6e 63 74 69 6f 6e 2c 20 69 6e 74 20  trFunction, int 
0ff0: 6e 41 72 67 73 2c 20 53 51 4c 69 74 65 43 61 6c  nArgs, SQLiteCal
1000: 6c 62 61 63 6b 20 66 75 6e 63 2c 20 53 51 4c 69  lback func, SQLi
1010: 74 65 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 73  teCallback funcs
1020: 74 65 70 2c 20 53 51 4c 69 74 65 43 61 6c 6c 62  tep, SQLiteCallb
1030: 61 63 6b 20 66 75 6e 63 66 69 6e 61 6c 29 0a 20  ack funcfinal). 
1040: 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e     {.      int n
1050: 43 6f 6f 6b 69 65 3b 0a 0a 20 20 20 20 20 20 69  Cookie;..      i
1060: 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74  nt n = UnsafeNat
1070: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
1080: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1090: 6f 6e 31 36 5f 69 6e 74 65 72 6f 70 28 5f 73 71  on16_interop(_sq
10a0: 6c 2c 20 73 74 72 46 75 6e 63 74 69 6f 6e 2c 20  l, strFunction, 
10b0: 6e 41 72 67 73 2c 20 34 2c 20 66 75 6e 63 2c 20  nArgs, 4, func, 
10c0: 66 75 6e 63 73 74 65 70 2c 20 66 75 6e 63 66 69  funcstep, funcfi
10d0: 6e 61 6c 2c 20 6f 75 74 20 6e 43 6f 6f 6b 69 65  nal, out nCookie
10e0: 29 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 20 3e  );.      if (n >
10f0: 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20 53 51   0) throw new SQ
1100: 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c  LiteException(n,
1110: 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72   SQLiteLastError
1120: 28 29 29 3b 0a 0a 20 20 20 20 20 20 72 65 74 75  ());..      retu
1130: 72 6e 20 6e 43 6f 6f 6b 69 65 3b 0a 20 20 20 20  rn nCookie;.    
1140: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
1150: 6f 76 65 72 72 69 64 65 20 69 6e 74 20 43 72 65  override int Cre
1160: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 73 74 72  ateCollation(str
1170: 69 6e 67 20 73 74 72 43 6f 6c 6c 61 74 69 6f 6e  ing strCollation
1180: 2c 20 53 51 4c 69 74 65 43 6f 6c 6c 61 74 69 6f  , SQLiteCollatio
1190: 6e 20 66 75 6e 63 29 0a 20 20 20 20 7b 0a 20 20  n func).    {.  
11a0: 20 20 20 20 69 6e 74 20 6e 43 6f 6f 6b 69 65 3b      int nCookie;
11b0: 0a 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ..      int n = 
11c0: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
11d0: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 72 65 61  ods.sqlite3_crea
11e0: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 5f 69  te_collation16_i
11f0: 6e 74 65 72 6f 70 28 5f 73 71 6c 2c 20 73 74 72  nterop(_sql, str
1200: 43 6f 6c 6c 61 74 69 6f 6e 2c 20 34 2c 20 30 2c  Collation, 4, 0,
1210: 20 66 75 6e 63 2c 20 6f 75 74 20 6e 43 6f 6f 6b   func, out nCook
1220: 69 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28 6e  ie);.      if (n
1230: 20 3e 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20   > 0) throw new 
1240: 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28  SQLiteException(
1250: 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72  n, SQLiteLastErr
1260: 6f 72 28 29 29 3b 0a 0a 20 20 20 20 20 20 72 65  or());..      re
1270: 74 75 72 6e 20 6e 43 6f 6f 6b 69 65 3b 0a 20 20  turn nCookie;.  
1280: 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61    }..    interna
1290: 6c 20 6f 76 65 72 72 69 64 65 20 73 74 72 69 6e  l override strin
12a0: 67 20 47 65 74 50 61 72 61 6d 56 61 6c 75 65 54  g GetParamValueT
12b0: 65 78 74 28 69 6e 74 20 70 74 72 29 0a 20 20 20  ext(int ptr).   
12c0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
12d0: 54 6f 53 74 72 69 6e 67 28 55 6e 73 61 66 65 4e  ToString(UnsafeN
12e0: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
12f0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
1300: 36 5f 69 6e 74 65 72 6f 70 28 70 74 72 29 29 3b  6_interop(ptr));
1310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
1320: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f  rnal override vo
1330: 69 64 20 52 65 74 75 72 6e 45 72 72 6f 72 28 69  id ReturnError(i
1340: 6e 74 20 63 6f 6e 74 65 78 74 2c 20 73 74 72 69  nt context, stri
1350: 6e 67 20 76 61 6c 75 65 29 0a 20 20 20 20 7b 0a  ng value).    {.
1360: 20 20 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69        UnsafeNati
1370: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
1380: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 31 36  3_result_error16
1390: 5f 69 6e 74 65 72 6f 70 28 63 6f 6e 74 65 78 74  _interop(context
13a0: 2c 20 76 61 6c 75 65 2c 20 76 61 6c 75 65 2e 4c  , value, value.L
13b0: 65 6e 67 74 68 29 3b 0a 20 20 20 20 7d 0a 0a 20  ength);.    }.. 
13c0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
13d0: 72 69 64 65 20 76 6f 69 64 20 52 65 74 75 72 6e  ride void Return
13e0: 54 65 78 74 28 69 6e 74 20 63 6f 6e 74 65 78 74  Text(int context
13f0: 2c 20 73 74 72 69 6e 67 20 76 61 6c 75 65 29 0a  , string value).
1400: 20 20 20 20 7b 0a 20 20 20 20 20 20 55 6e 73 61      {.      Unsa
1410: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
1420: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
1430: 65 78 74 31 36 5f 69 6e 74 65 72 6f 70 28 63 6f  ext16_interop(co
1440: 6e 74 65 78 74 2c 20 76 61 6c 75 65 2c 20 76 61  ntext, value, va
1450: 6c 75 65 2e 4c 65 6e 67 74 68 2c 20 2d 31 29 3b  lue.Length, -1);
1460: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a           .    }.  }.}.