cpdo  Hex Artifact Content

Artifact cd839c08c0ded056d5ada9e4b260cd2f782aa593:

Wiki page [cpdo_mysql5] by stephan 2011-05-17 18:39:29.
0000: 44 20 32 30 31 31 2d 30 35 2d 31 37 54 31 38 3a  D 2011-05-17T18:
0010: 33 39 3a 32 39 2e 30 39 35 0a 4c 20 63 70 64 6f  39:29.095.L cpdo
0020: 5f 6d 79 73 71 6c 35 0a 50 20 30 33 33 65 61 34  _mysql5.P 033ea4
0030: 64 32 66 61 32 35 63 38 34 39 39 32 35 65 38 38  d2fa25c849925e88
0040: 32 61 64 35 38 37 37 30 64 38 39 64 35 64 31 39  2ad58770d89d5d19
0050: 34 62 0a 55 20 73 74 65 70 68 61 6e 0a 57 20 36  4b.U stephan.W 6
0060: 38 35 35 0a 3c 73 74 72 6f 6e 67 3e 41 43 48 54  855.<strong>ACHT
0070: 55 4e 47 3a 20 54 48 45 20 43 50 44 4f 20 57 49  UNG: THE CPDO WI
0080: 4b 49 20 49 53 20 4e 4f 57 20 28 41 53 20 4f 46  KI IS NOW (AS OF
0090: 20 32 30 31 31 2d 4d 61 79 2d 31 37 29 20 4d 41   2011-May-17) MA
00a0: 49 4e 54 41 49 4e 45 44 20 4f 4e 20 41 20 44 45  INTAINED ON A DE
00b0: 44 49 43 41 54 45 44 20 57 49 4b 49 20 53 49 54  DICATED WIKI SIT
00c0: 45 3a 3c 2f 73 74 72 6f 6e 67 3e 20 5b 68 74 74  E:</strong> [htt
00d0: 70 3a 2f 2f 77 68 69 6b 69 2e 77 61 6e 64 65 72  p://whiki.wander
00e0: 69 6e 67 68 6f 72 73 65 2e 6e 65 74 2f 77 69 6b  inghorse.net/wik
00f0: 69 73 2f 63 70 64 6f 2f 3f 70 61 67 65 3d 63 70  is/cpdo/?page=cp
0100: 64 6f 5f 6d 79 73 71 6c 35 5d 0a 0a 54 68 65 20  do_mysql5]..The 
0110: 4d 79 53 51 4c 20 64 72 69 76 65 72 20 62 69 6e  MySQL driver bin
0120: 64 69 6e 67 20 77 61 73 20 61 20 62 69 74 63 68  ding was a bitch
0130: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 2c 20 62   to implement, b
0140: 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 77 6f  ut appears to wo
0150: 72 6b 20 61 73 20 65 78 70 65 63 74 65 64 20 61  rk as expected a
0160: 6e 64 20 73 75 70 70 6f 72 74 73 20 61 6c 6c 20  nd supports all 
0170: 66 65 61 74 75 72 65 73 20 72 65 71 75 69 72 65  features require
0180: 64 20 62 79 20 74 68 65 20 63 70 64 6f 20 69 6e  d by the cpdo in
0190: 74 65 72 66 61 63 65 2e 20 49 6e 20 6d 79 20 74  terface. In my t
01a0: 65 73 74 73 20 69 74 20 69 73 2c 20 66 6f 72 20  ests it is, for 
01b0: 72 65 61 73 6f 6e 73 20 69 20 63 61 6e 6e 6f 74  reasons i cannot
01c0: 20 65 78 70 6c 61 69 6e 2c 20 6e 6f 74 61 62 6c   explain, notabl
01d0: 79 20 66 61 73 74 65 72 20 74 68 61 6e 20 5b 63  y faster than [c
01e0: 70 64 6f 5f 73 71 6c 69 74 65 33 5d 2e 20 28 57  pdo_sqlite3]. (W
01f0: 65 69 72 64 21 29 0d 0a 0d 0a 54 68 69 73 20 64  eird!)....This d
0200: 72 69 76 65 72 20 77 61 73 20 64 65 76 65 6c 6f  river was develo
0210: 70 65 64 20 77 69 74 68 20 4d 79 53 51 4c 20 76  ped with MySQL v
0220: 35 20 28 69 20 62 65 6c 69 65 76 65 20 69 74 20  5 (i believe it 
0230: 6e 65 65 64 73 20 35 2e 30 2e 33 20 6f 72 20 68  needs 5.0.3 or h
0240: 69 67 68 65 72 29 2c 20 61 6e 64 20 6d 69 67 68  igher), and migh
0250: 74 20 6f 72 20 6d 69 67 68 74 20 6e 6f 74 20 63  t or might not c
0260: 6f 6d 70 69 6c 65 20 61 73 2d 69 73 20 6f 6e 20  ompile as-is on 
0270: 6e 65 77 65 72 20 6f 72 20 6f 6c 64 65 72 20 76  newer or older v
0280: 65 72 73 69 6f 6e 73 2e 20 49 66 20 69 74 20 64  ersions. If it d
0290: 6f 65 73 20 6e 6f 74 2c 20 70 6c 65 61 73 65 20  oes not, please 
02a0: 72 65 70 6f 72 74 20 69 74 20 28 62 75 74 20 69  report it (but i
02b0: 20 68 61 76 65 20 6e 6f 20 69 6e 74 65 6e 74 69   have no intenti
02c0: 6f 6e 20 6f 66 20 62 61 63 6b 2d 70 6f 72 74 69  on of back-porti
02d0: 6e 67 20 74 6f 20 4d 79 53 51 4c 20 76 33 20 69  ng to MySQL v3 i
02e0: 66 20 69 74 27 73 20 61 20 6d 61 6a 6f 72 20 68  f it's a major h
02f0: 61 73 73 6c 65 20 74 6f 20 64 6f 20 73 6f 29 2e  assle to do so).
0300: 0d 0a 0d 0a 54 68 65 20 5b 44 53 4e 5d 20 66 6f  ....The [DSN] fo
0310: 72 6d 61 74 20 66 6f 72 20 74 68 69 73 20 64 72  rmat for this dr
0320: 69 76 65 72 20 69 73 20 3c 74 74 3e 22 6d 79 73  iver is <tt>"mys
0330: 71 6c 35 3a 6f 70 74 69 6f 6e 31 3d 76 61 6c 75  ql5:option1=valu
0340: 65 31 3b 6f 70 74 69 6f 6e 32 3d 76 61 6c 75 65  e1;option2=value
0350: 32 2e 2e 2e 22 3c 2f 74 74 3e 2e 20 54 68 65 20  2..."</tt>. The 
0360: 73 75 70 70 6f 72 74 65 64 20 6f 70 74 69 6f 6e  supported option
0370: 73 20 61 72 65 3a 0d 0a 0d 0a 20 20 20 2a 20 20  s are:....   *  
0380: 3c 74 74 3e 64 62 6e 61 6d 65 3d 6e 61 6d 65 5f  <tt>dbname=name_
0390: 6f 66 5f 64 61 74 61 62 61 73 65 3c 2f 74 74 3e  of_database</tt>
03a0: 20 28 72 65 71 75 69 72 65 64 29 20 73 70 65 63   (required) spec
03b0: 69 66 69 65 73 20 74 68 65 20 73 65 72 76 65 72  ifies the server
03c0: 2d 73 69 64 65 20 6e 61 6d 65 20 6f 66 20 74 68  -side name of th
03d0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 63 6f  e database to co
03e0: 6e 6e 65 63 74 20 74 6f 2e 0d 0a 20 20 20 2a 20  nnect to...   * 
03f0: 20 3c 74 74 3e 68 6f 73 74 3d 69 70 5f 6f 72 5f   <tt>host=ip_or_
0400: 6e 61 6d 65 5f 6f 66 5f 73 65 72 76 65 72 3c 2f  name_of_server</
0410: 74 74 3e 20 28 72 65 71 75 69 72 65 64 29 20 73  tt> (required) s
0420: 70 65 63 69 66 69 65 73 20 74 68 65 20 64 61 74  pecifies the dat
0430: 61 62 61 73 65 20 73 65 72 76 65 72 20 68 6f 73  abase server hos
0440: 74 2e 0d 0a 20 20 20 2a 20 20 3c 74 74 3e 70 6f  t...   *  <tt>po
0450: 72 74 3d 69 6e 74 65 67 65 72 3c 2f 74 74 3e 20  rt=integer</tt> 
0460: 28 64 65 66 61 75 6c 74 3d 30 29 20 69 73 20 74  (default=0) is t
0470: 68 65 20 70 6f 72 74 20 6e 75 6d 62 65 72 20 6f  he port number o
0480: 6e 20 74 68 65 20 4d 79 53 51 4c 20 73 65 72 76  n the MySQL serv
0490: 65 72 2c 20 62 75 74 20 6e 6f 74 65 20 74 68 61  er, but note tha
04a0: 74 20 4d 79 53 51 4c 20 69 67 6e 6f 72 65 73 20  t MySQL ignores 
04b0: 74 68 65 20 70 6f 72 74 20 6e 75 6d 62 65 72 20  the port number 
04c0: 77 68 65 6e 20 63 6f 6e 6e 65 63 74 69 6e 67 20  when connecting 
04d0: 74 6f 20 6c 6f 63 61 6c 68 6f 73 74 20 76 69 61  to localhost via
04e0: 20 61 20 55 6e 69 78 20 73 6f 63 6b 65 74 20 28   a Unix socket (
04f0: 77 68 69 63 68 20 69 73 20 64 6f 65 73 20 62 79  which is does by
0500: 20 64 65 66 61 75 6c 74 20 69 66 20 69 74 20 63   default if it c
0510: 61 6e 29 2e 0d 0a 20 20 20 2a 20 20 3c 74 74 3e  an)...   *  <tt>
0520: 61 75 74 6f 63 6f 6d 6d 69 74 3d 62 6f 6f 6c 65  autocommit=boole
0530: 61 6e 3c 2f 74 74 3e 20 73 70 65 63 69 66 69 65  an</tt> specifie
0540: 73 20 77 68 65 74 68 65 72 20 61 75 74 6f 63 6f  s whether autoco
0550: 6d 6d 69 74 20 69 73 20 6f 6e 20 6f 72 20 6f 66  mmit is on or of
0560: 66 2e 20 42 79 20 64 65 66 61 75 6c 74 20 74 68  f. By default th
0570: 65 20 64 72 69 76 65 72 2d 6c 65 76 65 6c 20 73  e driver-level s
0580: 65 74 74 69 6e 67 73 20 61 72 65 20 75 73 65 64  ettings are used
0590: 20 28 69 2e 65 2e 20 77 65 20 64 6f 6e 27 74 20   (i.e. we don't 
05a0: 73 65 74 20 69 74 20 69 66 20 79 6f 75 20 64 6f  set it if you do
05b0: 6e 27 74 20 73 65 74 20 69 74 29 2e 0d 0a 20 20  n't set it)...  
05c0: 20 2a 20 20 3c 74 74 3e 66 69 65 6c 64 62 75 66   *  <tt>fieldbuf
05d0: 66 65 72 73 69 7a 65 3d 69 6e 74 65 67 65 72 3c  fersize=integer<
05e0: 2f 74 74 3e 20 28 64 65 66 61 75 6c 74 3d 75 6e  /tt> (default=un
05f0: 73 70 65 63 69 66 69 65 64 20 28 61 20 66 65 77  specified (a few
0600: 20 6b 62 29 29 20 73 70 65 63 69 66 69 65 73 20   kb)) specifies 
0610: 74 68 65 20 62 75 66 66 65 72 20 73 69 7a 65 20  the buffer size 
0620: 74 6f 20 75 73 65 20 66 6f 72 20 73 74 72 69 6e  to use for strin
0630: 67 2f 62 6c 6f 62 20 66 69 65 6c 64 73 20 77 68  g/blob fields wh
0640: 65 6e 20 74 68 65 20 6c 69 62 72 61 72 79 20 63  en the library c
0650: 61 6e 6e 6f 74 20 66 69 67 75 72 65 20 6f 75 74  annot figure out
0660: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   the maximum siz
0670: 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64 2e 20  e of the field. 
0680: 57 68 65 6e 20 66 65 74 63 68 69 6e 67 20 73 74  When fetching st
0690: 72 69 6e 67 2f 62 6c 6f 62 20 64 61 74 61 2c 20  ring/blob data, 
06a0: 74 68 65 20 64 72 69 76 65 72 20 75 73 65 73 20  the driver uses 
06b0: 74 68 65 20 6d 61 78 20 73 69 7a 65 20 73 70 65  the max size spe
06c0: 63 69 66 69 65 64 20 66 6f 72 20 74 68 61 74 20  cified for that 
06d0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
06e0: 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20  ble definition. 
06f0: 49 66 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20  If it cannot do 
0700: 74 68 61 74 20 66 6f 72 20 73 6f 6d 65 20 72 65  that for some re
0710: 61 73 6f 6e 2c 20 69 74 20 75 73 65 73 20 74 68  ason, it uses th
0720: 69 73 20 62 75 66 66 65 72 20 73 69 7a 65 2e 20  is buffer size. 
0730: 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
0740: 65 20 69 73 20 6f 6e 6c 79 20 61 20 66 65 77 20  e is only a few 
0750: 6b 62 2c 20 61 6e 64 20 6e 6f 74 20 73 75 69 74  kb, and not suit
0760: 61 62 6c 65 20 66 6f 72 20 6c 61 72 67 65 20 62  able for large b
0770: 6c 6f 62 73 20 61 6e 64 20 77 68 61 74 6e 6f 74  lobs and whatnot
0780: 2e 20 54 68 65 20 6c 69 62 72 61 72 79 20 6d 61  . The library ma
0790: 79 20 69 67 6e 6f 72 65 20 73 6d 61 6c 6c 20 76  y ignore small v
07a0: 61 6c 75 65 73 20 61 6e 64 20 75 73 65 20 69 74  alues and use it
07b0: 73 20 6f 77 6e 20 64 65 66 61 75 6c 74 20 69 6e  s own default in
07c0: 73 74 65 61 64 2e 0d 0a 20 20 20 20 2a 20 20 3c  stead...    *  <
07d0: 74 74 3e 65 6e 61 62 6c 65 6e 61 6d 65 64 70 61  tt>enablenamedpa
07e0: 72 61 6d 73 3d 62 6f 6f 6c 3c 2f 74 74 3e 20 28  rams=bool</tt> (
07f0: 64 65 66 61 75 6c 74 3d 74 72 75 65 29 20 65 6e  default=true) en
0800: 61 62 6c 65 73 2f 64 69 73 61 62 6c 65 73 20 74  ables/disables t
0810: 68 65 20 63 75 73 74 6f 6d 20 6e 61 6d 65 64 20  he custom named 
0820: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20  bound parameter 
0830: 68 61 6e 64 6c 69 6e 67 20 28 4d 79 53 51 4c 20  handling (MySQL 
0840: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
0850: 20 74 68 69 73 20 66 65 61 74 75 72 65 20 6e 61   this feature na
0860: 74 69 76 65 6c 79 29 2e 20 54 68 69 73 20 6f 70  tively). This op
0870: 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 64  tion requires ad
0880: 64 69 74 69 6f 6e 61 6c 20 6d 65 6d 6f 72 79 20  ditional memory 
0890: 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 61 6e 64 20  allocation, and 
08a0: 73 68 6f 75 6c 64 20 62 65 20 64 69 73 61 62 6c  should be disabl
08b0: 65 64 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74  ed if the client
08c0: 20 69 73 20 6e 6f 74 20 75 73 69 6e 67 20 62 6f   is not using bo
08d0: 75 6e 64 2d 62 79 2d 6e 61 6d 65 20 70 61 72 61  und-by-name para
08e0: 6d 65 74 65 72 73 2e 20 42 6f 75 6e 64 20 70 61  meters. Bound pa
08f0: 72 61 6d 65 74 65 72 73 20 61 72 65 20 77 72 69  rameters are wri
0900: 74 74 65 6e 20 69 6e 20 53 51 4c 20 69 6e 20 74  tten in SQL in t
0910: 68 65 20 66 6f 72 6d 20 3c 74 74 3e 3a 70 61 72  he form <tt>:par
0920: 61 6d 4e 61 6d 65 3c 2f 74 74 3e 2e 0d 0a 0d 0a  amName</tt>.....
0930: 0d 0a 3c 62 3e 43 6f 6d 70 61 74 69 62 69 6c 69  ..<b>Compatibili
0940: 74 79 20 4e 6f 74 65 73 3a 3c 2f 62 3e 0d 0a 0d  ty Notes:</b>...
0950: 0a 20 20 20 2a 20 20 4d 79 53 51 4c 20 3c 74 74  .   *  MySQL <tt
0960: 3e 54 49 4d 45 3c 2f 74 74 3e 2c 20 3c 74 74 3e  >TIME</tt>, <tt>
0970: 44 41 54 45 3c 2f 74 74 3e 2c 20 3c 74 74 3e 44  DATE</tt>, <tt>D
0980: 41 54 45 54 49 4d 45 3c 2f 74 74 3e 2c 61 6e 64  ATETIME</tt>,and
0990: 20 3c 74 74 3e 54 49 4d 45 53 54 41 4d 50 3c 2f   <tt>TIMESTAMP</
09a0: 74 74 3e 20 66 69 65 6c 64 73 20 61 72 65 20 66  tt> fields are f
09b0: 65 74 63 68 65 64 20 61 73 20 73 74 72 69 6e 67  etched as string
09c0: 73 2c 20 62 75 74 20 74 68 65 72 65 20 69 73 20  s, but there is 
09d0: 6e 6f 20 64 69 72 65 63 74 20 73 75 70 70 6f 72  no direct suppor
09e0: 74 20 66 6f 72 20 73 65 74 74 69 6e 67 20 74 68  t for setting th
09f0: 65 6d 20 76 69 61 20 62 6f 75 6e 64 20 70 61 72  em via bound par
0a00: 61 6d 65 74 65 72 73 20 69 6e 20 74 68 69 73 20  ameters in this 
0a10: 41 50 49 2e 20 53 65 6e 64 69 6e 67 20 74 68 65  API. Sending the
0a20: 6d 20 76 69 61 20 6e 6f 6e 2d 62 6f 75 6e 64 20  m via non-bound 
0a30: 70 61 72 61 6d 65 74 65 72 73 20 77 68 69 63 68  parameters which
0a40: 20 79 6f 75 20 66 6f 72 6d 61 74 20 79 6f 75 72   you format your
0a50: 73 65 6c 66 20 69 73 20 66 69 6e 65 2e 20 69 20  self is fine. i 
0a60: 62 65 6c 69 65 76 65 20 69 20 68 61 76 65 20 66  believe i have f
0a70: 6f 75 6e 64 20 61 20 77 61 79 20 74 6f 20 61 6c  ound a way to al
0a80: 6c 6f 77 20 62 69 6e 64 69 6e 67 20 74 68 65 6d  low binding them
0a90: 20 61 73 20 66 6f 72 6d 61 74 74 65 64 20 73 74   as formatted st
0aa0: 72 69 6e 67 73 2c 20 62 75 74 20 69 74 27 73 20  rings, but it's 
0ab0: 6e 6f 74 20 79 65 74 20 69 6d 70 6c 65 6d 65 6e  not yet implemen
0ac0: 74 65 64 2e 0d 0a 20 20 20 2a 20 20 4d 79 53 51  ted...   *  MySQ
0ad0: 4c 20 64 6f 65 73 20 6e 6f 74 20 6e 61 74 69 76  L does not nativ
0ae0: 65 6c 79 20 61 6c 6c 6f 77 20 75 73 20 74 6f 20  ely allow us to 
0af0: 62 69 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20  bind parameters 
0b00: 62 79 20 6e 61 6d 65 2c 20 62 75 74 20 74 68 69  by name, but thi
0b10: 73 20 64 72 69 76 65 72 20 73 75 70 70 6f 72 74  s driver support
0b20: 73 20 62 69 6e 64 69 6e 67 20 74 68 65 6d 20 77  s binding them w
0b30: 69 74 68 20 74 68 65 20 73 79 6e 74 61 78 20 3c  ith the syntax <
0b40: 74 74 3e 3a 70 61 72 61 6d 6e 61 6d 65 3c 2f 74  tt>:paramname</t
0b50: 74 3e 20 62 79 20 75 73 69 6e 67 20 61 20 63 75  t> by using a cu
0b60: 73 74 6f 6d 20 70 61 72 73 65 72 2e 20 55 73 65  stom parser. Use
0b70: 20 74 68 65 20 3c 74 74 3e 65 6e 61 62 6c 65 6e   the <tt>enablen
0b80: 61 6d 65 64 70 61 72 61 6d 73 3d 66 61 6c 73 65  amedparams=false
0b90: 3c 2f 74 74 3e 20 5b 44 53 4e 5d 20 6f 70 74 69  </tt> [DSN] opti
0ba0: 6f 6e 20 74 6f 20 64 69 73 61 62 6c 65 20 69 74  on to disable it
0bb0: 20 69 66 20 69 74 20 63 61 75 73 65 73 20 61 6e   if it causes an
0bc0: 79 20 67 72 69 65 66 20 6f 6e 20 6f 74 68 65 72  y grief on other
0bd0: 77 69 73 65 20 76 61 6c 69 64 20 53 51 4c 20 28  wise valid SQL (
0be0: 61 6e 64 20 70 6c 65 61 73 65 20 72 65 70 6f 72  and please repor
0bf0: 74 20 69 74 20 61 73 20 61 20 62 75 67 21 29 2e  t it as a bug!).
0c00: 20 53 65 65 20 62 65 6c 6f 77 20 66 6f 72 20 6d   See below for m
0c10: 6f 72 65 20 64 65 74 61 69 6c 73 2e 0d 0a 0d 0a  ore details.....
0c20: 3c 62 3e 42 75 67 73 3a 3c 2f 62 3e 0d 0a 0d 0a  <b>Bugs:</b>....
0c30: 20 20 20 2a 20 20 54 68 65 20 4d 79 53 51 4c 20     *  The MySQL 
0c40: 6c 69 62 72 61 72 69 65 73 20 6c 65 61 6b 20 6d  libraries leak m
0c50: 65 6d 6f 72 79 20 77 68 65 6e 20 63 6f 6e 6e 65  emory when conne
0c60: 63 74 69 6e 67 2c 20 61 6e 64 20 69 20 68 61 76  cting, and i hav
0c70: 65 20 62 65 65 6e 20 75 6e 61 62 6c 65 20 74 6f  e been unable to
0c80: 20 72 65 6c 69 61 62 6c 79 20 67 65 74 20 69 74   reliably get it
0c90: 20 74 6f 20 66 72 65 65 20 74 68 61 74 20 6d 65   to free that me
0ca0: 6d 6f 72 79 20 28 65 2e 67 2e 20 75 73 69 6e 67  mory (e.g. using
0cb0: 20 3c 74 74 3e 6d 79 73 71 6c 5f 6c 69 62 72 61   <tt>mysql_libra
0cc0: 72 79 5f 65 6e 64 28 29 3c 2f 74 74 3e 29 2e 20  ry_end()</tt>). 
0cd0: 69 20 63 61 6e 20 64 6f 20 6e 6f 74 68 69 6e 67  i can do nothing
0ce0: 20 61 62 6f 75 74 20 74 68 69 73 2c 20 61 6e 64   about this, and
0cf0: 20 69 74 20 6d 61 6b 65 73 20 63 68 65 63 6b 69   it makes checki
0d00: 6e 67 20 6d 79 20 6f 77 6e 20 63 6f 64 65 20 66  ng my own code f
0d10: 6f 72 20 6c 65 61 6b 73 20 6d 6f 72 65 20 64 69  or leaks more di
0d20: 66 66 69 63 75 6c 74 2e 20 28 54 68 61 74 20 73  fficult. (That s
0d30: 61 69 64 2c 20 69 20 63 68 65 63 6b 20 66 6f 72  aid, i check for
0d40: 20 6c 65 61 6b 73 20 75 73 69 6e 67 20 76 61 6c   leaks using val
0d50: 67 72 69 6e 64 20 6f 6e 20 61 20 72 65 67 75 6c  grind on a regul
0d60: 61 72 20 62 61 73 69 73 2c 20 61 6e 64 20 69 67  ar basis, and ig
0d70: 6e 6f 72 65 20 6f 6e 6c 79 20 74 68 6f 73 65 20  nore only those 
0d80: 31 31 20 6d 69 73 73 69 6e 67 20 66 72 65 65 73  11 missing frees
0d90: 20 77 68 69 63 68 20 4d 79 53 51 4c 20 69 6e 74   which MySQL int
0da0: 72 6f 64 75 63 65 73 2e 29 20 53 74 72 61 6e 67  roduces.) Strang
0db0: 65 6c 79 20 65 6e 6f 75 67 68 2c 20 77 68 65 6e  ely enough, when
0dc0: 20 62 75 69 6c 64 69 6e 67 20 69 6e 20 43 2b 2b   building in C++
0dd0: 20 6d 6f 64 65 20 69 20 64 6f 20 3c 65 6d 3e 6e   mode i do <em>n
0de0: 6f 74 3c 2f 65 6d 3e 20 73 65 65 20 74 68 69 73  ot</em> see this
0df0: 20 6c 65 61 6b 20 28 6d 61 79 62 65 20 76 61 6c   leak (maybe val
0e00: 67 72 69 6e 64 20 64 6f 65 73 6e 27 74 20 72 65  grind doesn't re
0e10: 70 6f 72 74 20 69 74 3f 29 2c 20 62 75 74 20 69  port it?), but i
0e20: 6e 20 43 20 6d 6f 64 65 20 69 20 64 6f 2e 0d 0a  n C mode i do...
0e30: 20 20 20 2a 20 20 54 68 69 73 20 64 72 69 76 65     *  This drive
0e40: 72 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 70 65  r does not prope
0e50: 72 6c 79 20 72 65 70 6f 72 74 20 77 68 65 6e 20  rly report when 
0e60: 6e 6f 20 3c 74 74 3e 64 62 6e 61 6d 65 3d 2e 2e  no <tt>dbname=..
0e70: 2e 3c 2f 74 74 3e 20 69 73 20 73 70 65 63 69 66  .</tt> is specif
0e80: 69 65 64 20 69 6e 20 74 68 65 20 44 53 4e 2e 20  ied in the DSN. 
0e90: 49 73 20 74 68 69 73 20 61 20 62 75 67 3f 20 57  Is this a bug? W
0ea0: 68 61 74 20 64 6f 65 73 20 4d 79 53 51 4c 20 64  hat does MySQL d
0eb0: 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 28  o in that case (
0ec0: 75 73 65 20 73 6f 6d 65 20 64 65 66 61 75 6c 74  use some default
0ed0: 3f 29 3f 20 41 64 64 69 6e 67 20 61 6e 20 65 72  ?)? Adding an er
0ee0: 72 6f 72 20 73 74 72 69 6e 67 20 66 6f 72 20 74  ror string for t
0ef0: 68 69 73 20 72 65 71 75 69 72 65 73 20 61 64 64  his requires add
0f00: 69 6e 67 20 61 20 62 69 74 20 6f 66 20 69 6e 66  ing a bit of inf
0f10: 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 68  rastructure to h
0f20: 6f 6c 64 20 74 68 65 20 63 75 73 74 6f 6d 20 65  old the custom e
0f30: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 6e 6f  rror message (no
0f40: 72 6d 61 6c 6c 79 20 77 65 20 67 65 74 20 74 68  rmally we get th
0f50: 65 6d 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  em directly from
0f60: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
0f70: 64 72 69 76 65 72 29 2e 0d 0a 20 20 20 2a 20 20  driver)...   *  
0f80: 49 74 20 63 61 6e 6e 6f 74 20 64 69 72 65 63 74  It cannot direct
0f90: 6c 79 20 72 65 70 6f 72 74 20 74 68 65 20 70 72  ly report the pr
0fa0: 6f 62 6c 65 6d 20 69 66 20 74 68 65 20 63 75 73  oblem if the cus
0fb0: 74 6f 6d 20 62 6f 75 6e 64 2d 70 61 72 61 6d 20  tom bound-param 
0fc0: 6e 61 6d 69 6e 67 20 63 6f 64 65 20 66 6f 75 6c  naming code foul
0fd0: 73 20 75 70 2c 20 62 65 63 61 75 73 65 20 74 68  s up, because th
0fe0: 61 74 20 63 6f 64 65 20 77 6f 6e 27 74 20 6b 6e  at code won't kn
0ff0: 6f 77 20 69 74 20 66 6f 75 6c 65 64 20 75 70 21  ow it fouled up!
1000: 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20   The error will 
1010: 73 68 6f 77 20 75 70 20 61 73 20 6d 79 73 74 65  show up as myste
1020: 72 69 6f 75 73 6c 79 20 69 6e 76 61 6c 69 64 20  riously invalid 
1030: 53 51 4c 2e 20 53 65 65 20 62 65 6c 6f 77 20 66  SQL. See below f
1040: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e  or more details.
1050: 0d 0a 0d 0a 3c 62 3e 50 6f 74 65 6e 74 69 61 6c  ....<b>Potential
1060: 20 54 4f 44 4f 73 3a 3c 2f 62 3e 0d 0a 0d 0a 20   TODOs:</b>.... 
1070: 20 20 2a 20 20 41 64 64 20 61 20 5b 44 53 4e 5d    *  Add a [DSN]
1080: 20 6f 70 74 69 6f 6e 20 77 68 69 63 68 20 77 69   option which wi
1090: 6c 6c 20 74 65 6c 6c 73 20 74 68 65 20 62 69 6e  ll tells the bin
10a0: 64 2d 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  d-related functi
10b0: 6f 6e 73 20 74 6f 20 64 6f 20 6d 6f 72 65 20 73  ons to do more s
10c0: 74 72 69 63 74 20 74 79 70 65 20 63 68 65 63 6b  trict type check
10d0: 69 6e 67 2c 20 65 2e 67 2e 20 6e 6f 74 20 61 6c  ing, e.g. not al
10e0: 6c 6f 77 69 6e 67 20 75 73 20 74 6f 20 62 69 6e  lowing us to bin
10f0: 64 20 61 20 73 74 72 69 6e 67 20 74 6f 20 61 20  d a string to a 
1100: 6e 75 6d 65 72 69 63 20 63 6f 6c 75 6d 6e 2e 20  numeric column. 
1110: 54 68 69 73 20 77 6f 75 6c 64 20 61 64 64 20 61  This would add a
1120: 20 67 6f 6f 64 20 64 65 61 6c 20 6f 66 20 63 6f   good deal of co
1130: 64 65 20 74 6f 20 74 68 6f 73 65 20 72 6f 75 74  de to those rout
1140: 69 6e 65 73 2c 20 74 68 6f 75 67 68 2e 0d 0a 20  ines, though... 
1150: 20 20 2a 20 20 41 64 64 20 61 20 44 53 4e 20 6f    *  Add a DSN o
1160: 70 74 69 6f 6e 20 74 6f 20 64 65 66 69 6e 65 20  ption to define 
1170: 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 70 72  the parameter pr
1180: 65 66 69 78 20 63 68 61 72 61 63 74 65 72 20 66  efix character f
1190: 6f 72 20 6e 61 6d 65 64 20 70 61 72 61 6d 65 74  or named paramet
11a0: 65 72 73 2e 20 49 74 20 69 73 20 63 75 72 72 65  ers. It is curre
11b0: 6e 74 6c 79 20 68 61 72 64 2d 63 6f 64 65 64 20  ntly hard-coded 
11c0: 74 6f 20 3c 74 74 3e 27 3a 27 3c 2f 74 74 3e 2c  to <tt>':'</tt>,
11d0: 20 77 68 69 63 68 20 69 73 20 66 61 69 72 6c 79   which is fairly
11e0: 20 73 74 61 6e 64 61 72 64 20 61 63 72 6f 73 73   standard across
11f0: 20 64 72 69 76 65 72 73 20 28 50 6f 73 74 67 72   drivers (Postgr
1200: 65 73 20 75 73 65 73 20 3c 74 74 3e 24 3c 2f 74  es uses <tt>$</t
1210: 74 3e 2c 20 66 72 6f 6d 20 77 68 61 74 20 69 20  t>, from what i 
1220: 75 6e 64 65 72 73 74 61 6e 64 29 2e 0d 0a 20 20  understand)...  
1230: 20 2a 20 20 41 64 64 20 61 20 44 53 4e 20 70 61   *  Add a DSN pa
1240: 72 61 6d 65 74 65 72 20 74 6f 20 73 65 74 20 74  rameter to set t
1250: 68 65 20 71 75 6f 74 69 6e 67 20 73 74 79 6c 65  he quoting style
1260: 20 74 6f 20 65 69 74 68 65 72 20 41 4e 53 49 20   to either ANSI 
1270: 6f 72 20 4d 79 53 51 4c 20 28 64 6f 75 62 6c 65  or MySQL (double
1280: 2d 71 75 6f 74 65 73 29 2e 20 54 68 69 73 20 72  -quotes). This r
1290: 65 71 75 69 72 65 73 20 66 69 72 73 74 20 63 68  equires first ch
12a0: 61 6e 67 69 6e 67 20 3c 74 74 3e 63 70 64 6f 5f  anging <tt>cpdo_
12b0: 64 72 69 76 65 72 5f 61 70 69 3a 3a 63 6f 6e 73  driver_api::cons
12c0: 74 61 6e 74 73 3c 2f 74 74 3e 20 73 6f 20 74 68  tants</tt> so th
12d0: 61 74 20 74 68 65 20 71 75 6f 74 69 6e 67 2d 72  at the quoting-r
12e0: 65 6c 61 74 65 64 20 76 61 6c 75 65 73 20 61 72  elated values ar
12f0: 65 20 72 65 74 75 72 6e 65 64 20 76 69 61 20 66  e returned via f
1300: 75 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65 61 64  unctions instead
1310: 20 6f 66 20 63 6f 6e 73 74 20 76 61 6c 75 65 73   of const values
1320: 2e 0d 0a 0d 0a 0d 0a 3c 68 32 3e 42 69 6e 64 69  .......<h2>Bindi
1330: 6e 67 20 50 61 72 61 6d 65 74 65 72 73 20 62 79  ng Parameters by
1340: 20 4e 61 6d 65 3c 2f 68 32 3e 0d 0a 0d 0a 41 73   Name</h2>....As
1350: 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65   mentioned above
1360: 2c 20 4d 79 53 51 4c 20 35 2e 78 20 64 6f 65 73  , MySQL 5.x does
1370: 20 6e 6f 74 20 6e 61 74 69 76 65 6c 79 20 73 75   not natively su
1380: 70 70 6f 72 74 20 62 69 6e 64 69 6e 67 20 70 61  pport binding pa
1390: 72 61 6d 65 74 65 72 73 20 62 79 20 6e 61 6d 65  rameters by name
13a0: 2e 20 53 6f 20 77 65 20 68 61 64 20 74 6f 20 68  . So we had to h
13b0: 61 63 6b 20 74 6f 67 65 74 68 65 72 20 61 20 73  ack together a s
13c0: 6f 6c 75 74 69 6f 6e 20 28 61 6e 64 20 69 27 6d  olution (and i'm
13d0: 20 71 75 69 74 65 20 73 61 74 69 73 66 69 65 64   quite satisfied
13e0: 20 77 69 74 68 20 69 74 2c 20 61 63 74 75 61 6c   with it, actual
13f0: 6c 79 29 2e 20 54 68 65 20 70 61 72 73 65 72 20  ly). The parser 
1400: 66 6f 72 20 64 6f 69 6e 67 20 74 68 69 73 20 69  for doing this i
1410: 73 20 68 61 6e 64 2d 77 72 69 74 74 65 6e 20 61  s hand-written a
1420: 6e 64 20 6e 6f 74 20 74 65 72 72 69 62 6c 79 20  nd not terribly 
1430: 63 6f 6d 70 6c 65 78 2c 20 62 75 74 20 69 73 20  complex, but is 
1440: 3c 65 6d 3e 62 65 6c 69 65 76 65 64 3c 2f 65 6d  <em>believed</em
1450: 3e 20 77 6f 72 6b 20 65 72 72 6f 72 2d 66 72 65  > work error-fre
1460: 65 20 6f 6e 20 61 6e 79 20 69 6e 70 75 74 20 3c  e on any input <
1470: 65 6d 3e 77 68 69 63 68 20 69 74 73 65 6c 66 20  em>which itself 
1480: 69 73 20 76 61 6c 69 64 20 53 51 4c 3c 2f 65 6d  is valid SQL</em
1490: 3e 2e 20 53 69 6e 63 65 20 69 6e 76 61 6c 69 64  >. Since invalid
14a0: 20 53 51 4c 20 77 69 6c 6c 20 6e 6f 74 20 62 65   SQL will not be
14b0: 20 61 63 63 65 70 74 65 64 20 62 79 20 74 68 65   accepted by the
14c0: 20 64 72 69 76 65 72 20 3c 65 6d 3e 61 6e 79 77   driver <em>anyw
14d0: 61 79 3c 2f 65 6d 3e 2c 20 6d 69 73 2d 70 61 72  ay</em>, mis-par
14e0: 73 69 6e 67 20 69 6e 20 73 75 63 68 20 63 61 73  sing in such cas
14f0: 65 73 20 69 73 20 70 72 6f 62 61 62 6c 79 20 6e  es is probably n
1500: 6f 74 20 67 6f 69 6e 67 20 74 6f 20 63 61 75 73  ot going to caus
1510: 65 20 61 6e 79 20 61 64 64 69 74 69 6f 6e 61 6c  e any additional
1520: 20 70 72 6f 62 6c 65 6d 73 2e 20 28 54 68 65 20   problems. (The 
1530: 73 75 70 70 6f 72 74 20 69 73 20 61 6c 73 6f 20  support is also 
1540: 67 65 6e 65 72 69 63 2c 20 73 6f 20 74 68 61 74  generic, so that
1550: 20 69 74 20 63 61 6e 20 62 65 20 72 65 2d 75 73   it can be re-us
1560: 65 64 20 69 6e 20 6f 74 68 65 72 20 64 72 69 76  ed in other driv
1570: 65 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  er implementatio
1580: 6e 73 20 69 66 20 77 65 20 6e 65 65 64 20 69 74  ns if we need it
1590: 2e 29 20 49 74 20 3c 65 6d 3e 77 69 6c 6c 3c 2f  .) It <em>will</
15a0: 65 6d 3e 20 70 72 6f 64 75 63 65 20 75 6e 64 65  em> produce unde
15b0: 73 69 72 65 64 20 72 65 73 75 6c 74 73 20 77 68  sired results wh
15c0: 65 6e 20 67 69 76 65 6e 20 77 65 69 72 64 20 64  en given weird d
15d0: 72 69 76 65 72 2d 73 70 65 63 69 66 69 63 20 53  river-specific S
15e0: 51 4c 20 77 68 69 63 68 20 69 74 73 65 6c 66 20  QL which itself 
15f0: 75 73 65 73 20 63 6f 6c 6f 6e 20 63 68 61 72 61  uses colon chara
1600: 63 74 65 72 73 2e 0d 0a 0d 0a 48 65 72 65 20 61  cters.....Here a
1610: 72 65 20 73 6f 6d 65 20 6e 6f 74 65 73 20 74 6f  re some notes to
1620: 20 65 78 70 6c 61 69 6e 20 61 72 65 61 73 20 77   explain areas w
1630: 68 69 63 68 20 6d 69 67 68 74 20 6e 6f 74 20 62  hich might not b
1640: 65 20 69 6e 74 75 69 74 69 76 65 2e 2e 2e 0d 0a  e intuitive.....
1650: 0d 0a 3c 62 3e 41 63 68 74 75 6e 67 3a 3c 2f 62  ..<b>Achtung:</b
1660: 3e 20 74 68 69 73 20 64 72 69 76 65 72 20 3c 65  > this driver <e
1670: 6d 3e 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  m>does not allow
1680: 20 61 20 70 61 72 61 6d 65 74 65 72 20 6e 61 6d   a parameter nam
1690: 65 20 74 6f 20 61 70 70 65 61 72 20 6d 6f 72 65  e to appear more
16a0: 20 74 68 61 6e 20 6f 6e 63 65 20 69 6e 20 61 20   than once in a 
16b0: 67 69 76 65 6e 20 73 74 61 74 65 6d 65 6e 74 3c  given statement<
16c0: 2f 65 6d 3e 2e 20 44 6f 69 6e 67 20 73 6f 20 77  /em>. Doing so w
16d0: 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 62 69  ill result in bi
16e0: 6e 64 69 6e 67 20 6f 6e 6c 79 20 74 68 65 20 3c  nding only the <
16f0: 65 6d 3e 66 69 72 73 74 3c 2f 65 6d 3e 20 69 6e  em>first</em> in
1700: 73 74 61 6e 63 65 20 6f 66 20 74 68 61 74 20 70  stance of that p
1710: 61 72 61 6d 65 74 65 72 20 77 68 65 6e 20 62 69  arameter when bi
1720: 6e 64 69 6e 67 20 62 79 20 70 61 72 61 6d 65 74  nding by paramet
1730: 65 72 20 6e 61 6d 65 2e 20 54 68 65 20 75 6e 64  er name. The und
1740: 65 72 6c 79 69 6e 67 20 53 51 4c 20 64 72 69 76  erlying SQL driv
1750: 65 72 20 6d 69 67 68 74 20 6e 6f 74 69 63 65 20  er might notice 
1760: 74 68 61 74 20 6e 6f 20 76 61 6c 75 65 20 77 61  that no value wa
1770: 73 20 73 65 74 20 66 6f 72 20 74 68 61 74 20 70  s set for that p
1780: 61 72 61 6d 65 74 65 72 20 61 6e 64 20 67 69 76  arameter and giv
1790: 65 20 75 73 20 61 20 75 73 65 66 75 6c 20 65 72  e us a useful er
17a0: 72 6f 72 20 6d 65 73 73 61 67 65 2c 20 62 75 74  ror message, but
17b0: 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d   it might also m
17c0: 69 73 62 65 68 61 76 65 2e 0d 0a 0d 0a 0d 0a 3c  isbehave.......<
17d0: 62 3e 4d 69 78 69 6e 67 20 6e 61 6d 65 64 2d 20  b>Mixing named- 
17e0: 61 6e 64 20 6e 6f 6e 2d 6e 61 6d 65 64 20 70 61  and non-named pa
17f0: 72 61 6d 65 74 65 72 73 3a 3c 2f 62 3e 0d 0a 0d  rameters:</b>...
1800: 0a 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 53  .Consider this S
1810: 51 4c 20 63 6f 64 65 3a 0d 0a 0d 0a 3c 76 65 72  QL code:....<ver
1820: 62 61 74 69 6d 3e 0d 0a 49 4e 53 45 52 54 20 49  batim>..INSERT I
1830: 4e 54 4f 20 54 20 56 41 4c 55 45 53 28 20 3f 2c  NTO T VALUES( ?,
1840: 20 3a 70 61 72 61 6d 32 2c 20 3a 70 61 72 61 6d   :param2, :param
1850: 33 2c 20 3f 20 29 0d 0a 3c 2f 76 65 72 62 61 74  3, ? )..</verbat
1860: 69 6d 3e 0d 0a 0d 0a 69 20 68 61 76 65 20 4e 4f  im>....i have NO
1870: 20 69 64 65 61 20 68 6f 77 20 64 72 69 76 65 72   idea how driver
1880: 73 20 6e 6f 72 6d 61 6c 6c 79 20 68 61 6e 64 6c  s normally handl
1890: 65 20 28 6f 72 20 6e 6f 74 20 68 61 6e 64 6c 65  e (or not handle
18a0: 29 20 6d 69 78 65 64 2d 74 79 70 65 20 75 73 61  ) mixed-type usa
18b0: 67 65 20 6c 69 6b 65 20 74 68 69 73 2c 20 62 75  ge like this, bu
18c0: 74 20 74 68 69 73 20 64 72 69 76 65 72 20 64 6f  t this driver do
18d0: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
18e0: 3a 0d 0a 0d 0a 54 6f 20 67 65 74 20 4d 79 53 51  :....To get MySQ
18f0: 4c 20 74 6f 20 73 77 61 6c 6c 6f 77 20 74 68 65  L to swallow the
1900: 20 53 51 4c 20 77 65 20 68 61 76 65 20 74 6f 20   SQL we have to 
1910: 74 72 61 6e 73 6c 61 74 65 20 74 68 65 20 70 61  translate the pa
1920: 72 61 6d 65 74 65 72 20 6e 61 6d 65 20 70 61 72  rameter name par
1930: 74 73 20 28 3c 74 74 3e 3a 70 61 72 61 6d 32 3c  ts (<tt>:param2<
1940: 2f 74 74 3e 20 61 6e 64 20 3c 74 74 3e 3a 70 61  /tt> and <tt>:pa
1950: 72 61 6d 33 3c 2f 74 74 3e 29 20 74 6f 20 61 20  ram3</tt>) to a 
1960: 3c 74 74 3e 3f 3c 2f 74 74 3e 2e 20 41 73 20 61  <tt>?</tt>. As a
1970: 20 73 69 64 65 20 65 66 66 65 63 74 20 6f 66 20   side effect of 
1980: 74 68 69 73 20 74 68 65 20 6e 61 6d 65 64 20 70  this the named p
1990: 72 6f 70 65 72 74 69 65 73 20 61 72 65 20 61 74  roperties are at
19a0: 20 69 6e 64 65 78 20 70 6f 73 69 74 69 6f 6e 73   index positions
19b0: 20 32 20 61 6e 64 20 33 20 28 72 65 6d 65 6d 62   2 and 3 (rememb
19c0: 65 72 20 74 68 61 74 20 62 69 6e 64 20 70 61 72  er that bind par
19d0: 61 6d 65 74 65 72 73 20 75 73 65 20 31 2d 62 61  ameters use 1-ba
19e0: 73 65 64 20 69 6e 64 65 78 65 73 29 2e 20 54 6f  sed indexes). To
19f0: 20 73 65 65 20 77 68 79 2c 20 63 6f 6e 73 69 64   see why, consid
1a00: 65 72 20 74 68 61 74 20 74 68 65 20 61 62 6f 76  er that the abov
1a10: 65 20 53 51 4c 20 69 73 20 69 6e 74 65 72 6e 61  e SQL is interna
1a20: 6c 6c 79 20 74 72 61 6e 73 6c 61 74 65 64 20 69  lly translated i
1a30: 6e 74 6f 3a 0d 0a 0d 0a 3c 76 65 72 62 61 74 69  nto:....<verbati
1a40: 6d 3e 0d 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  m>..INSERT INTO 
1a50: 54 20 56 41 4c 55 45 53 28 20 3f 2c 20 3f 2c 20  T VALUES( ?, ?, 
1a60: 3f 2c 20 3f 20 29 0d 0a 3c 2f 76 65 72 62 61 74  ?, ? )..</verbat
1a70: 69 6d 3e 0d 0a 0d 0a 54 68 65 20 64 72 69 76 65  im>....The drive
1a80: 72 20 74 68 65 6e 20 72 65 6d 65 6d 62 65 72 73  r then remembers
1a90: 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 69   the names and i
1aa0: 6e 64 65 78 20 70 6f 73 69 74 69 6f 6e 73 20 6f  ndex positions o
1ab0: 66 20 65 61 63 68 20 6e 61 6d 65 64 20 70 61 72  f each named par
1ac0: 61 6d 65 74 65 72 20 73 6f 20 74 68 61 74 20 63  ameter so that c
1ad0: 61 6c 6c 73 20 74 6f 20 3c 74 74 3e 73 74 6d 74  alls to <tt>stmt
1ae0: 2d 3e 61 70 69 2d 3e 62 69 6e 64 2e 70 61 72 61  ->api->bind.para
1af0: 6d 5f 69 6e 64 65 78 28 73 74 6d 74 2c 22 3a 70  m_index(stmt,":p
1b00: 61 72 61 6d 32 22 29 3c 2f 74 74 3e 20 77 69 6c  aram2")</tt> wil
1b10: 6c 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 29  l (in this case)
1b20: 20 72 65 74 75 72 6e 20 32 2e 0a 0a 5a 20 61 39   return 2...Z a9
1b30: 32 34 30 31 61 31 62 65 32 31 38 64 35 63 35 33  2401a1be218d5c53
1b40: 35 62 63 61 35 37 39 62 33 62 38 36 66 62 0a     5bca579b3b86fb.