Fossil

Hex Artifact Content
Login

Artifact 6df1d80dece8968b344e4b730aae8151c7c61955:


0000: 23 69 66 64 65 66 20 46 4f 53 53 49 4c 5f 45 4e  #ifdef FOSSIL_EN
0010: 41 42 4c 45 5f 4a 53 4f 4e 0a 2f 2a 0a 2a 2a 20  ABLE_JSON./*.** 
0020: 43 6f 70 79 72 69 67 68 74 20 28 63 29 20 32 30  Copyright (c) 20
0030: 31 31 20 44 2e 20 52 69 63 68 61 72 64 20 48 69  11 D. Richard Hi
0040: 70 70 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 72  pp.**.** This pr
0050: 6f 67 72 61 6d 20 69 73 20 66 72 65 65 20 73 6f  ogram is free so
0060: 66 74 77 61 72 65 3b 20 79 6f 75 20 63 61 6e 20  ftware; you can 
0070: 72 65 64 69 73 74 72 69 62 75 74 65 20 69 74 20  redistribute it 
0080: 61 6e 64 2f 6f 72 0a 2a 2a 20 6d 6f 64 69 66 79  and/or.** modify
0090: 20 69 74 20 75 6e 64 65 72 20 74 68 65 20 74 65   it under the te
00a0: 72 6d 73 20 6f 66 20 74 68 65 20 53 69 6d 70 6c  rms of the Simpl
00b0: 69 66 69 65 64 20 42 53 44 20 4c 69 63 65 6e 73  ified BSD Licens
00c0: 65 20 28 61 6c 73 6f 0a 2a 2a 20 6b 6e 6f 77 6e  e (also.** known
00d0: 20 61 73 20 74 68 65 20 22 32 2d 43 6c 61 75 73   as the "2-Claus
00e0: 65 20 4c 69 63 65 6e 73 65 22 20 6f 72 20 22 46  e License" or "F
00f0: 72 65 65 42 53 44 20 4c 69 63 65 6e 73 65 22 2e  reeBSD License".
0100: 29 0a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72  )..** This progr
0110: 61 6d 20 69 73 20 64 69 73 74 72 69 62 75 74 65  am is distribute
0120: 64 20 69 6e 20 74 68 65 20 68 6f 70 65 20 74 68  d in the hope th
0130: 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 75 73  at it will be us
0140: 65 66 75 6c 2c 0a 2a 2a 20 62 75 74 20 77 69 74  eful,.** but wit
0150: 68 6f 75 74 20 61 6e 79 20 77 61 72 72 61 6e 74  hout any warrant
0160: 79 3b 20 77 69 74 68 6f 75 74 20 65 76 65 6e 20  y; without even 
0170: 74 68 65 20 69 6d 70 6c 69 65 64 20 77 61 72 72  the implied warr
0180: 61 6e 74 79 20 6f 66 0a 2a 2a 20 6d 65 72 63 68  anty of.** merch
0190: 61 6e 74 61 62 69 6c 69 74 79 20 6f 72 20 66 69  antability or fi
01a0: 74 6e 65 73 73 20 66 6f 72 20 61 20 70 61 72 74  tness for a part
01b0: 69 63 75 6c 61 72 20 70 75 72 70 6f 73 65 2e 0a  icular purpose..
01c0: 2a 2a 0a 2a 2a 20 41 75 74 68 6f 72 20 63 6f 6e  **.** Author con
01d0: 74 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tact information
01e0: 3a 0a 2a 2a 20 20 20 64 72 68 40 68 77 61 63 69  :.**   drh@hwaci
01f0: 2e 63 6f 6d 0a 2a 2a 20 20 20 68 74 74 70 3a 2f  .com.**   http:/
0200: 2f 77 77 77 2e 68 77 61 63 69 2e 63 6f 6d 2f 64  /www.hwaci.com/d
0210: 72 68 2f 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rh/.**.*********
0220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0260: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 6f 64  ******.**.** Cod
0270: 65 20 66 6f 72 20 74 68 65 20 4a 53 4f 4e 20 41  e for the JSON A
0280: 50 49 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f  PI..**.** For no
0290: 74 65 73 20 72 65 67 61 72 64 69 6e 67 20 74 68  tes regarding th
02a0: 65 20 70 75 62 6c 69 63 20 4a 53 4f 4e 20 69 6e  e public JSON in
02b0: 74 65 72 66 61 63 65 2c 20 70 6c 65 61 73 65 20  terface, please 
02c0: 73 65 65 3a 0a 2a 2a 0a 2a 2a 20 68 74 74 70 73  see:.**.** https
02d0: 3a 2f 2f 64 6f 63 73 2e 67 6f 6f 67 6c 65 2e 63  ://docs.google.c
02e0: 6f 6d 2f 64 6f 63 75 6d 65 6e 74 2f 64 2f 31 66  om/document/d/1f
02f0: 58 56 69 76 65 4e 68 44 62 69 58 67 43 75 45 37  XViveNhDbiXgCuE7
0300: 51 44 58 51 4f 4b 65 46 7a 66 32 71 4e 55 6b 42  QDXQOKeFzf2qNUkB
0310: 45 67 69 55 76 6f 71 46 4e 34 2f 76 69 65 77 0a  EgiUvoqFN4/view.
0320: 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73 20 66  **.**.** Notes f
0330: 6f 72 20 68 61 63 6b 65 72 73 2e 2e 2e 0a 2a 2a  or hackers....**
0340: 0a 2a 2a 20 48 65 72 65 27 73 20 68 6f 77 20 63  .** Here's how c
0350: 6f 6d 6d 61 6e 64 2f 70 61 67 65 20 64 69 73 70  ommand/page disp
0360: 61 74 63 68 69 6e 67 20 77 6f 72 6b 73 3a 20 6a  atching works: j
0370: 73 6f 6e 5f 70 61 67 65 5f 74 6f 70 28 29 20 28  son_page_top() (
0380: 69 6e 20 48 54 54 50 20 6d 6f 64 65 29 20 6f 72  in HTTP mode) or
0390: 0a 2a 2a 20 6a 73 6f 6e 5f 63 6d 64 5f 74 6f 70  .** json_cmd_top
03a0: 28 29 20 28 69 6e 20 43 4c 49 20 6d 6f 64 65 29  () (in CLI mode)
03b0: 20 63 61 74 63 68 20 74 68 65 20 22 6a 73 6f 6e   catch the "json
03c0: 22 20 70 61 74 68 2f 63 6f 6d 6d 61 6e 64 2e 20  " path/command. 
03d0: 54 68 6f 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  Those functions 
03e0: 74 68 65 6e 0a 2a 2a 20 64 69 73 70 61 74 63 68  then.** dispatch
03f0: 20 74 6f 20 61 20 4a 53 4f 4e 2d 6d 6f 64 65 2d   to a JSON-mode-
0400: 73 70 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64  specific command
0410: 2f 70 61 67 65 20 68 61 6e 64 6c 65 72 20 77 69  /page handler wi
0420: 74 68 20 74 68 65 20 74 79 70 65 20 66 6f 73 73  th the type foss
0430: 69 6c 5f 6a 73 6f 6e 5f 66 28 29 2e 0a 2a 2a 20  il_json_f()..** 
0440: 53 65 65 20 74 68 65 20 41 50 49 20 64 6f 63 73  See the API docs
0450: 20 66 6f 72 20 74 68 61 74 20 74 79 70 65 64 65   for that typede
0460: 66 20 28 62 65 6c 6f 77 29 20 66 6f 72 20 74 68  f (below) for th
0470: 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74  e semantics of t
0480: 68 65 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 2a 2a  he callbacks..**
0490: 0a 2a 2a 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  .**.*/.#include 
04a0: 22 56 45 52 53 49 4f 4e 2e 68 22 0a 23 69 6e 63  "VERSION.h".#inc
04b0: 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e 68 22 0a  lude "config.h".
04c0: 23 69 6e 63 6c 75 64 65 20 22 6a 73 6f 6e 2e 68  #include "json.h
04d0: 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65  ".#include <asse
04e0: 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  rt.h>.#include <
04f0: 74 69 6d 65 2e 68 3e 0a 0a 23 69 66 20 49 4e 54  time.h>..#if INT
0500: 45 52 46 41 43 45 0a 23 69 6e 63 6c 75 64 65 20  ERFACE.#include 
0510: 22 6a 73 6f 6e 5f 64 65 74 61 69 6c 2e 68 22 20  "json_detail.h" 
0520: 2f 2a 20 77 6f 72 6b 61 72 6f 75 6e 64 20 66 6f  /* workaround fo
0530: 72 20 61 70 70 61 72 65 6e 74 20 65 6e 75 6d 20  r apparent enum 
0540: 6c 69 6d 69 74 61 74 69 6f 6e 20 69 6e 20 6d 61  limitation in ma
0550: 6b 65 68 65 61 64 65 72 73 20 2a 2f 0a 23 65 6e  keheaders */.#en
0560: 64 69 66 0a 0a 63 6f 6e 73 74 20 46 6f 73 73 69  dif..const Fossi
0570: 6c 4a 73 6f 6e 4b 65 79 73 5f 20 46 6f 73 73 69  lJsonKeys_ Fossi
0580: 6c 4a 73 6f 6e 4b 65 79 73 20 3d 20 7b 0a 20 20  lJsonKeys = {.  
0590: 22 61 6e 6f 6e 79 6d 6f 75 73 53 65 65 64 22 20  "anonymousSeed" 
05a0: 2f 2a 61 6e 6f 6e 79 6d 6f 75 73 53 65 65 64 2a  /*anonymousSeed*
05b0: 2f 2c 0a 20 20 22 61 75 74 68 54 6f 6b 65 6e 22  /,.  "authToken"
05c0: 20 20 2f 2a 61 75 74 68 54 6f 6b 65 6e 2a 2f 2c    /*authToken*/,
05d0: 0a 20 20 22 43 4f 4d 4d 41 4e 44 5f 50 41 54 48  .  "COMMAND_PATH
05e0: 22 20 2f 2a 63 6f 6d 6d 61 6e 64 50 61 74 68 2a  " /*commandPath*
05f0: 2f 2c 0a 20 20 22 6d 74 69 6d 65 22 20 2f 2a 6d  /,.  "mtime" /*m
0600: 74 69 6d 65 2a 2f 2c 0a 20 20 22 70 61 79 6c 6f  time*/,.  "paylo
0610: 61 64 22 20 2f 2a 20 70 61 79 6c 6f 61 64 20 2a  ad" /* payload *
0620: 2f 2c 0a 20 20 22 72 65 71 75 65 73 74 49 64 22  /,.  "requestId"
0630: 20 2f 2a 72 65 71 75 65 73 74 49 64 2a 2f 2c 0a   /*requestId*/,.
0640: 20 20 22 72 65 73 75 6c 74 43 6f 64 65 22 20 2f    "resultCode" /
0650: 2a 72 65 73 75 6c 74 43 6f 64 65 2a 2f 2c 0a 20  *resultCode*/,. 
0660: 20 22 72 65 73 75 6c 74 54 65 78 74 22 20 2f 2a   "resultText" /*
0670: 72 65 73 75 6c 74 54 65 78 74 2a 2f 2c 0a 20 20  resultText*/,.  
0680: 22 74 69 6d 65 73 74 61 6d 70 22 20 2f 2a 74 69  "timestamp" /*ti
0690: 6d 65 73 74 61 6d 70 2a 2f 0a 7d 3b 0a 0a 0a 0a  mestamp*/.};....
06a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 72  /*.** Returns tr
06b0: 75 65 20 28 6e 6f 6e 2d 30 29 20 69 66 20 66 6f  ue (non-0) if fo
06c0: 73 73 69 6c 20 61 70 70 65 61 72 73 20 74 6f 20  ssil appears to 
06d0: 62 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 4a 53  be running in JS
06e0: 4f 4e 20 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  ON mode..*/.int 
06f0: 66 6f 73 73 69 6c 5f 68 61 73 5f 6a 73 6f 6e 28  fossil_has_json(
0700: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 2e 6a 73  ){.  return g.js
0710: 6f 6e 2e 69 73 4a 73 6f 6e 4d 6f 64 65 20 26 26  on.isJsonMode &&
0720: 20 28 67 2e 69 73 48 54 54 50 20 7c 7c 20 67 2e   (g.isHTTP || g.
0730: 6a 73 6f 6e 2e 70 6f 73 74 2e 6f 29 3b 0a 7d 0a  json.post.o);.}.
0740: 0a 2f 2a 0a 2a 2a 20 50 6c 61 63 65 68 6f 6c 64  ./*.** Placehold
0750: 65 72 20 2f 6a 73 6f 6e 2f 58 58 58 20 70 61 67  er /json/XXX pag
0760: 65 20 69 6d 70 6c 20 66 6f 72 20 4e 59 49 20 28  e impl for NYI (
0770: 4e 6f 74 20 59 65 74 20 49 6d 70 6c 65 6d 65 6e  Not Yet Implemen
0780: 74 65 64 29 0a 2a 2a 20 28 62 75 74 20 70 6c 61  ted).** (but pla
0790: 6e 6e 65 64 29 20 70 61 67 65 73 2f 63 6f 6d 6d  nned) pages/comm
07a0: 61 6e 64 73 2e 0a 2a 2f 0a 63 73 6f 6e 5f 76 61  ands..*/.cson_va
07b0: 6c 75 65 20 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f  lue * json_page_
07c0: 6e 79 69 28 29 7b 0a 20 20 67 2e 6a 73 6f 6e 2e  nyi(){.  g.json.
07d0: 72 65 73 75 6c 74 43 6f 64 65 20 3d 20 46 53 4c  resultCode = FSL
07e0: 5f 4a 53 4f 4e 5f 45 5f 4e 59 49 3b 0a 20 20 72  _JSON_E_NYI;.  r
07f0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a 0a 2f  eturn NULL;.}../
0800: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 46 6f 73  *.** Given a Fos
0810: 73 69 6c 4a 73 6f 6e 43 6f 64 65 73 20 76 61 6c  silJsonCodes val
0820: 75 65 2c 20 69 74 20 72 65 74 75 72 6e 73 20 61  ue, it returns a
0830: 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65   string suitable
0840: 20 66 6f 72 20 75 73 65 0a 2a 2a 20 61 73 20 61   for use.** as a
0850: 20 72 65 73 75 6c 74 43 6f 64 65 20 73 74 72 69   resultCode stri
0860: 6e 67 2e 20 52 65 74 75 72 6e 73 20 73 6f 6d 65  ng. Returns some
0870: 20 75 6e 73 70 65 63 69 66 69 65 64 20 6e 6f 6e   unspecified non
0880: 2d 65 6d 70 74 79 20 73 74 72 69 6e 67 0a 2a 2a  -empty string.**
0890: 20 69 66 20 65 72 72 43 6f 64 65 20 69 73 20 6e   if errCode is n
08a0: 6f 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 46 6f  ot one of the Fo
08b0: 73 73 69 6c 4a 73 6f 6e 43 6f 64 65 73 20 76 61  ssilJsonCodes va
08c0: 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lues..*/.static 
08d0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 6a 73 6f  char const * jso
08e0: 6e 5f 65 72 72 5f 63 73 74 72 28 20 69 6e 74 20  n_err_cstr( int 
08f0: 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 73 77 69  errCode ){.  swi
0900: 74 63 68 28 20 65 72 72 43 6f 64 65 20 29 7b 0a  tch( errCode ){.
0910: 20 20 20 20 63 61 73 65 20 30 3a 20 72 65 74 75      case 0: retu
0920: 72 6e 20 22 53 75 63 63 65 73 73 22 3b 0a 23 64  rn "Success";.#d
0930: 65 66 69 6e 65 20 43 28 58 2c 56 29 20 63 61 73  efine C(X,V) cas
0940: 65 20 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 20 23 23  e FSL_JSON_E_ ##
0950: 20 58 3a 20 72 65 74 75 72 6e 20 56 0a 0a 20 20   X: return V..  
0960: 20 20 43 28 47 45 4e 45 52 49 43 2c 22 47 65 6e    C(GENERIC,"Gen
0970: 65 72 69 63 20 65 72 72 6f 72 22 29 3b 0a 20 20  eric error");.  
0980: 20 20 43 28 49 4e 56 41 4c 49 44 5f 52 45 51 55    C(INVALID_REQU
0990: 45 53 54 2c 22 49 6e 76 61 6c 69 64 20 72 65 71  EST,"Invalid req
09a0: 75 65 73 74 22 29 3b 0a 20 20 20 20 43 28 55 4e  uest");.    C(UN
09b0: 4b 4e 4f 57 4e 5f 43 4f 4d 4d 41 4e 44 2c 22 55  KNOWN_COMMAND,"U
09c0: 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 20 6f  nknown command o
09d0: 72 20 73 75 62 63 6f 6d 6d 61 6e 64 22 29 3b 0a  r subcommand");.
09e0: 20 20 20 20 43 28 55 4e 4b 4e 4f 57 4e 2c 22 55      C(UNKNOWN,"U
09f0: 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 29 3b 0a  nknown error");.
0a00: 20 20 20 20 43 28 54 49 4d 45 4f 55 54 2c 22 54      C(TIMEOUT,"T
0a10: 69 6d 65 6f 75 74 20 72 65 61 63 68 65 64 22 29  imeout reached")
0a20: 3b 0a 20 20 20 20 43 28 41 53 53 45 52 54 2c 22  ;.    C(ASSERT,"
0a30: 41 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 65 64  Assertion failed
0a40: 22 29 3b 0a 20 20 20 20 43 28 41 4c 4c 4f 43 2c  ");.    C(ALLOC,
0a50: 22 52 65 73 6f 75 72 63 65 20 61 6c 6c 6f 63 61  "Resource alloca
0a60: 74 69 6f 6e 20 66 61 69 6c 65 64 22 29 3b 0a 20  tion failed");. 
0a70: 20 20 20 43 28 4e 59 49 2c 22 4e 6f 74 20 79 65     C(NYI,"Not ye
0a80: 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 22 29 3b  t implemented");
0a90: 0a 20 20 20 20 43 28 50 41 4e 49 43 2c 22 78 22  .    C(PANIC,"x"
0aa0: 29 3b 0a 20 20 20 20 43 28 4d 41 4e 49 46 45 53  );.    C(MANIFES
0ab0: 54 5f 52 45 41 44 5f 46 41 49 4c 45 44 2c 22 52  T_READ_FAILED,"R
0ac0: 65 61 64 69 6e 67 20 61 72 74 69 66 61 63 74 20  eading artifact 
0ad0: 6d 61 6e 69 66 65 73 74 20 66 61 69 6c 65 64 22  manifest failed"
0ae0: 29 3b 0a 20 20 20 20 43 28 46 49 4c 45 5f 4f 50  );.    C(FILE_OP
0af0: 45 4e 5f 46 41 49 4c 45 44 2c 22 4f 70 65 6e 69  EN_FAILED,"Openi
0b00: 6e 67 20 66 69 6c 65 20 66 61 69 6c 65 64 22 29  ng file failed")
0b10: 3b 0a 0a 20 20 20 20 43 28 41 55 54 48 2c 22 41  ;..    C(AUTH,"A
0b20: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 72  uthentication er
0b30: 72 6f 72 22 29 3b 0a 20 20 20 20 43 28 4d 49 53  ror");.    C(MIS
0b40: 53 49 4e 47 5f 41 55 54 48 2c 22 41 75 74 68 65  SING_AUTH,"Authe
0b50: 6e 74 69 63 61 74 69 6f 6e 20 69 6e 66 6f 20 6d  ntication info m
0b60: 69 73 73 69 6e 67 20 66 72 6f 6d 20 72 65 71 75  issing from requ
0b70: 65 73 74 22 29 3b 0a 20 20 20 20 43 28 44 45 4e  est");.    C(DEN
0b80: 49 45 44 2c 22 41 63 63 65 73 73 20 64 65 6e 69  IED,"Access deni
0b90: 65 64 22 29 3b 0a 20 20 20 20 43 28 57 52 4f 4e  ed");.    C(WRON
0ba0: 47 5f 4d 4f 44 45 2c 22 52 65 71 75 65 73 74 20  G_MODE,"Request 
0bb0: 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 28 77 72 6f  not allowed (wro
0bc0: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 6d 6f 64  ng operation mod
0bd0: 65 29 22 29 3b 0a 20 20 20 20 43 28 4c 4f 47 49  e)");.    C(LOGI
0be0: 4e 5f 46 41 49 4c 45 44 2c 22 4c 6f 67 69 6e 20  N_FAILED,"Login 
0bf0: 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 43 28  failed");.    C(
0c00: 4c 4f 47 49 4e 5f 46 41 49 4c 45 44 5f 4e 4f 53  LOGIN_FAILED_NOS
0c10: 45 45 44 2c 22 41 6e 6f 6e 79 6d 6f 75 73 20 6c  EED,"Anonymous l
0c20: 6f 67 69 6e 20 61 74 74 65 6d 70 74 20 77 61 73  ogin attempt was
0c30: 20 6d 69 73 73 69 6e 67 20 70 61 73 73 77 6f 72   missing passwor
0c40: 64 20 73 65 65 64 22 29 3b 0a 20 20 20 20 43 28  d seed");.    C(
0c50: 4c 4f 47 49 4e 5f 46 41 49 4c 45 44 5f 4e 4f 4e  LOGIN_FAILED_NON
0c60: 41 4d 45 2c 22 4c 6f 67 69 6e 20 66 61 69 6c 65  AME,"Login faile
0c70: 64 20 2d 20 6e 61 6d 65 20 6e 6f 74 20 73 75 70  d - name not sup
0c80: 70 6c 69 65 64 22 29 3b 0a 20 20 20 20 43 28 4c  plied");.    C(L
0c90: 4f 47 49 4e 5f 46 41 49 4c 45 44 5f 4e 4f 50 57  OGIN_FAILED_NOPW
0ca0: 2c 22 4c 6f 67 69 6e 20 66 61 69 6c 65 64 20 2d  ,"Login failed -
0cb0: 20 70 61 73 73 77 6f 72 64 20 6e 6f 74 20 73 75   password not su
0cc0: 70 70 6c 69 65 64 22 29 3b 0a 20 20 20 20 43 28  pplied");.    C(
0cd0: 4c 4f 47 49 4e 5f 46 41 49 4c 45 44 5f 4e 4f 54  LOGIN_FAILED_NOT
0ce0: 46 4f 55 4e 44 2c 22 4c 6f 67 69 6e 20 66 61 69  FOUND,"Login fai
0cf0: 6c 65 64 20 2d 20 6e 6f 20 6d 61 74 63 68 20 66  led - no match f
0d00: 6f 75 6e 64 22 29 3b 0a 0a 20 20 20 20 43 28 55  ound");..    C(U
0d10: 53 41 47 45 2c 22 55 73 61 67 65 20 65 72 72 6f  SAGE,"Usage erro
0d20: 72 22 29 3b 0a 20 20 20 20 43 28 49 4e 56 41 4c  r");.    C(INVAL
0d30: 49 44 5f 41 52 47 53 2c 22 49 6e 76 61 6c 69 64  ID_ARGS,"Invalid
0d40: 20 61 72 67 75 6d 65 6e 74 28 73 29 22 29 3b 0a   argument(s)");.
0d50: 20 20 20 20 43 28 4d 49 53 53 49 4e 47 5f 41 52      C(MISSING_AR
0d60: 47 53 2c 22 4d 69 73 73 69 6e 67 20 61 72 67 75  GS,"Missing argu
0d70: 6d 65 6e 74 28 73 29 22 29 3b 0a 20 20 20 20 43  ment(s)");.    C
0d80: 28 41 4d 42 49 47 55 4f 55 53 5f 55 55 49 44 2c  (AMBIGUOUS_UUID,
0d90: 22 52 65 73 6f 75 72 63 65 20 69 64 65 6e 74 69  "Resource identi
0da0: 66 69 65 72 20 69 73 20 61 6d 62 69 67 75 6f 75  fier is ambiguou
0db0: 73 22 29 3b 0a 20 20 20 20 43 28 55 4e 52 45 53  s");.    C(UNRES
0dc0: 4f 4c 56 45 44 5f 55 55 49 44 2c 22 50 72 6f 76  OLVED_UUID,"Prov
0dd0: 69 64 65 64 20 75 75 69 64 2f 74 61 67 2f 62 72  ided uuid/tag/br
0de0: 61 6e 63 68 20 63 6f 75 6c 64 20 6e 6f 74 20 62  anch could not b
0df0: 65 20 72 65 73 6f 6c 76 65 64 22 29 3b 0a 20 20  e resolved");.  
0e00: 20 20 43 28 52 45 53 4f 55 52 43 45 5f 41 4c 52    C(RESOURCE_ALR
0e10: 45 41 44 59 5f 45 58 49 53 54 53 2c 22 52 65 73  EADY_EXISTS,"Res
0e20: 6f 75 72 63 65 20 61 6c 72 65 61 64 79 20 65 78  ource already ex
0e30: 69 73 74 73 22 29 3b 0a 20 20 20 20 43 28 52 45  ists");.    C(RE
0e40: 53 4f 55 52 43 45 5f 4e 4f 54 5f 46 4f 55 4e 44  SOURCE_NOT_FOUND
0e50: 2c 22 52 65 73 6f 75 72 63 65 20 6e 6f 74 20 66  ,"Resource not f
0e60: 6f 75 6e 64 22 29 3b 0a 0a 20 20 20 20 43 28 44  ound");..    C(D
0e70: 42 2c 22 44 61 74 61 62 61 73 65 20 65 72 72 6f  B,"Database erro
0e80: 72 22 29 3b 0a 20 20 20 20 43 28 53 54 4d 54 5f  r");.    C(STMT_
0e90: 50 52 45 50 2c 22 53 74 61 74 65 6d 65 6e 74 20  PREP,"Statement 
0ea0: 70 72 65 70 61 72 61 74 69 6f 6e 20 66 61 69 6c  preparation fail
0eb0: 65 64 22 29 3b 0a 20 20 20 20 43 28 53 54 4d 54  ed");.    C(STMT
0ec0: 5f 42 49 4e 44 2c 22 53 74 61 74 65 6d 65 6e 74  _BIND,"Statement
0ed0: 20 70 61 72 61 6d 65 74 65 72 20 62 69 6e 64 69   parameter bindi
0ee0: 6e 67 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20  ng failed");.   
0ef0: 20 43 28 53 54 4d 54 5f 45 58 45 43 2c 22 53 74   C(STMT_EXEC,"St
0f00: 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 69 6f  atement executio
0f10: 6e 2f 73 74 65 70 70 69 6e 67 20 66 61 69 6c 65  n/stepping faile
0f20: 64 22 29 3b 0a 20 20 20 20 43 28 44 42 5f 4c 4f  d");.    C(DB_LO
0f30: 43 4b 45 44 2c 22 44 61 74 61 62 61 73 65 20 69  CKED,"Database i
0f40: 73 20 6c 6f 63 6b 65 64 22 29 3b 0a 20 20 20 20  s locked");.    
0f50: 43 28 44 42 5f 4e 45 45 44 53 5f 52 45 42 55 49  C(DB_NEEDS_REBUI
0f60: 4c 44 2c 22 46 6f 73 73 69 6c 20 72 65 70 6f 73  LD,"Fossil repos
0f70: 69 74 6f 72 79 20 6e 65 65 64 73 20 74 6f 20 62  itory needs to b
0f80: 65 20 72 65 62 75 69 6c 74 22 29 3b 0a 20 20 20  e rebuilt");.   
0f90: 20 43 28 44 42 5f 4e 4f 54 5f 46 4f 55 4e 44 2c   C(DB_NOT_FOUND,
0fa0: 22 46 6f 73 73 69 6c 20 72 65 70 6f 73 69 74 6f  "Fossil reposito
0fb0: 72 79 20 64 62 20 66 69 6c 65 20 63 6f 75 6c 64  ry db file could
0fc0: 20 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 22 29   not be found.")
0fd0: 3b 0a 20 20 20 20 43 28 44 42 5f 4e 4f 54 5f 56  ;.    C(DB_NOT_V
0fe0: 41 4c 49 44 2c 20 22 46 6f 73 73 69 6c 20 72 65  ALID, "Fossil re
0ff0: 70 6f 73 69 74 6f 72 79 20 64 62 20 66 69 6c 65  pository db file
1000: 20 69 73 20 6e 6f 74 20 76 61 6c 69 64 2e 22 29   is not valid.")
1010: 3b 0a 20 20 20 20 43 28 44 42 5f 4e 45 45 44 53  ;.    C(DB_NEEDS
1020: 5f 43 48 45 43 4b 4f 55 54 2c 20 22 43 6f 6d 6d  _CHECKOUT, "Comm
1030: 61 6e 64 20 72 65 71 75 69 72 65 73 20 61 20 6c  and requires a l
1040: 6f 63 61 6c 20 63 68 65 63 6b 6f 75 74 2e 22 29  ocal checkout.")
1050: 3b 0a 23 75 6e 64 65 66 20 43 0a 20 20 20 20 64  ;.#undef C.    d
1060: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
1070: 74 75 72 6e 20 22 55 6e 6b 6e 6f 77 6e 20 45 72  turn "Unknown Er
1080: 72 6f 72 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ror";.  }.}../*.
1090: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** Implements th
10a0: 65 20 63 73 6f 6e 5f 64 61 74 61 5f 64 65 73 74  e cson_data_dest
10b0: 5f 66 28 29 20 69 6e 74 65 72 66 61 63 65 20 61  _f() interface a
10c0: 6e 64 20 6f 75 74 70 75 74 73 20 74 68 65 20 64  nd outputs the d
10d0: 61 74 61 20 74 6f 0a 2a 2a 20 61 20 66 6f 73 73  ata to.** a foss
10e0: 69 6c 20 42 6c 6f 62 20 6f 62 6a 65 63 74 2e 20  il Blob object. 
10f0: 20 70 53 74 61 74 65 20 6d 75 73 74 20 62 65 2d   pState must be-
1100: 61 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 28 42  a initialized (B
1110: 6c 6f 62 2a 29 2c 20 74 6f 0a 2a 2a 20 77 68 69  lob*), to.** whi
1120: 63 68 20 6e 20 62 79 74 65 73 20 6f 66 20 73 72  ch n bytes of sr
1130: 63 20 77 69 6c 6c 20 62 65 20 61 70 70 65 6e 64  c will be append
1140: 65 64 2e 0a 2a 2a 2f 0a 69 6e 74 20 63 73 6f 6e  ed..**/.int cson
1150: 5f 64 61 74 61 5f 64 65 73 74 5f 42 6c 6f 62 28  _data_dest_Blob(
1160: 76 6f 69 64 20 2a 20 70 53 74 61 74 65 2c 20 76  void * pState, v
1170: 6f 69 64 20 63 6f 6e 73 74 20 2a 20 73 72 63 2c  oid const * src,
1180: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 29   unsigned int n)
1190: 7b 0a 20 20 42 6c 6f 62 20 2a 20 62 20 3d 20 28  {.  Blob * b = (
11a0: 42 6c 6f 62 2a 29 70 53 74 61 74 65 3b 0a 20 20  Blob*)pState;.  
11b0: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 20 62 2c 20  blob_append( b, 
11c0: 28 63 68 61 72 20 63 6f 6e 73 74 20 2a 29 73 72  (char const *)sr
11d0: 63 2c 20 28 69 6e 74 29 6e 20 29 20 2f 2a 20 77  c, (int)n ) /* w
11e0: 69 6c 6c 20 64 69 65 20 6f 6e 20 4f 4f 4d 20 2a  ill die on OOM *
11f0: 2f 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  /;.  return 0;.}
1200: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1210: 74 73 20 74 68 65 20 63 73 6f 6e 5f 64 61 74 61  ts the cson_data
1220: 5f 73 6f 75 72 63 65 5f 66 28 29 20 69 6e 74 65  _source_f() inte
1230: 72 66 61 63 65 20 61 6e 64 20 72 65 61 64 73 20  rface and reads 
1240: 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 61 20  input from.** a 
1250: 66 6f 73 73 69 6c 20 42 6c 6f 62 20 6f 62 6a 65  fossil Blob obje
1260: 63 74 2e 20 70 53 74 61 74 65 20 6d 75 73 74 20  ct. pState must 
1270: 62 65 2d 61 20 28 42 6c 6f 62 2a 29 20 70 6f 70  be-a (Blob*) pop
1280: 75 6c 61 74 65 64 20 77 69 74 68 20 4a 53 4f 4e  ulated with JSON
1290: 0a 2a 2a 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74  .** data..*/.int
12a0: 20 63 73 6f 6e 5f 64 61 74 61 5f 73 72 63 5f 42   cson_data_src_B
12b0: 6c 6f 62 28 76 6f 69 64 20 2a 20 70 53 74 61 74  lob(void * pStat
12c0: 65 2c 20 76 6f 69 64 20 2a 20 64 65 73 74 2c 20  e, void * dest, 
12d0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 20 6e  unsigned int * n
12e0: 29 7b 0a 20 20 42 6c 6f 62 20 2a 20 62 20 3d 20  ){.  Blob * b = 
12f0: 28 42 6c 6f 62 2a 29 70 53 74 61 74 65 3b 0a 20  (Blob*)pState;. 
1300: 20 2a 6e 20 3d 20 62 6c 6f 62 5f 72 65 61 64 28   *n = blob_read(
1310: 20 62 2c 20 64 65 73 74 2c 20 2a 6e 20 29 3b 0a   b, dest, *n );.
1320: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1330: 2a 0a 2a 2a 20 43 6f 6e 76 65 6e 69 65 6e 63 65  *.** Convenience
1340: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
1350: 63 73 6f 6e 5f 6f 75 74 70 75 74 28 29 20 77 68  cson_output() wh
1360: 69 63 68 20 61 70 70 65 6e 64 73 20 74 68 65 20  ich appends the 
1370: 6f 75 74 70 75 74 0a 2a 2a 20 74 6f 20 70 44 65  output.** to pDe
1380: 73 74 2e 20 70 4f 70 74 20 6d 61 79 20 62 65 20  st. pOpt may be 
1390: 4e 55 4c 4c 2c 20 69 6e 20 77 68 69 63 68 20 63  NULL, in which c
13a0: 61 73 65 20 67 2e 6a 73 6f 6e 2e 6f 75 74 4f 70  ase g.json.outOp
13b0: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a  t will be used..
13c0: 2a 2f 0a 69 6e 74 20 63 73 6f 6e 5f 6f 75 74 70  */.int cson_outp
13d0: 75 74 5f 42 6c 6f 62 28 20 63 73 6f 6e 5f 76 61  ut_Blob( cson_va
13e0: 6c 75 65 20 63 6f 6e 73 74 20 2a 20 70 56 61 6c  lue const * pVal
13f0: 2c 20 42 6c 6f 62 20 2a 20 70 44 65 73 74 2c 20  , Blob * pDest, 
1400: 63 73 6f 6e 5f 6f 75 74 70 75 74 5f 6f 70 74 20  cson_output_opt 
1410: 63 6f 6e 73 74 20 2a 20 70 4f 70 74 20 29 7b 0a  const * pOpt ){.
1420: 20 20 72 65 74 75 72 6e 20 63 73 6f 6e 5f 6f 75    return cson_ou
1430: 74 70 75 74 28 20 70 56 61 6c 2c 20 63 73 6f 6e  tput( pVal, cson
1440: 5f 64 61 74 61 5f 64 65 73 74 5f 42 6c 6f 62 2c  _data_dest_Blob,
1450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1460: 20 20 20 20 20 20 20 70 44 65 73 74 2c 20 70 4f         pDest, pO
1470: 70 74 20 3f 20 70 4f 70 74 20 3a 20 26 67 2e 6a  pt ? pOpt : &g.j
1480: 73 6f 6e 2e 6f 75 74 4f 70 74 20 29 3b 0a 7d 0a  son.outOpt );.}.
1490: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 6e 69 65 6e  ./*.** Convenien
14a0: 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  ce wrapper aroun
14b0: 64 20 63 73 6f 6e 5f 70 61 72 73 65 28 29 20 77  d cson_parse() w
14c0: 68 69 63 68 20 72 65 61 64 73 20 69 74 73 20 69  hich reads its i
14d0: 6e 70 75 74 0a 2a 2a 20 66 72 6f 6d 20 70 53 72  nput.** from pSr
14e0: 63 2e 20 70 53 72 63 20 69 73 20 72 65 77 6f 75  c. pSrc is rewou
14f0: 6e 64 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e  nd before parsin
1500: 67 2e 0a 2a 2a 0a 2a 2a 20 70 49 6e 66 6f 20 6d  g..**.** pInfo m
1510: 61 79 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20 69  ay be NULL. If i
1520: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  t is not NULL th
1530: 65 6e 20 69 74 20 77 69 6c 6c 20 63 6f 6e 74 61  en it will conta
1540: 69 6e 20 64 65 74 61 69 6c 73 0a 2a 2a 20 61 62  in details.** ab
1550: 6f 75 74 20 74 68 65 20 70 61 72 73 65 20 73 74  out the parse st
1560: 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
1570: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
1580: 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
1590: 20 61 20 6e 65 77 20 4a 53 4f 4e 20 4f 62 6a 65   a new JSON Obje
15a0: 63 74 20 6f 72 20 41 72 72 61 79 20 69 73 20 72  ct or Array is r
15b0: 65 74 75 72 6e 65 64 20 28 6f 77 6e 65 64 20 62  eturned (owned b
15c0: 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 29  y the.** caller)
15d0: 2e 20 4f 6e 20 65 72 72 6f 72 20 4e 55 4c 4c 20  . On error NULL 
15e0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
15f0: 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 63 73 6f  cson_value * cso
1600: 6e 5f 70 61 72 73 65 5f 42 6c 6f 62 28 20 42 6c  n_parse_Blob( Bl
1610: 6f 62 20 2a 20 70 53 72 63 2c 20 63 73 6f 6e 5f  ob * pSrc, cson_
1620: 70 61 72 73 65 5f 69 6e 66 6f 20 2a 20 70 49 6e  parse_info * pIn
1630: 66 6f 20 29 7b 0a 20 20 63 73 6f 6e 5f 76 61 6c  fo ){.  cson_val
1640: 75 65 20 2a 20 72 6f 6f 74 20 3d 20 4e 55 4c 4c  ue * root = NULL
1650: 3b 0a 20 20 62 6c 6f 62 5f 72 65 77 69 6e 64 28  ;.  blob_rewind(
1660: 20 70 53 72 63 20 29 3b 0a 20 20 63 73 6f 6e 5f   pSrc );.  cson_
1670: 70 61 72 73 65 28 20 26 72 6f 6f 74 2c 20 63 73  parse( &root, cs
1680: 6f 6e 5f 64 61 74 61 5f 73 72 63 5f 42 6c 6f 62  on_data_src_Blob
1690: 2c 20 70 53 72 63 2c 20 4e 55 4c 4c 2c 20 70 49  , pSrc, NULL, pI
16a0: 6e 66 6f 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  nfo );.  return 
16b0: 72 6f 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  root;.}../*.** I
16c0: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 63 73  mplements the cs
16d0: 6f 6e 5f 64 61 74 61 5f 64 65 73 74 5f 66 28 29  on_data_dest_f()
16e0: 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 20 6f   interface and o
16f0: 75 74 70 75 74 73 20 74 68 65 20 64 61 74 61 20  utputs the data 
1700: 74 6f 0a 2a 2a 20 63 67 69 5f 61 70 70 65 6e 64  to.** cgi_append
1710: 5f 63 6f 6e 74 65 6e 74 28 29 2e 20 70 53 74 61  _content(). pSta
1720: 74 65 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  te is ignored..*
1730: 2a 2f 0a 69 6e 74 20 63 73 6f 6e 5f 64 61 74 61  */.int cson_data
1740: 5f 64 65 73 74 5f 63 67 69 28 76 6f 69 64 20 2a  _dest_cgi(void *
1750: 20 70 53 74 61 74 65 2c 20 76 6f 69 64 20 63 6f   pState, void co
1760: 6e 73 74 20 2a 20 73 72 63 2c 20 75 6e 73 69 67  nst * src, unsig
1770: 6e 65 64 20 69 6e 74 20 6e 29 7b 0a 20 20 63 67  ned int n){.  cg
1780: 69 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74  i_append_content
1790: 28 20 28 63 68 61 72 20 63 6f 6e 73 74 20 2a 29  ( (char const *)
17a0: 73 72 63 2c 20 28 69 6e 74 29 6e 20 29 3b 0a 20  src, (int)n );. 
17b0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
17c0: 0a 2a 2a 20 52 65 74 75 72 6e 73 20 61 20 73 74  .** Returns a st
17d0: 72 69 6e 67 20 69 6e 20 74 68 65 20 66 6f 72 6d  ring in the form
17e0: 20 46 4f 53 53 49 4c 2d 58 58 58 58 2c 20 77 68   FOSSIL-XXXX, wh
17f0: 65 72 65 20 58 58 58 58 20 69 73 20 61 0a 2a 2a  ere XXXX is a.**
1800: 20 6c 65 66 74 2d 7a 65 72 6f 2d 70 61 64 64 65   left-zero-padde
1810: 64 20 76 61 6c 75 65 20 6f 66 20 63 6f 64 65 2e  d value of code.
1820: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 62 75   The returned bu
1830: 66 66 65 72 20 69 73 20 73 74 61 74 69 63 2c 20  ffer is static, 
1840: 61 6e 64 0a 2a 2a 20 6d 75 73 74 20 62 65 20 63  and.** must be c
1850: 6f 70 69 65 64 20 69 66 20 6e 65 65 64 65 64 20  opied if needed 
1860: 66 6f 72 20 6c 61 74 65 72 2e 20 20 54 68 65 20  for later.  The 
1870: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 77  returned value w
1880: 69 6c 6c 20 61 6c 77 61 79 73 0a 2a 2a 20 62 65  ill always.** be
1890: 20 31 31 20 62 79 74 65 73 20 6c 6f 6e 67 20 28   11 bytes long (
18a0: 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  not including th
18b0: 65 20 74 72 61 69 6c 69 6e 67 20 4e 55 4c 20 62  e trailing NUL b
18c0: 79 74 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 70  yte)..**.** In p
18d0: 72 61 63 74 69 63 65 20 77 65 20 77 69 6c 6c 20  ractice we will 
18e0: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 20 74  only ever call t
18f0: 68 69 73 20 6f 6e 65 20 74 69 6d 65 20 70 65 72  his one time per
1900: 20 61 70 70 20 65 78 65 63 75 74 69 6f 6e 0a 2a   app execution.*
1910: 2a 20 77 68 65 6e 20 63 6f 6e 73 74 72 75 63 74  * when construct
1920: 69 6e 67 20 74 68 65 20 4a 53 4f 4e 20 72 65 73  ing the JSON res
1930: 70 6f 6e 73 65 20 65 6e 76 65 6c 6f 70 65 2c 20  ponse envelope, 
1940: 73 6f 20 74 68 65 20 73 74 61 74 69 63 20 62 75  so the static bu
1950: 66 66 65 72 0a 2a 2a 20 22 73 68 6f 75 6c 64 6e  ffer.** "shouldn
1960: 27 74 22 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  't" be a problem
1970: 2e 0a 2a 2a 0a 2a 2f 0a 63 68 61 72 20 63 6f 6e  ..**.*/.char con
1980: 73 74 20 2a 20 6a 73 6f 6e 5f 72 63 5f 63 73 74  st * json_rc_cst
1990: 72 28 20 69 6e 74 20 63 6f 64 65 20 29 7b 0a 20  r( int code ){. 
19a0: 20 65 6e 75 6d 20 7b 20 42 75 66 53 69 7a 65 20   enum { BufSize 
19b0: 3d 20 31 32 20 7d 3b 0a 20 20 73 74 61 74 69 63  = 12 };.  static
19c0: 20 63 68 61 72 20 62 75 66 5b 42 75 66 53 69 7a   char buf[BufSiz
19d0: 65 5d 20 3d 20 7b 27 46 27 2c 27 4f 27 2c 27 53  e] = {'F','O','S
19e0: 27 2c 27 53 27 2c 27 49 27 2c 27 4c 27 2c 27 2d  ','S','I','L','-
19f0: 27 2c 30 7d 3b 0a 20 20 61 73 73 65 72 74 28 28  ',0};.  assert((
1a00: 63 6f 64 65 20 3e 3d 20 31 30 30 30 29 20 26 26  code >= 1000) &&
1a10: 20 28 63 6f 64 65 20 3c 3d 20 39 39 39 39 29 20   (code <= 9999) 
1a20: 26 26 20 22 49 6e 76 61 6c 69 64 20 46 6f 73 73  && "Invalid Foss
1a30: 69 6c 2f 4a 53 4f 4e 20 63 6f 64 65 2e 22 29 3b  il/JSON code.");
1a40: 0a 20 20 73 70 72 69 6e 74 66 28 62 75 66 2b 37  .  sprintf(buf+7
1a50: 2c 22 25 30 34 64 22 2c 20 63 6f 64 65 29 3b 0a  ,"%04d", code);.
1a60: 20 20 72 65 74 75 72 6e 20 62 75 66 3b 0a 7d 0a    return buf;.}.
1a70: 0a 2f 2a 0a 2a 2a 20 41 64 64 73 20 76 20 74 6f  ./*.** Adds v to
1a80: 20 74 68 65 20 41 50 49 2d 69 6e 74 65 72 6e 61   the API-interna
1a90: 6c 20 63 6c 65 61 6e 75 70 20 6d 65 63 68 61 6e  l cleanup mechan
1aa0: 69 73 6d 2e 20 6b 65 79 20 69 73 20 69 67 6e 6f  ism. key is igno
1ab0: 72 65 64 0a 2a 2a 20 28 6c 65 67 61 63 79 29 20  red.** (legacy) 
1ac0: 62 75 74 20 6d 69 67 68 74 20 62 65 20 72 65 2d  but might be re-
1ad0: 69 6e 74 72 6f 64 75 63 65 64 20 61 6e 64 20 22  introduced and "
1ae0: 73 68 6f 75 6c 64 22 20 62 65 20 61 20 75 6e 69  should" be a uni
1af0: 71 75 65 0a 2a 2a 20 28 61 70 70 2d 77 69 64 65  que.** (app-wide
1b00: 29 20 76 61 6c 75 65 2e 20 20 46 61 69 6c 75 72  ) value.  Failur
1b10: 65 20 74 6f 20 69 6e 73 65 72 74 20 61 6e 20 69  e to insert an i
1b20: 74 65 6d 20 6d 61 79 20 62 65 20 63 61 75 73 65  tem may be cause
1b30: 64 20 62 79 20 61 6e 79 0a 2a 2a 20 6f 66 20 74  d by any.** of t
1b40: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
1b50: 0a 2a 2a 20 2d 20 41 6c 6c 6f 63 61 74 69 6f 6e  .** - Allocation
1b60: 20 65 72 72 6f 72 2e 0a 2a 2a 20 2d 20 67 2e 6a   error..** - g.j
1b70: 73 6f 6e 2e 67 63 2e 61 20 69 73 20 4e 55 4c 4c  son.gc.a is NULL
1b80: 0a 2a 2a 20 2d 20 6b 65 79 20 69 73 20 4e 55 4c  .** - key is NUL
1b90: 4c 20 6f 72 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  L or empty..**.*
1ba0: 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73  * Returns 0 on s
1bb0: 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 77  uccess..**.** Ow
1bc0: 6e 65 72 73 68 69 70 20 6f 66 20 76 20 69 73 20  nership of v is 
1bd0: 74 72 61 6e 73 66 65 72 65 64 20 74 6f 20 28 6f  transfered to (o
1be0: 72 20 73 68 61 72 65 64 20 77 69 74 68 29 20 67  r shared with) g
1bf0: 2e 6a 73 6f 6e 2e 67 63 2c 20 61 6e 64 20 76 0a  .json.gc, and v.
1c00: 2a 2a 20 77 69 6c 6c 20 62 65 20 76 61 6c 69 64  ** will be valid
1c10: 20 75 6e 74 69 6c 20 74 68 61 74 20 6f 62 6a 65   until that obje
1c20: 63 74 20 69 73 20 63 6c 65 61 6e 65 64 20 75 70  ct is cleaned up
1c30: 20 6f 72 20 73 6f 6d 65 20 69 6e 74 65 72 6e 61   or some interna
1c40: 6c 20 63 6f 64 65 0a 2a 2a 20 69 6e 63 6f 72 72  l code.** incorr
1c50: 65 63 74 6c 79 20 72 65 6d 6f 76 65 73 20 69 74  ectly removes it
1c60: 20 66 72 6f 6d 20 74 68 65 20 67 63 20 28 77 68   from the gc (wh
1c70: 69 63 68 20 77 65 20 6e 65 76 65 72 20 64 6f 29  ich we never do)
1c80: 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 66 75 6e  . If this.** fun
1c90: 63 74 69 6f 6e 20 66 61 69 6c 73 2c 20 69 74 20  ction fails, it 
1ca0: 69 73 20 66 61 74 61 6c 20 74 6f 20 74 68 65 20  is fatal to the 
1cb0: 61 70 70 20 28 61 73 20 69 74 20 69 6e 64 69 63  app (as it indic
1cc0: 61 74 65 73 20 61 6e 0a 2a 2a 20 61 6c 6c 6f 63  ates an.** alloc
1cd0: 61 74 69 6f 6e 20 65 72 72 6f 72 20 28 6d 6f 72  ation error (mor
1ce0: 65 20 6c 69 6b 65 6c 79 20 74 68 61 6e 20 6e 6f  e likely than no
1cf0: 74 29 20 6f 72 20 61 20 73 65 72 69 6f 75 73 20  t) or a serious 
1d00: 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 0a 2a  internal error.*
1d10: 2a 20 73 75 63 68 20 61 73 20 6e 75 6d 65 72 69  * such as numeri
1d20: 63 20 6f 76 65 72 66 6c 6f 77 29 2e 0a 2a 2f 0a  c overflow)..*/.
1d30: 76 6f 69 64 20 6a 73 6f 6e 5f 67 63 5f 61 64 64  void json_gc_add
1d40: 28 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 6b  ( char const * k
1d50: 65 79 2c 20 63 73 6f 6e 5f 76 61 6c 75 65 20 2a  ey, cson_value *
1d60: 20 76 20 29 7b 0a 20 20 69 6e 74 20 63 6f 6e 73   v ){.  int cons
1d70: 74 20 72 63 20 3d 20 63 73 6f 6e 5f 61 72 72 61  t rc = cson_arra
1d80: 79 5f 61 70 70 65 6e 64 28 20 67 2e 6a 73 6f 6e  y_append( g.json
1d90: 2e 67 63 2e 61 2c 20 76 20 29 3b 0a 0a 20 20 61  .gc.a, v );..  a
1da0: 73 73 65 72 74 28 20 4e 55 4c 4c 20 21 3d 20 67  ssert( NULL != g
1db0: 2e 6a 73 6f 6e 2e 67 63 2e 61 20 29 3b 0a 20 20  .json.gc.a );.  
1dc0: 69 66 28 20 30 20 21 3d 20 72 63 20 29 7b 0a 20  if( 0 != rc ){. 
1dd0: 20 20 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 66 72     cson_value_fr
1de0: 65 65 28 20 76 20 29 3b 0a 20 20 7d 0a 20 20 61  ee( v );.  }.  a
1df0: 73 73 65 72 74 28 20 28 30 3d 3d 72 63 29 20 26  ssert( (0==rc) &
1e00: 26 20 22 41 64 64 69 6e 67 20 69 74 65 6d 20 74  & "Adding item t
1e10: 6f 20 47 43 20 66 61 69 6c 65 64 2e 22 20 29 3b  o GC failed." );
1e20: 0a 20 20 69 66 28 30 21 3d 72 63 29 7b 0a 20 20  .  if(0!=rc){.  
1e30: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1e40: 2c 22 25 73 3a 20 46 41 54 41 4c 3a 20 61 6c 6c  ,"%s: FATAL: all
1e50: 6f 63 20 65 72 72 6f 72 2e 5c 6e 22 2c 20 67 2e  oc error.\n", g.
1e60: 61 72 67 76 5b 30 5d 29 0a 20 20 20 20 20 20 20  argv[0]).       
1e70: 20 2f 2a 20 72 65 6d 69 6e 64 65 72 3a 20 61 6c   /* reminder: al
1e80: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 69  location error i
1e90: 73 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f  s the only reaso
1ea0: 6e 61 62 6c 65 20 63 61 75 73 65 20 6f 66 0a 20  nable cause of. 
1eb0: 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
1ec0: 68 65 72 65 2c 20 70 72 6f 76 69 64 65 64 20 67  here, provided g
1ed0: 2e 6a 73 6f 6e 2e 67 63 2e 61 20 61 6e 64 20 76  .json.gc.a and v
1ee0: 20 61 72 65 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20   are not NULL.. 
1ef0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1f00: 20 20 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 65    ;.    fossil_e
1f10: 78 69 74 28 31 29 2f 2a 6e 6f 74 20 66 6f 73 73  xit(1)/*not foss
1f20: 69 6c 5f 70 61 6e 69 63 28 29 20 62 2f 63 20 69  il_panic() b/c i
1f30: 74 20 6d 69 67 68 74 20 6c 61 6e 64 20 75 73 20  t might land us 
1f40: 73 6f 6d 65 77 68 65 72 65 0a 20 20 20 20 20 20  somewhere.      
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
1f60: 65 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ere this functio
1f70: 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 67 61 69  n is called agai
1f80: 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n..             
1f90: 20 20 20 20 20 2a 2f 3b 0a 20 20 7d 0a 7d 0a 0a       */;.  }.}..
1fa0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74  ./*.** Returns t
1fb0: 68 65 20 76 61 6c 75 65 20 6f 66 20 6a 73 6f 6e  he value of json
1fc0: 5f 72 63 5f 63 73 74 72 28 63 6f 64 65 29 20 61  _rc_cstr(code) a
1fd0: 73 20 61 20 6e 65 77 20 4a 53 4f 4e 0a 2a 2a 20  s a new JSON.** 
1fe0: 73 74 72 69 6e 67 2c 20 77 68 69 63 68 20 69 73  string, which is
1ff0: 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 61   owned by the ca
2000: 6c 6c 65 72 20 61 6e 64 20 6d 75 73 74 20 65 76  ller and must ev
2010: 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 62 65 20 63  entually.** be c
2020: 73 6f 6e 5f 76 61 6c 75 65 5f 66 72 65 65 28 29  son_value_free()
2030: 64 20 6f 72 20 74 72 61 6e 73 66 65 72 65 64 20  d or transfered 
2040: 74 6f 20 61 20 4a 53 4f 4e 20 63 6f 6e 74 61 69  to a JSON contai
2050: 6e 65 72 2e 0a 2a 2f 0a 63 73 6f 6e 5f 76 61 6c  ner..*/.cson_val
2060: 75 65 20 2a 20 6a 73 6f 6e 5f 72 63 5f 73 74 72  ue * json_rc_str
2070: 69 6e 67 28 20 69 6e 74 20 63 6f 64 65 20 29 7b  ing( int code ){
2080: 0a 20 20 72 65 74 75 72 6e 20 63 73 6f 6e 5f 76  .  return cson_v
2090: 61 6c 75 65 5f 6e 65 77 5f 73 74 72 69 6e 67 28  alue_new_string(
20a0: 20 6a 73 6f 6e 5f 72 63 5f 63 73 74 72 28 63 6f   json_rc_cstr(co
20b0: 64 65 29 2c 20 31 31 20 29 3b 0a 7d 0a 0a 63 73  de), 11 );.}..cs
20c0: 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f  on_value * json_
20d0: 6e 65 77 5f 73 74 72 69 6e 67 28 20 63 68 61 72  new_string( char
20e0: 20 63 6f 6e 73 74 20 2a 20 73 74 72 20 29 7b 0a   const * str ){.
20f0: 20 20 72 65 74 75 72 6e 20 73 74 72 0a 20 20 20    return str.   
2100: 20 3f 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65   ? cson_value_ne
2110: 77 5f 73 74 72 69 6e 67 28 73 74 72 2c 73 74 72  w_string(str,str
2120: 6c 65 6e 28 73 74 72 29 29 0a 20 20 20 20 3a 20  len(str)).    : 
2130: 4e 55 4c 4c 3b 0a 7d 0a 0a 63 73 6f 6e 5f 76 61  NULL;.}..cson_va
2140: 6c 75 65 20 2a 20 6a 73 6f 6e 5f 6e 65 77 5f 73  lue * json_new_s
2150: 74 72 69 6e 67 5f 66 28 20 63 68 61 72 20 63 6f  tring_f( char co
2160: 6e 73 74 20 2a 20 66 6d 74 2c 20 2e 2e 2e 20 29  nst * fmt, ... )
2170: 7b 0a 20 20 63 73 6f 6e 5f 76 61 6c 75 65 20 2a  {.  cson_value *
2180: 20 76 3b 0a 20 20 63 68 61 72 20 2a 20 7a 53 74   v;.  char * zSt
2190: 72 3b 0a 20 20 76 61 5f 6c 69 73 74 20 76 61 72  r;.  va_list var
21a0: 67 73 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 76  gs;.  va_start(v
21b0: 61 72 67 73 2c 66 6d 74 29 3b 0a 20 20 7a 53 74  args,fmt);.  zSt
21c0: 72 20 3d 20 76 6d 70 72 69 6e 74 66 28 66 6d 74  r = vmprintf(fmt
21d0: 2c 76 61 72 67 73 29 3b 0a 20 20 76 61 5f 65 6e  ,vargs);.  va_en
21e0: 64 28 76 61 72 67 73 29 3b 0a 20 20 76 20 3d 20  d(vargs);.  v = 
21f0: 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 73  cson_value_new_s
2200: 74 72 69 6e 67 28 7a 53 74 72 2c 20 73 74 72 6c  tring(zStr, strl
2210: 65 6e 28 7a 53 74 72 29 29 3b 0a 20 20 66 72 65  en(zStr));.  fre
2220: 65 28 7a 53 74 72 29 3b 0a 20 20 72 65 74 75 72  e(zStr);.  retur
2230: 6e 20 76 3b 0a 7d 0a 0a 63 73 6f 6e 5f 76 61 6c  n v;.}..cson_val
2240: 75 65 20 2a 20 6a 73 6f 6e 5f 6e 65 77 5f 69 6e  ue * json_new_in
2250: 74 28 20 69 36 34 20 76 20 29 7b 0a 20 20 72 65  t( i64 v ){.  re
2260: 74 75 72 6e 20 63 73 6f 6e 5f 76 61 6c 75 65 5f  turn cson_value_
2270: 6e 65 77 5f 69 6e 74 65 67 65 72 28 28 63 73 6f  new_integer((cso
2280: 6e 5f 69 6e 74 5f 74 29 76 29 3b 0a 7d 0a 0a 2f  n_int_t)v);.}../
2290: 2a 0a 2a 2a 20 47 65 74 73 20 61 20 50 4f 53 54  *.** Gets a POST
22a0: 2f 50 4f 53 54 2e 70 61 79 6c 6f 61 64 2f 47 45  /POST.payload/GE
22b0: 54 2f 43 4f 4f 4b 49 45 2f 45 4e 56 20 76 61 6c  T/COOKIE/ENV val
22c0: 75 65 2e 20 54 68 65 20 72 65 74 75 72 6e 65 64  ue. The returned
22d0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 69 73 20 6f 77   memory.** is ow
22e0: 6e 65 64 20 62 79 20 74 68 65 20 67 2e 6a 73 6f  ned by the g.jso
22f0: 6e 20 6f 62 6a 65 63 74 20 28 6f 6e 65 20 6f 66  n object (one of
2300: 20 69 74 73 20 73 75 62 2d 6f 62 6a 65 63 74 73   its sub-objects
2310: 29 2e 20 52 65 74 75 72 6e 73 0a 2a 2a 20 4e 55  ). Returns.** NU
2320: 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 20 69  LL if no match i
2330: 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 45  s found..**.** E
2340: 4e 56 20 6d 65 61 6e 73 20 74 68 65 20 73 79 73  NV means the sys
2350: 74 65 6d 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  tem environment 
2360: 28 67 65 74 65 6e 76 28 29 29 2e 0a 2a 2a 0a 2a  (getenv())..**.*
2370: 2a 20 50 72 65 63 65 64 65 6e 63 65 3a 20 50 4f  * Precedence: PO
2380: 53 54 2e 70 61 79 6c 6f 61 64 2c 20 47 45 54 2f  ST.payload, GET/
2390: 43 4f 4f 4b 49 45 2f 6e 6f 6e 2d 4a 53 4f 4e 20  COOKIE/non-JSON 
23a0: 50 4f 53 54 2c 20 4a 53 4f 4e 20 50 4f 53 54 2c  POST, JSON POST,
23b0: 20 45 4e 56 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 4d   ENV..**.** FIXM
23c0: 45 3a 20 74 68 65 20 70 72 65 63 65 64 65 6e 63  E: the precedenc
23d0: 65 20 53 48 4f 55 4c 44 20 62 65 3a 20 47 45 54  e SHOULD be: GET
23e0: 2c 20 50 4f 53 54 2e 70 61 79 6c 6f 61 64 2c 20  , POST.payload, 
23f0: 50 4f 53 54 2c 20 43 4f 4f 4b 49 45 2c 0a 2a 2a  POST, COOKIE,.**
2400: 20 45 4e 56 2c 20 62 75 74 20 74 68 65 20 61 6d   ENV, but the am
2410: 61 6c 67 61 6d 61 74 69 6f 6e 20 6f 66 20 74 68  algamation of th
2420: 65 20 47 45 54 2f 50 4f 53 54 20 76 61 72 73 20  e GET/POST vars 
2430: 6d 61 6b 65 73 20 69 74 20 64 69 66 66 69 63 75  makes it difficu
2440: 6c 74 0a 2a 2a 20 66 6f 72 20 6d 65 20 74 6f 20  lt.** for me to 
2450: 64 6f 20 74 68 61 74 2e 20 53 69 6e 63 65 20 66  do that. Since f
2460: 6f 73 73 69 6c 20 6f 6e 6c 79 20 75 73 65 73 20  ossil only uses 
2470: 6f 6e 65 20 63 6f 6f 6b 69 65 2c 20 63 6f 6f 6b  one cookie, cook
2480: 69 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65  ie.** precedence
2490: 20 69 73 6e 27 74 20 61 20 72 65 61 6c 2f 68 69   isn't a real/hi
24a0: 67 68 2d 70 72 69 6f 72 69 74 79 20 70 72 6f 62  gh-priority prob
24b0: 6c 65 6d 2e 0a 2a 2f 0a 63 73 6f 6e 5f 76 61 6c  lem..*/.cson_val
24c0: 75 65 20 2a 20 6a 73 6f 6e 5f 67 65 74 65 6e 76  ue * json_getenv
24d0: 28 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 7a  ( char const * z
24e0: 4b 65 79 20 29 7b 0a 20 20 63 73 6f 6e 5f 76 61  Key ){.  cson_va
24f0: 6c 75 65 20 2a 20 72 63 3b 0a 20 20 72 63 20 3d  lue * rc;.  rc =
2500: 20 67 2e 6a 73 6f 6e 2e 72 65 71 50 61 79 6c 6f   g.json.reqPaylo
2510: 61 64 2e 6f 0a 20 20 20 20 3f 20 63 73 6f 6e 5f  ad.o.    ? cson_
2520: 6f 62 6a 65 63 74 5f 67 65 74 28 20 67 2e 6a 73  object_get( g.js
2530: 6f 6e 2e 72 65 71 50 61 79 6c 6f 61 64 2e 6f 2c  on.reqPayload.o,
2540: 20 7a 4b 65 79 20 29 0a 20 20 20 20 3a 20 4e 55   zKey ).    : NU
2550: 4c 4c 3b 0a 20 20 69 66 28 72 63 29 7b 0a 20 20  LL;.  if(rc){.  
2560: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2570: 0a 20 20 72 63 20 3d 20 63 73 6f 6e 5f 6f 62 6a  .  rc = cson_obj
2580: 65 63 74 5f 67 65 74 28 20 67 2e 6a 73 6f 6e 2e  ect_get( g.json.
2590: 70 61 72 61 6d 2e 6f 2c 20 7a 4b 65 79 20 29 3b  param.o, zKey );
25a0: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
25b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
25c0: 20 20 72 63 20 3d 20 63 73 6f 6e 5f 6f 62 6a 65    rc = cson_obje
25d0: 63 74 5f 67 65 74 28 20 67 2e 6a 73 6f 6e 2e 70  ct_get( g.json.p
25e0: 6f 73 74 2e 6f 2c 20 7a 4b 65 79 20 29 3b 0a 20  ost.o, zKey );. 
25f0: 20 69 66 28 72 63 29 7b 0a 20 20 20 20 72 65 74   if(rc){.    ret
2600: 75 72 6e 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b  urn rc;.  }else{
2610: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
2620: 2a 20 63 76 20 3d 20 50 44 28 7a 4b 65 79 2c 4e  * cv = PD(zKey,N
2630: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 28 21 63 76  ULL);.    if(!cv
2640: 20 26 26 20 21 67 2e 69 73 48 54 54 50 29 7b 0a   && !g.isHTTP){.
2650: 20 20 20 20 20 20 2f 2a 20 72 65 6d 69 6e 64 65        /* reminde
2660: 72 20 74 6f 20 73 65 6c 66 3a 20 69 6e 20 43 4c  r to self: in CL
2670: 49 20 6d 6f 64 65 20 69 27 64 20 6c 69 6b 65 20  I mode i'd like 
2680: 74 6f 20 74 72 79 0a 20 20 20 20 20 20 20 20 20  to try.         
2690: 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 7a 4b 65 79  find_option(zKey
26a0: 2c 4e 55 4c 4c 2c 58 59 5a 29 20 68 65 72 65 2c  ,NULL,XYZ) here,
26b0: 20 62 75 74 20 77 65 20 64 6f 6e 27 74 20 68 61   but we don't ha
26c0: 76 65 20 61 20 73 61 6e 65 0a 20 20 20 20 20 20  ve a sane.      
26d0: 20 20 20 64 65 66 61 75 6c 74 20 66 6f 72 20 74     default for t
26e0: 68 65 20 58 59 5a 20 70 61 72 61 6d 20 68 65 72  he XYZ param her
26f0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
2700: 20 20 63 76 20 3d 20 66 6f 73 73 69 6c 5f 67 65    cv = fossil_ge
2710: 74 65 6e 76 28 7a 4b 65 79 29 3b 0a 20 20 20 20  tenv(zKey);.    
2720: 7d 0a 20 20 20 20 69 66 28 63 76 29 7b 2f 2a 74  }.    if(cv){/*t
2730: 72 61 6e 73 66 6f 72 6d 20 69 74 20 74 6f 20 4a  ransform it to J
2740: 53 4f 4e 20 66 6f 72 20 6c 61 74 65 72 20 75 73  SON for later us
2750: 65 2e 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 75 73  e.*/.      /* us
2760: 65 20 73 73 63 61 6e 66 28 29 20 74 6f 20 66 69  e sscanf() to fi
2770: 67 75 72 65 20 6f 75 74 20 69 66 20 69 74 27 73  gure out if it's
2780: 20 61 6e 20 69 6e 74 2c 0a 20 20 20 20 20 20 20   an int,.       
2790: 20 20 61 6e 64 20 74 72 61 6e 73 66 6f 72 6d 20    and transform 
27a0: 69 74 20 74 6f 20 4a 53 4f 4e 20 69 6e 74 20 69  it to JSON int i
27b0: 66 20 69 74 20 69 73 2e 0a 0a 20 20 20 20 20 20  f it is...      
27c0: 20 20 20 46 49 58 4d 45 3a 20 75 73 65 20 73 74     FIXME: use st
27d0: 72 74 6f 6c 28 29 2c 20 73 69 6e 63 65 20 69 74  rtol(), since it
27e0: 20 68 61 73 20 6d 6f 72 65 20 61 63 63 75 72 61   has more accura
27f0: 74 65 0a 20 20 20 20 20 20 20 20 20 65 72 72 6f  te.         erro
2800: 72 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20  r handling..    
2810: 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69    */.      int i
2820: 6e 74 56 61 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  ntVal = -1;.    
2830: 20 20 63 68 61 72 20 65 6e 64 4f 66 49 6e 74 43    char endOfIntC
2840: 68 65 63 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20  heck;.      int 
2850: 63 6f 6e 73 74 20 73 63 61 6e 52 63 20 3d 20 73  const scanRc = s
2860: 73 63 61 6e 66 28 63 76 2c 22 25 64 25 63 22 2c  scanf(cv,"%d%c",
2870: 26 69 6e 74 56 61 6c 2c 20 26 65 6e 64 4f 66 49  &intVal, &endOfI
2880: 6e 74 43 68 65 63 6b 29 0a 20 20 20 20 20 20 20  ntCheck).       
2890: 20 2f 2a 20 54 68 65 20 25 63 20 62 69 74 20 74   /* The %c bit t
28a0: 68 65 72 65 20 69 73 20 74 6f 20 6d 61 6b 65 20  here is to make 
28b0: 73 75 72 65 20 74 68 61 74 20 77 65 20 64 6f 6e  sure that we don
28c0: 27 74 20 61 63 63 65 70 74 20 31 32 33 78 0a 20  't accept 123x. 
28d0: 20 20 20 20 20 20 20 20 20 61 73 20 61 20 6e 75           as a nu
28e0: 6d 62 65 72 2e 20 73 73 63 61 6e 66 28 29 20 72  mber. sscanf() r
28f0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
2900: 72 20 6f 66 20 74 6f 6b 65 6e 73 0a 20 20 20 20  r of tokens.    
2910: 20 20 20 20 20 20 73 75 63 63 65 73 73 66 75 6c        successful
2920: 6c 79 20 70 61 72 73 65 64 2c 20 73 6f 20 61 6e  ly parsed, so an
2930: 20 52 43 20 6f 66 20 31 20 77 69 6c 6c 20 62 65   RC of 1 will be
2940: 20 63 6f 72 72 65 63 74 20 66 6f 72 20 22 31 32   correct for "12
2950: 33 22 0a 20 20 20 20 20 20 20 20 20 20 62 75 74  3".          but
2960: 20 22 31 32 33 78 22 20 77 69 6c 6c 20 68 61 76   "123x" will hav
2970: 65 20 52 43 3d 3d 32 2e 0a 0a 20 20 20 20 20 20  e RC==2...      
2980: 20 20 20 20 42 75 74 20 69 74 20 61 70 70 65 61      But it appea
2990: 72 73 20 74 6f 20 6e 6f 74 20 62 65 20 77 6f 72  rs to not be wor
29a0: 6b 69 6e 67 20 74 68 61 74 20 77 61 79 20 3a 2f  king that way :/
29b0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
29c0: 20 20 20 20 3b 0a 20 20 20 20 20 20 69 66 28 31      ;.      if(1
29d0: 3d 3d 73 63 61 6e 52 63 29 7b 0a 20 20 20 20 20  ==scanRc){.     
29e0: 20 20 20 6a 73 6f 6e 5f 73 65 74 65 6e 76 28 20     json_setenv( 
29f0: 7a 4b 65 79 2c 20 63 73 6f 6e 5f 76 61 6c 75 65  zKey, cson_value
2a00: 5f 6e 65 77 5f 69 6e 74 65 67 65 72 28 69 6e 74  _new_integer(int
2a10: 56 61 6c 29 20 29 3b 0a 20 20 20 20 20 20 7d 65  Val) );.      }e
2a20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
2a30: 3d 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77  = cson_value_new
2a40: 5f 73 74 72 69 6e 67 28 63 76 2c 73 74 72 6c 65  _string(cv,strle
2a50: 6e 28 63 76 29 29 3b 0a 20 20 20 20 20 20 20 20  n(cv));.        
2a60: 6a 73 6f 6e 5f 73 65 74 65 6e 76 28 20 7a 4b 65  json_setenv( zKe
2a70: 79 2c 20 72 63 20 29 3b 0a 20 20 20 20 20 20 7d  y, rc );.      }
2a80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2a90: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2aa0: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a     return NULL;.
2ab0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
2ac0: 2a 2a 20 57 72 61 70 70 65 72 20 61 72 6f 75 6e  ** Wrapper aroun
2ad0: 64 20 6a 73 6f 6e 5f 67 65 74 65 6e 76 28 29 20  d json_getenv() 
2ae0: 77 68 69 63 68 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49  which....**.** I
2af0: 66 20 69 74 20 66 69 6e 64 73 20 61 20 76 61 6c  f it finds a val
2b00: 75 65 20 61 6e 64 20 74 68 61 74 20 76 61 6c 75  ue and that valu
2b10: 65 20 69 73 2d 61 20 4a 53 4f 4e 20 6e 75 6d 62  e is-a JSON numb
2b20: 65 72 20 6f 72 20 69 73 20 61 20 73 74 72 69 6e  er or is a strin
2b30: 67 0a 2a 2a 20 77 68 69 63 68 20 6c 6f 6f 6b 73  g.** which looks
2b40: 20 6c 69 6b 65 20 61 6e 20 69 6e 74 65 67 65 72   like an integer
2b50: 20 6f 72 20 69 73 2d 61 20 4a 53 4f 4e 20 62 6f   or is-a JSON bo
2b60: 6f 6c 2f 6e 75 6c 6c 20 74 68 65 6e 20 69 74 20  ol/null then it 
2b70: 69 73 0a 2a 2a 20 63 6f 6e 76 65 72 74 65 64 20  is.** converted 
2b80: 74 6f 20 61 6e 20 69 6e 74 2e 20 49 66 20 6e 6f  to an int. If no
2b90: 6e 65 20 6f 66 20 74 68 6f 73 65 20 61 70 70 6c  ne of those appl
2ba0: 79 20 74 68 65 6e 20 64 66 6c 74 20 69 73 20 72  y then dflt is r
2bb0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
2bc0: 6a 73 6f 6e 5f 67 65 74 65 6e 76 5f 69 6e 74 28  json_getenv_int(
2bd0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 70 4b 65  char const * pKe
2be0: 79 2c 20 69 6e 74 20 64 66 6c 74 20 29 7b 0a 20  y, int dflt ){. 
2bf0: 20 63 73 6f 6e 5f 76 61 6c 75 65 20 63 6f 6e 73   cson_value cons
2c00: 74 20 2a 20 76 20 3d 20 6a 73 6f 6e 5f 67 65 74  t * v = json_get
2c10: 65 6e 76 28 70 4b 65 79 29 3b 0a 20 20 63 6f 6e  env(pKey);.  con
2c20: 73 74 20 63 73 6f 6e 5f 74 79 70 65 5f 69 64 20  st cson_type_id 
2c30: 74 79 70 65 20 3d 20 76 20 3f 20 63 73 6f 6e 5f  type = v ? cson_
2c40: 76 61 6c 75 65 5f 74 79 70 65 5f 69 64 28 76 29  value_type_id(v)
2c50: 20 3a 20 43 53 4f 4e 5f 54 59 50 45 5f 55 4e 44   : CSON_TYPE_UND
2c60: 45 46 3b 0a 20 20 73 77 69 74 63 68 28 74 79 70  EF;.  switch(typ
2c70: 65 29 7b 0a 20 20 20 20 63 61 73 65 20 43 53 4f  e){.    case CSO
2c80: 4e 5f 54 59 50 45 5f 49 4e 54 45 47 45 52 3a 0a  N_TYPE_INTEGER:.
2c90: 20 20 20 20 63 61 73 65 20 43 53 4f 4e 5f 54 59      case CSON_TY
2ca0: 50 45 5f 44 4f 55 42 4c 45 3a 0a 20 20 20 20 20  PE_DOUBLE:.     
2cb0: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 63 73 6f   return (int)cso
2cc0: 6e 5f 76 61 6c 75 65 5f 67 65 74 5f 69 6e 74 65  n_value_get_inte
2cd0: 67 65 72 28 76 29 3b 0a 20 20 20 20 63 61 73 65  ger(v);.    case
2ce0: 20 43 53 4f 4e 5f 54 59 50 45 5f 53 54 52 49 4e   CSON_TYPE_STRIN
2cf0: 47 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  G: {.      char 
2d00: 63 6f 6e 73 74 20 2a 20 73 76 20 3d 20 63 73 6f  const * sv = cso
2d10: 6e 5f 73 74 72 69 6e 67 5f 63 73 74 72 28 63 73  n_string_cstr(cs
2d20: 6f 6e 5f 76 61 6c 75 65 5f 67 65 74 5f 73 74 72  on_value_get_str
2d30: 69 6e 67 28 76 29 29 3b 0a 20 20 20 20 20 20 61  ing(v));.      a
2d40: 73 73 65 72 74 28 20 28 4e 55 4c 4c 21 3d 73 76  ssert( (NULL!=sv
2d50: 29 20 26 26 20 22 54 68 69 73 20 69 73 20 71 75  ) && "This is qu
2d60: 69 74 65 20 75 6e 65 78 70 65 63 74 65 64 2e 22  ite unexpected."
2d70: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
2d80: 20 73 76 20 3f 20 61 74 6f 69 28 73 76 29 20 3a   sv ? atoi(sv) :
2d90: 20 64 66 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 20   dflt;.    }.   
2da0: 20 63 61 73 65 20 43 53 4f 4e 5f 54 59 50 45 5f   case CSON_TYPE_
2db0: 42 4f 4f 4c 3a 0a 20 20 20 20 20 20 72 65 74 75  BOOL:.      retu
2dc0: 72 6e 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 67 65  rn cson_value_ge
2dd0: 74 5f 62 6f 6f 6c 28 76 29 20 3f 20 31 20 3a 20  t_bool(v) ? 1 : 
2de0: 30 3b 0a 20 20 20 20 63 61 73 65 20 43 53 4f 4e  0;.    case CSON
2df0: 5f 54 59 50 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20  _TYPE_NULL:.    
2e00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
2e10: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
2e20: 65 74 75 72 6e 20 64 66 6c 74 3b 0a 20 20 7d 0a  eturn dflt;.  }.
2e30: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 61 70 70 65  }.../*.** Wrappe
2e40: 72 20 61 72 6f 75 6e 64 20 6a 73 6f 6e 5f 67 65  r around json_ge
2e50: 74 65 6e 76 28 29 20 77 68 69 63 68 20 74 72 69  tenv() which tri
2e60: 65 73 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  es to evaluate a
2e70: 20 70 61 79 6c 6f 61 64 2f 65 6e 76 0a 2a 2a 20   payload/env.** 
2e80: 76 61 6c 75 65 20 61 73 20 61 20 62 6f 6f 6c 65  value as a boole
2e90: 61 6e 2e 20 55 73 65 73 20 6d 6f 73 74 6c 79 20  an. Uses mostly 
2ea0: 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61  the same logic a
2eb0: 73 0a 2a 2a 20 6a 73 6f 6e 5f 67 65 74 65 6e 76  s.** json_getenv
2ec0: 5f 69 6e 74 28 29 2c 20 77 69 74 68 20 74 68 65  _int(), with the
2ed0: 20 61 64 64 69 74 69 6f 6e 20 74 68 61 74 20 73   addition that s
2ee0: 74 72 69 6e 67 20 76 61 6c 75 65 73 20 77 68 69  tring values whi
2ef0: 63 68 0a 2a 2a 20 65 69 74 68 65 72 20 73 74 61  ch.** either sta
2f00: 72 74 20 77 69 74 68 20 61 20 64 69 67 69 74 20  rt with a digit 
2f10: 31 2e 2e 39 20 6f 72 20 74 68 65 20 6c 65 74 74  1..9 or the lett
2f20: 65 72 73 20 5b 74 54 79 59 5d 20 61 72 65 20 63  ers [tTyY] are c
2f30: 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 74 6f 20  onsidered.** to 
2f40: 62 65 20 74 72 75 65 2e 20 49 66 20 74 68 69 73  be true. If this
2f50: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74   function cannot
2f60: 20 66 69 6e 64 20 61 20 6d 61 74 63 68 69 6e 67   find a matching
2f70: 20 6b 65 79 2f 76 61 6c 75 65 20 74 68 65 6e 0a   key/value then.
2f80: 2a 2a 20 64 66 6c 74 20 69 73 20 72 65 74 75 72  ** dflt is retur
2f90: 6e 65 64 2e 20 65 2e 67 2e 20 69 66 20 69 74 20  ned. e.g. if it 
2fa0: 66 69 6e 64 73 20 74 68 65 20 6b 65 79 20 62 75  finds the key bu
2fb0: 74 20 74 68 65 20 76 61 6c 75 65 20 69 73 2d 61  t the value is-a
2fc0: 0a 2a 2a 20 4f 62 6a 65 63 74 20 74 68 65 6e 20  .** Object then 
2fd0: 64 66 74 6c 20 69 73 20 72 65 74 75 72 6e 65 64  dftl is returned
2fe0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 6e  ..**.** If an en
2ff0: 74 72 79 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  try is found, th
3000: 69 73 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72  is function guar
3010: 61 6e 74 65 65 73 20 74 68 61 74 20 69 74 20 77  antees that it w
3020: 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 65 69  ill return.** ei
3030: 74 68 65 72 20 30 20 6f 72 20 31 2c 20 61 73 20  ther 0 or 1, as 
3040: 6f 70 70 6f 73 65 64 20 74 6f 20 22 30 20 6f 72  opposed to "0 or
3050: 20 6e 6f 6e 2d 7a 65 72 6f 22 2c 20 73 6f 20 74   non-zero", so t
3060: 68 61 74 20 63 6c 69 65 6e 74 73 20 63 61 6e 0a  hat clients can.
3070: 2a 2a 20 70 61 73 73 20 61 20 64 69 66 66 65 72  ** pass a differ
3080: 65 6e 74 20 76 61 6c 75 65 20 61 73 20 64 66 6c  ent value as dfl
3090: 74 2e 20 54 68 75 73 20 74 68 65 79 20 63 61 6e  t. Thus they can
30a0: 20 75 73 65 2c 20 65 2e 67 2e 20 2d 31 20 74 6f   use, e.g. -1 to
30b0: 20 6b 6e 6f 77 0a 2a 2a 20 77 68 65 74 68 65 72   know.** whether
30c0: 20 6f 72 20 6e 6f 74 20 74 68 69 73 20 66 75 6e   or not this fun
30d0: 63 74 69 6f 6e 20 66 6f 75 6e 64 20 61 20 6d 61  ction found a ma
30e0: 74 63 68 20 28 69 74 20 77 69 6c 6c 20 72 65 74  tch (it will ret
30f0: 75 72 6e 20 2d 31 20 69 6e 0a 2a 2a 20 74 68 61  urn -1 in.** tha
3100: 74 20 63 61 73 65 29 2e 0a 2a 2f 0a 69 6e 74 20  t case)..*/.int 
3110: 6a 73 6f 6e 5f 67 65 74 65 6e 76 5f 62 6f 6f 6c  json_getenv_bool
3120: 28 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 70 4b  (char const * pK
3130: 65 79 2c 20 69 6e 74 20 64 66 6c 74 20 29 7b 0a  ey, int dflt ){.
3140: 20 20 63 73 6f 6e 5f 76 61 6c 75 65 20 63 6f 6e    cson_value con
3150: 73 74 20 2a 20 76 20 3d 20 6a 73 6f 6e 5f 67 65  st * v = json_ge
3160: 74 65 6e 76 28 70 4b 65 79 29 3b 0a 20 20 63 6f  tenv(pKey);.  co
3170: 6e 73 74 20 63 73 6f 6e 5f 74 79 70 65 5f 69 64  nst cson_type_id
3180: 20 74 79 70 65 20 3d 20 76 20 3f 20 63 73 6f 6e   type = v ? cson
3190: 5f 76 61 6c 75 65 5f 74 79 70 65 5f 69 64 28 76  _value_type_id(v
31a0: 29 20 3a 20 43 53 4f 4e 5f 54 59 50 45 5f 55 4e  ) : CSON_TYPE_UN
31b0: 44 45 46 3b 0a 20 20 73 77 69 74 63 68 28 74 79  DEF;.  switch(ty
31c0: 70 65 29 7b 0a 20 20 20 20 63 61 73 65 20 43 53  pe){.    case CS
31d0: 4f 4e 5f 54 59 50 45 5f 49 4e 54 45 47 45 52 3a  ON_TYPE_INTEGER:
31e0: 0a 20 20 20 20 63 61 73 65 20 43 53 4f 4e 5f 54  .    case CSON_T
31f0: 59 50 45 5f 44 4f 55 42 4c 45 3a 0a 20 20 20 20  YPE_DOUBLE:.    
3200: 20 20 72 65 74 75 72 6e 20 63 73 6f 6e 5f 76 61    return cson_va
3210: 6c 75 65 5f 67 65 74 5f 69 6e 74 65 67 65 72 28  lue_get_integer(
3220: 76 29 20 3f 20 31 20 3a 20 30 3b 0a 20 20 20 20  v) ? 1 : 0;.    
3230: 63 61 73 65 20 43 53 4f 4e 5f 54 59 50 45 5f 53  case CSON_TYPE_S
3240: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 63  TRING: {.      c
3250: 68 61 72 20 63 6f 6e 73 74 20 2a 20 73 76 20 3d  har const * sv =
3260: 20 63 73 6f 6e 5f 73 74 72 69 6e 67 5f 63 73 74   cson_string_cst
3270: 72 28 63 73 6f 6e 5f 76 61 6c 75 65 5f 67 65 74  r(cson_value_get
3280: 5f 73 74 72 69 6e 67 28 76 29 29 3b 0a 20 20 20  _string(v));.   
3290: 20 20 20 61 73 73 65 72 74 28 20 28 4e 55 4c 4c     assert( (NULL
32a0: 21 3d 73 76 29 20 26 26 20 22 54 68 69 73 20 69  !=sv) && "This i
32b0: 73 20 71 75 69 74 65 20 75 6e 65 78 70 65 63 74  s quite unexpect
32c0: 65 64 2e 22 20 29 3b 0a 20 20 20 20 20 20 69 66  ed." );.      if
32d0: 28 21 2a 73 76 20 7c 7c 20 28 27 30 27 3d 3d 2a  (!*sv || ('0'==*
32e0: 73 76 29 29 7b 0a 20 20 20 20 20 20 20 20 72 65  sv)){.        re
32f0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65  turn 0;.      }e
3300: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
3310: 75 72 6e 20 28 28 28 27 31 27 3c 3d 2a 73 76 29  urn ((('1'<=*sv)
3320: 20 26 26 20 28 27 39 27 3e 3d 2a 73 76 29 29 0a   && ('9'>=*sv)).
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3340: 7c 7c 20 28 27 74 27 3d 3d 2a 73 76 29 20 7c 7c  || ('t'==*sv) ||
3350: 20 28 27 54 27 3d 3d 2a 73 76 29 0a 20 20 20 20   ('T'==*sv).    
3360: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
3370: 27 79 27 3d 3d 2a 73 76 29 20 7c 7c 20 28 27 59  'y'==*sv) || ('Y
3380: 27 3d 3d 2a 73 76 29 0a 20 20 20 20 20 20 20 20  '==*sv).        
3390: 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20          ).      
33a0: 20 20 20 20 3f 20 31 20 3a 20 30 3b 0a 20 20 20      ? 1 : 0;.   
33b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63     }.    }.    c
33c0: 61 73 65 20 43 53 4f 4e 5f 54 59 50 45 5f 42 4f  ase CSON_TYPE_BO
33d0: 4f 4c 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OL:.      return
33e0: 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 67 65 74 5f   cson_value_get_
33f0: 62 6f 6f 6c 28 76 29 20 3f 20 31 20 3a 20 30 3b  bool(v) ? 1 : 0;
3400: 0a 20 20 20 20 63 61 73 65 20 43 53 4f 4e 5f 54  .    case CSON_T
3410: 59 50 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20  YPE_NULL:.      
3420: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 64 65  return 0;.    de
3430: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
3440: 75 72 6e 20 64 66 6c 74 3b 0a 20 20 7d 0a 7d 0a  urn dflt;.  }.}.
3450: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74  ./*.** Returns t
3460: 68 65 20 73 74 72 69 6e 67 20 66 6f 72 6d 20 6f  he string form o
3470: 66 20 61 20 6a 73 6f 6e 5f 67 65 74 65 6e 76 28  f a json_getenv(
3480: 29 20 76 61 6c 75 65 2c 20 62 75 74 20 4f 4e 4c  ) value, but ONL
3490: 59 20 49 66 20 74 68 61 74 0a 2a 2a 20 76 61 6c  Y If that.** val
34a0: 75 65 20 69 73 2d 61 20 53 74 72 69 6e 67 2e 20  ue is-a String. 
34b0: 4e 6f 6e 2d 73 74 72 69 6e 67 73 20 61 72 65 20  Non-strings are 
34c0: 6e 6f 74 20 63 6f 6e 76 65 72 74 65 64 20 74 6f  not converted to
34d0: 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 2a 2a 20   strings for.** 
34e0: 74 68 69 73 20 70 75 72 70 6f 73 65 2e 20 52 65  this purpose. Re
34f0: 74 75 72 6e 65 64 20 6d 65 6d 6f 72 79 20 69 73  turned memory is
3500: 20 6f 77 6e 65 64 20 62 79 20 67 2e 6a 73 6f 6e   owned by g.json
3510: 20 6f 72 20 66 6f 73 73 69 6c 20 61 6e 64 20 69   or fossil and i
3520: 73 0a 2a 2a 20 76 61 6c 69 64 20 75 6e 74 69 6c  s.** valid until
3530: 20 65 6e 64 2d 6f 66 2d 61 70 70 20 6f 72 20 74   end-of-app or t
3540: 68 65 20 67 69 76 65 6e 20 6b 65 79 20 69 73 20  he given key is 
3550: 72 65 70 6c 61 63 65 64 20 69 6e 20 66 6f 73 73  replaced in foss
3560: 69 6c 27 73 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c  il's.** internal
3570: 73 20 76 69 61 20 63 67 69 5f 72 65 70 6c 61 63  s via cgi_replac
3580: 65 5f 70 61 72 61 6d 65 74 65 72 28 29 20 61 6e  e_parameter() an
3590: 64 20 66 72 69 65 6e 64 73 20 6f 72 20 6a 73 6f  d friends or jso
35a0: 6e 5f 73 65 74 65 6e 76 28 29 2e 0a 2a 2f 0a 63  n_setenv()..*/.c
35b0: 68 61 72 20 63 6f 6e 73 74 20 2a 20 6a 73 6f 6e  har const * json
35c0: 5f 67 65 74 65 6e 76 5f 63 73 74 72 28 20 63 68  _getenv_cstr( ch
35d0: 61 72 20 63 6f 6e 73 74 20 2a 20 7a 4b 65 79 20  ar const * zKey 
35e0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 73 6f 6e  ){.  return cson
35f0: 5f 76 61 6c 75 65 5f 67 65 74 5f 63 73 74 72 28  _value_get_cstr(
3600: 20 6a 73 6f 6e 5f 67 65 74 65 6e 76 28 7a 4b 65   json_getenv(zKe
3610: 79 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  y) );.}../*.** A
3620: 6e 20 65 78 74 65 6e 64 65 64 20 66 6f 72 6d 20  n extended form 
3630: 6f 66 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 29  of find_option()
3640: 20 77 68 69 63 68 20 74 72 69 65 73 20 74 6f 20   which tries to 
3650: 6c 6f 6f 6b 20 75 70 20 61 20 63 6f 6d 62 6f 0a  look up a combo.
3660: 2a 2a 20 47 45 54 2f 50 4f 53 54 2f 43 4c 49 20  ** GET/POST/CLI 
3670: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
3680: 7a 4b 65 79 20 6d 75 73 74 20 62 65 20 74 68 65  zKey must be the
3690: 20 47 45 54 2f 50 4f 53 54 20 70 61 72 61 6d 65   GET/POST parame
36a0: 74 65 72 20 6b 65 79 2e 20 7a 43 4c 49 4c 6f 6e  ter key. zCLILon
36b0: 67 20 6d 75 73 74 20 62 65 20 74 68 65 20 22 6c  g must be the "l
36c0: 6f 6e 67 0a 2a 2a 20 66 6f 72 6d 22 20 43 4c 49  ong.** form" CLI
36d0: 20 66 6c 61 67 20 28 4e 55 4c 4c 20 6d 65 61 6e   flag (NULL mean
36e0: 73 20 74 6f 20 75 73 65 20 7a 4b 65 79 29 2e 20  s to use zKey). 
36f0: 7a 43 4c 49 53 68 6f 72 74 20 6d 61 79 20 62 65  zCLIShort may be
3700: 20 4e 55 4c 4c 20 6f 72 0a 2a 2a 20 74 68 65 20   NULL or.** the 
3710: 22 73 68 6f 72 74 20 66 6f 72 6d 22 20 43 4c 49  "short form" CLI
3720: 20 66 6c 61 67 20 28 69 66 20 4e 55 4c 4c 2c 20   flag (if NULL, 
3730: 6e 6f 20 73 68 6f 72 74 20 66 6f 72 6d 20 69 73  no short form is
3740: 20 75 73 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66   used)..**.** If
3750: 20 61 72 67 50 6f 73 20 69 73 20 3e 3d 30 20 61   argPos is >=0 a
3760: 6e 64 20 6e 6f 20 6f 74 68 65 72 20 6d 61 74 63  nd no other matc
3770: 68 20 69 73 20 66 6f 75 6e 64 2c 0a 2a 2a 20 6a  h is found,.** j
3780: 73 6f 6e 5f 63 6f 6d 6d 61 6e 64 5f 61 72 67 28  son_command_arg(
3790: 61 72 67 50 6f 73 29 20 69 73 20 61 6c 73 6f 20  argPos) is also 
37a0: 63 68 65 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f  checked..**.** O
37b0: 6e 20 65 72 72 6f 72 20 28 6e 6f 20 6d 61 74 63  n error (no matc
37c0: 68 20 66 6f 75 6e 64 29 20 4e 55 4c 4c 20 69 73  h found) NULL is
37d0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
37e0: 20 54 68 69 73 20 4f 4e 4c 59 20 77 6f 72 6b 73   This ONLY works
37f0: 20 66 6f 72 20 53 74 72 69 6e 67 20 4a 53 4f 4e   for String JSON
3800: 2f 47 45 54 2f 43 4c 49 20 76 61 6c 75 65 73 2c  /GET/CLI values,
3810: 20 6e 6f 74 20 4a 53 4f 4e 0a 2a 2a 20 62 6f 6f   not JSON.** boo
3820: 6c 65 61 6e 73 20 61 6e 64 20 77 68 61 74 6e 6f  leans and whatno
3830: 74 2e 0a 2a 2f 0a 63 68 61 72 20 63 6f 6e 73 74  t..*/.char const
3840: 20 2a 20 6a 73 6f 6e 5f 66 69 6e 64 5f 6f 70 74   * json_find_opt
3850: 69 6f 6e 5f 63 73 74 72 32 28 63 68 61 72 20 63  ion_cstr2(char c
3860: 6f 6e 73 74 20 2a 20 7a 4b 65 79 2c 0a 20 20 20  onst * zKey,.   
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 7a 43   char const * zC
38a0: 4c 49 4c 6f 6e 67 2c 0a 20 20 20 20 20 20 20 20  LILong,.        
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
38d0: 20 63 6f 6e 73 74 20 2a 20 7a 43 4c 49 53 68 6f   const * zCLISho
38e0: 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 20 20 20 20 20 20 20 69 6e 74 20 61 72 67 50          int argP
3910: 6f 73 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73  os){.  char cons
3920: 74 20 2a 20 72 63 20 3d 20 4e 55 4c 4c 3b 0a 20  t * rc = NULL;. 
3930: 20 61 73 73 65 72 74 28 4e 55 4c 4c 20 21 3d 20   assert(NULL != 
3940: 7a 4b 65 79 29 3b 0a 20 20 69 66 28 21 67 2e 69  zKey);.  if(!g.i
3950: 73 48 54 54 50 29 7b 0a 20 20 20 20 72 63 20 3d  sHTTP){.    rc =
3960: 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 7a 43 4c   find_option(zCL
3970: 49 4c 6f 6e 67 20 3f 20 7a 43 4c 49 4c 6f 6e 67  ILong ? zCLILong
3980: 20 3a 20 7a 4b 65 79 2c 0a 20 20 20 20 20 20 20   : zKey,.       
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
39a0: 4c 49 53 68 6f 72 74 2c 20 31 29 3b 0a 20 20 7d  LIShort, 1);.  }
39b0: 0a 20 20 69 66 28 21 72 63 20 26 26 20 66 6f 73  .  if(!rc && fos
39c0: 73 69 6c 5f 68 61 73 5f 6a 73 6f 6e 28 29 29 7b  sil_has_json()){
39d0: 0a 20 20 20 20 72 63 20 3d 20 6a 73 6f 6e 5f 67  .    rc = json_g
39e0: 65 74 65 6e 76 5f 63 73 74 72 28 7a 4b 65 79 29  etenv_cstr(zKey)
39f0: 3b 0a 20 20 20 20 69 66 28 21 72 63 20 26 26 20  ;.    if(!rc && 
3a00: 7a 43 4c 49 53 68 6f 72 74 29 7b 0a 20 20 20 20  zCLIShort){.    
3a10: 20 20 72 63 20 3d 20 63 73 6f 6e 5f 76 61 6c 75    rc = cson_valu
3a20: 65 5f 67 65 74 5f 63 73 74 72 28 20 63 73 6f 6e  e_get_cstr( cson
3a30: 5f 6f 62 6a 65 63 74 5f 67 65 74 28 20 67 2e 6a  _object_get( g.j
3a40: 73 6f 6e 2e 70 61 72 61 6d 2e 6f 2c 20 7a 43 4c  son.param.o, zCL
3a50: 49 53 68 6f 72 74 29 20 29 3b 0a 20 20 20 20 7d  IShort) );.    }
3a60: 0a 20 20 7d 0a 20 20 69 66 28 21 72 63 20 26 26  .  }.  if(!rc &&
3a70: 20 28 61 72 67 50 6f 73 3e 3d 30 29 29 7b 0a 20   (argPos>=0)){. 
3a80: 20 20 20 72 63 20 3d 20 6a 73 6f 6e 5f 63 6f 6d     rc = json_com
3a90: 6d 61 6e 64 5f 61 72 67 28 28 75 6e 73 69 67 6e  mand_arg((unsign
3aa0: 65 64 20 63 68 61 72 29 61 72 67 50 6f 73 29 3b  ed char)argPos);
3ab0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
3ac0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f 72 74  ;.}../*.** Short
3ad0: 2d 68 61 6e 64 20 66 6f 72 6d 20 6f 66 20 6a 73  -hand form of js
3ae0: 6f 6e 5f 66 69 6e 64 5f 6f 70 74 69 6f 6e 5f 63  on_find_option_c
3af0: 73 74 72 32 28 7a 4b 65 79 2c 7a 43 4c 49 4c 6f  str2(zKey,zCLILo
3b00: 6e 67 2c 7a 43 4c 49 53 68 6f 72 74 2c 2d 31 29  ng,zCLIShort,-1)
3b10: 2e 0a 2a 2f 0a 63 68 61 72 20 63 6f 6e 73 74 20  ..*/.char const 
3b20: 2a 20 6a 73 6f 6e 5f 66 69 6e 64 5f 6f 70 74 69  * json_find_opti
3b30: 6f 6e 5f 63 73 74 72 28 63 68 61 72 20 63 6f 6e  on_cstr(char con
3b40: 73 74 20 2a 20 7a 4b 65 79 2c 0a 20 20 20 20 20  st * zKey,.     
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68                ch
3b70: 61 72 20 63 6f 6e 73 74 20 2a 20 7a 43 4c 49 4c  ar const * zCLIL
3b80: 6f 6e 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ong,.           
3b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ba0: 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e          char con
3bb0: 73 74 20 2a 20 7a 43 4c 49 53 68 6f 72 74 29 7b  st * zCLIShort){
3bc0: 0a 20 20 72 65 74 75 72 6e 20 6a 73 6f 6e 5f 66  .  return json_f
3bd0: 69 6e 64 5f 6f 70 74 69 6f 6e 5f 63 73 74 72 32  ind_option_cstr2
3be0: 28 7a 4b 65 79 2c 20 7a 43 4c 49 4c 6f 6e 67 2c  (zKey, zCLILong,
3bf0: 20 7a 43 4c 49 53 68 6f 72 74 2c 20 2d 31 29 3b   zCLIShort, -1);
3c00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62 6f  .}../*.** The bo
3c10: 6f 6c 65 61 6e 20 65 71 75 69 76 61 6c 65 6e 74  olean equivalent
3c20: 20 6f 66 20 6a 73 6f 6e 5f 66 69 6e 64 5f 6f 70   of json_find_op
3c30: 74 69 6f 6e 5f 63 73 74 72 28 29 2e 0a 2a 2a 20  tion_cstr()..** 
3c40: 49 66 20 74 68 65 20 6f 70 74 69 6f 6e 20 69 73  If the option is
3c50: 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 64 66 74 6c   not found, dftl
3c60: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
3c70: 0a 69 6e 74 20 6a 73 6f 6e 5f 66 69 6e 64 5f 6f  .int json_find_o
3c80: 70 74 69 6f 6e 5f 62 6f 6f 6c 28 63 68 61 72 20  ption_bool(char 
3c90: 63 6f 6e 73 74 20 2a 20 7a 4b 65 79 2c 0a 20 20  const * zKey,.  
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cb0: 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e          char con
3cc0: 73 74 20 2a 20 7a 43 4c 49 4c 6f 6e 67 2c 0a 20  st * zCLILong,. 
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ce0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f           char co
3cf0: 6e 73 74 20 2a 20 7a 43 4c 49 53 68 6f 72 74 2c  nst * zCLIShort,
3d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3d10: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
3d20: 66 6c 74 20 29 7b 0a 20 20 69 6e 74 20 72 63 20  flt ){.  int rc 
3d30: 3d 20 2d 31 3b 0a 20 20 69 66 28 21 67 2e 69 73  = -1;.  if(!g.is
3d40: 48 54 54 50 29 7b 0a 20 20 20 20 69 66 28 4e 55  HTTP){.    if(NU
3d50: 4c 4c 20 21 3d 20 66 69 6e 64 5f 6f 70 74 69 6f  LL != find_optio
3d60: 6e 28 7a 43 4c 49 4c 6f 6e 67 20 3f 20 7a 43 4c  n(zCLILong ? zCL
3d70: 49 4c 6f 6e 67 20 3a 20 7a 4b 65 79 2c 0a 20 20  ILong : zKey,.  
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d90: 20 20 20 20 20 20 20 20 20 7a 43 4c 49 53 68 6f           zCLISho
3da0: 72 74 2c 20 30 29 29 7b 0a 20 20 20 20 20 20 72  rt, 0)){.      r
3db0: 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
3dc0: 0a 20 20 69 66 28 28 2d 31 3d 3d 72 63 29 20 26  .  if((-1==rc) &
3dd0: 26 20 66 6f 73 73 69 6c 5f 68 61 73 5f 6a 73 6f  & fossil_has_jso
3de0: 6e 28 29 29 7b 0a 20 20 20 20 72 63 20 3d 20 6a  n()){.    rc = j
3df0: 73 6f 6e 5f 67 65 74 65 6e 76 5f 62 6f 6f 6c 28  son_getenv_bool(
3e00: 7a 4b 65 79 2c 2d 31 29 3b 0a 20 20 7d 0a 20 20  zKey,-1);.  }.  
3e10: 72 65 74 75 72 6e 20 28 2d 31 3d 3d 72 63 29 20  return (-1==rc) 
3e20: 3f 20 64 66 6c 74 20 3a 20 72 63 3b 0a 7d 0a 0a  ? dflt : rc;.}..
3e30: 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 65  /*.** The intege
3e40: 72 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20  r equivalent of 
3e50: 6a 73 6f 6e 5f 66 69 6e 64 5f 6f 70 74 69 6f 6e  json_find_option
3e60: 5f 63 73 74 72 32 28 29 2e 0a 2a 2a 20 49 66 20  _cstr2()..** If 
3e70: 74 68 65 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f  the option is no
3e80: 74 20 66 6f 75 6e 64 2c 20 64 66 74 6c 20 69 73  t found, dftl is
3e90: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
3ea0: 74 20 6a 73 6f 6e 5f 66 69 6e 64 5f 6f 70 74 69  t json_find_opti
3eb0: 6f 6e 5f 69 6e 74 28 63 68 61 72 20 63 6f 6e 73  on_int(char cons
3ec0: 74 20 2a 20 7a 4b 65 79 2c 0a 20 20 20 20 20 20  t * zKey,.      
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ee0: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 20     char const * 
3ef0: 7a 43 4c 49 4c 6f 6e 67 2c 0a 20 20 20 20 20 20  zCLILong,.      
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f10: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 20     char const * 
3f20: 7a 43 4c 49 53 68 6f 72 74 2c 0a 20 20 20 20 20  zCLIShort,.     
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f40: 20 20 20 20 69 6e 74 20 64 66 6c 74 20 29 7b 0a      int dflt ){.
3f50: 20 20 65 6e 75 6d 20 7b 20 4d 61 67 69 63 20 3d    enum { Magic =
3f60: 20 2d 31 39 34 37 38 35 34 38 33 32 20 7d 3b 0a   -1947854832 };.
3f70: 20 20 69 6e 74 20 72 63 20 3d 20 4d 61 67 69 63    int rc = Magic
3f80: 3b 0a 20 20 69 66 28 21 67 2e 69 73 48 54 54 50  ;.  if(!g.isHTTP
3f90: 29 7b 0a 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a  ){.    /* FIXME:
3fa0: 20 75 73 65 20 73 74 72 74 6f 6c 28 29 20 66 6f   use strtol() fo
3fb0: 72 20 62 65 74 74 65 72 20 65 72 72 6f 72 2f 64  r better error/d
3fc0: 66 6c 74 20 68 61 6e 64 6c 69 6e 67 2e 20 2a 2f  flt handling. */
3fd0: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
3fe0: 2a 20 6f 70 74 20 3d 20 66 69 6e 64 5f 6f 70 74  * opt = find_opt
3ff0: 69 6f 6e 28 7a 43 4c 49 4c 6f 6e 67 20 3f 20 7a  ion(zCLILong ? z
4000: 43 4c 49 4c 6f 6e 67 20 3a 20 7a 4b 65 79 2c 0a  CLILong : zKey,.
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4030: 20 20 20 7a 43 4c 49 53 68 6f 72 74 2c 20 31 29     zCLIShort, 1)
4040: 3b 0a 20 20 20 20 69 66 28 4e 55 4c 4c 21 3d 6f  ;.    if(NULL!=o
4050: 70 74 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  pt){.      rc = 
4060: 61 74 6f 69 28 6f 70 74 29 3b 0a 20 20 20 20 7d  atoi(opt);.    }
4070: 0a 20 20 7d 0a 20 20 69 66 28 4d 61 67 69 63 3d  .  }.  if(Magic=
4080: 3d 72 63 29 7b 0a 20 20 20 20 72 63 20 3d 20 6a  =rc){.    rc = j
4090: 73 6f 6e 5f 67 65 74 65 6e 76 5f 69 6e 74 28 7a  son_getenv_int(z
40a0: 4b 65 79 2c 4d 61 67 69 63 29 3b 0a 20 20 7d 0a  Key,Magic);.  }.
40b0: 20 20 72 65 74 75 72 6e 20 28 4d 61 67 69 63 3d    return (Magic=
40c0: 3d 72 63 29 20 3f 20 64 66 6c 74 20 3a 20 72 63  =rc) ? dflt : rc
40d0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 73  ;.}.../*.** Adds
40e0: 20 76 20 74 6f 20 67 2e 6a 73 6f 6e 2e 70 61 72   v to g.json.par
40f0: 61 6d 2e 6f 20 75 73 69 6e 67 20 74 68 65 20 67  am.o using the g
4100: 69 76 65 6e 20 6b 65 79 2e 20 4d 61 79 20 63 61  iven key. May ca
4110: 75 73 65 20 61 6e 79 20 70 72 69 6f 72 0a 2a 2a  use any prior.**
4120: 20 69 74 65 6d 20 77 69 74 68 20 74 68 61 74 20   item with that 
4130: 6b 65 79 20 74 6f 20 62 65 20 64 65 73 74 72 6f  key to be destro
4140: 79 65 64 20 28 64 65 70 65 6e 64 73 20 6f 6e 20  yed (depends on 
4150: 63 75 72 72 65 6e 74 20 72 65 66 65 72 65 6e 63  current referenc
4160: 65 0a 2a 2a 20 63 6f 75 6e 74 20 66 6f 72 20 74  e.** count for t
4170: 68 61 74 20 76 61 6c 75 65 29 2e 20 4f 6e 20 73  hat value). On s
4180: 75 63 63 65 73 73 2c 20 74 72 61 6e 73 66 65 72  uccess, transfer
4190: 73 20 28 6f 72 20 73 68 61 72 65 73 29 20 6f 77  s (or shares) ow
41a0: 6e 65 72 73 68 69 70 0a 2a 2a 20 6f 66 20 76 20  nership.** of v 
41b0: 74 6f 20 28 6f 72 20 77 69 74 68 29 20 67 2e 6a  to (or with) g.j
41c0: 73 6f 6e 2e 70 61 72 61 6d 2e 6f 2e 20 4f 6e 20  son.param.o. On 
41d0: 65 72 72 6f 72 20 6f 77 6e 65 72 73 68 69 70 20  error ownership 
41e0: 6f 66 20 76 20 69 73 20 6e 6f 74 0a 2a 2a 20 6d  of v is not.** m
41f0: 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20  odified..*/.int 
4200: 6a 73 6f 6e 5f 73 65 74 65 6e 76 28 20 63 68 61  json_setenv( cha
4210: 72 20 63 6f 6e 73 74 20 2a 20 7a 4b 65 79 2c 20  r const * zKey, 
4220: 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 76 20 29  cson_value * v )
4230: 7b 0a 20 20 72 65 74 75 72 6e 20 63 73 6f 6e 5f  {.  return cson_
4240: 6f 62 6a 65 63 74 5f 73 65 74 28 20 67 2e 6a 73  object_set( g.js
4250: 6f 6e 2e 70 61 72 61 6d 2e 6f 2c 20 7a 4b 65 79  on.param.o, zKey
4260: 2c 20 76 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , v );.}../*.** 
4270: 47 75 65 73 73 65 73 20 61 20 52 45 53 50 4f 4e  Guesses a RESPON
4280: 53 45 20 43 6f 6e 74 65 6e 74 2d 54 79 70 65 20  SE Content-Type 
4290: 76 61 6c 75 65 20 62 61 73 65 64 20 28 70 72 69  value based (pri
42a0: 6d 61 72 69 6c 79 29 20 6f 6e 20 74 68 65 0a 2a  marily) on the.*
42b0: 2a 20 48 54 54 50 5f 41 43 43 45 50 54 20 68 65  * HTTP_ACCEPT he
42c0: 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 77  ader..**.** It w
42d0: 69 6c 6c 20 74 72 79 20 74 6f 20 66 69 67 75 72  ill try to figur
42e0: 65 20 6f 75 74 20 69 66 20 74 68 65 20 63 6c 69  e out if the cli
42f0: 65 6e 74 20 63 61 6e 20 73 75 70 70 6f 72 74 0a  ent can support.
4300: 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6a  ** application/j
4310: 73 6f 6e 20 6f 72 20 61 70 70 6c 69 63 61 74 69  son or applicati
4320: 6f 6e 2f 6a 61 76 61 73 63 72 69 70 74 2c 20 61  on/javascript, a
4330: 6e 64 20 77 69 6c 6c 20 66 61 6c 6c 20 62 61 63  nd will fall bac
4340: 6b 20 74 6f 0a 2a 2a 20 74 65 78 74 2f 70 6c 61  k to.** text/pla
4350: 69 6e 20 69 66 20 69 74 20 63 61 6e 6e 6f 74 20  in if it cannot 
4360: 66 69 67 75 72 65 20 6f 75 74 20 61 6e 79 74 68  figure out anyth
4370: 69 6e 67 20 6d 6f 72 65 20 73 70 65 63 69 66 69  ing more specifi
4380: 63 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 65  c..**.** Returne
4390: 64 20 6d 65 6d 6f 72 79 20 69 73 20 73 74 61 74  d memory is stat
43a0: 69 63 20 61 6e 64 20 69 6d 6d 75 74 61 62 6c 65  ic and immutable
43b0: 2c 20 62 75 74 20 69 66 20 74 68 65 20 65 6e 76  , but if the env
43c0: 69 72 6f 6e 6d 65 6e 74 0a 2a 2a 20 63 68 61 6e  ironment.** chan
43d0: 67 65 73 20 61 66 74 65 72 20 63 61 6c 6c 69 6e  ges after callin
43e0: 67 20 74 68 69 73 20 74 68 65 6e 20 73 75 62 73  g this then subs
43f0: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
4400: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
4410: 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 64 69   might return di
4420: 66 66 65 72 65 6e 74 20 28 61 6c 73 6f 20 73 74  fferent (also st
4430: 61 74 69 63 2f 69 6d 6d 75 74 61 62 6c 65 29 20  atic/immutable) 
4440: 76 61 6c 75 65 73 2e 0a 2a 2f 0a 63 68 61 72 20  values..*/.char 
4450: 63 6f 6e 73 74 20 2a 20 6a 73 6f 6e 5f 67 75 65  const * json_gue
4460: 73 73 5f 63 6f 6e 74 65 6e 74 5f 74 79 70 65 28  ss_content_type(
4470: 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ){.  char const 
4480: 2a 20 63 73 65 74 3b 0a 20 20 63 68 61 72 20 64  * cset;.  char d
4490: 6f 55 74 66 38 3b 0a 20 20 63 73 65 74 20 3d 20  oUtf8;.  cset = 
44a0: 50 44 28 22 48 54 54 50 5f 41 43 43 45 50 54 5f  PD("HTTP_ACCEPT_
44b0: 43 48 41 52 53 45 54 22 2c 4e 55 4c 4c 29 3b 0a  CHARSET",NULL);.
44c0: 20 20 64 6f 55 74 66 38 20 3d 20 28 28 4e 55 4c    doUtf8 = ((NUL
44d0: 4c 20 3d 3d 20 63 73 65 74 29 20 7c 7c 20 28 4e  L == cset) || (N
44e0: 55 4c 4c 21 3d 73 74 72 73 74 72 28 22 75 74 66  ULL!=strstr("utf
44f0: 2d 38 22 2c 63 73 65 74 29 29 29 0a 20 20 20 20  -8",cset))).    
4500: 3f 20 31 20 3a 20 30 3b 0a 20 20 69 66 28 20 67  ? 1 : 0;.  if( g
4510: 2e 6a 73 6f 6e 2e 6a 73 6f 6e 70 20 29 7b 0a 20  .json.jsonp ){. 
4520: 20 20 20 72 65 74 75 72 6e 20 64 6f 55 74 66 38     return doUtf8
4530: 0a 20 20 20 20 20 20 3f 20 22 61 70 70 6c 69 63  .      ? "applic
4540: 61 74 69 6f 6e 2f 6a 61 76 61 73 63 72 69 70 74  ation/javascript
4550: 3b 20 63 68 61 72 73 65 74 3d 75 74 66 2d 38 22  ; charset=utf-8"
4560: 0a 20 20 20 20 20 20 3a 20 22 61 70 70 6c 69 63  .      : "applic
4570: 61 74 69 6f 6e 2f 6a 61 76 61 73 63 72 69 70 74  ation/javascript
4580: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
4590: 2f 2a 0a 20 20 20 20 20 20 43 6f 6e 74 65 6e 74  /*.      Content
45a0: 2d 74 79 70 65 0a 0a 20 20 20 20 20 20 49 66 20  -type..      If 
45b0: 74 68 65 20 62 72 6f 77 73 65 72 20 64 6f 65 73  the browser does
45c0: 20 6e 6f 74 20 73 65 6e 74 20 61 6e 20 41 43 43   not sent an ACC
45d0: 45 50 54 20 66 6f 72 20 61 70 70 6c 69 63 61 74  EPT for applicat
45e0: 69 6f 6e 2f 6a 73 6f 6e 0a 20 20 20 20 20 20 74  ion/json.      t
45f0: 68 65 6e 20 77 65 20 66 61 6c 6c 20 62 61 63 6b  hen we fall back
4600: 20 74 6f 20 74 65 78 74 2f 70 6c 61 69 6e 2e 0a   to text/plain..
4610: 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20      */.    char 
4620: 63 6f 6e 73 74 20 2a 20 63 73 74 72 3b 0a 20 20  const * cstr;.  
4630: 20 20 63 73 74 72 20 3d 20 50 44 28 22 48 54 54    cstr = PD("HTT
4640: 50 5f 41 43 43 45 50 54 22 2c 4e 55 4c 4c 29 3b  P_ACCEPT",NULL);
4650: 0a 20 20 20 20 69 66 28 20 4e 55 4c 4c 20 3d 3d  .    if( NULL ==
4660: 20 63 73 74 72 20 29 7b 0a 20 20 20 20 20 20 72   cstr ){.      r
4670: 65 74 75 72 6e 20 64 6f 55 74 66 38 0a 20 20 20  eturn doUtf8.   
4680: 20 20 20 20 20 3f 20 22 61 70 70 6c 69 63 61 74       ? "applicat
4690: 69 6f 6e 2f 6a 73 6f 6e 3b 20 63 68 61 72 73 65  ion/json; charse
46a0: 74 3d 75 74 66 2d 38 22 0a 20 20 20 20 20 20 20  t=utf-8".       
46b0: 20 3a 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f   : "application/
46c0: 6a 73 6f 6e 22 3b 0a 20 20 20 20 7d 65 6c 73 65  json";.    }else
46d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 73  {.      if( strs
46e0: 74 72 28 20 63 73 74 72 2c 20 22 61 70 70 6c 69  tr( cstr, "appli
46f0: 63 61 74 69 6f 6e 2f 6a 73 6f 6e 22 20 29 0a 20  cation/json" ). 
4700: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 73           || strs
4710: 74 72 28 20 63 73 74 72 2c 20 22 2a 2f 2a 22 20  tr( cstr, "*/*" 
4720: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
4730: 75 72 6e 20 64 6f 55 74 66 38 0a 20 20 20 20 20  urn doUtf8.     
4740: 20 20 20 20 20 3f 20 22 61 70 70 6c 69 63 61 74       ? "applicat
4750: 69 6f 6e 2f 6a 73 6f 6e 3b 20 63 68 61 72 73 65  ion/json; charse
4760: 74 3d 75 74 66 2d 38 22 0a 20 20 20 20 20 20 20  t=utf-8".       
4770: 20 20 20 3a 20 22 61 70 70 6c 69 63 61 74 69 6f     : "applicatio
4780: 6e 2f 6a 73 6f 6e 22 3b 0a 20 20 20 20 20 20 7d  n/json";.      }
4790: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
47a0: 74 75 72 6e 20 22 74 65 78 74 2f 70 6c 61 69 6e  turn "text/plain
47b0: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ";.      }.    }
47c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
47d0: 6e 64 73 20 70 52 65 73 70 6f 6e 73 65 20 74 6f  nds pResponse to
47e0: 20 74 68 65 20 6f 75 74 70 75 74 20 73 74 72 65   the output stre
47f0: 61 6d 20 61 73 20 74 68 65 20 72 65 73 70 6f 6e  am as the respon
4800: 73 65 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  se object.  This
4810: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  .** function doe
4820: 73 20 6e 6f 20 76 61 6c 69 64 61 74 69 6f 6e 20  s no validation 
4830: 6f 66 20 70 52 65 73 70 6f 6e 73 65 20 65 78 63  of pResponse exc
4840: 65 70 74 20 74 6f 20 61 73 73 65 72 74 28 29 20  ept to assert() 
4850: 74 68 61 74 20 69 74 0a 2a 2a 20 69 73 20 6e 6f  that it.** is no
4860: 74 20 4e 55 4c 4c 2e 20 54 68 65 20 63 61 6c 6c  t NULL. The call
4870: 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
4880: 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74  e for ensuring t
4890: 68 61 74 20 69 74 20 6d 65 65 74 73 0a 2a 2a 20  hat it meets.** 
48a0: 41 50 49 20 72 65 73 70 6f 6e 73 65 20 65 6e 76  API response env
48b0: 65 6c 6f 70 65 20 63 6f 6e 76 65 6e 74 69 6f 6e  elope convention
48c0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 43 4c 49 20  s..**.** In CLI 
48d0: 6d 6f 64 65 20 70 52 65 73 70 6f 6e 73 65 20 69  mode pResponse i
48e0: 73 20 73 65 6e 74 20 74 6f 20 73 74 64 6f 75 74  s sent to stdout
48f0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e   immediately. In
4900: 20 48 54 54 50 0a 2a 2a 20 6d 6f 64 65 20 70 52   HTTP.** mode pR
4910: 65 73 70 6f 6e 73 65 20 72 65 70 6c 61 63 65 73  esponse replaces
4920: 20 61 6e 79 20 63 75 72 72 65 6e 74 20 43 47 49   any current CGI
4930: 20 63 6f 6e 74 65 6e 74 20 62 75 74 20 63 67 69   content but cgi
4940: 5f 72 65 70 6c 79 28 29 0a 2a 2a 20 69 73 20 6e  _reply().** is n
4950: 6f 74 20 63 61 6c 6c 65 64 20 74 6f 20 66 6c 75  ot called to flu
4960: 73 68 20 74 68 65 20 6f 75 74 70 75 74 2e 0a 2a  sh the output..*
4970: 2a 0a 2a 2a 20 49 66 20 67 2e 6a 73 6f 6e 2e 6a  *.** If g.json.j
4980: 73 6f 6e 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  sonp is not NULL
4990: 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   then the conten
49a0: 74 20 74 79 70 65 20 69 73 20 73 65 74 20 74 6f  t type is set to
49b0: 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 2f  .** application/
49c0: 6a 61 76 61 73 63 72 69 70 74 20 61 6e 64 20 74  javascript and t
49d0: 68 65 20 6f 75 74 70 75 74 20 69 73 20 77 72 61  he output is wra
49e0: 70 70 65 64 20 69 6e 20 61 20 6a 73 6f 6e 70 0a  pped in a jsonp.
49f0: 2a 2a 20 77 72 61 70 70 65 72 2e 0a 2a 2f 0a 76  ** wrapper..*/.v
4a00: 6f 69 64 20 6a 73 6f 6e 5f 73 65 6e 64 5f 72 65  oid json_send_re
4a10: 73 70 6f 6e 73 65 28 20 63 73 6f 6e 5f 76 61 6c  sponse( cson_val
4a20: 75 65 20 63 6f 6e 73 74 20 2a 20 70 52 65 73 70  ue const * pResp
4a30: 6f 6e 73 65 20 29 7b 0a 20 20 61 73 73 65 72 74  onse ){.  assert
4a40: 28 20 4e 55 4c 4c 20 21 3d 20 70 52 65 73 70 6f  ( NULL != pRespo
4a50: 6e 73 65 20 29 3b 0a 20 20 69 66 28 20 67 2e 69  nse );.  if( g.i
4a60: 73 48 54 54 50 20 29 7b 0a 20 20 20 20 63 67 69  sHTTP ){.    cgi
4a70: 5f 72 65 73 65 74 5f 63 6f 6e 74 65 6e 74 28 29  _reset_content()
4a80: 3b 0a 20 20 20 20 69 66 28 20 67 2e 6a 73 6f 6e  ;.    if( g.json
4a90: 2e 6a 73 6f 6e 70 20 29 7b 0a 20 20 20 20 20 20  .jsonp ){.      
4aa0: 63 67 69 5f 70 72 69 6e 74 66 28 22 25 73 28 22  cgi_printf("%s("
4ab0: 2c 67 2e 6a 73 6f 6e 2e 6a 73 6f 6e 70 29 3b 0a  ,g.json.jsonp);.
4ac0: 20 20 20 20 7d 0a 20 20 20 20 63 73 6f 6e 5f 6f      }.    cson_o
4ad0: 75 74 70 75 74 28 20 70 52 65 73 70 6f 6e 73 65  utput( pResponse
4ae0: 2c 20 63 73 6f 6e 5f 64 61 74 61 5f 64 65 73 74  , cson_data_dest
4af0: 5f 63 67 69 2c 20 4e 55 4c 4c 2c 20 26 67 2e 6a  _cgi, NULL, &g.j
4b00: 73 6f 6e 2e 6f 75 74 4f 70 74 20 29 3b 0a 20 20  son.outOpt );.  
4b10: 20 20 69 66 28 20 67 2e 6a 73 6f 6e 2e 6a 73 6f    if( g.json.jso
4b20: 6e 70 20 29 7b 0a 20 20 20 20 20 20 63 67 69 5f  np ){.      cgi_
4b30: 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 22  append_content("
4b40: 29 22 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  )",1);.    }.  }
4b50: 65 6c 73 65 7b 2f 2a 43 4c 49 20 6d 6f 64 65 2a  else{/*CLI mode*
4b60: 2f 0a 20 20 20 20 69 66 28 20 67 2e 6a 73 6f 6e  /.    if( g.json
4b70: 2e 6a 73 6f 6e 70 20 29 7b 0a 20 20 20 20 20 20  .jsonp ){.      
4b80: 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 22  fprintf(stdout,"
4b90: 25 73 28 22 2c 67 2e 6a 73 6f 6e 2e 6a 73 6f 6e  %s(",g.json.json
4ba0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 73  p);.    }.    cs
4bb0: 6f 6e 5f 6f 75 74 70 75 74 5f 46 49 4c 45 28 20  on_output_FILE( 
4bc0: 70 52 65 73 70 6f 6e 73 65 2c 20 73 74 64 6f 75  pResponse, stdou
4bd0: 74 2c 20 26 67 2e 6a 73 6f 6e 2e 6f 75 74 4f 70  t, &g.json.outOp
4be0: 74 20 29 3b 0a 20 20 20 20 69 66 28 20 67 2e 6a  t );.    if( g.j
4bf0: 73 6f 6e 2e 6a 73 6f 6e 70 20 29 7b 0a 20 20 20  son.jsonp ){.   
4c00: 20 20 20 66 77 72 69 74 65 28 22 29 5c 6e 22 2c     fwrite(")\n",
4c10: 20 32 2c 20 31 2c 20 73 74 64 6f 75 74 29 3b 0a   2, 1, stdout);.
4c20: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
4c30: 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 63  ** Returns the c
4c40: 75 72 72 65 6e 74 20 72 65 71 75 65 73 74 27 73  urrent request's
4c50: 20 4a 53 4f 4e 20 61 75 74 68 65 6e 74 69 63 61   JSON authentica
4c60: 74 69 6f 6e 20 74 6f 6b 65 6e 2c 20 6f 72 20 4e  tion token, or N
4c70: 55 4c 4c 20 69 66 0a 2a 2a 20 6e 6f 6e 65 20 69  ULL if.** none i
4c80: 73 20 66 6f 75 6e 64 2e 20 54 68 65 20 74 6f 6b  s found. The tok
4c90: 65 6e 27 73 20 6d 65 6d 6f 72 79 20 69 73 20 6f  en's memory is o
4ca0: 77 6e 65 64 20 62 79 20 28 6f 72 20 73 68 61 72  wned by (or shar
4cb0: 65 64 20 77 69 74 68 29 0a 2a 2a 20 67 2e 6a 73  ed with).** g.js
4cc0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  on..**.** If an 
4cd0: 61 75 74 68 20 74 6f 6b 65 6e 20 69 73 20 66 6f  auth token is fo
4ce0: 75 6e 64 20 69 6e 20 74 68 65 20 47 45 54 2f 50  und in the GET/P
4cf0: 4f 53 54 20 72 65 71 75 65 73 74 20 64 61 74 61  OST request data
4d00: 20 74 68 65 6e 20 66 6f 73 73 69 6c 0a 2a 2a 20   then fossil.** 
4d10: 69 73 20 67 69 76 65 6e 20 74 68 61 74 20 64 61  is given that da
4d20: 74 61 20 66 6f 72 20 75 73 65 20 69 6e 20 61 75  ta for use in au
4d30: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 6f 72  thentication for
4d40: 20 74 68 69 73 0a 2a 2a 20 73 65 73 73 69 6f 6e   this.** session
4d50: 2e 20 69 2e 65 2e 20 74 68 65 20 47 45 54 2f 50  . i.e. the GET/P
4d60: 4f 53 54 20 64 61 74 61 20 6f 76 65 72 72 69 64  OST data overrid
4d70: 65 73 20 66 6f 73 73 69 6c 27 73 20 61 75 74 68  es fossil's auth
4d80: 65 6e 74 69 63 61 74 69 6f 6e 0a 2a 2a 20 63 6f  entication.** co
4d90: 6f 6b 69 65 20 76 61 6c 75 65 20 28 69 66 20 61  okie value (if a
4da0: 6e 79 29 20 61 6e 64 20 61 6c 73 6f 20 77 6f 72  ny) and also wor
4db0: 6b 73 20 77 69 74 68 20 63 6c 69 65 6e 74 73 20  ks with clients 
4dc0: 77 68 69 63 68 20 64 6f 20 6e 6f 74 0a 2a 2a 20  which do not.** 
4dd0: 73 75 70 70 6f 72 74 20 63 6f 6f 6b 69 65 73 2e  support cookies.
4de0: 0a 2a 2a 0a 2a 2a 20 4d 75 73 74 20 62 65 20 63  .**.** Must be c
4df0: 61 6c 6c 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  alled once befor
4e00: 65 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72  e login_check_cr
4e10: 65 64 65 6e 74 69 61 6c 73 28 29 20 69 73 20 63  edentials() is c
4e20: 61 6c 6c 65 64 20 6f 72 0a 2a 2a 20 77 65 20 77  alled or.** we w
4e30: 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
4e40: 74 6f 20 72 65 70 6c 61 63 65 20 66 6f 73 73 69  to replace fossi
4e50: 6c 27 73 20 69 6e 74 65 72 6e 61 6c 20 69 64 65  l's internal ide
4e60: 61 20 6f 66 20 74 68 65 20 61 75 74 68 0a 2a 2a  a of the auth.**
4e70: 20 69 6e 66 6f 20 69 6e 20 74 69 6d 65 20 28 61   info in time (a
4e80: 6e 64 20 66 75 74 75 72 65 20 63 68 61 6e 67 65  nd future change
4e90: 73 20 74 6f 20 74 68 61 74 20 73 74 61 74 65 20  s to that state 
4ea0: 6d 61 79 20 63 61 75 73 65 20 75 6e 65 78 70 65  may cause unexpe
4eb0: 63 74 65 64 0a 2a 2a 20 72 65 73 75 6c 74 73 29  cted.** results)
4ec0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75  ..**.** The resu
4ed0: 6c 74 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20  lt of this call 
4ee0: 61 72 65 20 63 61 63 68 65 64 20 66 6f 72 20 66  are cached for f
4ef0: 75 74 75 72 65 20 63 61 6c 6c 73 2e 0a 2a 2f 0a  uture calls..*/.
4f00: 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f  cson_value * jso
4f10: 6e 5f 61 75 74 68 5f 74 6f 6b 65 6e 28 29 7b 0a  n_auth_token(){.
4f20: 20 20 20 20 61 73 73 65 72 74 28 67 2e 6a 73 6f      assert(g.jso
4f30: 6e 2e 67 63 2e 61 20 26 26 20 22 6a 73 6f 6e 5f  n.gc.a && "json_
4f40: 6d 61 69 6e 5f 62 6f 6f 74 73 74 72 61 70 28 29  main_bootstrap()
4f50: 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 21   was not called!
4f60: 22 29 3b 0a 20 20 20 20 69 66 28 20 21 67 2e 6a  ");.    if( !g.j
4f70: 73 6f 6e 2e 61 75 74 68 54 6f 6b 65 6e 20 29 7b  son.authToken ){
4f80: 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 67  .    /* Try to g
4f90: 65 74 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74  et an authorizat
4fa0: 69 6f 6e 20 74 6f 6b 65 6e 20 66 72 6f 6d 20 47  ion token from G
4fb0: 45 54 20 70 61 72 61 6d 65 74 65 72 2c 20 50 4f  ET parameter, PO
4fc0: 53 54 65 64 0a 20 20 20 20 20 20 20 4a 53 4f 4e  STed.       JSON
4fd0: 2c 20 6f 72 20 66 6f 73 73 69 6c 20 63 6f 6f 6b  , or fossil cook
4fe0: 69 65 20 28 69 6e 20 74 68 61 74 20 6f 72 64 65  ie (in that orde
4ff0: 72 29 2e 20 2a 2f 0a 20 20 20 20 67 2e 6a 73 6f  r). */.    g.jso
5000: 6e 2e 61 75 74 68 54 6f 6b 65 6e 20 3d 20 6a 73  n.authToken = js
5010: 6f 6e 5f 67 65 74 65 6e 76 28 46 6f 73 73 69 6c  on_getenv(Fossil
5020: 4a 73 6f 6e 4b 65 79 73 2e 61 75 74 68 54 6f 6b  JsonKeys.authTok
5030: 65 6e 29 3b 0a 20 20 20 20 69 66 28 67 2e 6a 73  en);.    if(g.js
5040: 6f 6e 2e 61 75 74 68 54 6f 6b 65 6e 0a 20 20 20  on.authToken.   
5050: 20 20 20 20 26 26 20 63 73 6f 6e 5f 76 61 6c 75      && cson_valu
5060: 65 5f 69 73 5f 73 74 72 69 6e 67 28 67 2e 6a 73  e_is_string(g.js
5070: 6f 6e 2e 61 75 74 68 54 6f 6b 65 6e 29 0a 20 20  on.authToken).  
5080: 20 20 20 20 20 26 26 20 21 50 44 28 6c 6f 67 69       && !PD(logi
5090: 6e 5f 63 6f 6f 6b 69 65 5f 6e 61 6d 65 28 29 2c  n_cookie_name(),
50a0: 4e 55 4c 4c 29 29 7b 0a 20 20 20 20 20 20 2f 2a  NULL)){.      /*
50b0: 20 74 65 6c 6c 20 66 6f 73 73 69 6c 20 74 6f 20   tell fossil to 
50c0: 75 73 65 20 74 68 69 73 20 6c 6f 67 69 6e 20 69  use this login i
50d0: 6e 66 6f 2e 0a 0a 20 20 20 20 20 20 46 49 58 4d  nfo...      FIXM
50e0: 45 3f 3a 20 62 65 63 61 75 73 65 20 74 68 65 20  E?: because the 
50f0: 4a 53 4f 4e 20 62 69 74 73 20 64 6f 6e 27 74 20  JSON bits don't 
5100: 63 61 72 72 79 20 61 72 6f 75 6e 64 0a 20 20 20  carry around.   
5110: 20 20 20 6c 6f 67 69 6e 5f 63 6f 6f 6b 69 65 5f     login_cookie_
5120: 6e 61 6d 65 28 29 2c 20 74 68 65 72 65 20 69 73  name(), there is
5130: 28 3f 29 20 61 20 70 6f 74 65 6e 74 69 61 6c 28  (?) a potential(
5140: 3f 29 20 6c 6f 67 69 6e 20 68 69 6a 61 63 6b 69  ?) login hijacki
5150: 6e 67 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 20  ng.      window 
5160: 68 65 72 65 2e 20 57 65 20 6d 61 79 20 6e 65 65  here. We may nee
5170: 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  d to change the 
5180: 4a 53 4f 4e 20 61 75 74 68 20 74 6f 6b 65 6e 20  JSON auth token 
5190: 74 6f 20 62 65 20 69 6e 0a 20 20 20 20 20 20 74  to be in.      t
51a0: 68 65 20 66 6f 72 6d 3a 20 6c 6f 67 69 6e 5f 63  he form: login_c
51b0: 6f 6f 6b 69 65 5f 6e 61 6d 65 28 29 3d 2e 2e 2e  ookie_name()=...
51c0: 0a 0a 20 20 20 20 20 20 54 68 65 6e 20 61 67 61  ..      Then aga
51d0: 69 6e 2c 20 74 68 65 20 68 61 72 64 65 6e 65 64  in, the hardened
51e0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 68 65   cookie value he
51f0: 6c 70 73 20 65 6e 73 75 72 65 20 74 68 61 74 0a  lps ensure that.
5200: 20 20 20 20 20 20 6f 6e 6c 79 20 61 20 70 72 6f        only a pro
5210: 70 65 72 20 6b 65 79 2f 76 61 6c 75 65 20 6d 61  per key/value ma
5220: 74 63 68 20 69 73 20 76 61 6c 69 64 2e 0a 20 20  tch is valid..  
5230: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 67 69      */.      cgi
5240: 5f 72 65 70 6c 61 63 65 5f 70 61 72 61 6d 65 74  _replace_paramet
5250: 65 72 28 20 6c 6f 67 69 6e 5f 63 6f 6f 6b 69 65  er( login_cookie
5260: 5f 6e 61 6d 65 28 29 2c 20 63 73 6f 6e 5f 76 61  _name(), cson_va
5270: 6c 75 65 5f 67 65 74 5f 63 73 74 72 28 67 2e 6a  lue_get_cstr(g.j
5280: 73 6f 6e 2e 61 75 74 68 54 6f 6b 65 6e 29 20 29  son.authToken) )
5290: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
52a0: 67 2e 69 73 48 54 54 50 20 29 7b 0a 20 20 20 20  g.isHTTP ){.    
52b0: 20 20 2f 2a 20 74 72 79 20 66 6f 73 73 69 6c 27    /* try fossil'
52c0: 73 20 63 6f 6e 76 65 6e 74 69 6f 6e 61 6c 20 63  s conventional c
52d0: 6f 6f 6b 69 65 2e 20 2a 2f 0a 20 20 20 20 20 20  ookie. */.      
52e0: 2f 2a 20 52 65 6d 69 6e 64 65 72 3a 20 63 68 69  /* Reminder: chi
52f0: 63 6b 65 6e 2f 65 67 67 20 73 63 65 6e 61 72 69  cken/egg scenari
5300: 6f 20 72 65 67 61 72 64 69 6e 67 20 64 62 20 61  o regarding db a
5310: 63 63 65 73 73 20 69 6e 20 43 4c 49 0a 20 20 20  ccess in CLI.   
5320: 20 20 20 20 20 20 6d 6f 64 65 20 62 65 63 61 75        mode becau
5330: 73 65 20 6c 6f 67 69 6e 5f 63 6f 6f 6b 69 65 5f  se login_cookie_
5340: 6e 61 6d 65 28 29 20 6e 65 65 64 73 20 74 68 65  name() needs the
5350: 20 64 62 2e 20 43 4c 49 0a 20 20 20 20 20 20 20   db. CLI.       
5360: 20 20 6d 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20    mode does not 
5370: 75 73 65 20 61 6e 79 20 61 75 74 68 65 6e 74 69  use any authenti
5380: 63 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 64 6f  cation, so we do
5390: 6e 27 74 20 6e 65 65 64 0a 20 20 20 20 20 20 20  n't need.       
53a0: 20 20 74 6f 20 73 75 70 70 6f 72 74 20 69 74 20    to support it 
53b0: 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
53c0: 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20       char const 
53d0: 2a 20 7a 43 6f 6f 6b 69 65 20 3d 20 50 28 6c 6f  * zCookie = P(lo
53e0: 67 69 6e 5f 63 6f 6f 6b 69 65 5f 6e 61 6d 65 28  gin_cookie_name(
53f0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43  ));.      if( zC
5400: 6f 6f 6b 69 65 20 26 26 20 2a 7a 43 6f 6f 6b 69  ookie && *zCooki
5410: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
5420: 54 72 61 6e 73 66 65 72 20 66 6f 73 73 69 6c 27  Transfer fossil'
5430: 73 20 63 6f 6f 6b 69 65 20 74 6f 20 4a 53 4f 4e  s cookie to JSON
5440: 20 66 6f 72 20 64 6f 77 6e 73 74 72 65 61 6d 20   for downstream 
5450: 63 6f 6e 76 65 6e 69 65 6e 63 65 2e 2e 2e 20 2a  convenience... *
5460: 2f 0a 20 20 20 20 20 20 20 20 63 73 6f 6e 5f 76  /.        cson_v
5470: 61 6c 75 65 20 2a 20 76 20 3d 20 63 73 6f 6e 5f  alue * v = cson_
5480: 76 61 6c 75 65 5f 6e 65 77 5f 73 74 72 69 6e 67  value_new_string
5490: 28 7a 43 6f 6f 6b 69 65 2c 20 73 74 72 6c 65 6e  (zCookie, strlen
54a0: 28 7a 43 6f 6f 6b 69 65 29 29 3b 0a 20 20 20 20  (zCookie));.    
54b0: 20 20 20 20 6a 73 6f 6e 5f 67 63 5f 61 64 64 28      json_gc_add(
54c0: 20 46 6f 73 73 69 6c 4a 73 6f 6e 4b 65 79 73 2e   FossilJsonKeys.
54d0: 61 75 74 68 54 6f 6b 65 6e 2c 20 76 20 29 3b 0a  authToken, v );.
54e0: 20 20 20 20 20 20 20 20 67 2e 6a 73 6f 6e 2e 61          g.json.a
54f0: 75 74 68 54 6f 6b 65 6e 20 3d 20 76 3b 0a 20 20  uthToken = v;.  
5500: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5510: 20 20 72 65 74 75 72 6e 20 67 2e 6a 73 6f 6e 2e    return g.json.
5520: 61 75 74 68 54 6f 6b 65 6e 3b 0a 7d 0a 0a 2f 2a  authToken;.}../*
5530: 0a 2a 2a 20 49 66 20 67 2e 6a 73 6f 6e 2e 72 65  .** If g.json.re
5540: 71 50 61 79 6c 6f 61 64 2e 6f 20 69 73 20 4e 55  qPayload.o is NU
5550: 4c 4c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20  LL then NULL is 
5560: 72 65 74 75 72 6e 65 64 2c 20 65 6c 73 65 20 74  returned, else t
5570: 68 65 0a 2a 2a 20 67 69 76 65 6e 20 70 72 6f 70  he.** given prop
5580: 65 72 74 79 20 69 73 20 73 65 61 72 63 68 65 64  erty is searched
5590: 20 66 6f 72 20 69 6e 20 74 68 65 20 72 65 71 75   for in the requ
55a0: 65 73 74 20 70 61 79 6c 6f 61 64 2e 20 20 49 66  est payload.  If
55b0: 20 66 6f 75 6e 64 20 69 74 0a 2a 2a 20 69 73 20   found it.** is 
55c0: 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 65  returned. The re
55d0: 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
55e0: 6f 77 6e 65 64 20 62 79 20 28 6f 72 20 73 68 61  owned by (or sha
55f0: 72 65 73 20 6f 77 6e 65 72 73 68 69 70 0a 2a 2a  res ownership.**
5600: 20 77 69 74 68 29 20 67 2e 6a 73 6f 6e 2c 20 61   with) g.json, a
5610: 6e 64 20 6d 75 73 74 20 4e 4f 54 20 62 65 20 63  nd must NOT be c
5620: 73 6f 6e 5f 76 61 6c 75 65 5f 66 72 65 65 28 29  son_value_free()
5630: 27 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  'd by the.** cal
5640: 6c 65 72 2e 0a 2a 2f 0a 63 73 6f 6e 5f 76 61 6c  ler..*/.cson_val
5650: 75 65 20 2a 20 6a 73 6f 6e 5f 72 65 71 5f 70 61  ue * json_req_pa
5660: 79 6c 6f 61 64 5f 67 65 74 28 63 68 61 72 20 63  yload_get(char c
5670: 6f 6e 73 74 20 2a 70 4b 65 79 29 7b 0a 20 20 72  onst *pKey){.  r
5680: 65 74 75 72 6e 20 67 2e 6a 73 6f 6e 2e 72 65 71  eturn g.json.req
5690: 50 61 79 6c 6f 61 64 2e 6f 0a 20 20 20 20 3f 20  Payload.o.    ? 
56a0: 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 67 65 74 28  cson_object_get(
56b0: 67 2e 6a 73 6f 6e 2e 72 65 71 50 61 79 6c 6f 61  g.json.reqPayloa
56c0: 64 2e 6f 2c 70 4b 65 79 29 0a 20 20 20 20 3a 20  d.o,pKey).    : 
56d0: 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  NULL;.}../*.** I
56e0: 6e 69 74 69 61 6c 69 7a 65 73 20 73 6f 6d 65 20  nitializes some 
56f0: 4a 53 4f 4e 20 62 69 74 73 20 77 68 69 63 68 20  JSON bits which 
5700: 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 69 74 69  need to be initi
5710: 61 6c 69 7a 65 64 20 72 65 6c 61 74 69 76 65 6c  alized relativel
5720: 79 0a 2a 2a 20 65 61 72 6c 79 20 6f 6e 2e 20 49  y.** early on. I
5730: 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  t should only be
5740: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 63 67 69   called from cgi
5750: 5f 69 6e 69 74 28 29 20 6f 72 0a 2a 2a 20 6a 73  _init() or.** js
5760: 6f 6e 5f 63 6d 64 5f 74 6f 70 28 29 20 28 65 61  on_cmd_top() (ea
5770: 72 6c 79 20 6f 6e 20 69 6e 20 74 68 6f 73 65 20  rly on in those 
5780: 66 75 6e 63 74 69 6f 6e 73 29 2e 0a 2a 2a 0a 2a  functions)..**.*
5790: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 73 20 67 2e  * Initializes g.
57a0: 6a 73 6f 6e 2e 67 63 20 61 6e 64 20 67 2e 6a 73  json.gc and g.js
57b0: 6f 6e 2e 70 61 72 61 6d 2e 20 54 68 69 73 20 63  on.param. This c
57c0: 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 28 61 6e  ode does not (an
57d0: 64 0a 2a 2a 20 6d 75 73 74 20 6e 6f 74 29 20 72  d.** must not) r
57e0: 65 6c 79 20 6f 6e 20 61 6e 79 20 6f 66 20 74 68  ely on any of th
57f0: 65 20 66 6f 73 73 69 6c 20 65 6e 76 69 72 6f 6e  e fossil environ
5800: 6d 65 6e 74 20 68 61 76 69 6e 67 20 62 65 65 6e  ment having been
5810: 20 73 65 74 0a 2a 2a 20 75 70 2e 20 65 2e 67 2e   set.** up. e.g.
5820: 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65   it must not use
5830: 20 63 67 69 5f 70 61 72 61 6d 65 74 65 72 28 29   cgi_parameter()
5840: 20 61 6e 64 20 66 72 69 65 6e 64 73 20 62 65 63   and friends bec
5850: 61 75 73 65 20 74 68 69 73 0a 2a 2a 20 6d 75 73  ause this.** mus
5860: 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
5870: 72 65 20 74 68 6f 73 65 20 64 61 74 61 20 61 72  re those data ar
5880: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a  e initialized..*
5890: 2f 0a 76 6f 69 64 20 6a 73 6f 6e 5f 6d 61 69 6e  /.void json_main
58a0: 5f 62 6f 6f 74 73 74 72 61 70 28 29 7b 0a 20 20  _bootstrap(){.  
58b0: 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 76 3b 0a  cson_value * v;.
58c0: 20 20 61 73 73 65 72 74 28 20 28 4e 55 4c 4c 20    assert( (NULL 
58d0: 3d 3d 20 67 2e 6a 73 6f 6e 2e 67 63 2e 76 29 20  == g.json.gc.v) 
58e0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 22 6a 73  &&.          "js
58f0: 6f 6e 5f 6d 61 69 6e 5f 62 6f 6f 74 73 74 72 61  on_main_bootstra
5900: 70 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74  p() was called t
5910: 77 69 63 65 21 22 20 29 3b 0a 0a 20 20 67 2e 6a  wice!" );..  g.j
5920: 73 6f 6e 2e 74 69 6d 65 72 49 64 20 3d 20 66 6f  son.timerId = fo
5930: 73 73 69 6c 5f 74 69 6d 65 72 5f 73 74 61 72 74  ssil_timer_start
5940: 28 29 3b 0a 0a 20 20 2f 2a 20 67 2e 6a 73 6f 6e  ();..  /* g.json
5950: 2e 67 63 20 69 73 20 6f 75 72 20 22 67 61 72 62  .gc is our "garb
5960: 61 67 65 20 63 6f 6c 6c 65 63 74 6f 72 22 20 2d  age collector" -
5970: 20 77 68 65 72 65 20 77 65 20 70 75 74 20 4a 53   where we put JS
5980: 4f 4e 20 76 61 6c 75 65 73 0a 20 20 20 20 20 77  ON values.     w
5990: 68 69 63 68 20 6e 65 65 64 20 61 20 6c 6f 6e 67  hich need a long
59a0: 20 6c 69 66 65 74 69 6d 65 20 62 75 74 20 64 6f   lifetime but do
59b0: 6e 27 74 20 68 61 76 65 20 61 20 6c 6f 67 69 63  n't have a logic
59c0: 61 6c 20 70 61 72 65 6e 74 20 74 6f 20 70 75 74  al parent to put
59d0: 0a 20 20 20 20 20 74 68 65 6d 20 69 6e 2e 0a 20  .     them in.. 
59e0: 20 2a 2f 0a 20 20 76 20 3d 20 63 73 6f 6e 5f 76   */.  v = cson_v
59f0: 61 6c 75 65 5f 6e 65 77 5f 61 72 72 61 79 28 29  alue_new_array()
5a00: 3b 0a 20 20 67 2e 6a 73 6f 6e 2e 67 63 2e 76 20  ;.  g.json.gc.v 
5a10: 3d 20 76 3b 0a 20 20 61 73 73 65 72 74 28 30 20  = v;.  assert(0 
5a20: 21 3d 20 67 2e 6a 73 6f 6e 2e 67 63 2e 76 29 3b  != g.json.gc.v);
5a30: 0a 20 20 67 2e 6a 73 6f 6e 2e 67 63 2e 61 20 3d  .  g.json.gc.a =
5a40: 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 67 65 74 5f   cson_value_get_
5a50: 61 72 72 61 79 28 76 29 3b 0a 20 20 61 73 73 65  array(v);.  asse
5a60: 72 74 28 30 20 21 3d 20 67 2e 6a 73 6f 6e 2e 67  rt(0 != g.json.g
5a70: 63 2e 61 29 3b 0a 20 20 63 73 6f 6e 5f 76 61 6c  c.a);.  cson_val
5a80: 75 65 5f 61 64 64 5f 72 65 66 65 72 65 6e 63 65  ue_add_reference
5a90: 28 76 29 0a 20 20 20 20 2f 2a 20 4e 65 65 64 65  (v).    /* Neede
5aa0: 64 20 74 6f 20 61 6c 6c 6f 77 20 75 73 20 74 6f  d to allow us to
5ab0: 20 69 6e 63 6c 75 64 65 20 74 68 69 73 20 76 61   include this va
5ac0: 6c 75 65 20 69 6e 20 6f 74 68 65 72 20 4a 53 4f  lue in other JSO
5ad0: 4e 0a 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e  N.       contain
5ae0: 65 72 73 20 77 69 74 68 6f 75 74 20 74 72 61 6e  ers without tran
5af0: 73 66 65 72 72 69 6e 67 20 6f 77 6e 65 72 73 68  sferring ownersh
5b00: 69 70 20 74 6f 20 74 68 6f 73 65 20 63 6f 6e 74  ip to those cont
5b10: 61 69 6e 65 72 73 2e 0a 20 20 20 20 20 20 20 41  ainers..       A
5b20: 6c 6c 20 6f 74 68 65 72 20 70 65 72 73 69 73 74  ll other persist
5b30: 65 6e 74 20 67 2e 6a 73 6f 6e 2e 58 58 58 2e 76  ent g.json.XXX.v
5b40: 20 76 61 6c 75 65 73 20 67 65 74 20 61 70 70 65   values get appe
5b50: 6e 64 65 64 20 74 6f 0a 20 20 20 20 20 20 20 67  nded to.       g
5b60: 2e 6a 73 6f 6e 2e 67 63 2e 61 2c 20 61 6e 64 20  .json.gc.a, and 
5b70: 74 68 65 72 65 66 6f 72 65 20 61 6c 72 65 61 64  therefore alread
5b80: 79 20 68 61 76 65 20 61 20 6c 69 76 65 20 72 65  y have a live re
5b90: 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 20 66  ference.       f
5ba0: 6f 72 20 74 68 69 73 20 70 75 72 70 6f 73 65 2e  or this purpose.
5bb0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 3b 0a 0a 20  .    */.    ;.. 
5bc0: 20 2f 2a 0a 20 20 20 20 67 2e 6a 73 6f 6e 2e 70   /*.    g.json.p
5bd0: 61 72 61 6d 20 68 6f 6c 64 73 20 74 68 65 20 4a  aram holds the J
5be0: 53 4f 4e 69 7a 65 64 20 63 6f 75 6e 74 65 72 70  SONized counterp
5bf0: 61 72 74 20 6f 66 20 66 6f 73 73 69 6c 27 73 0a  art of fossil's.
5c00: 20 20 20 20 63 67 69 5f 70 61 72 61 6d 65 74 65      cgi_paramete
5c10: 72 5f 78 78 78 28 29 20 66 61 6d 69 6c 79 20 6f  r_xxx() family o
5c20: 66 20 64 61 74 61 2e 20 57 65 20 73 74 6f 72 65  f data. We store
5c30: 20 74 68 65 6d 20 61 73 20 4a 53 4f 4e 2c 20 61   them as JSON, a
5c40: 73 0a 20 20 20 20 6f 70 70 6f 73 65 64 20 74 6f  s.    opposed to
5c50: 20 75 73 69 6e 67 20 66 6f 73 73 69 6c 27 73 20   using fossil's 
5c60: 64 61 74 61 20 64 69 72 65 63 74 6c 79 2c 20 62  data directly, b
5c70: 65 63 61 75 73 65 20 77 65 20 63 61 6e 20 72 65  ecause we can re
5c80: 74 61 69 6e 0a 20 20 20 20 66 75 6c 6c 20 74 79  tain.    full ty
5c90: 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  pe information f
5ca0: 6f 72 20 64 61 74 61 20 74 68 69 73 20 77 61 79  or data this way
5cb0: 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 20   (as opposed to 
5cc0: 69 74 20 61 6c 77 61 79 73 0a 20 20 20 20 62 65  it always.    be
5cd0: 69 6e 67 20 6f 66 20 74 79 70 65 20 73 74 72 69  ing of type stri
5ce0: 6e 67 29 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ng)..  */.  v = 
5cf0: 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 6f  cson_value_new_o
5d00: 62 6a 65 63 74 28 29 3b 0a 20 20 67 2e 6a 73 6f  bject();.  g.jso
5d10: 6e 2e 70 61 72 61 6d 2e 76 20 3d 20 76 3b 0a 20  n.param.v = v;. 
5d20: 20 67 2e 6a 73 6f 6e 2e 70 61 72 61 6d 2e 6f 20   g.json.param.o 
5d30: 3d 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 67 65 74  = cson_value_get
5d40: 5f 6f 62 6a 65 63 74 28 76 29 3b 0a 20 20 6a 73  _object(v);.  js
5d50: 6f 6e 5f 67 63 5f 61 64 64 28 22 24 50 41 52 41  on_gc_add("$PARA
5d60: 4d 53 22 2c 20 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  MS", v);.}../*.*
5d70: 2a 20 41 70 70 65 6e 64 73 20 61 20 77 61 72 6e  * Appends a warn
5d80: 69 6e 67 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  ing object to th
5d90: 65 20 28 70 65 6e 64 69 6e 67 29 20 4a 53 4f 4e  e (pending) JSON
5da0: 20 72 65 73 70 6f 6e 73 65 2e 0a 2a 2a 0a 2a 2a   response..**.**
5db0: 20 43 6f 64 65 20 6d 75 73 74 20 62 65 20 61 20   Code must be a 
5dc0: 46 53 4c 5f 4a 53 4f 4e 5f 57 5f 78 78 78 20 76  FSL_JSON_W_xxx v
5dd0: 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 46 6f  alue from the Fo
5de0: 73 73 69 6c 4a 73 6f 6e 43 6f 64 65 73 20 65 6e  ssilJsonCodes en
5df0: 75 6d 2e 0a 2a 2a 0a 2a 2a 20 41 20 57 61 72 6e  um..**.** A Warn
5e00: 69 6e 67 20 6f 62 6a 65 63 74 20 68 61 73 20 74  ing object has t
5e10: 68 69 73 20 4a 53 4f 4e 20 73 74 72 75 63 74 75  his JSON structu
5e20: 72 65 3a 0a 2a 2a 0a 2a 2a 20 7b 20 22 63 6f 64  re:.**.** { "cod
5e30: 65 22 3a 69 6e 74 65 67 65 72 2c 20 22 74 65 78  e":integer, "tex
5e40: 74 22 3a 22 73 74 72 69 6e 67 22 20 7d 0a 2a 2a  t":"string" }.**
5e50: 0a 2a 2a 20 42 75 74 20 74 68 65 20 74 65 78 74  .** But the text
5e60: 20 70 61 72 74 20 69 73 20 6f 70 74 69 6f 6e 61   part is optiona
5e70: 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6d 73 67 20  l..**.** If msg 
5e80: 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20  is non-NULL and 
5e90: 6e 6f 74 20 65 6d 70 74 79 20 74 68 65 6e 20 69  not empty then i
5ea0: 74 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  t is used as the
5eb0: 20 22 74 65 78 74 22 0a 2a 2a 20 70 72 6f 70 65   "text".** prope
5ec0: 72 74 79 27 73 20 76 61 6c 75 65 2e 20 49 74 20  rty's value. It 
5ed0: 69 73 20 63 6f 70 69 65 64 2c 20 61 6e 64 20 6e  is copied, and n
5ee0: 65 65 64 20 6e 6f 74 20 72 65 66 65 72 20 74 6f  eed not refer to
5ef0: 20 73 74 61 74 69 63 0a 2a 2a 20 6d 65 6d 6f 72   static.** memor
5f00: 79 2e 0a 2a 2a 0a 2a 2a 20 43 55 52 52 45 4e 54  y..**.** CURRENT
5f10: 4c 59 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c  LY this code onl
5f20: 79 20 61 6c 6c 6f 77 73 20 61 20 67 69 76 65 6e  y allows a given
5f30: 20 77 61 72 6e 69 6e 67 20 63 6f 64 65 20 74 6f   warning code to
5f40: 20 62 65 0a 2a 2a 20 61 64 64 65 64 20 6f 6e 65   be.** added one
5f50: 20 74 69 6d 65 2c 20 61 6e 64 20 65 6c 69 64 65   time, and elide
5f60: 73 20 73 75 62 73 65 71 75 65 6e 74 20 77 61 72  s subsequent war
5f70: 6e 69 6e 67 73 2e 20 54 68 65 20 69 6e 74 65 6e  nings. The inten
5f80: 74 69 6f 6e 0a 2a 2a 20 69 73 20 74 6f 20 72 65  tion.** is to re
5f90: 6d 6f 76 65 20 74 68 61 74 20 62 75 72 64 65 6e  move that burden
5fa0: 20 66 72 6f 6d 20 6c 6f 6f 70 73 20 77 68 69 63   from loops whic
5fb0: 68 20 70 72 6f 64 75 63 65 20 77 61 72 6e 69 6e  h produce warnin
5fc0: 67 73 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 4d 45 3a  gs..**.** FIXME:
5fd0: 20 69 66 20 6d 73 67 20 69 73 20 4e 55 4c 4c 20   if msg is NULL 
5fe0: 74 68 65 6e 20 75 73 65 20 61 20 73 74 61 6e 64  then use a stand
5ff0: 61 72 64 20 73 74 72 69 6e 67 20 66 6f 72 0a 2a  ard string for.*
6000: 2a 20 74 68 65 20 67 69 76 65 6e 20 63 6f 64 65  * the given code
6010: 2e 20 49 66 20 21 2a 6d 73 67 20 74 68 65 6e 20  . If !*msg then 
6020: 65 6c 69 64 65 20 74 68 65 20 22 74 65 78 74 22  elide the "text"
6030: 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 66 6f   property,.** fo
6040: 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 77 69  r consistency wi
6050: 74 68 20 68 6f 77 20 6a 73 6f 6e 5f 65 72 72 28  th how json_err(
6060: 29 20 77 6f 72 6b 73 2e 0a 2a 2f 0a 76 6f 69 64  ) works..*/.void
6070: 20 6a 73 6f 6e 5f 77 61 72 6e 28 20 69 6e 74 20   json_warn( int 
6080: 63 6f 64 65 2c 20 63 68 61 72 20 63 6f 6e 73 74  code, char const
6090: 20 2a 20 66 6d 74 2c 20 2e 2e 2e 20 29 7b 0a 20   * fmt, ... ){. 
60a0: 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 20 2a 20 6f   cson_object * o
60b0: 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 61 73 73  bj = NULL;.  ass
60c0: 65 72 74 28 20 28 63 6f 64 65 3e 46 53 4c 5f 4a  ert( (code>FSL_J
60d0: 53 4f 4e 5f 57 5f 53 54 41 52 54 29 0a 20 20 20  SON_W_START).   
60e0: 20 20 20 20 20 20 20 26 26 20 28 63 6f 64 65 3c         && (code<
60f0: 46 53 4c 5f 4a 53 4f 4e 5f 57 5f 45 4e 44 29 0a  FSL_JSON_W_END).
6100: 20 20 20 20 20 20 20 20 20 20 26 26 20 22 49 6e            && "In
6110: 76 61 6c 69 64 20 77 61 72 6e 69 6e 67 20 63 6f  valid warning co
6120: 64 65 2e 22 29 3b 0a 20 20 61 73 73 65 72 74 28  de.");.  assert(
6130: 67 2e 6a 73 6f 6e 2e 67 63 2e 61 20 26 26 20 22  g.json.gc.a && "
6140: 6a 73 6f 6e 5f 6d 61 69 6e 5f 62 6f 6f 74 73 74  json_main_bootst
6150: 72 61 70 28 29 20 77 61 73 20 6e 6f 74 20 63 61  rap() was not ca
6160: 6c 6c 65 64 21 22 29 3b 0a 20 20 69 66 28 21 67  lled!");.  if(!g
6170: 2e 6a 73 6f 6e 2e 77 61 72 6e 69 6e 67 73 29 7b  .json.warnings){
6180: 0a 20 20 20 20 67 2e 6a 73 6f 6e 2e 77 61 72 6e  .    g.json.warn
6190: 69 6e 67 73 20 3d 20 63 73 6f 6e 5f 6e 65 77 5f  ings = cson_new_
61a0: 61 72 72 61 79 28 29 3b 0a 20 20 20 20 61 73 73  array();.    ass
61b0: 65 72 74 28 28 4e 55 4c 4c 20 21 3d 20 67 2e 6a  ert((NULL != g.j
61c0: 73 6f 6e 2e 77 61 72 6e 69 6e 67 73 29 20 26 26  son.warnings) &&
61d0: 20 22 41 6c 6c 6f 63 20 65 72 72 6f 72 2e 22 29   "Alloc error.")
61e0: 3b 0a 20 20 20 20 6a 73 6f 6e 5f 67 63 5f 61 64  ;.    json_gc_ad
61f0: 64 28 22 24 57 41 52 4e 49 4e 47 53 22 2c 63 73  d("$WARNINGS",cs
6200: 6f 6e 5f 61 72 72 61 79 5f 76 61 6c 75 65 28 67  on_array_value(g
6210: 2e 6a 73 6f 6e 2e 77 61 72 6e 69 6e 67 73 29 29  .json.warnings))
6220: 3b 0a 20 20 7d 0a 20 20 6f 62 6a 20 3d 20 63 73  ;.  }.  obj = cs
6230: 6f 6e 5f 6e 65 77 5f 6f 62 6a 65 63 74 28 29 3b  on_new_object();
6240: 0a 20 20 63 73 6f 6e 5f 61 72 72 61 79 5f 61 70  .  cson_array_ap
6250: 70 65 6e 64 28 67 2e 6a 73 6f 6e 2e 77 61 72 6e  pend(g.json.warn
6260: 69 6e 67 73 2c 20 63 73 6f 6e 5f 6f 62 6a 65 63  ings, cson_objec
6270: 74 5f 76 61 6c 75 65 28 6f 62 6a 29 29 3b 0a 20  t_value(obj));. 
6280: 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65 74   cson_object_set
6290: 28 6f 62 6a 2c 22 63 6f 64 65 22 2c 63 73 6f 6e  (obj,"code",cson
62a0: 5f 76 61 6c 75 65 5f 6e 65 77 5f 69 6e 74 65 67  _value_new_integ
62b0: 65 72 28 63 6f 64 65 29 29 3b 0a 20 20 69 66 28  er(code));.  if(
62c0: 66 6d 74 20 26 26 20 2a 66 6d 74 29 7b 0a 20 20  fmt && *fmt){.  
62d0: 20 20 2f 2a 20 46 49 58 4d 45 3a 20 74 72 65 61    /* FIXME: trea
62e0: 74 20 4e 55 4c 4c 20 66 6d 74 20 61 73 20 73 74  t NULL fmt as st
62f0: 61 6e 64 61 72 64 20 77 61 72 6e 69 6e 67 20 6d  andard warning m
6300: 65 73 73 61 67 65 20 66 6f 72 0a 20 20 20 20 20  essage for.     
6310: 20 20 74 68 65 20 63 6f 64 65 2c 20 62 75 74 20    the code, but 
6320: 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 68  we don't have th
6330: 6f 73 65 20 79 65 74 2e 0a 20 20 20 20 2a 2f 0a  ose yet..    */.
6340: 20 20 20 20 76 61 5f 6c 69 73 74 20 76 61 72 67      va_list varg
6350: 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 20 6d 73  s;.    char * ms
6360: 67 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  g;.    va_start(
6370: 76 61 72 67 73 2c 66 6d 74 29 3b 0a 20 20 20 20  vargs,fmt);.    
6380: 6d 73 67 20 3d 20 76 6d 70 72 69 6e 74 66 28 66  msg = vmprintf(f
6390: 6d 74 2c 76 61 72 67 73 29 3b 0a 20 20 20 20 76  mt,vargs);.    v
63a0: 61 5f 65 6e 64 28 76 61 72 67 73 29 3b 0a 20 20  a_end(vargs);.  
63b0: 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65    cson_object_se
63c0: 74 28 6f 62 6a 2c 22 74 65 78 74 22 2c 20 63 73  t(obj,"text", cs
63d0: 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 73 74 72  on_value_new_str
63e0: 69 6e 67 28 6d 73 67 2c 73 74 72 6c 65 6e 28 6d  ing(msg,strlen(m
63f0: 73 67 29 29 29 3b 0a 20 20 20 20 66 72 65 65 28  sg)));.    free(
6400: 6d 73 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  msg);.  }.}../*.
6410: 2a 2a 20 53 70 6c 69 74 73 20 7a 53 74 72 20 28  ** Splits zStr (
6420: 77 68 69 63 68 20 6d 75 73 74 20 6e 6f 74 20 62  which must not b
6430: 65 20 4e 55 4c 4c 29 20 69 6e 74 6f 20 74 6f 6b  e NULL) into tok
6440: 65 6e 73 20 73 65 70 61 72 61 74 65 64 20 62 79  ens separated by
6450: 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 73 65   the.** given se
6460: 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
6470: 72 2e 20 49 66 20 64 6f 44 65 48 74 74 70 20 69  r. If doDeHttp i
6480: 73 20 74 72 75 65 20 74 68 65 6e 20 65 61 63 68  s true then each
6490: 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 77 69 6c 6c   element.** will
64a0: 20 62 65 20 70 61 73 73 65 64 20 74 68 72 6f 75   be passed throu
64b0: 67 68 20 64 65 68 74 74 70 69 7a 65 28 29 2c 20  gh dehttpize(), 
64c0: 6f 74 68 65 72 77 69 73 65 20 74 68 65 79 20 61  otherwise they a
64d0: 72 65 20 75 73 65 64 0a 2a 2a 20 61 73 2d 69 73  re used.** as-is
64e0: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 6f 6b 65  . Note that toke
64f0: 6e 69 7a 61 74 69 6f 6e 20 68 61 70 70 65 6e 73  nization happens
6500: 20 62 65 66 6f 72 65 20 64 65 68 74 74 70 69 7a   before dehttpiz
6510: 65 28 29 2c 0a 2a 2a 20 77 68 69 63 68 20 69 73  e(),.** which is
6520: 20 73 69 67 6e 69 66 69 63 61 6e 74 20 69 66 20   significant if 
6530: 74 68 65 20 45 4e 63 6f 64 65 64 20 74 6f 6b 65  the ENcoded toke
6540: 6e 73 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  ns might contain
6550: 20 74 68 65 0a 2a 2a 20 73 65 70 61 72 61 74 6f   the.** separato
6560: 72 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a  r character..**.
6570: 2a 2a 20 45 61 63 68 20 6e 65 77 20 65 6c 65 6d  ** Each new elem
6580: 65 6e 74 20 69 73 20 61 70 70 65 6e 64 65 64 20  ent is appended 
6590: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 74 61 72  to the given tar
65a0: 67 65 74 20 61 72 72 61 79 20 6f 62 6a 65 63 74  get array object
65b0: 2c 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20  ,.** which must 
65c0: 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 61 6e 64 20  not be NULL and 
65d0: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 69 74 20  ownership of it 
65e0: 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 62  is not changed b
65f0: 79 20 74 68 69 73 0a 2a 2a 20 63 61 6c 6c 2e 0a  y this.** call..
6600: 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
6610: 2c 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  , returns the nu
6620: 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 5f  mber of tokens _
6630: 65 6e 63 6f 75 6e 74 65 72 65 64 5f 2e 20 4f 6e  encountered_. On
6640: 20 65 72 72 6f 72 20 61 0a 2a 2a 20 4e 45 47 41   error a.** NEGA
6650: 54 49 56 45 20 6e 75 6d 62 65 72 20 69 73 20 72  TIVE number is r
6660: 65 74 75 72 6e 65 64 20 2d 20 69 74 73 20 61 62  eturned - its ab
6670: 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 69 73 20  solute value is 
6680: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
6690: 20 74 6f 6b 65 6e 73 20 65 6e 63 6f 75 6e 74 65   tokens encounte
66a0: 72 65 64 20 28 69 2e 65 2e 20 69 74 20 72 65 76  red (i.e. it rev
66b0: 65 61 6c 73 20 77 68 69 63 68 20 74 6f 6b 65 6e  eals which token
66c0: 20 69 6e 20 7a 53 74 72 20 77 61 73 0a 2a 2a 20   in zStr was.** 
66d0: 70 72 6f 62 6c 65 6d 61 74 69 63 29 2e 0a 2a 2a  problematic)..**
66e0: 0a 2a 2a 20 41 63 68 74 75 6e 67 3a 20 6c 65 61  .** Achtung: lea
66f0: 64 69 6e 67 20 61 6e 64 20 74 72 61 69 6c 69 6e  ding and trailin
6700: 67 20 77 68 69 74 65 73 70 61 63 65 20 6f 66 20  g whitespace of 
6710: 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 65 6c 69  elements are eli
6720: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 63 68 74 75  ded..**.** Achtu
6730: 6e 67 3a 20 65 6d 70 74 79 20 65 6c 65 6d 65 6e  ng: empty elemen
6740: 74 73 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ts will be skipp
6750: 65 64 2c 20 6d 65 61 6e 69 6e 67 20 63 6f 6e 73  ed, meaning cons
6760: 65 63 75 74 69 76 65 20 65 6d 70 74 79 0a 2a 2a  ecutive empty.**
6770: 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 63 6f   elements are co
6780: 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20  llapsed..*/.int 
6790: 6a 73 6f 6e 5f 73 74 72 69 6e 67 5f 73 70 6c 69  json_string_spli
67a0: 74 28 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 20  t( char const * 
67b0: 7a 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  zStr,.          
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61               cha
67d0: 72 20 73 65 70 61 72 61 74 6f 72 2c 0a 20 20 20  r separator,.   
67e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67f0: 20 20 20 20 69 6e 74 20 64 6f 44 65 48 74 74 70      int doDeHttp
6800: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6810: 20 20 20 20 20 20 20 20 20 63 73 6f 6e 5f 61 72           cson_ar
6820: 72 61 79 20 2a 20 74 61 72 67 65 74 20 29 7b 0a  ray * target ){.
6830: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 70    char const * p
6840: 20 3d 20 7a 53 74 72 20 2f 2a 20 63 75 72 72 65   = zStr /* curre
6850: 6e 74 20 62 79 74 65 20 2a 2f 3b 0a 20 20 63 68  nt byte */;.  ch
6860: 61 72 20 63 6f 6e 73 74 20 2a 20 68 65 61 64 20  ar const * head 
6870: 20 2f 2a 20 63 75 72 72 65 6e 74 20 73 74 61 72   /* current star
6880: 74 2d 6f 66 2d 74 6f 6b 65 6e 20 2a 2f 3b 0a 20  t-of-token */;. 
6890: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65   unsigned int le
68a0: 6e 20 3d 20 30 20 20 20 2f 2a 20 63 75 72 72 65  n = 0   /* curre
68b0: 6e 74 20 74 6f 6b 65 6e 27 73 20 6c 65 6e 67 74  nt token's lengt
68c0: 68 20 2a 2f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  h */;.  int rc =
68d0: 20 30 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 63   0   /* return c
68e0: 6f 64 65 20 28 6e 75 6d 62 65 72 20 6f 66 20 61  ode (number of a
68f0: 64 64 65 64 20 65 6c 65 6d 65 6e 74 73 29 2a 2f  dded elements)*/
6900: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 53 74 72  ;.  assert( zStr
6910: 20 26 26 20 74 61 72 67 65 74 20 29 3b 0a 20 20   && target );.  
6920: 77 68 69 6c 65 28 20 66 6f 73 73 69 6c 5f 69 73  while( fossil_is
6930: 73 70 61 63 65 28 2a 70 29 20 29 7b 0a 20 20 20  space(*p) ){.   
6940: 20 2b 2b 70 3b 0a 20 20 7d 0a 20 20 68 65 61 64   ++p;.  }.  head
6950: 20 3d 20 70 3b 0a 20 20 66 6f 72 28 20 3b 20 3b   = p;.  for( ; ;
6960: 20 2b 2b 70 29 7b 0a 20 20 20 20 69 66 28 20 21   ++p){.    if( !
6970: 2a 70 20 7c 7c 20 28 73 65 70 61 72 61 74 6f 72  *p || (separator
6980: 20 3d 3d 20 2a 70 29 20 29 7b 0a 20 20 20 20 20   == *p) ){.     
6990: 20 69 66 28 20 6c 65 6e 20 29 7b 2f 2a 20 61 70   if( len ){/* ap
69a0: 70 65 6e 64 20 68 65 61 64 2e 2e 28 68 65 61 64  pend head..(head
69b0: 2b 6c 65 6e 29 20 61 73 20 6e 65 78 74 20 61 72  +len) as next ar
69c0: 72 61 79 0a 20 20 20 20 20 20 20 20 20 20 20 20  ray.            
69d0: 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 2e 20         element. 
69e0: 2a 2f 0a 20 20 20 20 20 20 20 20 63 73 6f 6e 5f  */.        cson_
69f0: 76 61 6c 75 65 20 2a 20 70 61 72 74 20 3d 20 4e  value * part = N
6a00: 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 63 68 61  ULL;.        cha
6a10: 72 20 2a 20 7a 50 61 72 74 20 3d 20 4e 55 4c 4c  r * zPart = NULL
6a20: 3b 0a 20 20 20 20 20 20 20 20 2b 2b 72 63 3b 0a  ;.        ++rc;.
6a30: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6a40: 68 65 61 64 20 21 3d 20 70 20 29 3b 0a 20 20 20  head != p );.   
6a50: 20 20 20 20 20 7a 50 61 72 74 20 3d 20 28 63 68       zPart = (ch
6a60: 61 72 2a 29 66 6f 73 73 69 6c 5f 6d 61 6c 6c 6f  ar*)fossil_mallo
6a70: 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20  c(len+1);.      
6a80: 20 20 6d 65 6d 63 70 79 28 7a 50 61 72 74 2c 20    memcpy(zPart, 
6a90: 68 65 61 64 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  head, len);.    
6aa0: 20 20 20 20 7a 50 61 72 74 5b 6c 65 6e 5d 20 3d      zPart[len] =
6ab0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 64   0;.        if(d
6ac0: 6f 44 65 48 74 74 70 29 7b 0a 20 20 20 20 20 20  oDeHttp){.      
6ad0: 20 20 20 20 64 65 68 74 74 70 69 7a 65 28 7a 50      dehttpize(zP
6ae0: 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  art);.        }.
6af0: 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 50 61          if( *zPa
6b00: 72 74 20 29 7b 20 2f 2a 20 73 68 6f 75 6c 64 20  rt ){ /* should 
6b10: 6f 6e 6c 79 20 66 61 69 6c 20 69 66 20 73 6f 6d  only fail if som
6b20: 65 6f 6e 65 20 6d 61 6e 61 67 65 73 20 74 6f 20  eone manages to 
6b30: 75 72 6c 2d 65 6e 63 6f 64 65 64 20 61 20 4e 55  url-encoded a NU
6b40: 4c 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 20 20  L byte */.      
6b50: 20 20 20 20 70 61 72 74 20 3d 20 63 73 6f 6e 5f      part = cson_
6b60: 76 61 6c 75 65 5f 6e 65 77 5f 73 74 72 69 6e 67  value_new_string
6b70: 28 7a 50 61 72 74 2c 20 73 74 72 6c 65 6e 28 7a  (zPart, strlen(z
6b80: 50 61 72 74 29 29 3b 0a 20 20 20 20 20 20 20 20  Part));.        
6b90: 20 20 69 66 28 20 30 20 21 3d 20 63 73 6f 6e 5f    if( 0 != cson_
6ba0: 61 72 72 61 79 5f 61 70 70 65 6e 64 28 20 74 61  array_append( ta
6bb0: 72 67 65 74 2c 20 70 61 72 74 20 29 20 29 7b 0a  rget, part ) ){.
6bc0: 20 20 20 20 20 20 20 20 20 20 20 20 63 73 6f 6e              cson
6bd0: 5f 76 61 6c 75 65 5f 66 72 65 65 28 70 61 72 74  _value_free(part
6be0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
6bf0: 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 20  c = -rc;.       
6c00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6c10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6c20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
6c30: 20 61 73 73 65 72 74 28 30 20 26 26 20 22 69 20   assert(0 && "i 
6c40: 64 69 64 6e 27 74 20 74 68 69 6e 6b 20 74 68 69  didn't think thi
6c50: 73 20 77 61 73 20 70 6f 73 73 69 62 6c 65 21 22  s was possible!"
6c60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  );.          fpr
6c70: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a  intf(stderr,"%s:
6c80: 25 64 3a 20 4d 79 20 47 6f 64 21 20 49 74 27 73  %d: My God! It's
6c90: 20 66 75 6c 6c 20 6f 66 20 73 74 61 72 73 21 5c   full of stars!\
6ca0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
6cb0: 20 20 20 20 20 20 5f 5f 46 49 4c 45 5f 5f 2c 20        __FILE__, 
6cc0: 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
6cd0: 20 20 20 20 20 66 6f 73 73 69 6c 5f 65 78 69 74       fossil_exit
6ce0: 28 31 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  (1).            
6cf0: 2f 2a 20 4e 6f 74 20 66 6f 73 73 69 6c 5f 70 61  /* Not fossil_pa
6d00: 6e 69 63 28 29 20 62 2f 63 20 74 68 69 73 20 63  nic() b/c this c
6d10: 6f 64 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ode needs to be 
6d20: 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 20 20  able to.        
6d30: 20 20 20 20 20 20 72 75 6e 20 62 65 66 6f 72 65        run before
6d40: 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 66 6f 73   some of the fos
6d50: 73 69 6c 2f 6a 73 6f 6e 20 62 69 74 73 20 61 72  sil/json bits ar
6d60: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 0a 20  e initialized,. 
6d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
6d80: 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 29 20   fossil_panic() 
6d90: 63 61 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 4a  calls into the J
6da0: 53 4f 4e 20 41 50 49 2e 0a 20 20 20 20 20 20 20  SON API..       
6db0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
6dc0: 20 20 20 20 3b 0a 20 20 20 20 20 20 20 20 7d 0a      ;.        }.
6dd0: 20 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66          fossil_f
6de0: 72 65 65 28 7a 50 61 72 74 29 3b 0a 20 20 20 20  ree(zPart);.    
6df0: 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20      len = 0;.   
6e00: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
6e10: 2a 70 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  *p ){.        br
6e20: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
6e30: 20 20 20 68 65 61 64 20 3d 20 70 2b 31 3b 0a 20     head = p+1;. 
6e40: 20 20 20 20 20 77 68 69 6c 65 28 20 2a 68 65 61       while( *hea
6e50: 64 20 26 26 20 66 6f 73 73 69 6c 5f 69 73 73 70  d && fossil_issp
6e60: 61 63 65 28 2a 68 65 61 64 29 20 29 7b 0a 20 20  ace(*head) ){.  
6e70: 20 20 20 20 20 20 2b 2b 68 65 61 64 3b 0a 20 20        ++head;.  
6e80: 20 20 20 20 20 20 2b 2b 70 3b 0a 20 20 20 20 20        ++p;.     
6e90: 20 7d 0a 20 20 20 20 20 20 69 66 28 21 2a 68 65   }.      if(!*he
6ea0: 61 64 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  ad){.        bre
6eb0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
6ec0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
6ed0: 7d 0a 20 20 20 20 2b 2b 6c 65 6e 3b 0a 20 20 7d  }.    ++len;.  }
6ee0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6ef0: 0a 2f 2a 0a 2a 2a 20 57 72 61 70 70 65 72 20 61  ./*.** Wrapper a
6f00: 72 6f 75 6e 64 20 6a 73 6f 6e 5f 73 74 72 69 6e  round json_strin
6f10: 67 5f 73 70 6c 69 74 28 29 2c 20 74 61 6b 69 6e  g_split(), takin
6f20: 67 20 74 68 65 20 73 61 6d 65 20 66 69 72 73 74  g the same first
6f30: 20 33 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73   3.** parameters
6f40: 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f   as this functio
6f50: 6e 2c 20 62 75 74 20 72 65 74 75 72 6e 73 20 74  n, but returns t
6f60: 68 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20  he results as a 
6f70: 4a 53 4f 4e 0a 2a 2a 20 41 72 72 61 79 20 28 69  JSON.** Array (i
6f80: 66 20 73 70 6c 69 74 74 69 6e 67 20 70 72 6f 64  f splitting prod
6f90: 75 63 65 64 20 74 6f 6b 65 6e 73 29 20 6f 72 20  uced tokens) or 
6fa0: 4e 55 4c 4c 20 28 69 66 20 73 70 6c 69 74 74 69  NULL (if splitti
6fb0: 6e 67 20 66 61 69 6c 65 64 0a 2a 2a 20 69 6e 20  ng failed.** in 
6fc0: 61 6e 79 20 77 61 79 20 6f 72 20 70 72 6f 64 75  any way or produ
6fd0: 63 65 64 20 6e 6f 20 74 6f 6b 65 6e 73 29 2e 0a  ced no tokens)..
6fe0: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
6ff0: 65 64 20 76 61 6c 75 65 20 69 73 20 6f 77 6e 65  ed value is owne
7000: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
7010: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   If not NULL the
7020: 6e 20 69 74 0a 2a 2a 20 5f 77 69 6c 6c 5f 20 68  n it.** _will_ h
7030: 61 76 65 20 61 20 4a 53 4f 4e 20 74 79 70 65 20  ave a JSON type 
7040: 6f 66 20 41 72 72 61 79 2e 0a 2a 2f 0a 63 73 6f  of Array..*/.cso
7050: 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 73  n_value * json_s
7060: 74 72 69 6e 67 5f 73 70 6c 69 74 32 28 20 63 68  tring_split2( ch
7070: 61 72 20 63 6f 6e 73 74 20 2a 20 7a 53 74 72 2c  ar const * zStr,
7080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70a0: 20 20 63 68 61 72 20 73 65 70 61 72 61 74 6f 72    char separator
70b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70d0: 20 20 20 69 6e 74 20 64 6f 44 65 48 74 74 70 20     int doDeHttp 
70e0: 29 7b 0a 20 20 63 73 6f 6e 5f 61 72 72 61 79 20  ){.  cson_array 
70f0: 2a 20 61 20 3d 20 63 73 6f 6e 5f 6e 65 77 5f 61  * a = cson_new_a
7100: 72 72 61 79 28 29 3b 0a 20 20 69 6e 74 20 72 63  rray();.  int rc
7110: 20 3d 20 6a 73 6f 6e 5f 73 74 72 69 6e 67 5f 73   = json_string_s
7120: 70 6c 69 74 28 20 7a 53 74 72 2c 20 73 65 70 61  plit( zStr, sepa
7130: 72 61 74 6f 72 2c 20 64 6f 44 65 48 74 74 70 2c  rator, doDeHttp,
7140: 20 61 20 29 3b 0a 20 20 69 66 28 20 30 3e 3d 72   a );.  if( 0>=r
7150: 63 20 29 7b 0a 20 20 20 20 63 73 6f 6e 5f 66 72  c ){.    cson_fr
7160: 65 65 5f 61 72 72 61 79 28 61 29 3b 0a 20 20 20  ee_array(a);.   
7170: 20 61 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20   a = NULL;.  }. 
7180: 20 72 65 74 75 72 6e 20 61 20 3f 20 63 73 6f 6e   return a ? cson
7190: 5f 61 72 72 61 79 5f 76 61 6c 75 65 28 61 29 20  _array_value(a) 
71a0: 3a 20 4e 55 4c 4c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  : NULL;.}.../*.*
71b0: 2a 20 50 65 72 66 6f 72 6d 73 20 73 6f 6d 65 20  * Performs some 
71c0: 63 6f 6d 6d 6f 6e 20 69 6e 69 74 69 61 6c 69 7a  common initializ
71d0: 61 74 69 6f 6e 20 6f 66 20 4a 53 4f 4e 2d 72 65  ation of JSON-re
71e0: 6c 61 74 65 64 20 73 74 61 74 65 2e 20 20 4d 75  lated state.  Mu
71f0: 73 74 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20  st be.** called 
7200: 62 79 20 74 68 65 20 6a 73 6f 6e 5f 70 61 67 65  by the json_page
7210: 5f 74 6f 70 28 29 20 61 6e 64 20 6a 73 6f 6e 5f  _top() and json_
7220: 63 6d 64 5f 74 6f 70 28 29 20 64 69 73 70 61 74  cmd_top() dispat
7230: 63 68 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  ching.** functio
7240: 6e 73 20 74 6f 20 73 65 74 20 75 70 20 74 68 65  ns to set up the
7250: 20 4a 53 4f 4e 20 73 74 61 74 20 75 73 65 64 20   JSON stat used 
7260: 62 79 20 74 68 65 20 64 69 73 70 61 74 63 68 65  by the dispatche
7270: 64 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a  d functions..**.
7280: 2a 2a 20 49 6d 70 6c 69 63 69 74 6c 79 20 73 65  ** Implicitly se
7290: 74 73 20 75 70 20 74 68 65 20 6c 6f 67 69 6e 20  ts up the login 
72a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 74 61 74  information stat
72b0: 65 20 69 6e 20 43 47 49 20 6d 6f 64 65 2c 20 62  e in CGI mode, b
72c0: 75 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 70  ut.** does not p
72d0: 65 72 66 6f 72 6d 20 61 6e 79 20 70 65 72 6d 69  erform any permi
72e0: 73 73 69 6f 6e 73 20 63 68 65 63 6b 69 6e 67 2e  ssions checking.
72f0: 20 49 74 20 5f 6d 69 67 68 74 5f 20 28 68 61 76   It _might_ (hav
7300: 65 6e 27 74 0a 2a 2a 20 74 65 73 74 65 64 20 74  en't.** tested t
7310: 68 69 73 29 20 64 69 65 20 77 69 74 68 20 61 6e  his) die with an
7320: 20 65 72 72 6f 72 20 69 66 20 61 6e 20 61 75 74   error if an aut
7330: 68 20 63 6f 6f 6b 69 65 20 69 73 20 6d 61 6c 66  h cookie is malf
7340: 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ormed..**.** Thi
7350: 73 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  s must be called
7360: 20 62 79 20 74 68 65 20 74 6f 70 2d 6c 65 76 65   by the top-leve
7370: 6c 20 4a 53 4f 4e 20 63 6f 6d 6d 61 6e 64 20 64  l JSON command d
7380: 69 73 70 61 74 63 68 69 6e 67 20 63 6f 64 65 0a  ispatching code.
7390: 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 79 20 64  ** before they d
73a0: 6f 20 61 6e 79 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a  o any work..**.*
73b0: 2a 20 54 68 69 73 20 6d 75 73 74 20 6f 6e 6c 79  * This must only
73c0: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 2c   be called once,
73d0: 20 6f 72 20 61 6e 20 61 73 73 65 72 74 69 6f 6e   or an assertion
73e0: 20 6d 61 79 20 62 65 20 74 72 69 67 67 65 72 65   may be triggere
73f0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
7400: 64 20 6a 73 6f 6e 5f 6d 6f 64 65 5f 62 6f 6f 74  d json_mode_boot
7410: 73 74 72 61 70 28 29 7b 0a 20 20 73 74 61 74 69  strap(){.  stati
7420: 63 20 63 68 61 72 20 6f 6e 63 65 20 3d 20 30 20  c char once = 0 
7430: 20 2f 2a 20 67 75 61 72 64 20 61 67 61 69 6e 73   /* guard agains
7440: 74 20 6d 75 6c 74 69 70 6c 65 20 72 75 6e 73 20  t multiple runs 
7450: 2a 2f 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  */;.  char const
7460: 20 2a 20 7a 50 61 74 68 20 3d 20 50 28 22 50 41   * zPath = P("PA
7470: 54 48 5f 49 4e 46 4f 22 29 3b 0a 20 20 61 73 73  TH_INFO");.  ass
7480: 65 72 74 28 67 2e 6a 73 6f 6e 2e 67 63 2e 61 20  ert(g.json.gc.a 
7490: 26 26 20 22 6a 73 6f 6e 5f 6d 61 69 6e 5f 62 6f  && "json_main_bo
74a0: 6f 74 73 74 72 61 70 28 29 20 77 61 73 20 6e 6f  otstrap() was no
74b0: 74 20 63 61 6c 6c 65 64 21 22 29 3b 0a 20 20 61  t called!");.  a
74c0: 73 73 65 72 74 28 20 28 30 3d 3d 6f 6e 63 65 29  ssert( (0==once)
74d0: 20 26 26 20 22 6a 73 6f 6e 5f 6d 6f 64 65 5f 62   && "json_mode_b
74e0: 6f 6f 74 73 74 72 61 70 28 29 20 63 61 6c 6c 65  ootstrap() calle
74f0: 64 20 74 6f 6f 20 6d 61 6e 79 20 74 69 6d 65 73  d too many times
7500: 21 22 29 3b 0a 20 20 69 66 28 20 6f 6e 63 65 20  !");.  if( once 
7510: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
7520: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 6e 63 65   }else{.    once
7530: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 67 2e 6a 73   = 1;.  }.  g.js
7540: 6f 6e 2e 69 73 4a 73 6f 6e 4d 6f 64 65 20 3d 20  on.isJsonMode = 
7550: 31 3b 0a 20 20 67 2e 6a 73 6f 6e 2e 72 65 73 75  1;.  g.json.resu
7560: 6c 74 43 6f 64 65 20 3d 20 30 3b 0a 20 20 67 2e  ltCode = 0;.  g.
7570: 6a 73 6f 6e 2e 63 6d 64 2e 6f 66 66 73 65 74 20  json.cmd.offset 
7580: 3d 20 2d 31 3b 0a 20 20 67 2e 6a 73 6f 6e 2e 6a  = -1;.  g.json.j
7590: 73 6f 6e 70 20 3d 20 50 44 28 22 6a 73 6f 6e 70  sonp = PD("jsonp
75a0: 22 2c 4e 55 4c 4c 29 0a 20 20 20 20 2f 2a 20 46  ",NULL).    /* F
75b0: 49 58 4d 45 3a 20 64 6f 20 73 6f 6d 65 20 73 61  IXME: do some sa
75c0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
75d0: 20 67 2e 6a 73 6f 6e 2e 6a 73 6f 6e 70 20 61 6e   g.json.jsonp an
75e0: 64 20 69 67 6e 6f 72 65 20 69 74 0a 20 20 20 20  d ignore it.    
75f0: 20 20 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20     if it is not 
7600: 68 61 6c 66 77 61 79 20 72 65 61 73 6f 6e 61 62  halfway reasonab
7610: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 3b  le..    */.    ;
7620: 0a 20 20 69 66 28 20 21 67 2e 69 73 48 54 54 50  .  if( !g.isHTTP
7630: 20 26 26 20 67 2e 66 75 6c 6c 48 74 74 70 52 65   && g.fullHttpRe
7640: 70 6c 79 20 29 7b 0a 20 20 20 20 2f 2a 20 77 6f  ply ){.    /* wo
7650: 72 6b 61 72 6f 75 6e 64 20 66 6f 72 20 73 65 72  rkaround for ser
7660: 76 65 72 20 6d 6f 64 65 2c 20 73 6f 20 77 65 20  ver mode, so we 
7670: 73 65 65 20 69 74 20 61 73 20 43 47 49 20 6d 6f  see it as CGI mo
7680: 64 65 2e 20 2a 2f 0a 20 20 20 20 67 2e 69 73 48  de. */.    g.isH
7690: 54 54 50 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  TTP = 1;.  }..  
76a0: 69 66 28 67 2e 69 73 48 54 54 50 29 7b 0a 20 20  if(g.isHTTP){.  
76b0: 20 20 63 67 69 5f 73 65 74 5f 63 6f 6e 74 65 6e    cgi_set_conten
76c0: 74 5f 74 79 70 65 28 6a 73 6f 6e 5f 67 75 65 73  t_type(json_gues
76d0: 73 5f 63 6f 6e 74 65 6e 74 5f 74 79 70 65 28 29  s_content_type()
76e0: 29 0a 20 20 20 20 20 20 2f 2a 20 72 65 6d 69 6e  ).      /* remin
76f0: 64 65 72 3a 20 6d 75 73 74 20 62 65 20 64 6f 6e  der: must be don
7700: 65 20 61 66 74 65 72 20 67 2e 6a 73 6f 6e 2e 6a  e after g.json.j
7710: 73 6f 6e 70 20 69 73 20 69 6e 69 74 69 61 6c 69  sonp is initiali
7720: 7a 65 64 20 2a 2f 0a 20 20 20 20 20 20 3b 0a 23  zed */.      ;.#
7730: 69 66 20 30 0a 20 20 20 20 2f 2a 20 43 61 6c 6c  if 0.    /* Call
7740: 69 6e 67 20 74 68 69 73 20 73 65 65 6d 73 20 74  ing this seems t
7750: 6f 20 74 72 69 67 67 65 72 20 61 6e 20 53 51 4c  o trigger an SQL
7760: 49 54 45 5f 4d 49 53 55 53 45 20 77 61 72 6e 69  ITE_MISUSE warni
7770: 6e 67 3f 3f 3f 0a 20 20 20 20 20 20 20 4d 61 79  ng???.       May
7780: 62 65 20 69 74 27 73 20 6e 6f 74 20 6c 65 67 61  be it's not lega
7790: 6c 20 74 6f 20 73 65 74 20 74 68 65 20 6c 6f 67  l to set the log
77a0: 67 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ger more than on
77b0: 63 65 3f 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ce?.    */.    s
77c0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
77d0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c  LITE_CONFIG_LOG,
77e0: 20 4e 55 4c 4c 2c 20 30 29 0a 20 20 20 20 20 20   NULL, 0).      
77f0: 20 20 2f 2a 20 61 76 6f 69 64 73 20 64 65 62 75    /* avoids debu
7800: 67 20 6d 65 73 73 61 67 65 73 20 6f 6e 20 73 74  g messages on st
7810: 64 65 72 72 20 69 6e 20 4a 53 4f 4e 20 6d 6f 64  derr in JSON mod
7820: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 3b 0a 23  e */.        ;.#
7830: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 67 2e 6a  endif.  }..  g.j
7840: 73 6f 6e 2e 63 6d 64 2e 76 20 3d 20 63 73 6f 6e  son.cmd.v = cson
7850: 5f 76 61 6c 75 65 5f 6e 65 77 5f 61 72 72 61 79  _value_new_array
7860: 28 29 3b 0a 20 20 67 2e 6a 73 6f 6e 2e 63 6d 64  ();.  g.json.cmd
7870: 2e 61 20 3d 20 63 73 6f 6e 5f 76 61 6c 75 65 5f  .a = cson_value_
7880: 67 65 74 5f 61 72 72 61 79 28 67 2e 6a 73 6f 6e  get_array(g.json
7890: 2e 63 6d 64 2e 76 29 3b 0a 20 20 6a 73 6f 6e 5f  .cmd.v);.  json_
78a0: 67 63 5f 61 64 64 28 20 46 6f 73 73 69 6c 4a 73  gc_add( FossilJs
78b0: 6f 6e 4b 65 79 73 2e 63 6f 6d 6d 61 6e 64 50 61  onKeys.commandPa
78c0: 74 68 2c 20 67 2e 6a 73 6f 6e 2e 63 6d 64 2e 76  th, g.json.cmd.v
78d0: 20 29 3b 0a 20 20 2f 2a 0a 20 20 20 20 54 68 65   );.  /*.    The
78e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 2f 65 6c   following if/el
78f0: 73 65 20 62 6c 6f 63 6b 20 74 72 61 6e 73 6c 61  se block transla
7900: 74 65 73 20 74 68 65 20 50 41 54 48 5f 49 4e 46  tes the PATH_INF
7910: 4f 20 70 61 74 68 20 28 69 6e 0a 20 20 20 20 43  O path (in.    C
7920: 4c 49 2f 73 65 72 76 65 72 20 6d 6f 64 65 73 29  LI/server modes)
7930: 20 6f 72 20 67 2e 61 72 67 76 20 28 43 4c 49 20   or g.argv (CLI 
7940: 6d 6f 64 65 29 20 69 6e 74 6f 20 61 6e 20 69 6e  mode) into an in
7950: 74 65 72 6e 61 6c 20 6c 69 73 74 20 73 6f 0a 20  ternal list so. 
7960: 20 20 20 74 68 61 74 20 77 65 20 63 61 6e 20 73     that we can s
7970: 69 6d 70 6c 69 66 79 20 63 6f 6d 6d 61 6e 64 20  implify command 
7980: 64 69 73 70 61 74 63 68 69 6e 67 20 6c 61 74 65  dispatching late
7990: 72 20 6f 6e 2e 0a 0a 20 20 20 20 4e 6f 74 65 20  r on...    Note 
79a0: 74 68 61 74 20 74 72 61 6e 73 6c 61 74 69 6e 67  that translating
79b0: 20 67 2e 61 72 67 76 20 74 68 69 73 20 77 61 79   g.argv this way
79c0: 20 69 73 20 6f 76 65 72 6b 69 6c 6c 20 62 75 74   is overkill but
79d0: 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f 0a 20 20   allows us to.  
79e0: 20 20 61 76 6f 69 64 20 43 4c 49 2d 6f 6e 6c 79    avoid CLI-only
79f0: 20 73 70 65 63 69 61 6c 2d 63 61 73 65 20 68 61   special-case ha
7a00: 6e 64 6c 69 6e 67 20 69 6e 20 6f 74 68 65 72 20  ndling in other 
7a10: 63 6f 64 65 2c 20 65 2e 67 2e 0a 20 20 20 20 6a  code, e.g..    j
7a20: 73 6f 6e 5f 63 6f 6d 6d 61 6e 64 5f 61 72 67 28  son_command_arg(
7a30: 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 50  )..  */.  if( zP
7a40: 61 74 68 20 29 7b 2f 2a 20 45 69 74 68 65 72 20  ath ){/* Either 
7a50: 43 47 49 20 6f 72 20 73 65 72 76 65 72 20 6d 6f  CGI or server mo
7a60: 64 65 2e 2e 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20  de... */.    /* 
7a70: 54 72 61 6e 73 6c 61 74 65 20 50 41 54 48 5f 49  Translate PATH_I
7a80: 4e 46 4f 20 69 6e 74 6f 20 4a 53 4f 4e 20 61 72  NFO into JSON ar
7a90: 72 61 79 20 66 6f 72 20 6c 61 74 65 72 20 63 6f  ray for later co
7aa0: 6e 76 65 6e 69 65 6e 63 65 2e 20 2a 2f 0a 20 20  nvenience. */.  
7ab0: 20 20 6a 73 6f 6e 5f 73 74 72 69 6e 67 5f 73 70    json_string_sp
7ac0: 6c 69 74 28 7a 50 61 74 68 2c 20 27 2f 27 2c 20  lit(zPath, '/', 
7ad0: 31 2c 20 67 2e 6a 73 6f 6e 2e 63 6d 64 2e 61 29  1, g.json.cmd.a)
7ae0: 3b 0a 20 20 7d 65 6c 73 65 7b 2f 2a 20 61 73 73  ;.  }else{/* ass
7af0: 75 6d 65 20 43 4c 49 20 6d 6f 64 65 20 2a 2f 0a  ume CLI mode */.
7b00: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
7b10: 68 61 72 20 63 6f 6e 73 74 20 2a 20 61 72 67 3b  har const * arg;
7b20: 0a 20 20 20 20 63 73 6f 6e 5f 76 61 6c 75 65 20  .    cson_value 
7b30: 2a 20 70 61 72 74 3b 0a 20 20 20 20 66 6f 72 28  * part;.    for(
7b40: 69 20 3d 20 31 2f 2a 73 6b 69 70 20 61 72 67 76  i = 1/*skip argv
7b50: 5b 30 5d 2a 2f 3b 20 69 20 3c 20 67 2e 61 72 67  [0]*/; i < g.arg
7b60: 63 3b 20 2b 2b 69 20 29 7b 0a 20 20 20 20 20 20  c; ++i ){.      
7b70: 61 72 67 20 3d 20 67 2e 61 72 67 76 5b 69 5d 3b  arg = g.argv[i];
7b80: 0a 20 20 20 20 20 20 69 66 28 20 21 61 72 67 20  .      if( !arg 
7b90: 7c 7c 20 21 2a 61 72 67 20 29 7b 0a 20 20 20 20  || !*arg ){.    
7ba0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
7bb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 27      }.      if('
7bc0: 2d 27 20 3d 3d 20 2a 61 72 67 29 7b 0a 20 20 20  -' == *arg){.   
7bd0: 20 20 20 20 20 2f 2a 20 77 6f 72 6b 61 72 6f 75       /* workarou
7be0: 6e 64 20 74 6f 20 73 6b 69 70 20 43 4c 49 20 61  nd to skip CLI a
7bf0: 72 67 73 20 73 6f 20 74 68 61 74 0a 20 20 20 20  rgs so that.    
7c00: 20 20 20 20 20 20 20 6a 73 6f 6e 5f 63 6f 6d 6d         json_comm
7c10: 61 6e 64 5f 61 72 67 28 29 20 64 6f 65 73 20 6e  and_arg() does n
7c20: 6f 74 20 73 65 65 20 74 68 65 6d 2e 0a 20 20 20  ot see them..   
7c30: 20 20 20 20 20 20 20 20 54 68 69 73 20 61 73 73          This ass
7c40: 75 6d 65 73 20 74 68 61 74 20 61 6c 6c 20 61 72  umes that all ar
7c50: 67 75 6d 65 6e 74 73 20 63 6f 6d 65 20 4c 41 53  guments come LAS
7c60: 54 0a 20 20 20 20 20 20 20 20 20 20 20 6f 6e 20  T.           on 
7c70: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
7c80: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
7c90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7ca0: 20 20 7d 0a 20 20 20 20 20 20 70 61 72 74 20 3d    }.      part =
7cb0: 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f   cson_value_new_
7cc0: 73 74 72 69 6e 67 28 61 72 67 2c 73 74 72 6c 65  string(arg,strle
7cd0: 6e 28 61 72 67 29 29 3b 0a 20 20 20 20 20 20 63  n(arg));.      c
7ce0: 73 6f 6e 5f 61 72 72 61 79 5f 61 70 70 65 6e 64  son_array_append
7cf0: 28 67 2e 6a 73 6f 6e 2e 63 6d 64 2e 61 2c 20 70  (g.json.cmd.a, p
7d00: 61 72 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  art);.    }.  }.
7d10: 0a 20 20 77 68 69 6c 65 28 21 67 2e 69 73 48 54  .  while(!g.isHT
7d20: 54 50 29 7b 0a 20 20 20 20 2f 2a 20 53 69 6d 75  TP){.    /* Simu
7d30: 6c 61 74 65 20 4a 53 4f 4e 20 50 4f 53 54 20 64  late JSON POST d
7d40: 61 74 61 20 76 69 61 20 69 6e 70 75 74 20 66 69  ata via input fi
7d50: 6c 65 2e 20 20 50 65 64 61 6e 74 69 63 20 72 65  le.  Pedantic re
7d60: 6d 69 6e 64 65 72 3a 0a 20 20 20 20 20 20 20 65  minder:.       e
7d70: 72 72 6f 72 20 68 61 6e 64 6c 69 6e 67 20 64 6f  rror handling do
7d80: 65 73 20 6e 6f 74 20 68 6f 6e 6f 72 20 75 73 65  es not honor use
7d90: 72 2d 73 75 70 70 6c 69 65 64 20 67 2e 6a 73 6f  r-supplied g.jso
7da0: 6e 2e 6f 75 74 4f 70 74 0a 20 20 20 20 20 20 20  n.outOpt.       
7db0: 62 65 63 61 75 73 65 20 6f 75 74 4f 70 74 20 63  because outOpt c
7dc0: 61 6e 6e 6f 74 20 28 67 65 6e 65 72 69 63 61 6c  annot (generical
7dd0: 6c 79 29 20 62 65 20 63 6f 6e 66 69 67 75 72 65  ly) be configure
7de0: 64 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 20 20  d until after.  
7df0: 20 20 20 20 20 50 4f 53 54 2d 72 65 61 64 69 6e       POST-readin
7e00: 67 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20  g is finished.. 
7e10: 20 20 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20 2a     */.    FILE *
7e20: 20 69 6e 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a   inFile = NULL;.
7e30: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
7e40: 20 6a 66 69 6c 65 20 3d 20 66 69 6e 64 5f 6f 70   jfile = find_op
7e50: 74 69 6f 6e 28 22 6a 73 6f 6e 2d 69 6e 70 75 74  tion("json-input
7e60: 22 2c 4e 55 4c 4c 2c 31 29 3b 0a 20 20 20 20 69  ",NULL,1);.    i
7e70: 66 28 21 6a 66 69 6c 65 20 7c 7c 20 21 2a 6a 66  f(!jfile || !*jf
7e80: 69 6c 65 29 7b 0a 20 20 20 20 20 20 62 72 65 61  ile){.      brea
7e90: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 46  k;.    }.    inF
7ea0: 69 6c 65 20 3d 20 28 30 3d 3d 73 74 72 63 6d 70  ile = (0==strcmp
7eb0: 28 22 2d 22 2c 6a 66 69 6c 65 29 29 0a 20 20 20  ("-",jfile)).   
7ec0: 20 20 20 3f 20 73 74 64 69 6e 0a 20 20 20 20 20     ? stdin.     
7ed0: 20 3a 20 66 6f 73 73 69 6c 5f 66 6f 70 65 6e 28   : fossil_fopen(
7ee0: 6a 66 69 6c 65 2c 22 72 62 22 29 3b 0a 20 20 20  jfile,"rb");.   
7ef0: 20 69 66 28 21 69 6e 46 69 6c 65 29 7b 0a 20 20   if(!inFile){.  
7f00: 20 20 20 20 67 2e 6a 73 6f 6e 2e 72 65 73 75 6c      g.json.resul
7f10: 74 43 6f 64 65 20 3d 20 46 53 4c 5f 4a 53 4f 4e  tCode = FSL_JSON
7f20: 5f 45 5f 46 49 4c 45 5f 4f 50 45 4e 5f 46 41 49  _E_FILE_OPEN_FAI
7f30: 4c 45 44 3b 0a 20 20 20 20 20 20 66 6f 73 73 69  LED;.      fossi
7f40: 6c 5f 66 61 74 61 6c 28 22 43 6f 75 6c 64 20 6e  l_fatal("Could n
7f50: 6f 74 20 6f 70 65 6e 20 4a 53 4f 4e 20 66 69 6c  ot open JSON fil
7f60: 65 20 5b 25 73 5d 2e 22 2c 6a 66 69 6c 65 29 0a  e [%s].",jfile).
7f70: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 65 73 20          /* Does 
7f80: 6e 6f 74 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20  not return. */. 
7f90: 20 20 20 20 20 20 20 3b 0a 20 20 20 20 7d 0a 20         ;.    }. 
7fa0: 20 20 20 63 67 69 5f 70 61 72 73 65 5f 50 4f 53     cgi_parse_POS
7fb0: 54 5f 4a 53 4f 4e 28 69 6e 46 69 6c 65 2c 20 30  T_JSON(inFile, 0
7fc0: 29 3b 0a 20 20 20 20 69 66 28 20 73 74 64 69 6e  );.    if( stdin
7fd0: 20 21 3d 20 69 6e 46 69 6c 65 20 29 7b 0a 20 20   != inFile ){.  
7fe0: 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 46 69 6c      fclose(inFil
7ff0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  e);.    }.    br
8000: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67  eak;.  }..  /* g
8010: 2e 6a 73 6f 6e 2e 72 65 71 50 61 79 6c 6f 61 64  .json.reqPayload
8020: 20 65 78 69 73 74 73 20 6f 6e 6c 79 20 74 6f 20   exists only to 
8030: 73 69 6d 70 6c 69 66 79 20 73 6f 6d 65 20 6f 66  simplify some of
8040: 20 6f 75 72 20 61 63 63 65 73 73 20 74 6f 0a 20   our access to. 
8050: 20 20 20 20 74 68 65 20 72 65 71 75 65 73 74 20      the request 
8060: 70 61 79 6c 6f 61 64 2e 20 57 65 20 63 75 72 72  payload. We curr
8070: 65 6e 74 6c 79 20 6f 6e 6c 79 20 75 73 65 20 74  ently only use t
8080: 68 69 73 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  his in the conte
8090: 78 74 20 6f 66 0a 20 20 20 20 20 4f 62 6a 65 63  xt of.     Objec
80a0: 74 20 70 61 79 6c 6f 61 64 73 2c 20 6e 6f 74 20  t payloads, not 
80b0: 41 72 72 61 79 73 2c 20 73 74 72 69 6e 67 73 2c  Arrays, strings,
80c0: 20 65 74 63 2e 0a 20 20 2a 2f 0a 20 20 67 2e 6a   etc..  */.  g.j
80d0: 73 6f 6e 2e 72 65 71 50 61 79 6c 6f 61 64 2e 76  son.reqPayload.v
80e0: 20 3d 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 67   = cson_object_g
80f0: 65 74 28 20 67 2e 6a 73 6f 6e 2e 70 6f 73 74 2e  et( g.json.post.
8100: 6f 2c 20 46 6f 73 73 69 6c 4a 73 6f 6e 4b 65 79  o, FossilJsonKey
8110: 73 2e 70 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69  s.payload );.  i
8120: 66 28 20 67 2e 6a 73 6f 6e 2e 72 65 71 50 61 79  f( g.json.reqPay
8130: 6c 6f 61 64 2e 76 20 29 7b 0a 20 20 20 20 67 2e  load.v ){.    g.
8140: 6a 73 6f 6e 2e 72 65 71 50 61 79 6c 6f 61 64 2e  json.reqPayload.
8150: 6f 20 3d 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 67  o = cson_value_g
8160: 65 74 5f 6f 62 6a 65 63 74 28 20 67 2e 6a 73 6f  et_object( g.jso
8170: 6e 2e 72 65 71 50 61 79 6c 6f 61 64 2e 76 20 29  n.reqPayload.v )
8180: 0a 20 20 20 20 20 20 20 20 2f 2a 20 67 2e 6a 73  .        /* g.js
8190: 6f 6e 2e 72 65 71 50 61 79 6c 6f 61 64 2e 6f 20  on.reqPayload.o 
81a0: 6d 61 79 20 6c 65 67 61 6c 6c 79 20 62 65 20 4e  may legally be N
81b0: 55 4c 4c 2c 20 77 68 69 63 68 20 6d 65 61 6e 73  ULL, which means
81c0: 20 6f 6e 6c 79 20 74 68 61 74 0a 20 20 20 20 20   only that.     
81d0: 20 20 20 20 20 20 67 2e 6a 73 6f 6e 2e 72 65 71        g.json.req
81e0: 50 61 79 6c 6f 61 64 2e 76 20 69 73 2d 6e 6f 74  Payload.v is-not
81f0: 2d 61 20 4f 62 6a 65 63 74 2e 0a 20 20 20 20 20  -a Object..     
8200: 20 20 20 2a 2f 3b 0a 20 20 7d 0a 0a 20 20 2f 2a     */;.  }..  /*
8210: 20 41 6e 79 74 68 69 6e 67 20 77 68 69 63 68 20   Anything which 
8220: 6e 65 65 64 73 20 6a 73 6f 6e 5f 67 65 74 65 6e  needs json_geten
8230: 76 28 29 20 61 6e 64 20 66 72 69 65 6e 64 73 20  v() and friends 
8240: 73 68 6f 75 6c 64 20 67 6f 20 61 66 74 65 72 0a  should go after.
8250: 20 20 20 20 20 74 68 69 73 20 70 6f 69 6e 74 2e       this point.
8260: 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 31 20 3d 3d  .  */..  if(1 ==
8270: 20 63 73 6f 6e 5f 61 72 72 61 79 5f 6c 65 6e 67   cson_array_leng
8280: 74 68 5f 67 65 74 28 67 2e 6a 73 6f 6e 2e 63 6d  th_get(g.json.cm
8290: 64 2e 61 29 29 7b 0a 20 20 20 20 2f 2a 20 73 70  d.a)){.    /* sp
82a0: 65 63 69 61 6c 20 63 61 73 65 3a 20 69 66 20 77  ecial case: if w
82b0: 65 27 72 65 20 61 74 20 74 68 65 20 74 6f 70 20  e're at the top 
82c0: 70 61 74 68 2c 20 6c 6f 6f 6b 20 66 6f 72 0a 20  path, look for. 
82d0: 20 20 20 20 20 20 61 20 22 63 6f 6d 6d 61 6e 64        a "command
82e0: 22 20 72 65 71 75 65 73 74 20 61 72 67 20 77 68  " request arg wh
82f0: 69 63 68 20 73 70 65 63 69 66 69 65 73 20 77 68  ich specifies wh
8300: 69 63 68 20 63 6f 6d 6d 61 6e 64 0a 20 20 20 20  ich command.    
8310: 20 20 20 74 6f 20 72 75 6e 2e 0a 20 20 20 20 2a     to run..    *
8320: 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
8330: 20 2a 20 63 6d 64 20 3d 20 6a 73 6f 6e 5f 67 65   * cmd = json_ge
8340: 74 65 6e 76 5f 63 73 74 72 28 22 63 6f 6d 6d 61  tenv_cstr("comma
8350: 6e 64 22 29 3b 0a 20 20 20 20 69 66 28 63 6d 64  nd");.    if(cmd
8360: 29 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 5f 73 74  ){.      json_st
8370: 72 69 6e 67 5f 73 70 6c 69 74 28 63 6d 64 2c 20  ring_split(cmd, 
8380: 27 2f 27 2c 20 30 2c 20 67 2e 6a 73 6f 6e 2e 63  '/', 0, g.json.c
8390: 6d 64 2e 61 29 3b 0a 20 20 20 20 20 20 67 2e 6a  md.a);.      g.j
83a0: 73 6f 6e 2e 63 6d 64 2e 63 6f 6d 6d 61 6e 64 53  son.cmd.commandS
83b0: 74 72 20 3d 20 63 6d 64 3b 0a 20 20 20 20 7d 0a  tr = cmd;.    }.
83c0: 20 20 7d 0a 0a 0a 20 20 69 66 28 21 67 2e 6a 73    }...  if(!g.js
83d0: 6f 6e 2e 6a 73 6f 6e 70 29 7b 0a 20 20 20 20 67  on.jsonp){.    g
83e0: 2e 6a 73 6f 6e 2e 6a 73 6f 6e 70 20 3d 20 6a 73  .json.jsonp = js
83f0: 6f 6e 5f 66 69 6e 64 5f 6f 70 74 69 6f 6e 5f 63  on_find_option_c
8400: 73 74 72 28 22 6a 73 6f 6e 70 22 2c 4e 55 4c 4c  str("jsonp",NULL
8410: 2c 4e 55 4c 4c 29 3b 0a 20 20 7d 0a 20 20 69 66  ,NULL);.  }.  if
8420: 28 21 67 2e 69 73 48 54 54 50 29 7b 0a 20 20 20  (!g.isHTTP){.   
8430: 20 67 2e 6a 73 6f 6e 2e 65 72 72 6f 72 44 65 74   g.json.errorDet
8440: 61 69 6c 50 61 72 61 6e 6f 69 61 20 3d 20 30 20  ailParanoia = 0 
8450: 2f 2a 64 69 73 61 62 6c 65 20 65 72 72 6f 72 20  /*disable error 
8460: 63 6f 64 65 20 64 75 6d 62 2d 64 6f 77 6e 20 66  code dumb-down f
8470: 6f 72 20 43 4c 49 20 6d 6f 64 65 2a 2f 3b 0a 20  or CLI mode*/;. 
8480: 20 7d 0a 0a 20 20 7b 2f 2a 20 73 65 74 20 75 70   }..  {/* set up
8490: 20 4a 53 4f 4e 20 6f 75 74 70 75 74 20 66 6f 72   JSON output for
84a0: 6d 61 74 74 69 6e 67 20 6f 70 74 69 6f 6e 73 2e  matting options.
84b0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 6e 64 65   */.    int inde
84c0: 6e 74 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 64  nt = -1;.    ind
84d0: 65 6e 74 20 3d 20 6a 73 6f 6e 5f 66 69 6e 64 5f  ent = json_find_
84e0: 6f 70 74 69 6f 6e 5f 69 6e 74 28 22 69 6e 64 65  option_int("inde
84f0: 6e 74 22 2c 4e 55 4c 4c 2c 22 49 22 2c 2d 31 29  nt",NULL,"I",-1)
8500: 3b 0a 20 20 20 20 67 2e 6a 73 6f 6e 2e 6f 75 74  ;.    g.json.out
8510: 4f 70 74 2e 69 6e 64 65 6e 74 61 74 69 6f 6e 20  Opt.indentation 
8520: 3d 20 28 30 3e 69 6e 64 65 6e 74 29 0a 20 20 20  = (0>indent).   
8530: 20 20 20 3f 20 28 67 2e 69 73 48 54 54 50 20 3f     ? (g.isHTTP ?
8540: 20 30 20 3a 20 31 29 0a 20 20 20 20 20 20 3a 20   0 : 1).      : 
8550: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 69  (unsigned char)i
8560: 6e 64 65 6e 74 3b 0a 20 20 20 20 67 2e 6a 73 6f  ndent;.    g.jso
8570: 6e 2e 6f 75 74 4f 70 74 2e 61 64 64 4e 65 77 6c  n.outOpt.addNewl
8580: 69 6e 65 20 3d 20 67 2e 69 73 48 54 54 50 0a 20  ine = g.isHTTP. 
8590: 20 20 20 20 20 3f 20 30 0a 20 20 20 20 20 20 3a       ? 0.      :
85a0: 20 28 67 2e 6a 73 6f 6e 2e 6a 73 6f 6e 70 20 3f   (g.json.jsonp ?
85b0: 20 30 20 3a 20 31 29 3b 0a 20 20 7d 0a 0a 20 20   0 : 1);.  }..  
85c0: 69 66 28 20 67 2e 69 73 48 54 54 50 20 29 7b 0a  if( g.isHTTP ){.
85d0: 20 20 20 20 6a 73 6f 6e 5f 61 75 74 68 5f 74 6f      json_auth_to
85e0: 6b 65 6e 28 29 2f 2a 20 77 69 6c 6c 20 63 6f 70  ken()/* will cop
85f0: 79 20 6f 75 72 20 61 75 74 68 20 74 6f 6b 65 6e  y our auth token
8600: 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20 66 6f 73  , if any, to fos
8610: 73 69 6c 27 73 0a 20 20 20 20 20 20 20 20 20 20  sil's.          
8620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
8630: 72 65 2c 20 77 68 69 63 68 20 77 65 20 6e 65 65  re, which we nee
8640: 64 20 62 65 66 6f 72 65 20 77 65 20 63 61 6c 6c  d before we call
8650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8660: 20 20 20 20 20 20 20 20 20 6c 6f 67 69 6e 5f 63           login_c
8670: 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73  heck_credentials
8680: 28 29 2e 20 2a 2f 3b 0a 20 20 20 20 6c 6f 67 69  (). */;.    logi
8690: 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69  n_check_credenti
86a0: 61 6c 73 28 29 2f 2a 20 70 6f 70 75 6c 61 74 65  als()/* populate
86b0: 73 20 67 2e 70 65 72 6d 20 2a 2f 3b 0a 20 20 7d  s g.perm */;.  }
86c0: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20  .  else{.    /* 
86d0: 46 49 58 4d 45 3a 20 77 65 20 6e 65 65 64 20 61  FIXME: we need a
86e0: 6e 20 6f 70 74 69 6f 6e 20 77 68 69 63 68 20 61  n option which a
86f0: 6c 6c 6f 77 73 20 75 73 20 74 6f 20 73 6b 69 70  llows us to skip
8700: 20 74 68 69 73 2e 20 41 74 20 6c 65 61 73 74 0a   this. At least.
8710: 20 20 20 20 20 20 20 6f 6e 65 20 6b 6e 6f 77 6e         one known
8720: 20 63 6f 6d 6d 61 6e 64 20 28 2f 6a 73 6f 6e 2f   command (/json/
8730: 76 65 72 73 69 6f 6e 29 20 64 6f 65 73 20 6e 6f  version) does no
8740: 74 20 6e 65 65 64 20 61 6e 20 6f 70 65 6e 65 64  t need an opened
8750: 0a 20 20 20 20 20 20 20 72 65 70 6f 2e 20 54 68  .       repo. Th
8760: 65 20 70 72 6f 62 6c 65 6d 20 68 65 72 65 20 69  e problem here i
8770: 73 20 77 65 20 63 61 6e 6e 6f 74 20 6b 6e 6f 77  s we cannot know
8780: 20 77 68 69 63 68 20 66 75 6e 63 74 69 6f 6e 73   which functions
8790: 20 6e 65 65 64 0a 20 20 20 20 20 20 20 69 74 20   need.       it 
87a0: 66 72 6f 6d 20 68 65 72 65 20 28 62 65 63 61 75  from here (becau
87b0: 73 65 20 63 6f 6d 6d 61 6e 64 20 64 69 73 70 61  se command dispa
87c0: 74 63 68 69 6e 67 20 68 61 73 6e 27 74 20 79 65  tching hasn't ye
87d0: 74 20 68 61 70 70 65 6e 65 64 29 0a 20 20 20 20  t happened).    
87e0: 20 20 20 61 6e 64 20 61 6c 6c 20 6f 74 68 65 72     and all other
87f0: 20 63 6f 6d 6d 61 6e 64 73 20 72 65 6c 79 20 6f   commands rely o
8800: 6e 20 74 68 65 20 72 65 70 6f 20 62 65 69 6e 67  n the repo being
8810: 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 0a 20   opened before. 
8820: 20 20 20 20 20 20 74 68 65 79 20 61 72 65 20 63        they are c
8830: 61 6c 6c 65 64 2e 20 41 20 74 65 78 74 62 6f 6f  alled. A textboo
8840: 6b 20 65 78 61 6d 70 6c 65 20 6f 66 20 6c 61 63  k example of lac
8850: 6b 20 6f 66 20 66 6f 72 65 73 69 67 68 74 20 3a  k of foresight :
8860: 2f 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64  /..     */.    d
8870: 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f 70 65 6e 5f  b_find_and_open_
8880: 72 65 70 6f 73 69 74 6f 72 79 28 4f 50 45 4e 5f  repository(OPEN_
8890: 41 4e 59 5f 53 43 48 45 4d 41 2c 30 29 3b 0a 20  ANY_SCHEMA,0);. 
88a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
88b0: 72 6e 73 20 74 68 65 20 6e 64 78 27 74 68 20 69  rns the ndx'th i
88c0: 74 65 6d 20 69 6e 20 74 68 65 20 22 63 6f 6d 6d  tem in the "comm
88d0: 61 6e 64 20 70 61 74 68 22 2c 20 77 68 65 72 65  and path", where
88e0: 20 69 6e 64 65 78 20 30 20 69 73 20 74 68 65 0a   index 0 is the.
88f0: 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  ** position of t
8900: 68 65 20 22 6a 73 6f 6e 22 20 70 61 72 74 20 6f  he "json" part o
8910: 66 20 74 68 65 20 70 61 74 68 2e 20 52 65 74 75  f the path. Retu
8920: 72 6e 73 20 4e 55 4c 4c 20 69 66 20 6e 64 78 20  rns NULL if ndx 
8930: 69 73 20 6f 75 74 0a 2a 2a 20 6f 66 20 62 6f 75  is out.** of bou
8940: 6e 64 73 20 6f 72 20 74 68 65 72 65 20 69 73 20  nds or there is 
8950: 6e 6f 20 22 6a 73 6f 6e 22 20 70 61 74 68 20 65  no "json" path e
8960: 6c 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  lement..**.** In
8970: 20 43 4c 49 20 6d 6f 64 65 20 74 68 65 20 22 70   CLI mode the "p
8980: 61 74 68 22 20 69 73 20 74 68 65 20 6c 69 73 74  ath" is the list
8990: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 28 73   of arguments (s
89a0: 6b 69 70 70 69 6e 67 20 61 72 67 76 5b 30 5d 29  kipping argv[0])
89b0: 2e 0a 2a 2a 20 49 6e 20 73 65 72 76 65 72 2f 43  ..** In server/C
89c0: 47 49 20 6d 6f 64 65 73 20 74 68 65 20 70 61 74  GI modes the pat
89d0: 68 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  h is taken from 
89e0: 50 41 54 48 5f 49 4e 46 4f 2e 0a 2a 2a 0a 2a 2a  PATH_INFO..**.**
89f0: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 62 79   The returned by
8a00: 74 65 73 20 61 72 65 20 6f 77 6e 65 64 20 62 79  tes are owned by
8a10: 20 67 2e 6a 73 6f 6e 2e 63 6d 64 2e 76 20 61 6e   g.json.cmd.v an
8a20: 64 20 5f 6d 61 79 5f 20 62 65 0a 2a 2a 20 69 6e  d _may_ be.** in
8a30: 76 61 6c 69 64 61 74 65 64 20 69 66 20 74 68 61  validated if tha
8a40: 74 20 6f 62 6a 65 63 74 20 69 73 20 6d 6f 64 69  t object is modi
8a50: 66 69 65 64 20 28 64 65 70 65 6e 64 69 6e 67 20  fied (depending 
8a60: 6f 6e 20 68 6f 77 20 69 74 20 69 73 0a 2a 2a 20  on how it is.** 
8a70: 6d 6f 64 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  modified)..**.**
8a80: 20 4e 6f 74 65 20 74 68 61 74 20 43 4c 49 20 6f   Note that CLI o
8a90: 70 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 69  ptions are not i
8aa0: 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 63  ncluded in the c
8ab0: 6f 6d 6d 61 6e 64 20 70 61 74 68 2e 20 55 73 65  ommand path. Use
8ac0: 0a 2a 2a 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28  .** find_option(
8ad0: 29 20 74 6f 20 67 65 74 20 74 68 6f 73 65 2e 0a  ) to get those..
8ae0: 2a 2a 0a 2a 2f 0a 63 68 61 72 20 63 6f 6e 73 74  **.*/.char const
8af0: 20 2a 20 6a 73 6f 6e 5f 63 6f 6d 6d 61 6e 64 5f   * json_command_
8b00: 61 72 67 28 75 6e 73 69 67 6e 65 64 20 73 68 6f  arg(unsigned sho
8b10: 72 74 20 6e 64 78 29 7b 0a 20 20 63 73 6f 6e 5f  rt ndx){.  cson_
8b20: 61 72 72 61 79 20 2a 20 61 72 20 3d 20 67 2e 6a  array * ar = g.j
8b30: 73 6f 6e 2e 63 6d 64 2e 61 3b 0a 20 20 61 73 73  son.cmd.a;.  ass
8b40: 65 72 74 28 28 4e 55 4c 4c 21 3d 61 72 29 20 26  ert((NULL!=ar) &
8b50: 26 20 22 49 6e 74 65 72 6e 61 6c 20 65 72 72 6f  & "Internal erro
8b60: 72 2e 20 57 61 73 20 6a 73 6f 6e 5f 6d 6f 64 65  r. Was json_mode
8b70: 5f 62 6f 6f 74 73 74 72 61 70 28 29 20 63 61 6c  _bootstrap() cal
8b80: 6c 65 64 3f 22 29 3b 0a 20 20 61 73 73 65 72 74  led?");.  assert
8b90: 28 28 67 2e 61 72 67 63 3e 31 29 20 26 26 20 22  ((g.argc>1) && "
8ba0: 49 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 2d  Internal error -
8bb0: 20 77 65 20 6e 65 76 65 72 20 73 68 6f 75 6c 64   we never should
8bc0: 20 68 61 76 65 20 67 6f 74 74 65 6e 20 74 68 69   have gotten thi
8bd0: 73 20 66 61 72 2e 22 29 3b 0a 20 20 69 66 28 20  s far.");.  if( 
8be0: 67 2e 6a 73 6f 6e 2e 63 6d 64 2e 6f 66 66 73 65  g.json.cmd.offse
8bf0: 74 20 3c 20 30 20 29 7b 0a 20 20 20 20 2f 2a 20  t < 0 ){.    /* 
8c00: 66 69 72 73 74 2d 74 69 6d 65 20 73 65 74 75 70  first-time setup
8c10: 2e 20 2a 2f 0a 20 20 20 20 73 68 6f 72 74 20 69  . */.    short i
8c20: 20 3d 20 30 3b 0a 23 64 65 66 69 6e 65 20 4e 45   = 0;.#define NE
8c30: 58 54 20 63 73 6f 6e 5f 73 74 72 69 6e 67 5f 63  XT cson_string_c
8c40: 73 74 72 28 20 20 20 20 20 20 20 20 20 20 5c 0a  str(          \.
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c60: 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 67 65 74 5f   cson_value_get_
8c70: 73 74 72 69 6e 67 28 20 5c 0a 20 20 20 20 20 20  string( \.      
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 73 6f               cso
8c90: 6e 5f 61 72 72 61 79 5f 67 65 74 28 61 72 2c 69  n_array_get(ar,i
8ca0: 29 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) \.            
8cb0: 20 20 20 20 20 20 20 29 29 0a 20 20 20 20 63 68         )).    ch
8cc0: 61 72 20 63 6f 6e 73 74 20 2a 20 74 6f 6b 20 3d  ar const * tok =
8cd0: 20 4e 45 58 54 3b 0a 20 20 20 20 77 68 69 6c 65   NEXT;.    while
8ce0: 28 20 74 6f 6b 20 29 7b 0a 20 20 20 20 20 20 69  ( tok ){.      i
8cf0: 66 28 20 21 67 2e 69 73 48 54 54 50 2f 2a 77 6f  f( !g.isHTTP/*wo
8d00: 72 6b 61 72 6f 75 6e 64 20 66 6f 72 20 22 61 62  rkaround for "ab
8d10: 62 72 65 76 69 61 74 65 64 20 6e 61 6d 65 22 20  breviated name" 
8d20: 69 6e 20 43 4c 49 20 6d 6f 64 65 2a 2f 0a 20 20  in CLI mode*/.  
8d30: 20 20 20 20 20 20 20 20 3f 20 28 30 3d 3d 73 74          ? (0==st
8d40: 72 63 6d 70 28 67 2e 61 72 67 76 5b 31 5d 2c 74  rcmp(g.argv[1],t
8d50: 6f 6b 29 29 0a 20 20 20 20 20 20 20 20 20 20 3a  ok)).          :
8d60: 20 28 30 3d 3d 73 74 72 6e 63 6d 70 28 22 6a 73   (0==strncmp("js
8d70: 6f 6e 22 2c 74 6f 6b 2c 34 29 29 0a 20 20 20 20  on",tok,4)).    
8d80: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
8d90: 20 67 2e 6a 73 6f 6e 2e 63 6d 64 2e 6f 66 66 73   g.json.cmd.offs
8da0: 65 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  et = i;.        
8db0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
8dc0: 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20 20 20 20       ++i;.      
8dd0: 74 6f 6b 20 3d 20 4e 45 58 54 3b 0a 20 20 20 20  tok = NEXT;.    
8de0: 7d 0a 20 20 7d 0a 23 75 6e 64 65 66 20 4e 45 58  }.  }.#undef NEX
8df0: 54 0a 20 20 69 66 28 67 2e 6a 73 6f 6e 2e 63 6d  T.  if(g.json.cm
8e00: 64 2e 6f 66 66 73 65 74 20 3c 20 30 29 7b 0a 20  d.offset < 0){. 
8e10: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a     return NULL;.
8e20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 64 78    }else{.    ndx
8e30: 20 3d 20 67 2e 6a 73 6f 6e 2e 63 6d 64 2e 6f 66   = g.json.cmd.of
8e40: 66 73 65 74 20 2b 20 6e 64 78 3b 0a 20 20 20 20  fset + ndx;.    
8e50: 72 65 74 75 72 6e 20 63 73 6f 6e 5f 73 74 72 69  return cson_stri
8e60: 6e 67 5f 63 73 74 72 28 63 73 6f 6e 5f 76 61 6c  ng_cstr(cson_val
8e70: 75 65 5f 67 65 74 5f 73 74 72 69 6e 67 28 63 73  ue_get_string(cs
8e80: 6f 6e 5f 61 72 72 61 79 5f 67 65 74 28 20 61 72  on_array_get( ar
8e90: 2c 20 67 2e 6a 73 6f 6e 2e 63 6d 64 2e 6f 66 66  , g.json.cmd.off
8ea0: 73 65 74 20 2b 20 6e 64 78 20 29 29 29 3b 0a 20  set + ndx )));. 
8eb0: 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73   }.}../* Returns
8ec0: 20 74 68 65 20 43 2d 73 74 72 69 6e 67 20 66 6f   the C-string fo
8ed0: 72 6d 20 6f 66 20 6a 73 6f 6e 5f 61 75 74 68 5f  rm of json_auth_
8ee0: 74 6f 6b 65 6e 28 29 2c 20 6f 72 20 4e 55 4c 4c  token(), or NULL
8ef0: 0a 2a 2a 20 69 66 20 6a 73 6f 6e 5f 61 75 74 68  .** if json_auth
8f00: 5f 74 6f 6b 65 6e 28 29 20 72 65 74 75 72 6e 73  _token() returns
8f10: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 68 61 72 20 63   NULL..*/.char c
8f20: 6f 6e 73 74 20 2a 20 6a 73 6f 6e 5f 61 75 74 68  onst * json_auth
8f30: 5f 74 6f 6b 65 6e 5f 63 73 74 72 28 29 7b 0a 20  _token_cstr(){. 
8f40: 20 72 65 74 75 72 6e 20 63 73 6f 6e 5f 76 61 6c   return cson_val
8f50: 75 65 5f 67 65 74 5f 63 73 74 72 28 20 6a 73 6f  ue_get_cstr( jso
8f60: 6e 5f 61 75 74 68 5f 74 6f 6b 65 6e 28 29 20 29  n_auth_token() )
8f70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8f80: 6e 73 20 74 68 65 20 4a 73 6f 6e 50 61 67 65 44  ns the JsonPageD
8f90: 65 66 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ef with the give
8fa0: 6e 20 6e 61 6d 65 2c 20 6f 72 20 4e 55 4c 4c 20  n name, or NULL 
8fb0: 69 66 20 6e 6f 20 6d 61 74 63 68 20 69 73 0a 2a  if no match is.*
8fc0: 2a 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 68  * found..**.** h
8fd0: 65 61 64 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ead must be a po
8fe0: 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61  inter to an arra
8ff0: 79 20 6f 66 20 4a 73 6f 6e 50 61 67 65 44 65 66  y of JsonPageDef
9000: 73 20 69 6e 20 77 68 69 63 68 20 74 68 65 0a 2a  s in which the.*
9010: 2a 20 6c 61 73 74 20 65 6e 74 72 79 20 68 61 73  * last entry has
9020: 20 61 20 4e 55 4c 4c 20 6e 61 6d 65 2e 0a 2a 2f   a NULL name..*/
9030: 0a 4a 73 6f 6e 50 61 67 65 44 65 66 20 63 6f 6e  .JsonPageDef con
9040: 73 74 20 2a 20 6a 73 6f 6e 5f 68 61 6e 64 6c 65  st * json_handle
9050: 72 5f 66 6f 72 5f 6e 61 6d 65 28 20 63 68 61 72  r_for_name( char
9060: 20 63 6f 6e 73 74 20 2a 20 6e 61 6d 65 2c 20 4a   const * name, J
9070: 73 6f 6e 50 61 67 65 44 65 66 20 63 6f 6e 73 74  sonPageDef const
9080: 20 2a 20 68 65 61 64 20 29 7b 0a 20 20 4a 73 6f   * head ){.  Jso
9090: 6e 50 61 67 65 44 65 66 20 63 6f 6e 73 74 20 2a  nPageDef const *
90a0: 20 70 61 67 65 44 65 66 20 3d 20 68 65 61 64 3b   pageDef = head;
90b0: 0a 20 20 61 73 73 65 72 74 28 20 68 65 61 64 20  .  assert( head 
90c0: 21 3d 20 4e 55 4c 4c 20 29 3b 0a 20 20 69 66 28  != NULL );.  if(
90d0: 6e 61 6d 65 20 26 26 20 2a 6e 61 6d 65 29 20 66  name && *name) f
90e0: 6f 72 28 20 3b 20 70 61 67 65 44 65 66 2d 3e 6e  or( ; pageDef->n
90f0: 61 6d 65 3b 20 2b 2b 70 61 67 65 44 65 66 20 29  ame; ++pageDef )
9100: 7b 0a 20 20 20 20 69 66 28 20 30 20 3d 3d 20 73  {.    if( 0 == s
9110: 74 72 63 6d 70 28 6e 61 6d 65 2c 20 70 61 67 65  trcmp(name, page
9120: 44 65 66 2d 3e 6e 61 6d 65 29 20 29 7b 0a 20 20  Def->name) ){.  
9130: 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 44      return pageD
9140: 65 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ef;.    }.  }.  
9150: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a 0a  return NULL;.}..
9160: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 46 6f  /*.** Given a Fo
9170: 73 73 69 6c 2f 4a 53 4f 4e 20 72 65 73 75 6c 74  ssil/JSON result
9180: 20 63 6f 64 65 2c 20 74 68 69 73 20 66 75 6e 63   code, this func
9190: 74 69 6f 6e 20 22 64 75 6d 62 73 20 69 74 20 64  tion "dumbs it d
91a0: 6f 77 6e 22 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  own".** accordin
91b0: 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  g to the current
91c0: 20 76 61 6c 75 65 20 6f 66 20 67 2e 6a 73 6f 6e   value of g.json
91d0: 2e 65 72 72 6f 72 44 65 74 61 69 6c 50 61 72 61  .errorDetailPara
91e0: 6e 6f 69 61 2e 20 54 68 65 0a 2a 2a 20 64 75 6d  noia. The.** dum
91f0: 62 65 64 2d 64 6f 77 6e 20 76 61 6c 75 65 20 69  bed-down value i
9200: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
9210: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
9220: 61 73 73 65 72 74 28 29 73 20 74 68 61 74 20 63  assert()s that c
9230: 6f 64 65 20 69 73 20 69 6e 20 74 68 65 20 69 6e  ode is in the in
9240: 63 6c 75 73 69 76 65 20 72 61 6e 67 65 20 30 20  clusive range 0 
9250: 74 6f 0a 2a 2a 20 39 39 39 39 2e 0a 2a 2a 0a 2a  to.** 9999..**.*
9260: 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 41 52 4e  * Note that WARN
9270: 49 4e 47 20 63 6f 64 65 73 20 28 31 2e 2e 39 39  ING codes (1..99
9280: 39 29 20 61 72 65 20 6e 65 76 65 72 20 64 75 6d  9) are never dum
9290: 62 65 64 20 64 6f 77 6e 2e 0a 2a 2a 0a 2a 2f 0a  bed down..**.*/.
92a0: 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 5f  static int json_
92b0: 64 75 6d 62 64 6f 77 6e 5f 72 63 28 20 69 6e 74  dumbdown_rc( int
92c0: 20 63 6f 64 65 20 29 7b 0a 20 20 69 66 28 21 67   code ){.  if(!g
92d0: 2e 6a 73 6f 6e 2e 65 72 72 6f 72 44 65 74 61 69  .json.errorDetai
92e0: 6c 50 61 72 61 6e 6f 69 61 0a 20 20 20 20 20 7c  lParanoia.     |
92f0: 7c 20 21 63 6f 64 65 0a 20 20 20 20 20 7c 7c 20  | !code.     || 
9300: 28 28 63 6f 64 65 3e 3d 46 53 4c 5f 4a 53 4f 4e  ((code>=FSL_JSON
9310: 5f 57 5f 53 54 41 52 54 29 20 26 26 20 28 63 6f  _W_START) && (co
9320: 64 65 3c 46 53 4c 5f 4a 53 4f 4e 5f 57 5f 45 4e  de<FSL_JSON_W_EN
9330: 44 29 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  D))){.    return
9340: 20 63 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a   code;.  }else{.
9350: 20 20 20 20 69 6e 74 20 6d 6f 64 75 6c 6f 20 3d      int modulo =
9360: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28   0;.    assert((
9370: 63 6f 64 65 20 3e 3d 20 31 30 30 30 29 20 26 26  code >= 1000) &&
9380: 20 28 63 6f 64 65 20 3c 3d 20 39 39 39 39 29 20   (code <= 9999) 
9390: 26 26 20 22 49 6e 76 61 6c 69 64 20 46 6f 73 73  && "Invalid Foss
93a0: 69 6c 2f 4a 53 4f 4e 20 63 6f 64 65 2e 22 29 3b  il/JSON code.");
93b0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 67 2e 6a  .    switch( g.j
93c0: 73 6f 6e 2e 65 72 72 6f 72 44 65 74 61 69 6c 50  son.errorDetailP
93d0: 61 72 61 6e 6f 69 61 20 29 7b 0a 20 20 20 20 20  aranoia ){.     
93e0: 20 63 61 73 65 20 31 3a 20 6d 6f 64 75 6c 6f 20   case 1: modulo 
93f0: 3d 20 31 30 3b 20 62 72 65 61 6b 3b 0a 20 20 20  = 10; break;.   
9400: 20 20 20 63 61 73 65 20 32 3a 20 6d 6f 64 75 6c     case 2: modul
9410: 6f 20 3d 20 31 30 30 3b 20 62 72 65 61 6b 3b 0a  o = 100; break;.
9420: 20 20 20 20 20 20 63 61 73 65 20 33 3a 20 6d 6f        case 3: mo
9430: 64 75 6c 6f 20 3d 20 31 30 30 30 3b 20 62 72 65  dulo = 1000; bre
9440: 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c  ak;.      defaul
9450: 74 3a 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  t: break;.    }.
9460: 20 20 20 20 69 66 28 20 6d 6f 64 75 6c 6f 20 29      if( modulo )
9470: 20 63 6f 64 65 20 3d 20 63 6f 64 65 20 2d 20 28   code = code - (
9480: 63 6f 64 65 20 25 20 6d 6f 64 75 6c 6f 29 3b 0a  code % modulo);.
9490: 20 20 20 20 72 65 74 75 72 6e 20 63 6f 64 65 3b      return code;
94a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
94b0: 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e  nvenience routin
94c0: 65 20 77 68 69 63 68 20 63 6f 6e 76 65 72 74 73  e which converts
94d0: 20 61 20 4a 75 6c 69 61 6e 20 74 69 6d 65 20 76   a Julian time v
94e0: 61 6c 75 65 20 69 6e 74 6f 20 61 20 55 6e 69 78  alue into a Unix
94f0: 0a 2a 2a 20 45 70 6f 63 68 20 74 69 6d 65 73 74  .** Epoch timest
9500: 61 6d 70 2e 20 52 65 71 75 69 72 65 73 20 74 68  amp. Requires th
9510: 65 20 64 62 2c 20 73 6f 20 74 68 69 73 20 63 61  e db, so this ca
9520: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 62 65 66  nnot be used bef
9530: 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 70 6f 20  ore the.** repo 
9540: 69 73 20 6f 70 65 6e 65 64 20 28 77 69 6c 6c 20  is opened (will 
9550: 74 72 69 67 67 65 72 20 61 20 66 61 74 61 6c 20  trigger a fatal 
9560: 65 72 72 6f 72 20 69 6e 20 64 62 5f 78 78 78 28  error in db_xxx(
9570: 29 29 2e 20 54 68 65 20 72 65 74 75 72 6e 65 64  )). The returned
9580: 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 6f 77 6e  .** value is own
9590: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
95a0: 2e 0a 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65 20  ..*/.cson_value 
95b0: 2a 20 6a 73 6f 6e 5f 6a 75 6c 69 61 6e 5f 74 6f  * json_julian_to
95c0: 5f 74 69 6d 65 73 74 61 6d 70 28 64 6f 75 62 6c  _timestamp(doubl
95d0: 65 20 6a 29 7b 0a 20 20 72 65 74 75 72 6e 20 63  e j){.  return c
95e0: 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 69 6e  son_value_new_in
95f0: 74 65 67 65 72 28 28 63 73 6f 6e 5f 69 6e 74 5f  teger((cson_int_
9600: 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 64 62  t).           db
9610: 5f 69 6e 74 36 34 28 30 2c 22 53 45 4c 45 43 54  _int64(0,"SELECT
9620: 20 63 61 73 74 28 73 74 72 66 74 69 6d 65 28 27   cast(strftime('
9630: 25 25 73 27 2c 25 6c 66 29 20 61 73 20 69 6e 74  %%s',%lf) as int
9640: 29 22 2c 6a 29 0a 20 20 20 20 20 20 20 20 20 20  )",j).          
9650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9660: 20 20 20 20 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a        );.}../*.*
9670: 2a 20 52 65 74 75 72 6e 73 20 61 20 74 69 6d 65  * Returns a time
9680: 73 74 61 6d 70 20 76 61 6c 75 65 2e 0a 2a 2f 0a  stamp value..*/.
9690: 63 73 6f 6e 5f 69 6e 74 5f 74 20 6a 73 6f 6e 5f  cson_int_t json_
96a0: 74 69 6d 65 73 74 61 6d 70 28 29 7b 0a 20 20 72  timestamp(){.  r
96b0: 65 74 75 72 6e 20 28 63 73 6f 6e 5f 69 6e 74 5f  eturn (cson_int_
96c0: 74 29 74 69 6d 65 28 30 29 3b 0a 7d 0a 0a 2f 2a  t)time(0);.}../*
96d0: 0a 2a 2a 20 52 65 74 75 72 6e 73 20 61 20 6e 65  .** Returns a ne
96e0: 77 20 4a 53 4f 4e 20 76 61 6c 75 65 20 28 6f 77  w JSON value (ow
96f0: 6e 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ned by the calle
9700: 72 29 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a  r) representing.
9710: 2a 2a 20 61 20 74 69 6d 65 73 74 61 6d 70 2e 20  ** a timestamp. 
9720: 49 66 20 74 69 6d 65 56 61 6c 20 69 73 20 3c 20  If timeVal is < 
9730: 30 20 74 68 65 6e 20 74 69 6d 65 28 30 29 20 69  0 then time(0) i
9740: 73 20 75 73 65 64 20 74 6f 20 66 65 74 63 68 0a  s used to fetch.
9750: 2a 2a 20 74 68 65 20 74 69 6d 65 2c 20 65 6c 73  ** the time, els
9760: 65 20 74 69 6d 65 56 61 6c 20 69 73 20 75 73 65  e timeVal is use
9770: 64 20 61 73 2d 69 73 2e 20 54 68 65 20 72 65 74  d as-is. The ret
9780: 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 0a 2a  urned value is.*
9790: 2a 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63  * owned by the c
97a0: 61 6c 6c 65 72 2e 0a 2a 2f 0a 63 73 6f 6e 5f 76  aller..*/.cson_v
97b0: 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 6e 65 77 5f  alue * json_new_
97c0: 74 69 6d 65 73 74 61 6d 70 28 63 73 6f 6e 5f 69  timestamp(cson_i
97d0: 6e 74 5f 74 20 74 69 6d 65 56 61 6c 29 7b 0a 20  nt_t timeVal){. 
97e0: 20 72 65 74 75 72 6e 20 63 73 6f 6e 5f 76 61 6c   return cson_val
97f0: 75 65 5f 6e 65 77 5f 69 6e 74 65 67 65 72 28 28  ue_new_integer((
9800: 74 69 6d 65 56 61 6c 3c 30 29 20 3f 20 28 63 73  timeVal<0) ? (cs
9810: 6f 6e 5f 69 6e 74 5f 74 29 74 69 6d 65 28 30 29  on_int_t)time(0)
9820: 20 3a 20 74 69 6d 65 56 61 6c 29 3b 0a 7d 0a 0a   : timeVal);.}..
9830: 2f 2a 0a 2a 2a 20 49 6e 74 65 72 6e 61 6c 20 68  /*.** Internal h
9840: 65 6c 70 65 72 20 66 6f 72 20 6a 73 6f 6e 5f 63  elper for json_c
9850: 72 65 61 74 65 5f 72 65 73 70 6f 6e 73 65 28 29  reate_response()
9860: 2e 20 41 70 70 65 6e 64 73 20 74 68 65 20 66 69  . Appends the fi
9870: 72 73 74 0a 2a 2a 20 67 2e 6a 73 6f 6e 2e 64 69  rst.** g.json.di
9880: 73 70 61 74 63 68 44 65 70 74 68 20 65 6c 65 6d  spatchDepth elem
9890: 65 6e 74 73 20 6f 66 20 67 2e 6a 73 6f 6e 2e 63  ents of g.json.c
98a0: 6d 64 2e 61 2c 20 73 6b 69 70 70 69 6e 67 20 74  md.a, skipping t
98b0: 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f 6e 65 20  he first.** one 
98c0: 28 74 68 65 20 22 6a 73 6f 6e 22 20 70 61 72 74  (the "json" part
98d0: 29 2c 20 74 6f 20 61 20 73 74 72 69 6e 67 20 61  ), to a string a
98e0: 6e 64 20 72 65 74 75 72 6e 73 20 74 68 61 74 20  nd returns that 
98f0: 73 74 72 69 6e 67 20 76 61 6c 75 65 0a 2a 2a 20  string value.** 
9900: 28 77 68 69 63 68 20 69 73 20 6f 77 6e 65 64 20  (which is owned 
9910: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 29 2e 0a  by the caller)..
9920: 2a 2f 0a 73 74 61 74 69 63 20 63 73 6f 6e 5f 76  */.static cson_v
9930: 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 72 65 73 70  alue * json_resp
9940: 6f 6e 73 65 5f 63 6f 6d 6d 61 6e 64 5f 70 61 74  onse_command_pat
9950: 68 28 29 7b 0a 20 20 69 66 28 21 67 2e 6a 73 6f  h(){.  if(!g.jso
9960: 6e 2e 63 6d 64 2e 61 29 7b 0a 20 20 20 20 72 65  n.cmd.a){.    re
9970: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  turn NULL;.  }el
9980: 73 65 7b 0a 20 20 20 20 63 73 6f 6e 5f 76 61 6c  se{.    cson_val
9990: 75 65 20 2a 20 72 63 20 3d 20 4e 55 4c 4c 3b 0a  ue * rc = NULL;.
99a0: 20 20 20 20 42 6c 6f 62 20 70 61 74 68 20 3d 20      Blob path = 
99b0: 65 6d 70 74 79 5f 62 6c 6f 62 3b 0a 20 20 20 20  empty_blob;.    
99c0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 61 4c 65  unsigned int aLe
99d0: 6e 20 3d 20 67 2e 6a 73 6f 6e 2e 64 69 73 70 61  n = g.json.dispa
99e0: 74 63 68 44 65 70 74 68 2b 31 3b 20 2f 2a 63 73  tchDepth+1; /*cs
99f0: 6f 6e 5f 61 72 72 61 79 5f 6c 65 6e 67 74 68 5f  on_array_length_
9a00: 67 65 74 28 67 2e 6a 73 6f 6e 2e 63 6d 64 2e 61  get(g.json.cmd.a
9a10: 29 3b 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  );*/.    unsigne
9a20: 64 20 69 6e 74 20 69 20 3d 20 31 3b 0a 20 20 20  d int i = 1;.   
9a30: 20 66 6f 72 28 20 3b 20 69 20 3c 20 61 4c 65 6e   for( ; i < aLen
9a40: 3b 20 2b 2b 69 20 29 7b 0a 20 20 20 20 20 20 63  ; ++i ){.      c
9a50: 68 61 72 20 63 6f 6e 73 74 20 2a 20 70 61 72 74  har const * part
9a60: 20 3d 20 63 73 6f 6e 5f 73 74 72 69 6e 67 5f 63   = cson_string_c
9a70: 73 74 72 28 63 73 6f 6e 5f 76 61 6c 75 65 5f 67  str(cson_value_g
9a80: 65 74 5f 73 74 72 69 6e 67 28 63 73 6f 6e 5f 61  et_string(cson_a
9a90: 72 72 61 79 5f 67 65 74 28 67 2e 6a 73 6f 6e 2e  rray_get(g.json.
9aa0: 63 6d 64 2e 61 2c 20 69 29 29 29 3b 0a 20 20 20  cmd.a, i)));.   
9ab0: 20 20 20 69 66 28 21 70 61 72 74 29 7b 0a 23 69     if(!part){.#i
9ac0: 66 20 31 0a 20 20 20 20 20 20 20 20 20 20 66 6f  f 1.          fo
9ad0: 73 73 69 6c 5f 77 61 72 6e 69 6e 67 28 22 49 74  ssil_warning("It
9ae0: 65 72 61 74 69 6e 67 20 66 75 72 74 68 65 72 20  erating further 
9af0: 74 68 61 6e 20 65 78 70 65 63 74 65 64 20 69 6e  than expected in
9b00: 20 25 73 2e 22 2c 0a 20 20 20 20 20 20 20 20 20   %s.",.         
9b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 5f                __
9b20: 46 49 4c 45 5f 5f 29 3b 0a 23 65 6e 64 69 66 0a  FILE__);.#endif.
9b30: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9b40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
9b50: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 70 61 74  lob_appendf(&pat
9b60: 68 2c 22 25 73 25 73 22 2c 20 28 69 3e 31 20 3f  h,"%s%s", (i>1 ?
9b70: 20 22 2f 22 3a 20 22 22 29 2c 20 70 61 72 74 29   "/": ""), part)
9b80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
9b90: 20 6a 73 6f 6e 5f 6e 65 77 5f 73 74 72 69 6e 67   json_new_string
9ba0: 28 28 62 6c 6f 62 5f 73 69 7a 65 28 26 70 61 74  ((blob_size(&pat
9bb0: 68 29 3e 30 29 0a 20 20 20 20 20 20 20 20 20 20  h)>0).          
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3f                 ?
9bd0: 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 70 61   blob_buffer(&pa
9be0: 74 68 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  th).            
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 22               : "
9c00: 22 29 0a 20 20 20 20 20 20 2f 2a 20 72 65 6d 69  ").      /* remi
9c10: 6e 64 65 72 3b 20 77 65 20 6e 65 65 64 20 61 6e  nder; we need an
9c20: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69 6e   empty string in
9c30: 73 74 65 61 64 20 6f 66 20 4e 55 4c 4c 0a 20 20  stead of NULL.  
9c40: 20 20 20 20 20 20 20 69 6e 20 74 68 69 73 20 63         in this c
9c50: 61 73 65 2c 20 74 6f 20 61 76 6f 69 64 20 77 68  ase, to avoid wh
9c60: 61 74 20 6f 75 74 77 61 72 64 6c 79 20 6c 6f 6f  at outwardly loo
9c70: 6b 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20  ks like.        
9c80: 20 28 62 75 74 20 69 73 20 6e 6f 74 29 20 61 6e   (but is not) an
9c90: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
9ca0: 72 20 69 6e 0a 20 20 20 20 20 20 20 20 20 6a 73  r in.         js
9cb0: 6f 6e 5f 63 72 65 61 74 65 5f 72 65 73 70 6f 6e  on_create_respon
9cc0: 73 65 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  se()..      */. 
9cd0: 20 20 20 20 20 3b 0a 20 20 20 20 62 6c 6f 62 5f       ;.    blob_
9ce0: 72 65 73 65 74 28 26 70 61 74 68 29 3b 0a 20 20  reset(&path);.  
9cf0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
9d00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
9d10: 73 20 61 20 4a 53 4f 4e 20 4f 62 6a 65 63 74 20  s a JSON Object 
9d20: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
9d30: 66 20 74 68 65 20 67 6c 6f 62 61 6c 20 67 20 6f  f the global g o
9d40: 62 6a 65 63 74 2e 0a 2a 2a 20 52 65 74 75 72 6e  bject..** Return
9d50: 65 64 20 76 61 6c 75 65 20 69 73 20 6f 77 6e 65  ed value is owne
9d60: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
9d70: 0a 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65 20 2a  .*/.cson_value *
9d80: 20 6a 73 6f 6e 5f 67 5f 74 6f 5f 6a 73 6f 6e 28   json_g_to_json(
9d90: 29 7b 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74  ){.  cson_object
9da0: 20 2a 20 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63   * o = NULL;.  c
9db0: 73 6f 6e 5f 6f 62 6a 65 63 74 20 2a 20 70 61 79  son_object * pay
9dc0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70 61 79 20 3d   = NULL;.  pay =
9dd0: 20 6f 20 3d 20 63 73 6f 6e 5f 6e 65 77 5f 6f 62   o = cson_new_ob
9de0: 6a 65 63 74 28 29 3b 0a 0a 23 64 65 66 69 6e 65  ject();..#define
9df0: 20 49 4e 54 28 4f 42 4a 2c 4b 29 20 63 73 6f 6e   INT(OBJ,K) cson
9e00: 5f 6f 62 6a 65 63 74 5f 73 65 74 28 6f 2c 20 23  _object_set(o, #
9e10: 4b 2c 20 6a 73 6f 6e 5f 6e 65 77 5f 69 6e 74 28  K, json_new_int(
9e20: 4f 42 4a 2e 4b 29 29 0a 23 64 65 66 69 6e 65 20  OBJ.K)).#define 
9e30: 43 53 54 52 28 4f 42 4a 2c 4b 29 20 63 73 6f 6e  CSTR(OBJ,K) cson
9e40: 5f 6f 62 6a 65 63 74 5f 73 65 74 28 6f 2c 20 23  _object_set(o, #
9e50: 4b 2c 20 4f 42 4a 2e 4b 20 3f 20 6a 73 6f 6e 5f  K, OBJ.K ? json_
9e60: 6e 65 77 5f 73 74 72 69 6e 67 28 4f 42 4a 2e 4b  new_string(OBJ.K
9e70: 29 20 3a 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e  ) : cson_value_n
9e80: 75 6c 6c 28 29 29 0a 23 64 65 66 69 6e 65 20 56  ull()).#define V
9e90: 41 4c 28 4b 2c 56 29 20 63 73 6f 6e 5f 6f 62 6a  AL(K,V) cson_obj
9ea0: 65 63 74 5f 73 65 74 28 6f 2c 20 23 4b 2c 20 28  ect_set(o, #K, (
9eb0: 56 29 20 3f 20 28 56 29 20 3a 20 63 73 6f 6e 5f  V) ? (V) : cson_
9ec0: 76 61 6c 75 65 5f 6e 75 6c 6c 28 29 29 0a 20 20  value_null()).  
9ed0: 56 41 4c 28 63 61 70 61 62 69 6c 69 74 69 65 73  VAL(capabilities
9ee0: 2c 20 6a 73 6f 6e 5f 63 61 70 5f 76 61 6c 75 65  , json_cap_value
9ef0: 28 29 29 3b 0a 20 20 49 4e 54 28 67 2c 20 61 72  ());.  INT(g, ar
9f00: 67 63 29 3b 0a 20 20 49 4e 54 28 67 2c 20 69 73  gc);.  INT(g, is
9f10: 43 6f 6e 73 74 29 3b 0a 20 20 49 4e 54 28 67 2c  Const);.  INT(g,
9f20: 20 75 73 65 41 74 74 61 63 68 29 3b 0a 20 20 43   useAttach);.  C
9f30: 53 54 52 28 67 2c 20 7a 43 6f 6e 66 69 67 44 62  STR(g, zConfigDb
9f40: 4e 61 6d 65 29 3b 0a 20 20 49 4e 54 28 67 2c 20  Name);.  INT(g, 
9f50: 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e 29 3b  repositoryOpen);
9f60: 0a 20 20 49 4e 54 28 67 2c 20 6c 6f 63 61 6c 4f  .  INT(g, localO
9f70: 70 65 6e 29 3b 0a 20 20 49 4e 54 28 67 2c 20 6d  pen);.  INT(g, m
9f80: 69 6e 50 72 65 66 69 78 29 3b 0a 20 20 49 4e 54  inPrefix);.  INT
9f90: 28 67 2c 20 66 53 71 6c 54 72 61 63 65 29 3b 0a  (g, fSqlTrace);.
9fa0: 20 20 49 4e 54 28 67 2c 20 66 53 71 6c 53 74 61    INT(g, fSqlSta
9fb0: 74 73 29 3b 0a 20 20 49 4e 54 28 67 2c 20 66 53  ts);.  INT(g, fS
9fc0: 71 6c 50 72 69 6e 74 29 3b 0a 20 20 49 4e 54 28  qlPrint);.  INT(
9fd0: 67 2c 20 66 51 75 69 65 74 29 3b 0a 20 20 49 4e  g, fQuiet);.  IN
9fe0: 54 28 67 2c 20 66 48 74 74 70 54 72 61 63 65 29  T(g, fHttpTrace)
9ff0: 3b 0a 20 20 49 4e 54 28 67 2c 20 66 53 79 73 74  ;.  INT(g, fSyst
a000: 65 6d 54 72 61 63 65 29 3b 0a 20 20 49 4e 54 28  emTrace);.  INT(
a010: 67 2c 20 66 4e 6f 53 79 6e 63 29 3b 0a 20 20 49  g, fNoSync);.  I
a020: 4e 54 28 67 2c 20 69 45 72 72 50 72 69 6f 72 69  NT(g, iErrPriori
a030: 74 79 29 3b 0a 20 20 49 4e 54 28 67 2c 20 73 73  ty);.  INT(g, ss
a040: 6c 4e 6f 74 41 76 61 69 6c 61 62 6c 65 29 3b 0a  lNotAvailable);.
a050: 20 20 49 4e 54 28 67 2c 20 63 67 69 4f 75 74 70    INT(g, cgiOutp
a060: 75 74 29 3b 0a 20 20 49 4e 54 28 67 2c 20 78 66  ut);.  INT(g, xf
a070: 65 72 50 61 6e 69 63 29 3b 0a 20 20 49 4e 54 28  erPanic);.  INT(
a080: 67 2c 20 66 75 6c 6c 48 74 74 70 52 65 70 6c 79  g, fullHttpReply
a090: 29 3b 0a 20 20 49 4e 54 28 67 2c 20 78 6c 69 6e  );.  INT(g, xlin
a0a0: 6b 43 6c 75 73 74 65 72 4f 6e 6c 79 29 3b 0a 20  kClusterOnly);. 
a0b0: 20 49 4e 54 28 67 2c 20 66 54 69 6d 65 46 6f 72   INT(g, fTimeFor
a0c0: 6d 61 74 29 3b 0a 20 20 49 4e 54 28 67 2c 20 6d  mat);.  INT(g, m
a0d0: 61 72 6b 50 72 69 76 61 74 65 29 3b 0a 20 20 49  arkPrivate);.  I
a0e0: 4e 54 28 67 2c 20 63 6c 6f 63 6b 53 6b 65 77 53  NT(g, clockSkewS
a0f0: 65 65 6e 29 3b 0a 20 20 49 4e 54 28 67 2c 20 69  een);.  INT(g, i
a100: 73 48 54 54 50 29 3b 0a 20 20 49 4e 54 28 67 2e  sHTTP);.  INT(g.
a110: 75 72 6c 2c 20 69 73 46 69 6c 65 29 3b 0a 20 20  url, isFile);.  
a120: 49 4e 54 28 67 2e 75 72 6c 2c 20 69 73 48 74 74  INT(g.url, isHtt
a130: 70 73 29 3b 0a 20 20 49 4e 54 28 67 2e 75 72 6c  ps);.  INT(g.url
a140: 2c 20 69 73 53 73 68 29 3b 0a 20 20 49 4e 54 28  , isSsh);.  INT(
a150: 67 2e 75 72 6c 2c 20 70 6f 72 74 29 3b 0a 20 20  g.url, port);.  
a160: 49 4e 54 28 67 2e 75 72 6c 2c 20 64 66 6c 74 50  INT(g.url, dfltP
a170: 6f 72 74 29 3b 0a 20 20 49 4e 54 28 67 2c 20 75  ort);.  INT(g, u
a180: 73 65 4c 6f 63 61 6c 61 75 74 68 29 3b 0a 20 20  seLocalauth);.  
a190: 49 4e 54 28 67 2c 20 6e 6f 50 73 77 64 29 3b 0a  INT(g, noPswd);.
a1a0: 20 20 49 4e 54 28 67 2c 20 75 73 65 72 55 69 64    INT(g, userUid
a1b0: 29 3b 0a 20 20 49 4e 54 28 67 2c 20 72 63 76 69  );.  INT(g, rcvi
a1c0: 64 29 3b 0a 20 20 49 4e 54 28 67 2c 20 6f 6b 43  d);.  INT(g, okC
a1d0: 73 72 66 29 3b 0a 20 20 49 4e 54 28 67 2c 20 74  srf);.  INT(g, t
a1e0: 68 54 72 61 63 65 29 3b 0a 20 20 49 4e 54 28 67  hTrace);.  INT(g
a1f0: 2c 20 69 73 48 6f 6d 65 29 3b 0a 20 20 49 4e 54  , isHome);.  INT
a200: 28 67 2c 20 6e 41 75 78 29 3b 0a 20 20 49 4e 54  (g, nAux);.  INT
a210: 28 67 2c 20 61 6c 6c 6f 77 53 79 6d 6c 69 6e 6b  (g, allowSymlink
a220: 73 29 3b 0a 0a 20 20 43 53 54 52 28 67 2c 20 7a  s);..  CSTR(g, z
a230: 4d 61 69 6e 44 62 54 79 70 65 29 3b 0a 20 20 43  MainDbType);.  C
a240: 53 54 52 28 67 2c 20 7a 43 6f 6e 66 69 67 44 62  STR(g, zConfigDb
a250: 54 79 70 65 29 3b 0a 20 20 43 53 54 52 28 67 2c  Type);.  CSTR(g,
a260: 20 7a 4f 70 65 6e 52 65 76 69 73 69 6f 6e 29 3b   zOpenRevision);
a270: 0a 20 20 43 53 54 52 28 67 2c 20 7a 4c 6f 63 61  .  CSTR(g, zLoca
a280: 6c 52 6f 6f 74 29 3b 0a 20 20 43 53 54 52 28 67  lRoot);.  CSTR(g
a290: 2c 20 7a 50 61 74 68 29 3b 0a 20 20 43 53 54 52  , zPath);.  CSTR
a2a0: 28 67 2c 20 7a 45 78 74 72 61 29 3b 0a 20 20 43  (g, zExtra);.  C
a2b0: 53 54 52 28 67 2c 20 7a 42 61 73 65 55 52 4c 29  STR(g, zBaseURL)
a2c0: 3b 0a 20 20 43 53 54 52 28 67 2c 20 7a 54 6f 70  ;.  CSTR(g, zTop
a2d0: 29 3b 0a 20 20 43 53 54 52 28 67 2c 20 7a 43 6f  );.  CSTR(g, zCo
a2e0: 6e 74 65 6e 74 54 79 70 65 29 3b 0a 20 20 43 53  ntentType);.  CS
a2f0: 54 52 28 67 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  TR(g, zErrMsg);.
a300: 20 20 43 53 54 52 28 67 2e 75 72 6c 2c 20 6e 61    CSTR(g.url, na
a310: 6d 65 29 3b 0a 20 20 43 53 54 52 28 67 2e 75 72  me);.  CSTR(g.ur
a320: 6c 2c 20 68 6f 73 74 6e 61 6d 65 29 3b 0a 20 20  l, hostname);.  
a330: 43 53 54 52 28 67 2e 75 72 6c 2c 20 70 72 6f 74  CSTR(g.url, prot
a340: 6f 63 6f 6c 29 3b 0a 20 20 43 53 54 52 28 67 2e  ocol);.  CSTR(g.
a350: 75 72 6c 2c 20 70 61 74 68 29 3b 0a 20 20 43 53  url, path);.  CS
a360: 54 52 28 67 2e 75 72 6c 2c 20 75 73 65 72 29 3b  TR(g.url, user);
a370: 0a 20 20 43 53 54 52 28 67 2e 75 72 6c 2c 20 70  .  CSTR(g.url, p
a380: 61 73 73 77 64 29 3b 0a 20 20 43 53 54 52 28 67  asswd);.  CSTR(g
a390: 2e 75 72 6c 2c 20 63 61 6e 6f 6e 69 63 61 6c 29  .url, canonical)
a3a0: 3b 0a 20 20 43 53 54 52 28 67 2e 75 72 6c 2c 20  ;.  CSTR(g.url, 
a3b0: 70 72 6f 78 79 41 75 74 68 29 3b 0a 20 20 43 53  proxyAuth);.  CS
a3c0: 54 52 28 67 2e 75 72 6c 2c 20 66 6f 73 73 69 6c  TR(g.url, fossil
a3d0: 29 3b 0a 20 20 43 53 54 52 28 67 2c 20 7a 4c 6f  );.  CSTR(g, zLo
a3e0: 67 69 6e 29 3b 0a 20 20 43 53 54 52 28 67 2c 20  gin);.  CSTR(g, 
a3f0: 7a 53 53 4c 49 64 65 6e 74 69 74 79 29 3b 0a 20  zSSLIdentity);. 
a400: 20 43 53 54 52 28 67 2c 20 7a 49 70 41 64 64 72   CSTR(g, zIpAddr
a410: 29 3b 0a 20 20 43 53 54 52 28 67 2c 20 7a 4e 6f  );.  CSTR(g, zNo
a420: 6e 63 65 29 3b 0a 20 20 43 53 54 52 28 67 2c 20  nce);.  CSTR(g, 
a430: 7a 43 73 72 66 54 6f 6b 65 6e 29 3b 0a 0a 20 20  zCsrfToken);..  
a440: 6f 20 3d 20 63 73 6f 6e 5f 6e 65 77 5f 6f 62 6a  o = cson_new_obj
a450: 65 63 74 28 29 3b 0a 20 20 63 73 6f 6e 5f 6f 62  ect();.  cson_ob
a460: 6a 65 63 74 5f 73 65 74 28 70 61 79 2c 20 22 6a  ject_set(pay, "j
a470: 73 6f 6e 22 2c 20 63 73 6f 6e 5f 6f 62 6a 65 63  son", cson_objec
a480: 74 5f 76 61 6c 75 65 28 6f 29 20 29 3b 0a 20 20  t_value(o) );.  
a490: 49 4e 54 28 67 2e 6a 73 6f 6e 2c 20 69 73 4a 73  INT(g.json, isJs
a4a0: 6f 6e 4d 6f 64 65 29 3b 0a 20 20 49 4e 54 28 67  onMode);.  INT(g
a4b0: 2e 6a 73 6f 6e 2c 20 72 65 73 75 6c 74 43 6f 64  .json, resultCod
a4c0: 65 29 3b 0a 20 20 49 4e 54 28 67 2e 6a 73 6f 6e  e);.  INT(g.json
a4d0: 2c 20 65 72 72 6f 72 44 65 74 61 69 6c 50 61 72  , errorDetailPar
a4e0: 61 6e 6f 69 61 29 3b 0a 20 20 49 4e 54 28 67 2e  anoia);.  INT(g.
a4f0: 6a 73 6f 6e 2c 20 64 69 73 70 61 74 63 68 44 65  json, dispatchDe
a500: 70 74 68 29 3b 0a 20 20 56 41 4c 28 61 75 74 68  pth);.  VAL(auth
a510: 54 6f 6b 65 6e 2c 20 67 2e 6a 73 6f 6e 2e 61 75  Token, g.json.au
a520: 74 68 54 6f 6b 65 6e 29 3b 0a 20 20 43 53 54 52  thToken);.  CSTR
a530: 28 67 2e 6a 73 6f 6e 2c 20 6a 73 6f 6e 70 29 3b  (g.json, jsonp);
a540: 0a 20 20 56 41 4c 28 67 63 2c 20 67 2e 6a 73 6f  .  VAL(gc, g.jso
a550: 6e 2e 67 63 2e 76 29 3b 0a 20 20 56 41 4c 28 63  n.gc.v);.  VAL(c
a560: 6d 64 2c 20 67 2e 6a 73 6f 6e 2e 63 6d 64 2e 76  md, g.json.cmd.v
a570: 29 3b 0a 20 20 56 41 4c 28 70 61 72 61 6d 2c 20  );.  VAL(param, 
a580: 67 2e 6a 73 6f 6e 2e 70 61 72 61 6d 2e 76 29 3b  g.json.param.v);
a590: 0a 20 20 56 41 4c 28 50 4f 53 54 2c 20 67 2e 6a  .  VAL(POST, g.j
a5a0: 73 6f 6e 2e 70 6f 73 74 2e 76 29 3b 0a 20 20 56  son.post.v);.  V
a5b0: 41 4c 28 77 61 72 6e 69 6e 67 73 2c 20 63 73 6f  AL(warnings, cso
a5c0: 6e 5f 61 72 72 61 79 5f 76 61 6c 75 65 28 67 2e  n_array_value(g.
a5d0: 6a 73 6f 6e 2e 77 61 72 6e 69 6e 67 73 29 29 3b  json.warnings));
a5e0: 0a 20 20 2f 2a 63 73 6f 6e 5f 6f 75 74 70 75 74  .  /*cson_output
a5f0: 5f 6f 70 74 20 6f 75 74 4f 70 74 3b 2a 2f 0a 0a  _opt outOpt;*/..
a600: 0a 23 75 6e 64 65 66 20 49 4e 54 0a 23 75 6e 64  .#undef INT.#und
a610: 65 66 20 43 53 54 52 0a 23 75 6e 64 65 66 20 56  ef CSTR.#undef V
a620: 41 4c 0a 20 20 72 65 74 75 72 6e 20 63 73 6f 6e  AL.  return cson
a630: 5f 6f 62 6a 65 63 74 5f 76 61 6c 75 65 28 70 61  _object_value(pa
a640: 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 72  y);.}.../*.** Cr
a650: 65 61 74 65 73 20 61 20 6e 65 77 20 46 6f 73 73  eates a new Foss
a660: 69 6c 2f 4a 53 4f 4e 20 72 65 73 70 6f 6e 73 65  il/JSON response
a670: 20 65 6e 76 65 6c 6f 70 65 20 73 6b 65 6c 65 74   envelope skelet
a680: 6f 6e 2e 20 20 49 74 20 69 73 20 6f 77 6e 65 64  on.  It is owned
a690: 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65  .** by the calle
a6a0: 72 2c 20 77 68 6f 20 6d 75 73 74 20 65 76 65 6e  r, who must even
a6b0: 74 75 61 6c 6c 79 20 66 72 65 65 20 69 74 20 75  tually free it u
a6c0: 73 69 6e 67 20 63 73 6f 6e 5f 76 61 6c 75 65 5f  sing cson_value_
a6d0: 66 72 65 65 28 29 2c 0a 2a 2a 20 6f 72 20 61 64  free(),.** or ad
a6e0: 64 20 69 74 20 74 6f 20 61 20 63 73 6f 6e 20 63  d it to a cson c
a6f0: 6f 6e 74 61 69 6e 65 72 20 74 6f 20 74 72 61 6e  ontainer to tran
a700: 73 66 65 72 20 6f 77 6e 65 72 73 68 69 70 2e 20  sfer ownership. 
a710: 52 65 74 75 72 6e 73 20 4e 55 4c 4c 0a 2a 2a 20  Returns NULL.** 
a720: 6f 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  on error..**.** 
a730: 49 66 20 70 61 79 6c 6f 61 64 20 69 73 20 6e 6f  If payload is no
a740: 74 20 4e 55 4c 4c 20 61 6e 64 20 72 65 73 75 6c  t NULL and resul
a750: 74 43 6f 64 65 20 69 73 20 30 20 74 68 65 6e 20  tCode is 0 then 
a760: 69 74 20 69 73 20 73 65 74 20 61 73 20 74 68 65  it is set as the
a770: 0a 2a 2a 20 22 70 61 79 6c 6f 61 64 22 20 70 72  .** "payload" pr
a780: 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 72 65  operty of the re
a790: 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20  turned object.  
a7a0: 49 66 20 72 65 73 75 6c 74 43 6f 64 65 20 69 73  If resultCode is
a7b0: 20 30 20 74 68 65 6e 0a 2a 2a 20 69 74 20 64 65   0 then.** it de
a7c0: 66 61 75 6c 74 73 20 74 6f 20 67 2e 6a 73 6f 6e  faults to g.json
a7d0: 2e 72 65 73 75 6c 74 43 6f 64 65 2e 20 49 66 20  .resultCode. If 
a7e0: 72 65 73 75 6c 74 43 6f 64 65 20 69 73 20 28 6f  resultCode is (o
a7f0: 72 20 64 65 66 61 75 6c 74 73 20 74 6f 29 0a 2a  r defaults to).*
a800: 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 70  * non-zero and p
a810: 61 79 6c 6f 61 64 20 69 73 20 6e 6f 74 20 4e 55  ayload is not NU
a820: 4c 4c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  LL then this fun
a830: 63 74 69 6f 6e 20 63 61 6c 6c 73 0a 2a 2a 20 63  ction calls.** c
a840: 73 6f 6e 5f 76 61 6c 75 65 5f 66 72 65 65 28 70  son_value_free(p
a850: 61 79 6c 6f 61 64 29 20 61 6e 64 20 64 6f 65 73  ayload) and does
a860: 20 6e 6f 74 20 69 6e 73 65 72 74 20 74 68 65 20   not insert the 
a870: 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65  payload into the
a880: 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 2e 20 49 6e  .** response. In
a890: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 6f 77   either case, ow
a8a0: 6e 65 72 73 68 69 70 20 6f 66 20 70 61 79 6c 6f  nership of paylo
a8b0: 61 64 20 69 73 20 74 72 61 6e 73 66 65 72 65 64  ad is transfered
a8c0: 20 74 6f 20 28 6f 72 0a 2a 2a 20 73 68 61 72 65   to (or.** share
a8d0: 64 20 77 69 74 68 2c 20 69 66 20 74 68 65 20 63  d with, if the c
a8e0: 61 6c 6c 65 72 20 68 6f 6c 64 73 20 61 20 72 65  aller holds a re
a8f0: 66 65 72 65 6e 63 65 29 20 74 68 69 73 20 66 75  ference) this fu
a900: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 70 4d  nction..**.** pM
a910: 73 67 20 69 73 20 61 6e 20 6f 70 74 69 6f 6e 61  sg is an optiona
a920: 6c 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67  l message string
a930: 20 70 72 6f 70 65 72 74 79 20 28 72 65 73 75 6c   property (resul
a940: 74 54 65 78 74 29 20 6f 66 20 74 68 65 0a 2a 2a  tText) of the.**
a950: 20 72 65 73 70 6f 6e 73 65 2e 20 49 66 20 72 65   response. If re
a960: 73 75 6c 74 43 6f 64 65 20 69 73 20 6e 6f 6e 2d  sultCode is non-
a970: 30 20 61 6e 64 20 70 4d 73 67 20 69 73 20 4e 55  0 and pMsg is NU
a980: 4c 4c 20 74 68 65 6e 0a 2a 2a 20 6a 73 6f 6e 5f  LL then.** json_
a990: 65 72 72 5f 63 73 74 72 28 29 20 69 73 20 75 73  err_cstr() is us
a9a0: 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 65 72  ed to get the er
a9b0: 72 6f 72 20 73 74 72 69 6e 67 2e 20 54 68 65 20  ror string. The 
a9c0: 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 70 72  caller may.** pr
a9d0: 6f 76 69 64 65 20 68 69 73 20 6f 77 6e 20 6f 72  ovide his own or
a9e0: 20 6d 61 79 20 75 73 65 20 61 6e 20 65 6d 70 74   may use an empt
a9f0: 79 20 73 74 72 69 6e 67 20 74 6f 20 73 75 70 70  y string to supp
aa00: 72 65 73 73 20 74 68 65 0a 2a 2a 20 72 65 73 75  ress the.** resu
aa10: 6c 74 54 65 78 74 20 70 72 6f 70 65 72 74 79 2e  ltText property.
aa20: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 63 73  .**.*/.static cs
aa30: 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f  on_value * json_
aa40: 63 72 65 61 74 65 5f 72 65 73 70 6f 6e 73 65 28  create_response(
aa50: 20 69 6e 74 20 72 65 73 75 6c 74 43 6f 64 65 2c   int resultCode,
aa60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
aa90: 63 6f 6e 73 74 20 2a 20 70 4d 73 67 2c 0a 20 20  const * pMsg,.  
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 20 20 20 20 20 20 20 20 63 73 6f 6e 5f 76 61 6c          cson_val
aad0: 75 65 20 2a 20 70 61 79 6c 6f 61 64 29 7b 0a 20  ue * payload){. 
aae0: 20 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 76 20   cson_value * v 
aaf0: 3d 20 4e 55 4c 4c 3b 0a 20 20 63 73 6f 6e 5f 76  = NULL;.  cson_v
ab00: 61 6c 75 65 20 2a 20 74 6d 70 20 3d 20 4e 55 4c  alue * tmp = NUL
ab10: 4c 3b 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74  L;.  cson_object
ab20: 20 2a 20 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69   * o = NULL;.  i
ab30: 6e 74 20 72 63 3b 0a 20 20 72 65 73 75 6c 74 43  nt rc;.  resultC
ab40: 6f 64 65 20 3d 20 6a 73 6f 6e 5f 64 75 6d 62 64  ode = json_dumbd
ab50: 6f 77 6e 5f 72 63 28 72 65 73 75 6c 74 43 6f 64  own_rc(resultCod
ab60: 65 20 3f 20 72 65 73 75 6c 74 43 6f 64 65 20 3a  e ? resultCode :
ab70: 20 67 2e 6a 73 6f 6e 2e 72 65 73 75 6c 74 43 6f   g.json.resultCo
ab80: 64 65 29 3b 0a 20 20 6f 20 3d 20 63 73 6f 6e 5f  de);.  o = cson_
ab90: 6e 65 77 5f 6f 62 6a 65 63 74 28 29 3b 0a 20 20  new_object();.  
aba0: 76 20 3d 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f  v = cson_object_
abb0: 76 61 6c 75 65 28 6f 29 3b 0a 20 20 69 66 28 20  value(o);.  if( 
abc0: 21 20 6f 20 29 20 72 65 74 75 72 6e 20 4e 55 4c  ! o ) return NUL
abd0: 4c 3b 0a 23 64 65 66 69 6e 65 20 53 45 54 28 4b  L;.#define SET(K
abe0: 29 20 69 66 28 21 74 6d 70 29 20 67 6f 74 6f 20  ) if(!tmp) goto 
abf0: 63 6c 65 61 6e 75 70 3b 20 5c 0a 20 20 72 63 20  cleanup; \.  rc 
ac00: 3d 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65  = cson_object_se
ac10: 74 28 20 6f 2c 20 4b 2c 20 74 6d 70 20 29 3b 20  t( o, K, tmp ); 
ac20: 5c 0a 20 20 69 66 28 72 63 29 20 64 6f 7b 5c 0a  \.  if(rc) do{\.
ac30: 20 20 20 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 66      cson_value_f
ac40: 72 65 65 28 74 6d 70 29 3b 20 5c 0a 20 20 20 20  ree(tmp); \.    
ac50: 74 6d 70 20 3d 20 4e 55 4c 4c 3b 20 5c 0a 20 20  tmp = NULL; \.  
ac60: 20 20 67 6f 74 6f 20 63 6c 65 61 6e 75 70 3b 20    goto cleanup; 
ac70: 5c 0a 20 20 7d 77 68 69 6c 65 28 30 29 0a 0a 0a  \.  }while(0)...
ac80: 20 20 74 6d 70 20 3d 20 6a 73 6f 6e 5f 6e 65 77    tmp = json_new
ac90: 5f 73 74 72 69 6e 67 28 4d 41 4e 49 46 45 53 54  _string(MANIFEST
aca0: 5f 55 55 49 44 29 3b 0a 20 20 53 45 54 28 22 66  _UUID);.  SET("f
acb0: 6f 73 73 69 6c 22 29 3b 0a 0a 20 20 74 6d 70 20  ossil");..  tmp 
acc0: 3d 20 6a 73 6f 6e 5f 6e 65 77 5f 74 69 6d 65 73  = json_new_times
acd0: 74 61 6d 70 28 2d 31 29 3b 0a 20 20 53 45 54 28  tamp(-1);.  SET(
ace0: 46 6f 73 73 69 6c 4a 73 6f 6e 4b 65 79 73 2e 74  FossilJsonKeys.t
acf0: 69 6d 65 73 74 61 6d 70 29 3b 0a 0a 20 20 69 66  imestamp);..  if
ad00: 28 20 30 20 21 3d 20 72 65 73 75 6c 74 43 6f 64  ( 0 != resultCod
ad10: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21 20 70  e ){.    if( ! p
ad20: 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 70 4d 73  Msg ){.      pMs
ad30: 67 20 3d 20 67 2e 7a 45 72 72 4d 73 67 3b 0a 20  g = g.zErrMsg;. 
ad40: 20 20 20 20 20 69 66 28 21 70 4d 73 67 29 7b 0a       if(!pMsg){.
ad50: 20 20 20 20 20 20 20 20 70 4d 73 67 20 3d 20 6a          pMsg = j
ad60: 73 6f 6e 5f 65 72 72 5f 63 73 74 72 28 72 65 73  son_err_cstr(res
ad70: 75 6c 74 43 6f 64 65 29 3b 0a 20 20 20 20 20 20  ultCode);.      
ad80: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 6d 70 20  }.    }.    tmp 
ad90: 3d 20 6a 73 6f 6e 5f 6e 65 77 5f 73 74 72 69 6e  = json_new_strin
ada0: 67 28 6a 73 6f 6e 5f 72 63 5f 63 73 74 72 28 72  g(json_rc_cstr(r
adb0: 65 73 75 6c 74 43 6f 64 65 29 29 3b 0a 20 20 20  esultCode));.   
adc0: 20 53 45 54 28 46 6f 73 73 69 6c 4a 73 6f 6e 4b   SET(FossilJsonK
add0: 65 79 73 2e 72 65 73 75 6c 74 43 6f 64 65 29 3b  eys.resultCode);
ade0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 73 67  .  }..  if( pMsg
adf0: 20 26 26 20 2a 70 4d 73 67 20 29 7b 0a 20 20 20   && *pMsg ){.   
ae00: 20 74 6d 70 20 3d 20 6a 73 6f 6e 5f 6e 65 77 5f   tmp = json_new_
ae10: 73 74 72 69 6e 67 28 70 4d 73 67 29 3b 0a 20 20  string(pMsg);.  
ae20: 20 20 53 45 54 28 46 6f 73 73 69 6c 4a 73 6f 6e    SET(FossilJson
ae30: 4b 65 79 73 2e 72 65 73 75 6c 74 54 65 78 74 29  Keys.resultText)
ae40: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 67 2e 6a 73  ;.  }..  if(g.js
ae50: 6f 6e 2e 63 6d 64 2e 63 6f 6d 6d 61 6e 64 53 74  on.cmd.commandSt
ae60: 72 29 7b 0a 20 20 20 20 74 6d 70 20 3d 20 6a 73  r){.    tmp = js
ae70: 6f 6e 5f 6e 65 77 5f 73 74 72 69 6e 67 28 67 2e  on_new_string(g.
ae80: 6a 73 6f 6e 2e 63 6d 64 2e 63 6f 6d 6d 61 6e 64  json.cmd.command
ae90: 53 74 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Str);.  }else{. 
aea0: 20 20 20 74 6d 70 20 3d 20 6a 73 6f 6e 5f 72 65     tmp = json_re
aeb0: 73 70 6f 6e 73 65 5f 63 6f 6d 6d 61 6e 64 5f 70  sponse_command_p
aec0: 61 74 68 28 29 3b 0a 20 20 7d 0a 20 20 53 45 54  ath();.  }.  SET
aed0: 28 22 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 20 20  ("command");..  
aee0: 74 6d 70 20 3d 20 6a 73 6f 6e 5f 67 65 74 65 6e  tmp = json_geten
aef0: 76 28 46 6f 73 73 69 6c 4a 73 6f 6e 4b 65 79 73  v(FossilJsonKeys
af00: 2e 72 65 71 75 65 73 74 49 64 29 3b 0a 20 20 69  .requestId);.  i
af10: 66 28 20 74 6d 70 20 29 20 63 73 6f 6e 5f 6f 62  f( tmp ) cson_ob
af20: 6a 65 63 74 5f 73 65 74 28 20 6f 2c 20 46 6f 73  ject_set( o, Fos
af30: 73 69 6c 4a 73 6f 6e 4b 65 79 73 2e 72 65 71 75  silJsonKeys.requ
af40: 65 73 74 49 64 2c 20 74 6d 70 20 29 3b 0a 0a 20  estId, tmp );.. 
af50: 20 69 66 28 30 29 7b 2f 2a 20 74 68 65 73 65 20   if(0){/* these 
af60: 61 72 65 20 6f 6e 6c 79 20 69 6e 74 65 6e 64 65  are only intende
af70: 64 20 66 6f 72 20 6d 79 20 6f 77 6e 20 74 65 73  d for my own tes
af80: 74 69 6e 67 2e 2e 2e 2a 2f 0a 20 20 20 20 69 66  ting...*/.    if
af90: 28 67 2e 6a 73 6f 6e 2e 63 6d 64 2e 76 29 7b 0a  (g.json.cmd.v){.
afa0: 20 20 20 20 20 20 74 6d 70 20 3d 20 67 2e 6a 73        tmp = g.js
afb0: 6f 6e 2e 63 6d 64 2e 76 3b 0a 20 20 20 20 20 20  on.cmd.v;.      
afc0: 53 45 54 28 22 24 63 6f 6d 6d 61 6e 64 50 61 74  SET("$commandPat
afd0: 68 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  h");.    }.    i
afe0: 66 28 67 2e 6a 73 6f 6e 2e 70 61 72 61 6d 2e 76  f(g.json.param.v
aff0: 29 7b 0a 20 20 20 20 20 20 74 6d 70 20 3d 20 67  ){.      tmp = g
b000: 2e 6a 73 6f 6e 2e 70 61 72 61 6d 2e 76 3b 0a 20  .json.param.v;. 
b010: 20 20 20 20 20 53 45 54 28 22 24 70 61 72 61 6d       SET("$param
b020: 73 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  s");.    }.    i
b030: 66 28 30 29 7b 2f 2a 4f 6e 6c 79 20 66 6f 72 20  f(0){/*Only for 
b040: 64 65 62 75 67 67 69 6e 67 2c 20 61 64 64 20 73  debugging, add s
b050: 6f 6d 65 20 69 6e 66 6f 20 74 6f 20 74 68 65 20  ome info to the 
b060: 72 65 73 70 6f 6e 73 65 2e 2a 2f 0a 20 20 20 20  response.*/.    
b070: 20 20 74 6d 70 20 3d 20 63 73 6f 6e 5f 76 61 6c    tmp = cson_val
b080: 75 65 5f 6e 65 77 5f 69 6e 74 65 67 65 72 28 20  ue_new_integer( 
b090: 67 2e 6a 73 6f 6e 2e 63 6d 64 2e 6f 66 66 73 65  g.json.cmd.offse
b0a0: 74 20 29 3b 0a 20 20 20 20 20 20 63 73 6f 6e 5f  t );.      cson_
b0b0: 6f 62 6a 65 63 74 5f 73 65 74 28 20 6f 2c 20 22  object_set( o, "
b0c0: 63 6d 64 2e 6f 66 66 73 65 74 22 2c 20 74 6d 70  cmd.offset", tmp
b0d0: 20 29 3b 0a 20 20 20 20 20 20 63 73 6f 6e 5f 6f   );.      cson_o
b0e0: 62 6a 65 63 74 5f 73 65 74 28 20 6f 2c 20 22 69  bject_set( o, "i
b0f0: 73 43 47 49 22 2c 20 63 73 6f 6e 5f 76 61 6c 75  sCGI", cson_valu
b100: 65 5f 6e 65 77 5f 62 6f 6f 6c 28 20 67 2e 69 73  e_new_bool( g.is
b110: 48 54 54 50 20 29 20 29 3b 0a 20 20 20 20 7d 0a  HTTP ) );.    }.
b120: 20 20 7d 0a 0a 20 20 69 66 28 66 6f 73 73 69 6c    }..  if(fossil
b130: 5f 74 69 6d 65 72 5f 69 73 5f 61 63 74 69 76 65  _timer_is_active
b140: 28 67 2e 6a 73 6f 6e 2e 74 69 6d 65 72 49 64 29  (g.json.timerId)
b150: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
b160: 73 2c 20 70 68 69 6c 6f 73 6f 70 68 69 63 61 6c  s, philosophical
b170: 6c 79 20 73 70 65 61 6b 69 6e 67 2c 20 6e 6f 74  ly speaking, not
b180: 20 71 75 69 74 65 20 74 68 65 20 72 69 67 68 74   quite the right
b190: 20 70 6c 61 63 65 0a 20 20 20 20 20 20 20 66 6f   place.       fo
b1a0: 72 20 65 6e 64 69 6e 67 20 74 68 65 20 74 69 6d  r ending the tim
b1b0: 65 72 2c 20 62 75 74 20 74 68 69 73 20 69 73 20  er, but this is 
b1c0: 74 68 65 20 6f 6e 65 20 66 75 6e 63 74 69 6f 6e  the one function
b1d0: 20 77 68 69 63 68 20 61 6c 6c 20 6f 66 0a 20 20   which all of.  
b1e0: 20 20 20 20 20 74 68 65 20 4a 53 4f 4e 20 65 78       the JSON ex
b1f0: 69 74 20 70 61 74 68 73 20 75 73 65 20 28 61 6e  it paths use (an
b200: 64 20 74 68 65 79 20 63 61 6c 6c 20 69 74 20 61  d they call it a
b210: 66 74 65 72 20 70 72 6f 63 65 73 73 69 6e 67 2c  fter processing,
b220: 0a 20 20 20 20 20 20 20 6a 75 73 74 20 62 65 66  .       just bef
b230: 6f 72 65 20 74 68 65 79 20 65 6e 64 29 2e 0a 20  ore they end).. 
b240: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
b250: 33 5f 75 69 6e 74 36 34 20 73 70 61 6e 20 3d 20  3_uint64 span = 
b260: 66 6f 73 73 69 6c 5f 74 69 6d 65 72 5f 73 74 6f  fossil_timer_sto
b270: 70 28 67 2e 6a 73 6f 6e 2e 74 69 6d 65 72 49 64  p(g.json.timerId
b280: 29 3b 0a 20 20 20 20 2f 2a 20 49 27 6d 20 61 63  );.    /* I'm ac
b290: 74 75 61 6c 6c 79 20 73 65 65 69 6e 67 20 73 75  tually seeing su
b2a0: 62 2d 75 53 65 63 20 72 75 6e 74 69 6d 65 73 20  b-uSec runtimes 
b2b0: 69 6e 20 73 6f 6d 65 20 74 65 73 74 73 2c 20 62  in some tests, b
b2c0: 75 74 20 61 20 74 69 6d 65 20 6f 66 0a 20 20 20  ut a time of.   
b2d0: 20 20 20 20 30 20 69 73 20 22 6a 75 73 74 20 6b      0 is "just k
b2e0: 69 6e 64 61 20 77 72 6f 6e 67 22 2e 0a 20 20 20  inda wrong"..   
b2f0: 20 2a 2f 0a 20 20 20 20 63 73 6f 6e 5f 6f 62 6a   */.    cson_obj
b300: 65 63 74 5f 73 65 74 28 6f 2c 22 70 72 6f 63 54  ect_set(o,"procT
b310: 69 6d 65 55 73 22 2c 20 63 73 6f 6e 5f 76 61 6c  imeUs", cson_val
b320: 75 65 5f 6e 65 77 5f 69 6e 74 65 67 65 72 28 28  ue_new_integer((
b330: 63 73 6f 6e 5f 69 6e 74 5f 74 29 73 70 61 6e 29  cson_int_t)span)
b340: 29 3b 0a 20 20 20 20 73 70 61 6e 20 2f 3d 20 31  );.    span /= 1
b350: 30 30 30 2f 2a 66 6f 72 20 6d 69 6c 6c 69 73 65  000/*for millise
b360: 63 6f 6e 64 73 20 2a 2f 3b 0a 20 20 20 20 63 73  conds */;.    cs
b370: 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 6f 2c  on_object_set(o,
b380: 22 70 72 6f 63 54 69 6d 65 4d 73 22 2c 20 63 73  "procTimeMs", cs
b390: 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 69 6e 74  on_value_new_int
b3a0: 65 67 65 72 28 28 63 73 6f 6e 5f 69 6e 74 5f 74  eger((cson_int_t
b3b0: 29 73 70 61 6e 29 29 3b 0a 20 20 20 20 61 73 73  )span));.    ass
b3c0: 65 72 74 28 21 66 6f 73 73 69 6c 5f 74 69 6d 65  ert(!fossil_time
b3d0: 72 5f 69 73 5f 61 63 74 69 76 65 28 67 2e 6a 73  r_is_active(g.js
b3e0: 6f 6e 2e 74 69 6d 65 72 49 64 29 29 3b 0a 20 20  on.timerId));.  
b3f0: 20 20 67 2e 6a 73 6f 6e 2e 74 69 6d 65 72 49 64    g.json.timerId
b400: 20 3d 20 2d 31 3b 0a 0a 20 20 7d 0a 20 20 69 66   = -1;..  }.  if
b410: 28 67 2e 6a 73 6f 6e 2e 77 61 72 6e 69 6e 67 73  (g.json.warnings
b420: 29 7b 0a 20 20 20 20 74 6d 70 20 3d 20 63 73 6f  ){.    tmp = cso
b430: 6e 5f 61 72 72 61 79 5f 76 61 6c 75 65 28 67 2e  n_array_value(g.
b440: 6a 73 6f 6e 2e 77 61 72 6e 69 6e 67 73 29 3b 0a  json.warnings);.
b450: 20 20 20 20 53 45 54 28 22 77 61 72 6e 69 6e 67      SET("warning
b460: 73 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  s");.  }..  /* O
b470: 6e 6c 79 20 61 64 64 20 74 68 65 20 70 61 79 6c  nly add the payl
b480: 6f 61 64 20 74 6f 20 53 55 43 43 45 53 53 20 72  oad to SUCCESS r
b490: 65 73 70 6f 6e 73 65 73 2e 20 45 6c 73 65 20 64  esponses. Else d
b4a0: 65 6c 65 74 65 20 69 74 2e 20 2a 2f 0a 20 20 69  elete it. */.  i
b4b0: 66 28 20 4e 55 4c 4c 20 21 3d 20 70 61 79 6c 6f  f( NULL != paylo
b4c0: 61 64 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65  ad ){.    if( re
b4d0: 73 75 6c 74 43 6f 64 65 20 29 7b 0a 20 20 20 20  sultCode ){.    
b4e0: 20 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 66 72 65    cson_value_fre
b4f0: 65 28 70 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  e(payload);.    
b500: 20 20 70 61 79 6c 6f 61 64 20 3d 20 4e 55 4c 4c    payload = NULL
b510: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b520: 20 20 20 74 6d 70 20 3d 20 70 61 79 6c 6f 61 64     tmp = payload
b530: 3b 0a 20 20 20 20 20 20 53 45 54 28 46 6f 73 73  ;.      SET(Foss
b540: 69 6c 4a 73 6f 6e 4b 65 79 73 2e 70 61 79 6c 6f  ilJsonKeys.paylo
b550: 61 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ad);.    }.  }..
b560: 20 20 69 66 28 6a 73 6f 6e 5f 66 69 6e 64 5f 6f    if(json_find_o
b570: 70 74 69 6f 6e 5f 62 6f 6f 6c 28 22 64 65 62 75  ption_bool("debu
b580: 67 46 6f 73 73 69 6c 47 22 2c 22 6a 73 6f 6e 2d  gFossilG","json-
b590: 64 65 62 75 67 2d 67 22 2c 4e 55 4c 4c 2c 30 29  debug-g",NULL,0)
b5a0: 0a 20 20 20 20 20 26 26 28 67 2e 70 65 72 6d 2e  .     &&(g.perm.
b5b0: 41 64 6d 69 6e 7c 7c 67 2e 70 65 72 6d 2e 53 65  Admin||g.perm.Se
b5c0: 74 75 70 29 29 7b 0a 20 20 20 20 74 6d 70 20 3d  tup)){.    tmp =
b5d0: 20 6a 73 6f 6e 5f 67 5f 74 6f 5f 6a 73 6f 6e 28   json_g_to_json(
b5e0: 29 3b 0a 20 20 20 20 53 45 54 28 22 67 22 29 3b  );.    SET("g");
b5f0: 0a 20 20 7d 0a 0a 23 75 6e 64 65 66 20 53 45 54  .  }..#undef SET
b600: 0a 20 20 67 6f 74 6f 20 6f 6b 3b 0a 20 20 63 6c  .  goto ok;.  cl
b610: 65 61 6e 75 70 3a 0a 20 20 63 73 6f 6e 5f 76 61  eanup:.  cson_va
b620: 6c 75 65 5f 66 72 65 65 28 76 29 3b 0a 20 20 76  lue_free(v);.  v
b630: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 6f 6b 3a 0a 20   = NULL;.  ok:. 
b640: 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a   return v;.}../*
b650: 0a 2a 2a 20 4f 75 74 70 75 74 73 20 61 20 4a 53  .** Outputs a JS
b660: 4f 4e 20 65 72 72 6f 72 20 72 65 73 70 6f 6e 73  ON error respons
b670: 65 20 74 6f 20 65 69 74 68 65 72 20 74 68 65 20  e to either the 
b680: 63 67 69 5f 78 78 78 28 29 20 66 61 6d 69 6c 79  cgi_xxx() family
b690: 20 6f 66 0a 2a 2a 20 62 75 66 66 65 72 73 20 28   of.** buffers (
b6a0: 69 6e 20 43 47 49 2f 73 65 72 76 65 72 20 6d 6f  in CGI/server mo
b6b0: 64 65 29 20 6f 72 20 73 74 64 6f 75 74 20 28 69  de) or stdout (i
b6c0: 6e 20 43 4c 49 20 6d 6f 64 65 29 2e 20 49 66 20  n CLI mode). If 
b6d0: 72 63 20 69 73 20 30 0a 2a 2a 20 74 68 65 6e 20  rc is 0.** then 
b6e0: 67 2e 6a 73 6f 6e 2e 72 65 73 75 6c 74 43 6f 64  g.json.resultCod
b6f0: 65 20 69 73 20 75 73 65 64 2e 20 49 66 20 74 68  e is used. If th
b700: 61 74 20 69 73 20 61 6c 73 6f 20 30 20 74 68 65  at is also 0 the
b710: 6e 20 74 68 65 20 22 55 6e 6b 6e 6f 77 6e 0a 2a  n the "Unknown.*
b720: 2a 20 45 72 72 6f 72 22 20 63 6f 64 65 20 69 73  * Error" code is
b730: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   used..**.** If 
b740: 67 2e 69 73 48 54 54 50 20 74 68 65 6e 20 74 68  g.isHTTP then th
b750: 65 20 67 65 6e 65 72 61 74 65 64 20 4a 53 4f 4e  e generated JSON
b760: 20 65 72 72 6f 72 20 72 65 73 70 6f 6e 73 65 20   error response 
b770: 6f 62 6a 65 63 74 20 72 65 70 6c 61 63 65 73 0a  object replaces.
b780: 2a 2a 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79  ** any currently
b790: 20 62 75 66 66 65 72 65 64 20 70 61 67 65 20 6f   buffered page o
b7a0: 75 74 70 75 74 2e 20 42 65 63 61 75 73 65 20 74  utput. Because t
b7b0: 68 65 20 6f 75 74 70 75 74 20 67 6f 65 73 20 76  he output goes v
b7c0: 69 61 0a 2a 2a 20 74 68 65 20 63 67 69 5f 78 78  ia.** the cgi_xx
b7d0: 78 28 29 20 66 61 6d 69 6c 79 20 6f 66 20 66 75  x() family of fu
b7e0: 6e 63 74 69 6f 6e 73 2c 20 74 68 69 73 20 66 75  nctions, this fu
b7f0: 6e 63 74 69 6f 6e 20 69 6e 68 65 72 69 74 73 20  nction inherits 
b800: 61 6e 79 0a 2a 2a 20 63 6f 6d 70 72 65 73 73 69  any.** compressi
b810: 6f 6e 20 77 68 69 63 68 20 66 6f 73 73 69 6c 20  on which fossil 
b820: 64 6f 65 73 20 66 6f 72 20 69 74 73 20 6f 75 74  does for its out
b830: 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  put..**.** If al
b840: 73 6f 4f 75 74 70 75 74 20 69 73 20 74 72 75 65  soOutput is true
b850: 20 41 4e 44 20 67 2e 69 73 48 54 54 50 20 74 68   AND g.isHTTP th
b860: 65 6e 20 63 67 69 5f 72 65 70 6c 79 28 29 20 69  en cgi_reply() i
b870: 73 20 63 61 6c 6c 65 64 20 74 6f 0a 2a 2a 20 66  s called to.** f
b880: 6c 75 73 68 20 74 68 65 20 6f 75 74 70 75 74 20  lush the output 
b890: 28 61 6e 64 20 68 65 61 64 65 72 73 29 2e 20 47  (and headers). G
b8a0: 65 6e 65 72 61 6c 6c 79 20 6f 6e 6c 79 20 64 6f  enerally only do
b8b0: 20 74 68 69 73 20 69 66 20 79 6f 75 20 61 72 65   this if you are
b8c0: 0a 2a 2a 20 61 62 6f 75 74 20 74 6f 20 63 61 6c  .** about to cal
b8d0: 6c 20 65 78 69 74 28 29 2e 0a 2a 2a 0a 2a 2a 20  l exit()..**.** 
b8e0: 49 66 20 21 67 2e 69 73 48 54 54 50 20 74 68 65  If !g.isHTTP the
b8f0: 6e 20 61 6c 73 6f 4f 75 74 70 75 74 20 69 73 20  n alsoOutput is 
b900: 69 67 6e 6f 72 65 64 20 61 6e 64 20 61 6c 6c 20  ignored and all 
b910: 6f 75 74 70 75 74 20 69 73 20 73 65 6e 74 20 74  output is sent t
b920: 6f 0a 2a 2a 20 73 74 64 6f 75 74 20 69 6d 6d 65  o.** stdout imme
b930: 64 69 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 46  diately..**.** F
b940: 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  or generating th
b950: 65 20 72 65 73 75 6c 74 54 65 78 74 20 70 72 6f  e resultText pro
b960: 70 65 72 74 79 3a 20 69 66 20 6d 73 67 20 69 73  perty: if msg is
b970: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69   not NULL then i
b980: 74 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73 2d  t.** is used as-
b990: 69 73 2e 20 49 66 20 69 74 20 69 73 20 4e 55 4c  is. If it is NUL
b9a0: 4c 20 74 68 65 6e 20 67 2e 7a 45 72 72 4d 73 67  L then g.zErrMsg
b9b0: 20 69 73 20 63 68 65 63 6b 65 64 2c 20 61 6e 64   is checked, and
b9c0: 20 69 66 20 74 68 61 74 0a 2a 2a 20 69 73 20 4e   if that.** is N
b9d0: 55 4c 4c 20 74 68 65 6e 20 6a 73 6f 6e 5f 65 72  ULL then json_er
b9e0: 72 5f 63 73 74 72 28 63 6f 64 65 29 20 69 73 20  r_cstr(code) is 
b9f0: 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 6a 73  used..*/.void js
ba00: 6f 6e 5f 65 72 72 28 20 69 6e 74 20 63 6f 64 65  on_err( int code
ba10: 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 6d  , char const * m
ba20: 73 67 2c 20 69 6e 74 20 61 6c 73 6f 4f 75 74 70  sg, int alsoOutp
ba30: 75 74 20 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ut ){.  int rc =
ba40: 20 63 6f 64 65 20 3f 20 63 6f 64 65 20 3a 20 28   code ? code : (
ba50: 67 2e 6a 73 6f 6e 2e 72 65 73 75 6c 74 43 6f 64  g.json.resultCod
ba60: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
ba70: 20 20 20 20 20 20 20 20 20 20 20 20 3f 20 67 2e              ? g.
ba80: 6a 73 6f 6e 2e 72 65 73 75 6c 74 43 6f 64 65 0a  json.resultCode.
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 20 20 20 20 20 20 20 20 20 3a 20 46 53 4c 5f            : FSL_
bab0: 4a 53 4f 4e 5f 45 5f 55 4e 4b 4e 4f 57 4e 29 3b  JSON_E_UNKNOWN);
bac0: 0a 20 20 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20  .  cson_value * 
bad0: 72 65 73 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 72  resp = NULL;.  r
bae0: 63 20 3d 20 6a 73 6f 6e 5f 64 75 6d 62 64 6f 77  c = json_dumbdow
baf0: 6e 5f 72 63 28 72 63 29 3b 0a 20 20 69 66 28 20  n_rc(rc);.  if( 
bb00: 72 63 20 26 26 20 21 6d 73 67 20 29 7b 0a 20 20  rc && !msg ){.  
bb10: 20 20 6d 73 67 20 3d 20 67 2e 7a 45 72 72 4d 73    msg = g.zErrMs
bb20: 67 3b 0a 20 20 20 20 69 66 28 21 6d 73 67 29 7b  g;.    if(!msg){
bb30: 0a 20 20 20 20 20 20 6d 73 67 20 3d 20 6a 73 6f  .      msg = jso
bb40: 6e 5f 65 72 72 5f 63 73 74 72 28 72 63 29 3b 0a  n_err_cstr(rc);.
bb50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 73 70      }.  }.  resp
bb60: 20 3d 20 6a 73 6f 6e 5f 63 72 65 61 74 65 5f 72   = json_create_r
bb70: 65 73 70 6f 6e 73 65 28 72 63 2c 20 6d 73 67 2c  esponse(rc, msg,
bb80: 20 4e 55 4c 4c 29 3b 0a 20 20 69 66 28 21 72 65   NULL);.  if(!re
bb90: 73 70 29 7b 0a 20 20 20 20 2f 2a 20 61 62 6f 75  sp){.    /* abou
bba0: 74 20 74 68 65 20 6f 6e 6c 79 20 65 72 72 6f 72  t the only error
bbb0: 20 63 61 73 65 20 68 65 72 65 20 69 73 20 6f 75   case here is ou
bbc0: 74 2d 6f 66 2d 6d 65 6d 6f 72 79 2e 20 44 4f 20  t-of-memory. DO 
bbd0: 4e 4f 54 0a 20 20 20 20 20 20 20 63 61 6c 6c 20  NOT.       call 
bbe0: 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 29 20 68  fossil_panic() h
bbf0: 65 72 65 20 62 65 63 61 75 73 65 20 74 68 61 74  ere because that
bc00: 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
bc10: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
bc20: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
bc30: 20 22 25 73 3a 20 46 61 74 61 6c 20 65 72 72 6f   "%s: Fatal erro
bc40: 72 3a 20 63 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c  r: could not all
bc50: 6f 63 61 74 65 20 22 0a 20 20 20 20 20 20 20 20  ocate ".        
bc60: 20 20 20 20 22 72 65 73 70 6f 6e 73 65 20 6f 62      "response ob
bc70: 6a 65 63 74 2e 5c 6e 22 2c 20 67 2e 61 72 67 76  ject.\n", g.argv
bc80: 5b 30 5d 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c  [0]);.    fossil
bc90: 5f 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20  _exit(1);.  }.  
bca0: 69 66 28 20 67 2e 69 73 48 54 54 50 20 29 7b 0a  if( g.isHTTP ){.
bcb0: 20 20 20 20 69 66 28 61 6c 73 6f 4f 75 74 70 75      if(alsoOutpu
bcc0: 74 29 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 5f 73  t){.      json_s
bcd0: 65 6e 64 5f 72 65 73 70 6f 6e 73 65 28 72 65 73  end_response(res
bce0: 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
bcf0: 20 20 20 20 20 2f 2a 20 61 6c 6d 6f 73 74 20 61       /* almost a
bd00: 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 6a 73   duplicate of js
bd10: 6f 6e 5f 73 65 6e 64 5f 72 65 73 70 6f 6e 73 65  on_send_response
bd20: 28 29 20 3a 28 20 2a 2f 0a 20 20 20 20 20 20 63  () :( */.      c
bd30: 67 69 5f 72 65 73 65 74 5f 63 6f 6e 74 65 6e 74  gi_reset_content
bd40: 28 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67 2e  ();.      if( g.
bd50: 6a 73 6f 6e 2e 6a 73 6f 6e 70 20 29 7b 0a 20 20  json.jsonp ){.  
bd60: 20 20 20 20 20 20 63 67 69 5f 70 72 69 6e 74 66        cgi_printf
bd70: 28 22 25 73 28 22 2c 67 2e 6a 73 6f 6e 2e 6a 73  ("%s(",g.json.js
bd80: 6f 6e 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  onp);.      }.  
bd90: 20 20 20 20 63 73 6f 6e 5f 6f 75 74 70 75 74 28      cson_output(
bda0: 20 72 65 73 70 2c 20 63 73 6f 6e 5f 64 61 74 61   resp, cson_data
bdb0: 5f 64 65 73 74 5f 63 67 69 2c 20 4e 55 4c 4c 2c  _dest_cgi, NULL,
bdc0: 20 26 67 2e 6a 73 6f 6e 2e 6f 75 74 4f 70 74 20   &g.json.outOpt 
bdd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67 2e 6a  );.      if( g.j
bde0: 73 6f 6e 2e 6a 73 6f 6e 70 20 29 7b 0a 20 20 20  son.jsonp ){.   
bdf0: 20 20 20 20 20 63 67 69 5f 61 70 70 65 6e 64 5f       cgi_append_
be00: 63 6f 6e 74 65 6e 74 28 22 29 22 2c 31 29 3b 0a  content(")",1);.
be10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
be20: 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 73 6f 6e 5f  }else{.    json_
be30: 73 65 6e 64 5f 72 65 73 70 6f 6e 73 65 28 72 65  send_response(re
be40: 73 70 29 3b 0a 20 20 7d 0a 20 20 63 73 6f 6e 5f  sp);.  }.  cson_
be50: 76 61 6c 75 65 5f 66 72 65 65 28 72 65 73 70 29  value_free(resp)
be60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 73 20  ;.}../*.** Sets 
be70: 67 2e 6a 73 6f 6e 2e 72 65 73 75 6c 74 43 6f 64  g.json.resultCod
be80: 65 20 61 6e 64 20 67 2e 7a 45 72 72 4d 73 67 2c  e and g.zErrMsg,
be90: 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 72 65   but does not re
bea0: 70 6f 72 74 20 74 68 65 20 65 72 72 6f 72 0a 2a  port the error.*
beb0: 2a 20 76 69 61 20 6a 73 6f 6e 5f 65 72 72 28 29  * via json_err()
bec0: 2e 20 52 65 74 75 72 6e 73 20 74 68 65 20 63 6f  . Returns the co
bed0: 64 65 20 70 61 73 73 65 64 20 74 6f 20 69 74 2e  de passed to it.
bee0: 0a 2a 2a 0a 2a 2a 20 63 6f 64 65 20 6d 75 73 74  .**.** code must
bef0: 20 62 65 20 69 6e 20 74 68 65 20 69 6e 63 6c 75   be in the inclu
bf00: 73 69 76 65 20 72 61 6e 67 65 20 31 30 30 30 2e  sive range 1000.
bf10: 2e 39 39 39 39 2e 0a 2a 2f 0a 69 6e 74 20 6a 73  .9999..*/.int js
bf20: 6f 6e 5f 73 65 74 5f 65 72 72 28 20 69 6e 74 20  on_set_err( int 
bf30: 63 6f 64 65 2c 20 63 68 61 72 20 63 6f 6e 73 74  code, char const
bf40: 20 2a 20 66 6d 74 2c 20 2e 2e 2e 20 29 7b 0a 20   * fmt, ... ){. 
bf50: 20 61 73 73 65 72 74 28 20 28 63 6f 64 65 3e 3d   assert( (code>=
bf60: 31 30 30 30 29 20 26 26 20 28 63 6f 64 65 3c 3d  1000) && (code<=
bf70: 39 39 39 39 29 20 29 3b 0a 20 20 66 72 65 65 28  9999) );.  free(
bf80: 67 2e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 67 2e  g.zErrMsg);.  g.
bf90: 6a 73 6f 6e 2e 72 65 73 75 6c 74 43 6f 64 65 20  json.resultCode 
bfa0: 3d 20 63 6f 64 65 3b 0a 20 20 69 66 28 21 66 6d  = code;.  if(!fm
bfb0: 74 20 7c 7c 20 21 2a 66 6d 74 29 7b 0a 20 20 20  t || !*fmt){.   
bfc0: 20 67 2e 7a 45 72 72 4d 73 67 20 3d 20 6d 70 72   g.zErrMsg = mpr
bfd0: 69 6e 74 66 28 22 25 73 22 2c 20 6a 73 6f 6e 5f  intf("%s", json_
bfe0: 65 72 72 5f 63 73 74 72 28 63 6f 64 65 29 29 3b  err_cstr(code));
bff0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 61  .  }else{.    va
c000: 5f 6c 69 73 74 20 76 61 72 67 73 3b 0a 20 20 20  _list vargs;.   
c010: 20 63 68 61 72 20 2a 20 6d 73 67 3b 0a 20 20 20   char * msg;.   
c020: 20 76 61 5f 73 74 61 72 74 28 76 61 72 67 73 2c   va_start(vargs,
c030: 66 6d 74 29 3b 0a 20 20 20 20 6d 73 67 20 3d 20  fmt);.    msg = 
c040: 76 6d 70 72 69 6e 74 66 28 66 6d 74 2c 20 76 61  vmprintf(fmt, va
c050: 72 67 73 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64  rgs);.    va_end
c060: 28 76 61 72 67 73 29 3b 0a 20 20 20 20 67 2e 7a  (vargs);.    g.z
c070: 45 72 72 4d 73 67 20 3d 20 6d 73 67 3b 0a 20 20  ErrMsg = msg;.  
c080: 7d 0a 20 20 72 65 74 75 72 6e 20 63 6f 64 65 3b  }.  return code;
c090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74  .}../*.** Iterat
c0a0: 65 73 20 74 68 72 6f 75 67 68 20 61 20 70 72 65  es through a pre
c0b0: 70 61 72 65 64 20 53 45 4c 45 43 54 20 73 74 61  pared SELECT sta
c0c0: 74 65 6d 65 6e 74 20 61 6e 64 20 63 6f 6e 76 65  tement and conve
c0d0: 72 74 73 20 65 61 63 68 20 72 6f 77 0a 2a 2a 20  rts each row.** 
c0e0: 74 6f 20 61 20 4a 53 4f 4e 20 6f 62 6a 65 63 74  to a JSON object
c0f0: 2e 20 49 66 20 70 54 67 74 20 69 73 20 6e 6f 74  . If pTgt is not
c100: 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 69 73 20   NULL then this 
c110: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a 2a 2a  function will.**
c120: 20 61 70 70 65 6e 64 20 74 68 65 20 72 65 73 75   append the resu
c130: 6c 74 73 20 74 6f 20 70 54 67 74 20 61 6e 64 20  lts to pTgt and 
c140: 72 65 74 75 72 6e 20 63 73 6f 6e 5f 61 72 72 61  return cson_arra
c150: 79 5f 76 61 6c 75 65 28 70 54 67 74 29 2e 20 49  y_value(pTgt). I
c160: 66 0a 2a 2a 20 70 54 67 74 20 69 73 20 4e 55 4c  f.** pTgt is NUL
c170: 4c 20 74 68 65 6e 20 61 20 6e 65 77 20 41 72 72  L then a new Arr
c180: 61 79 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  ay object is cre
c190: 61 74 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65  ated and returne
c1a0: 64 20 28 6f 77 6e 65 64 0a 2a 2a 20 62 79 20 74  d (owned.** by t
c1b0: 68 65 20 63 61 6c 6c 65 72 29 2e 20 45 61 63 68  he caller). Each
c1c0: 20 72 6f 77 20 6f 66 20 70 53 74 6d 74 20 69 73   row of pStmt is
c1d0: 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 6e   converted to an
c1e0: 20 4f 62 6a 65 63 74 20 61 6e 64 0a 2a 2a 20 61   Object and.** a
c1f0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 61  ppended to the a
c200: 72 72 61 79 2e 20 49 66 20 74 68 65 20 72 65 73  rray. If the res
c210: 75 6c 74 20 73 65 74 20 68 61 73 20 6e 6f 20 72  ult set has no r
c220: 6f 77 73 20 41 4e 44 20 70 54 67 74 20 69 73 0a  ows AND pTgt is.
c230: 2a 2a 20 4e 55 4c 4c 20 74 68 65 6e 20 4e 55 4c  ** NULL then NUL
c240: 4c 20 28 6e 6f 74 20 61 6e 20 65 6d 70 74 79 20  L (not an empty 
c250: 61 72 72 61 79 29 20 69 73 20 72 65 74 75 72 6e  array) is return
c260: 65 64 2e 0a 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75  ed..*/.cson_valu
c270: 65 20 2a 20 6a 73 6f 6e 5f 73 74 6d 74 5f 74 6f  e * json_stmt_to
c280: 5f 61 72 72 61 79 5f 6f 66 5f 6f 62 6a 28 53 74  _array_of_obj(St
c290: 6d 74 20 2a 70 53 74 6d 74 2c 0a 20 20 20 20 20  mt *pStmt,.     
c2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2c0: 20 20 63 73 6f 6e 5f 61 72 72 61 79 20 2a 20 70    cson_array * p
c2d0: 54 67 74 29 7b 0a 20 20 63 73 6f 6e 5f 61 72 72  Tgt){.  cson_arr
c2e0: 61 79 20 2a 20 61 20 3d 20 70 54 67 74 3b 0a 20  ay * a = pTgt;. 
c2f0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 77 61   char const * wa
c300: 72 6e 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20  rnMsg = NULL;.  
c310: 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 63 6f 6c  cson_value * col
c320: 4e 61 6d 65 73 56 20 3d 20 4e 55 4c 4c 3b 0a 20  NamesV = NULL;. 
c330: 20 63 73 6f 6e 5f 61 72 72 61 79 20 2a 20 63 6f   cson_array * co
c340: 6c 4e 61 6d 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20  lNames = NULL;. 
c350: 20 77 68 69 6c 65 28 20 28 53 51 4c 49 54 45 5f   while( (SQLITE_
c360: 52 4f 57 3d 3d 64 62 5f 73 74 65 70 28 70 53 74  ROW==db_step(pSt
c370: 6d 74 29 29 20 29 7b 0a 20 20 20 20 63 73 6f 6e  mt)) ){.    cson
c380: 5f 76 61 6c 75 65 20 2a 20 72 6f 77 20 3d 20 4e  _value * row = N
c390: 55 4c 4c 3b 0a 20 20 20 20 69 66 28 21 61 29 7b  ULL;.    if(!a){
c3a0: 0a 20 20 20 20 20 20 61 20 3d 20 63 73 6f 6e 5f  .      a = cson_
c3b0: 6e 65 77 5f 61 72 72 61 79 28 29 3b 0a 20 20 20  new_array();.   
c3c0: 20 20 20 61 73 73 65 72 74 28 4e 55 4c 4c 21 3d     assert(NULL!=
c3d0: 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  a);.    }.    if
c3e0: 28 21 63 6f 6c 4e 61 6d 65 73 29 7b 0a 20 20 20  (!colNames){.   
c3f0: 20 20 20 63 6f 6c 4e 61 6d 65 73 56 20 3d 20 63     colNamesV = c
c400: 73 6f 6e 5f 73 71 6c 69 74 65 33 5f 63 6f 6c 75  son_sqlite3_colu
c410: 6d 6e 5f 6e 61 6d 65 73 28 70 53 74 6d 74 2d 3e  mn_names(pStmt->
c420: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 61 73  pStmt);.      as
c430: 73 65 72 74 28 4e 55 4c 4c 20 21 3d 20 63 6f 6c  sert(NULL != col
c440: 4e 61 6d 65 73 56 29 3b 0a 20 20 20 20 20 20 2f  NamesV);.      /
c450: 2a 57 68 79 3f 20 63 73 6f 6e 5f 76 61 6c 75 65  *Why? cson_value
c460: 5f 61 64 64 5f 72 65 66 65 72 65 6e 63 65 28 63  _add_reference(c
c470: 6f 6c 4e 61 6d 65 73 56 29 20 61 76 6f 69 64 73  olNamesV) avoids
c480: 20 61 6e 20 6f 77 6e 65 72 73 68 69 70 20 70 72   an ownership pr
c490: 6f 62 6c 65 6d 2a 2f 3b 0a 20 20 20 20 20 20 63  oblem*/;.      c
c4a0: 6f 6c 4e 61 6d 65 73 20 3d 20 63 73 6f 6e 5f 76  olNames = cson_v
c4b0: 61 6c 75 65 5f 67 65 74 5f 61 72 72 61 79 28 63  alue_get_array(c
c4c0: 6f 6c 4e 61 6d 65 73 56 29 3b 0a 20 20 20 20 20  olNamesV);.     
c4d0: 20 61 73 73 65 72 74 28 4e 55 4c 4c 20 21 3d 20   assert(NULL != 
c4e0: 63 6f 6c 4e 61 6d 65 73 29 3b 0a 20 20 20 20 7d  colNames);.    }
c4f0: 0a 20 20 20 20 72 6f 77 20 3d 20 63 73 6f 6e 5f  .    row = cson_
c500: 73 71 6c 69 74 65 33 5f 72 6f 77 5f 74 6f 5f 6f  sqlite3_row_to_o
c510: 62 6a 65 63 74 32 28 70 53 74 6d 74 2d 3e 70 53  bject2(pStmt->pS
c520: 74 6d 74 2c 20 63 6f 6c 4e 61 6d 65 73 29 3b 0a  tmt, colNames);.
c530: 20 20 20 20 69 66 28 21 72 6f 77 20 26 26 20 21      if(!row && !
c540: 77 61 72 6e 4d 73 67 29 7b 0a 20 20 20 20 20 20  warnMsg){.      
c550: 77 61 72 6e 4d 73 67 20 3d 20 22 43 6f 75 6c 64  warnMsg = "Could
c560: 20 6e 6f 74 20 63 6f 6e 76 65 72 74 20 61 74 20   not convert at 
c570: 6c 65 61 73 74 20 6f 6e 65 20 72 65 73 75 6c 74  least one result
c580: 20 72 6f 77 20 74 6f 20 4a 53 4f 4e 2e 22 3b 0a   row to JSON.";.
c590: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
c5a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 30 20      }.    if( 0 
c5b0: 21 3d 20 63 73 6f 6e 5f 61 72 72 61 79 5f 61 70  != cson_array_ap
c5c0: 70 65 6e 64 28 61 2c 20 72 6f 77 29 20 29 7b 0a  pend(a, row) ){.
c5d0: 20 20 20 20 20 20 63 73 6f 6e 5f 76 61 6c 75 65        cson_value
c5e0: 5f 66 72 65 65 28 72 6f 77 29 3b 0a 20 20 20 20  _free(row);.    
c5f0: 20 20 69 66 28 70 54 67 74 20 21 3d 20 61 29 20    if(pTgt != a) 
c600: 7b 0a 20 20 20 20 20 20 20 20 63 73 6f 6e 5f 66  {.        cson_f
c610: 72 65 65 5f 61 72 72 61 79 28 61 29 3b 0a 20 20  ree_array(a);.  
c620: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
c630: 72 74 28 20 30 20 26 26 20 22 41 6c 6c 6f 63 20  rt( 0 && "Alloc 
c640: 65 72 72 6f 72 2e 22 29 3b 0a 20 20 20 20 20 20  error.");.      
c650: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
c660: 20 7d 0a 20 20 7d 0a 20 20 63 73 6f 6e 5f 76 61   }.  }.  cson_va
c670: 6c 75 65 5f 66 72 65 65 28 63 6f 6c 4e 61 6d 65  lue_free(colName
c680: 73 56 29 3b 0a 20 20 69 66 28 77 61 72 6e 4d 73  sV);.  if(warnMs
c690: 67 29 7b 0a 20 20 20 20 6a 73 6f 6e 5f 77 61 72  g){.    json_war
c6a0: 6e 28 20 46 53 4c 5f 4a 53 4f 4e 5f 57 5f 52 4f  n( FSL_JSON_W_RO
c6b0: 57 5f 54 4f 5f 4a 53 4f 4e 5f 46 41 49 4c 45 44  W_TO_JSON_FAILED
c6c0: 2c 20 77 61 72 6e 4d 73 67 20 29 3b 0a 20 20 7d  , warnMsg );.  }
c6d0: 0a 20 20 72 65 74 75 72 6e 20 63 73 6f 6e 5f 61  .  return cson_a
c6e0: 72 72 61 79 5f 76 61 6c 75 65 28 61 29 3b 0a 7d  rray_value(a);.}
c6f0: 0a 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b 73 20 6a 75  ../*.** Works ju
c700: 73 74 20 6c 69 6b 65 20 6a 73 6f 6e 5f 73 74 6d  st like json_stm
c710: 74 5f 74 6f 5f 61 72 72 61 79 5f 6f 66 5f 6f 62  t_to_array_of_ob
c720: 6a 28 29 2c 20 62 75 74 20 65 61 63 68 20 72 6f  j(), but each ro
c730: 77 20 69 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75  w in the.** resu
c740: 6c 74 20 73 65 74 20 69 73 20 72 65 70 72 65 73  lt set is repres
c750: 65 6e 74 65 64 20 61 73 20 61 6e 20 41 72 72 61  ented as an Arra
c760: 79 20 6f 66 20 76 61 6c 75 65 73 20 69 6e 73 74  y of values inst
c770: 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 4f 62 6a  ead of an.** Obj
c780: 65 63 74 20 28 6b 65 79 2f 76 61 6c 75 65 20 70  ect (key/value p
c790: 61 69 72 73 29 2e 20 49 66 20 70 54 67 74 20 69  airs). If pTgt i
c7a0: 73 20 4e 55 4c 4c 20 61 6e 64 20 74 68 65 20 73  s NULL and the s
c7b0: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 68 61 73 20  tatement.** has 
c7c0: 6e 6f 20 72 65 73 75 6c 74 73 20 74 68 65 6e 20  no results then 
c7d0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
c7e0: 2c 20 6e 6f 74 20 61 6e 20 65 6d 70 74 79 20 61  , not an empty a
c7f0: 72 72 61 79 2e 0a 2a 2f 0a 63 73 6f 6e 5f 76 61  rray..*/.cson_va
c800: 6c 75 65 20 2a 20 6a 73 6f 6e 5f 73 74 6d 74 5f  lue * json_stmt_
c810: 74 6f 5f 61 72 72 61 79 5f 6f 66 5f 61 72 72 61  to_array_of_arra
c820: 79 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 0a 20  y(Stmt *pStmt,. 
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c850: 20 20 20 20 20 20 20 20 63 73 6f 6e 5f 61 72 72          cson_arr
c860: 61 79 20 2a 20 70 54 67 74 29 7b 0a 20 20 63 73  ay * pTgt){.  cs
c870: 6f 6e 5f 61 72 72 61 79 20 2a 20 61 20 3d 20 70  on_array * a = p
c880: 54 67 74 3b 0a 20 20 77 68 69 6c 65 28 20 28 53  Tgt;.  while( (S
c890: 51 4c 49 54 45 5f 52 4f 57 3d 3d 64 62 5f 73 74  QLITE_ROW==db_st
c8a0: 65 70 28 70 53 74 6d 74 29 29 20 29 7b 0a 20 20  ep(pStmt)) ){.  
c8b0: 20 20 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 72    cson_value * r
c8c0: 6f 77 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  ow = NULL;.    i
c8d0: 66 28 21 61 29 7b 0a 20 20 20 20 20 20 61 20 3d  f(!a){.      a =
c8e0: 20 63 73 6f 6e 5f 6e 65 77 5f 61 72 72 61 79 28   cson_new_array(
c8f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
c900: 4e 55 4c 4c 21 3d 61 29 3b 0a 20 20 20 20 7d 0a  NULL!=a);.    }.
c910: 20 20 20 20 72 6f 77 20 3d 20 63 73 6f 6e 5f 73      row = cson_s
c920: 71 6c 69 74 65 33 5f 72 6f 77 5f 74 6f 5f 61 72  qlite3_row_to_ar
c930: 72 61 79 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74  ray(pStmt->pStmt
c940: 29 3b 0a 20 20 20 20 63 73 6f 6e 5f 61 72 72 61  );.    cson_arra
c950: 79 5f 61 70 70 65 6e 64 28 61 2c 20 72 6f 77 29  y_append(a, row)
c960: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
c970: 73 6f 6e 5f 61 72 72 61 79 5f 76 61 6c 75 65 28  son_array_value(
c980: 61 29 3b 0a 7d 0a 0a 63 73 6f 6e 5f 76 61 6c 75  a);.}..cson_valu
c990: 65 20 2a 20 6a 73 6f 6e 5f 73 74 6d 74 5f 74 6f  e * json_stmt_to
c9a0: 5f 61 72 72 61 79 5f 6f 66 5f 76 61 6c 75 65 73  _array_of_values
c9b0: 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 0a 20 20  (Stmt *pStmt,.  
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9e0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 75          int resu
c9f0: 6c 74 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  ltColumn,.      
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca20: 20 20 20 20 63 73 6f 6e 5f 61 72 72 61 79 20 2a      cson_array *
ca30: 20 70 54 67 74 29 7b 0a 20 20 63 73 6f 6e 5f 61   pTgt){.  cson_a
ca40: 72 72 61 79 20 2a 20 61 20 3d 20 70 54 67 74 3b  rray * a = pTgt;
ca50: 0a 20 20 77 68 69 6c 65 28 20 28 53 51 4c 49 54  .  while( (SQLIT
ca60: 45 5f 52 4f 57 3d 3d 64 62 5f 73 74 65 70 28 70  E_ROW==db_step(p
ca70: 53 74 6d 74 29 29 20 29 7b 0a 20 20 20 20 63 73  Stmt)) ){.    cs
ca80: 6f 6e 5f 76 61 6c 75 65 20 2a 20 72 6f 77 20 3d  on_value * row =
ca90: 20 63 73 6f 6e 5f 73 71 6c 69 74 65 33 5f 63 6f   cson_sqlite3_co
caa0: 6c 75 6d 6e 5f 74 6f 5f 76 61 6c 75 65 28 70 53  lumn_to_value(pS
cab0: 74 6d 74 2d 3e 70 53 74 6d 74 2c 0a 20 20 20 20  tmt->pStmt,.    
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caf0: 72 65 73 75 6c 74 43 6f 6c 75 6d 6e 29 3b 0a 20  resultColumn);. 
cb00: 20 20 20 69 66 28 72 6f 77 29 7b 0a 20 20 20 20     if(row){.    
cb10: 20 20 69 66 28 21 61 29 7b 0a 20 20 20 20 20 20    if(!a){.      
cb20: 20 20 61 20 3d 20 63 73 6f 6e 5f 6e 65 77 5f 61    a = cson_new_a
cb30: 72 72 61 79 28 29 3b 0a 20 20 20 20 20 20 20 20  rray();.        
cb40: 61 73 73 65 72 74 28 4e 55 4c 4c 21 3d 61 29 3b  assert(NULL!=a);
cb50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
cb60: 73 6f 6e 5f 61 72 72 61 79 5f 61 70 70 65 6e 64  son_array_append
cb70: 28 61 2c 20 72 6f 77 29 3b 0a 20 20 20 20 7d 0a  (a, row);.    }.
cb80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 73 6f    }.  return cso
cb90: 6e 5f 61 72 72 61 79 5f 76 61 6c 75 65 28 61 29  n_array_value(a)
cba0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  ;.}../*.** Execu
cbb0: 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 53 51  tes the given SQ
cbc0: 4c 20 61 6e 64 20 72 75 6e 73 20 69 74 20 74 68  L and runs it th
cbd0: 72 6f 75 67 68 0a 2a 2a 20 6a 73 6f 6e 5f 73 74  rough.** json_st
cbe0: 6d 74 5f 74 6f 5f 61 72 72 61 79 5f 6f 66 5f 6f  mt_to_array_of_o
cbf0: 62 6a 28 29 2c 20 72 65 74 75 72 6e 69 6e 67 20  bj(), returning 
cc00: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
cc10: 61 74 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  at.** function. 
cc20: 49 66 20 72 65 73 65 74 42 6c 6f 62 20 69 73 20  If resetBlob is 
cc30: 74 72 75 65 20 74 68 65 6e 20 62 6c 6f 62 5f 72  true then blob_r
cc40: 65 73 65 74 28 70 53 71 6c 29 20 69 73 20 63 61  eset(pSql) is ca
cc50: 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 70 72  lled.** after pr
cc60: 65 70 61 72 69 6e 67 20 74 68 65 20 71 75 65 72  eparing the quer
cc70: 79 2e 0a 2a 2a 0a 2a 2a 20 70 54 67 74 20 68 61  y..**.** pTgt ha
cc80: 73 20 74 68 65 20 73 61 6d 65 20 73 65 6d 61 6e  s the same seman
cc90: 74 69 63 73 20 61 73 20 64 65 73 63 72 69 62 65  tics as describe
cca0: 64 20 66 6f 72 0a 2a 2a 20 6a 73 6f 6e 5f 73 74  d for.** json_st
ccb0: 6d 74 5f 74 6f 5f 61 72 72 61 79 5f 6f 66 5f 6f  mt_to_array_of_o
ccc0: 62 6a 28 29 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 4d  bj()..**.** FIXM
ccd0: 45 3a 20 63 68 61 6e 67 65 20 74 68 69 73 20 74  E: change this t
cce0: 6f 20 74 61 6b 65 20 61 20 28 63 68 61 72 20 63  o take a (char c
ccf0: 6f 6e 73 74 20 2a 29 20 69 6e 73 74 65 61 64 20  onst *) instead 
cd00: 6f 66 20 61 20 62 6c 6f 62 2c 0a 2a 2a 20 74 6f  of a blob,.** to
cd10: 20 73 69 6d 70 6c 69 66 79 20 74 68 65 20 74 72   simplify the tr
cd20: 69 76 69 61 6c 20 75 73 65 2d 63 61 73 65 73 20  ivial use-cases 
cd30: 28 77 68 69 63 68 20 64 6f 6e 27 74 20 6e 65 65  (which don't nee
cd40: 64 20 61 20 42 6c 6f 62 29 2e 0a 2a 2f 0a 63 73  d a Blob)..*/.cs
cd50: 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f  on_value * json_
cd60: 73 71 6c 5f 74 6f 5f 61 72 72 61 79 5f 6f 66 5f  sql_to_array_of_
cd70: 6f 62 6a 28 42 6c 6f 62 20 2a 20 70 53 71 6c 2c  obj(Blob * pSql,
cd80: 20 63 73 6f 6e 5f 61 72 72 61 79 20 2a 20 70 54   cson_array * pT
cd90: 67 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gt,.            
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdb0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 65            int re
cdc0: 73 65 74 42 6c 6f 62 29 7b 0a 20 20 53 74 6d 74  setBlob){.  Stmt
cdd0: 20 71 20 3d 20 65 6d 70 74 79 5f 53 74 6d 74 3b   q = empty_Stmt;
cde0: 0a 20 20 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20  .  cson_value * 
cdf0: 70 61 79 20 3d 20 4e 55 4c 4c 3b 0a 20 20 61 73  pay = NULL;.  as
ce00: 73 65 72 74 28 20 62 6c 6f 62 5f 73 69 7a 65 28  sert( blob_size(
ce10: 70 53 71 6c 29 20 3e 20 30 20 29 3b 0a 20 20 64  pSql) > 0 );.  d
ce20: 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 22 25  b_prepare(&q, "%
ce30: 73 22 2c 20 62 6c 6f 62 5f 73 74 72 28 70 53 71  s", blob_str(pSq
ce40: 6c 29 20 2f 2a 73 61 66 65 2d 66 6f 72 2d 25 73  l) /*safe-for-%s
ce50: 2a 2f 29 3b 0a 20 20 69 66 28 72 65 73 65 74 42  */);.  if(resetB
ce60: 6c 6f 62 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 72  lob){.    blob_r
ce70: 65 73 65 74 28 70 53 71 6c 29 3b 0a 20 20 7d 0a  eset(pSql);.  }.
ce80: 20 20 70 61 79 20 3d 20 6a 73 6f 6e 5f 73 74 6d    pay = json_stm
ce90: 74 5f 74 6f 5f 61 72 72 61 79 5f 6f 66 5f 6f 62  t_to_array_of_ob
cea0: 6a 28 26 71 2c 20 70 54 67 74 29 3b 0a 20 20 64  j(&q, pTgt);.  d
ceb0: 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a  b_finalize(&q);.
cec0: 20 20 72 65 74 75 72 6e 20 70 61 79 3b 0a 0a 7d    return pay;..}
ced0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 67  ../*.** If the g
cee0: 69 76 65 6e 20 43 4f 4d 4d 49 54 20 72 69 64 20  iven COMMIT rid 
cef0: 68 61 73 20 61 6e 79 20 74 61 67 73 20 61 73 73  has any tags ass
cf00: 6f 63 69 61 74 65 64 20 77 69 74 68 20 69 74 2c  ociated with it,
cf10: 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
cf20: 6e 20 72 65 74 75 72 6e 73 20 61 20 4a 53 4f 4e  n returns a JSON
cf30: 20 41 72 72 61 79 20 63 6f 6e 74 61 69 6e 69 6e   Array containin
cf40: 67 20 74 68 65 20 74 61 67 20 6e 61 6d 65 73 20  g the tag names 
cf50: 28 6f 77 6e 65 64 20 62 79 0a 2a 2a 20 74 68 65  (owned by.** the
cf60: 20 63 61 6c 6c 65 72 29 2c 20 65 6c 73 65 20 69   caller), else i
cf70: 74 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a  t returns NULL..
cf80: 2a 2a 0a 2a 2a 20 53 65 65 20 69 6e 66 6f 5f 74  **.** See info_t
cf90: 61 67 73 5f 6f 66 5f 63 68 65 63 6b 69 6e 28 29  ags_of_checkin()
cfa0: 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c   for more detail
cfb0: 73 20 28 74 68 69 73 20 69 73 20 73 69 6d 70 6c  s (this is simpl
cfc0: 79 20 61 20 4a 53 4f 4e 0a 2a 2a 20 77 72 61 70  y a JSON.** wrap
cfd0: 70 65 72 20 66 6f 72 20 74 68 61 74 20 66 75 6e  per for that fun
cfe0: 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ction)..**.** If
cff0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 61   there are no ta
d000: 67 73 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  gs then this fun
d010: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 4e 55  ction returns NU
d020: 4c 4c 2c 20 6e 6f 74 20 61 6e 20 65 6d 70 74 79  LL, not an empty
d030: 0a 2a 2a 20 41 72 72 61 79 2e 0a 2a 2f 0a 63 73  .** Array..*/.cs
d040: 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f  on_value * json_
d050: 74 61 67 73 5f 66 6f 72 5f 63 68 65 63 6b 69 6e  tags_for_checkin
d060: 5f 72 69 64 28 69 6e 74 20 72 69 64 2c 20 69 6e  _rid(int rid, in
d070: 74 20 70 72 6f 70 61 67 61 74 69 6e 67 4f 6e 6c  t propagatingOnl
d080: 79 29 7b 0a 20 20 63 73 6f 6e 5f 76 61 6c 75 65  y){.  cson_value
d090: 20 2a 20 76 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63   * v = NULL;.  c
d0a0: 68 61 72 20 2a 20 74 61 67 73 20 3d 20 69 6e 66  har * tags = inf
d0b0: 6f 5f 74 61 67 73 5f 6f 66 5f 63 68 65 63 6b 69  o_tags_of_checki
d0c0: 6e 28 72 69 64 2c 20 70 72 6f 70 61 67 61 74 69  n(rid, propagati
d0d0: 6e 67 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 74 61  ngOnly);.  if(ta
d0e0: 67 73 29 7b 0a 20 20 20 20 69 66 28 2a 74 61 67  gs){.    if(*tag
d0f0: 73 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 6a 73  s){.      v = js
d100: 6f 6e 5f 73 74 72 69 6e 67 5f 73 70 6c 69 74 32  on_string_split2
d110: 28 74 61 67 73 2c 27 2c 27 2c 30 29 3b 0a 20 20  (tags,',',0);.  
d120: 20 20 7d 0a 20 20 20 20 66 72 65 65 28 74 61 67    }.    free(tag
d130: 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  s);.  }.  return
d140: 20 76 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 52 65   v;.}../*. ** Re
d150: 74 75 72 6e 73 20 61 20 22 6e 65 77 22 20 76 61  turns a "new" va
d160: 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67  lue representing
d170: 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 76 61 6c   the boolean val
d180: 75 65 20 6f 66 20 7a 56 61 6c 0a 20 2a 2a 20 28  ue of zVal. ** (
d190: 66 61 6c 73 65 20 69 66 20 7a 56 61 6c 20 69 73  false if zVal is
d1a0: 20 4e 55 4c 4c 29 2e 20 4e 6f 74 65 20 74 68 61   NULL). Note tha
d1b0: 74 20 63 73 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  t cson does not 
d1c0: 72 65 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 0a  really allocate.
d1d0: 20 2a 2a 20 61 6e 79 20 6d 65 6d 6f 72 79 20 66   ** any memory f
d1e0: 6f 72 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65  or boolean value
d1f0: 73 2c 20 62 75 74 20 74 68 65 79 20 22 73 68 6f  s, but they "sho
d200: 75 6c 64 22 20 28 66 6f 72 20 72 65 61 73 6f 6e  uld" (for reason
d210: 73 20 6f 66 0a 20 2a 2a 20 73 74 79 6c 65 20 61  s of. ** style a
d220: 6e 64 20 70 68 69 6c 6f 73 6f 70 68 79 29 20 62  nd philosophy) b
d230: 65 20 63 6c 65 61 6e 65 64 20 75 70 20 6c 69 6b  e cleaned up lik
d240: 65 20 61 6e 79 20 6f 74 68 65 72 20 76 61 6c 75  e any other valu
d250: 65 73 20 28 62 75 74 0a 20 2a 2a 20 69 74 27 73  es (but. ** it's
d260: 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 62 6f 6f   a no-op for boo
d270: 6c 73 29 2e 0a 20 2a 2f 0a 63 73 6f 6e 5f 76 61  ls).. */.cson_va
d280: 6c 75 65 20 2a 20 6a 73 6f 6e 5f 76 61 6c 75 65  lue * json_value
d290: 5f 74 6f 5f 62 6f 6f 6c 28 63 73 6f 6e 5f 76 61  _to_bool(cson_va
d2a0: 6c 75 65 20 63 6f 6e 73 74 20 2a 20 7a 56 61 6c  lue const * zVal
d2b0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 73 6f 6e  ){.  return cson
d2c0: 5f 76 61 6c 75 65 5f 67 65 74 5f 62 6f 6f 6c 28  _value_get_bool(
d2d0: 7a 56 61 6c 29 0a 20 20 20 20 3f 20 63 73 6f 6e  zVal).    ? cson
d2e0: 5f 76 61 6c 75 65 5f 74 72 75 65 28 29 0a 20 20  _value_true().  
d2f0: 20 20 3a 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 66    : cson_value_f
d300: 61 6c 73 65 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  alse();.}../*.**
d310: 20 49 6d 70 6c 20 6f 66 20 2f 6a 73 6f 6e 2f 72   Impl of /json/r
d320: 65 73 75 6c 74 43 6f 64 65 73 0a 2a 2a 0a 2a 2f  esultCodes.**.*/
d330: 0a 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73  .cson_value * js
d340: 6f 6e 5f 70 61 67 65 5f 72 65 73 75 6c 74 43 6f  on_page_resultCo
d350: 64 65 73 28 29 7b 0a 20 20 20 20 63 73 6f 6e 5f  des(){.    cson_
d360: 61 72 72 61 79 20 2a 20 6c 69 73 74 20 3d 20 63  array * list = c
d370: 73 6f 6e 5f 6e 65 77 5f 61 72 72 61 79 28 29 3b  son_new_array();
d380: 0a 20 20 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74  .    cson_object
d390: 20 2a 20 6f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20   * obj = NULL;. 
d3a0: 20 20 20 63 73 6f 6e 5f 73 74 72 69 6e 67 20 2a     cson_string *
d3b0: 20 6b 52 43 3b 0a 20 20 20 20 63 73 6f 6e 5f 73   kRC;.    cson_s
d3c0: 74 72 69 6e 67 20 2a 20 6b 53 79 6d 62 6f 6c 3b  tring * kSymbol;
d3d0: 0a 20 20 20 20 63 73 6f 6e 5f 73 74 72 69 6e 67  .    cson_string
d3e0: 20 2a 20 6b 4e 75 6d 62 65 72 3b 0a 20 20 20 20   * kNumber;.    
d3f0: 63 73 6f 6e 5f 73 74 72 69 6e 67 20 2a 20 6b 44  cson_string * kD
d400: 65 73 63 3b 0a 20 20 20 20 63 73 6f 6e 5f 61 72  esc;.    cson_ar
d410: 72 61 79 5f 72 65 73 65 72 76 65 28 20 6c 69 73  ray_reserve( lis
d420: 74 2c 20 33 35 20 29 3b 0a 20 20 20 20 6b 52 43  t, 35 );.    kRC
d430: 20 3d 20 63 73 6f 6e 5f 6e 65 77 5f 73 74 72 69   = cson_new_stri
d440: 6e 67 28 22 72 65 73 75 6c 74 43 6f 64 65 22 2c  ng("resultCode",
d450: 31 30 29 3b 0a 20 20 20 20 6b 53 79 6d 62 6f 6c  10);.    kSymbol
d460: 20 3d 20 63 73 6f 6e 5f 6e 65 77 5f 73 74 72 69   = cson_new_stri
d470: 6e 67 28 22 63 53 79 6d 62 6f 6c 22 2c 37 29 3b  ng("cSymbol",7);
d480: 0a 20 20 20 20 6b 4e 75 6d 62 65 72 20 3d 20 63  .    kNumber = c
d490: 73 6f 6e 5f 6e 65 77 5f 73 74 72 69 6e 67 28 22  son_new_string("
d4a0: 6e 75 6d 62 65 72 22 2c 36 29 3b 0a 20 20 20 20  number",6);.    
d4b0: 6b 44 65 73 63 20 3d 20 63 73 6f 6e 5f 6e 65 77  kDesc = cson_new
d4c0: 5f 73 74 72 69 6e 67 28 22 64 65 73 63 72 69 70  _string("descrip
d4d0: 74 69 6f 6e 22 2c 31 31 29 3b 0a 23 64 65 66 69  tion",11);.#defi
d4e0: 6e 65 20 43 28 4b 29 20 6f 62 6a 20 3d 20 63 73  ne C(K) obj = cs
d4f0: 6f 6e 5f 6e 65 77 5f 6f 62 6a 65 63 74 28 29 3b  on_new_object();
d500: 20 5c 0a 20 20 20 20 63 73 6f 6e 5f 6f 62 6a 65   \.    cson_obje
d510: 63 74 5f 73 65 74 5f 73 28 6f 62 6a 2c 20 6b 52  ct_set_s(obj, kR
d520: 43 2c 20 6a 73 6f 6e 5f 6e 65 77 5f 73 74 72 69  C, json_new_stri
d530: 6e 67 28 6a 73 6f 6e 5f 72 63 5f 63 73 74 72 28  ng(json_rc_cstr(
d540: 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 23 23 4b 29 29  FSL_JSON_E_##K))
d550: 20 29 3b 20 5c 0a 20 20 20 20 63 73 6f 6e 5f 6f   ); \.    cson_o
d560: 62 6a 65 63 74 5f 73 65 74 5f 73 28 6f 62 6a 2c  bject_set_s(obj,
d570: 20 6b 53 79 6d 62 6f 6c 2c 20 6a 73 6f 6e 5f 6e   kSymbol, json_n
d580: 65 77 5f 73 74 72 69 6e 67 28 22 46 53 4c 5f 4a  ew_string("FSL_J
d590: 53 4f 4e 5f 45 5f 22 23 4b 29 20 29 3b 20 20 20  SON_E_"#K) );   
d5a0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
d5b0: 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 5f  cson_object_set_
d5c0: 73 28 6f 62 6a 2c 20 6b 4e 75 6d 62 65 72 2c 20  s(obj, kNumber, 
d5d0: 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 69  cson_value_new_i
d5e0: 6e 74 65 67 65 72 28 46 53 4c 5f 4a 53 4f 4e 5f  nteger(FSL_JSON_
d5f0: 45 5f 23 23 4b 29 20 29 3b 20 20 20 20 20 20 20  E_##K) );       
d600: 20 5c 0a 20 20 20 20 63 73 6f 6e 5f 6f 62 6a 65   \.    cson_obje
d610: 63 74 5f 73 65 74 5f 73 28 6f 62 6a 2c 20 6b 44  ct_set_s(obj, kD
d620: 65 73 63 2c 20 6a 73 6f 6e 5f 6e 65 77 5f 73 74  esc, json_new_st
d630: 72 69 6e 67 28 6a 73 6f 6e 5f 65 72 72 5f 63 73  ring(json_err_cs
d640: 74 72 28 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 23 23  tr(FSL_JSON_E_##
d650: 4b 29 29 29 3b 20 5c 0a 20 20 20 20 63 73 6f 6e  K))); \.    cson
d660: 5f 61 72 72 61 79 5f 61 70 70 65 6e 64 28 20 6c  _array_append( l
d670: 69 73 74 2c 20 63 73 6f 6e 5f 6f 62 6a 65 63 74  ist, cson_object
d680: 5f 76 61 6c 75 65 28 6f 62 6a 29 20 29 3b 20 6f  _value(obj) ); o
d690: 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20  bj = NULL;..    
d6a0: 43 28 47 45 4e 45 52 49 43 29 3b 0a 20 20 20 20  C(GENERIC);.    
d6b0: 43 28 49 4e 56 41 4c 49 44 5f 52 45 51 55 45 53  C(INVALID_REQUES
d6c0: 54 29 3b 0a 20 20 20 20 43 28 55 4e 4b 4e 4f 57  T);.    C(UNKNOW
d6d0: 4e 5f 43 4f 4d 4d 41 4e 44 29 3b 0a 20 20 20 20  N_COMMAND);.    
d6e0: 43 28 55 4e 4b 4e 4f 57 4e 29 3b 0a 20 20 20 20  C(UNKNOWN);.    
d6f0: 43 28 54 49 4d 45 4f 55 54 29 3b 0a 20 20 20 20  C(TIMEOUT);.    
d700: 43 28 41 53 53 45 52 54 29 3b 0a 20 20 20 20 43  C(ASSERT);.    C
d710: 28 41 4c 4c 4f 43 29 3b 0a 20 20 20 20 43 28 4e  (ALLOC);.    C(N
d720: 59 49 29 3b 0a 20 20 20 20 43 28 50 41 4e 49 43  YI);.    C(PANIC
d730: 29 3b 0a 20 20 20 20 43 28 4d 41 4e 49 46 45 53  );.    C(MANIFES
d740: 54 5f 52 45 41 44 5f 46 41 49 4c 45 44 29 3b 0a  T_READ_FAILED);.
d750: 20 20 20 20 43 28 46 49 4c 45 5f 4f 50 45 4e 5f      C(FILE_OPEN_
d760: 46 41 49 4c 45 44 29 3b 0a 0a 20 20 20 20 43 28  FAILED);..    C(
d770: 41 55 54 48 29 3b 0a 20 20 20 20 43 28 4d 49 53  AUTH);.    C(MIS
d780: 53 49 4e 47 5f 41 55 54 48 29 3b 0a 20 20 20 20  SING_AUTH);.    
d790: 43 28 44 45 4e 49 45 44 29 3b 0a 20 20 20 20 43  C(DENIED);.    C
d7a0: 28 57 52 4f 4e 47 5f 4d 4f 44 45 29 3b 0a 20 20  (WRONG_MODE);.  
d7b0: 20 20 43 28 4c 4f 47 49 4e 5f 46 41 49 4c 45 44    C(LOGIN_FAILED
d7c0: 29 3b 0a 20 20 20 20 43 28 4c 4f 47 49 4e 5f 46  );.    C(LOGIN_F
d7d0: 41 49 4c 45 44 5f 4e 4f 53 45 45 44 29 3b 0a 20  AILED_NOSEED);. 
d7e0: 20 20 20 43 28 4c 4f 47 49 4e 5f 46 41 49 4c 45     C(LOGIN_FAILE
d7f0: 44 5f 4e 4f 4e 41 4d 45 29 3b 0a 20 20 20 20 43  D_NONAME);.    C
d800: 28 4c 4f 47 49 4e 5f 46 41 49 4c 45 44 5f 4e 4f  (LOGIN_FAILED_NO
d810: 50 57 29 3b 0a 20 20 20 20 43 28 4c 4f 47 49 4e  PW);.    C(LOGIN
d820: 5f 46 41 49 4c 45 44 5f 4e 4f 54 46 4f 55 4e 44  _FAILED_NOTFOUND
d830: 29 3b 0a 0a 20 20 20 20 43 28 55 53 41 47 45 29  );..    C(USAGE)
d840: 3b 0a 20 20 20 20 43 28 49 4e 56 41 4c 49 44 5f  ;.    C(INVALID_
d850: 41 52 47 53 29 3b 0a 20 20 20 20 43 28 4d 49 53  ARGS);.    C(MIS
d860: 53 49 4e 47 5f 41 52 47 53 29 3b 0a 20 20 20 20  SING_ARGS);.    
d870: 43 28 41 4d 42 49 47 55 4f 55 53 5f 55 55 49 44  C(AMBIGUOUS_UUID
d880: 29 3b 0a 20 20 20 20 43 28 55 4e 52 45 53 4f 4c  );.    C(UNRESOL
d890: 56 45 44 5f 55 55 49 44 29 3b 0a 20 20 20 20 43  VED_UUID);.    C
d8a0: 28 52 45 53 4f 55 52 43 45 5f 41 4c 52 45 41 44  (RESOURCE_ALREAD
d8b0: 59 5f 45 58 49 53 54 53 29 3b 0a 20 20 20 20 43  Y_EXISTS);.    C
d8c0: 28 52 45 53 4f 55 52 43 45 5f 4e 4f 54 5f 46 4f  (RESOURCE_NOT_FO
d8d0: 55 4e 44 29 3b 0a 0a 20 20 20 20 43 28 44 42 29  UND);..    C(DB)
d8e0: 3b 0a 20 20 20 20 43 28 53 54 4d 54 5f 50 52 45  ;.    C(STMT_PRE
d8f0: 50 29 3b 0a 20 20 20 20 43 28 53 54 4d 54 5f 42  P);.    C(STMT_B
d900: 49 4e 44 29 3b 0a 20 20 20 20 43 28 53 54 4d 54  IND);.    C(STMT
d910: 5f 45 58 45 43 29 3b 0a 20 20 20 20 43 28 44 42  _EXEC);.    C(DB
d920: 5f 4c 4f 43 4b 45 44 29 3b 0a 20 20 20 20 43 28  _LOCKED);.    C(
d930: 44 42 5f 4e 45 45 44 53 5f 52 45 42 55 49 4c 44  DB_NEEDS_REBUILD
d940: 29 3b 0a 20 20 20 20 43 28 44 42 5f 4e 4f 54 5f  );.    C(DB_NOT_
d950: 46 4f 55 4e 44 29 3b 0a 20 20 20 20 43 28 44 42  FOUND);.    C(DB
d960: 5f 4e 4f 54 5f 56 41 4c 49 44 29 3b 0a 23 75 6e  _NOT_VALID);.#un
d970: 64 65 66 20 43 0a 20 20 20 20 72 65 74 75 72 6e  def C.    return
d980: 20 63 73 6f 6e 5f 61 72 72 61 79 5f 76 61 6c 75   cson_array_valu
d990: 65 28 6c 69 73 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  e(list);.}.../*.
d9a0: 2a 2a 20 2f 6a 73 6f 6e 2f 76 65 72 73 69 6f 6e  ** /json/version
d9b0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
d9c0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74  .**.** Returns t
d9d0: 68 65 20 70 61 79 6c 6f 61 64 20 6f 62 6a 65 63  he payload objec
d9e0: 74 20 28 6f 77 6e 65 64 20 62 79 20 74 68 65 20  t (owned by the 
d9f0: 63 61 6c 6c 65 72 29 2e 0a 2a 2f 0a 63 73 6f 6e  caller)..*/.cson
da00: 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 70 61  _value * json_pa
da10: 67 65 5f 76 65 72 73 69 6f 6e 28 29 7b 0a 20 20  ge_version(){.  
da20: 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 76 61  cson_value * jva
da30: 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 73 6f 6e  l = NULL;.  cson
da40: 5f 6f 62 6a 65 63 74 20 2a 20 6a 6f 62 6a 20 3d  _object * jobj =
da50: 20 4e 55 4c 4c 3b 0a 20 20 6a 76 61 6c 20 3d 20   NULL;.  jval = 
da60: 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 6f  cson_value_new_o
da70: 62 6a 65 63 74 28 29 3b 0a 20 20 6a 6f 62 6a 20  bject();.  jobj 
da80: 3d 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 67 65 74  = cson_value_get
da90: 5f 6f 62 6a 65 63 74 28 6a 76 61 6c 29 3b 0a 23  _object(jval);.#
daa0: 64 65 66 69 6e 65 20 46 53 45 54 28 58 2c 4b 29  define FSET(X,K)
dab0: 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65 74   cson_object_set
dac0: 28 20 6a 6f 62 6a 2c 20 4b 2c 20 63 73 6f 6e 5f  ( jobj, K, cson_
dad0: 76 61 6c 75 65 5f 6e 65 77 5f 73 74 72 69 6e 67  value_new_string
dae0: 28 58 2c 73 74 72 6c 65 6e 28 58 29 29 29 0a 20  (X,strlen(X))). 
daf0: 20 46 53 45 54 28 4d 41 4e 49 46 45 53 54 5f 55   FSET(MANIFEST_U
db00: 55 49 44 2c 22 6d 61 6e 69 66 65 73 74 55 75 69  UID,"manifestUui
db10: 64 22 29 3b 0a 20 20 46 53 45 54 28 4d 41 4e 49  d");.  FSET(MANI
db20: 46 45 53 54 5f 56 45 52 53 49 4f 4e 2c 22 6d 61  FEST_VERSION,"ma
db30: 6e 69 66 65 73 74 56 65 72 73 69 6f 6e 22 29 3b  nifestVersion");
db40: 0a 20 20 46 53 45 54 28 4d 41 4e 49 46 45 53 54  .  FSET(MANIFEST
db50: 5f 44 41 54 45 2c 22 6d 61 6e 69 66 65 73 74 44  _DATE,"manifestD
db60: 61 74 65 22 29 3b 0a 20 20 46 53 45 54 28 4d 41  ate");.  FSET(MA
db70: 4e 49 46 45 53 54 5f 59 45 41 52 2c 22 6d 61 6e  NIFEST_YEAR,"man
db80: 69 66 65 73 74 59 65 61 72 22 29 3b 0a 20 20 46  ifestYear");.  F
db90: 53 45 54 28 52 45 4c 45 41 53 45 5f 56 45 52 53  SET(RELEASE_VERS
dba0: 49 4f 4e 2c 22 72 65 6c 65 61 73 65 56 65 72 73  ION,"releaseVers
dbb0: 69 6f 6e 22 29 3b 0a 20 20 63 73 6f 6e 5f 6f 62  ion");.  cson_ob
dbc0: 6a 65 63 74 5f 73 65 74 28 20 6a 6f 62 6a 2c 20  ject_set( jobj, 
dbd0: 22 72 65 6c 65 61 73 65 56 65 72 73 69 6f 6e 4e  "releaseVersionN
dbe0: 75 6d 62 65 72 22 2c 0a 20 20 20 20 20 20 20 20  umber",.        
dbf0: 20 20 20 20 20 20 20 20 20 20 20 63 73 6f 6e 5f             cson_
dc00: 76 61 6c 75 65 5f 6e 65 77 5f 69 6e 74 65 67 65  value_new_intege
dc10: 72 28 52 45 4c 45 41 53 45 5f 56 45 52 53 49 4f  r(RELEASE_VERSIO
dc20: 4e 5f 4e 55 4d 42 45 52 29 20 29 3b 0a 20 20 63  N_NUMBER) );.  c
dc30: 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 20  son_object_set( 
dc40: 6a 6f 62 6a 2c 20 22 72 65 73 75 6c 74 43 6f 64  jobj, "resultCod
dc50: 65 50 61 72 61 6e 6f 69 61 4c 65 76 65 6c 22 2c  eParanoiaLevel",
dc60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dc70: 20 20 20 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e      cson_value_n
dc80: 65 77 5f 69 6e 74 65 67 65 72 28 67 2e 6a 73 6f  ew_integer(g.jso
dc90: 6e 2e 65 72 72 6f 72 44 65 74 61 69 6c 50 61 72  n.errorDetailPar
dca0: 61 6e 6f 69 61 29 20 29 3b 0a 20 20 46 53 45 54  anoia) );.  FSET
dcb0: 28 46 4f 53 53 49 4c 5f 4a 53 4f 4e 5f 41 50 49  (FOSSIL_JSON_API
dcc0: 5f 56 45 52 53 49 4f 4e 2c 20 22 6a 73 6f 6e 41  _VERSION, "jsonA
dcd0: 70 69 56 65 72 73 69 6f 6e 22 20 29 3b 0a 23 75  piVersion" );.#u
dce0: 6e 64 65 66 20 46 53 45 54 0a 20 20 72 65 74 75  ndef FSET.  retu
dcf0: 72 6e 20 6a 76 61 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn jval;.}.../*.
dd00: 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 63  ** Returns the c
dd10: 75 72 72 65 6e 74 20 75 73 65 72 27 73 20 63 61  urrent user's ca
dd20: 70 61 62 69 6c 69 74 69 65 73 20 73 74 72 69 6e  pabilities strin
dd30: 67 20 61 73 20 61 20 53 74 72 69 6e 67 20 76 61  g as a String va
dd40: 6c 75 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 65 64  lue..** Returned
dd50: 20 76 61 6c 75 65 20 69 73 20 6f 77 6e 65 64 20   value is owned 
dd60: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2c 20 61  by the caller, a
dd70: 6e 64 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20  nd will only be 
dd80: 4e 55 4c 4c 20 69 66 0a 2a 2a 20 67 2e 75 73 65  NULL if.** g.use
dd90: 72 55 69 64 20 69 73 20 69 6e 76 61 6c 69 64 20  rUid is invalid 
dda0: 6f 72 20 61 6e 20 6f 75 74 20 6f 66 20 6d 65 6d  or an out of mem
ddb0: 6f 72 79 20 65 72 72 6f 72 2e 20 4f 72 2c 20 69  ory error. Or, i
ddc0: 74 20 74 75 72 6e 73 20 6f 75 74 2c 0a 2a 2a 20  t turns out,.** 
ddd0: 69 6e 20 43 4c 49 20 6d 6f 64 65 20 28 77 68 65  in CLI mode (whe
dde0: 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  re there is no l
ddf0: 6f 67 67 65 64 2d 69 6e 20 75 73 65 72 29 2e 0a  ogged-in user)..
de00: 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20  */.cson_value * 
de10: 6a 73 6f 6e 5f 63 61 70 5f 76 61 6c 75 65 28 29  json_cap_value()
de20: 7b 0a 20 20 69 66 28 67 2e 75 73 65 72 55 69 64  {.  if(g.userUid
de30: 3c 3d 30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <=0){.    return
de40: 20 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a   NULL;.  }else{.
de50: 20 20 20 20 53 74 6d 74 20 71 20 3d 20 65 6d 70      Stmt q = emp
de60: 74 79 5f 53 74 6d 74 3b 0a 20 20 20 20 63 73 6f  ty_Stmt;.    cso
de70: 6e 5f 76 61 6c 75 65 20 2a 20 76 61 6c 20 3d 20  n_value * val = 
de80: 4e 55 4c 4c 3b 0a 20 20 20 20 64 62 5f 70 72 65  NULL;.    db_pre
de90: 70 61 72 65 28 26 71 2c 20 22 53 45 4c 45 43 54  pare(&q, "SELECT
dea0: 20 63 61 70 20 46 52 4f 4d 20 75 73 65 72 20 57   cap FROM user W
deb0: 48 45 52 45 20 75 69 64 3d 25 64 22 2c 20 67 2e  HERE uid=%d", g.
dec0: 75 73 65 72 55 69 64 29 3b 0a 20 20 20 20 69 66  userUid);.    if
ded0: 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53  ( db_step(&q)==S
dee0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
def0: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 20     char const * 
df00: 73 74 72 20 3d 20 28 63 68 61 72 20 63 6f 6e 73  str = (char cons
df10: 74 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  t *)sqlite3_colu
df20: 6d 6e 5f 74 65 78 74 28 71 2e 70 53 74 6d 74 2c  mn_text(q.pStmt,
df30: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  0);.      if( st
df40: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 76 61 6c  r ){.        val
df50: 20 3d 20 6a 73 6f 6e 5f 6e 65 77 5f 73 74 72 69   = json_new_stri
df60: 6e 67 28 73 74 72 29 3b 0a 20 20 20 20 20 20 7d  ng(str);.      }
df70: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 66 69  .    }.    db_fi
df80: 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 20 20  nalize(&q);.    
df90: 72 65 74 75 72 6e 20 76 61 6c 3b 0a 20 20 7d 0a  return val;.  }.
dfa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
dfb0: 6e 74 61 74 69 6f 6e 20 66 6f 72 20 2f 6a 73 6f  ntation for /jso
dfc0: 6e 2f 63 61 70 0a 2a 2a 0a 2a 2a 20 52 65 74 75  n/cap.**.** Retu
dfd0: 72 6e 65 64 20 6f 62 6a 65 63 74 20 63 6f 6e 74  rned object cont
dfe0: 61 69 6e 73 20 64 65 74 61 69 6c 73 20 61 62 6f  ains details abo
dff0: 75 74 20 74 68 65 20 22 63 61 70 61 62 69 6c 69  ut the "capabili
e000: 74 69 65 73 22 20 6f 66 20 74 68 65 0a 2a 2a 20  ties" of the.** 
e010: 63 75 72 72 65 6e 74 20 75 73 65 72 20 28 77 68  current user (wh
e020: 61 74 20 68 65 20 6d 61 79 2f 6d 61 79 20 6e 6f  at he may/may no
e030: 74 20 64 6f 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  t do)..**.** Thi
e040: 73 20 69 73 20 70 72 69 6d 61 72 69 6c 79 20 69  s is primarily i
e050: 6e 74 65 6e 64 65 64 20 66 6f 72 20 64 65 62 75  ntended for debu
e060: 67 67 65 72 69 6e 67 2c 20 62 75 74 20 6d 61 79  ggering, but may
e070: 20 68 61 76 65 0a 2a 2a 20 61 20 75 73 65 20 69   have.** a use i
e080: 6e 20 63 6c 69 65 6e 74 20 63 6f 64 65 2e 20 28  n client code. (
e090: 3f 29 0a 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65  ?).*/.cson_value
e0a0: 20 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f 63 61 70   * json_page_cap
e0b0: 28 29 7b 0a 20 20 63 73 6f 6e 5f 76 61 6c 75 65  (){.  cson_value
e0c0: 20 2a 20 70 61 79 6c 6f 61 64 20 3d 20 63 73 6f   * payload = cso
e0d0: 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 6f 62 6a 65  n_value_new_obje
e0e0: 63 74 28 29 3b 0a 20 20 63 73 6f 6e 5f 76 61 6c  ct();.  cson_val
e0f0: 75 65 20 2a 20 73 75 62 20 3d 20 63 73 6f 6e 5f  ue * sub = cson_
e100: 76 61 6c 75 65 5f 6e 65 77 5f 6f 62 6a 65 63 74  value_new_object
e110: 28 29 3b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20  ();.  Stmt q;.  
e120: 63 73 6f 6e 5f 6f 62 6a 65 63 74 20 2a 20 6f 62  cson_object * ob
e130: 6a 20 3d 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 67  j = cson_value_g
e140: 65 74 5f 6f 62 6a 65 63 74 28 70 61 79 6c 6f 61  et_object(payloa
e150: 64 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65  d);.  db_prepare
e160: 28 26 71 2c 20 22 53 45 4c 45 43 54 20 6c 6f 67  (&q, "SELECT log
e170: 69 6e 2c 20 63 61 70 20 46 52 4f 4d 20 75 73 65  in, cap FROM use
e180: 72 20 57 48 45 52 45 20 75 69 64 3d 25 64 22 2c  r WHERE uid=%d",
e190: 20 67 2e 75 73 65 72 55 69 64 29 3b 0a 20 20 69   g.userUid);.  i
e1a0: 66 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d  f( db_step(&q)==
e1b0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
e1c0: 20 20 2f 2a 20 72 65 6d 69 6e 64 65 72 3a 20 77    /* reminder: w
e1d0: 65 20 64 6f 6e 27 74 20 75 73 65 20 67 2e 7a 4c  e don't use g.zL
e1e0: 6f 67 69 6e 20 62 65 63 61 75 73 65 20 69 74 27  ogin because it'
e1f0: 73 20 30 20 66 6f 72 20 74 68 65 20 67 75 65 73  s 0 for the gues
e200: 74 0a 20 20 20 20 20 20 20 75 73 65 72 20 61 6e  t.       user an
e210: 64 20 74 68 65 20 48 54 4d 4c 20 55 49 20 61 70  d the HTML UI ap
e220: 70 65 61 72 73 20 74 6f 20 63 75 72 72 65 6e 74  pears to current
e230: 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6e 61 6d  ly allow the nam
e240: 65 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 63  e to be.       c
e250: 68 61 6e 67 65 64 20 28 62 75 74 20 64 6f 69 6e  hanged (but doin
e260: 67 20 73 6f 20 77 6f 75 6c 64 20 62 72 65 61 6b  g so would break
e270: 20 6f 74 68 65 72 20 63 6f 64 65 29 2e 20 2a 2f   other code). */
e280: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
e290: 2a 20 73 74 72 20 3d 20 28 63 68 61 72 20 63 6f  * str = (char co
e2a0: 6e 73 74 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  nst *)sqlite3_co
e2b0: 6c 75 6d 6e 5f 74 65 78 74 28 71 2e 70 53 74 6d  lumn_text(q.pStm
e2c0: 74 2c 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74  t,0);.    if( st
e2d0: 72 20 29 7b 0a 20 20 20 20 20 20 63 73 6f 6e 5f  r ){.      cson_
e2e0: 6f 62 6a 65 63 74 5f 73 65 74 28 20 6f 62 6a 2c  object_set( obj,
e2f0: 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20 20   "name",.       
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 73  cson_value_new_s
e320: 74 72 69 6e 67 28 73 74 72 2c 73 74 72 6c 65 6e  tring(str,strlen
e330: 28 73 74 72 29 29 20 29 3b 0a 20 20 20 20 7d 0a  (str)) );.    }.
e340: 20 20 20 20 73 74 72 20 3d 20 28 63 68 61 72 20      str = (char 
e350: 63 6f 6e 73 74 20 2a 29 73 71 6c 69 74 65 33 5f  const *)sqlite3_
e360: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 71 2e 70 53  column_text(q.pS
e370: 74 6d 74 2c 31 29 3b 0a 20 20 20 20 69 66 28 20  tmt,1);.    if( 
e380: 73 74 72 20 29 7b 0a 20 20 20 20 20 20 63 73 6f  str ){.      cso
e390: 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 20 6f 62  n_object_set( ob
e3a0: 6a 2c 20 22 63 61 70 61 62 69 6c 69 74 69 65 73  j, "capabilities
e3b0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
e3c0: 20 20 20 20 20 20 20 20 20 20 63 73 6f 6e 5f 76            cson_v
e3d0: 61 6c 75 65 5f 6e 65 77 5f 73 74 72 69 6e 67 28  alue_new_string(
e3e0: 73 74 72 2c 73 74 72 6c 65 6e 28 73 74 72 29 29  str,strlen(str))
e3f0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
e400: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b  db_finalize(&q);
e410: 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73  .  cson_object_s
e420: 65 74 28 20 6f 62 6a 2c 20 22 70 65 72 6d 69 73  et( obj, "permis
e430: 73 69 6f 6e 46 6c 61 67 73 22 2c 20 73 75 62 20  sionFlags", sub 
e440: 29 3b 0a 20 20 6f 62 6a 20 3d 20 63 73 6f 6e 5f  );.  obj = cson_
e450: 76 61 6c 75 65 5f 67 65 74 5f 6f 62 6a 65 63 74  value_get_object
e460: 28 73 75 62 29 3b 0a 0a 23 64 65 66 69 6e 65 20  (sub);..#define 
e470: 41 44 44 28 58 2c 4b 29 20 63 73 6f 6e 5f 6f 62  ADD(X,K) cson_ob
e480: 6a 65 63 74 5f 73 65 74 28 6f 62 6a 2c 20 4b 2c  ject_set(obj, K,
e490: 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f   cson_value_new_
e4a0: 62 6f 6f 6c 28 67 2e 70 65 72 6d 2e 58 29 29 0a  bool(g.perm.X)).
e4b0: 20 20 41 44 44 28 53 65 74 75 70 2c 22 73 65 74    ADD(Setup,"set
e4c0: 75 70 22 29 3b 0a 20 20 41 44 44 28 41 64 6d 69  up");.  ADD(Admi
e4d0: 6e 2c 22 61 64 6d 69 6e 22 29 3b 0a 20 20 41 44  n,"admin");.  AD
e4e0: 44 28 44 65 6c 65 74 65 2c 22 64 65 6c 65 74 65  D(Delete,"delete
e4f0: 22 29 3b 0a 20 20 41 44 44 28 50 61 73 73 77 6f  ");.  ADD(Passwo
e500: 72 64 2c 22 70 61 73 73 77 6f 72 64 22 29 3b 0a  rd,"password");.
e510: 20 20 41 44 44 28 51 75 65 72 79 2c 22 71 75 65    ADD(Query,"que
e520: 72 79 22 29 3b 20 2f 2a 20 64 6f 6e 27 74 20 74  ry"); /* don't t
e530: 68 69 6e 6b 20 74 68 69 73 20 6f 6e 65 20 69 73  hink this one is
e540: 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 20 2a   actually used *
e550: 2f 0a 20 20 41 44 44 28 57 72 69 74 65 2c 22 63  /.  ADD(Write,"c
e560: 68 65 63 6b 69 6e 22 29 3b 0a 20 20 41 44 44 28  heckin");.  ADD(
e570: 52 65 61 64 2c 22 63 68 65 63 6b 6f 75 74 22 29  Read,"checkout")
e580: 3b 0a 20 20 41 44 44 28 48 79 70 65 72 6c 69 6e  ;.  ADD(Hyperlin
e590: 6b 2c 22 68 69 73 74 6f 72 79 22 29 3b 0a 20 20  k,"history");.  
e5a0: 41 44 44 28 43 6c 6f 6e 65 2c 22 63 6c 6f 6e 65  ADD(Clone,"clone
e5b0: 22 29 3b 0a 20 20 41 44 44 28 52 64 57 69 6b 69  ");.  ADD(RdWiki
e5c0: 2c 22 72 65 61 64 57 69 6b 69 22 29 3b 0a 20 20  ,"readWiki");.  
e5d0: 41 44 44 28 4e 65 77 57 69 6b 69 2c 22 63 72 65  ADD(NewWiki,"cre
e5e0: 61 74 65 57 69 6b 69 22 29 3b 0a 20 20 41 44 44  ateWiki");.  ADD
e5f0: 28 41 70 6e 64 57 69 6b 69 2c 22 61 70 70 65 6e  (ApndWiki,"appen
e600: 64 57 69 6b 69 22 29 3b 0a 20 20 41 44 44 28 57  dWiki");.  ADD(W
e610: 72 57 69 6b 69 2c 22 65 64 69 74 57 69 6b 69 22  rWiki,"editWiki"
e620: 29 3b 0a 20 20 41 44 44 28 4d 6f 64 57 69 6b 69  );.  ADD(ModWiki
e630: 2c 22 6d 6f 64 65 72 61 74 65 57 69 6b 69 22 29  ,"moderateWiki")
e640: 3b 0a 20 20 41 44 44 28 52 64 54 6b 74 2c 22 72  ;.  ADD(RdTkt,"r
e650: 65 61 64 54 69 63 6b 65 74 22 29 3b 0a 20 20 41  eadTicket");.  A
e660: 44 44 28 4e 65 77 54 6b 74 2c 22 63 72 65 61 74  DD(NewTkt,"creat
e670: 65 54 69 63 6b 65 74 22 29 3b 0a 20 20 41 44 44  eTicket");.  ADD
e680: 28 41 70 6e 64 54 6b 74 2c 22 61 70 70 65 6e 64  (ApndTkt,"append
e690: 54 69 63 6b 65 74 22 29 3b 0a 20 20 41 44 44 28  Ticket");.  ADD(
e6a0: 57 72 54 6b 74 2c 22 65 64 69 74 54 69 63 6b 65  WrTkt,"editTicke
e6b0: 74 22 29 3b 0a 20 20 41 44 44 28 4d 6f 64 54 6b  t");.  ADD(ModTk
e6c0: 74 2c 22 6d 6f 64 65 72 61 74 65 54 69 63 6b 65  t,"moderateTicke
e6d0: 74 22 29 3b 0a 20 20 41 44 44 28 41 74 74 61 63  t");.  ADD(Attac
e6e0: 68 2c 22 61 74 74 61 63 68 46 69 6c 65 22 29 3b  h,"attachFile");
e6f0: 0a 20 20 41 44 44 28 54 6b 74 46 6d 74 2c 22 63  .  ADD(TktFmt,"c
e700: 72 65 61 74 65 54 69 63 6b 65 74 52 65 70 6f 72  reateTicketRepor
e710: 74 22 29 3b 0a 20 20 41 44 44 28 52 64 41 64 64  t");.  ADD(RdAdd
e720: 72 2c 22 72 65 61 64 50 72 69 76 61 74 65 22 29  r,"readPrivate")
e730: 3b 0a 20 20 41 44 44 28 5a 69 70 2c 22 7a 69 70  ;.  ADD(Zip,"zip
e740: 22 29 3b 0a 20 20 41 44 44 28 50 72 69 76 61 74  ");.  ADD(Privat
e750: 65 2c 22 78 66 65 72 50 72 69 76 61 74 65 22 29  e,"xferPrivate")
e760: 3b 0a 23 75 6e 64 65 66 20 41 44 44 0a 20 20 72  ;.#undef ADD.  r
e770: 65 74 75 72 6e 20 70 61 79 6c 6f 61 64 3b 0a 7d  eturn payload;.}
e780: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
e790: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 2f 6a  tation of the /j
e7a0: 73 6f 6e 2f 73 74 61 74 20 70 61 67 65 2f 63 6f  son/stat page/co
e7b0: 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2f 0a 63 73 6f  mmand..**.*/.cso
e7c0: 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 70  n_value * json_p
e7d0: 61 67 65 5f 73 74 61 74 28 29 7b 0a 20 20 69 36  age_stat(){.  i6
e7e0: 34 20 74 2c 20 66 73 69 7a 65 3b 0a 20 20 69 6e  4 t, fsize;.  in
e7f0: 74 20 6e 2c 20 6d 3b 0a 20 20 69 6e 74 20 66 75  t n, m;.  int fu
e800: 6c 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ll;.  const char
e810: 20 2a 7a 44 62 3b 0a 20 20 65 6e 75 6d 20 7b 20   *zDb;.  enum { 
e820: 42 75 66 4c 65 6e 20 3d 20 31 30 30 30 20 7d 3b  BufLen = 1000 };
e830: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 42 75 66  .  char zBuf[Buf
e840: 4c 65 6e 5d 3b 0a 20 20 63 73 6f 6e 5f 76 61 6c  Len];.  cson_val
e850: 75 65 20 2a 20 6a 76 20 3d 20 4e 55 4c 4c 3b 0a  ue * jv = NULL;.
e860: 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 20 2a 20    cson_object * 
e870: 6a 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 73 6f  jo = NULL;.  cso
e880: 6e 5f 76 61 6c 75 65 20 2a 20 6a 76 32 20 3d 20  n_value * jv2 = 
e890: 4e 55 4c 4c 3b 0a 20 20 63 73 6f 6e 5f 6f 62 6a  NULL;.  cson_obj
e8a0: 65 63 74 20 2a 20 6a 6f 32 20 3d 20 4e 55 4c 4c  ect * jo2 = NULL
e8b0: 3b 0a 20 20 63 68 61 72 20 2a 20 7a 54 6d 70 20  ;.  char * zTmp 
e8c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 69 66 28 20 21 67  = NULL;.  if( !g
e8d0: 2e 70 65 72 6d 2e 52 65 61 64 20 29 7b 0a 20 20  .perm.Read ){.  
e8e0: 20 20 6a 73 6f 6e 5f 73 65 74 5f 65 72 72 28 46    json_set_err(F
e8f0: 53 4c 5f 4a 53 4f 4e 5f 45 5f 44 45 4e 49 45 44  SL_JSON_E_DENIED
e900: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e910: 20 20 20 22 52 65 71 75 69 72 65 73 20 27 6f 27     "Requires 'o'
e920: 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 22 29 3b   permissions.");
e930: 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
e940: 3b 0a 20 20 7d 0a 20 20 66 75 6c 6c 20 3d 20 6a  ;.  }.  full = j
e950: 73 6f 6e 5f 66 69 6e 64 5f 6f 70 74 69 6f 6e 5f  son_find_option_
e960: 62 6f 6f 6c 28 22 66 75 6c 6c 22 2c 4e 55 4c 4c  bool("full",NULL
e970: 2c 22 66 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ,"f",.          
e980: 20 20 20 20 6a 73 6f 6e 5f 66 69 6e 64 5f 6f 70      json_find_op
e990: 74 69 6f 6e 5f 62 6f 6f 6c 28 22 76 65 72 62 6f  tion_bool("verbo
e9a0: 73 65 22 2c 4e 55 4c 4c 2c 22 76 22 2c 30 29 29  se",NULL,"v",0))
e9b0: 3b 0a 23 64 65 66 69 6e 65 20 53 45 54 42 55 46  ;.#define SETBUF
e9c0: 28 4f 2c 4b 29 20 63 73 6f 6e 5f 6f 62 6a 65 63  (O,K) cson_objec
e9d0: 74 5f 73 65 74 28 4f 2c 20 4b 2c 20 63 73 6f 6e  t_set(O, K, cson
e9e0: 5f 76 61 6c 75 65 5f 6e 65 77 5f 73 74 72 69 6e  _value_new_strin
e9f0: 67 28 7a 42 75 66 2c 20 73 74 72 6c 65 6e 28 7a  g(zBuf, strlen(z
ea00: 42 75 66 29 29 29 3b 0a 0a 20 20 6a 76 20 3d 20  Buf)));..  jv = 
ea10: 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 6f  cson_value_new_o
ea20: 62 6a 65 63 74 28 29 3b 0a 20 20 6a 6f 20 3d 20  bject();.  jo = 
ea30: 63 73 6f 6e 5f 76 61 6c 75 65 5f 67 65 74 5f 6f  cson_value_get_o
ea40: 62 6a 65 63 74 28 6a 76 29 3b 0a 0a 20 20 7a 54  bject(jv);..  zT
ea50: 6d 70 20 3d 20 64 62 5f 67 65 74 28 22 70 72 6f  mp = db_get("pro
ea60: 6a 65 63 74 2d 6e 61 6d 65 22 2c 4e 55 4c 4c 29  ject-name",NULL)
ea70: 3b 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f  ;.  cson_object_
ea80: 73 65 74 28 6a 6f 2c 20 22 70 72 6f 6a 65 63 74  set(jo, "project
ea90: 4e 61 6d 65 22 2c 20 6a 73 6f 6e 5f 6e 65 77 5f  Name", json_new_
eaa0: 73 74 72 69 6e 67 28 7a 54 6d 70 29 29 3b 0a 20  string(zTmp));. 
eab0: 20 66 72 65 65 28 7a 54 6d 70 29 3b 0a 20 20 7a   free(zTmp);.  z
eac0: 54 6d 70 20 3d 20 64 62 5f 67 65 74 28 22 70 72  Tmp = db_get("pr
ead0: 6f 6a 65 63 74 2d 64 65 73 63 72 69 70 74 69 6f  oject-descriptio
eae0: 6e 22 2c 4e 55 4c 4c 29 3b 0a 20 20 63 73 6f 6e  n",NULL);.  cson
eaf0: 5f 6f 62 6a 65 63 74 5f 73 65 74 28 6a 6f 2c 20  _object_set(jo, 
eb00: 22 70 72 6f 6a 65 63 74 44 65 73 63 72 69 70 74  "projectDescript
eb10: 69 6f 6e 22 2c 20 6a 73 6f 6e 5f 6e 65 77 5f 73  ion", json_new_s
eb20: 74 72 69 6e 67 28 7a 54 6d 70 29 29 3b 0a 20 20  tring(zTmp));.  
eb30: 66 72 65 65 28 7a 54 6d 70 29 3b 0a 20 20 7a 54  free(zTmp);.  zT
eb40: 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 66 73 69  mp = NULL;.  fsi
eb50: 7a 65 20 3d 20 66 69 6c 65 5f 73 69 7a 65 28 67  ze = file_size(g
eb60: 2e 7a 52 65 70 6f 73 69 74 6f 72 79 4e 61 6d 65  .zRepositoryName
eb70: 29 3b 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74  );.  cson_object
eb80: 5f 73 65 74 28 6a 6f 2c 20 22 72 65 70 6f 73 69  _set(jo, "reposi
eb90: 74 6f 72 79 53 69 7a 65 22 2c 20 63 73 6f 6e 5f  torySize", cson_
eba0: 76 61 6c 75 65 5f 6e 65 77 5f 69 6e 74 65 67 65  value_new_intege
ebb0: 72 28 28 63 73 6f 6e 5f 69 6e 74 5f 74 29 66 73  r((cson_int_t)fs
ebc0: 69 7a 65 29 29 3b 0a 0a 20 20 69 66 28 66 75 6c  ize));..  if(ful
ebd0: 6c 29 7b 0a 20 20 20 20 6e 20 3d 20 64 62 5f 69  l){.    n = db_i
ebe0: 6e 74 28 30 2c 20 22 53 45 4c 45 43 54 20 63 6f  nt(0, "SELECT co
ebf0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 62 6c 6f 62  unt(*) FROM blob
ec00: 22 29 3b 0a 20 20 20 20 6d 20 3d 20 64 62 5f 69  ");.    m = db_i
ec10: 6e 74 28 30 2c 20 22 53 45 4c 45 43 54 20 63 6f  nt(0, "SELECT co
ec20: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 64 65 6c 74  unt(*) FROM delt
ec30: 61 22 29 3b 0a 20 20 20 20 63 73 6f 6e 5f 6f 62  a");.    cson_ob
ec40: 6a 65 63 74 5f 73 65 74 28 6a 6f 2c 20 22 62 6c  ject_set(jo, "bl
ec50: 6f 62 43 6f 75 6e 74 22 2c 20 63 73 6f 6e 5f 76  obCount", cson_v
ec60: 61 6c 75 65 5f 6e 65 77 5f 69 6e 74 65 67 65 72  alue_new_integer
ec70: 28 28 63 73 6f 6e 5f 69 6e 74 5f 74 29 6e 29 29  ((cson_int_t)n))
ec80: 3b 0a 20 20 20 20 63 73 6f 6e 5f 6f 62 6a 65 63  ;.    cson_objec
ec90: 74 5f 73 65 74 28 6a 6f 2c 20 22 64 65 6c 74 61  t_set(jo, "delta
eca0: 43 6f 75 6e 74 22 2c 20 63 73 6f 6e 5f 76 61 6c  Count", cson_val
ecb0: 75 65 5f 6e 65 77 5f 69 6e 74 65 67 65 72 28 28  ue_new_integer((
ecc0: 63 73 6f 6e 5f 69 6e 74 5f 74 29 6d 29 29 3b 0a  cson_int_t)m));.
ecd0: 20 20 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20      if( n>0 ){. 
ece0: 20 20 20 20 20 69 6e 74 20 61 2c 20 62 3b 0a 20       int a, b;. 
ecf0: 20 20 20 20 20 53 74 6d 74 20 71 3b 0a 20 20 20       Stmt q;.   
ed00: 20 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71     db_prepare(&q
ed10: 2c 20 22 53 45 4c 45 43 54 20 74 6f 74 61 6c 28  , "SELECT total(
ed20: 73 69 7a 65 29 2c 20 61 76 67 28 73 69 7a 65 29  size), avg(size)
ed30: 2c 20 6d 61 78 28 73 69 7a 65 29 22 0a 20 20 20  , max(size)".   
ed40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
ed50: 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20  FROM blob WHERE 
ed60: 73 69 7a 65 3e 30 22 29 3b 0a 20 20 20 20 20 20  size>0");.      
ed70: 64 62 5f 73 74 65 70 28 26 71 29 3b 0a 20 20 20  db_step(&q);.   
ed80: 20 20 20 74 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e     t = db_column
ed90: 5f 69 6e 74 36 34 28 26 71 2c 20 30 29 3b 0a 20  _int64(&q, 0);. 
eda0: 20 20 20 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74       cson_object
edb0: 5f 73 65 74 28 6a 6f 2c 20 22 75 6e 63 6f 6d 70  _set(jo, "uncomp
edc0: 72 65 73 73 65 64 41 72 74 69 66 61 63 74 53 69  ressedArtifactSi
edd0: 7a 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ze",.           
ede0: 20 20 20 20 20 20 20 20 20 20 20 63 73 6f 6e 5f             cson_
edf0: 76 61 6c 75 65 5f 6e 65 77 5f 69 6e 74 65 67 65  value_new_intege
ee00: 72 28 28 63 73 6f 6e 5f 69 6e 74 5f 74 29 74 29  r((cson_int_t)t)
ee10: 29 3b 0a 20 20 20 20 20 20 63 73 6f 6e 5f 6f 62  );.      cson_ob
ee20: 6a 65 63 74 5f 73 65 74 28 6a 6f 2c 20 22 61 76  ject_set(jo, "av
ee30: 65 72 61 67 65 41 72 74 69 66 61 63 74 53 69 7a  erageArtifactSiz
ee40: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
ee50: 20 20 20 20 20 20 20 20 20 20 63 73 6f 6e 5f 76            cson_v
ee60: 61 6c 75 65 5f 6e 65 77 5f 69 6e 74 65 67 65 72  alue_new_integer
ee70: 28 28 63 73 6f 6e 5f 69 6e 74 5f 74 29 64 62 5f  ((cson_int_t)db_
ee80: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 31  column_int(&q, 1
ee90: 29 29 29 3b 0a 20 20 20 20 20 20 63 73 6f 6e 5f  )));.      cson_
eea0: 6f 62 6a 65 63 74 5f 73 65 74 28 6a 6f 2c 20 22  object_set(jo, "
eeb0: 6d 61 78 41 72 74 69 66 61 63 74 53 69 7a 65 22  maxArtifactSize"
eec0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
eed0: 20 20 20 20 20 20 20 20 63 73 6f 6e 5f 76 61 6c          cson_val
eee0: 75 65 5f 6e 65 77 5f 69 6e 74 65 67 65 72 28 28  ue_new_integer((
eef0: 63 73 6f 6e 5f 69 6e 74 5f 74 29 64 62 5f 63 6f  cson_int_t)db_co
ef00: 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 32 29 29  lumn_int(&q, 2))
ef10: 29 3b 0a 20 20 20 20 20 20 64 62 5f 66 69 6e 61  );.      db_fina
ef20: 6c 69 7a 65 28 26 71 29 3b 0a 20 20 20 20 20 20  lize(&q);.      
ef30: 69 66 28 20 74 2f 66 73 69 7a 65 20 3c 20 35 20  if( t/fsize < 5 
ef40: 29 7b 0a 20 20 20 20 20 20 20 20 62 20 3d 20 31  ){.        b = 1
ef50: 30 3b 0a 20 20 20 20 20 20 20 20 66 73 69 7a 65  0;.        fsize
ef60: 20 2f 3d 20 31 30 3b 0a 20 20 20 20 20 20 7d 65   /= 10;.      }e
ef70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 20 3d  lse{.        b =
ef80: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
ef90: 20 20 61 20 3d 20 74 2f 66 73 69 7a 65 3b 0a 20    a = t/fsize;. 
efa0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
efb0: 72 69 6e 74 66 28 42 75 66 4c 65 6e 2c 7a 42 75  rintf(BufLen,zBu
efc0: 66 2c 20 22 25 64 3a 25 64 22 2c 20 61 2c 20 62  f, "%d:%d", a, b
efd0: 29 3b 0a 20 20 20 20 20 20 53 45 54 42 55 46 28  );.      SETBUF(
efe0: 6a 6f 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e  jo, "compression
eff0: 52 61 74 69 6f 22 29 3b 0a 20 20 20 20 7d 0a 20  Ratio");.    }. 
f000: 20 20 20 6e 20 3d 20 64 62 5f 69 6e 74 28 30 2c     n = db_int(0,
f010: 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 64   "SELECT count(d
f020: 69 73 74 69 6e 63 74 20 6d 69 64 29 20 46 52 4f  istinct mid) FRO
f030: 4d 20 6d 6c 69 6e 6b 20 2f 2a 73 63 61 6e 2a 2f  M mlink /*scan*/
f040: 22 29 3b 0a 20 20 20 20 63 73 6f 6e 5f 6f 62 6a  ");.    cson_obj
f050: 65 63 74 5f 73 65 74 28 6a 6f 2c 20 22 63 68 65  ect_set(jo, "che
f060: 63 6b 69 6e 43 6f 75 6e 74 22 2c 20 63 73 6f 6e  ckinCount", cson
f070: 5f 76 61 6c 75 65 5f 6e 65 77 5f 69 6e 74 65 67  _value_new_integ
f080: 65 72 28 28 63 73 6f 6e 5f 69 6e 74 5f 74 29 6e  er((cson_int_t)n
f090: 29 29 3b 0a 20 20 20 20 6e 20 3d 20 64 62 5f 69  ));.    n = db_i
f0a0: 6e 74 28 30 2c 20 22 53 45 4c 45 43 54 20 63 6f  nt(0, "SELECT co
f0b0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 66 69 6c 65  unt(*) FROM file
f0c0: 6e 61 6d 65 20 2f 2a 73 63 61 6e 2a 2f 22 29 3b  name /*scan*/");
f0d0: 0a 20 20 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74  .    cson_object
f0e0: 5f 73 65 74 28 6a 6f 2c 20 22 66 69 6c 65 43 6f  _set(jo, "fileCo
f0f0: 75 6e 74 22 2c 20 63 73 6f 6e 5f 76 61 6c 75 65  unt", cson_value
f100: 5f 6e 65 77 5f 69 6e 74 65 67 65 72 28 28 63 73  _new_integer((cs
f110: 6f 6e 5f 69 6e 74 5f 74 29 6e 29 29 3b 0a 20 20  on_int_t)n));.  
f120: 20 20 6e 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20    n = db_int(0, 
f130: 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
f140: 20 46 52 4f 4d 20 74 61 67 20 20 2f 2a 73 63 61   FROM tag  /*sca
f150: 6e 2a 2f 22 0a 20 20 20 20 20 20 20 20 20 20 20  n*/".           
f160: 20 20 20 20 22 20 57 48 45 52 45 20 2b 74 61 67      " WHERE +tag
f170: 6e 61 6d 65 20 47 4c 4f 42 20 27 77 69 6b 69 2d  name GLOB 'wiki-
f180: 2a 27 22 29 3b 0a 20 20 20 20 63 73 6f 6e 5f 6f  *'");.    cson_o
f190: 62 6a 65 63 74 5f 73 65 74 28 6a 6f 2c 20 22 77  bject_set(jo, "w
f1a0: 69 6b 69 50 61 67 65 43 6f 75 6e 74 22 2c 20 63  ikiPageCount", c
f1b0: 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 69 6e  son_value_new_in
f1c0: 74 65 67 65 72 28 28 63 73 6f 6e 5f 69 6e 74 5f  teger((cson_int_
f1d0: 74 29 6e 29 29 3b 0a 20 20 20 20 6e 20 3d 20 64  t)n));.    n = d
f1e0: 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c 45 43 54  b_int(0, "SELECT
f1f0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
f200: 61 67 20 20 2f 2a 73 63 61 6e 2a 2f 22 0a 20 20  ag  /*scan*/".  
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
f220: 48 45 52 45 20 2b 74 61 67 6e 61 6d 65 20 47 4c  HERE +tagname GL
f230: 4f 42 20 27 74 6b 74 2d 2a 27 22 29 3b 0a 20 20  OB 'tkt-*'");.  
f240: 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65    cson_object_se
f250: 74 28 6a 6f 2c 20 22 74 69 63 6b 65 74 43 6f 75  t(jo, "ticketCou
f260: 6e 74 22 2c 20 63 73 6f 6e 5f 76 61 6c 75 65 5f  nt", cson_value_
f270: 6e 65 77 5f 69 6e 74 65 67 65 72 28 28 63 73 6f  new_integer((cso
f280: 6e 5f 69 6e 74 5f 74 29 6e 29 29 3b 0a 20 20 7d  n_int_t)n));.  }
f290: 2f 2a 66 75 6c 6c 2a 2f 0a 20 20 6e 20 3d 20 64  /*full*/.  n = d
f2a0: 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c 45 43 54  b_int(0, "SELECT
f2b0: 20 6a 75 6c 69 61 6e 64 61 79 28 27 6e 6f 77 27   julianday('now'
f2c0: 29 20 2d 20 28 53 45 4c 45 43 54 20 6d 69 6e 28  ) - (SELECT min(
f2d0: 6d 74 69 6d 65 29 20 46 52 4f 4d 20 65 76 65 6e  mtime) FROM even
f2e0: 74 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)".            
f2f0: 20 20 20 20 22 20 2b 20 30 2e 39 39 22 29 3b 0a      " + 0.99");.
f300: 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65    cson_object_se
f310: 74 28 6a 6f 2c 20 22 61 67 65 44 61 79 73 22 2c  t(jo, "ageDays",
f320: 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f   cson_value_new_
f330: 69 6e 74 65 67 65 72 28 28 63 73 6f 6e 5f 69 6e  integer((cson_in
f340: 74 5f 74 29 6e 29 29 3b 0a 20 20 63 73 6f 6e 5f  t_t)n));.  cson_
f350: 6f 62 6a 65 63 74 5f 73 65 74 28 6a 6f 2c 20 22  object_set(jo, "
f360: 61 67 65 59 65 61 72 73 22 2c 20 63 73 6f 6e 5f  ageYears", cson_
f370: 76 61 6c 75 65 5f 6e 65 77 5f 64 6f 75 62 6c 65  value_new_double
f380: 28 6e 2f 33 36 35 2e 32 34 32 35 29 29 3b 0a 20  (n/365.2425));. 
f390: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
f3a0: 66 28 42 75 66 4c 65 6e 2c 20 7a 42 75 66 2c 20  f(BufLen, zBuf, 
f3b0: 64 62 5f 67 65 74 28 22 70 72 6f 6a 65 63 74 2d  db_get("project-
f3c0: 63 6f 64 65 22 2c 22 22 29 29 3b 0a 20 20 53 45  code",""));.  SE
f3d0: 54 42 55 46 28 6a 6f 2c 20 22 70 72 6f 6a 65 63  TBUF(jo, "projec
f3e0: 74 43 6f 64 65 22 29 3b 0a 20 20 63 73 6f 6e 5f  tCode");.  cson_
f3f0: 6f 62 6a 65 63 74 5f 73 65 74 28 6a 6f 2c 20 22  object_set(jo, "
f400: 63 6f 6d 70 69 6c 65 72 22 2c 20 63 73 6f 6e 5f  compiler", cson_
f410: 76 61 6c 75 65 5f 6e 65 77 5f 73 74 72 69 6e 67  value_new_string
f420: 28 43 4f 4d 50 49 4c 45 52 5f 4e 41 4d 45 2c 20  (COMPILER_NAME, 
f430: 73 74 72 6c 65 6e 28 43 4f 4d 50 49 4c 45 52 5f  strlen(COMPILER_
f440: 4e 41 4d 45 29 29 29 3b 0a 0a 20 20 6a 76 32 20  NAME)));..  jv2 
f450: 3d 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77  = cson_value_new
f460: 5f 6f 62 6a 65 63 74 28 29 3b 0a 20 20 6a 6f 32  _object();.  jo2
f470: 20 3d 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 67 65   = cson_value_ge
f480: 74 5f 6f 62 6a 65 63 74 28 6a 76 32 29 3b 0a 20  t_object(jv2);. 
f490: 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65 74   cson_object_set
f4a0: 28 6a 6f 2c 20 22 73 71 6c 69 74 65 22 2c 20 6a  (jo, "sqlite", j
f4b0: 76 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  v2);.  sqlite3_s
f4c0: 6e 70 72 69 6e 74 66 28 42 75 66 4c 65 6e 2c 20  nprintf(BufLen, 
f4d0: 7a 42 75 66 2c 20 22 25 2e 31 39 73 20 5b 25 2e  zBuf, "%.19s [%.
f4e0: 31 30 73 5d 20 28 25 73 29 22 2c 0a 20 20 20 20  10s] (%s)",.    
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
f500: 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
f510: 29 2c 20 26 73 71 6c 69 74 65 33 5f 73 6f 75 72  ), &sqlite3_sour
f520: 63 65 69 64 28 29 5b 32 30 5d 2c 20 73 71 6c 69  ceid()[20], sqli
f530: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29  te3_libversion()
f540: 29 3b 0a 20 20 53 45 54 42 55 46 28 6a 6f 32 2c  );.  SETBUF(jo2,
f550: 20 22 76 65 72 73 69 6f 6e 22 29 3b 0a 20 20 7a   "version");.  z
f560: 44 62 20 3d 20 64 62 5f 6e 61 6d 65 28 22 72 65  Db = db_name("re
f570: 70 6f 73 69 74 6f 72 79 22 29 3b 0a 20 20 63 73  pository");.  cs
f580: 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 6a 6f  on_object_set(jo
f590: 32 2c 20 22 70 61 67 65 43 6f 75 6e 74 22 2c 20  2, "pageCount", 
f5a0: 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 69  cson_value_new_i
f5b0: 6e 74 65 67 65 72 28 28 63 73 6f 6e 5f 69 6e 74  nteger((cson_int
f5c0: 5f 74 29 64 62 5f 69 6e 74 28 30 2c 20 22 50 52  _t)db_int(0, "PR
f5d0: 41 47 4d 41 20 5c 22 25 77 5c 22 2e 70 61 67 65  AGMA \"%w\".page
f5e0: 5f 63 6f 75 6e 74 22 2c 20 7a 44 62 29 29 29 3b  _count", zDb)));
f5f0: 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73  .  cson_object_s
f600: 65 74 28 6a 6f 32 2c 20 22 70 61 67 65 53 69 7a  et(jo2, "pageSiz
f610: 65 22 2c 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e  e", cson_value_n
f620: 65 77 5f 69 6e 74 65 67 65 72 28 28 63 73 6f 6e  ew_integer((cson
f630: 5f 69 6e 74 5f 74 29 64 62 5f 69 6e 74 28 30 2c  _int_t)db_int(0,
f640: 20 22 50 52 41 47 4d 41 20 5c 22 25 77 5c 22 2e   "PRAGMA \"%w\".
f650: 70 61 67 65 5f 73 69 7a 65 22 2c 20 7a 44 62 29  page_size", zDb)
f660: 29 29 3b 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63  ));.  cson_objec
f670: 74 5f 73 65 74 28 6a 6f 32 2c 20 22 66 72 65 65  t_set(jo2, "free
f680: 4c 69 73 74 22 2c 20 63 73 6f 6e 5f 76 61 6c 75  List", cson_valu
f690: 65 5f 6e 65 77 5f 69 6e 74 65 67 65 72 28 28 63  e_new_integer((c
f6a0: 73 6f 6e 5f 69 6e 74 5f 74 29 64 62 5f 69 6e 74  son_int_t)db_int
f6b0: 28 30 2c 20 22 50 52 41 47 4d 41 20 5c 22 25 77  (0, "PRAGMA \"%w
f6c0: 5c 22 2e 66 72 65 65 6c 69 73 74 5f 63 6f 75 6e  \".freelist_coun
f6d0: 74 22 2c 20 7a 44 62 29 29 29 3b 0a 20 20 73 71  t", zDb)));.  sq
f6e0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 42  lite3_snprintf(B
f6f0: 75 66 4c 65 6e 2c 20 7a 42 75 66 2c 20 22 25 73  ufLen, zBuf, "%s
f700: 22 2c 20 64 62 5f 74 65 78 74 28 30 2c 20 22 50  ", db_text(0, "P
f710: 52 41 47 4d 41 20 5c 22 25 77 5c 22 2e 65 6e 63  RAGMA \"%w\".enc
f720: 6f 64 69 6e 67 22 2c 20 7a 44 62 29 29 3b 0a 20  oding", zDb));. 
f730: 20 53 45 54 42 55 46 28 6a 6f 32 2c 20 22 65 6e   SETBUF(jo2, "en
f740: 63 6f 64 69 6e 67 22 29 3b 0a 20 20 73 71 6c 69  coding");.  sqli
f750: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 42 75 66  te3_snprintf(Buf
f760: 4c 65 6e 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c  Len, zBuf, "%s",
f770: 20 64 62 5f 74 65 78 74 28 30 2c 20 22 50 52 41   db_text(0, "PRA
f780: 47 4d 41 20 5c 22 25 77 5c 22 2e 6a 6f 75 72 6e  GMA \"%w\".journ
f790: 61 6c 5f 6d 6f 64 65 22 2c 20 7a 44 62 29 29 3b  al_mode", zDb));
f7a0: 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73  .  cson_object_s
f7b0: 65 74 28 6a 6f 32 2c 20 22 6a 6f 75 72 6e 61 6c  et(jo2, "journal
f7c0: 4d 6f 64 65 22 2c 20 2a 7a 42 75 66 20 3f 20 63  Mode", *zBuf ? c
f7d0: 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 73 74  son_value_new_st
f7e0: 72 69 6e 67 28 7a 42 75 66 2c 20 73 74 72 6c 65  ring(zBuf, strle
f7f0: 6e 28 7a 42 75 66 29 29 20 3a 20 63 73 6f 6e 5f  n(zBuf)) : cson_
f800: 76 61 6c 75 65 5f 6e 75 6c 6c 28 29 29 3b 0a 20  value_null());. 
f810: 20 72 65 74 75 72 6e 20 6a 76 3b 0a 23 75 6e 64   return jv;.#und
f820: 65 66 20 53 45 54 42 55 46 0a 7d 0a 0a 0a 0a 0a  ef SETBUF.}.....
f830: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 73 20 61 20  /*.** Creates a 
f840: 63 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 20  comma-separated 
f850: 6c 69 73 74 20 6f 66 20 63 6f 6d 6d 61 6e 64 20  list of command 
f860: 6e 61 6d 65 73 0a 2a 2a 20 74 61 6b 65 6e 20 66  names.** taken f
f870: 72 6f 6d 20 7a 50 61 67 65 73 2e 20 7a 50 61 67  rom zPages. zPag
f880: 65 73 20 6d 75 73 74 20 62 65 20 61 6e 20 61 72  es must be an ar
f890: 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 0a 2a  ray of objects.*
f8a0: 2a 20 77 68 6f 73 65 20 66 69 6e 61 6c 20 65 6e  * whose final en
f8b0: 74 72 79 20 4d 55 53 54 20 68 61 76 65 20 61 20  try MUST have a 
f8c0: 4e 55 4c 4c 20 6e 61 6d 65 20 76 61 6c 75 65 20  NULL name value 
f8d0: 6f 72 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72  or results.** ar
f8e0: 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  e undefined..**.
f8f0: 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 61  ** The list is a
f900: 70 70 65 6e 64 65 64 20 74 6f 20 70 4f 75 74 2e  ppended to pOut.
f910: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   The number of i
f920: 74 65 6d 73 20 28 6e 6f 74 20 62 79 74 65 73 29  tems (not bytes)
f930: 0a 2a 2a 20 61 70 70 65 6e 64 65 64 20 61 72 65  .** appended are
f940: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 66 69   returned. If fi
f950: 6c 74 65 72 42 79 4d 6f 64 65 20 69 73 20 6e 6f  lterByMode is no
f960: 6e 2d 30 20 74 68 65 6e 20 74 68 65 20 72 65 73  n-0 then the res
f970: 75 6c 74 0a 2a 2a 20 6c 69 73 74 20 77 69 6c 6c  ult.** list will
f980: 20 63 6f 6e 74 61 69 6e 20 6f 6e 6c 79 20 63 6f   contain only co
f990: 6d 6d 61 6e 64 73 20 77 68 69 63 68 20 61 72 65  mmands which are
f9a0: 20 61 62 6c 65 20 74 6f 20 72 75 6e 20 69 6e 20   able to run in 
f9b0: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 72  the.** current r
f9c0: 75 6e 20 6d 6f 64 65 20 28 43 4c 49 20 76 73 2e  un mode (CLI vs.
f9d0: 20 48 54 54 50 29 2e 0a 2a 2f 0a 73 74 61 74 69   HTTP)..*/.stati
f9e0: 63 20 69 6e 74 20 6a 73 6f 6e 5f 70 61 67 65 64  c int json_paged
f9f0: 65 66 73 5f 74 6f 5f 73 74 72 69 6e 67 28 4a 73  efs_to_string(Js
fa00: 6f 6e 50 61 67 65 44 65 66 20 63 6f 6e 73 74 20  onPageDef const 
fa10: 2a 20 7a 50 61 67 65 73 2c 0a 20 20 20 20 20 20  * zPages,.      
fa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 42 6c 6f               Blo
fa40: 62 20 2a 20 70 4f 75 74 2c 20 69 6e 74 20 66 69  b * pOut, int fi
fa50: 6c 74 65 72 42 79 4d 6f 64 65 29 7b 0a 20 20 69  lterByMode){.  i
fa60: 6e 74 20 69 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt i = 0;.  for(
fa70: 20 3b 20 7a 50 61 67 65 73 2d 3e 6e 61 6d 65 3b   ; zPages->name;
fa80: 20 2b 2b 7a 50 61 67 65 73 2c 20 2b 2b 69 20 29   ++zPages, ++i )
fa90: 7b 0a 20 20 20 20 69 66 28 66 69 6c 74 65 72 42  {.    if(filterB
faa0: 79 4d 6f 64 65 29 7b 0a 20 20 20 20 20 20 69 66  yMode){.      if
fab0: 28 67 2e 69 73 48 54 54 50 20 26 26 20 7a 50 61  (g.isHTTP && zPa
fac0: 67 65 73 2d 3e 72 75 6e 4d 6f 64 65 20 3c 20 30  ges->runMode < 0
fad0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
fae0: 20 20 65 6c 73 65 20 69 66 28 7a 50 61 67 65 73    else if(zPages
faf0: 2d 3e 72 75 6e 4d 6f 64 65 20 3e 20 30 29 20 63  ->runMode > 0) c
fb00: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
fb10: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70     blob_append(p
fb20: 4f 75 74 2c 20 7a 50 61 67 65 73 2d 3e 6e 61 6d  Out, zPages->nam
fb30: 65 2c 20 2d 31 29 3b 0a 20 20 20 20 69 66 28 28  e, -1);.    if((
fb40: 7a 50 61 67 65 73 2b 31 29 2d 3e 6e 61 6d 65 29  zPages+1)->name)
fb50: 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70  {.      blob_app
fb60: 65 6e 64 28 70 4f 75 74 2c 20 22 2c 20 22 2c 32  end(pOut, ", ",2
fb70: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
fb80: 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn i;.}../*.*
fb90: 2a 20 43 72 65 61 74 65 73 20 61 6e 20 65 72 72  * Creates an err
fba0: 6f 72 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67  or message using
fbb0: 20 7a 45 72 72 50 72 65 66 69 78 20 61 6e 64 20   zErrPrefix and 
fbc0: 74 68 65 20 67 69 76 65 6e 20 61 72 72 61 79 20  the given array 
fbd0: 6f 66 0a 2a 2a 20 4a 53 4f 4e 20 63 6f 6d 6d 61  of.** JSON comma
fbe0: 6e 64 20 64 65 66 69 6e 69 74 69 6f 6e 73 2c 20  nd definitions, 
fbf0: 61 6e 64 20 73 65 74 73 20 74 68 65 20 67 2e 6a  and sets the g.j
fc00: 73 6f 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20  son error state 
fc10: 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20 46 53  to.** reflect FS
fc20: 4c 5f 4a 53 4f 4e 5f 45 5f 4d 49 53 53 49 4e 47  L_JSON_E_MISSING
fc30: 5f 41 52 47 53 2e 20 49 66 20 7a 45 72 72 50 72  _ARGS. If zErrPr
fc40: 65 66 69 78 20 69 73 20 4e 55 4c 4c 20 74 68 65  efix is NULL the
fc50: 6e 0a 2a 2a 20 73 6f 6d 65 20 64 65 66 61 75 6c  n.** some defaul
fc60: 74 20 69 73 20 75 73 65 64 20 28 65 2e 67 2e 20  t is used (e.g. 
fc70: 22 54 72 79 20 6f 6e 65 20 6f 66 3a 20 22 29 2e  "Try one of: ").
fc80: 20 49 66 20 69 74 20 69 73 20 22 22 20 74 68 65   If it is "" the
fc90: 6e 0a 2a 2a 20 6e 6f 20 70 72 65 66 69 78 20 69  n.** no prefix i
fca0: 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s used..**.** Th
fcb0: 65 20 69 6e 74 65 6e 74 69 6f 6e 20 69 73 20 74  e intention is t
fcc0: 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 75 73  o provide the us
fcd0: 65 72 20 28 76 69 61 20 74 68 65 20 72 65 73 70  er (via the resp
fce0: 6f 6e 73 65 2e 72 65 73 75 6c 74 54 65 78 74 29  onse.resultText)
fcf0: 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20 61 76  .** a list of av
fd00: 61 69 6c 61 62 6c 65 20 63 6f 6d 6d 61 6e 64 73  ailable commands
fd10: 2f 73 75 62 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2a  /subcommands..**
fd20: 0a 2a 2f 0a 76 6f 69 64 20 6a 73 6f 6e 5f 64 69  .*/.void json_di
fd30: 73 70 61 74 63 68 5f 6d 69 73 73 69 6e 67 5f 61  spatch_missing_a
fd40: 72 67 73 5f 65 72 72 28 20 4a 73 6f 6e 50 61 67  rgs_err( JsonPag
fd50: 65 44 65 66 20 63 6f 6e 73 74 20 2a 20 70 43 6f  eDef const * pCo
fd60: 6d 6d 61 6e 64 73 2c 0a 20 20 20 20 20 20 20 20  mmands,.        
fd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61               cha
fd90: 72 20 63 6f 6e 73 74 20 2a 20 7a 45 72 72 50 72  r const * zErrPr
fda0: 65 66 69 78 20 29 7b 0a 20 20 42 6c 6f 62 20 63  efix ){.  Blob c
fdb0: 6d 64 4e 61 6d 65 73 20 3d 20 65 6d 70 74 79 5f  mdNames = empty_
fdc0: 62 6c 6f 62 3b 0a 20 20 62 6c 6f 62 5f 69 6e 69  blob;.  blob_ini
fdd0: 74 28 26 63 6d 64 4e 61 6d 65 73 2c 4e 55 4c 4c  t(&cmdNames,NULL
fde0: 2c 30 29 3b 0a 20 20 69 66 28 20 21 7a 45 72 72  ,0);.  if( !zErr
fdf0: 50 72 65 66 69 78 20 29 20 7b 0a 20 20 20 20 7a  Prefix ) {.    z
fe00: 45 72 72 50 72 65 66 69 78 20 3d 20 22 54 72 79  ErrPrefix = "Try
fe10: 20 6f 6e 65 20 6f 66 3a 20 22 3b 0a 20 20 7d 0a   one of: ";.  }.
fe20: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 20 26    blob_append( &
fe30: 63 6d 64 4e 61 6d 65 73 2c 20 7a 45 72 72 50 72  cmdNames, zErrPr
fe40: 65 66 69 78 2c 20 73 74 72 6c 65 6e 28 7a 45 72  efix, strlen(zEr
fe50: 72 50 72 65 66 69 78 29 20 29 3b 0a 20 20 6a 73  rPrefix) );.  js
fe60: 6f 6e 5f 70 61 67 65 64 65 66 73 5f 74 6f 5f 73  on_pagedefs_to_s
fe70: 74 72 69 6e 67 28 70 43 6f 6d 6d 61 6e 64 73 2c  tring(pCommands,
fe80: 20 26 63 6d 64 4e 61 6d 65 73 2c 20 31 29 3b 0a   &cmdNames, 1);.
fe90: 20 20 6a 73 6f 6e 5f 73 65 74 5f 65 72 72 28 46    json_set_err(F
fea0: 53 4c 5f 4a 53 4f 4e 5f 45 5f 4d 49 53 53 49 4e  SL_JSON_E_MISSIN
feb0: 47 5f 41 52 47 53 2c 20 22 25 73 22 2c 0a 20 20  G_ARGS, "%s",.  
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
fed0: 62 5f 73 74 72 28 26 63 6d 64 4e 61 6d 65 73 29  b_str(&cmdNames)
fee0: 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28  );.  blob_reset(
fef0: 26 63 6d 64 4e 61 6d 65 73 29 3b 0a 7d 0a 0a 63  &cmdNames);.}..c
ff00: 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e  son_value * json
ff10: 5f 70 61 67 65 5f 64 69 73 70 61 74 63 68 5f 68  _page_dispatch_h
ff20: 65 6c 70 65 72 28 4a 73 6f 6e 50 61 67 65 44 65  elper(JsonPageDe
ff30: 66 20 63 6f 6e 73 74 20 2a 20 70 61 67 65 73 29  f const * pages)
ff40: 7b 0a 20 20 4a 73 6f 6e 50 61 67 65 44 65 66 20  {.  JsonPageDef 
ff50: 63 6f 6e 73 74 20 2a 20 64 65 66 3b 0a 20 20 63  const * def;.  c
ff60: 68 61 72 20 63 6f 6e 73 74 20 2a 20 63 6d 64 20  har const * cmd 
ff70: 3d 20 6a 73 6f 6e 5f 63 6f 6d 6d 61 6e 64 5f 61  = json_command_a
ff80: 72 67 28 31 2b 67 2e 6a 73 6f 6e 2e 64 69 73 70  rg(1+g.json.disp
ff90: 61 74 63 68 44 65 70 74 68 29 3b 0a 20 20 61 73  atchDepth);.  as
ffa0: 73 65 72 74 28 20 4e 55 4c 4c 20 21 3d 20 70 61  sert( NULL != pa
ffb0: 67 65 73 20 29 3b 0a 20 20 69 66 28 20 21 20 63  ges );.  if( ! c
ffc0: 6d 64 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 5f 64  md ){.    json_d
ffd0: 69 73 70 61 74 63 68 5f 6d 69 73 73 69 6e 67 5f  ispatch_missing_
ffe0: 61 72 67 73 5f 65 72 72 28 70 61 67 65 73 2c 0a  args_err(pages,.
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10010 20 20 20 22 4e 6f 20 73 75 62 63 6f 6d 6d 61 6e     "No subcomman
10020 64 20 73 70 65 63 69 66 69 65 64 2e 20 22 0a 20  d specified. ". 
10030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10050 20 20 22 54 72 79 20 6f 6e 65 20 6f 66 3a 20 22    "Try one of: "
10060 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 55  );.    return NU
10070 4c 4c 3b 0a 20 20 7d 0a 20 20 64 65 66 20 3d 20  LL;.  }.  def = 
10080 6a 73 6f 6e 5f 68 61 6e 64 6c 65 72 5f 66 6f 72  json_handler_for
10090 5f 6e 61 6d 65 28 20 63 6d 64 2c 20 70 61 67 65  _name( cmd, page
100a0 73 20 29 3b 0a 20 20 69 66 28 21 64 65 66 29 7b  s );.  if(!def){
100b0 0a 20 20 20 20 6a 73 6f 6e 5f 73 65 74 5f 65 72  .    json_set_er
100c0 72 28 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 55 4e 4b  r(FSL_JSON_E_UNK
100d0 4e 4f 57 4e 5f 43 4f 4d 4d 41 4e 44 2c 0a 20 20  NOWN_COMMAND,.  
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
100f0 55 6e 6b 6e 6f 77 6e 20 73 75 62 63 6f 6d 6d 61  Unknown subcomma
10100 6e 64 3a 20 25 73 22 2c 20 63 6d 64 29 3b 0a 20  nd: %s", cmd);. 
10110 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a     return NULL;.
10120 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20    }.  else{.    
10130 2b 2b 67 2e 6a 73 6f 6e 2e 64 69 73 70 61 74 63  ++g.json.dispatc
10140 68 44 65 70 74 68 3b 0a 20 20 20 20 72 65 74 75  hDepth;.    retu
10150 72 6e 20 28 2a 64 65 66 2d 3e 66 75 6e 63 29 28  rn (*def->func)(
10160 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
10170 20 49 6d 70 6c 20 6f 66 20 2f 6a 73 6f 6e 2f 72   Impl of /json/r
10180 65 62 75 69 6c 64 2e 20 52 65 71 75 69 72 65 73  ebuild. Requires
10190 20 61 64 6d 69 6e 20 70 72 69 76 69 6c 65 67 65   admin privilege
101a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 73 6f  s..*/.static cso
101b0 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 70  n_value * json_p
101c0 61 67 65 5f 72 65 62 75 69 6c 64 28 29 7b 0a 20  age_rebuild(){. 
101d0 20 69 66 28 20 21 67 2e 70 65 72 6d 2e 41 64 6d   if( !g.perm.Adm
101e0 69 6e 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 5f 73  in ){.    json_s
101f0 65 74 5f 65 72 72 28 46 53 4c 5f 4a 53 4f 4e 5f  et_err(FSL_JSON_
10200 45 5f 44 45 4e 49 45 44 2c 22 52 65 71 75 69 72  E_DENIED,"Requir
10210 65 73 20 27 61 27 20 70 72 69 76 69 6c 65 67 65  es 'a' privilege
10220 73 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  s.");.    return
10230 20 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a   NULL;.  }else{.
10240 20 20 2f 2a 20 52 65 6d 69 6e 64 65 72 3a 20 74    /* Reminder: t
10250 68 65 20 64 62 5f 78 78 78 28 29 20 6f 70 73 20  he db_xxx() ops 
10260 22 73 68 6f 75 6c 64 22 20 66 61 69 6c 20 76 69  "should" fail vi
10270 61 20 74 68 65 20 66 6f 73 73 69 6c 20 63 6f 72  a the fossil cor
10280 65 0a 20 20 20 20 20 65 72 72 6f 72 20 68 61 6e  e.     error han
10290 64 6c 65 72 73 2c 20 77 68 69 63 68 20 77 69 6c  dlers, which wil
102a0 6c 20 63 61 75 73 65 20 61 20 4a 53 4f 4e 20 65  l cause a JSON e
102b0 72 72 6f 72 20 61 6e 64 20 65 78 69 74 28 29 2e  rror and exit().
102c0 20 69 2e 65 2e 20 77 65 0a 20 20 20 20 20 64 6f   i.e. we.     do
102d0 6e 27 74 20 68 61 6e 64 6c 65 20 74 68 65 20 65  n't handle the e
102e0 72 72 6f 72 73 20 68 65 72 65 2e 20 54 4f 44 4f  rrors here. TODO
102f0 3a 20 63 6f 6e 66 69 72 6d 20 74 68 61 74 20 61  : confirm that a
10300 6c 6c 20 74 68 65 73 65 20 64 62 0a 20 20 20 20  ll these db.    
10310 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 20 67 72   routine fail gr
10320 61 63 65 66 75 6c 6c 79 20 69 6e 20 4a 53 4f 4e  acefully in JSON
10330 20 6d 6f 64 65 2e 0a 0a 20 20 20 20 20 4f 6e 20   mode...     On 
10340 6c 61 72 67 65 20 72 65 70 6f 73 20 28 65 2e 67  large repos (e.g
10350 2e 20 66 6f 73 73 69 6c 27 73 29 20 74 68 69 73  . fossil's) this
10360 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 6c 69   operation is li
10370 6b 65 6c 79 20 74 6f 20 74 61 6b 65 0a 20 20 20  kely to take.   
10380 20 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68    longer than th
10390 65 20 63 6c 69 65 6e 74 20 74 69 6d 65 6f 75 74  e client timeout
103a0 2c 20 77 68 69 63 68 20 77 69 6c 6c 20 63 61 75  , which will cau
103b0 73 65 20 69 74 20 74 6f 20 66 61 69 6c 20 28 62  se it to fail (b
103c0 75 74 0a 20 20 20 20 20 69 74 27 73 20 73 71 6c  ut.     it's sql
103d0 69 74 65 33 2c 20 73 6f 20 69 74 27 6c 6c 20 66  ite3, so it'll f
103e0 61 69 6c 20 67 72 61 63 65 66 75 6c 6c 79 29 2e  ail gracefully).
103f0 0a 20 20 2a 2f 0a 20 20 20 20 64 62 5f 63 6c 6f  .  */.    db_clo
10400 73 65 28 31 29 3b 0a 20 20 20 20 64 62 5f 6f 70  se(1);.    db_op
10410 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 67 2e  en_repository(g.
10420 7a 52 65 70 6f 73 69 74 6f 72 79 4e 61 6d 65 29  zRepositoryName)
10430 3b 0a 20 20 20 20 64 62 5f 62 65 67 69 6e 5f 74  ;.    db_begin_t
10440 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20  ransaction();.  
10450 20 20 72 65 62 75 69 6c 64 5f 64 62 28 30 2c 20    rebuild_db(0, 
10460 30 2c 20 30 29 3b 0a 20 20 20 20 64 62 5f 65 6e  0, 0);.    db_en
10470 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 30 29  d_transaction(0)
10480 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ;.    return NUL
10490 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  L;.  }.}../*.** 
104a0 49 6d 70 6c 20 6f 66 20 2f 6a 73 6f 6e 2f 67 2e  Impl of /json/g.
104b0 20 52 65 71 75 69 72 65 73 20 61 64 6d 69 6e 2f   Requires admin/
104c0 73 65 74 75 70 20 72 69 67 68 74 73 2e 0a 2a 2f  setup rights..*/
104d0 0a 73 74 61 74 69 63 20 63 73 6f 6e 5f 76 61 6c  .static cson_val
104e0 75 65 20 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f 67  ue * json_page_g
104f0 28 29 7b 0a 20 20 69 66 28 21 67 2e 70 65 72 6d  (){.  if(!g.perm
10500 2e 41 64 6d 69 6e 20 7c 7c 20 21 67 2e 70 65 72  .Admin || !g.per
10510 6d 2e 53 65 74 75 70 29 7b 0a 20 20 20 20 6a 73  m.Setup){.    js
10520 6f 6e 5f 73 65 74 5f 65 72 72 28 46 53 4c 5f 4a  on_set_err(FSL_J
10530 53 4f 4e 5f 45 5f 44 45 4e 49 45 44 2c 0a 20 20  SON_E_DENIED,.  
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
10550 52 65 71 75 69 72 65 73 20 27 61 27 20 6f 72 20  Requires 'a' or 
10560 27 73 27 20 70 72 69 76 69 6c 65 67 65 73 2e 22  's' privileges."
10570 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 55  );.    return NU
10580 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  LL;.  }.  return
10590 20 6a 73 6f 6e 5f 67 5f 74 6f 5f 6a 73 6f 6e 28   json_g_to_json(
105a0 29 3b 0a 7d 0a 0a 2f 2a 20 49 6d 70 6c 20 69 6e  );.}../* Impl in
105b0 20 6a 73 6f 6e 5f 6c 6f 67 69 6e 2e 63 2e 20 2a   json_login.c. *
105c0 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a  /.cson_value * j
105d0 73 6f 6e 5f 70 61 67 65 5f 61 6e 6f 6e 5f 70 61  son_page_anon_pa
105e0 73 73 77 6f 72 64 28 29 3b 0a 2f 2a 20 49 6d 70  ssword();./* Imp
105f0 6c 20 69 6e 20 6a 73 6f 6e 5f 61 72 74 69 66 61  l in json_artifa
10600 63 74 2e 63 2e 20 2a 2f 0a 63 73 6f 6e 5f 76 61  ct.c. */.cson_va
10610 6c 75 65 20 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f  lue * json_page_
10620 61 72 74 69 66 61 63 74 28 29 3b 0a 2f 2a 20 49  artifact();./* I
10630 6d 70 6c 20 69 6e 20 6a 73 6f 6e 5f 62 72 61 6e  mpl in json_bran
10640 63 68 2e 63 2e 20 2a 2f 0a 63 73 6f 6e 5f 76 61  ch.c. */.cson_va
10650 6c 75 65 20 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f  lue * json_page_
10660 62 72 61 6e 63 68 28 29 3b 0a 2f 2a 20 49 6d 70  branch();./* Imp
10670 6c 20 69 6e 20 6a 73 6f 6e 5f 64 69 66 66 2e 63  l in json_diff.c
10680 2e 20 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65 20  . */.cson_value 
10690 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f 64 69 66 66  * json_page_diff
106a0 28 29 3b 0a 2f 2a 20 49 6d 70 6c 20 69 6e 20 6a  ();./* Impl in j
106b0 73 6f 6e 5f 64 69 72 2e 63 2e 20 2a 2f 0a 63 73  son_dir.c. */.cs
106c0 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f  on_value * json_
106d0 70 61 67 65 5f 64 69 72 28 29 3b 0a 2f 2a 20 49  page_dir();./* I
106e0 6d 70 6c 20 69 6e 20 6a 73 6f 6e 5f 6c 6f 67 69  mpl in json_logi
106f0 6e 2e 63 2e 20 2a 2f 0a 63 73 6f 6e 5f 76 61 6c  n.c. */.cson_val
10700 75 65 20 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f 6c  ue * json_page_l
10710 6f 67 69 6e 28 29 3b 0a 2f 2a 20 49 6d 70 6c 20  ogin();./* Impl 
10720 69 6e 20 6a 73 6f 6e 5f 6c 6f 67 69 6e 2e 63 2e  in json_login.c.
10730 20 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65 20 2a   */.cson_value *
10740 20 6a 73 6f 6e 5f 70 61 67 65 5f 6c 6f 67 6f 75   json_page_logou
10750 74 28 29 3b 0a 2f 2a 20 49 6d 70 6c 20 69 6e 20  t();./* Impl in 
10760 6a 73 6f 6e 5f 71 75 65 72 79 2e 63 2e 20 2a 2f  json_query.c. */
10770 0a 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73  .cson_value * js
10780 6f 6e 5f 70 61 67 65 5f 71 75 65 72 79 28 29 3b  on_page_query();
10790 0a 2f 2a 20 49 6d 70 6c 20 69 6e 20 6a 73 6f 6e  ./* Impl in json
107a0 5f 72 65 70 6f 72 74 2e 63 2e 20 2a 2f 0a 63 73  _report.c. */.cs
107b0 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f  on_value * json_
107c0 70 61 67 65 5f 72 65 70 6f 72 74 28 29 3b 0a 2f  page_report();./
107d0 2a 20 49 6d 70 6c 20 69 6e 20 6a 73 6f 6e 5f 74  * Impl in json_t
107e0 61 67 2e 63 2e 20 2a 2f 0a 63 73 6f 6e 5f 76 61  ag.c. */.cson_va
107f0 6c 75 65 20 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f  lue * json_page_
10800 74 61 67 28 29 3b 0a 2f 2a 20 49 6d 70 6c 20 69  tag();./* Impl i
10810 6e 20 6a 73 6f 6e 5f 75 73 65 72 2e 63 2e 20 2a  n json_user.c. *
10820 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a  /.cson_value * j
10830 73 6f 6e 5f 70 61 67 65 5f 75 73 65 72 28 29 3b  son_page_user();
10840 0a 2f 2a 20 49 6d 70 6c 20 69 6e 20 6a 73 6f 6e  ./* Impl in json
10850 5f 63 6f 6e 66 69 67 2e 63 2e 20 2a 2f 0a 63 73  _config.c. */.cs
10860 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f  on_value * json_
10870 70 61 67 65 5f 63 6f 6e 66 69 67 28 29 3b 0a 2f  page_config();./
10880 2a 20 49 6d 70 6c 20 69 6e 20 6a 73 6f 6e 5f 66  * Impl in json_f
10890 69 6e 66 6f 2e 63 2e 20 2a 2f 0a 63 73 6f 6e 5f  info.c. */.cson_
108a0 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 70 61 67  value * json_pag
108b0 65 5f 66 69 6e 66 6f 28 29 3b 0a 2f 2a 20 49 6d  e_finfo();./* Im
108c0 70 6c 20 69 6e 20 6a 73 6f 6e 5f 73 74 61 74 75  pl in json_statu
108d0 73 2e 63 2e 20 2a 2f 0a 63 73 6f 6e 5f 76 61 6c  s.c. */.cson_val
108e0 75 65 20 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f 73  ue * json_page_s
108f0 74 61 74 75 73 28 29 3b 0a 0a 2f 2a 0a 2a 2a 20  tatus();../*.** 
10900 4d 61 70 70 69 6e 67 20 6f 66 20 6e 61 6d 65 73  Mapping of names
10910 20 74 6f 20 4a 53 4f 4e 20 70 61 67 65 73 2f 63   to JSON pages/c
10920 6f 6d 6d 61 6e 64 73 2e 20 20 45 61 63 68 20 6e  ommands.  Each n
10930 61 6d 65 20 69 73 20 61 20 73 75 62 70 61 74 68  ame is a subpath
10940 20 6f 66 0a 2a 2a 20 2f 6a 73 6f 6e 20 28 69 6e   of.** /json (in
10950 20 43 47 49 20 6d 6f 64 65 29 20 6f 72 20 61 20   CGI mode) or a 
10960 73 75 62 63 6f 6d 6d 61 6e 64 20 6f 66 20 74 68  subcommand of th
10970 65 20 6a 73 6f 6e 20 63 6f 6d 6d 61 6e 64 20 69  e json command i
10980 6e 20 43 4c 49 20 6d 6f 64 65 0a 2a 2f 0a 73 74  n CLI mode.*/.st
10990 61 74 69 63 20 63 6f 6e 73 74 20 4a 73 6f 6e 50  atic const JsonP
109a0 61 67 65 44 65 66 20 4a 73 6f 6e 50 61 67 65 44  ageDef JsonPageD
109b0 65 66 73 5b 5d 20 3d 20 7b 0a 2f 2a 20 70 6c 65  efs[] = {./* ple
109c0 61 73 65 20 6b 65 65 70 20 61 6c 70 68 61 62 65  ase keep alphabe
109d0 74 69 63 61 6c 6c 79 20 73 6f 72 74 65 64 20 28  tically sorted (
109e0 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65  case-insensitive
109f0 29 20 66 6f 72 20 6d 61 69 6e 74 65 6e 61 6e 63  ) for maintenanc
10a00 65 20 72 65 61 73 6f 6e 73 2e 20 2a 2f 0a 7b 22  e reasons. */.{"
10a10 61 6e 6f 6e 79 6d 6f 75 73 50 61 73 73 77 6f 72  anonymousPasswor
10a20 64 22 2c 20 6a 73 6f 6e 5f 70 61 67 65 5f 61 6e  d", json_page_an
10a30 6f 6e 5f 70 61 73 73 77 6f 72 64 2c 20 30 7d 2c  on_password, 0},
10a40 0a 7b 22 61 72 74 69 66 61 63 74 22 2c 20 6a 73  .{"artifact", js
10a50 6f 6e 5f 70 61 67 65 5f 61 72 74 69 66 61 63 74  on_page_artifact
10a60 2c 20 30 7d 2c 0a 7b 22 62 72 61 6e 63 68 22 2c  , 0},.{"branch",
10a70 20 6a 73 6f 6e 5f 70 61 67 65 5f 62 72 61 6e 63   json_page_branc
10a80 68 2c 30 7d 2c 0a 7b 22 63 61 70 22 2c 20 6a 73  h,0},.{"cap", js
10a90 6f 6e 5f 70 61 67 65 5f 63 61 70 2c 20 30 7d 2c  on_page_cap, 0},
10aa0 0a 7b 22 63 6f 6e 66 69 67 22 2c 20 6a 73 6f 6e  .{"config", json
10ab0 5f 70 61 67 65 5f 63 6f 6e 66 69 67 2c 20 30 20  _page_config, 0 
10ac0 7d 2c 0a 7b 22 64 69 66 66 22 2c 20 6a 73 6f 6e  },.{"diff", json
10ad0 5f 70 61 67 65 5f 64 69 66 66 2c 20 30 7d 2c 0a  _page_diff, 0},.
10ae0 7b 22 64 69 72 22 2c 20 6a 73 6f 6e 5f 70 61 67  {"dir", json_pag
10af0 65 5f 64 69 72 2c 20 30 7d 2c 0a 7b 22 66 69 6e  e_dir, 0},.{"fin
10b00 66 6f 22 2c 20 6a 73 6f 6e 5f 70 61 67 65 5f 66  fo", json_page_f
10b10 69 6e 66 6f 2c 20 30 7d 2c 0a 7b 22 67 22 2c 20  info, 0},.{"g", 
10b20 6a 73 6f 6e 5f 70 61 67 65 5f 67 2c 20 30 7d 2c  json_page_g, 0},
10b30 0a 7b 22 48 41 49 22 2c 6a 73 6f 6e 5f 70 61 67  .{"HAI",json_pag
10b40 65 5f 76 65 72 73 69 6f 6e 2c 30 7d 2c 0a 7b 22  e_version,0},.{"
10b50 6c 6f 67 69 6e 22 2c 6a 73 6f 6e 5f 70 61 67 65  login",json_page
10b60 5f 6c 6f 67 69 6e 2c 30 7d 2c 0a 7b 22 6c 6f 67  _login,0},.{"log
10b70 6f 75 74 22 2c 6a 73 6f 6e 5f 70 61 67 65 5f 6c  out",json_page_l
10b80 6f 67 6f 75 74 2c 30 7d 2c 0a 7b 22 71 75 65 72  ogout,0},.{"quer
10b90 79 22 2c 6a 73 6f 6e 5f 70 61 67 65 5f 71 75 65  y",json_page_que
10ba0 72 79 2c 30 7d 2c 0a 7b 22 72 65 62 75 69 6c 64  ry,0},.{"rebuild
10bb0 22 2c 6a 73 6f 6e 5f 70 61 67 65 5f 72 65 62 75  ",json_page_rebu
10bc0 69 6c 64 2c 30 7d 2c 0a 7b 22 72 65 70 6f 72 74  ild,0},.{"report
10bd0 22 2c 20 6a 73 6f 6e 5f 70 61 67 65 5f 72 65 70  ", json_page_rep
10be0 6f 72 74 2c 20 30 7d 2c 0a 7b 22 72 65 73 75 6c  ort, 0},.{"resul
10bf0 74 43 6f 64 65 73 22 2c 20 6a 73 6f 6e 5f 70 61  tCodes", json_pa
10c00 67 65 5f 72 65 73 75 6c 74 43 6f 64 65 73 2c 30  ge_resultCodes,0
10c10 7d 2c 0a 7b 22 73 74 61 74 22 2c 6a 73 6f 6e 5f  },.{"stat",json_
10c20 70 61 67 65 5f 73 74 61 74 2c 30 7d 2c 0a 7b 22  page_stat,0},.{"
10c30 73 74 61 74 75 73 22 2c 20 6a 73 6f 6e 5f 70 61  status", json_pa
10c40 67 65 5f 73 74 61 74 75 73 2c 20 30 7d 2c 0a 7b  ge_status, 0},.{
10c50 22 74 61 67 22 2c 20 6a 73 6f 6e 5f 70 61 67 65  "tag", json_page
10c60 5f 74 61 67 2c 30 7d 2c 0a 2f 2a 7b 22 74 69 63  _tag,0},./*{"tic
10c70 6b 65 74 22 2c 20 6a 73 6f 6e 5f 70 61 67 65 5f  ket", json_page_
10c80 6e 79 69 2c 30 7d 2c 2a 2f 0a 7b 22 74 69 6d 65  nyi,0},*/.{"time
10c90 6c 69 6e 65 22 2c 20 6a 73 6f 6e 5f 70 61 67 65  line", json_page
10ca0 5f 74 69 6d 65 6c 69 6e 65 2c 30 7d 2c 0a 7b 22  _timeline,0},.{"
10cb0 75 73 65 72 22 2c 6a 73 6f 6e 5f 70 61 67 65 5f  user",json_page_
10cc0 75 73 65 72 2c 30 7d 2c 0a 7b 22 76 65 72 73 69  user,0},.{"versi
10cd0 6f 6e 22 2c 6a 73 6f 6e 5f 70 61 67 65 5f 76 65  on",json_page_ve
10ce0 72 73 69 6f 6e 2c 30 7d 2c 0a 7b 22 77 68 6f 61  rsion,0},.{"whoa
10cf0 6d 69 22 2c 6a 73 6f 6e 5f 70 61 67 65 5f 77 68  mi",json_page_wh
10d00 6f 61 6d 69 2c 30 7d 2c 0a 7b 22 77 69 6b 69 22  oami,0},.{"wiki"
10d10 2c 6a 73 6f 6e 5f 70 61 67 65 5f 77 69 6b 69 2c  ,json_page_wiki,
10d20 30 7d 2c 0a 2f 2a 20 4c 61 73 74 20 65 6e 74 72  0},./* Last entr
10d30 79 20 4d 55 53 54 20 68 61 76 65 20 61 20 4e 55  y MUST have a NU
10d40 4c 4c 20 6e 61 6d 65 2e 20 2a 2f 0a 7b 4e 55 4c  LL name. */.{NUL
10d50 4c 2c 4e 55 4c 4c 2c 30 7d 0a 7d 3b 0a 0a 2f 2a  L,NULL,0}.};../*
10d60 0a 2a 2a 20 49 6e 74 65 72 6e 61 6c 20 68 65 6c  .** Internal hel
10d70 70 65 72 20 66 6f 72 20 6a 73 6f 6e 5f 63 6d 64  per for json_cmd
10d80 5f 74 6f 70 28 29 20 61 6e 64 20 6a 73 6f 6e 5f  _top() and json_
10d90 70 61 67 65 5f 74 6f 70 28 29 2e 0a 2a 2a 0a 2a  page_top()..**.*
10da0 2a 20 53 65 61 72 63 68 65 73 20 4a 73 6f 6e 50  * Searches JsonP
10db0 61 67 65 44 65 66 73 20 66 6f 72 20 61 20 63 6f  ageDefs for a co
10dc0 6d 6d 61 6e 64 20 77 69 74 68 20 74 68 65 20 67  mmand with the g
10dd0 69 76 65 6e 20 6e 61 6d 65 2e 20 49 66 20 66 6f  iven name. If fo
10de0 75 6e 64 2c 0a 2a 2a 20 69 74 20 69 73 20 75 73  und,.** it is us
10df0 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
10e00 6e 64 20 6f 75 74 70 75 74 20 61 20 4a 53 4f 4e  nd output a JSON
10e10 20 72 65 73 70 6f 6e 73 65 2e 20 49 66 20 6e 6f   response. If no
10e20 74 20 66 6f 75 6e 64 2c 20 69 74 0a 2a 2a 20 67  t found, it.** g
10e30 65 6e 65 72 61 74 65 73 20 61 20 4a 53 4f 4e 2d  enerates a JSON-
10e40 73 74 79 6c 65 20 65 72 72 6f 72 20 72 65 73 70  style error resp
10e50 6f 6e 73 65 2e 20 52 65 74 75 72 6e 73 20 30 20  onse. Returns 0 
10e60 6f 6e 20 73 75 63 63 65 73 73 2c 20 6e 6f 6e 2d  on success, non-
10e70 30 0a 2a 2a 20 6f 6e 20 65 72 72 6f 72 2e 20 4f  0.** on error. O
10e80 6e 20 65 72 72 6f 72 20 69 74 20 77 69 6c 6c 20  n error it will 
10e90 73 65 74 20 67 2e 6a 73 6f 6e 27 73 20 65 72 72  set g.json's err
10ea0 6f 72 20 73 74 61 74 65 2e 0a 2a 2f 0a 73 74 61  or state..*/.sta
10eb0 74 69 63 20 69 6e 74 20 6a 73 6f 6e 5f 64 69 73  tic int json_dis
10ec0 70 61 74 63 68 5f 72 6f 6f 74 5f 63 6f 6d 6d 61  patch_root_comma
10ed0 6e 64 28 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  nd( char const *
10ee0 20 7a 43 6f 6d 6d 61 6e 64 20 29 7b 0a 20 20 69   zCommand ){.  i
10ef0 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 73 6f  nt rc = 0;.  cso
10f00 6e 5f 76 61 6c 75 65 20 2a 20 70 61 79 6c 6f 61  n_value * payloa
10f10 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 4a 73 6f 6e  d = NULL;.  Json
10f20 50 61 67 65 44 65 66 20 63 6f 6e 73 74 20 2a 20  PageDef const * 
10f30 70 61 67 65 44 65 66 20 3d 20 4e 55 4c 4c 3b 0a  pageDef = NULL;.
10f40 20 20 70 61 67 65 44 65 66 20 3d 20 6a 73 6f 6e    pageDef = json
10f50 5f 68 61 6e 64 6c 65 72 5f 66 6f 72 5f 6e 61 6d  _handler_for_nam
10f60 65 28 7a 43 6f 6d 6d 61 6e 64 2c 26 4a 73 6f 6e  e(zCommand,&Json
10f70 50 61 67 65 44 65 66 73 5b 30 5d 29 3b 0a 20 20  PageDefs[0]);.  
10f80 69 66 28 20 21 20 70 61 67 65 44 65 66 20 29 7b  if( ! pageDef ){
10f90 0a 20 20 20 20 72 63 20 3d 20 46 53 4c 5f 4a 53  .    rc = FSL_JS
10fa0 4f 4e 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 4f 4d  ON_E_UNKNOWN_COM
10fb0 4d 41 4e 44 3b 0a 20 20 20 20 6a 73 6f 6e 5f 73  MAND;.    json_s
10fc0 65 74 5f 65 72 72 28 20 72 63 2c 20 22 55 6e 6b  et_err( rc, "Unk
10fd0 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 3a 20 25 73  nown command: %s
10fe0 22 2c 20 7a 43 6f 6d 6d 61 6e 64 20 29 3b 0a 20  ", zCommand );. 
10ff0 20 7d 65 6c 73 65 20 69 66 28 20 70 61 67 65 44   }else if( pageD
11000 65 66 2d 3e 72 75 6e 4d 6f 64 65 20 3c 20 30 20  ef->runMode < 0 
11010 2f 2a 43 4c 49 20 6f 6e 6c 79 2a 2f 29 7b 0a 20  /*CLI only*/){. 
11020 20 20 20 72 63 20 3d 20 46 53 4c 5f 4a 53 4f 4e     rc = FSL_JSON
11030 5f 45 5f 57 52 4f 4e 47 5f 4d 4f 44 45 3b 0a 20  _E_WRONG_MODE;. 
11040 20 7d 65 6c 73 65 20 69 66 28 20 28 67 2e 69 73   }else if( (g.is
11050 48 54 54 50 20 26 26 20 28 70 61 67 65 44 65 66  HTTP && (pageDef
11060 2d 3e 72 75 6e 4d 6f 64 65 20 3c 20 30 20 2f 2a  ->runMode < 0 /*
11070 43 4c 49 20 6f 6e 6c 79 2a 2f 29 29 0a 20 20 20  CLI only*/)).   
11080 20 20 20 20 20 20 20 20 20 7c 7c 0a 20 20 20 20           ||.    
11090 20 20 20 20 20 20 20 20 28 21 67 2e 69 73 48 54          (!g.isHT
110a0 54 50 20 26 26 20 28 70 61 67 65 44 65 66 2d 3e  TP && (pageDef->
110b0 72 75 6e 4d 6f 64 65 20 3e 20 30 20 2f 2a 48 54  runMode > 0 /*HT
110c0 54 50 20 6f 6e 6c 79 2a 2f 29 29 0a 20 20 20 20  TP only*/)).    
110d0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 72          ){.    r
110e0 63 20 3d 20 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 57  c = FSL_JSON_E_W
110f0 52 4f 4e 47 5f 4d 4f 44 45 3b 0a 20 20 7d 0a 20  RONG_MODE;.  }. 
11100 20 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20   else{.    rc = 
11110 30 3b 0a 20 20 20 20 67 2e 6a 73 6f 6e 2e 64 69  0;.    g.json.di
11120 73 70 61 74 63 68 44 65 70 74 68 20 3d 20 31 3b  spatchDepth = 1;
11130 0a 20 20 20 20 70 61 79 6c 6f 61 64 20 3d 20 28  .    payload = (
11140 2a 70 61 67 65 44 65 66 2d 3e 66 75 6e 63 29 28  *pageDef->func)(
11150 29 3b 0a 20 20 7d 0a 20 20 70 61 79 6c 6f 61 64  );.  }.  payload
11160 20 3d 20 6a 73 6f 6e 5f 63 72 65 61 74 65 5f 72   = json_create_r
11170 65 73 70 6f 6e 73 65 28 72 63 2c 20 4e 55 4c 4c  esponse(rc, NULL
11180 2c 20 70 61 79 6c 6f 61 64 29 3b 0a 20 20 6a 73  , payload);.  js
11190 6f 6e 5f 73 65 6e 64 5f 72 65 73 70 6f 6e 73 65  on_send_response
111a0 28 70 61 79 6c 6f 61 64 29 3b 0a 20 20 63 73 6f  (payload);.  cso
111b0 6e 5f 76 61 6c 75 65 5f 66 72 65 65 28 70 61 79  n_value_free(pay
111c0 6c 6f 61 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  load);.  return 
111d0 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 46 4f  rc;.}..#ifdef FO
111e0 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e  SSIL_ENABLE_JSON
111f0 0a 2f 2a 20 64 75 70 65 20 69 66 64 65 66 20 6e  ./* dupe ifdef n
11200 65 65 64 65 64 20 66 6f 72 20 6d 6b 69 6e 64 65  eeded for mkinde
11210 78 20 2a 2f 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41  x */./*.** WEBPA
11220 47 45 3a 20 6a 73 6f 6e 0a 2a 2a 0a 2a 2a 20 50  GE: json.**.** P
11230 61 67 65 73 20 75 6e 64 65 72 20 2f 6a 73 6f 6e  ages under /json
11240 2f 2e 2e 2e 20 6d 75 73 74 20 62 65 20 65 6e 74  /... must be ent
11250 65 72 65 64 20 69 6e 74 6f 20 4a 73 6f 6e 50 61  ered into JsonPa
11260 67 65 44 65 66 73 2e 0a 2a 2a 20 54 68 69 73 20  geDefs..** This 
11270 66 75 6e 63 74 69 6f 6e 20 64 69 73 70 61 74 63  function dispatc
11280 68 65 73 20 74 68 65 6d 2c 20 61 6e 64 20 69 73  hes them, and is
11290 20 74 68 65 20 48 54 54 50 20 65 71 75 69 76 61   the HTTP equiva
112a0 6c 65 6e 74 20 6f 66 0a 2a 2a 20 6a 73 6f 6e 5f  lent of.** json_
112b0 63 6d 64 5f 74 6f 70 28 29 2e 0a 2a 2f 0a 76 6f  cmd_top()..*/.vo
112c0 69 64 20 6a 73 6f 6e 5f 70 61 67 65 5f 74 6f 70  id json_page_top
112d0 28 76 6f 69 64 29 7b 0a 20 20 63 68 61 72 20 63  (void){.  char c
112e0 6f 6e 73 74 20 2a 20 7a 43 6f 6d 6d 61 6e 64 3b  onst * zCommand;
112f0 0a 20 20 61 73 73 65 72 74 28 67 2e 6a 73 6f 6e  .  assert(g.json
11300 2e 67 63 2e 61 20 26 26 20 22 6a 73 6f 6e 5f 6d  .gc.a && "json_m
11310 61 69 6e 5f 62 6f 6f 74 73 74 72 61 70 28 29 20  ain_bootstrap() 
11320 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 21 22  was not called!"
11330 29 3b 0a 20 20 6a 73 6f 6e 5f 6d 6f 64 65 5f 62  );.  json_mode_b
11340 6f 6f 74 73 74 72 61 70 28 29 3b 0a 20 20 7a 43  ootstrap();.  zC
11350 6f 6d 6d 61 6e 64 20 3d 20 6a 73 6f 6e 5f 63 6f  ommand = json_co
11360 6d 6d 61 6e 64 5f 61 72 67 28 31 29 3b 0a 20 20  mmand_arg(1);.  
11370 69 66 28 21 7a 43 6f 6d 6d 61 6e 64 20 7c 7c 20  if(!zCommand || 
11380 21 2a 7a 43 6f 6d 6d 61 6e 64 29 7b 0a 20 20 20  !*zCommand){.   
11390 20 6a 73 6f 6e 5f 64 69 73 70 61 74 63 68 5f 6d   json_dispatch_m
113a0 69 73 73 69 6e 67 5f 61 72 67 73 5f 65 72 72 28  issing_args_err(
113b0 20 4a 73 6f 6e 50 61 67 65 44 65 66 73 2c 0a 20   JsonPageDefs,. 
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113e0 20 20 20 22 4e 6f 20 63 6f 6d 6d 61 6e 64 20 28     "No command (
113f0 73 75 62 2d 70 61 74 68 29 20 73 70 65 63 69 66  sub-path) specif
11400 69 65 64 2e 22 0a 20 20 20 20 20 20 20 20 20 20  ied.".          
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11420 20 20 20 20 20 20 20 20 20 20 22 20 54 72 79 20            " Try 
11430 6f 6e 65 20 6f 66 3a 20 22 29 3b 0a 20 20 20 20  one of: ");.    
11440 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6a 73  return;.  }.  js
11450 6f 6e 5f 64 69 73 70 61 74 63 68 5f 72 6f 6f 74  on_dispatch_root
11460 5f 63 6f 6d 6d 61 6e 64 28 20 7a 43 6f 6d 6d 61  _command( zComma
11470 6e 64 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  nd );.}.#endif /
11480 2a 20 46 4f 53 53 49 4c 5f 45 4e 41 42 4c 45 5f  * FOSSIL_ENABLE_
11490 4a 53 4f 4e 20 66 6f 72 20 6d 6b 69 6e 64 65 78  JSON for mkindex
114a0 20 2a 2f 0a 0a 23 69 66 64 65 66 20 46 4f 53 53   */..#ifdef FOSS
114b0 49 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 0a 2f  IL_ENABLE_JSON./
114c0 2a 20 64 75 70 65 20 69 66 64 65 66 20 6e 65 65  * dupe ifdef nee
114d0 64 65 64 20 66 6f 72 20 6d 6b 69 6e 64 65 78 20  ded for mkindex 
114e0 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  */./*.** This fu
114f0 6e 63 74 69 6f 6e 20 64 69 73 70 61 74 63 68 65  nction dispatche
11500 73 20 6a 73 6f 6e 20 63 6f 6d 6d 61 6e 64 73 20  s json commands 
11510 61 6e 64 20 69 73 20 74 68 65 20 43 4c 49 20 65  and is the CLI e
11520 71 75 69 76 61 6c 65 6e 74 20 6f 66 0a 2a 2a 20  quivalent of.** 
11530 6a 73 6f 6e 5f 70 61 67 65 5f 74 6f 70 28 29 2e  json_page_top().
11540 0a 2a 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20  .**.** COMMAND: 
11550 6a 73 6f 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  json.**.** Usage
11560 3a 20 25 66 6f 73 73 69 6c 20 6a 73 6f 6e 20 53  : %fossil json S
11570 55 42 43 4f 4d 4d 41 4e 44 20 3f 4f 50 54 49 4f  UBCOMMAND ?OPTIO
11580 4e 53 3f 0a 2a 2a 0a 2a 2a 20 49 6e 20 43 4c 49  NS?.**.** In CLI
11590 20 6d 6f 64 65 2c 20 74 68 65 20 2d 52 20 52 45   mode, the -R RE
115a0 50 4f 20 63 6f 6d 6d 6f 6e 20 6f 70 74 69 6f 6e  PO common option
115b0 20 69 73 20 73 75 70 70 6f 72 74 65 64 2e 20 44   is supported. D
115c0 75 65 20 74 6f 20 6c 69 6d 69 74 61 74 69 6f 6e  ue to limitation
115d0 73 0a 2a 2a 20 69 6e 20 74 68 65 20 61 72 67 75  s.** in the argu
115e0 6d 65 6e 74 20 64 69 73 70 61 74 63 68 69 6e 67  ment dispatching
115f0 20 63 6f 64 65 2c 20 61 6e 79 20 2d 46 4c 41 47   code, any -FLAG
11600 53 20 6d 75 73 74 20 63 6f 6d 65 20 61 66 74 65  S must come afte
11610 72 20 74 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 73  r the final.** s
11620 75 62 2d 20 28 6f 72 20 73 75 62 73 75 62 2d 29  ub- (or subsub-)
11630 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
11640 54 68 65 20 63 6f 6d 6d 61 6e 64 73 20 69 6e 63  The commands inc
11650 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 6e  lude:.**.**   an
11660 6f 6e 79 6d 6f 75 73 50 61 73 73 77 6f 72 64 0a  onymousPassword.
11670 2a 2a 20 20 20 61 72 74 69 66 61 63 74 0a 2a 2a  **   artifact.**
11680 20 20 20 62 72 61 6e 63 68 0a 2a 2a 20 20 20 63     branch.**   c
11690 61 70 0a 2a 2a 20 20 20 63 6f 6e 66 69 67 0a 2a  ap.**   config.*
116a0 2a 20 20 20 64 69 66 66 0a 2a 2a 20 20 20 64 69  *   diff.**   di
116b0 72 0a 2a 2a 20 20 20 67 0a 2a 2a 20 20 20 6c 6f  r.**   g.**   lo
116c0 67 69 6e 0a 2a 2a 20 20 20 6c 6f 67 6f 75 74 0a  gin.**   logout.
116d0 2a 2a 20 20 20 71 75 65 72 79 0a 2a 2a 20 20 20  **   query.**   
116e0 72 65 62 75 69 6c 64 0a 2a 2a 20 20 20 72 65 70  rebuild.**   rep
116f0 6f 72 74 0a 2a 2a 20 20 20 72 65 73 75 6c 74 43  ort.**   resultC
11700 6f 64 65 73 0a 2a 2a 20 20 20 73 74 61 74 0a 2a  odes.**   stat.*
11710 2a 20 20 20 74 61 67 0a 2a 2a 20 20 20 74 69 6d  *   tag.**   tim
11720 65 6c 69 6e 65 0a 2a 2a 20 20 20 75 73 65 72 0a  eline.**   user.
11730 2a 2a 20 20 20 76 65 72 73 69 6f 6e 20 28 61 6c  **   version (al
11740 69 61 73 3a 20 48 41 49 29 0a 2a 2a 20 20 20 77  ias: HAI).**   w
11750 68 6f 61 6d 69 0a 2a 2a 20 20 20 77 69 6b 69 0a  hoami.**   wiki.
11760 2a 2a 0a 2a 2a 20 52 75 6e 20 27 25 66 6f 73 73  **.** Run '%foss
11770 69 6c 20 6a 73 6f 6e 27 20 77 69 74 68 6f 75 74  il json' without
11780 20 61 6e 79 20 73 75 62 63 6f 6d 6d 61 6e 64 20   any subcommand 
11790 74 6f 20 73 65 65 20 74 68 65 20 66 75 6c 6c 20  to see the full 
117a0 6c 69 73 74 20 28 62 75 74 20 62 65 0a 2a 2a 20  list (but be.** 
117b0 61 77 61 72 65 20 74 68 61 74 20 73 6f 6d 65 20  aware that some 
117c0 6c 69 73 74 65 64 20 6d 69 67 68 74 20 6e 6f 74  listed might not
117d0 20 79 65 74 20 62 65 20 66 75 6c 6c 79 20 69 6d   yet be fully im
117e0 70 6c 65 6d 65 6e 74 65 64 29 2e 0a 2a 2a 0a 2a  plemented)..**.*
117f0 2f 0a 76 6f 69 64 20 6a 73 6f 6e 5f 63 6d 64 5f  /.void json_cmd_
11800 74 6f 70 28 76 6f 69 64 29 7b 0a 20 20 63 68 61  top(void){.  cha
11810 72 20 63 6f 6e 73 74 20 2a 20 63 6d 64 20 3d 20  r const * cmd = 
11820 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 72 63 20 3d  NULL;.  int rc =
11830 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 20 26 67   0;.  memset( &g
11840 2e 70 65 72 6d 2c 20 30 78 66 66 2c 20 73 69 7a  .perm, 0xff, siz
11850 65 6f 66 28 67 2e 70 65 72 6d 29 20 29 0a 20 20  eof(g.perm) ).  
11860 20 20 2f 2a 20 49 6e 20 43 4c 49 20 6d 6f 64 65    /* In CLI mode
11870 20 66 6f 73 73 69 6c 20 64 6f 65 73 20 6e 6f 74   fossil does not
11880 20 75 73 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   use permissions
11890 0a 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 79  .       and they
118a0 20 61 6c 6c 20 64 65 66 61 75 6c 74 20 74 6f 20   all default to 
118b0 66 61 6c 73 65 2e 20 57 65 20 65 6e 61 62 6c 65  false. We enable
118c0 20 74 68 65 6d 0a 20 20 20 20 20 20 20 68 65 72   them.       her
118d0 65 20 62 65 63 61 75 73 65 20 28 41 29 20 66 6f  e because (A) fo
118e0 73 73 69 6c 20 64 6f 65 73 6e 27 74 20 75 73 65  ssil doesn't use
118f0 20 74 68 65 6d 20 69 6e 20 6c 6f 63 61 6c 0a 20   them in local. 
11900 20 20 20 20 20 20 6d 6f 64 65 20 62 75 74 20 28        mode but (
11910 42 29 20 68 61 76 69 6e 67 20 74 68 65 6d 20 73  B) having them s
11920 65 74 20 67 69 76 65 73 20 75 73 20 6f 6e 65 20  et gives us one 
11930 6c 65 73 73 0a 20 20 20 20 20 20 20 64 69 66 66  less.       diff
11940 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20 43 4c  erence in the CL
11950 49 2f 43 47 49 2f 53 65 72 76 65 72 2d 6d 6f 64  I/CGI/Server-mod
11960 65 20 4a 53 4f 4e 0a 20 20 20 20 20 20 20 68 61  e JSON.       ha
11970 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  ndling..    */. 
11980 20 20 20 3b 0a 20 20 6a 73 6f 6e 5f 6d 61 69 6e     ;.  json_main
11990 5f 62 6f 6f 74 73 74 72 61 70 28 29 3b 0a 20 20  _bootstrap();.  
119a0 6a 73 6f 6e 5f 6d 6f 64 65 5f 62 6f 6f 74 73 74  json_mode_bootst
119b0 72 61 70 28 29 3b 0a 20 20 69 66 28 20 32 20 3e  rap();.  if( 2 >
119c0 20 63 73 6f 6e 5f 61 72 72 61 79 5f 6c 65 6e 67   cson_array_leng
119d0 74 68 5f 67 65 74 28 67 2e 6a 73 6f 6e 2e 63 6d  th_get(g.json.cm
119e0 64 2e 61 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  d.a) ){.    goto
119f0 20 75 73 61 67 65 3b 0a 20 20 7d 0a 23 69 66 20   usage;.  }.#if 
11a00 30 0a 20 20 6a 73 6f 6e 5f 77 61 72 6e 28 46 53  0.  json_warn(FS
11a10 4c 5f 4a 53 4f 4e 5f 57 5f 52 4f 57 5f 54 4f 5f  L_JSON_W_ROW_TO_
11a20 4a 53 4f 4e 5f 46 41 49 4c 45 44 2c 20 22 4a 75  JSON_FAILED, "Ju
11a30 73 74 20 74 65 73 74 69 6e 67 2e 22 29 3b 0a 20  st testing.");. 
11a40 20 6a 73 6f 6e 5f 77 61 72 6e 28 46 53 4c 5f 4a   json_warn(FSL_J
11a50 53 4f 4e 5f 57 5f 52 4f 57 5f 54 4f 5f 4a 53 4f  SON_W_ROW_TO_JSO
11a60 4e 5f 46 41 49 4c 45 44 2c 20 22 4a 75 73 74 20  N_FAILED, "Just 
11a70 74 65 73 74 69 6e 67 20 61 67 61 69 6e 2e 22 29  testing again.")
11a80 3b 0a 23 65 6e 64 69 66 0a 20 20 63 6d 64 20 3d  ;.#endif.  cmd =
11a90 20 6a 73 6f 6e 5f 63 6f 6d 6d 61 6e 64 5f 61 72   json_command_ar
11aa0 67 28 31 29 3b 0a 20 20 69 66 28 20 21 63 6d 64  g(1);.  if( !cmd
11ab0 20 7c 7c 20 21 2a 63 6d 64 20 29 7b 0a 20 20 20   || !*cmd ){.   
11ac0 20 67 6f 74 6f 20 75 73 61 67 65 3b 0a 20 20 7d   goto usage;.  }
11ad0 0a 20 20 72 63 20 3d 20 6a 73 6f 6e 5f 64 69 73  .  rc = json_dis
11ae0 70 61 74 63 68 5f 72 6f 6f 74 5f 63 6f 6d 6d 61  patch_root_comma
11af0 6e 64 28 20 63 6d 64 20 29 3b 0a 20 20 69 66 28  nd( cmd );.  if(
11b00 30 20 21 3d 20 72 63 29 7b 0a 20 20 20 20 2f 2a  0 != rc){.    /*
11b10 20 46 49 58 4d 45 3a 20 77 65 20 6e 65 65 64 20   FIXME: we need 
11b20 61 20 77 61 79 20 6f 66 20 70 61 73 73 69 6e 67  a way of passing
11b30 20 74 68 69 73 20 65 72 72 6f 72 20 62 61 63 6b   this error back
11b40 0a 20 20 20 20 20 20 20 75 70 20 74 6f 20 74 68  .       up to th
11b50 65 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20  e routine which 
11b60 63 61 6c 6c 65 64 20 74 68 69 73 20 63 61 6c 6c  called this call
11b70 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 65 2e 67  back..       e.g
11b80 2e 20 61 64 64 20 67 2e 65 72 72 43 6f 64 65 2e  . add g.errCode.
11b90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 73 73  .    */.    foss
11ba0 69 6c 5f 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a  il_exit(1);.  }.
11bb0 20 20 72 65 74 75 72 6e 3b 0a 20 20 75 73 61 67    return;.  usag
11bc0 65 3a 0a 20 20 7b 0a 20 20 20 20 63 73 6f 6e 5f  e:.  {.    cson_
11bd0 76 61 6c 75 65 20 2a 20 70 61 79 6c 6f 61 64 3b  value * payload;
11be0 0a 20 20 20 20 6a 73 6f 6e 5f 64 69 73 70 61 74  .    json_dispat
11bf0 63 68 5f 6d 69 73 73 69 6e 67 5f 61 72 67 73 5f  ch_missing_args_
11c00 65 72 72 28 20 4a 73 6f 6e 50 61 67 65 44 65 66  err( JsonPageDef
11c10 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
11c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c30 20 20 20 20 20 20 20 22 4e 6f 20 73 75 62 63 6f         "No subco
11c40 6d 6d 61 6e 64 20 73 70 65 63 69 66 69 65 64 2e  mmand specified.
11c50 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
11c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c70 20 20 20 20 20 20 22 20 54 72 79 20 6f 6e 65 20        " Try one 
11c80 6f 66 3a 20 22 29 3b 0a 20 20 20 20 70 61 79 6c  of: ");.    payl
11c90 6f 61 64 20 3d 20 6a 73 6f 6e 5f 63 72 65 61 74  oad = json_creat
11ca0 65 5f 72 65 73 70 6f 6e 73 65 28 30 2c 20 4e 55  e_response(0, NU
11cb0 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 6a  LL, NULL);.    j
11cc0 73 6f 6e 5f 73 65 6e 64 5f 72 65 73 70 6f 6e 73  son_send_respons
11cd0 65 28 70 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  e(payload);.    
11ce0 63 73 6f 6e 5f 76 61 6c 75 65 5f 66 72 65 65 28  cson_value_free(
11cf0 70 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 66 6f  payload);.    fo
11d00 73 73 69 6c 5f 65 78 69 74 28 31 29 3b 0a 20 20  ssil_exit(1);.  
11d10 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 46 4f  }.}.#endif /* FO
11d20 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e  SSIL_ENABLE_JSON
11d30 20 66 6f 72 20 6d 6b 69 6e 64 65 78 20 2a 2f 0a   for mkindex */.
11d40 0a 23 65 6e 64 69 66 20 2f 2a 20 46 4f 53 53 49  .#endif /* FOSSI
11d50 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 20 2a 2f  L_ENABLE_JSON */
11d60 0a                                               .