System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact f4605fd348e64763c5601c0db24519eb0709c935:


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 20 0d 0a  soft.com).. * ..
00b0: 20 2a 20 52 65 6c 65 61 73 65 64 20 74 6f 20 74   * Released to t
00c0: 68 65 20 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e  he public domain
00d0: 2c 20 75 73 65 20 61 74 20 79 6f 75 72 20 6f 77  , use at your ow
00e0: 6e 20 72 69 73 6b 21 0d 0a 20 2a 2a 2a 2a 2a 2a  n 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 2a 2f 0d 0a 0d 0a 75 73 69 6e 67 20 53 79 73  **/....using Sys
0130: 74 65 6d 2e 43 6f 6c 6c 65 63 74 69 6f 6e 73 2e  tem.Collections.
0140: 47 65 6e 65 72 69 63 3b 0d 0a 75 73 69 6e 67 20  Generic;..using 
0150: 53 79 73 74 65 6d 2e 54 65 78 74 3b 0d 0a 75 73  System.Text;..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 4f 62 6a 65 63 74 4d 6f 64  ctions.ObjectMod
0180: 65 6c 3b 0d 0a 75 73 69 6e 67 20 53 79 73 74 65  el;..using Syste
0190: 6d 2e 43 6f 6c 6c 65 63 74 69 6f 6e 73 3b 0d 0a  m.Collections;..
01a0: 0d 0a 23 69 66 20 4e 45 54 5f 34 30 20 7c 7c 20  ..#if NET_40 || 
01b0: 4e 45 54 5f 34 35 0d 0a 75 73 69 6e 67 20 53 79  NET_45..using Sy
01c0: 73 74 65 6d 2e 52 75 6e 74 69 6d 65 3b 0d 0a 23  stem.Runtime;..#
01d0: 65 6e 64 69 66 0d 0a 0d 0a 6e 61 6d 65 73 70 61  endif....namespa
01e0: 63 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ce System.Data.S
01f0: 51 4c 69 74 65 0d 0a 7b 0d 0a 09 69 6e 74 65 72  QLite..{...inter
0200: 6e 61 6c 20 73 65 61 6c 65 64 20 63 6c 61 73 73  nal sealed class
0210: 20 4b 65 79 54 6f 4c 69 73 74 4d 61 70 3c 54 4b   KeyToListMap<TK
0220: 65 79 2c 20 54 56 61 6c 75 65 3e 20 3a 20 49 6e  ey, TValue> : In
0230: 74 65 72 6e 61 6c 42 61 73 65 0d 0a 09 7b 0d 0a  ternalBase...{..
0240: 09 09 2f 2f 20 46 69 65 6c 64 73 0d 0a 09 09 70  ..// Fields....p
0250: 72 69 76 61 74 65 20 44 69 63 74 69 6f 6e 61 72  rivate Dictionar
0260: 79 3c 54 4b 65 79 2c 20 4c 69 73 74 3c 54 56 61  y<TKey, List<TVa
0270: 6c 75 65 3e 3e 20 6d 5f 6d 61 70 3b 0d 0a 0d 0a  lue>> m_map;....
0280: 09 09 2f 2f 20 4d 65 74 68 6f 64 73 0d 0a 09 09  ..// Methods....
0290: 69 6e 74 65 72 6e 61 6c 20 4b 65 79 54 6f 4c 69  internal KeyToLi
02a0: 73 74 4d 61 70 28 49 45 71 75 61 6c 69 74 79 43  stMap(IEqualityC
02b0: 6f 6d 70 61 72 65 72 3c 54 4b 65 79 3e 20 63 6f  omparer<TKey> co
02c0: 6d 70 61 72 65 72 29 0d 0a 09 09 7b 0d 0a 09 09  mparer)....{....
02d0: 09 74 68 69 73 2e 6d 5f 6d 61 70 20 3d 20 6e 65  .this.m_map = ne
02e0: 77 20 44 69 63 74 69 6f 6e 61 72 79 3c 54 4b 65  w Dictionary<TKe
02f0: 79 2c 20 4c 69 73 74 3c 54 56 61 6c 75 65 3e 3e  y, List<TValue>>
0300: 28 63 6f 6d 70 61 72 65 72 29 3b 0d 0a 09 09 7d  (comparer);....}
0310: 0d 0a 0d 0a 09 09 69 6e 74 65 72 6e 61 6c 20 76  ......internal v
0320: 6f 69 64 20 41 64 64 28 54 4b 65 79 20 6b 65 79  oid Add(TKey key
0330: 2c 20 54 56 61 6c 75 65 20 76 61 6c 75 65 29 0d  , TValue value).
0340: 0a 09 09 7b 0d 0a 09 09 09 4c 69 73 74 3c 54 56  ...{.....List<TV
0350: 61 6c 75 65 3e 20 6c 69 73 74 3b 0d 0a 09 09 09  alue> list;.....
0360: 69 66 20 28 21 74 68 69 73 2e 6d 5f 6d 61 70 2e  if (!this.m_map.
0370: 54 72 79 47 65 74 56 61 6c 75 65 28 6b 65 79 2c  TryGetValue(key,
0380: 20 6f 75 74 20 6c 69 73 74 29 29 0d 0a 09 09 09   out list)).....
0390: 7b 0d 0a 09 09 09 09 6c 69 73 74 20 3d 20 6e 65  {......list = ne
03a0: 77 20 4c 69 73 74 3c 54 56 61 6c 75 65 3e 28 29  w List<TValue>()
03b0: 3b 0d 0a 09 09 09 09 74 68 69 73 2e 6d 5f 6d 61  ;......this.m_ma
03c0: 70 5b 6b 65 79 5d 20 3d 20 6c 69 73 74 3b 0d 0a  p[key] = list;..
03d0: 09 09 09 7d 0d 0a 09 09 09 6c 69 73 74 2e 41 64  ...}.....list.Ad
03e0: 64 28 76 61 6c 75 65 29 3b 0d 0a 09 09 7d 0d 0a  d(value);....}..
03f0: 0d 0a 09 09 69 6e 74 65 72 6e 61 6c 20 76 6f 69  ....internal voi
0400: 64 20 41 64 64 52 61 6e 67 65 28 54 4b 65 79 20  d AddRange(TKey 
0410: 6b 65 79 2c 20 49 45 6e 75 6d 65 72 61 62 6c 65  key, IEnumerable
0420: 3c 54 56 61 6c 75 65 3e 20 76 61 6c 75 65 73 29  <TValue> values)
0430: 0d 0a 09 09 7b 0d 0a 09 09 09 66 6f 72 65 61 63  ....{.....foreac
0440: 68 20 28 54 56 61 6c 75 65 20 6c 6f 63 61 6c 20  h (TValue local 
0450: 69 6e 20 76 61 6c 75 65 73 29 0d 0a 09 09 09 7b  in values).....{
0460: 0d 0a 09 09 09 09 74 68 69 73 2e 41 64 64 28 6b  ......this.Add(k
0470: 65 79 2c 20 6c 6f 63 61 6c 29 3b 0d 0a 09 09 09  ey, local);.....
0480: 7d 0d 0a 09 09 7d 0d 0a 0d 0a 09 09 69 6e 74 65  }....}......inte
0490: 72 6e 61 6c 20 62 6f 6f 6c 20 43 6f 6e 74 61 69  rnal bool Contai
04a0: 6e 73 4b 65 79 28 54 4b 65 79 20 6b 65 79 29 0d  nsKey(TKey key).
04b0: 0a 09 09 7b 0d 0a 09 09 09 72 65 74 75 72 6e 20  ...{.....return 
04c0: 74 68 69 73 2e 6d 5f 6d 61 70 2e 43 6f 6e 74 61  this.m_map.Conta
04d0: 69 6e 73 4b 65 79 28 6b 65 79 29 3b 0d 0a 09 09  insKey(key);....
04e0: 7d 0d 0a 0d 0a 09 09 69 6e 74 65 72 6e 61 6c 20  }......internal 
04f0: 49 45 6e 75 6d 65 72 61 62 6c 65 3c 54 56 61 6c  IEnumerable<TVal
0500: 75 65 3e 20 45 6e 75 6d 65 72 61 74 65 56 61 6c  ue> EnumerateVal
0510: 75 65 73 28 54 4b 65 79 20 6b 65 79 29 0d 0a 09  ues(TKey key)...
0520: 09 7b 0d 0a 09 09 09 4c 69 73 74 3c 54 56 61 6c  .{.....List<TVal
0530: 75 65 3e 20 76 61 6c 75 65 73 3b 0d 0a 09 09 09  ue> values;.....
0540: 69 66 20 28 6d 5f 6d 61 70 2e 54 72 79 47 65 74  if (m_map.TryGet
0550: 56 61 6c 75 65 28 6b 65 79 2c 20 6f 75 74 20 76  Value(key, out v
0560: 61 6c 75 65 73 29 29 0d 0a 09 09 09 7b 0d 0a 09  alues)).....{...
0570: 09 09 09 66 6f 72 65 61 63 68 20 28 54 56 61 6c  ...foreach (TVal
0580: 75 65 20 76 61 6c 75 65 20 69 6e 20 76 61 6c 75  ue value in valu
0590: 65 73 29 20 7b 20 79 69 65 6c 64 20 72 65 74 75  es) { yield retu
05a0: 72 6e 20 76 61 6c 75 65 3b 20 7d 0d 0a 09 09 09  rn value; }.....
05b0: 7d 0d 0a 09 09 7d 0d 0a 0d 0a 09 09 69 6e 74 65  }....}......inte
05c0: 72 6e 61 6c 20 52 65 61 64 4f 6e 6c 79 43 6f 6c  rnal ReadOnlyCol
05d0: 6c 65 63 74 69 6f 6e 3c 54 56 61 6c 75 65 3e 20  lection<TValue> 
05e0: 4c 69 73 74 46 6f 72 4b 65 79 28 54 4b 65 79 20  ListForKey(TKey 
05f0: 6b 65 79 29 0d 0a 09 09 7b 0d 0a 09 09 09 72 65  key)....{.....re
0600: 74 75 72 6e 20 6e 65 77 20 52 65 61 64 4f 6e 6c  turn new ReadOnl
0610: 79 43 6f 6c 6c 65 63 74 69 6f 6e 3c 54 56 61 6c  yCollection<TVal
0620: 75 65 3e 28 74 68 69 73 2e 6d 5f 6d 61 70 5b 6b  ue>(this.m_map[k
0630: 65 79 5d 29 3b 0d 0a 09 09 7d 0d 0a 0d 0a 09 09  ey]);....}......
0640: 69 6e 74 65 72 6e 61 6c 20 62 6f 6f 6c 20 52 65  internal bool Re
0650: 6d 6f 76 65 4b 65 79 28 54 4b 65 79 20 6b 65 79  moveKey(TKey key
0660: 29 0d 0a 09 09 7b 0d 0a 09 09 09 72 65 74 75 72  )....{.....retur
0670: 6e 20 74 68 69 73 2e 6d 5f 6d 61 70 2e 52 65 6d  n this.m_map.Rem
0680: 6f 76 65 28 6b 65 79 29 3b 0d 0a 09 09 7d 0d 0a  ove(key);....}..
0690: 0d 0a 09 09 69 6e 74 65 72 6e 61 6c 20 6f 76 65  ....internal ove
06a0: 72 72 69 64 65 20 76 6f 69 64 20 54 6f 43 6f 6d  rride void ToCom
06b0: 70 61 63 74 53 74 72 69 6e 67 28 53 74 72 69 6e  pactString(Strin
06c0: 67 42 75 69 6c 64 65 72 20 62 75 69 6c 64 65 72  gBuilder builder
06d0: 29 0d 0a 09 09 7b 0d 0a 09 09 09 66 6f 72 65 61  )....{.....forea
06e0: 63 68 20 28 54 4b 65 79 20 6c 6f 63 61 6c 20 69  ch (TKey local i
06f0: 6e 20 74 68 69 73 2e 4b 65 79 73 29 0d 0a 09 09  n this.Keys)....
0700: 09 7b 0d 0a 09 09 09 09 53 74 72 69 6e 67 55 74  .{......StringUt
0710: 69 6c 2e 46 6f 72 6d 61 74 53 74 72 69 6e 67 42  il.FormatStringB
0720: 75 69 6c 64 65 72 28 62 75 69 6c 64 65 72 2c 20  uilder(builder, 
0730: 22 7b 30 7d 22 2c 20 6e 65 77 20 6f 62 6a 65 63  "{0}", new objec
0740: 74 5b 5d 20 7b 20 6c 6f 63 61 6c 20 7d 29 3b 0d  t[] { local });.
0750: 0a 09 09 09 09 62 75 69 6c 64 65 72 2e 41 70 70  .....builder.App
0760: 65 6e 64 28 22 3a 20 22 29 3b 0d 0a 09 09 09 09  end(": ");......
0770: 49 45 6e 75 6d 65 72 61 62 6c 65 3c 54 56 61 6c  IEnumerable<TVal
0780: 75 65 3e 20 6c 69 73 74 20 3d 20 74 68 69 73 2e  ue> list = this.
0790: 4c 69 73 74 46 6f 72 4b 65 79 28 6c 6f 63 61 6c  ListForKey(local
07a0: 29 3b 0d 0a 09 09 09 09 53 74 72 69 6e 67 55 74  );......StringUt
07b0: 69 6c 2e 54 6f 53 65 70 61 72 61 74 65 64 53 74  il.ToSeparatedSt
07c0: 72 69 6e 67 28 62 75 69 6c 64 65 72 2c 20 6c 69  ring(builder, li
07d0: 73 74 2c 20 22 2c 22 2c 20 22 6e 75 6c 6c 22 29  st, ",", "null")
07e0: 3b 0d 0a 09 09 09 09 62 75 69 6c 64 65 72 2e 41  ;......builder.A
07f0: 70 70 65 6e 64 28 22 3b 20 22 29 3b 0d 0a 09 09  ppend("; ");....
0800: 09 7d 0d 0a 09 09 7d 0d 0a 0d 0a 09 09 69 6e 74  .}....}......int
0810: 65 72 6e 61 6c 20 62 6f 6f 6c 20 54 72 79 47 65  ernal bool TryGe
0820: 74 4c 69 73 74 46 6f 72 4b 65 79 28 54 4b 65 79  tListForKey(TKey
0830: 20 6b 65 79 2c 20 6f 75 74 20 52 65 61 64 4f 6e   key, out ReadOn
0840: 6c 79 43 6f 6c 6c 65 63 74 69 6f 6e 3c 54 56 61  lyCollection<TVa
0850: 6c 75 65 3e 20 76 61 6c 75 65 43 6f 6c 6c 65 63  lue> valueCollec
0860: 74 69 6f 6e 29 0d 0a 09 09 7b 0d 0a 09 09 09 4c  tion)....{.....L
0870: 69 73 74 3c 54 56 61 6c 75 65 3e 20 6c 69 73 74  ist<TValue> list
0880: 3b 0d 0a 09 09 09 76 61 6c 75 65 43 6f 6c 6c 65  ;.....valueColle
0890: 63 74 69 6f 6e 20 3d 20 6e 75 6c 6c 3b 0d 0a 09  ction = null;...
08a0: 09 09 69 66 20 28 74 68 69 73 2e 6d 5f 6d 61 70  ..if (this.m_map
08b0: 2e 54 72 79 47 65 74 56 61 6c 75 65 28 6b 65 79  .TryGetValue(key
08c0: 2c 20 6f 75 74 20 6c 69 73 74 29 29 0d 0a 09 09  , out list))....
08d0: 09 7b 0d 0a 09 09 09 09 76 61 6c 75 65 43 6f 6c  .{......valueCol
08e0: 6c 65 63 74 69 6f 6e 20 3d 20 6e 65 77 20 52 65  lection = new Re
08f0: 61 64 4f 6e 6c 79 43 6f 6c 6c 65 63 74 69 6f 6e  adOnlyCollection
0900: 3c 54 56 61 6c 75 65 3e 28 6c 69 73 74 29 3b 0d  <TValue>(list);.
0910: 0a 09 09 09 09 72 65 74 75 72 6e 20 74 72 75 65  .....return true
0920: 3b 0d 0a 09 09 09 7d 0d 0a 09 09 09 72 65 74 75  ;.....}.....retu
0930: 72 6e 20 66 61 6c 73 65 3b 0d 0a 09 09 7d 0d 0a  rn false;....}..
0940: 0d 0a 09 09 2f 2f 20 50 72 6f 70 65 72 74 69 65  ....// Propertie
0950: 73 0d 0a 09 09 69 6e 74 65 72 6e 61 6c 20 49 45  s....internal IE
0960: 6e 75 6d 65 72 61 62 6c 65 3c 54 56 61 6c 75 65  numerable<TValue
0970: 3e 20 41 6c 6c 56 61 6c 75 65 73 0d 0a 09 09 7b  > AllValues....{
0980: 0d 0a 09 09 09 67 65 74 0d 0a 09 09 09 7b 0d 0a  .....get.....{..
0990: 09 09 09 09 66 6f 72 65 61 63 68 20 28 54 4b 65  ....foreach (TKe
09a0: 79 20 6b 65 79 20 69 6e 20 4b 65 79 73 29 0d 0a  y key in Keys)..
09b0: 09 09 09 09 7b 0d 0a 09 09 09 09 09 66 6f 72 65  ....{.......fore
09c0: 61 63 68 20 28 54 56 61 6c 75 65 20 76 61 6c 75  ach (TValue valu
09d0: 65 20 69 6e 20 4c 69 73 74 46 6f 72 4b 65 79 28  e in ListForKey(
09e0: 6b 65 79 29 29 0d 0a 09 09 09 09 09 7b 0d 0a 09  key)).......{...
09f0: 09 09 09 09 09 79 69 65 6c 64 20 72 65 74 75 72  .....yield retur
0a00: 6e 20 76 61 6c 75 65 3b 0d 0a 09 09 09 09 09 7d  n value;.......}
0a10: 0d 0a 09 09 09 09 7d 0d 0a 09 09 09 7d 0d 0a 09  ......}.....}...
0a20: 09 7d 0d 0a 0d 0a 09 09 69 6e 74 65 72 6e 61 6c  .}......internal
0a30: 20 49 45 6e 75 6d 65 72 61 62 6c 65 3c 54 4b 65   IEnumerable<TKe
0a40: 79 3e 20 4b 65 79 73 0d 0a 09 09 7b 0d 0a 09 09  y> Keys....{....
0a50: 09 67 65 74 0d 0a 09 09 09 7b 0d 0a 09 09 09 09  .get.....{......
0a60: 72 65 74 75 72 6e 20 74 68 69 73 2e 6d 5f 6d 61  return this.m_ma
0a70: 70 2e 4b 65 79 73 3b 0d 0a 09 09 09 7d 0d 0a 09  p.Keys;.....}...
0a80: 09 7d 0d 0a 0d 0a 09 09 69 6e 74 65 72 6e 61 6c  .}......internal
0a90: 20 49 45 6e 75 6d 65 72 61 62 6c 65 3c 4b 65 79   IEnumerable<Key
0aa0: 56 61 6c 75 65 50 61 69 72 3c 54 4b 65 79 2c 20  ValuePair<TKey, 
0ab0: 4c 69 73 74 3c 54 56 61 6c 75 65 3e 3e 3e 20 4b  List<TValue>>> K
0ac0: 65 79 56 61 6c 75 65 50 61 69 72 73 0d 0a 09 09  eyValuePairs....
0ad0: 7b 0d 0a 23 69 66 20 4e 45 54 5f 34 30 20 7c 7c  {..#if NET_40 ||
0ae0: 20 4e 45 54 5f 34 35 0d 0a 09 09 09 5b 54 61 72   NET_45.....[Tar
0af0: 67 65 74 65 64 50 61 74 63 68 69 6e 67 4f 70 74  getedPatchingOpt
0b00: 4f 75 74 28 22 50 65 72 66 6f 72 6d 61 6e 63 65  Out("Performance
0b10: 20 63 72 69 74 69 63 61 6c 20 74 6f 20 69 6e 6c   critical to inl
0b20: 69 6e 65 20 74 68 69 73 20 74 79 70 65 20 6f 66  ine this type of
0b30: 20 6d 65 74 68 6f 64 20 61 63 72 6f 73 73 20 4e   method across N
0b40: 47 65 6e 20 69 6d 61 67 65 20 62 6f 75 6e 64 61  Gen image bounda
0b50: 72 69 65 73 22 29 5d 0d 0a 23 65 6e 64 69 66 0d  ries")]..#endif.
0b60: 0a 09 09 09 67 65 74 0d 0a 09 09 09 7b 0d 0a 09  ....get.....{...
0b70: 09 09 09 72 65 74 75 72 6e 20 74 68 69 73 2e 6d  ...return this.m
0b80: 5f 6d 61 70 3b 0d 0a 09 09 09 7d 0d 0a 09 09 7d  _map;.....}....}
0b90: 0d 0a 09 7d 0d 0a 7d 0d 0a                       ...}..}..