cson  Hex Artifact Content

Artifact 8f991f78510d692d525e9b0f719f9227cf138f42:

Wiki page [cson_sqlite3] by stephan 2011-05-09 17:58:45.
0000: 44 20 32 30 31 31 2d 30 35 2d 30 39 54 31 37 3a  D 2011-05-09T17:
0010: 35 38 3a 34 35 2e 34 39 36 0a 4c 20 63 73 6f 6e  58:45.496.L cson
0020: 5f 73 71 6c 69 74 65 33 0a 50 20 33 34 33 65 33  _sqlite3.P 343e3
0030: 33 62 62 36 66 39 38 66 63 33 66 62 66 61 30 36  3bb6f98fc3fbfa06
0040: 32 61 65 38 37 39 39 66 39 65 33 65 39 35 38 30  2ae8799f9e3e9580
0050: 34 64 32 0a 55 20 73 74 65 70 68 61 6e 0a 57 20  4d2.U stephan.W 
0060: 35 30 32 38 0a 3c 73 74 72 6f 6e 67 3e 41 43 48  5028.<strong>ACH
0070: 54 55 4e 47 3a 20 54 48 49 53 20 50 41 47 45 20  TUNG: THIS PAGE 
0080: 49 53 20 4e 4f 57 20 4d 41 49 4e 54 41 49 4e 45  IS NOW MAINTAINE
0090: 44 20 49 4e 20 54 48 45 20 4e 45 57 20 57 49 4b  D IN THE NEW WIK
00a0: 49 3a 3c 2f 73 74 72 6f 6e 67 3e 20 5b 68 74 74  I:</strong> [htt
00b0: 70 3a 2f 2f 77 68 69 6b 69 2e 77 61 6e 64 65 72  p://whiki.wander
00c0: 69 6e 67 68 6f 72 73 65 2e 6e 65 74 2f 77 69 6b  inghorse.net/wik
00d0: 69 73 2f 63 73 6f 6e 2f 3f 70 61 67 65 3d 63 73  is/cson/?page=cs
00e0: 6f 6e 5f 73 71 6c 69 74 65 33 5d 0a 0a 0a 53 65  on_sqlite3]...Se
00f0: 65 20 61 6c 73 6f 3a 20 5b 63 73 6f 6e 5f 63 70  e also: [cson_cp
0100: 64 6f 5d 0d 0a 0d 0a 3c 68 31 3e 63 73 6f 6e 5f  do]....<h1>cson_
0110: 73 71 6c 69 74 65 33 3c 2f 68 31 3e 0d 0a 0d 0a  sqlite3</h1>....
0120: 3c 74 74 3e 5b 2f 66 69 6e 66 6f 3f 6e 61 6d 65  <tt>[/finfo?name
0130: 3d 69 6e 63 6c 75 64 65 2f 77 68 2f 63 73 6f 6e  =include/wh/cson
0140: 2f 63 73 6f 6e 5f 73 71 6c 69 74 65 33 2e 68 7c  /cson_sqlite3.h|
0150: 63 73 6f 6e 5f 73 71 6c 69 74 65 33 2e 68 5d 3c  cson_sqlite3.h]<
0160: 2f 74 74 3e 20 69 6e 63 6c 75 64 65 73 20 63 6f  /tt> includes co
0170: 64 65 20 66 6f 72 20 72 65 74 75 72 6e 69 6e 67  de for returning
0180: 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e   [http://sqlite.
0190: 6f 72 67 7c 73 71 6c 69 74 65 33 5d 20 64 61 74  org|sqlite3] dat
01a0: 61 62 61 73 65 20 71 75 65 72 79 20 72 65 73 75  abase query resu
01b0: 6c 74 73 20 61 73 20 4a 53 4f 4e 2e 0d 0a 0d 0a  lts as JSON.....
01c0: 48 65 72 65 27 73 20 61 20 64 65 6d 6f 6e 73 74  Here's a demonst
01d0: 72 61 74 69 6f 6e 3a 0d 0a 0d 0a 3c 76 65 72 62  ration:....<verb
01e0: 61 74 69 6d 3e 0d 0a 23 64 65 66 69 6e 65 20 43  atim>..#define C
01f0: 53 4f 4e 5f 45 4e 41 42 4c 45 5f 53 51 4c 49 54  SON_ENABLE_SQLIT
0200: 45 33 20 31 20 2f 2f 20 53 65 65 20 6e 6f 74 65  E3 1 // See note
0210: 73 20 62 65 6c 6f 77 21 0d 0a 23 69 6e 63 6c 75  s below!..#inclu
0220: 64 65 20 22 77 68 2f 63 73 6f 6e 2f 63 73 6f 6e  de "wh/cson/cson
0230: 5f 73 71 6c 69 74 65 33 2e 68 22 0d 0a 2f 2f 20  _sqlite3.h"..// 
0240: 4f 72 3a 0d 0a 23 69 6e 63 6c 75 64 65 20 22 63  Or:..#include "c
0250: 73 6f 6e 5f 61 6d 61 6c 67 61 6d 61 74 69 6f 6e  son_amalgamation
0260: 2e 68 22 0d 0a 2e 2e 2e 0d 0a 0d 0a 63 68 61 72  .h".........char
0270: 20 63 6f 6e 73 74 20 2a 20 73 65 6c 65 63 74 20   const * select 
0280: 3d 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  = "SELECT * FROM
0290: 20 73 74 75 66 66 22 3b 0d 0a 63 73 6f 6e 5f 76   stuff";..cson_v
02a0: 61 6c 75 65 20 2a 20 6a 73 6f 6e 20 3d 20 4e 55  alue * json = NU
02b0: 4c 4c 3b 0d 0a 69 6e 74 20 72 63 20 3d 20 63 73  LL;..int rc = cs
02c0: 6f 6e 5f 73 71 6c 69 74 65 33 5f 73 71 6c 5f 74  on_sqlite3_sql_t
02d0: 6f 5f 6a 73 6f 6e 28 0d 0a 20 20 20 20 20 20 20  o_json(..       
02e0: 20 20 20 6d 79 53 71 6c 69 74 65 33 44 62 2c 20     mySqlite3Db, 
02f0: 2f 2f 20 74 68 65 20 64 62 20 74 6f 20 6f 70 65  // the db to ope
0300: 72 61 74 65 20 6f 6e 0d 0a 20 20 20 20 20 20 20  rate on..       
0310: 20 20 20 26 6a 73 6f 6e 2c 20 20 20 20 20 20 20     &json,       
0320: 2f 2f 20 77 68 65 72 65 20 74 6f 20 73 74 6f 72  // where to stor
0330: 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  e the resulting 
0340: 4a 53 4f 4e 0d 0a 20 20 20 20 20 20 20 20 20 20  JSON..          
0350: 73 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2f 20  select,      // 
0360: 74 68 65 20 53 51 4c 20 63 6f 64 65 0d 0a 20 20  the SQL code..  
0370: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
0380: 20 20 20 20 20 2f 2f 20 30 3d 22 74 68 69 6e 22       // 0="thin"
0390: 2c 20 6e 6f 6e 2d 30 3d 22 66 61 74 22 20 28 73  , non-0="fat" (s
03a0: 65 65 20 62 65 6c 6f 77 29 0d 0a 20 20 20 20 20  ee below)..     
03b0: 20 20 20 20 20 29 3b 0d 0a 69 66 28 20 30 20 21       );..if( 0 !
03c0: 3d 20 72 63 20 29 20 7b 0d 0a 20 20 66 70 72 69  = rc ) {..  fpri
03d0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
03e0: 6f 72 3a 20 25 64 20 28 25 73 29 5c 6e 22 2c 20  or: %d (%s)\n", 
03f0: 72 63 2c 20 63 73 6f 6e 5f 72 63 5f 73 74 72 69  rc, cson_rc_stri
0400: 6e 67 28 72 63 29 29 3b 0d 0a 7d 0d 0a 65 6c 73  ng(rc));..}..els
0410: 65 20 7b 0d 0a 20 20 20 20 63 73 6f 6e 5f 6f 75  e {..    cson_ou
0420: 74 70 75 74 5f 46 49 4c 45 28 20 6a 73 6f 6e 2c  tput_FILE( json,
0430: 20 73 74 64 6f 75 74 2c 20 4e 55 4c 4c 20 29 3b   stdout, NULL );
0440: 0d 0a 20 20 20 20 63 73 6f 6e 5f 76 61 6c 75 65  ..    cson_value
0450: 5f 66 72 65 65 28 6a 73 6f 6e 29 3b 0d 0a 7d 0d  _free(json);..}.
0460: 0a 3c 2f 76 65 72 62 61 74 69 6d 3e 0d 0a 0d 0a  .</verbatim>....
0470: 54 68 61 74 27 73 20 61 6c 6c 20 74 68 65 72 65  That's all there
0480: 20 69 73 20 74 6f 20 69 74 2e 20 3c 74 74 3e 63   is to it. <tt>c
0490: 73 6f 6e 5f 73 71 6c 69 74 65 33 5f 73 74 6d 74  son_sqlite3_stmt
04a0: 5f 74 6f 5f 6a 73 6f 6e 28 29 3c 2f 74 74 3e 20  _to_json()</tt> 
04b0: 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 61 73  does the same as
04c0: 20 3c 74 74 3e 63 73 6f 6e 5f 73 71 6c 69 74 65   <tt>cson_sqlite
04d0: 33 5f 73 71 6c 5f 74 6f 5f 6a 73 6f 6e 28 29 3c  3_sql_to_json()<
04e0: 2f 74 74 3e 20 62 75 74 20 74 72 61 76 65 72 73  /tt> but travers
04f0: 65 73 20 61 20 70 72 65 70 61 72 65 64 20 3c 74  es a prepared <t
0500: 74 3e 73 71 6c 69 74 65 33 5f 73 74 6d 74 3c 2f  t>sqlite3_stmt</
0510: 74 74 3e 2e 20 4f 6e 6c 79 20 71 75 65 72 69 65  tt>. Only querie
0520: 73 20 77 68 69 63 68 20 72 65 74 75 72 6e 20 64  s which return d
0530: 61 74 61 20 61 72 65 20 73 75 70 70 6f 72 74 65  ata are supporte
0540: 64 20 28 3c 74 74 3e 53 45 4c 45 43 54 3c 2f 74  d (<tt>SELECT</t
0550: 74 3e 20 71 75 65 72 69 65 73 20 61 6e 64 20 3c  t> queries and <
0560: 74 74 3e 53 45 4c 45 43 54 3c 2f 74 74 3e 2d 6c  tt>SELECT</tt>-l
0570: 69 6b 65 20 70 72 61 67 6d 61 73 29 2e 0d 0a 0d  ike pragmas)....
0580: 0a 3c 62 3e 41 63 68 74 75 6e 67 20 23 31 3a 3c  .<b>Achtung #1:<
0590: 2f 62 3e 20 74 6f 20 65 6e 61 62 6c 65 20 74 68  /b> to enable th
05a0: 69 73 20 73 75 70 70 6f 72 74 2c 20 3c 74 74 3e  is support, <tt>
05b0: 43 53 4f 4e 5f 45 4e 41 42 4c 45 5f 53 51 4c 49  CSON_ENABLE_SQLI
05c0: 54 45 33 3c 2f 74 74 3e 20 6d 75 73 74 20 62 65  TE3</tt> must be
05d0: 20 64 65 66 69 6e 65 64 20 74 6f 20 61 20 74 72   defined to a tr
05e0: 75 65 20 76 61 6c 75 65 20 77 68 65 6e 20 63 6f  ue value when co
05f0: 6d 70 69 6c 69 6e 67 20 74 68 65 20 63 73 6f 6e  mpiling the cson
0600: 20 6c 69 62 72 61 72 79 20 3c 65 6d 3e 61 6e 64   library <em>and
0610: 3c 2f 65 6d 3e 20 77 68 65 6e 20 63 6f 6d 70 69  </em> when compi
0620: 6c 69 6e 67 20 63 6c 69 65 6e 74 20 63 6f 64 65  ling client code
0630: 2e 20 54 68 69 73 20 22 75 6e 66 6f 72 74 75 6e  . This "unfortun
0640: 61 74 65 20 66 65 61 74 75 72 65 22 20 69 73 20  ate feature" is 
0650: 73 6f 20 74 68 61 74 20 5b 41 6d 61 6c 67 61 6d  so that [Amalgam
0660: 61 74 69 6f 6e 42 75 69 6c 64 7c 74 68 65 20 61  ationBuild|the a
0670: 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 62 75 69 6c  malgamation buil
0680: 64 5d 20 63 61 6e 20 69 6e 63 6c 75 64 65 20 74  d] can include t
0690: 68 65 20 73 71 6c 69 74 65 33 20 61 64 64 2d 6f  he sqlite3 add-o
06a0: 6e 73 20 77 69 74 68 6f 75 74 20 62 72 65 61 6b  ns without break
06b0: 69 6e 67 20 63 6c 69 65 6e 74 73 20 77 68 6f 20  ing clients who 
06c0: 64 6f 20 6e 6f 74 20 75 73 65 20 73 71 6c 69 74  do not use sqlit
06d0: 65 33 2e 20 49 66 20 79 6f 75 20 75 73 65 20 5b  e3. If you use [
06e0: 41 6d 61 6c 67 61 6d 61 74 69 6f 6e 42 75 69 6c  AmalgamationBuil
06f0: 64 7c 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69  d|the amalgamati
0700: 6f 6e 20 62 75 69 6c 64 5d 2c 20 79 6f 75 20 63  on build], you c
0710: 61 6e 20 65 64 69 74 20 3c 74 74 3e 63 73 6f 6e  an edit <tt>cson
0720: 5f 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 68 3c  _amalgamation.h<
0730: 2f 74 74 3e 20 61 6e 64 20 63 68 61 6e 67 65 20  /tt> and change 
0740: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
0750: 65 20 6f 66 20 3c 74 74 3e 43 53 4f 4e 5f 45 4e  e of <tt>CSON_EN
0760: 41 42 4c 45 5f 53 51 4c 49 54 45 33 3c 2f 74 74  ABLE_SQLITE3</tt
0770: 3e 20 74 6f 20 31 20 69 66 20 79 6f 75 20 6c 69  > to 1 if you li
0780: 6b 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f  ke. If you do no
0790: 74 20 75 73 65 20 74 68 65 20 61 6d 61 6c 67 61  t use the amalga
07a0: 6d 61 74 69 6f 6e 20 62 75 69 6c 64 2c 20 79 6f  mation build, yo
07b0: 75 20 63 61 6e 20 63 68 61 6e 67 65 20 74 68 65  u can change the
07c0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 69   default value i
07d0: 6e 20 3c 74 74 3e 63 73 6f 6e 5f 73 71 6c 69 74  n <tt>cson_sqlit
07e0: 65 33 2e 68 3c 2f 74 74 3e 20 69 66 20 79 6f 75  e3.h</tt> if you
07f0: 20 6c 69 6b 65 20 28 61 6e 64 20 69 66 20 61 6c   like (and if al
0800: 6c 20 63 6c 69 65 6e 74 73 20 77 69 6c 6c 20 62  l clients will b
0810: 65 20 6c 69 6e 6b 69 6e 67 20 61 67 61 69 6e 73  e linking agains
0820: 74 20 73 71 6c 69 74 65 33 29 2e 0d 0a 0d 0a 3c  t sqlite3).....<
0830: 62 3e 41 63 68 74 75 6e 67 20 23 32 3a 3c 2f 62  b>Achtung #2:</b
0840: 3e 20 77 68 65 6e 20 66 65 74 63 68 69 6e 67 20  > when fetching 
0850: 54 45 58 54 20 61 6e 64 20 42 4c 4f 42 20 66 69  TEXT and BLOB fi
0860: 65 6c 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  elds from the da
0870: 74 61 62 61 73 65 2c 20 72 65 73 75 6c 74 73 20  tabase, results 
0880: 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 66  are undefined if
0890: 20 74 68 65 20 64 61 74 61 20 69 73 20 6e 6f 74   the data is not
08a0: 20 55 54 46 38 20 6f 72 20 4e 55 4c 4c 2e 20 69   UTF8 or NULL. i
08b0: 2e 65 2e 20 69 66 20 69 74 20 63 6f 6e 74 61 69  .e. if it contai
08c0: 6e 73 20 55 54 46 31 36 20 6f 72 20 62 69 6e 61  ns UTF16 or bina
08d0: 72 79 20 64 61 74 61 2c 20 74 68 61 74 20 64 61  ry data, that da
08e0: 74 61 20 77 69 6c 6c 20 62 65 20 73 74 75 66 66  ta will be stuff
08f0: 65 64 20 69 6e 74 6f 20 61 20 4a 53 4f 4e 20 73  ed into a JSON s
0900: 74 72 69 6e 67 2c 20 61 6e 64 20 74 68 61 74 20  tring, and that 
0910: 77 69 6c 6c 20 63 61 75 73 65 20 61 6c 6c 20 6b  will cause all k
0920: 69 6e 64 73 20 6f 66 20 67 72 69 65 66 20 64 6f  inds of grief do
0930: 77 6e 73 74 72 65 61 6d 2e 20 28 57 65 6c 6c 2c  wnstream. (Well,
0940: 20 70 72 6f 62 61 62 6c 79 2e 29 0d 0a 0d 0a 3c   probably.)....<
0950: 68 32 3e 53 61 6d 70 6c 65 20 4f 75 74 70 75 74  h2>Sample Output
0960: 3c 2f 68 32 3e 0d 0a 0d 0a 54 68 65 20 44 42 20  </h2>....The DB 
0970: 63 6f 64 65 3a 0d 0a 3c 76 65 72 62 61 74 69 6d  code:..<verbatim
0980: 3e 0d 0a 43 52 45 41 54 45 20 54 41 42 4c 45 20  >..CREATE TABLE 
0990: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 74  IF NOT EXISTS st
09a0: 75 66 66 20 28 6e 61 6d 65 20 55 4e 49 51 55 45  uff (name UNIQUE
09b0: 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 52 45 50   ON CONFLICT REP
09c0: 4c 41 43 45 2c 20 63 6f 75 6e 74 20 29 3b 0d 0a  LACE, count );..
09d0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 74 75 66  DELETE FROM stuf
09e0: 66 3b 0d 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  f;..INSERT INTO 
09f0: 73 74 75 66 66 20 28 6e 61 6d 65 2c 63 6f 75 6e  stuff (name,coun
0a00: 74 29 20 56 41 4c 55 45 53 28 27 74 68 69 73 27  t) VALUES('this'
0a10: 2c 33 29 3b 0d 0a 49 4e 53 45 52 54 20 49 4e 54  ,3);..INSERT INT
0a20: 4f 20 73 74 75 66 66 20 28 6e 61 6d 65 2c 63 6f  O stuff (name,co
0a30: 75 6e 74 29 20 56 41 4c 55 45 53 28 27 74 68 61  unt) VALUES('tha
0a40: 74 27 2c 32 29 3b 0d 0a 49 4e 53 45 52 54 20 49  t',2);..INSERT I
0a50: 4e 54 4f 20 73 74 75 66 66 20 28 6e 61 6d 65 2c  NTO stuff (name,
0a60: 63 6f 75 6e 74 29 20 56 41 4c 55 45 53 28 27 74  count) VALUES('t
0a70: 68 65 4f 74 68 65 72 54 68 69 6e 67 27 2c 4e 55  heOtherThing',NU
0a80: 4c 4c 29 3b 0d 0a 3c 2f 76 65 72 62 61 74 69 6d  LL);..</verbatim
0a90: 3e 0d 0a 0d 0a 54 68 65 20 71 75 65 72 79 3a 0d  >....The query:.
0aa0: 0a 3c 76 65 72 62 61 74 69 6d 3e 0d 0a 53 45 4c  .<verbatim>..SEL
0ab0: 45 43 54 20 2a 20 46 52 4f 4d 20 73 74 75 66 66  ECT * FROM stuff
0ac0: 3b 0d 0a 3c 2f 76 65 72 62 61 74 69 6d 3e 0d 0a  ;..</verbatim>..
0ad0: 0d 0a 3c 74 74 3e 63 73 6f 6e 5f 73 71 6c 69 74  ..<tt>cson_sqlit
0ae0: 65 33 5f 73 71 6c 5f 74 6f 5f 6a 73 6f 6e 28 29  e3_sql_to_json()
0af0: 3c 2f 74 74 3e 20 61 6e 64 20 66 72 69 65 6e 64  </tt> and friend
0b00: 73 27 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74  s' final paramet
0b10: 65 72 20 28 61 20 62 6f 6f 6c 65 61 6e 29 20 64  er (a boolean) d
0b20: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
0b30: 72 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  r the output is 
0b40: 69 6e 20 22 74 68 69 6e 22 20 66 6f 72 6d 61 74  in "thin" format
0b50: 20 6f 72 20 22 66 61 74 22 20 66 6f 72 6d 61 74   or "fat" format
0b60: 2e 0d 0a 0d 0a 54 68 65 20 4a 53 4f 4e 2c 20 69  .....The JSON, i
0b70: 6e 20 22 74 68 69 6e 22 20 6d 6f 64 65 20 28 69  n "thin" mode (i
0b80: 6e 64 65 6e 74 65 64 20 66 6f 72 20 63 6c 61 72  ndented for clar
0b90: 69 74 79 29 3a 0d 0a 0d 0a 3c 76 65 72 62 61 74  ity):....<verbat
0ba0: 69 6d 3e 0d 0a 7b 0d 0a 20 20 20 20 22 63 6f 6c  im>..{..    "col
0bb0: 75 6d 6e 73 22 3a 5b 0d 0a 20 20 20 20 20 20 20  umns":[..       
0bc0: 20 22 6e 61 6d 65 22 2c 0d 0a 20 20 20 20 20 20   "name",..      
0bd0: 20 20 22 63 6f 75 6e 74 22 0d 0a 20 20 20 20 5d    "count"..    ]
0be0: 2c 0d 0a 20 20 20 20 22 72 6f 77 73 22 3a 5b 0d  ,..    "rows":[.
0bf0: 0a 20 20 20 20 20 20 20 20 5b 0d 0a 20 20 20 20  .        [..    
0c00: 20 20 20 20 20 20 20 20 22 74 68 69 73 22 2c 0d          "this",.
0c10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 33 0d 0a  .            3..
0c20: 20 20 20 20 20 20 20 20 5d 2c 0d 0a 20 20 20 20          ],..    
0c30: 20 20 20 20 5b 0d 0a 20 20 20 20 20 20 20 20 20      [..         
0c40: 20 20 20 22 74 68 61 74 22 2c 0d 0a 20 20 20 20     "that",..    
0c50: 20 20 20 20 20 20 20 20 32 0d 0a 20 20 20 20 20          2..     
0c60: 20 20 20 5d 2c 0d 0a 20 20 20 20 20 20 20 20 5b     ],..        [
0c70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 74  ..            "t
0c80: 68 65 4f 74 68 65 72 54 68 69 6e 67 22 2c 0d 0a  heOtherThing",..
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6c 6c              null
0ca0: 0d 0a 20 20 20 20 20 20 20 20 5d 0d 0a 20 20 20  ..        ]..   
0cb0: 20 5d 0d 0a 7d 0d 0a 3c 2f 76 65 72 62 61 74 69   ]..}..</verbati
0cc0: 6d 3e 0d 0a 0d 0a 49 6e 20 22 66 61 74 22 20 6d  m>....In "fat" m
0cd0: 6f 64 65 3a 0d 0a 0d 0a 3c 76 65 72 62 61 74 69  ode:....<verbati
0ce0: 6d 3e 0d 0a 7b 0d 0a 20 20 20 20 22 63 6f 6c 75  m>..{..    "colu
0cf0: 6d 6e 73 22 3a 5b 0d 0a 20 20 20 20 20 20 20 20  mns":[..        
0d00: 22 6e 61 6d 65 22 2c 0d 0a 20 20 20 20 20 20 20  "name",..       
0d10: 20 22 63 6f 75 6e 74 22 0d 0a 20 20 20 20 5d 2c   "count"..    ],
0d20: 0d 0a 20 20 20 20 22 72 6f 77 73 22 3a 5b 0d 0a  ..    "rows":[..
0d30: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
0d40: 20 20 20 20 20 20 20 22 6e 61 6d 65 22 3a 22 74         "name":"t
0d50: 68 69 73 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  his",..         
0d60: 20 20 20 22 63 6f 75 6e 74 22 3a 33 0d 0a 20 20     "count":3..  
0d70: 20 20 20 20 20 20 7d 2c 0d 0a 20 20 20 20 20 20        },..      
0d80: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
0d90: 20 22 6e 61 6d 65 22 3a 22 74 68 61 74 22 2c 0d   "name":"that",.
0da0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f  .            "co
0db0: 75 6e 74 22 3a 32 0d 0a 20 20 20 20 20 20 20 20  unt":2..        
0dc0: 7d 2c 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  },..        {.. 
0dd0: 20 20 20 20 20 20 20 20 20 20 20 22 6e 61 6d 65             "name
0de0: 22 3a 22 74 68 65 4f 74 68 65 72 54 68 69 6e 67  ":"theOtherThing
0df0: 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ",..            
0e00: 22 63 6f 75 6e 74 22 3a 6e 75 6c 6c 0d 0a 20 20  "count":null..  
0e10: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 5d 0d 0a        }..    ]..
0e20: 7d 0d 0a 3c 2f 76 65 72 62 61 74 69 6d 3e 0d 0a  }..</verbatim>..
0e30: 0d 0a 49 6e 20 74 68 65 20 22 66 61 74 22 20 66  ..In the "fat" f
0e40: 6f 72 6d 61 74 2c 20 74 68 65 20 6f 72 64 65 72  ormat, the order
0e50: 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 20 69 6e   of the names in
0e60: 20 74 68 65 20 22 63 6f 6c 75 6d 6e 73 22 20 66   the "columns" f
0e70: 69 65 6c 64 20 69 73 20 67 75 61 72 61 6e 74 65  ield is guarante
0e80: 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 6f 73  ed to match thos
0e90: 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79  e of the underly
0ea0: 69 6e 67 20 71 75 65 72 79 2e 20 54 68 65 20 6f  ing query. The o
0eb0: 72 64 65 72 20 6f 66 20 74 68 65 20 22 72 6f 77  rder of the "row
0ec0: 73 22 20 6b 65 79 73 20 69 73 20 61 6e 20 69 6d  s" keys is an im
0ed0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 74  plementation det
0ee0: 61 69 6c 2c 20 61 6e 64 20 6d 61 79 20 69 6e 20  ail, and may in 
0ef0: 66 61 63 74 20 62 65 20 63 68 61 6e 67 65 64 20  fact be changed 
0f00: 77 68 65 6e 20 70 61 73 73 69 6e 67 20 74 68 65  when passing the
0f10: 20 64 61 74 61 20 74 68 72 6f 75 67 68 20 6f 74   data through ot
0f20: 68 65 72 20 4a 53 4f 4e 20 69 6d 70 6c 65 6d 65  her JSON impleme
0f30: 6e 74 61 74 69 6f 6e 73 2c 20 64 65 70 65 6e 64  ntations, depend
0f40: 69 6e 67 20 6f 6e 20 68 6f 77 20 74 68 65 79 20  ing on how they 
0f50: 69 6d 70 6c 65 6d 65 6e 74 20 6b 65 79 2f 76 61  implement key/va
0f60: 6c 75 65 20 70 61 69 72 73 20 69 6e 20 6f 62 6a  lue pairs in obj
0f70: 65 63 74 73 2e 20 49 6e 20 22 74 68 69 6e 22 20  ects. In "thin" 
0f80: 6d 6f 64 65 2c 20 74 68 65 20 6f 72 64 65 72 20  mode, the order 
0f90: 69 73 20 77 65 6c 6c 2d 64 65 66 69 6e 65 64 20  is well-defined 
0fa0: 66 6f 72 20 62 6f 74 68 20 74 68 65 20 22 63 6f  for both the "co
0fb0: 6c 75 6d 6e 73 22 20 61 6e 64 20 22 72 6f 77 73  lumns" and "rows
0fc0: 22 20 6c 69 73 74 73 2e 0d 0a 0d 0a 4e 6f 74 65  " lists.....Note
0fd0: 20 74 68 61 74 20 77 68 65 74 68 65 72 20 6f 72   that whether or
0fe0: 20 6e 6f 74 20 74 6f 20 69 6e 64 65 6e 74 20 74   not to indent t
0ff0: 68 65 20 6f 75 74 70 75 74 20 28 69 2e 65 2e 20  he output (i.e. 
1000: 74 6f 20 6d 61 6b 65 20 69 74 20 6d 6f 72 65 20  to make it more 
1010: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 29 20  human-readable) 
1020: 69 73 20 64 65 63 69 64 65 64 20 77 68 65 6e 20  is decided when 
1030: 79 6f 75 20 63 61 6c 6c 20 3c 74 74 3e 63 73 6f  you call <tt>cso
1040: 6e 5f 6f 75 74 70 75 74 5f 78 78 78 28 29 3c 2f  n_output_xxx()</
1050: 74 74 3e 2c 20 61 6e 64 20 6e 6f 74 20 77 68 65  tt>, and not whe
1060: 6e 20 74 68 65 20 4a 53 4f 4e 20 6f 62 6a 65 63  n the JSON objec
1070: 74 20 74 72 65 65 20 69 73 20 67 65 6e 65 72 61  t tree is genera
1080: 74 65 64 2e 0d 0a 0d 0a 3c 68 32 3e 43 6f 6e 76  ted.....<h2>Conv
1090: 65 72 74 69 6e 67 20 22 54 68 69 6e 22 20 74 6f  erting "Thin" to
10a0: 20 22 46 61 74 22 20 6f 6e 20 74 68 65 20 43 6c   "Fat" on the Cl
10b0: 69 65 6e 74 20 53 69 64 65 3c 2f 68 32 3e 0d 0a  ient Side</h2>..
10c0: 0d 0a 57 68 69 6c 65 20 74 68 65 20 22 74 68 69  ..While the "thi
10d0: 6e 22 20 66 6f 72 6d 61 74 20 69 73 20 6d 75 63  n" format is muc
10e0: 68 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 20 22  h smaller, the "
10f0: 66 61 74 22 20 66 6f 72 6d 61 74 20 69 73 20 6d  fat" format is m
1100: 75 63 68 20 6d 6f 72 65 20 75 73 65 72 2d 66 72  uch more user-fr
1110: 69 65 6e 64 6c 79 2e 20 47 69 76 65 6e 20 74 68  iendly. Given th
1120: 65 20 74 68 69 6e 20 66 6f 72 6d 61 74 2c 20 77  e thin format, w
1130: 65 20 63 61 6e 20 65 61 73 69 6c 79 20 74 72 61  e can easily tra
1140: 6e 73 66 6f 72 6d 20 69 74 20 74 6f 20 66 61 74  nsform it to fat
1150: 20 66 6f 72 6d 61 74 20 28 6f 72 20 61 6e 79 20   format (or any 
1160: 6f 74 68 65 72 20 66 6f 72 6d 61 74 29 20 75 73  other format) us
1170: 69 6e 67 20 63 6c 69 65 6e 74 2d 73 69 64 65 20  ing client-side 
1180: 73 63 72 69 70 74 20 63 6f 64 65 20 6c 69 6b 65  script code like
1190: 20 74 68 69 73 20 4a 61 76 61 53 63 72 69 70 74   this JavaScript
11a0: 3a 0d 0a 0d 0a 3c 76 65 72 62 61 74 69 6d 3e 0d  :....<verbatim>.
11b0: 0a 66 75 6e 63 74 69 6f 6e 20 74 68 69 6e 54 6f  .function thinTo
11c0: 46 61 74 28 74 68 69 6e 29 20 7b 0d 0a 20 20 20  Fat(thin) {..   
11d0: 20 76 61 72 20 6c 69 73 74 20 3d 20 5b 5d 2c 20   var list = [], 
11e0: 6f 62 6a 2c 20 69 2c 20 78 2c 20 72 6f 77 3b 0d  obj, i, x, row;.
11f0: 0a 20 20 20 20 66 6f 72 28 20 69 20 3d 20 30 3b  .    for( i = 0;
1200: 20 69 20 3c 20 74 68 69 6e 2e 72 6f 77 73 2e 6c   i < thin.rows.l
1210: 65 6e 67 74 68 3b 20 2b 2b 69 20 29 20 7b 0d 0a  ength; ++i ) {..
1220: 20 20 20 20 20 20 20 20 72 6f 77 20 3d 20 74 68          row = th
1230: 69 6e 2e 72 6f 77 73 5b 69 5d 3b 0d 0a 20 20 20  in.rows[i];..   
1240: 20 20 20 20 20 6f 62 6a 20 3d 20 7b 7d 3b 0d 0a       obj = {};..
1250: 20 20 20 20 20 20 20 20 66 6f 72 28 20 78 20 3d          for( x =
1260: 20 30 3b 20 78 20 3c 20 74 68 69 6e 2e 63 6f 6c   0; x < thin.col
1270: 75 6d 6e 73 2e 6c 65 6e 67 74 68 3b 20 2b 2b 78  umns.length; ++x
1280: 20 29 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   ) {..          
1290: 20 20 6f 62 6a 5b 74 68 69 6e 2e 63 6f 6c 75 6d    obj[thin.colum
12a0: 6e 73 5b 78 5d 5d 20 3d 20 72 6f 77 5b 78 5d 3b  ns[x]] = row[x];
12b0: 0d 0a 20 20 20 20 20 20 20 20 7d 20 0d 0a 20 20  ..        } ..  
12c0: 20 20 20 20 20 20 6c 69 73 74 2e 70 75 73 68 28        list.push(
12d0: 6f 62 6a 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20  obj);..    }..  
12e0: 20 20 72 65 74 75 72 6e 20 6c 69 73 74 3b 0d 0a    return list;..
12f0: 7d 0d 0a 3c 2f 76 65 72 62 61 74 69 6d 3e 0d 0a  }..</verbatim>..
1300: 0d 0a 54 68 65 20 6f 75 74 70 75 74 20 6f 66 20  ..The output of 
1310: 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 2c 20 75  that function, u
1320: 73 69 6e 67 20 74 68 65 20 74 68 69 6e 2d 66 6f  sing the thin-fo
1330: 72 6d 61 74 20 64 61 74 61 20 73 68 6f 77 6e 20  rmat data shown 
1340: 61 62 6f 76 65 2c 20 69 73 20 61 20 6c 69 73 74  above, is a list
1350: 20 6f 66 20 6f 62 6a 65 63 74 73 20 77 68 69 63   of objects whic
1360: 68 20 6c 6f 6f 6b 73 20 6c 69 6b 65 3a 0d 0a 0d  h looks like:...
1370: 0a 3c 76 65 72 62 61 74 69 6d 3e 0d 0a 5b 0d 0a  .<verbatim>..[..
1380: 20 20 20 20 7b 20 22 6e 61 6d 65 22 3a 20 22 74      { "name": "t
1390: 68 69 73 22 2c 20 22 63 6f 75 6e 74 22 3a 20 33  his", "count": 3
13a0: 20 7d 2c 0d 0a 20 20 20 20 7b 20 22 6e 61 6d 65   },..    { "name
13b0: 22 3a 20 22 74 68 61 74 22 2c 20 22 63 6f 75 6e  ": "that", "coun
13c0: 74 22 3a 20 32 20 7d 2c 0d 0a 20 20 20 20 7b 20  t": 2 },..    { 
13d0: 22 6e 61 6d 65 22 3a 20 22 74 68 65 4f 74 68 65  "name": "theOthe
13e0: 72 54 68 69 6e 67 22 2c 20 22 63 6f 75 6e 74 22  rThing", "count"
13f0: 3a 20 6e 75 6c 6c 20 7d 0d 0a 5d 0d 0a 3c 2f 76  : null }..]..</v
1400: 65 72 62 61 74 69 6d 3e 0a 0a 5a 20 36 62 63 35  erbatim>..Z 6bc5
1410: 30 63 62 38 33 63 37 38 38 37 31 38 64 65 30 31  0cb83c788718de01
1420: 66 61 64 34 64 39 33 62 30 37 37 62 0a           fad4d93b077b.