Fossil

Hex Artifact Content
Login

Artifact bdbbf4397e727ca80a4cc6e63c0dc17cfaa0827a:


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 20 20 0a 2a 2a 20 43  ******.**  .** C
0270: 6f 64 65 20 66 6f 72 20 74 68 65 20 4a 53 4f 4e  ode for the JSON
0280: 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20   API..**.** For 
0290: 6e 6f 74 65 73 20 72 65 67 61 72 64 69 6e 67 20  notes regarding 
02a0: 74 68 65 20 70 75 62 6c 69 63 20 4a 53 4f 4e 20  the public JSON 
02b0: 69 6e 74 65 72 66 61 63 65 2c 20 70 6c 65 61 73  interface, pleas
02c0: 65 20 73 65 65 3a 0a 2a 2a 0a 2a 2a 20 68 74 74  e see:.**.** htt
02d0: 70 73 3a 2f 2f 64 6f 63 73 2e 67 6f 6f 67 6c 65  ps://docs.google
02e0: 2e 63 6f 6d 2f 64 6f 63 75 6d 65 6e 74 2f 64 2f  .com/document/d/
02f0: 31 66 58 56 69 76 65 4e 68 44 62 69 58 67 43 75  1fXViveNhDbiXgCu
0300: 45 37 51 44 58 51 4f 4b 65 46 7a 66 32 71 4e 55  E7QDXQOKeFzf2qNU
0310: 6b 42 45 67 69 55 76 6f 71 46 4e 34 2f 65 64 69  kBEgiUvoqFN4/edi
0320: 74 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73  t.**.**.** Notes
0330: 20 66 6f 72 20 68 61 63 6b 65 72 73 2e 2e 2e 0a   for hackers....
0340: 2a 2a 0a 2a 2a 20 48 65 72 65 27 73 20 68 6f 77  **.** Here's how
0350: 20 63 6f 6d 6d 61 6e 64 2f 70 61 67 65 20 64 69   command/page di
0360: 73 70 61 74 63 68 69 6e 67 20 77 6f 72 6b 73 3a  spatching works:
0370: 20 6a 73 6f 6e 5f 70 61 67 65 5f 74 6f 70 28 29   json_page_top()
0380: 20 28 69 6e 20 48 54 54 50 20 6d 6f 64 65 29 20   (in HTTP mode) 
0390: 6f 72 0a 2a 2a 20 6a 73 6f 6e 5f 63 6d 64 5f 74  or.** json_cmd_t
03a0: 6f 70 28 29 20 28 69 6e 20 43 4c 49 20 6d 6f 64  op() (in CLI mod
03b0: 65 29 20 63 61 74 63 68 20 74 68 65 20 22 6a 73  e) catch the "js
03c0: 6f 6e 22 20 70 61 74 68 2f 63 6f 6d 6d 61 6e 64  on" path/command
03d0: 2e 20 54 68 6f 73 65 20 66 75 6e 63 74 69 6f 6e  . Those function
03e0: 73 20 74 68 65 6e 0a 2a 2a 20 64 69 73 70 61 74  s then.** dispat
03f0: 63 68 20 74 6f 20 61 20 4a 53 4f 4e 2d 6d 6f 64  ch to a JSON-mod
0400: 65 2d 73 70 65 63 69 66 69 63 20 63 6f 6d 6d 61  e-specific comma
0410: 6e 64 2f 70 61 67 65 20 68 61 6e 64 6c 65 72 20  nd/page handler 
0420: 77 69 74 68 20 74 68 65 20 74 79 70 65 20 66 6f  with the type fo
0430: 73 73 69 6c 5f 6a 73 6f 6e 5f 66 28 29 2e 0a 2a  ssil_json_f()..*
0440: 2a 20 53 65 65 20 74 68 65 20 41 50 49 20 64 6f  * See the API do
0450: 63 73 20 66 6f 72 20 74 68 61 74 20 74 79 70 65  cs for that type
0460: 64 65 66 20 28 62 65 6c 6f 77 29 20 66 6f 72 20  def (below) for 
0470: 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66  the semantics of
0480: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 2e 0a   the callbacks..
0490: 2a 2a 0a 2a 2a 0a 2a 2f 0a 23 69 6e 63 6c 75 64  **.**.*/.#includ
04a0: 65 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e  e "config.h".#in
04b0: 63 6c 75 64 65 20 22 56 45 52 53 49 4f 4e 2e 68  clude "VERSION.h
04c0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 6a 73 6f 6e  ".#include "json
04d0: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73  .h".#include <as
04e0: 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  sert.h>.#include
04f0: 20 3c 74 69 6d 65 2e 68 3e 0a 0a 23 69 66 20 49   <time.h>..#if I
0500: 4e 54 45 52 46 41 43 45 0a 23 69 6e 63 6c 75 64  NTERFACE.#includ
0510: 65 20 22 6a 73 6f 6e 5f 64 65 74 61 69 6c 2e 68  e "json_detail.h
0520: 22 20 2f 2a 20 77 6f 72 6b 61 72 6f 75 6e 64 20  " /* workaround 
0530: 66 6f 72 20 61 70 70 61 72 65 6e 74 20 65 6e 75  for apparent enu
0540: 6d 20 6c 69 6d 69 74 61 74 69 6f 6e 20 69 6e 20  m limitation in 
0550: 6d 61 6b 65 68 65 61 64 65 72 73 20 2a 2f 0a 23  makeheaders */.#
0560: 65 6e 64 69 66 0a 0a 63 6f 6e 73 74 20 46 6f 73  endif..const Fos
0570: 73 69 6c 4a 73 6f 6e 4b 65 79 73 5f 20 46 6f 73  silJsonKeys_ Fos
0580: 73 69 6c 4a 73 6f 6e 4b 65 79 73 20 3d 20 7b 0a  silJsonKeys = {.
0590: 20 20 22 61 6e 6f 6e 79 6d 6f 75 73 53 65 65 64    "anonymousSeed
05a0: 22 20 2f 2a 61 6e 6f 6e 79 6d 6f 75 73 53 65 65  " /*anonymousSee
05b0: 64 2a 2f 2c 0a 20 20 22 61 75 74 68 54 6f 6b 65  d*/,.  "authToke
05c0: 6e 22 20 20 2f 2a 61 75 74 68 54 6f 6b 65 6e 2a  n"  /*authToken*
05d0: 2f 2c 0a 20 20 22 43 4f 4d 4d 41 4e 44 5f 50 41  /,.  "COMMAND_PA
05e0: 54 48 22 20 2f 2a 63 6f 6d 6d 61 6e 64 50 61 74  TH" /*commandPat
05f0: 68 2a 2f 2c 0a 20 20 22 6d 74 69 6d 65 22 20 2f  h*/,.  "mtime" /
0600: 2a 6d 74 69 6d 65 2a 2f 2c 0a 20 20 22 70 61 79  *mtime*/,.  "pay
0610: 6c 6f 61 64 22 20 2f 2a 20 70 61 79 6c 6f 61 64  load" /* payload
0620: 20 2a 2f 2c 0a 20 20 22 72 65 71 75 65 73 74 49   */,.  "requestI
0630: 64 22 20 2f 2a 72 65 71 75 65 73 74 49 64 2a 2f  d" /*requestId*/
0640: 2c 0a 20 20 22 72 65 73 75 6c 74 43 6f 64 65 22  ,.  "resultCode"
0650: 20 2f 2a 72 65 73 75 6c 74 43 6f 64 65 2a 2f 2c   /*resultCode*/,
0660: 0a 20 20 22 72 65 73 75 6c 74 54 65 78 74 22 20  .  "resultText" 
0670: 2f 2a 72 65 73 75 6c 74 54 65 78 74 2a 2f 2c 0a  /*resultText*/,.
0680: 20 20 22 74 69 6d 65 73 74 61 6d 70 22 20 2f 2a    "timestamp" /*
0690: 74 69 6d 65 73 74 61 6d 70 2a 2f 0a 7d 3b 0a 0a  timestamp*/.};..
06a0: 0a 2f 2a 20 54 69 6d 65 72 20 63 6f 64 65 20 74  ./* Timer code t
06b0: 61 6b 65 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65  aken from sqlite
06c0: 33 27 73 20 73 68 65 6c 6c 2e 63 2c 20 6d 6f 64  3's shell.c, mod
06d0: 69 66 69 65 64 20 73 6c 69 67 68 74 6c 79 2e 0a  ified slightly..
06e0: 20 20 20 46 49 58 4d 45 3a 20 6d 6f 76 65 20 74     FIXME: move t
06f0: 68 65 20 74 69 6d 65 72 20 69 6e 74 6f 20 74 68  he timer into th
0700: 65 20 66 6f 73 73 69 6c 20 63 6f 72 65 20 41 50  e fossil core AP
0710: 49 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  I so that we can
0720: 0a 20 20 20 73 74 61 72 74 20 74 68 65 20 74 69  .   start the ti
0730: 6d 65 72 20 65 61 72 6c 79 20 6f 6e 20 69 6e 20  mer early on in 
0740: 74 68 65 20 61 70 70 20 69 6e 69 74 20 70 68 61  the app init pha
0750: 73 65 2e 20 52 69 67 68 74 20 6e 6f 77 20 77 65  se. Right now we
0760: 27 72 65 0a 20 20 20 6a 75 73 74 20 74 69 6d 69  're.   just timi
0770: 6e 67 20 74 68 65 20 6a 73 6f 6e 20 6f 70 73 20  ng the json ops 
0780: 74 68 65 6d 73 65 6c 76 65 73 2e 0a 2a 2f 0a 23  themselves..*/.#
0790: 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e  if !defined(_WIN
07a0: 33 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  32) && !defined(
07b0: 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e  WIN32) && !defin
07c0: 65 64 28 5f 5f 4f 53 32 5f 5f 29 20 26 26 20 21  ed(__OS2__) && !
07d0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
07e0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57 52   && !defined(_WR
07f0: 53 5f 4b 45 52 4e 45 4c 29 0a 23 69 6e 63 6c 75  S_KERNEL).#inclu
0800: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0810: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 65  #include <sys/re
0820: 73 6f 75 72 63 65 2e 68 3e 0a 0a 2f 2a 20 53 61  source.h>../* Sa
0830: 76 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e 66  ved resource inf
0840: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
0850: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e   beginning of an
0860: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73 74   operation */.st
0870: 61 74 69 63 20 73 74 72 75 63 74 20 72 75 73 61  atic struct rusa
0880: 67 65 20 73 42 65 67 69 6e 3b 0a 0a 2f 2a 0a 2a  ge sBegin;../*.*
0890: 2a 20 42 65 67 69 6e 20 74 69 6d 69 6e 67 20 61  * Begin timing a
08a0: 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73  n operation.*/.s
08b0: 74 61 74 69 63 20 76 6f 69 64 20 62 65 67 69 6e  tatic void begin
08c0: 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 67  Timer(void){.  g
08d0: 65 74 72 75 73 61 67 65 28 52 55 53 41 47 45 5f  etrusage(RUSAGE_
08e0: 53 45 4c 46 2c 20 26 73 42 65 67 69 6e 29 3b 0a  SELF, &sBegin);.
08f0: 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  }../* Return the
0900: 20 64 69 66 66 65 72 65 6e 63 65 20 6f 66 20 74   difference of t
0910: 77 6f 20 74 69 6d 65 5f 73 74 72 75 63 74 73 20  wo time_structs 
0920: 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  in milliseconds 
0930: 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65  */.static double
0940: 20 74 69 6d 65 44 69 66 66 28 73 74 72 75 63 74   timeDiff(struct
0950: 20 74 69 6d 65 76 61 6c 20 2a 70 53 74 61 72 74   timeval *pStart
0960: 2c 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c  , struct timeval
0970: 20 2a 70 45 6e 64 29 7b 0a 20 20 72 65 74 75 72   *pEnd){.  retur
0980: 6e 20 28 28 70 45 6e 64 2d 3e 74 76 5f 75 73 65  n ((pEnd->tv_use
0990: 63 20 2d 20 70 53 74 61 72 74 2d 3e 74 76 5f 75  c - pStart->tv_u
09a0: 73 65 63 29 2a 30 2e 30 30 31 20 2b 20 0a 20 20  sec)*0.001 + .  
09b0: 20 20 20 20 20 20 20 20 28 64 6f 75 62 6c 65 29          (double)
09c0: 28 28 70 45 6e 64 2d 3e 74 76 5f 73 65 63 20 2d  ((pEnd->tv_sec -
09d0: 20 70 53 74 61 72 74 2d 3e 74 76 5f 73 65 63 29   pStart->tv_sec)
09e0: 2a 31 30 30 30 2e 30 29 29 3b 0a 7d 0a 0a 2f 2a  *1000.0));.}../*
09f0: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 74 69  .** Print the ti
0a00: 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e 0a 2a 2f  ming results..*/
0a10: 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 65  .static double e
0a20: 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20  ndTimer(void){. 
0a30: 20 73 74 72 75 63 74 20 72 75 73 61 67 65 20 73   struct rusage s
0a40: 45 6e 64 3b 0a 20 20 67 65 74 72 75 73 61 67 65  End;.  getrusage
0a50: 28 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73  (RUSAGE_SELF, &s
0a60: 45 6e 64 29 3b 0a 23 69 66 20 30 0a 20 20 70 72  End);.#if 0.  pr
0a70: 69 6e 74 66 28 22 43 50 55 20 54 69 6d 65 3a 20  intf("CPU Time: 
0a80: 75 73 65 72 20 25 66 20 73 79 73 20 25 66 5c 6e  user %f sys %f\n
0a90: 22 2c 0a 20 20 20 20 20 20 20 20 20 74 69 6d 65  ",.         time
0aa0: 44 69 66 66 28 26 73 42 65 67 69 6e 2e 72 75 5f  Diff(&sBegin.ru_
0ab0: 75 74 69 6d 65 2c 20 26 73 45 6e 64 2e 72 75 5f  utime, &sEnd.ru_
0ac0: 75 74 69 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  utime),.        
0ad0: 20 74 69 6d 65 44 69 66 66 28 26 73 42 65 67 69   timeDiff(&sBegi
0ae0: 6e 2e 72 75 5f 73 74 69 6d 65 2c 20 26 73 45 6e  n.ru_stime, &sEn
0af0: 64 2e 72 75 5f 73 74 69 6d 65 29 29 3b 0a 23 65  d.ru_stime));.#e
0b00: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 74 69  ndif.  return ti
0b10: 6d 65 44 69 66 66 28 26 73 42 65 67 69 6e 2e 72  meDiff(&sBegin.r
0b20: 75 5f 75 74 69 6d 65 2c 20 26 73 45 6e 64 2e 72  u_utime, &sEnd.r
0b30: 75 5f 75 74 69 6d 65 29 0a 20 20 20 20 2b 20 74  u_utime).    + t
0b40: 69 6d 65 44 69 66 66 28 26 73 42 65 67 69 6e 2e  imeDiff(&sBegin.
0b50: 72 75 5f 73 74 69 6d 65 2c 20 26 73 45 6e 64 2e  ru_stime, &sEnd.
0b60: 72 75 5f 73 74 69 6d 65 29 3b 0a 7d 0a 0a 23 64  ru_stime);.}..#d
0b70: 65 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45  efine BEGIN_TIME
0b80: 52 20 62 65 67 69 6e 54 69 6d 65 72 28 29 0a 23  R beginTimer().#
0b90: 64 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52  define END_TIMER
0ba0: 20 65 6e 64 54 69 6d 65 72 28 29 0a 23 64 65 66   endTimer().#def
0bb0: 69 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 31 0a  ine HAS_TIMER 1.
0bc0: 0a 23 65 6c 69 66 20 28 64 65 66 69 6e 65 64 28  .#elif (defined(
0bd0: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
0be0: 65 64 28 57 49 4e 33 32 29 29 0a 0a 23 69 6e 63  ed(WIN32))..#inc
0bf0: 6c 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e  lude <windows.h>
0c00: 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f 75  ../* Saved resou
0c10: 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  rce information 
0c20: 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  for the beginnin
0c30: 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f  g of an operatio
0c40: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 48 41 4e 44  n */.static HAND
0c50: 4c 45 20 68 50 72 6f 63 65 73 73 3b 0a 73 74 61  LE hProcess;.sta
0c60: 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74 4b  tic FILETIME ftK
0c70: 65 72 6e 65 6c 42 65 67 69 6e 3b 0a 73 74 61 74  ernelBegin;.stat
0c80: 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74 55 73  ic FILETIME ftUs
0c90: 65 72 42 65 67 69 6e 3b 0a 74 79 70 65 64 65 66  erBegin;.typedef
0ca0: 20 42 4f 4f 4c 20 28 57 49 4e 41 50 49 20 2a 47   BOOL (WINAPI *G
0cb0: 45 54 50 52 4f 43 54 49 4d 45 53 29 28 48 41 4e  ETPROCTIMES)(HAN
0cc0: 44 4c 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45 2c  DLE, LPFILETIME,
0cd0: 20 4c 50 46 49 4c 45 54 49 4d 45 2c 20 4c 50 46   LPFILETIME, LPF
0ce0: 49 4c 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54  ILETIME, LPFILET
0cf0: 49 4d 45 29 3b 0a 73 74 61 74 69 63 20 47 45 54  IME);.static GET
0d00: 50 52 4f 43 54 49 4d 45 53 20 67 65 74 50 72 6f  PROCTIMES getPro
0d10: 63 65 73 73 54 69 6d 65 73 41 64 64 72 20 3d 20  cessTimesAddr = 
0d20: 4e 55 4c 4c 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  NULL;../*.** Che
0d30: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
0d40: 68 61 76 65 20 74 69 6d 65 72 20 73 75 70 70 6f  have timer suppo
0d50: 72 74 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  rt.  Return 1 if
0d60: 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 73 75   necessary.** su
0d70: 70 70 6f 72 74 20 66 6f 75 6e 64 20 28 6f 72 20  pport found (or 
0d80: 66 6f 75 6e 64 20 70 72 65 76 69 6f 75 73 6c 79  found previously
0d90: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
0da0: 20 68 61 73 54 69 6d 65 72 28 76 6f 69 64 29 7b   hasTimer(void){
0db0: 0a 20 20 69 66 28 20 67 65 74 50 72 6f 63 65 73  .  if( getProces
0dc0: 73 54 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20  sTimesAddr ){.  
0dd0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 20    return 1;.  } 
0de0: 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 47 65  else {.    /* Ge
0df0: 74 50 72 6f 63 65 73 73 54 69 6d 65 73 28 29 20  tProcessTimes() 
0e00: 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20  isn't supported 
0e10: 69 6e 20 57 49 4e 39 35 20 61 6e 64 20 73 6f 6d  in WIN95 and som
0e20: 65 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 20  e other Windows 
0e30: 76 65 72 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  versions..    **
0e40: 20 53 65 65 20 69 66 20 74 68 65 20 76 65 72 73   See if the vers
0e50: 69 6f 6e 20 77 65 20 61 72 65 20 72 75 6e 6e 69  ion we are runni
0e60: 6e 67 20 6f 6e 20 68 61 73 20 69 74 2c 20 61 6e  ng on has it, an
0e70: 64 20 69 66 20 69 74 20 64 6f 65 73 2c 20 73 61  d if it does, sa
0e80: 76 65 20 6f 66 66 0a 20 20 20 20 2a 2a 20 61 20  ve off.    ** a 
0e90: 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 20 61 6e  pointer to it an
0ea0: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  d the current pr
0eb0: 6f 63 65 73 73 20 68 61 6e 64 6c 65 2e 0a 20 20  ocess handle..  
0ec0: 20 20 2a 2f 0a 20 20 20 20 68 50 72 6f 63 65 73    */.    hProces
0ed0: 73 20 3d 20 47 65 74 43 75 72 72 65 6e 74 50 72  s = GetCurrentPr
0ee0: 6f 63 65 73 73 28 29 3b 0a 20 20 20 20 69 66 28  ocess();.    if(
0ef0: 20 68 50 72 6f 63 65 73 73 20 29 7b 0a 20 20 20   hProcess ){.   
0f00: 20 20 20 48 49 4e 53 54 41 4e 43 45 20 68 69 6e     HINSTANCE hin
0f10: 73 74 4c 69 62 20 3d 20 4c 6f 61 64 4c 69 62 72  stLib = LoadLibr
0f20: 61 72 79 28 54 45 58 54 28 22 4b 65 72 6e 65 6c  ary(TEXT("Kernel
0f30: 33 32 2e 64 6c 6c 22 29 29 3b 0a 20 20 20 20 20  32.dll"));.     
0f40: 20 69 66 28 20 4e 55 4c 4c 20 21 3d 20 68 69 6e   if( NULL != hin
0f50: 73 74 4c 69 62 20 29 7b 0a 20 20 20 20 20 20 20  stLib ){.       
0f60: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
0f70: 41 64 64 72 20 3d 20 28 47 45 54 50 52 4f 43 54  Addr = (GETPROCT
0f80: 49 4d 45 53 29 20 47 65 74 50 72 6f 63 41 64 64  IMES) GetProcAdd
0f90: 72 65 73 73 28 68 69 6e 73 74 4c 69 62 2c 20 22  ress(hinstLib, "
0fa0: 47 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 22  GetProcessTimes"
0fb0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4e  );.        if( N
0fc0: 55 4c 4c 20 21 3d 20 67 65 74 50 72 6f 63 65 73  ULL != getProces
0fd0: 73 54 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20  sTimesAddr ){.  
0fe0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
0ff0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1000: 20 20 20 20 46 72 65 65 4c 69 62 72 61 72 79 28      FreeLibrary(
1010: 68 69 6e 73 74 4c 69 62 29 3b 20 0a 20 20 20 20  hinstLib); .    
1020: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1030: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1040: 2a 2a 20 42 65 67 69 6e 20 74 69 6d 69 6e 67 20  ** Begin timing 
1050: 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a  an operation.*/.
1060: 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 67 69  static void begi
1070: 6e 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20  nTimer(void){.  
1080: 69 66 28 20 67 65 74 50 72 6f 63 65 73 73 54 69  if( getProcessTi
1090: 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20 46  mesAddr ){.    F
10a0: 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74 69  ILETIME ftCreati
10b0: 6f 6e 2c 20 66 74 45 78 69 74 3b 0a 20 20 20 20  on, ftExit;.    
10c0: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
10d0: 64 64 72 28 68 50 72 6f 63 65 73 73 2c 20 26 66  ddr(hProcess, &f
10e0: 74 43 72 65 61 74 69 6f 6e 2c 20 26 66 74 45 78  tCreation, &ftEx
10f0: 69 74 2c 20 26 66 74 4b 65 72 6e 65 6c 42 65 67  it, &ftKernelBeg
1100: 69 6e 2c 20 26 66 74 55 73 65 72 42 65 67 69 6e  in, &ftUserBegin
1110: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74  );.  }.}../* Ret
1120: 75 72 6e 20 74 68 65 20 64 69 66 66 65 72 65 6e  urn the differen
1130: 63 65 20 6f 66 20 74 77 6f 20 46 49 4c 45 54 49  ce of two FILETI
1140: 4d 45 20 73 74 72 75 63 74 73 20 69 6e 20 6d 69  ME structs in mi
1150: 6c 6c 69 73 65 63 6f 6e 64 73 20 2a 2f 0a 73 74  lliseconds */.st
1160: 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69 6d 65  atic double time
1170: 44 69 66 66 28 46 49 4c 45 54 49 4d 45 20 2a 70  Diff(FILETIME *p
1180: 53 74 61 72 74 2c 20 46 49 4c 45 54 49 4d 45 20  Start, FILETIME 
1190: 2a 70 45 6e 64 29 7b 0a 20 20 73 71 6c 69 74 65  *pEnd){.  sqlite
11a0: 5f 69 6e 74 36 34 20 69 36 34 53 74 61 72 74 20  _int64 i64Start 
11b0: 3d 20 2a 28 28 73 71 6c 69 74 65 5f 69 6e 74 36  = *((sqlite_int6
11c0: 34 20 2a 29 20 70 53 74 61 72 74 29 3b 0a 20 20  4 *) pStart);.  
11d0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 36 34  sqlite_int64 i64
11e0: 45 6e 64 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f  End = *((sqlite_
11f0: 69 6e 74 36 34 20 2a 29 20 70 45 6e 64 29 3b 0a  int64 *) pEnd);.
1200: 20 20 72 65 74 75 72 6e 20 28 64 6f 75 62 6c 65    return (double
1210: 29 20 28 28 69 36 34 45 6e 64 20 2d 20 69 36 34  ) ((i64End - i64
1220: 53 74 61 72 74 29 20 2f 20 31 30 30 30 30 2e 30  Start) / 10000.0
1230: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  );.}../*.** Prin
1240: 74 20 74 68 65 20 74 69 6d 69 6e 67 20 72 65 73  t the timing res
1250: 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ults..*/.static 
1260: 64 6f 75 62 6c 65 20 65 6e 64 54 69 6d 65 72 28  double endTimer(
1270: 76 6f 69 64 29 7b 0a 20 20 69 66 28 67 65 74 50  void){.  if(getP
1280: 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 29  rocessTimesAddr)
1290: 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45 20 66  {.    FILETIME f
12a0: 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45 78 69  tCreation, ftExi
12b0: 74 2c 20 66 74 4b 65 72 6e 65 6c 45 6e 64 2c 20  t, ftKernelEnd, 
12c0: 66 74 55 73 65 72 45 6e 64 3b 0a 20 20 20 20 67  ftUserEnd;.    g
12d0: 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64  etProcessTimesAd
12e0: 64 72 28 68 50 72 6f 63 65 73 73 2c 20 26 66 74  dr(hProcess, &ft
12f0: 43 72 65 61 74 69 6f 6e 2c 20 26 66 74 45 78 69  Creation, &ftExi
1300: 74 2c 20 26 66 74 4b 65 72 6e 65 6c 45 6e 64 2c  t, &ftKernelEnd,
1310: 20 26 66 74 55 73 65 72 45 6e 64 29 3b 0a 20 20   &ftUserEnd);.  
1320: 20 20 72 65 74 75 72 6e 20 74 69 6d 65 44 69 66    return timeDif
1330: 66 28 26 66 74 55 73 65 72 42 65 67 69 6e 2c 20  f(&ftUserBegin, 
1340: 26 66 74 55 73 65 72 45 6e 64 29 20 2b 0a 20 20  &ftUserEnd) +.  
1350: 20 20 20 20 74 69 6d 65 44 69 66 66 28 26 66 74      timeDiff(&ft
1360: 4b 65 72 6e 65 6c 42 65 67 69 6e 2c 20 26 66 74  KernelBegin, &ft
1370: 4b 65 72 6e 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a  KernelEnd);.  }.
1380: 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 7d 0a    return 0.0;.}.
1390: 0a 23 64 65 66 69 6e 65 20 42 45 47 49 4e 5f 54  .#define BEGIN_T
13a0: 49 4d 45 52 20 62 65 67 69 6e 54 69 6d 65 72 28  IMER beginTimer(
13b0: 29 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f 54 49  ).#define END_TI
13c0: 4d 45 52 20 65 6e 64 54 69 6d 65 72 28 29 0a 23  MER endTimer().#
13d0: 64 65 66 69 6e 65 20 48 41 53 5f 54 49 4d 45 52  define HAS_TIMER
13e0: 20 68 61 73 54 69 6d 65 72 28 29 0a 0a 23 65 6c   hasTimer()..#el
13f0: 73 65 0a 23 64 65 66 69 6e 65 20 42 45 47 49 4e  se.#define BEGIN
1400: 5f 54 49 4d 45 52 20 0a 23 64 65 66 69 6e 65 20  _TIMER .#define 
1410: 45 4e 44 5f 54 49 4d 45 52 20 30 2e 30 0a 23 64  END_TIMER 0.0.#d
1420: 65 66 69 6e 65 20 48 41 53 5f 54 49 4d 45 52 20  efine HAS_TIMER 
1430: 30 0a 23 65 6e 64 69 66 0a 0a 0a 63 68 61 72 20  0.#endif...char 
1440: 66 6f 73 73 69 6c 5f 68 61 73 5f 6a 73 6f 6e 28  fossil_has_json(
1450: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 2e 6a 73  ){.  return g.js
1460: 6f 6e 2e 69 73 4a 73 6f 6e 4d 6f 64 65 20 26 26  on.isJsonMode &&
1470: 20 28 67 2e 69 73 48 54 54 50 20 7c 7c 20 67 2e   (g.isHTTP || g.
1480: 6a 73 6f 6e 2e 70 6f 73 74 2e 6f 29 3b 0a 7d 0a  json.post.o);.}.
1490: 0a 2f 2a 0a 2a 2a 20 50 6c 61 63 65 68 6f 6c 64  ./*.** Placehold
14a0: 65 72 20 2f 6a 73 6f 6e 2f 58 58 58 20 70 61 67  er /json/XXX pag
14b0: 65 20 69 6d 70 6c 20 66 6f 72 20 4e 59 49 20 28  e impl for NYI (
14c0: 4e 6f 74 20 59 65 74 20 49 6d 70 6c 65 6d 65 6e  Not Yet Implemen
14d0: 74 65 64 29 0a 2a 2a 20 28 62 75 74 20 70 6c 61  ted).** (but pla
14e0: 6e 6e 65 64 29 20 70 61 67 65 73 2f 63 6f 6d 6d  nned) pages/comm
14f0: 61 6e 64 73 2e 0a 2a 2f 0a 63 73 6f 6e 5f 76 61  ands..*/.cson_va
1500: 6c 75 65 20 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f  lue * json_page_
1510: 6e 79 69 28 29 7b 0a 20 20 67 2e 6a 73 6f 6e 2e  nyi(){.  g.json.
1520: 72 65 73 75 6c 74 43 6f 64 65 20 3d 20 46 53 4c  resultCode = FSL
1530: 5f 4a 53 4f 4e 5f 45 5f 4e 59 49 3b 0a 20 20 72  _JSON_E_NYI;.  r
1540: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a 0a 2f  eturn NULL;.}../
1550: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 46 6f 73  *.** Given a Fos
1560: 73 69 6c 4a 73 6f 6e 43 6f 64 65 73 20 76 61 6c  silJsonCodes val
1570: 75 65 2c 20 69 74 20 72 65 74 75 72 6e 73 20 61  ue, it returns a
1580: 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65   string suitable
1590: 20 66 6f 72 20 75 73 65 0a 2a 2a 20 61 73 20 61   for use.** as a
15a0: 20 72 65 73 75 6c 74 43 6f 64 65 20 73 74 72 69   resultCode stri
15b0: 6e 67 2e 20 52 65 74 75 72 6e 73 20 73 6f 6d 65  ng. Returns some
15c0: 20 75 6e 73 70 65 63 69 66 69 65 64 20 6e 6f 6e   unspecified non
15d0: 2d 65 6d 70 74 79 20 73 74 72 69 6e 67 0a 2a 2a  -empty string.**
15e0: 20 69 66 20 65 72 72 43 6f 64 65 20 69 73 20 6e   if errCode is n
15f0: 6f 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 46 6f  ot one of the Fo
1600: 73 73 69 6c 4a 73 6f 6e 43 6f 64 65 73 20 76 61  ssilJsonCodes va
1610: 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lues..*/.static 
1620: 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 6a 73 6f  char const * jso
1630: 6e 5f 65 72 72 5f 63 73 74 72 28 20 69 6e 74 20  n_err_cstr( int 
1640: 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 73 77 69  errCode ){.  swi
1650: 74 63 68 28 20 65 72 72 43 6f 64 65 20 29 7b 0a  tch( errCode ){.
1660: 20 20 20 20 63 61 73 65 20 30 3a 20 72 65 74 75      case 0: retu
1670: 72 6e 20 22 53 75 63 63 65 73 73 22 3b 0a 23 64  rn "Success";.#d
1680: 65 66 69 6e 65 20 43 28 58 2c 56 29 20 63 61 73  efine C(X,V) cas
1690: 65 20 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 20 23 23  e FSL_JSON_E_ ##
16a0: 20 58 3a 20 72 65 74 75 72 6e 20 56 0a 0a 20 20   X: return V..  
16b0: 20 20 43 28 47 45 4e 45 52 49 43 2c 22 47 65 6e    C(GENERIC,"Gen
16c0: 65 72 69 63 20 65 72 72 6f 72 22 29 3b 0a 20 20  eric error");.  
16d0: 20 20 43 28 49 4e 56 41 4c 49 44 5f 52 45 51 55    C(INVALID_REQU
16e0: 45 53 54 2c 22 49 6e 76 61 6c 69 64 20 72 65 71  EST,"Invalid req
16f0: 75 65 73 74 22 29 3b 0a 20 20 20 20 43 28 55 4e  uest");.    C(UN
1700: 4b 4e 4f 57 4e 5f 43 4f 4d 4d 41 4e 44 2c 22 55  KNOWN_COMMAND,"U
1710: 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 20 6f  nknown command o
1720: 72 20 73 75 62 63 6f 6d 6d 61 6e 64 22 29 3b 0a  r subcommand");.
1730: 20 20 20 20 43 28 55 4e 4b 4e 4f 57 4e 2c 22 55      C(UNKNOWN,"U
1740: 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 29 3b 0a  nknown error");.
1750: 20 20 20 20 43 28 54 49 4d 45 4f 55 54 2c 22 54      C(TIMEOUT,"T
1760: 69 6d 65 6f 75 74 20 72 65 61 63 68 65 64 22 29  imeout reached")
1770: 3b 0a 20 20 20 20 43 28 41 53 53 45 52 54 2c 22  ;.    C(ASSERT,"
1780: 41 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 65 64  Assertion failed
1790: 22 29 3b 0a 20 20 20 20 43 28 41 4c 4c 4f 43 2c  ");.    C(ALLOC,
17a0: 22 52 65 73 6f 75 72 63 65 20 61 6c 6c 6f 63 61  "Resource alloca
17b0: 74 69 6f 6e 20 66 61 69 6c 65 64 22 29 3b 0a 20  tion failed");. 
17c0: 20 20 20 43 28 4e 59 49 2c 22 4e 6f 74 20 79 65     C(NYI,"Not ye
17d0: 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 22 29 3b  t implemented");
17e0: 0a 20 20 20 20 43 28 50 41 4e 49 43 2c 22 78 22  .    C(PANIC,"x"
17f0: 29 3b 0a 20 20 20 20 43 28 4d 41 4e 49 46 45 53  );.    C(MANIFES
1800: 54 5f 52 45 41 44 5f 46 41 49 4c 45 44 2c 22 52  T_READ_FAILED,"R
1810: 65 61 64 69 6e 67 20 61 72 74 69 66 61 63 74 20  eading artifact 
1820: 6d 61 6e 69 66 65 73 74 20 66 61 69 6c 65 64 22  manifest failed"
1830: 29 3b 0a 20 20 20 20 43 28 46 49 4c 45 5f 4f 50  );.    C(FILE_OP
1840: 45 4e 5f 46 41 49 4c 45 44 2c 22 4f 70 65 6e 69  EN_FAILED,"Openi
1850: 6e 67 20 66 69 6c 65 20 66 61 69 6c 65 64 22 29  ng file failed")
1860: 3b 0a 20 20 20 20 0a 20 20 20 20 43 28 41 55 54  ;.    .    C(AUT
1870: 48 2c 22 41 75 74 68 65 6e 74 69 63 61 74 69 6f  H,"Authenticatio
1880: 6e 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 43  n error");.    C
1890: 28 4d 49 53 53 49 4e 47 5f 41 55 54 48 2c 22 41  (MISSING_AUTH,"A
18a0: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 69 6e  uthentication in
18b0: 66 6f 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20  fo missing from 
18c0: 72 65 71 75 65 73 74 22 29 3b 0a 20 20 20 20 43  request");.    C
18d0: 28 44 45 4e 49 45 44 2c 22 41 63 63 65 73 73 20  (DENIED,"Access 
18e0: 64 65 6e 69 65 64 22 29 3b 0a 20 20 20 20 43 28  denied");.    C(
18f0: 57 52 4f 4e 47 5f 4d 4f 44 45 2c 22 52 65 71 75  WRONG_MODE,"Requ
1900: 65 73 74 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  est not allowed 
1910: 28 77 72 6f 6e 67 20 6f 70 65 72 61 74 69 6f 6e  (wrong operation
1920: 20 6d 6f 64 65 29 22 29 3b 0a 20 20 20 20 43 28   mode)");.    C(
1930: 4c 4f 47 49 4e 5f 46 41 49 4c 45 44 2c 22 4c 6f  LOGIN_FAILED,"Lo
1940: 67 69 6e 20 66 61 69 6c 65 64 22 29 3b 0a 20 20  gin failed");.  
1950: 20 20 43 28 4c 4f 47 49 4e 5f 46 41 49 4c 45 44    C(LOGIN_FAILED
1960: 5f 4e 4f 53 45 45 44 2c 22 41 6e 6f 6e 79 6d 6f  _NOSEED,"Anonymo
1970: 75 73 20 6c 6f 67 69 6e 20 61 74 74 65 6d 70 74  us login attempt
1980: 20 77 61 73 20 6d 69 73 73 69 6e 67 20 70 61 73   was missing pas
1990: 73 77 6f 72 64 20 73 65 65 64 22 29 3b 0a 20 20  sword seed");.  
19a0: 20 20 43 28 4c 4f 47 49 4e 5f 46 41 49 4c 45 44    C(LOGIN_FAILED
19b0: 5f 4e 4f 4e 41 4d 45 2c 22 4c 6f 67 69 6e 20 66  _NONAME,"Login f
19c0: 61 69 6c 65 64 20 2d 20 6e 61 6d 65 20 6e 6f 74  ailed - name not
19d0: 20 73 75 70 70 6c 69 65 64 22 29 3b 0a 20 20 20   supplied");.   
19e0: 20 43 28 4c 4f 47 49 4e 5f 46 41 49 4c 45 44 5f   C(LOGIN_FAILED_
19f0: 4e 4f 50 57 2c 22 4c 6f 67 69 6e 20 66 61 69 6c  NOPW,"Login fail
1a00: 65 64 20 2d 20 70 61 73 73 77 6f 72 64 20 6e 6f  ed - password no
1a10: 74 20 73 75 70 70 6c 69 65 64 22 29 3b 0a 20 20  t supplied");.  
1a20: 20 20 43 28 4c 4f 47 49 4e 5f 46 41 49 4c 45 44    C(LOGIN_FAILED
1a30: 5f 4e 4f 54 46 4f 55 4e 44 2c 22 4c 6f 67 69 6e  _NOTFOUND,"Login
1a40: 20 66 61 69 6c 65 64 20 2d 20 6e 6f 20 6d 61 74   failed - no mat
1a50: 63 68 20 66 6f 75 6e 64 22 29 3b 0a 0a 20 20 20  ch found");..   
1a60: 20 43 28 55 53 41 47 45 2c 22 55 73 61 67 65 20   C(USAGE,"Usage 
1a70: 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 43 28 49  error");.    C(I
1a80: 4e 56 41 4c 49 44 5f 41 52 47 53 2c 22 49 6e 76  NVALID_ARGS,"Inv
1a90: 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 28 73 29  alid argument(s)
1aa0: 22 29 3b 0a 20 20 20 20 43 28 4d 49 53 53 49 4e  ");.    C(MISSIN
1ab0: 47 5f 41 52 47 53 2c 22 4d 69 73 73 69 6e 67 20  G_ARGS,"Missing 
1ac0: 61 72 67 75 6d 65 6e 74 28 73 29 22 29 3b 0a 20  argument(s)");. 
1ad0: 20 20 20 43 28 41 4d 42 49 47 55 4f 55 53 5f 55     C(AMBIGUOUS_U
1ae0: 55 49 44 2c 22 52 65 73 6f 75 72 63 65 20 69 64  UID,"Resource id
1af0: 65 6e 74 69 66 69 65 72 20 69 73 20 61 6d 62 69  entifier is ambi
1b00: 67 75 6f 75 73 22 29 3b 0a 20 20 20 20 43 28 55  guous");.    C(U
1b10: 4e 52 45 53 4f 4c 56 45 44 5f 55 55 49 44 2c 22  NRESOLVED_UUID,"
1b20: 50 72 6f 76 69 64 65 64 20 75 75 69 64 2f 74 61  Provided uuid/ta
1b30: 67 2f 62 72 61 6e 63 68 20 63 6f 75 6c 64 20 6e  g/branch could n
1b40: 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64 22 29  ot be resolved")
1b50: 3b 0a 20 20 20 20 43 28 52 45 53 4f 55 52 43 45  ;.    C(RESOURCE
1b60: 5f 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 2c  _ALREADY_EXISTS,
1b70: 22 52 65 73 6f 75 72 63 65 20 61 6c 72 65 61 64  "Resource alread
1b80: 79 20 65 78 69 73 74 73 22 29 3b 0a 20 20 20 20  y exists");.    
1b90: 43 28 52 45 53 4f 55 52 43 45 5f 4e 4f 54 5f 46  C(RESOURCE_NOT_F
1ba0: 4f 55 4e 44 2c 22 52 65 73 6f 75 72 63 65 20 6e  OUND,"Resource n
1bb0: 6f 74 20 66 6f 75 6e 64 22 29 3b 0a 0a 20 20 20  ot found");..   
1bc0: 20 43 28 44 42 2c 22 44 61 74 61 62 61 73 65 20   C(DB,"Database 
1bd0: 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 43 28 53  error");.    C(S
1be0: 54 4d 54 5f 50 52 45 50 2c 22 53 74 61 74 65 6d  TMT_PREP,"Statem
1bf0: 65 6e 74 20 70 72 65 70 61 72 61 74 69 6f 6e 20  ent preparation 
1c00: 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 43 28  failed");.    C(
1c10: 53 54 4d 54 5f 42 49 4e 44 2c 22 53 74 61 74 65  STMT_BIND,"State
1c20: 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 62  ment parameter b
1c30: 69 6e 64 69 6e 67 20 66 61 69 6c 65 64 22 29 3b  inding failed");
1c40: 0a 20 20 20 20 43 28 53 54 4d 54 5f 45 58 45 43  .    C(STMT_EXEC
1c50: 2c 22 53 74 61 74 65 6d 65 6e 74 20 65 78 65 63  ,"Statement exec
1c60: 75 74 69 6f 6e 2f 73 74 65 70 70 69 6e 67 20 66  ution/stepping f
1c70: 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 43 28 44  ailed");.    C(D
1c80: 42 5f 4c 4f 43 4b 45 44 2c 22 44 61 74 61 62 61  B_LOCKED,"Databa
1c90: 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 29 3b 0a  se is locked");.
1ca0: 20 20 20 20 43 28 44 42 5f 4e 45 45 44 53 5f 52      C(DB_NEEDS_R
1cb0: 45 42 55 49 4c 44 2c 22 46 6f 73 73 69 6c 20 72  EBUILD,"Fossil r
1cc0: 65 70 6f 73 69 74 6f 72 79 20 6e 65 65 64 73 20  epository needs 
1cd0: 74 6f 20 62 65 20 72 65 62 75 69 6c 74 22 29 3b  to be rebuilt");
1ce0: 0a 20 20 20 20 43 28 44 42 5f 4e 4f 54 5f 46 4f  .    C(DB_NOT_FO
1cf0: 55 4e 44 2c 22 46 6f 73 73 69 6c 20 72 65 70 6f  UND,"Fossil repo
1d00: 73 69 74 6f 72 79 20 64 62 20 66 69 6c 65 20 63  sitory db file c
1d10: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 6f 75 6e  ould not be foun
1d20: 64 2e 22 29 3b 0a 20 20 20 20 43 28 44 42 5f 4e  d.");.    C(DB_N
1d30: 4f 54 5f 56 41 4c 49 44 2c 20 22 46 6f 73 73 69  OT_VALID, "Fossi
1d40: 6c 20 72 65 70 6f 73 69 74 6f 72 79 20 64 62 20  l repository db 
1d50: 66 69 6c 65 20 69 73 20 6e 6f 74 20 76 61 6c 69  file is not vali
1d60: 64 2e 22 29 3b 0a 23 75 6e 64 65 66 20 43 0a 20  d.");.#undef C. 
1d70: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
1d80: 20 20 72 65 74 75 72 6e 20 22 55 6e 6b 6e 6f 77    return "Unknow
1d90: 6e 20 45 72 72 6f 72 22 3b 0a 20 20 7d 0a 7d 0a  n Error";.  }.}.
1da0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1db0: 73 20 74 68 65 20 63 73 6f 6e 5f 64 61 74 61 5f  s the cson_data_
1dc0: 64 65 73 74 5f 66 28 29 20 69 6e 74 65 72 66 61  dest_f() interfa
1dd0: 63 65 20 61 6e 64 20 6f 75 74 70 75 74 73 20 74  ce and outputs t
1de0: 68 65 20 64 61 74 61 20 74 6f 0a 2a 2a 20 61 20  he data to.** a 
1df0: 66 6f 73 73 69 6c 20 42 6c 6f 62 20 6f 62 6a 65  fossil Blob obje
1e00: 63 74 2e 20 20 70 53 74 61 74 65 20 6d 75 73 74  ct.  pState must
1e10: 20 62 65 2d 61 20 69 6e 69 74 69 61 6c 69 7a 65   be-a initialize
1e20: 64 20 28 42 6c 6f 62 2a 29 2c 20 74 6f 0a 2a 2a  d (Blob*), to.**
1e30: 20 77 68 69 63 68 20 6e 20 62 79 74 65 73 20 6f   which n bytes o
1e40: 66 20 73 72 63 20 77 69 6c 6c 20 62 65 20 61 70  f src will be ap
1e50: 70 65 6e 64 65 64 2e 0a 2a 2a 2f 0a 69 6e 74 20  pended..**/.int 
1e60: 63 73 6f 6e 5f 64 61 74 61 5f 64 65 73 74 5f 42  cson_data_dest_B
1e70: 6c 6f 62 28 76 6f 69 64 20 2a 20 70 53 74 61 74  lob(void * pStat
1e80: 65 2c 20 76 6f 69 64 20 63 6f 6e 73 74 20 2a 20  e, void const * 
1e90: 73 72 63 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  src, unsigned in
1ea0: 74 20 6e 29 7b 0a 20 20 42 6c 6f 62 20 2a 20 62  t n){.  Blob * b
1eb0: 20 3d 20 28 42 6c 6f 62 2a 29 70 53 74 61 74 65   = (Blob*)pState
1ec0: 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28  ;.  blob_append(
1ed0: 20 62 2c 20 28 63 68 61 72 20 63 6f 6e 73 74 20   b, (char const 
1ee0: 2a 29 73 72 63 2c 20 28 69 6e 74 29 6e 20 29 20  *)src, (int)n ) 
1ef0: 2f 2a 20 77 69 6c 6c 20 64 69 65 20 6f 6e 20 4f  /* will die on O
1f00: 4f 4d 20 2a 2f 3b 0a 20 20 72 65 74 75 72 6e 20  OM */;.  return 
1f10: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  0;.}../*.** Impl
1f20: 65 6d 65 6e 74 73 20 74 68 65 20 63 73 6f 6e 5f  ements the cson_
1f30: 64 61 74 61 5f 73 6f 75 72 63 65 5f 66 28 29 20  data_source_f() 
1f40: 69 6e 74 65 72 66 61 63 65 20 61 6e 64 20 72 65  interface and re
1f50: 61 64 73 20 69 6e 70 75 74 20 66 72 6f 6d 0a 2a  ads input from.*
1f60: 2a 20 61 20 66 6f 73 73 69 6c 20 42 6c 6f 62 20  * a fossil Blob 
1f70: 6f 62 6a 65 63 74 2e 20 70 53 74 61 74 65 20 6d  object. pState m
1f80: 75 73 74 20 62 65 2d 61 20 28 42 6c 6f 62 2a 29  ust be-a (Blob*)
1f90: 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1fa0: 4a 53 4f 4e 0a 2a 2a 20 64 61 74 61 2e 0a 2a 2f  JSON.** data..*/
1fb0: 0a 69 6e 74 20 63 73 6f 6e 5f 64 61 74 61 5f 73  .int cson_data_s
1fc0: 72 63 5f 42 6c 6f 62 28 76 6f 69 64 20 2a 20 70  rc_Blob(void * p
1fd0: 53 74 61 74 65 2c 20 76 6f 69 64 20 2a 20 64 65  State, void * de
1fe0: 73 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  st, unsigned int
1ff0: 20 2a 20 6e 29 7b 0a 20 20 42 6c 6f 62 20 2a 20   * n){.  Blob * 
2000: 62 20 3d 20 28 42 6c 6f 62 2a 29 70 53 74 61 74  b = (Blob*)pStat
2010: 65 3b 0a 20 20 2a 6e 20 3d 20 62 6c 6f 62 5f 72  e;.  *n = blob_r
2020: 65 61 64 28 20 62 2c 20 64 65 73 74 2c 20 2a 6e  ead( b, dest, *n
2030: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   );.  return 0;.
2040: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 6e 69  }../*.** Conveni
2050: 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f  ence wrapper aro
2060: 75 6e 64 20 63 73 6f 6e 5f 6f 75 74 70 75 74 28  und cson_output(
2070: 29 20 77 68 69 63 68 20 61 70 70 65 6e 64 73 20  ) which appends 
2080: 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 74 6f  the output.** to
2090: 20 70 44 65 73 74 2e 20 70 4f 70 74 20 6d 61 79   pDest. pOpt may
20a0: 20 62 65 20 4e 55 4c 4c 2c 20 69 6e 20 77 68 69   be NULL, in whi
20b0: 63 68 20 63 61 73 65 20 67 2e 6a 73 6f 6e 2e 6f  ch case g.json.o
20c0: 75 74 4f 70 74 20 77 69 6c 6c 20 62 65 20 75 73  utOpt will be us
20d0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 63 73 6f 6e 5f  ed..*/.int cson_
20e0: 6f 75 74 70 75 74 5f 42 6c 6f 62 28 20 63 73 6f  output_Blob( cso
20f0: 6e 5f 76 61 6c 75 65 20 63 6f 6e 73 74 20 2a 20  n_value const * 
2100: 70 56 61 6c 2c 20 42 6c 6f 62 20 2a 20 70 44 65  pVal, Blob * pDe
2110: 73 74 2c 20 63 73 6f 6e 5f 6f 75 74 70 75 74 5f  st, cson_output_
2120: 6f 70 74 20 63 6f 6e 73 74 20 2a 20 70 4f 70 74  opt const * pOpt
2130: 20 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 73 6f   ){.  return cso
2140: 6e 5f 6f 75 74 70 75 74 28 20 70 56 61 6c 2c 20  n_output( pVal, 
2150: 63 73 6f 6e 5f 64 61 74 61 5f 64 65 73 74 5f 42  cson_data_dest_B
2160: 6c 6f 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  lob,.           
2170: 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
2180: 2c 20 70 4f 70 74 20 3f 20 70 4f 70 74 20 3a 20  , pOpt ? pOpt : 
2190: 26 67 2e 6a 73 6f 6e 2e 6f 75 74 4f 70 74 20 29  &g.json.outOpt )
21a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
21b0: 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61  nience wrapper a
21c0: 72 6f 75 6e 64 20 63 73 6f 6e 5f 70 61 72 73 65  round cson_parse
21d0: 28 29 20 77 68 69 63 68 20 72 65 61 64 73 20 69  () which reads i
21e0: 74 73 20 69 6e 70 75 74 0a 2a 2a 20 66 72 6f 6d  ts input.** from
21f0: 20 70 53 72 63 2e 20 70 53 72 63 20 69 73 20 72   pSrc. pSrc is r
2200: 65 77 6f 75 6e 64 20 62 65 66 6f 72 65 20 70 61  ewound before pa
2210: 72 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 70 49 6e  rsing..**.** pIn
2220: 66 6f 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  fo may be NULL. 
2230: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  If it is not NUL
2240: 4c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 63  L then it will c
2250: 6f 6e 74 61 69 6e 20 64 65 74 61 69 6c 73 0a 2a  ontain details.*
2260: 2a 20 61 62 6f 75 74 20 74 68 65 20 70 61 72 73  * about the pars
2270: 65 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  e state when thi
2280: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2290: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ns..**.** On suc
22a0: 63 65 73 73 20 61 20 6e 65 77 20 4a 53 4f 4e 20  cess a new JSON 
22b0: 4f 62 6a 65 63 74 20 6f 72 20 41 72 72 61 79 20  Object or Array 
22c0: 69 73 20 72 65 74 75 72 6e 65 64 20 28 6f 77 6e  is returned (own
22d0: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
22e0: 6c 65 72 29 2e 20 4f 6e 20 65 72 72 6f 72 20 4e  ler). On error N
22f0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
2300: 0a 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65 20 2a  .*/.cson_value *
2310: 20 63 73 6f 6e 5f 70 61 72 73 65 5f 42 6c 6f 62   cson_parse_Blob
2320: 28 20 42 6c 6f 62 20 2a 20 70 53 72 63 2c 20 63  ( Blob * pSrc, c
2330: 73 6f 6e 5f 70 61 72 73 65 5f 69 6e 66 6f 20 2a  son_parse_info *
2340: 20 70 49 6e 66 6f 20 29 7b 0a 20 20 63 73 6f 6e   pInfo ){.  cson
2350: 5f 76 61 6c 75 65 20 2a 20 72 6f 6f 74 20 3d 20  _value * root = 
2360: 4e 55 4c 4c 3b 0a 20 20 62 6c 6f 62 5f 72 65 77  NULL;.  blob_rew
2370: 69 6e 64 28 20 70 53 72 63 20 29 3b 0a 20 20 63  ind( pSrc );.  c
2380: 73 6f 6e 5f 70 61 72 73 65 28 20 26 72 6f 6f 74  son_parse( &root
2390: 2c 20 63 73 6f 6e 5f 64 61 74 61 5f 73 72 63 5f  , cson_data_src_
23a0: 42 6c 6f 62 2c 20 70 53 72 63 2c 20 4e 55 4c 4c  Blob, pSrc, NULL
23b0: 2c 20 70 49 6e 66 6f 20 29 3b 0a 20 20 72 65 74  , pInfo );.  ret
23c0: 75 72 6e 20 72 6f 6f 74 3b 0a 7d 0a 0a 2f 2a 0a  urn root;.}../*.
23d0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** Implements th
23e0: 65 20 63 73 6f 6e 5f 64 61 74 61 5f 64 65 73 74  e cson_data_dest
23f0: 5f 66 28 29 20 69 6e 74 65 72 66 61 63 65 20 61  _f() interface a
2400: 6e 64 20 6f 75 74 70 75 74 73 20 74 68 65 20 64  nd outputs the d
2410: 61 74 61 20 74 6f 0a 2a 2a 20 63 67 69 5f 61 70  ata to.** cgi_ap
2420: 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 29 2e 20  pend_content(). 
2430: 70 53 74 61 74 65 20 69 73 20 69 67 6e 6f 72 65  pState is ignore
2440: 64 2e 0a 2a 2a 2f 0a 69 6e 74 20 63 73 6f 6e 5f  d..**/.int cson_
2450: 64 61 74 61 5f 64 65 73 74 5f 63 67 69 28 76 6f  data_dest_cgi(vo
2460: 69 64 20 2a 20 70 53 74 61 74 65 2c 20 76 6f 69  id * pState, voi
2470: 64 20 63 6f 6e 73 74 20 2a 20 73 72 63 2c 20 75  d const * src, u
2480: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 29 7b 0a  nsigned int n){.
2490: 20 20 63 67 69 5f 61 70 70 65 6e 64 5f 63 6f 6e    cgi_append_con
24a0: 74 65 6e 74 28 20 28 63 68 61 72 20 63 6f 6e 73  tent( (char cons
24b0: 74 20 2a 29 73 72 63 2c 20 28 69 6e 74 29 6e 20  t *)src, (int)n 
24c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
24d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ../*.** Returns 
24e0: 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  a string in the 
24f0: 66 6f 72 6d 20 46 4f 53 53 49 4c 2d 58 58 58 58  form FOSSIL-XXXX
2500: 2c 20 77 68 65 72 65 20 58 58 58 58 20 69 73 20  , where XXXX is 
2510: 61 0a 2a 2a 20 6c 65 66 74 2d 7a 65 72 6f 2d 70  a.** left-zero-p
2520: 61 64 64 65 64 20 76 61 6c 75 65 20 6f 66 20 63  added value of c
2530: 6f 64 65 2e 20 54 68 65 20 72 65 74 75 72 6e 65  ode. The returne
2540: 64 20 62 75 66 66 65 72 20 69 73 20 73 74 61 74  d buffer is stat
2550: 69 63 2c 20 61 6e 64 0a 2a 2a 20 6d 75 73 74 20  ic, and.** must 
2560: 62 65 20 63 6f 70 69 65 64 20 69 66 20 6e 65 65  be copied if nee
2570: 64 65 64 20 66 6f 72 20 6c 61 74 65 72 2e 20 20  ded for later.  
2580: 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
2590: 75 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 0a 2a  ue will always.*
25a0: 2a 20 62 65 20 31 31 20 62 79 74 65 73 20 6c 6f  * be 11 bytes lo
25b0: 6e 67 20 28 6e 6f 74 20 69 6e 63 6c 75 64 69 6e  ng (not includin
25c0: 67 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 4e  g the trailing N
25d0: 55 4c 20 62 79 74 65 29 2e 0a 2a 2a 0a 2a 2a 20  UL byte)..**.** 
25e0: 49 6e 20 70 72 61 63 74 69 63 65 20 77 65 20 77  In practice we w
25f0: 69 6c 6c 20 6f 6e 6c 79 20 65 76 65 72 20 63 61  ill only ever ca
2600: 6c 6c 20 74 68 69 73 20 6f 6e 65 20 74 69 6d 65  ll this one time
2610: 20 70 65 72 20 61 70 70 20 65 78 65 63 75 74 69   per app executi
2620: 6f 6e 0a 2a 2a 20 77 68 65 6e 20 63 6f 6e 73 74  on.** when const
2630: 72 75 63 74 69 6e 67 20 74 68 65 20 4a 53 4f 4e  ructing the JSON
2640: 20 72 65 73 70 6f 6e 73 65 20 65 6e 76 65 6c 6f   response envelo
2650: 70 65 2c 20 73 6f 20 74 68 65 20 73 74 61 74 69  pe, so the stati
2660: 63 20 62 75 66 66 65 72 0a 2a 2a 20 22 73 68 6f  c buffer.** "sho
2670: 75 6c 64 6e 27 74 22 20 62 65 20 61 20 70 72 6f  uldn't" be a pro
2680: 62 6c 65 6d 2e 0a 2a 2a 0a 2a 2f 0a 63 68 61 72  blem..**.*/.char
2690: 20 63 6f 6e 73 74 20 2a 20 6a 73 6f 6e 5f 72 63   const * json_rc
26a0: 5f 63 73 74 72 28 20 69 6e 74 20 63 6f 64 65 20  _cstr( int code 
26b0: 29 7b 0a 20 20 65 6e 75 6d 20 7b 20 42 75 66 53  ){.  enum { BufS
26c0: 69 7a 65 20 3d 20 31 32 20 7d 3b 0a 20 20 73 74  ize = 12 };.  st
26d0: 61 74 69 63 20 63 68 61 72 20 62 75 66 5b 42 75  atic char buf[Bu
26e0: 66 53 69 7a 65 5d 20 3d 20 7b 27 46 27 2c 27 4f  fSize] = {'F','O
26f0: 27 2c 27 53 27 2c 27 53 27 2c 27 49 27 2c 27 4c  ','S','S','I','L
2700: 27 2c 27 2d 27 2c 30 7d 3b 0a 20 20 61 73 73 65  ','-',0};.  asse
2710: 72 74 28 28 63 6f 64 65 20 3e 3d 20 31 30 30 30  rt((code >= 1000
2720: 29 20 26 26 20 28 63 6f 64 65 20 3c 3d 20 39 39  ) && (code <= 99
2730: 39 39 29 20 26 26 20 22 49 6e 76 61 6c 69 64 20  99) && "Invalid 
2740: 46 6f 73 73 69 6c 2f 4a 53 4f 4e 20 63 6f 64 65  Fossil/JSON code
2750: 2e 22 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 62  .");.  sprintf(b
2760: 75 66 2b 37 2c 22 25 30 34 64 22 2c 20 63 6f 64  uf+7,"%04d", cod
2770: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 75 66  e);.  return buf
2780: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 73 20  ;.}../*.** Adds 
2790: 76 20 74 6f 20 74 68 65 20 41 50 49 2d 69 6e 74  v to the API-int
27a0: 65 72 6e 61 6c 20 63 6c 65 61 6e 75 70 20 6d 65  ernal cleanup me
27b0: 63 68 61 6e 69 73 6d 2e 20 6b 65 79 20 69 73 20  chanism. key is 
27c0: 69 6e 67 6f 72 65 64 0a 2a 2a 20 28 6c 65 67 61  ingored.** (lega
27d0: 63 79 29 20 62 75 74 20 6d 69 67 68 74 20 62 65  cy) but might be
27e0: 20 72 65 2d 69 6e 74 72 6f 64 75 63 65 64 20 61   re-introduced a
27f0: 6e 64 20 22 73 68 6f 75 6c 64 22 20 62 65 20 61  nd "should" be a
2800: 20 75 6e 69 71 75 65 0a 2a 2a 20 28 61 70 70 2d   unique.** (app-
2810: 77 69 64 65 29 20 76 61 6c 75 65 2e 20 20 46 61  wide) value.  Fa
2820: 69 6c 75 72 65 20 74 6f 20 69 6e 73 65 72 74 20  ilure to insert 
2830: 61 6e 20 69 74 65 6d 20 6d 61 79 20 62 65 20 63  an item may be c
2840: 61 75 73 65 64 20 62 79 20 61 6e 79 0a 2a 2a 20  aused by any.** 
2850: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2860: 3a 0a 2a 2a 0a 2a 2a 20 2d 20 41 6c 6c 6f 63 61  :.**.** - Alloca
2870: 74 69 6f 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 2d  tion error..** -
2880: 20 67 2e 6a 73 6f 6e 2e 67 63 2e 61 20 69 73 20   g.json.gc.a is 
2890: 4e 55 4c 4c 0a 2a 2a 20 2d 20 6b 65 79 20 69 73  NULL.** - key is
28a0: 20 4e 55 4c 4c 20 6f 72 20 65 6d 70 74 79 2e 0a   NULL or empty..
28b0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 30 20  **.** Returns 0 
28c0: 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a  on success..**.*
28d0: 2a 20 4f 77 6e 65 72 73 68 69 70 20 6f 66 20 76  * Ownership of v
28e0: 20 69 73 20 74 72 61 6e 73 66 65 72 65 64 20 74   is transfered t
28f0: 6f 20 28 6f 72 20 73 68 61 72 65 64 20 77 69 74  o (or shared wit
2900: 68 29 20 67 2e 6a 73 6f 6e 2e 67 63 2c 20 61 6e  h) g.json.gc, an
2910: 64 20 76 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 76  d v.** will be v
2920: 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 61 74 20  alid until that 
2930: 6f 62 6a 65 63 74 20 69 73 20 63 6c 65 61 6e 65  object is cleane
2940: 64 20 75 70 20 6f 72 20 73 6f 6d 65 20 69 6e 74  d up or some int
2950: 65 72 6e 61 6c 20 63 6f 64 65 0a 2a 2a 20 69 6e  ernal code.** in
2960: 63 6f 72 72 65 63 74 6c 79 20 72 65 6d 6f 76 65  correctly remove
2970: 73 20 69 74 20 66 72 6f 6d 20 74 68 65 20 67 63  s it from the gc
2980: 20 28 77 68 69 63 68 20 77 65 20 6e 65 76 65 72   (which we never
2990: 20 64 6f 29 2e 20 49 66 20 74 68 69 73 0a 2a 2a   do). If this.**
29a0: 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 73 2c   function fails,
29b0: 20 69 74 20 69 73 20 66 61 74 61 6c 20 74 6f 20   it is fatal to 
29c0: 74 68 65 20 61 70 70 20 28 61 73 20 69 74 20 69  the app (as it i
29d0: 6e 64 69 63 61 74 65 73 20 61 6e 0a 2a 2a 20 61  ndicates an.** a
29e0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
29f0: 28 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 74 68 61  (more likely tha
2a00: 6e 20 6e 6f 74 29 20 6f 72 20 61 20 73 65 72 69  n not) or a seri
2a10: 6f 75 73 20 69 6e 74 65 72 6e 61 6c 20 65 72 72  ous internal err
2a20: 6f 72 0a 2a 2a 20 73 75 63 68 20 61 73 20 6e 75  or.** such as nu
2a30: 6d 65 72 69 63 20 6f 76 65 72 66 6c 6f 77 29 2e  meric overflow).
2a40: 0a 2a 2f 0a 76 6f 69 64 20 6a 73 6f 6e 5f 67 63  .*/.void json_gc
2a50: 5f 61 64 64 28 20 63 68 61 72 20 63 6f 6e 73 74  _add( char const
2a60: 20 2a 20 6b 65 79 2c 20 63 73 6f 6e 5f 76 61 6c   * key, cson_val
2a70: 75 65 20 2a 20 76 20 29 7b 0a 20 20 69 6e 74 20  ue * v ){.  int 
2a80: 63 6f 6e 73 74 20 72 63 20 3d 20 63 73 6f 6e 5f  const rc = cson_
2a90: 61 72 72 61 79 5f 61 70 70 65 6e 64 28 20 67 2e  array_append( g.
2aa0: 6a 73 6f 6e 2e 67 63 2e 61 2c 20 76 20 29 3b 0a  json.gc.a, v );.
2ab0: 20 20 61 73 73 65 72 74 28 20 4e 55 4c 4c 20 21    assert( NULL !
2ac0: 3d 20 67 2e 6a 73 6f 6e 2e 67 63 2e 61 20 29 3b  = g.json.gc.a );
2ad0: 0a 20 20 69 66 28 20 30 20 21 3d 20 72 63 20 29  .  if( 0 != rc )
2ae0: 7b 0a 20 20 20 20 63 73 6f 6e 5f 76 61 6c 75 65  {.    cson_value
2af0: 5f 66 72 65 65 28 20 76 20 29 3b 0a 20 20 7d 0a  _free( v );.  }.
2b00: 20 20 61 73 73 65 72 74 28 20 28 30 3d 3d 72 63    assert( (0==rc
2b10: 29 20 26 26 20 22 41 64 64 69 6e 67 20 69 74 65  ) && "Adding ite
2b20: 6d 20 74 6f 20 47 43 20 66 61 69 6c 65 64 2e 22  m to GC failed."
2b30: 20 29 3b 0a 20 20 69 66 28 30 21 3d 72 63 29 7b   );.  if(0!=rc){
2b40: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
2b50: 65 72 72 2c 22 25 73 3a 20 46 41 54 41 4c 3a 20  err,"%s: FATAL: 
2b60: 61 6c 6c 6f 63 20 65 72 72 6f 72 2e 5c 6e 22 2c  alloc error.\n",
2b70: 20 66 6f 73 73 69 6c 5f 6e 61 6d 65 6f 66 65 78   fossil_nameofex
2b80: 65 28 29 29 0a 20 20 20 20 20 20 20 20 2f 2a 20  e()).        /* 
2b90: 72 65 6d 69 6e 64 65 72 3a 20 61 6c 6c 6f 63 61  reminder: alloca
2ba0: 74 69 6f 6e 20 65 72 72 6f 72 20 69 73 20 74 68  tion error is th
2bb0: 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 61 62 6c  e only reasonabl
2bc0: 65 20 63 61 75 73 65 20 6f 66 0a 20 20 20 20 20  e cause of.     
2bd0: 20 20 20 20 20 20 65 72 72 6f 72 20 68 65 72 65        error here
2be0: 2c 20 70 72 6f 76 69 64 65 64 20 67 2e 6a 73 6f  , provided g.jso
2bf0: 6e 2e 67 63 2e 61 20 61 6e 64 20 76 20 61 72 65  n.gc.a and v are
2c00: 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 20   not NULL..     
2c10: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 3b 0a     */.        ;.
2c20: 20 20 20 20 66 6f 73 73 69 6c 5f 65 78 69 74 28      fossil_exit(
2c30: 31 29 2f 2a 6e 6f 74 20 66 6f 73 73 69 6c 5f 70  1)/*not fossil_p
2c40: 61 6e 69 63 28 29 20 62 2f 63 20 69 74 20 6d 69  anic() b/c it mi
2c50: 67 68 74 20 6c 61 6e 64 20 75 73 20 73 6f 6d 65  ght land us some
2c60: 77 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20  where.          
2c70: 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 20            where 
2c80: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2c90: 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 2e 0a 20   called again.. 
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb0: 20 2a 2f 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a   */;.  }.}.../*.
2cc0: 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 76  ** Returns the v
2cd0: 61 6c 75 65 20 6f 66 20 6a 73 6f 6e 5f 72 63 5f  alue of json_rc_
2ce0: 63 73 74 72 28 63 6f 64 65 29 20 61 73 20 61 20  cstr(code) as a 
2cf0: 6e 65 77 20 4a 53 4f 4e 0a 2a 2a 20 73 74 72 69  new JSON.** stri
2d00: 6e 67 2c 20 77 68 69 63 68 20 69 73 20 6f 77 6e  ng, which is own
2d10: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
2d20: 20 61 6e 64 20 6d 75 73 74 20 65 76 65 6e 74 75   and must eventu
2d30: 61 6c 6c 79 0a 2a 2a 20 62 65 20 63 73 6f 6e 5f  ally.** be cson_
2d40: 76 61 6c 75 65 5f 66 72 65 65 28 29 64 20 6f 72  value_free()d or
2d50: 20 74 72 61 6e 73 66 65 72 65 64 20 74 6f 20 61   transfered to a
2d60: 20 4a 53 4f 4e 20 63 6f 6e 74 61 69 6e 65 72 2e   JSON container.
2d70: 0a 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65 20 2a  .*/.cson_value *
2d80: 20 6a 73 6f 6e 5f 72 63 5f 73 74 72 69 6e 67 28   json_rc_string(
2d90: 20 69 6e 74 20 63 6f 64 65 20 29 7b 0a 20 20 72   int code ){.  r
2da0: 65 74 75 72 6e 20 63 73 6f 6e 5f 76 61 6c 75 65  eturn cson_value
2db0: 5f 6e 65 77 5f 73 74 72 69 6e 67 28 20 6a 73 6f  _new_string( jso
2dc0: 6e 5f 72 63 5f 63 73 74 72 28 63 6f 64 65 29 2c  n_rc_cstr(code),
2dd0: 20 31 31 20 29 3b 0a 7d 0a 0a 63 73 6f 6e 5f 76   11 );.}..cson_v
2de0: 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 6e 65 77 5f  alue * json_new_
2df0: 73 74 72 69 6e 67 28 20 63 68 61 72 20 63 6f 6e  string( char con
2e00: 73 74 20 2a 20 73 74 72 20 29 7b 0a 20 20 72 65  st * str ){.  re
2e10: 74 75 72 6e 20 73 74 72 0a 20 20 20 20 3f 20 63  turn str.    ? c
2e20: 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 73 74  son_value_new_st
2e30: 72 69 6e 67 28 73 74 72 2c 73 74 72 6c 65 6e 28  ring(str,strlen(
2e40: 73 74 72 29 29 0a 20 20 20 20 3a 20 4e 55 4c 4c  str)).    : NULL
2e50: 3b 0a 7d 0a 0a 63 73 6f 6e 5f 76 61 6c 75 65 20  ;.}..cson_value 
2e60: 2a 20 6a 73 6f 6e 5f 6e 65 77 5f 73 74 72 69 6e  * json_new_strin
2e70: 67 5f 66 28 20 63 68 61 72 20 63 6f 6e 73 74 20  g_f( char const 
2e80: 2a 20 66 6d 74 2c 20 2e 2e 2e 20 29 7b 0a 20 20  * fmt, ... ){.  
2e90: 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 76 3b 0a  cson_value * v;.
2ea0: 20 20 63 68 61 72 20 2a 20 7a 53 74 72 3b 0a 20    char * zStr;. 
2eb0: 20 76 61 5f 6c 69 73 74 20 76 61 72 67 73 3b 0a   va_list vargs;.
2ec0: 20 20 76 61 5f 73 74 61 72 74 28 76 61 72 67 73    va_start(vargs
2ed0: 2c 66 6d 74 29 3b 0a 20 20 7a 53 74 72 20 3d 20  ,fmt);.  zStr = 
2ee0: 76 6d 70 72 69 6e 74 66 28 66 6d 74 2c 76 61 72  vmprintf(fmt,var
2ef0: 67 73 29 3b 0a 20 20 76 61 5f 65 6e 64 28 76 61  gs);.  va_end(va
2f00: 72 67 73 29 3b 0a 20 20 76 20 3d 20 63 73 6f 6e  rgs);.  v = cson
2f10: 5f 76 61 6c 75 65 5f 6e 65 77 5f 73 74 72 69 6e  _value_new_strin
2f20: 67 28 7a 53 74 72 2c 20 73 74 72 6c 65 6e 28 7a  g(zStr, strlen(z
2f30: 53 74 72 29 29 3b 0a 20 20 66 72 65 65 28 7a 53  Str));.  free(zS
2f40: 74 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 76 3b  tr);.  return v;
2f50: 20 20 0a 7d 0a 0a 63 73 6f 6e 5f 76 61 6c 75 65    .}..cson_value
2f60: 20 2a 20 6a 73 6f 6e 5f 6e 65 77 5f 69 6e 74 28   * json_new_int(
2f70: 20 69 6e 74 20 76 20 29 7b 0a 20 20 72 65 74 75   int v ){.  retu
2f80: 72 6e 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65  rn cson_value_ne
2f90: 77 5f 69 6e 74 65 67 65 72 28 28 63 73 6f 6e 5f  w_integer((cson_
2fa0: 69 6e 74 5f 74 29 76 29 3b 0a 7d 0a 0a 2f 2a 0a  int_t)v);.}../*.
2fb0: 2a 2a 20 47 65 74 73 20 61 20 50 4f 53 54 2f 50  ** Gets a POST/P
2fc0: 4f 53 54 2e 70 61 79 6c 6f 61 64 2f 47 45 54 2f  OST.payload/GET/
2fd0: 43 4f 4f 4b 49 45 2f 45 4e 56 20 76 61 6c 75 65  COOKIE/ENV value
2fe0: 2e 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 6d  . The returned m
2ff0: 65 6d 6f 72 79 0a 2a 2a 20 69 73 20 6f 77 6e 65  emory.** is owne
3000: 64 20 62 79 20 74 68 65 20 67 2e 6a 73 6f 6e 20  d by the g.json 
3010: 6f 62 6a 65 63 74 20 28 6f 6e 65 20 6f 66 20 69  object (one of i
3020: 74 73 20 73 75 62 2d 6f 62 6a 65 63 74 73 29 2e  ts sub-objects).
3030: 20 52 65 74 75 72 6e 73 0a 2a 2a 20 4e 55 4c 4c   Returns.** NULL
3040: 20 69 66 20 6e 6f 20 6d 61 74 63 68 20 69 73 20   if no match is 
3050: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 45 4e 56  found..**.** ENV
3060: 20 6d 65 61 6e 73 20 74 68 65 20 73 79 73 74 65   means the syste
3070: 6d 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 28 67  m environment (g
3080: 65 74 65 6e 76 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  etenv())..**.** 
3090: 50 72 65 63 65 64 65 6e 63 65 3a 20 50 4f 53 54  Precedence: POST
30a0: 2e 70 61 79 6c 6f 61 64 2c 20 47 45 54 2f 43 4f  .payload, GET/CO
30b0: 4f 4b 49 45 2f 6e 6f 6e 2d 4a 53 4f 4e 20 50 4f  OKIE/non-JSON PO
30c0: 53 54 2c 20 4a 53 4f 4e 20 50 4f 53 54 2c 20 45  ST, JSON POST, E
30d0: 4e 56 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 4d 45 3a  NV..**.** FIXME:
30e0: 20 74 68 65 20 70 72 65 63 65 64 65 6e 63 65 20   the precedence 
30f0: 53 48 4f 55 4c 44 20 62 65 3a 20 47 45 54 2c 20  SHOULD be: GET, 
3100: 50 4f 53 54 2e 70 61 79 6c 6f 61 64 2c 20 50 4f  POST.payload, PO
3110: 53 54 2c 20 43 4f 4f 4b 49 45 2c 0a 2a 2a 20 45  ST, COOKIE,.** E
3120: 4e 56 2c 20 62 75 74 20 74 68 65 20 61 6d 61 6c  NV, but the amal
3130: 67 61 6d 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  gamation of the 
3140: 47 45 54 2f 50 4f 53 54 20 76 61 72 73 20 6d 61  GET/POST vars ma
3150: 6b 65 73 20 69 74 20 64 69 66 66 69 63 75 6c 74  kes it difficult
3160: 0a 2a 2a 20 66 6f 72 20 6d 65 20 74 6f 20 64 6f  .** for me to do
3170: 20 74 68 61 74 2e 20 53 69 6e 63 65 20 66 6f 73   that. Since fos
3180: 73 69 6c 20 6f 6e 6c 79 20 75 73 65 73 20 6f 6e  sil only uses on
3190: 65 20 63 6f 6f 6b 69 65 2c 20 63 6f 6f 6b 69 65  e cookie, cookie
31a0: 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65 20 69  .** precedence i
31b0: 73 6e 27 74 20 61 20 72 65 61 6c 2f 68 69 67 68  sn't a real/high
31c0: 2d 70 72 69 6f 72 69 74 79 20 70 72 6f 62 6c 65  -priority proble
31d0: 6d 2e 0a 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65  m..*/.cson_value
31e0: 20 2a 20 6a 73 6f 6e 5f 67 65 74 65 6e 76 28 20   * json_getenv( 
31f0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 7a 4b 65  char const * zKe
3200: 79 20 29 7b 0a 20 20 63 73 6f 6e 5f 76 61 6c 75  y ){.  cson_valu
3210: 65 20 2a 20 72 63 3b 0a 20 20 72 63 20 3d 20 67  e * rc;.  rc = g
3220: 2e 6a 73 6f 6e 2e 72 65 71 50 61 79 6c 6f 61 64  .json.reqPayload
3230: 2e 6f 0a 20 20 20 20 3f 20 63 73 6f 6e 5f 6f 62  .o.    ? cson_ob
3240: 6a 65 63 74 5f 67 65 74 28 20 67 2e 6a 73 6f 6e  ject_get( g.json
3250: 2e 72 65 71 50 61 79 6c 6f 61 64 2e 6f 2c 20 7a  .reqPayload.o, z
3260: 4b 65 79 20 29 0a 20 20 20 20 3a 20 4e 55 4c 4c  Key ).    : NULL
3270: 3b 0a 20 20 69 66 28 72 63 29 7b 0a 20 20 20 20  ;.  if(rc){.    
3280: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
3290: 20 72 63 20 3d 20 63 73 6f 6e 5f 6f 62 6a 65 63   rc = cson_objec
32a0: 74 5f 67 65 74 28 20 67 2e 6a 73 6f 6e 2e 70 61  t_get( g.json.pa
32b0: 72 61 6d 2e 6f 2c 20 7a 4b 65 79 20 29 3b 0a 20  ram.o, zKey );. 
32c0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
32d0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
32e0: 72 63 20 3d 20 63 73 6f 6e 5f 6f 62 6a 65 63 74  rc = cson_object
32f0: 5f 67 65 74 28 20 67 2e 6a 73 6f 6e 2e 70 6f 73  _get( g.json.pos
3300: 74 2e 6f 2c 20 7a 4b 65 79 20 29 3b 0a 20 20 69  t.o, zKey );.  i
3310: 66 28 72 63 29 7b 0a 20 20 20 20 72 65 74 75 72  f(rc){.    retur
3320: 6e 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  n rc;.  }else{. 
3330: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 20     char const * 
3340: 63 76 20 3d 20 50 44 28 7a 4b 65 79 2c 4e 55 4c  cv = PD(zKey,NUL
3350: 4c 29 3b 0a 20 20 20 20 69 66 28 21 63 76 20 26  L);.    if(!cv &
3360: 26 20 21 67 2e 69 73 48 54 54 50 29 7b 0a 20 20  & !g.isHTTP){.  
3370: 20 20 20 20 2f 2a 20 72 65 6d 69 6e 64 65 72 20      /* reminder 
3380: 74 6f 20 73 65 6c 66 3a 20 69 6e 20 43 4c 49 20  to self: in CLI 
3390: 6d 6f 64 65 20 69 27 64 20 6c 69 6b 65 20 74 6f  mode i'd like to
33a0: 20 74 72 79 0a 20 20 20 20 20 20 20 20 20 66 69   try.         fi
33b0: 6e 64 5f 6f 70 74 69 6f 6e 28 7a 4b 65 79 2c 4e  nd_option(zKey,N
33c0: 55 4c 4c 2c 58 59 5a 29 20 68 65 72 65 2c 20 62  ULL,XYZ) here, b
33d0: 75 74 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65  ut we don't have
33e0: 20 61 20 73 61 6e 65 0a 20 20 20 20 20 20 20 20   a sane.        
33f0: 20 64 65 66 61 75 6c 74 20 66 6f 72 20 74 68 65   default for the
3400: 20 58 59 5a 20 70 61 72 61 6d 20 68 65 72 65 2e   XYZ param here.
3410: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
3420: 63 76 20 3d 20 66 6f 73 73 69 6c 5f 67 65 74 65  cv = fossil_gete
3430: 6e 76 28 7a 4b 65 79 29 3b 0a 20 20 20 20 7d 0a  nv(zKey);.    }.
3440: 20 20 20 20 69 66 28 63 76 29 7b 2f 2a 74 72 61      if(cv){/*tra
3450: 6e 73 66 6f 72 6d 20 69 74 20 74 6f 20 4a 53 4f  nsform it to JSO
3460: 4e 20 66 6f 72 20 6c 61 74 65 72 20 75 73 65 2e  N for later use.
3470: 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 75 73 65 20  */.      /* use 
3480: 73 73 63 61 6e 66 28 29 20 74 6f 20 66 69 67 75  sscanf() to figu
3490: 72 65 20 6f 75 74 20 69 66 20 69 74 27 73 20 61  re out if it's a
34a0: 6e 20 69 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  n int,.         
34b0: 61 6e 64 20 74 72 61 6e 73 66 6f 72 6d 20 69 74  and transform it
34c0: 20 74 6f 20 4a 53 4f 4e 20 69 6e 74 20 69 66 20   to JSON int if 
34d0: 69 74 20 69 73 2e 0a 0a 20 20 20 20 20 20 20 20  it is...        
34e0: 20 46 49 58 4d 45 3a 20 75 73 65 20 73 74 72 74   FIXME: use strt
34f0: 6f 6c 28 29 2c 20 73 69 6e 63 65 20 69 74 20 68  ol(), since it h
3500: 61 73 20 6d 6f 72 65 20 61 63 63 75 72 61 74 65  as more accurate
3510: 0a 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20  .         error 
3520: 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20 20  handling..      
3530: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 74  */.      int int
3540: 56 61 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Val = -1;.      
3550: 63 68 61 72 20 65 6e 64 4f 66 49 6e 74 43 68 65  char endOfIntChe
3560: 63 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f  ck;.      int co
3570: 6e 73 74 20 73 63 61 6e 52 63 20 3d 20 73 73 63  nst scanRc = ssc
3580: 61 6e 66 28 63 76 2c 22 25 64 25 63 22 2c 26 69  anf(cv,"%d%c",&i
3590: 6e 74 56 61 6c 2c 20 26 65 6e 64 4f 66 49 6e 74  ntVal, &endOfInt
35a0: 43 68 65 63 6b 29 0a 20 20 20 20 20 20 20 20 2f  Check).        /
35b0: 2a 20 54 68 65 20 25 63 20 62 69 74 20 74 68 65  * The %c bit the
35c0: 72 65 20 69 73 20 74 6f 20 6d 61 6b 65 20 73 75  re is to make su
35d0: 72 65 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74  re that we don't
35e0: 20 61 63 63 65 70 74 20 31 32 33 78 0a 20 20 20   accept 123x.   
35f0: 20 20 20 20 20 20 20 61 73 20 61 20 6e 75 6d 62         as a numb
3600: 65 72 2e 20 73 73 63 61 6e 66 28 29 20 72 65 74  er. sscanf() ret
3610: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
3620: 6f 66 20 74 6f 6b 65 6e 73 0a 20 20 20 20 20 20  of tokens.      
3630: 20 20 20 20 73 75 63 63 65 73 73 66 75 6c 6c 79      successfully
3640: 20 70 61 72 73 65 64 2c 20 73 6f 20 61 6e 20 52   parsed, so an R
3650: 43 20 6f 66 20 31 20 77 69 6c 6c 20 62 65 20 63  C of 1 will be c
3660: 6f 72 72 65 63 74 20 66 6f 72 20 22 31 32 33 22  orrect for "123"
3670: 0a 20 20 20 20 20 20 20 20 20 20 62 75 74 20 22  .          but "
3680: 31 32 33 78 22 20 77 69 6c 6c 20 68 61 76 65 20  123x" will have 
3690: 52 43 3d 3d 32 2e 0a 0a 20 20 20 20 20 20 20 20  RC==2...        
36a0: 20 20 42 75 74 20 69 74 20 61 70 70 65 61 72 73    But it appears
36b0: 20 74 6f 20 6e 6f 74 20 62 65 20 77 6f 72 6b 69   to not be worki
36c0: 6e 67 20 74 68 61 74 20 77 61 79 20 3a 2f 0a 20  ng that way :/. 
36d0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
36e0: 20 20 3b 0a 20 20 20 20 20 20 69 66 28 31 3d 3d    ;.      if(1==
36f0: 73 63 61 6e 52 63 29 7b 0a 20 20 20 20 20 20 20  scanRc){.       
3700: 20 6a 73 6f 6e 5f 73 65 74 65 6e 76 28 20 7a 4b   json_setenv( zK
3710: 65 79 2c 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e  ey, cson_value_n
3720: 65 77 5f 69 6e 74 65 67 65 72 28 69 6e 74 56 61  ew_integer(intVa
3730: 6c 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  l) );.      }els
3740: 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
3750: 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 73  cson_value_new_s
3760: 74 72 69 6e 67 28 63 76 2c 73 74 72 6c 65 6e 28  tring(cv,strlen(
3770: 63 76 29 29 3b 0a 20 20 20 20 20 20 20 20 6a 73  cv));.        js
3780: 6f 6e 5f 73 65 74 65 6e 76 28 20 7a 4b 65 79 2c  on_setenv( zKey,
3790: 20 72 63 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20   rc );.      }. 
37a0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
37b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37c0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20   return NULL;.  
37d0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
37e0: 20 57 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   Wrapper around 
37f0: 6a 73 6f 6e 5f 67 65 74 65 6e 76 28 29 20 77 68  json_getenv() wh
3800: 69 63 68 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ich....**.** If 
3810: 69 74 20 66 69 6e 64 73 20 61 20 76 61 6c 75 65  it finds a value
3820: 20 61 6e 64 20 74 68 61 74 20 76 61 6c 75 65 20   and that value 
3830: 69 73 2d 61 20 4a 53 4f 4e 20 6e 75 6d 62 65 72  is-a JSON number
3840: 20 6f 72 20 69 73 20 61 20 73 74 72 69 6e 67 0a   or is a string.
3850: 2a 2a 20 77 68 69 63 68 20 6c 6f 6f 6b 73 20 6c  ** which looks l
3860: 69 6b 65 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  ike an integer o
3870: 72 20 69 73 2d 61 20 4a 53 4f 4e 20 62 6f 6f 6c  r is-a JSON bool
3880: 2f 6e 75 6c 6c 20 74 68 65 6e 20 69 74 20 69 73  /null then it is
3890: 0a 2a 2a 20 63 6f 6e 76 65 72 74 65 64 20 74 6f  .** converted to
38a0: 20 61 6e 20 69 6e 74 2e 20 49 66 20 6e 6f 6e 65   an int. If none
38b0: 20 6f 66 20 74 68 6f 73 65 20 61 70 70 6c 79 20   of those apply 
38c0: 74 68 65 6e 20 64 66 6c 74 20 69 73 20 72 65 74  then dflt is ret
38d0: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 6a 73  urned..*/.int js
38e0: 6f 6e 5f 67 65 74 65 6e 76 5f 69 6e 74 28 63 68  on_getenv_int(ch
38f0: 61 72 20 63 6f 6e 73 74 20 2a 20 70 4b 65 79 2c  ar const * pKey,
3900: 20 69 6e 74 20 64 66 6c 74 20 29 7b 0a 20 20 63   int dflt ){.  c
3910: 73 6f 6e 5f 76 61 6c 75 65 20 63 6f 6e 73 74 20  son_value const 
3920: 2a 20 76 20 3d 20 6a 73 6f 6e 5f 67 65 74 65 6e  * v = json_geten
3930: 76 28 70 4b 65 79 29 3b 0a 20 20 69 66 28 21 76  v(pKey);.  if(!v
3940: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 64 66  ){.    return df
3950: 6c 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  lt;.  }else if( 
3960: 63 73 6f 6e 5f 76 61 6c 75 65 5f 69 73 5f 6e 75  cson_value_is_nu
3970: 6d 62 65 72 28 76 29 20 29 7b 0a 20 20 20 20 72  mber(v) ){.    r
3980: 65 74 75 72 6e 20 28 69 6e 74 29 63 73 6f 6e 5f  eturn (int)cson_
3990: 76 61 6c 75 65 5f 67 65 74 5f 69 6e 74 65 67 65  value_get_intege
39a0: 72 28 76 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  r(v);.  }else if
39b0: 28 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 69 73 5f  ( cson_value_is_
39c0: 73 74 72 69 6e 67 28 76 29 20 29 7b 0a 20 20 20  string(v) ){.   
39d0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 73 76   char const * sv
39e0: 20 3d 20 63 73 6f 6e 5f 73 74 72 69 6e 67 5f 63   = cson_string_c
39f0: 73 74 72 28 63 73 6f 6e 5f 76 61 6c 75 65 5f 67  str(cson_value_g
3a00: 65 74 5f 73 74 72 69 6e 67 28 76 29 29 3b 0a 20  et_string(v));. 
3a10: 20 20 20 61 73 73 65 72 74 28 20 28 4e 55 4c 4c     assert( (NULL
3a20: 21 3d 73 76 29 20 26 26 20 22 54 68 69 73 20 69  !=sv) && "This i
3a30: 73 20 71 75 69 74 65 20 75 6e 65 78 70 65 63 74  s quite unexpect
3a40: 65 64 2e 22 20 29 3b 0a 20 20 20 20 72 65 74 75  ed." );.    retu
3a50: 72 6e 20 73 76 20 3f 20 61 74 6f 69 28 73 76 29  rn sv ? atoi(sv)
3a60: 20 3a 20 64 66 6c 74 3b 0a 20 20 7d 65 6c 73 65   : dflt;.  }else
3a70: 20 69 66 28 20 63 73 6f 6e 5f 76 61 6c 75 65 5f   if( cson_value_
3a80: 69 73 5f 62 6f 6f 6c 28 76 29 20 29 7b 0a 20 20  is_bool(v) ){.  
3a90: 20 20 72 65 74 75 72 6e 20 63 73 6f 6e 5f 76 61    return cson_va
3aa0: 6c 75 65 5f 67 65 74 5f 62 6f 6f 6c 28 76 29 20  lue_get_bool(v) 
3ab0: 3f 20 31 20 3a 20 30 3b 0a 20 20 7d 65 6c 73 65  ? 1 : 0;.  }else
3ac0: 20 69 66 28 20 63 73 6f 6e 5f 76 61 6c 75 65 5f   if( cson_value_
3ad0: 69 73 5f 6e 75 6c 6c 28 76 29 20 29 7b 0a 20 20  is_null(v) ){.  
3ae0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65    return 0;.  }e
3af0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 77 65 20 73  lse{.    /* we s
3b00: 68 6f 75 6c 64 20 61 72 67 75 61 62 6c 79 20 74  hould arguably t
3b10: 72 65 61 74 20 4a 53 4f 4e 20 6e 75 6c 6c 20 61  reat JSON null a
3b20: 73 20 30 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  s 0. */.    retu
3b30: 72 6e 20 64 66 6c 74 3b 0a 20 20 7d 0a 7d 0a 0a  rn dflt;.  }.}..
3b40: 0a 2f 2a 0a 2a 2a 20 57 72 61 70 70 65 72 20 61  ./*.** Wrapper a
3b50: 72 6f 75 6e 64 20 6a 73 6f 6e 5f 67 65 74 65 6e  round json_geten
3b60: 76 28 29 20 77 68 69 63 68 20 74 72 69 65 73 20  v() which tries 
3b70: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 20 70 61  to evaluate a pa
3b80: 79 6c 6f 61 64 2f 65 6e 76 0a 2a 2a 20 76 61 6c  yload/env.** val
3b90: 75 65 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 2e  ue as a boolean.
3ba0: 20 55 73 65 73 20 6d 6f 73 74 6c 79 20 74 68 65   Uses mostly the
3bb0: 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a   same logic as.*
3bc0: 2a 20 6a 73 6f 6e 5f 67 65 74 65 6e 76 5f 69 6e  * json_getenv_in
3bd0: 74 28 29 2c 20 77 69 74 68 20 74 68 65 20 61 64  t(), with the ad
3be0: 64 69 74 69 6f 6e 20 74 68 61 74 20 73 74 72 69  dition that stri
3bf0: 6e 67 20 76 61 6c 75 65 73 20 77 68 69 63 68 0a  ng values which.
3c00: 2a 2a 20 65 69 74 68 65 72 20 73 74 61 72 74 20  ** either start 
3c10: 77 69 74 68 20 61 20 64 69 67 69 74 20 31 2e 2e  with a digit 1..
3c20: 39 20 6f 72 20 74 68 65 20 6c 65 74 74 65 72 73  9 or the letters
3c30: 20 5b 74 54 79 59 5d 20 61 72 65 20 63 6f 6e 73   [tTyY] are cons
3c40: 69 64 65 72 65 64 0a 2a 2a 20 74 6f 20 62 65 20  idered.** to be 
3c50: 74 72 75 65 2e 20 49 66 20 74 68 69 73 20 66 75  true. If this fu
3c60: 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 69  nction cannot fi
3c70: 6e 64 20 61 20 6d 61 74 63 68 69 6e 67 20 6b 65  nd a matching ke
3c80: 79 2f 76 61 6c 75 65 20 74 68 65 6e 0a 2a 2a 20  y/value then.** 
3c90: 64 66 6c 74 20 69 73 20 72 65 74 75 72 6e 65 64  dflt is returned
3ca0: 2e 20 65 2e 67 2e 20 69 66 20 69 74 20 66 69 6e  . e.g. if it fin
3cb0: 64 73 20 74 68 65 20 6b 65 79 20 62 75 74 20 74  ds the key but t
3cc0: 68 65 20 76 61 6c 75 65 20 69 73 2d 61 0a 2a 2a  he value is-a.**
3cd0: 20 4f 62 6a 65 63 74 20 74 68 65 6e 20 64 66 74   Object then dft
3ce0: 6c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  l is returned..*
3cf0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 6e 74 72 79  *.** If an entry
3d00: 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 69 73 20   is found, this 
3d10: 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74  function guarant
3d20: 65 65 73 20 74 68 61 74 20 69 74 20 77 69 6c 6c  ees that it will
3d30: 20 72 65 74 75 72 6e 0a 2a 2a 20 65 69 74 68 65   return.** eithe
3d40: 72 20 30 20 6f 72 20 31 2c 20 61 73 20 6f 70 70  r 0 or 1, as opp
3d50: 6f 73 65 64 20 74 6f 20 22 30 20 6f 72 20 6e 6f  osed to "0 or no
3d60: 6e 2d 7a 65 72 6f 22 2c 20 73 6f 20 74 68 61 74  n-zero", so that
3d70: 20 63 6c 69 65 6e 74 73 20 63 61 6e 0a 2a 2a 20   clients can.** 
3d80: 70 61 73 73 20 61 20 64 69 66 66 65 72 65 6e 74  pass a different
3d90: 20 76 61 6c 75 65 20 61 73 20 64 66 6c 74 2e 20   value as dflt. 
3da0: 54 68 75 73 20 74 68 65 79 20 63 61 6e 20 75 73  Thus they can us
3db0: 65 2c 20 65 2e 67 2e 20 2d 31 20 74 6f 20 6b 6e  e, e.g. -1 to kn
3dc0: 6f 77 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72  ow.** whether or
3dd0: 20 6e 6f 74 20 74 68 69 73 20 66 75 6e 63 74 69   not this functi
3de0: 6f 6e 20 66 6f 75 6e 64 20 61 20 6d 61 74 63 68  on found a match
3df0: 20 28 69 74 20 77 69 6c 6c 20 72 65 74 75 72 6e   (it will return
3e00: 20 2d 31 20 69 6e 0a 2a 2a 20 74 68 61 74 20 63   -1 in.** that c
3e10: 61 73 65 29 2e 0a 2a 2f 0a 63 68 61 72 20 6a 73  ase)..*/.char js
3e20: 6f 6e 5f 67 65 74 65 6e 76 5f 62 6f 6f 6c 28 63  on_getenv_bool(c
3e30: 68 61 72 20 63 6f 6e 73 74 20 2a 20 70 4b 65 79  har const * pKey
3e40: 2c 20 63 68 61 72 20 64 66 6c 74 20 29 7b 0a 20  , char dflt ){. 
3e50: 20 63 73 6f 6e 5f 76 61 6c 75 65 20 63 6f 6e 73   cson_value cons
3e60: 74 20 2a 20 76 20 3d 20 6a 73 6f 6e 5f 67 65 74  t * v = json_get
3e70: 65 6e 76 28 70 4b 65 79 29 3b 0a 20 20 69 66 28  env(pKey);.  if(
3e80: 21 76 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  !v){.    return 
3e90: 64 66 6c 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  dflt;.  }else if
3ea0: 28 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 69 73 5f  ( cson_value_is_
3eb0: 6e 75 6d 62 65 72 28 76 29 20 29 7b 0a 20 20 20  number(v) ){.   
3ec0: 20 72 65 74 75 72 6e 20 63 73 6f 6e 5f 76 61 6c   return cson_val
3ed0: 75 65 5f 67 65 74 5f 69 6e 74 65 67 65 72 28 76  ue_get_integer(v
3ee0: 29 20 3f 20 31 20 3a 20 30 3b 0a 20 20 7d 65 6c  ) ? 1 : 0;.  }el
3ef0: 73 65 20 69 66 28 20 63 73 6f 6e 5f 76 61 6c 75  se if( cson_valu
3f00: 65 5f 69 73 5f 73 74 72 69 6e 67 28 76 29 20 29  e_is_string(v) )
3f10: 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  {.    char const
3f20: 20 2a 20 73 76 20 3d 20 63 73 6f 6e 5f 73 74 72   * sv = cson_str
3f30: 69 6e 67 5f 63 73 74 72 28 63 73 6f 6e 5f 76 61  ing_cstr(cson_va
3f40: 6c 75 65 5f 67 65 74 5f 73 74 72 69 6e 67 28 76  lue_get_string(v
3f50: 29 29 3b 0a 20 20 20 20 69 66 28 21 2a 73 76 20  ));.    if(!*sv 
3f60: 7c 7c 20 28 27 30 27 3d 3d 2a 73 76 29 29 7b 0a  || ('0'==*sv)){.
3f70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
3f80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3f90: 20 72 65 74 75 72 6e 20 28 28 28 27 31 27 3c 3d   return ((('1'<=
3fa0: 2a 73 76 29 20 26 26 20 28 27 39 27 3e 3d 2a 73  *sv) && ('9'>=*s
3fb0: 76 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  v)).            
3fc0: 20 20 7c 7c 20 28 27 74 27 3d 3d 2a 73 76 29 20    || ('t'==*sv) 
3fd0: 7c 7c 20 28 27 54 27 3d 3d 2a 73 76 29 0a 20 20  || ('T'==*sv).  
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
3ff0: 27 79 27 3d 3d 2a 73 76 29 20 7c 7c 20 28 27 59  'y'==*sv) || ('Y
4000: 27 3d 3d 2a 73 76 29 0a 20 20 20 20 20 20 20 20  '==*sv).        
4010: 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 20 20        ).        
4020: 3f 20 31 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 20  ? 1 : 0;.    }. 
4030: 20 7d 65 6c 73 65 20 69 66 28 20 63 73 6f 6e 5f   }else if( cson_
4040: 76 61 6c 75 65 5f 69 73 5f 62 6f 6f 6c 28 76 29  value_is_bool(v)
4050: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 63   ){.    return c
4060: 73 6f 6e 5f 76 61 6c 75 65 5f 67 65 74 5f 62 6f  son_value_get_bo
4070: 6f 6c 28 76 29 20 3f 20 31 20 3a 20 30 3b 0a 20  ol(v) ? 1 : 0;. 
4080: 20 7d 65 6c 73 65 20 69 66 28 20 63 73 6f 6e 5f   }else if( cson_
4090: 76 61 6c 75 65 5f 69 73 5f 6e 75 6c 6c 28 76 29  value_is_null(v)
40a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
40b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
40c0: 65 74 75 72 6e 20 64 66 6c 74 3b 0a 20 20 7d 0a  eturn dflt;.  }.
40d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  }../*.** Returns
40e0: 20 74 68 65 20 73 74 72 69 6e 67 20 66 6f 72 6d   the string form
40f0: 20 6f 66 20 61 20 6a 73 6f 6e 5f 67 65 74 65 6e   of a json_geten
4100: 76 28 29 20 76 61 6c 75 65 2c 20 62 75 74 20 4f  v() value, but O
4110: 4e 4c 59 20 49 66 20 74 68 61 74 0a 2a 2a 20 76  NLY If that.** v
4120: 61 6c 75 65 20 69 73 2d 61 20 53 74 72 69 6e 67  alue is-a String
4130: 2e 20 4e 6f 6e 2d 73 74 72 69 6e 67 73 20 61 72  . Non-strings ar
4140: 65 20 6e 6f 74 20 63 6f 6e 76 65 72 74 65 64 20  e not converted 
4150: 74 6f 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 2a  to strings for.*
4160: 2a 20 74 68 69 73 20 70 75 72 70 6f 73 65 2e 20  * this purpose. 
4170: 52 65 74 75 72 6e 65 64 20 6d 65 6d 6f 72 79 20  Returned memory 
4180: 69 73 20 6f 77 6e 65 64 20 62 79 20 67 2e 6a 73  is owned by g.js
4190: 6f 6e 20 6f 72 20 66 6f 73 73 69 6c 20 61 6e 64  on or fossil and
41a0: 20 69 73 0a 2a 2a 20 76 61 6c 69 64 20 75 6e 74   is.** valid unt
41b0: 69 6c 20 65 6e 64 2d 6f 66 2d 61 70 70 20 6f 72  il end-of-app or
41c0: 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 20 69   the given key i
41d0: 73 20 72 65 70 6c 61 63 65 64 20 69 6e 20 66 6f  s replaced in fo
41e0: 73 73 69 6c 27 73 0a 2a 2a 20 69 6e 74 65 72 6e  ssil's.** intern
41f0: 61 6c 73 20 76 69 61 20 63 67 69 5f 72 65 70 6c  als via cgi_repl
4200: 61 63 65 5f 70 61 72 61 6d 65 74 65 72 28 29 20  ace_parameter() 
4210: 61 6e 64 20 66 72 69 65 6e 64 73 20 6f 72 20 6a  and friends or j
4220: 73 6f 6e 5f 73 65 74 65 6e 76 28 29 2e 0a 2a 2f  son_setenv()..*/
4230: 0a 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 6a 73  .char const * js
4240: 6f 6e 5f 67 65 74 65 6e 76 5f 63 73 74 72 28 20  on_getenv_cstr( 
4250: 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 7a 4b 65  char const * zKe
4260: 79 20 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 73  y ){.  return cs
4270: 6f 6e 5f 76 61 6c 75 65 5f 67 65 74 5f 63 73 74  on_value_get_cst
4280: 72 28 20 6a 73 6f 6e 5f 67 65 74 65 6e 76 28 7a  r( json_getenv(z
4290: 4b 65 79 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Key) );.}../*.**
42a0: 20 41 6e 20 65 78 74 65 6e 64 65 64 20 66 6f 72   An extended for
42b0: 6d 20 6f 66 20 66 69 6e 64 5f 6f 70 74 69 6f 6e  m of find_option
42c0: 28 29 20 77 68 69 63 68 20 74 72 69 65 73 20 74  () which tries t
42d0: 6f 20 6c 6f 6f 6b 20 75 70 20 61 20 63 6f 6d 62  o look up a comb
42e0: 6f 0a 2a 2a 20 47 45 54 2f 50 4f 53 54 2f 43 4c  o.** GET/POST/CL
42f0: 49 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  I argument..**.*
4300: 2a 20 7a 4b 65 79 20 6d 75 73 74 20 62 65 20 74  * zKey must be t
4310: 68 65 20 47 45 54 2f 50 4f 53 54 20 70 61 72 61  he GET/POST para
4320: 6d 65 74 65 72 20 6b 65 79 2e 20 7a 43 4c 49 4c  meter key. zCLIL
4330: 6f 6e 67 20 6d 75 73 74 20 62 65 20 74 68 65 20  ong must be the 
4340: 22 6c 6f 6e 67 0a 73 2a 2a 20 66 6f 72 6d 22 20  "long.s** form" 
4350: 43 4c 49 20 66 6c 61 67 20 28 4e 55 4c 4c 20 6d  CLI flag (NULL m
4360: 65 61 6e 73 20 74 6f 20 75 73 65 20 7a 4b 65 79  eans to use zKey
4370: 29 2e 20 7a 43 4c 49 53 68 6f 72 74 20 6d 61 79  ). zCLIShort may
4380: 20 62 65 20 4e 55 4c 4c 20 6f 72 0a 2a 2a 20 74   be NULL or.** t
4390: 68 65 20 22 73 68 6f 72 74 20 66 6f 72 6d 22 20  he "short form" 
43a0: 43 4c 49 20 66 6c 61 67 20 28 69 66 20 4e 55 4c  CLI flag (if NUL
43b0: 4c 2c 20 6e 6f 20 73 68 6f 72 74 20 66 6f 72 6d  L, no short form
43c0: 20 69 73 20 75 73 65 64 29 2e 0a 2a 2a 0a 2a 2a   is used)..**.**
43d0: 20 49 66 20 61 72 67 50 6f 73 20 69 73 20 3e 3d   If argPos is >=
43e0: 30 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 6d  0 and no other m
43f0: 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 0a 2a  atch is found,.*
4400: 2a 20 6a 73 6f 6e 5f 63 6f 6d 6d 61 6e 64 5f 61  * json_command_a
4410: 72 67 28 61 72 67 50 6f 73 29 20 69 73 20 61 6c  rg(argPos) is al
4420: 73 6f 20 63 68 65 63 6b 65 64 2e 0a 2a 2a 0a 2a  so checked..**.*
4430: 2a 20 4f 6e 20 65 72 72 6f 72 20 28 6e 6f 20 6d  * On error (no m
4440: 61 74 63 68 20 66 6f 75 6e 64 29 20 4e 55 4c 4c  atch found) NULL
4450: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
4460: 0a 2a 2a 20 54 68 69 73 20 4f 4e 4c 59 20 77 6f  .** This ONLY wo
4470: 72 6b 73 20 66 6f 72 20 53 74 72 69 6e 67 20 4a  rks for String J
4480: 53 4f 4e 2f 47 45 54 2f 43 4c 49 20 76 61 6c 75  SON/GET/CLI valu
4490: 65 73 2c 20 6e 6f 74 20 4a 53 4f 4e 0a 2a 2a 20  es, not JSON.** 
44a0: 62 6f 6f 6c 65 61 6e 73 20 61 6e 64 20 77 68 61  booleans and wha
44b0: 74 6e 6f 74 2e 0a 2a 2f 0a 63 68 61 72 20 63 6f  tnot..*/.char co
44c0: 6e 73 74 20 2a 20 6a 73 6f 6e 5f 66 69 6e 64 5f  nst * json_find_
44d0: 6f 70 74 69 6f 6e 5f 63 73 74 72 32 28 63 68 61  option_cstr2(cha
44e0: 72 20 63 6f 6e 73 74 20 2a 20 7a 4b 65 79 2c 0a  r const * zKey,.
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4510: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
4520: 20 7a 43 4c 49 4c 6f 6e 67 2c 0a 20 20 20 20 20   zCLILong,.     
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
4550: 68 61 72 20 63 6f 6e 73 74 20 2a 20 7a 43 4c 49  har const * zCLI
4560: 53 68 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20  Short,.         
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61             int a
4590: 72 67 50 6f 73 29 7b 0a 20 20 63 68 61 72 20 63  rgPos){.  char c
45a0: 6f 6e 73 74 20 2a 20 72 63 20 3d 20 4e 55 4c 4c  onst * rc = NULL
45b0: 3b 0a 20 20 61 73 73 65 72 74 28 4e 55 4c 4c 20  ;.  assert(NULL 
45c0: 21 3d 20 7a 4b 65 79 29 3b 0a 20 20 69 66 28 21  != zKey);.  if(!
45d0: 67 2e 69 73 48 54 54 50 29 7b 0a 20 20 20 20 72  g.isHTTP){.    r
45e0: 63 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28  c = find_option(
45f0: 7a 43 4c 49 4c 6f 6e 67 20 3f 20 7a 43 4c 49 4c  zCLILong ? zCLIL
4600: 6f 6e 67 20 3a 20 7a 4b 65 79 2c 0a 20 20 20 20  ong : zKey,.    
4610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4620: 20 7a 43 4c 49 53 68 6f 72 74 2c 20 31 29 3b 0a   zCLIShort, 1);.
4630: 20 20 7d 0a 20 20 69 66 28 21 72 63 20 26 26 20    }.  if(!rc && 
4640: 66 6f 73 73 69 6c 5f 68 61 73 5f 6a 73 6f 6e 28  fossil_has_json(
4650: 29 29 7b 0a 20 20 20 20 72 63 20 3d 20 6a 73 6f  )){.    rc = jso
4660: 6e 5f 67 65 74 65 6e 76 5f 63 73 74 72 28 7a 4b  n_getenv_cstr(zK
4670: 65 79 29 3b 0a 20 20 20 20 69 66 28 21 72 63 20  ey);.    if(!rc 
4680: 26 26 20 7a 43 4c 49 53 68 6f 72 74 29 7b 0a 20  && zCLIShort){. 
4690: 20 20 20 20 20 72 63 20 3d 20 63 73 6f 6e 5f 76       rc = cson_v
46a0: 61 6c 75 65 5f 67 65 74 5f 63 73 74 72 28 20 63  alue_get_cstr( c
46b0: 73 6f 6e 5f 6f 62 6a 65 63 74 5f 67 65 74 28 20  son_object_get( 
46c0: 67 2e 6a 73 6f 6e 2e 70 61 72 61 6d 2e 6f 2c 20  g.json.param.o, 
46d0: 7a 43 4c 49 53 68 6f 72 74 29 20 29 3b 0a 20 20  zCLIShort) );.  
46e0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 21 72 63    }.  }.  if(!rc
46f0: 20 26 26 20 28 61 72 67 50 6f 73 3e 3d 30 29 29   && (argPos>=0))
4700: 7b 0a 20 20 20 20 72 63 20 3d 20 6a 73 6f 6e 5f  {.    rc = json_
4710: 63 6f 6d 6d 61 6e 64 5f 61 72 67 28 28 75 6e 73  command_arg((uns
4720: 69 67 6e 65 64 20 63 68 61 72 29 61 72 67 50 6f  igned char)argPo
4730: 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  s);.  }.  return
4740: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
4750: 6f 72 74 2d 68 61 6e 64 20 66 6f 72 6d 20 6f 66  ort-hand form of
4760: 20 6a 73 6f 6e 5f 66 69 6e 64 5f 6f 70 74 69 6f   json_find_optio
4770: 6e 5f 63 73 74 72 32 28 7a 4b 65 79 2c 7a 43 4c  n_cstr2(zKey,zCL
4780: 49 4c 6f 6e 67 2c 7a 43 4c 49 53 68 6f 72 74 2c  ILong,zCLIShort,
4790: 2d 31 29 2e 0a 2a 2f 0a 63 68 61 72 20 63 6f 6e  -1)..*/.char con
47a0: 73 74 20 2a 20 6a 73 6f 6e 5f 66 69 6e 64 5f 6f  st * json_find_o
47b0: 70 74 69 6f 6e 5f 63 73 74 72 28 63 68 61 72 20  ption_cstr(char 
47c0: 63 6f 6e 73 74 20 2a 20 7a 4b 65 79 2c 0a 20 20  const * zKey,.  
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47f0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 7a 43   char const * zC
4800: 4c 49 4c 6f 6e 67 2c 0a 20 20 20 20 20 20 20 20  LILong,.        
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
4830: 63 6f 6e 73 74 20 2a 20 7a 43 4c 49 53 68 6f 72  const * zCLIShor
4840: 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 6a 73 6f  t){.  return jso
4850: 6e 5f 66 69 6e 64 5f 6f 70 74 69 6f 6e 5f 63 73  n_find_option_cs
4860: 74 72 32 28 7a 4b 65 79 2c 20 7a 43 4c 49 4c 6f  tr2(zKey, zCLILo
4870: 6e 67 2c 20 7a 43 4c 49 53 68 6f 72 74 2c 20 2d  ng, zCLIShort, -
4880: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  1);.}../*.** The
4890: 20 62 6f 6f 6c 65 61 6e 20 65 71 75 69 76 61 6c   boolean equival
48a0: 65 6e 74 20 6f 66 20 6a 73 6f 6e 5f 66 69 6e 64  ent of json_find
48b0: 5f 6f 70 74 69 6f 6e 5f 63 73 74 72 28 29 2e 0a  _option_cstr()..
48c0: 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6f 6e  ** If the option
48d0: 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 64   is not found, d
48e0: 66 74 6c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ftl is returned.
48f0: 0a 2a 2f 0a 63 68 61 72 20 6a 73 6f 6e 5f 66 69  .*/.char json_fi
4900: 6e 64 5f 6f 70 74 69 6f 6e 5f 62 6f 6f 6c 28 63  nd_option_bool(c
4910: 68 61 72 20 63 6f 6e 73 74 20 2a 20 7a 4b 65 79  har const * zKey
4920: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4930: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61               cha
4940: 72 20 63 6f 6e 73 74 20 2a 20 7a 43 4c 49 4c 6f  r const * zCLILo
4950: 6e 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng,.            
4960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
4970: 68 61 72 20 63 6f 6e 73 74 20 2a 20 7a 43 4c 49  har const * zCLI
4980: 53 68 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20  Short,.         
4990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49a0: 20 20 63 68 61 72 20 64 66 6c 74 20 29 7b 0a 20    char dflt ){. 
49b0: 20 63 68 61 72 20 72 63 20 3d 20 2d 31 3b 0a 20   char rc = -1;. 
49c0: 20 69 66 28 21 67 2e 69 73 48 54 54 50 29 7b 0a   if(!g.isHTTP){.
49d0: 20 20 20 20 69 66 28 4e 55 4c 4c 20 21 3d 20 66      if(NULL != f
49e0: 69 6e 64 5f 6f 70 74 69 6f 6e 28 7a 43 4c 49 4c  ind_option(zCLIL
49f0: 6f 6e 67 20 3f 20 7a 43 4c 49 4c 6f 6e 67 20 3a  ong ? zCLILong :
4a00: 20 7a 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20   zKey,.         
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a20: 20 20 7a 43 4c 49 53 68 6f 72 74 2c 20 30 29 29    zCLIShort, 0))
4a30: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  {.      rc = 1;.
4a40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 28      }.  }.  if((
4a50: 2d 31 3d 3d 72 63 29 20 26 26 20 66 6f 73 73 69  -1==rc) && fossi
4a60: 6c 5f 68 61 73 5f 6a 73 6f 6e 28 29 29 7b 0a 20  l_has_json()){. 
4a70: 20 20 20 72 63 20 3d 20 6a 73 6f 6e 5f 67 65 74     rc = json_get
4a80: 65 6e 76 5f 62 6f 6f 6c 28 7a 4b 65 79 2c 2d 31  env_bool(zKey,-1
4a90: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4aa0: 28 2d 31 3d 3d 72 63 29 20 3f 20 64 66 6c 74 20  (-1==rc) ? dflt 
4ab0: 3a 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  : rc;.}../*.** T
4ac0: 68 65 20 69 6e 74 65 67 65 72 20 65 71 75 69 76  he integer equiv
4ad0: 61 6c 65 6e 74 20 6f 66 20 6a 73 6f 6e 5f 66 69  alent of json_fi
4ae0: 6e 64 5f 6f 70 74 69 6f 6e 5f 63 73 74 72 32 28  nd_option_cstr2(
4af0: 29 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74  )..** If the opt
4b00: 69 6f 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  ion is not found
4b10: 2c 20 64 66 74 6c 20 69 73 20 72 65 74 75 72 6e  , dftl is return
4b20: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 6a 73 6f 6e 5f  ed..*/.int json_
4b30: 66 69 6e 64 5f 6f 70 74 69 6f 6e 5f 69 6e 74 28  find_option_int(
4b40: 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 7a 4b 65  char const * zKe
4b50: 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
4b70: 20 63 6f 6e 73 74 20 2a 20 7a 43 4c 49 4c 6f 6e   const * zCLILon
4b80: 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
4ba0: 20 63 6f 6e 73 74 20 2a 20 7a 43 4c 49 53 68 6f   const * zCLISho
4bb0: 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
4bd0: 20 64 66 6c 74 20 29 7b 0a 20 20 65 6e 75 6d 20   dflt ){.  enum 
4be0: 7b 20 4d 61 67 69 63 20 3d 20 2d 31 39 34 37 38  { Magic = -19478
4bf0: 35 34 38 33 32 20 7d 3b 0a 20 20 69 6e 74 20 72  54832 };.  int r
4c00: 63 20 3d 20 4d 61 67 69 63 3b 0a 20 20 69 66 28  c = Magic;.  if(
4c10: 21 67 2e 69 73 48 54 54 50 29 7b 0a 20 20 20 20  !g.isHTTP){.    
4c20: 2f 2a 20 46 49 58 4d 45 3a 20 75 73 65 20 73 74  /* FIXME: use st
4c30: 72 74 6f 6c 28 29 20 66 6f 72 20 62 65 74 74 65  rtol() for bette
4c40: 72 20 65 72 72 6f 72 2f 64 66 6c 74 20 68 61 6e  r error/dflt han
4c50: 64 6c 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 63 68  dling. */.    ch
4c60: 61 72 20 63 6f 6e 73 74 20 2a 20 6f 70 74 20 3d  ar const * opt =
4c70: 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 7a 43 4c   find_option(zCL
4c80: 49 4c 6f 6e 67 20 3f 20 7a 43 4c 49 4c 6f 6e 67  ILong ? zCLILong
4c90: 20 3a 20 7a 4b 65 79 2c 0a 20 20 20 20 20 20 20   : zKey,.       
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 4c 49              zCLI
4cc0: 53 68 6f 72 74 2c 20 31 29 3b 0a 20 20 20 20 69  Short, 1);.    i
4cd0: 66 28 4e 55 4c 4c 21 3d 6f 70 74 29 7b 0a 20 20  f(NULL!=opt){.  
4ce0: 20 20 20 20 72 63 20 3d 20 61 74 6f 69 28 6f 70      rc = atoi(op
4cf0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
4d00: 69 66 28 4d 61 67 69 63 3d 3d 72 63 29 7b 0a 20  if(Magic==rc){. 
4d10: 20 20 20 72 63 20 3d 20 6a 73 6f 6e 5f 67 65 74     rc = json_get
4d20: 65 6e 76 5f 69 6e 74 28 7a 4b 65 79 2c 4d 61 67  env_int(zKey,Mag
4d30: 69 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ic);.  }.  retur
4d40: 6e 20 28 4d 61 67 69 63 3d 3d 72 63 29 20 3f 20  n (Magic==rc) ? 
4d50: 64 66 6c 74 20 3a 20 72 63 3b 0a 7d 0a 0a 0a 2f  dflt : rc;.}.../
4d60: 2a 0a 2a 2a 20 41 64 64 73 20 76 20 74 6f 20 67  *.** Adds v to g
4d70: 2e 6a 73 6f 6e 2e 70 61 72 61 6d 2e 6f 20 75 73  .json.param.o us
4d80: 69 6e 67 20 74 68 65 20 67 69 76 65 6e 20 6b 65  ing the given ke
4d90: 79 2e 20 4d 61 79 20 63 61 75 73 65 20 61 6e 79  y. May cause any
4da0: 20 70 72 69 6f 72 0a 2a 2a 20 69 74 65 6d 20 77   prior.** item w
4db0: 69 74 68 20 74 68 61 74 20 6b 65 79 20 74 6f 20  ith that key to 
4dc0: 62 65 20 64 65 73 74 72 6f 79 65 64 20 28 64 65  be destroyed (de
4dd0: 70 65 6e 64 73 20 6f 6e 20 63 75 72 72 65 6e 74  pends on current
4de0: 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 63 6f   reference.** co
4df0: 75 6e 74 20 66 6f 72 20 74 68 61 74 20 76 61 6c  unt for that val
4e00: 75 65 29 2e 20 4f 6e 20 73 75 63 63 65 73 73 2c  ue). On success,
4e10: 20 74 72 61 6e 73 66 65 72 73 20 28 6f 72 20 73   transfers (or s
4e20: 68 61 72 65 73 29 20 6f 77 6e 65 72 73 68 69 70  hares) ownership
4e30: 0a 2a 2a 20 6f 66 20 76 20 74 6f 20 28 6f 72 20  .** of v to (or 
4e40: 77 69 74 68 29 20 67 2e 6a 73 6f 6e 2e 70 61 72  with) g.json.par
4e50: 61 6d 2e 6f 2e 20 4f 6e 20 65 72 72 6f 72 20 6f  am.o. On error o
4e60: 77 6e 65 72 73 68 69 70 20 6f 66 20 76 20 69 73  wnership of v is
4e70: 20 6e 6f 74 0a 2a 2a 20 6d 6f 64 69 66 69 65 64   not.** modified
4e80: 2e 0a 2a 2f 0a 69 6e 74 20 6a 73 6f 6e 5f 73 65  ..*/.int json_se
4e90: 74 65 6e 76 28 20 63 68 61 72 20 63 6f 6e 73 74  tenv( char const
4ea0: 20 2a 20 7a 4b 65 79 2c 20 63 73 6f 6e 5f 76 61   * zKey, cson_va
4eb0: 6c 75 65 20 2a 20 76 20 29 7b 0a 20 20 72 65 74  lue * v ){.  ret
4ec0: 75 72 6e 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f  urn cson_object_
4ed0: 73 65 74 28 20 67 2e 6a 73 6f 6e 2e 70 61 72 61  set( g.json.para
4ee0: 6d 2e 6f 2c 20 7a 4b 65 79 2c 20 76 20 29 3b 0a  m.o, zKey, v );.
4ef0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 75 65 73 73 65 73  }../*.** Guesses
4f00: 20 61 20 52 45 53 50 4f 4e 53 45 20 43 6f 6e 74   a RESPONSE Cont
4f10: 65 6e 74 2d 54 79 70 65 20 76 61 6c 75 65 20 62  ent-Type value b
4f20: 61 73 65 64 20 28 70 72 69 6d 61 72 69 6c 79 29  ased (primarily)
4f30: 20 6f 6e 20 74 68 65 0a 2a 2a 20 48 54 54 50 5f   on the.** HTTP_
4f40: 41 43 43 45 50 54 20 68 65 61 64 65 72 2e 0a 2a  ACCEPT header..*
4f50: 2a 0a 2a 2a 20 49 74 20 77 69 6c 6c 20 74 72 79  *.** It will try
4f60: 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 69   to figure out i
4f70: 66 20 74 68 65 20 63 6c 69 65 6e 74 20 63 61 6e  f the client can
4f80: 20 73 75 70 70 6f 72 74 0a 2a 2a 20 61 70 70 6c   support.** appl
4f90: 69 63 61 74 69 6f 6e 2f 6a 73 6f 6e 20 6f 72 20  ication/json or 
4fa0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6a 61 76 61  application/java
4fb0: 73 63 72 69 70 74 2c 20 61 6e 64 20 77 69 6c 6c  script, and will
4fc0: 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 0a 2a 2a   fall back to.**
4fd0: 20 74 65 78 74 2f 70 6c 61 69 6e 20 69 66 20 69   text/plain if i
4fe0: 74 20 63 61 6e 6e 6f 74 20 66 69 67 75 72 65 20  t cannot figure 
4ff0: 6f 75 74 20 61 6e 79 74 68 69 6e 67 20 6d 6f 72  out anything mor
5000: 65 20 73 70 65 63 69 66 69 63 2e 0a 2a 2a 0a 2a  e specific..**.*
5010: 2a 20 52 65 74 75 72 6e 65 64 20 6d 65 6d 6f 72  * Returned memor
5020: 79 20 69 73 20 73 74 61 74 69 63 20 61 6e 64 20  y is static and 
5030: 69 6d 6d 75 74 61 62 6c 65 2c 20 62 75 74 20 69  immutable, but i
5040: 66 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e  f the environmen
5050: 74 0a 2a 2a 20 63 68 61 6e 67 65 73 20 61 66 74  t.** changes aft
5060: 65 72 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  er calling this 
5070: 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20  then subsequent 
5080: 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 66 75  calls to this fu
5090: 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20  nction.** might 
50a0: 72 65 74 75 72 6e 20 64 69 66 66 65 72 65 6e 74  return different
50b0: 20 28 61 6c 73 6f 20 73 74 61 74 69 63 2f 69 6d   (also static/im
50c0: 6d 75 74 61 62 6c 65 29 20 76 61 6c 75 65 73 2e  mutable) values.
50d0: 0a 2a 2f 0a 63 68 61 72 20 63 6f 6e 73 74 20 2a  .*/.char const *
50e0: 20 6a 73 6f 6e 5f 67 75 65 73 73 5f 63 6f 6e 74   json_guess_cont
50f0: 65 6e 74 5f 74 79 70 65 28 29 7b 0a 20 20 63 68  ent_type(){.  ch
5100: 61 72 20 63 6f 6e 73 74 20 2a 20 63 73 65 74 3b  ar const * cset;
5110: 0a 20 20 63 68 61 72 20 64 6f 55 74 66 38 3b 0a  .  char doUtf8;.
5120: 20 20 63 73 65 74 20 3d 20 50 44 28 22 48 54 54    cset = PD("HTT
5130: 50 5f 41 43 43 45 50 54 5f 43 48 41 52 53 45 54  P_ACCEPT_CHARSET
5140: 22 2c 4e 55 4c 4c 29 3b 0a 20 20 64 6f 55 74 66  ",NULL);.  doUtf
5150: 38 20 3d 20 28 28 4e 55 4c 4c 20 3d 3d 20 63 73  8 = ((NULL == cs
5160: 65 74 29 20 7c 7c 20 28 4e 55 4c 4c 21 3d 73 74  et) || (NULL!=st
5170: 72 73 74 72 28 22 75 74 66 2d 38 22 2c 63 73 65  rstr("utf-8",cse
5180: 74 29 29 29 0a 20 20 20 20 3f 20 31 20 3a 20 30  t))).    ? 1 : 0
5190: 3b 0a 20 20 69 66 28 20 67 2e 6a 73 6f 6e 2e 6a  ;.  if( g.json.j
51a0: 73 6f 6e 70 20 29 7b 0a 20 20 20 20 72 65 74 75  sonp ){.    retu
51b0: 72 6e 20 64 6f 55 74 66 38 0a 20 20 20 20 20 20  rn doUtf8.      
51c0: 3f 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6a  ? "application/j
51d0: 61 76 61 73 63 72 69 70 74 3b 20 63 68 61 72 73  avascript; chars
51e0: 65 74 3d 75 74 66 2d 38 22 0a 20 20 20 20 20 20  et=utf-8".      
51f0: 3a 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6a  : "application/j
5200: 61 76 61 73 63 72 69 70 74 22 3b 0a 20 20 7d 65  avascript";.  }e
5210: 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  lse{.    /*.    
5220: 20 20 43 6f 6e 74 65 6e 74 2d 74 79 70 65 0a 20    Content-type. 
5230: 20 20 20 20 20 0a 20 20 20 20 20 20 49 66 20 74       .      If t
5240: 68 65 20 62 72 6f 77 73 65 72 20 64 6f 65 73 20  he browser does 
5250: 6e 6f 74 20 73 65 6e 74 20 61 6e 20 41 43 43 45  not sent an ACCE
5260: 50 54 20 66 6f 72 20 61 70 70 6c 69 63 61 74 69  PT for applicati
5270: 6f 6e 2f 6a 73 6f 6e 0a 20 20 20 20 20 20 74 68  on/json.      th
5280: 65 6e 20 77 65 20 66 61 6c 6c 20 62 61 63 6b 20  en we fall back 
5290: 74 6f 20 74 65 78 74 2f 70 6c 61 69 6e 2e 0a 20  to text/plain.. 
52a0: 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63     */.    char c
52b0: 6f 6e 73 74 20 2a 20 63 73 74 72 3b 0a 20 20 20  onst * cstr;.   
52c0: 20 63 73 74 72 20 3d 20 50 44 28 22 48 54 54 50   cstr = PD("HTTP
52d0: 5f 41 43 43 45 50 54 22 2c 4e 55 4c 4c 29 3b 0a  _ACCEPT",NULL);.
52e0: 20 20 20 20 69 66 28 20 4e 55 4c 4c 20 3d 3d 20      if( NULL == 
52f0: 63 73 74 72 20 29 7b 0a 20 20 20 20 20 20 72 65  cstr ){.      re
5300: 74 75 72 6e 20 64 6f 55 74 66 38 0a 20 20 20 20  turn doUtf8.    
5310: 20 20 20 20 3f 20 22 61 70 70 6c 69 63 61 74 69      ? "applicati
5320: 6f 6e 2f 6a 73 6f 6e 3b 20 63 68 61 72 73 65 74  on/json; charset
5330: 3d 75 74 66 2d 38 22 0a 20 20 20 20 20 20 20 20  =utf-8".        
5340: 3a 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6a  : "application/j
5350: 73 6f 6e 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  son";.    }else{
5360: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 73 74  .      if( strst
5370: 72 28 20 63 73 74 72 2c 20 22 61 70 70 6c 69 63  r( cstr, "applic
5380: 61 74 69 6f 6e 2f 6a 73 6f 6e 22 20 29 0a 20 20  ation/json" ).  
5390: 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 73 74          || strst
53a0: 72 28 20 63 73 74 72 2c 20 22 2a 2f 2a 22 20 29  r( cstr, "*/*" )
53b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
53c0: 72 6e 20 64 6f 55 74 66 38 0a 20 20 20 20 20 20  rn doUtf8.      
53d0: 20 20 20 20 3f 20 22 61 70 70 6c 69 63 61 74 69      ? "applicati
53e0: 6f 6e 2f 6a 73 6f 6e 3b 20 63 68 61 72 73 65 74  on/json; charset
53f0: 3d 75 74 66 2d 38 22 0a 20 20 20 20 20 20 20 20  =utf-8".        
5400: 20 20 3a 20 22 61 70 70 6c 69 63 61 74 69 6f 6e    : "application
5410: 2f 6a 73 6f 6e 22 3b 0a 20 20 20 20 20 20 7d 65  /json";.      }e
5420: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
5430: 75 72 6e 20 22 74 65 78 74 2f 70 6c 61 69 6e 22  urn "text/plain"
5440: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5450: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 6e    }.}../*.** Sen
5460: 64 73 20 70 52 65 73 70 6f 6e 73 65 20 74 6f 20  ds pResponse to 
5470: 74 68 65 20 6f 75 74 70 75 74 20 73 74 72 65 61  the output strea
5480: 6d 20 61 73 20 74 68 65 20 72 65 73 70 6f 6e 73  m as the respons
5490: 65 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 0a  e object.  This.
54a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  ** function does
54b0: 20 6e 6f 20 76 61 6c 69 64 61 74 69 6f 6e 20 6f   no validation o
54c0: 66 20 70 52 65 73 70 6f 6e 73 65 20 65 78 63 65  f pResponse exce
54d0: 70 74 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  pt to assert() t
54e0: 68 61 74 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 74  hat it.** is not
54f0: 20 4e 55 4c 4c 2e 20 54 68 65 20 63 61 6c 6c 65   NULL. The calle
5500: 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
5510: 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68   for ensuring th
5520: 61 74 20 69 74 20 6d 65 65 74 73 0a 2a 2a 20 41  at it meets.** A
5530: 50 49 20 72 65 73 70 6f 6e 73 65 20 65 6e 76 65  PI response enve
5540: 6c 6f 70 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 73  lope conventions
5550: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 43 4c 49 20 6d  ..**.** In CLI m
5560: 6f 64 65 20 70 52 65 73 70 6f 6e 73 65 20 69 73  ode pResponse is
5570: 20 73 65 6e 74 20 74 6f 20 73 74 64 6f 75 74 20   sent to stdout 
5580: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20  immediately. In 
5590: 48 54 54 50 0a 2a 2a 20 6d 6f 64 65 20 70 52 65  HTTP.** mode pRe
55a0: 73 70 6f 6e 73 65 20 72 65 70 6c 61 63 65 73 20  sponse replaces 
55b0: 61 6e 79 20 63 75 72 72 65 6e 74 20 43 47 49 20  any current CGI 
55c0: 63 6f 6e 74 65 6e 74 20 62 75 74 20 63 67 69 5f  content but cgi_
55d0: 72 65 70 6c 79 28 29 0a 2a 2a 20 69 73 20 6e 6f  reply().** is no
55e0: 74 20 63 61 6c 6c 65 64 20 74 6f 20 66 6c 75 73  t called to flus
55f0: 68 20 74 68 65 20 6f 75 74 70 75 74 2e 0a 2a 2a  h the output..**
5600: 0a 2a 2a 20 49 66 20 67 2e 6a 73 6f 6e 2e 6a 73  .** If g.json.js
5610: 6f 6e 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  onp is not NULL 
5620: 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  then the content
5630: 20 74 79 70 65 20 69 73 20 73 65 74 20 74 6f 0a   type is set to.
5640: 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6a  ** application/j
5650: 61 76 61 73 63 72 69 70 74 20 61 6e 64 20 74 68  avascript and th
5660: 65 20 6f 75 74 70 75 74 20 69 73 20 77 72 61 70  e output is wrap
5670: 70 65 64 20 69 6e 20 61 20 6a 73 6f 6e 70 0a 2a  ped in a jsonp.*
5680: 2a 20 77 72 61 70 70 65 72 2e 0a 2a 2f 0a 76 6f  * wrapper..*/.vo
5690: 69 64 20 6a 73 6f 6e 5f 73 65 6e 64 5f 72 65 73  id json_send_res
56a0: 70 6f 6e 73 65 28 20 63 73 6f 6e 5f 76 61 6c 75  ponse( cson_valu
56b0: 65 20 63 6f 6e 73 74 20 2a 20 70 52 65 73 70 6f  e const * pRespo
56c0: 6e 73 65 20 29 7b 0a 20 20 61 73 73 65 72 74 28  nse ){.  assert(
56d0: 20 4e 55 4c 4c 20 21 3d 20 70 52 65 73 70 6f 6e   NULL != pRespon
56e0: 73 65 20 29 3b 0a 20 20 69 66 28 20 67 2e 69 73  se );.  if( g.is
56f0: 48 54 54 50 20 29 7b 0a 20 20 20 20 63 67 69 5f  HTTP ){.    cgi_
5700: 72 65 73 65 74 5f 63 6f 6e 74 65 6e 74 28 29 3b  reset_content();
5710: 0a 20 20 20 20 69 66 28 20 67 2e 6a 73 6f 6e 2e  .    if( g.json.
5720: 6a 73 6f 6e 70 20 29 7b 0a 20 20 20 20 20 20 63  jsonp ){.      c
5730: 67 69 5f 70 72 69 6e 74 66 28 22 25 73 28 22 2c  gi_printf("%s(",
5740: 67 2e 6a 73 6f 6e 2e 6a 73 6f 6e 70 29 3b 0a 20  g.json.jsonp);. 
5750: 20 20 20 7d 0a 20 20 20 20 63 73 6f 6e 5f 6f 75     }.    cson_ou
5760: 74 70 75 74 28 20 70 52 65 73 70 6f 6e 73 65 2c  tput( pResponse,
5770: 20 63 73 6f 6e 5f 64 61 74 61 5f 64 65 73 74 5f   cson_data_dest_
5780: 63 67 69 2c 20 4e 55 4c 4c 2c 20 26 67 2e 6a 73  cgi, NULL, &g.js
5790: 6f 6e 2e 6f 75 74 4f 70 74 20 29 3b 0a 20 20 20  on.outOpt );.   
57a0: 20 69 66 28 20 67 2e 6a 73 6f 6e 2e 6a 73 6f 6e   if( g.json.json
57b0: 70 20 29 7b 0a 20 20 20 20 20 20 63 67 69 5f 61  p ){.      cgi_a
57c0: 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 22 29  ppend_content(")
57d0: 22 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ",1);.    }.  }e
57e0: 6c 73 65 7b 2f 2a 43 4c 49 20 6d 6f 64 65 2a 2f  lse{/*CLI mode*/
57f0: 0a 20 20 20 20 69 66 28 20 67 2e 6a 73 6f 6e 2e  .    if( g.json.
5800: 6a 73 6f 6e 70 20 29 7b 0a 20 20 20 20 20 20 66  jsonp ){.      f
5810: 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 22 25  printf(stdout,"%
5820: 73 28 22 2c 67 2e 6a 73 6f 6e 2e 6a 73 6f 6e 70  s(",g.json.jsonp
5830: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 73 6f  );.    }.    cso
5840: 6e 5f 6f 75 74 70 75 74 5f 46 49 4c 45 28 20 70  n_output_FILE( p
5850: 52 65 73 70 6f 6e 73 65 2c 20 73 74 64 6f 75 74  Response, stdout
5860: 2c 20 26 67 2e 6a 73 6f 6e 2e 6f 75 74 4f 70 74  , &g.json.outOpt
5870: 20 29 3b 0a 20 20 20 20 69 66 28 20 67 2e 6a 73   );.    if( g.js
5880: 6f 6e 2e 6a 73 6f 6e 70 20 29 7b 0a 20 20 20 20  on.jsonp ){.    
5890: 20 20 66 77 72 69 74 65 28 22 29 5c 6e 22 2c 20    fwrite(")\n", 
58a0: 32 2c 20 31 2c 20 73 74 64 6f 75 74 29 3b 0a 20  2, 1, stdout);. 
58b0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
58c0: 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 63 75  * Returns the cu
58d0: 72 72 65 6e 74 20 72 65 71 75 65 73 74 27 73 20  rrent request's 
58e0: 4a 53 4f 4e 20 61 75 74 68 65 6e 74 69 63 61 74  JSON authenticat
58f0: 69 6f 6e 20 74 6f 6b 65 6e 2c 20 6f 72 20 4e 55  ion token, or NU
5900: 4c 4c 20 69 66 0a 2a 2a 20 6e 6f 6e 65 20 69 73  LL if.** none is
5910: 20 66 6f 75 6e 64 2e 20 54 68 65 20 74 6f 6b 65   found. The toke
5920: 6e 27 73 20 6d 65 6d 6f 72 79 20 69 73 20 6f 77  n's memory is ow
5930: 6e 65 64 20 62 79 20 28 6f 72 20 73 68 61 72 65  ned by (or share
5940: 64 20 77 69 74 68 29 0a 2a 2a 20 67 2e 6a 73 6f  d with).** g.jso
5950: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 61  n..**.** If an a
5960: 75 74 68 20 74 6f 6b 65 6e 20 69 73 20 66 6f 75  uth token is fou
5970: 6e 64 20 69 6e 20 74 68 65 20 47 45 54 2f 50 4f  nd in the GET/PO
5980: 53 54 20 72 65 71 75 65 73 74 20 64 61 74 61 20  ST request data 
5990: 74 68 65 6e 20 66 6f 73 73 69 6c 0a 2a 2a 20 69  then fossil.** i
59a0: 73 20 67 69 76 65 6e 20 74 68 61 74 20 64 61 74  s given that dat
59b0: 61 20 66 6f 72 20 75 73 65 20 69 6e 20 61 75 74  a for use in aut
59c0: 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 6f 72 20  hentication for 
59d0: 74 68 69 73 0a 2a 2a 20 73 65 73 73 69 6f 6e 2e  this.** session.
59e0: 20 69 2e 65 2e 20 74 68 65 20 47 45 54 2f 50 4f   i.e. the GET/PO
59f0: 53 54 20 64 61 74 61 20 6f 76 65 72 72 69 64 65  ST data override
5a00: 73 20 66 6f 73 73 69 6c 27 73 20 61 75 74 68 65  s fossil's authe
5a10: 6e 74 69 63 61 74 69 6f 6e 0a 2a 2a 20 63 6f 6f  ntication.** coo
5a20: 6b 69 65 20 76 61 6c 75 65 20 28 69 66 20 61 6e  kie value (if an
5a30: 79 29 20 61 6e 64 20 61 6c 73 6f 20 77 6f 72 6b  y) and also work
5a40: 73 20 77 69 74 68 20 63 6c 69 65 6e 74 73 20 77  s with clients w
5a50: 68 69 63 68 20 64 6f 20 6e 6f 74 0a 2a 2a 20 73  hich do not.** s
5a60: 75 70 70 6f 72 74 20 63 6f 6f 6b 69 65 73 2e 0a  upport cookies..
5a70: 2a 2a 0a 2a 2a 20 4d 75 73 74 20 62 65 20 63 61  **.** Must be ca
5a80: 6c 6c 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  lled once before
5a90: 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65   login_check_cre
5aa0: 64 65 6e 74 69 61 6c 73 28 29 20 69 73 20 63 61  dentials() is ca
5ab0: 6c 6c 65 64 20 6f 72 0a 2a 2a 20 77 65 20 77 69  lled or.** we wi
5ac0: 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74  ll not be able t
5ad0: 6f 20 72 65 70 6c 61 63 65 20 66 6f 73 73 69 6c  o replace fossil
5ae0: 27 73 20 69 6e 74 65 72 6e 61 6c 20 69 64 65 61  's internal idea
5af0: 20 6f 66 20 74 68 65 20 61 75 74 68 0a 2a 2a 20   of the auth.** 
5b00: 69 6e 66 6f 20 69 6e 20 74 69 6d 65 20 28 61 6e  info in time (an
5b10: 64 20 66 75 74 75 72 65 20 63 68 61 6e 67 65 73  d future changes
5b20: 20 74 6f 20 74 68 61 74 20 73 74 61 74 65 20 6d   to that state m
5b30: 61 79 20 63 61 75 73 65 20 75 6e 65 78 70 65 63  ay cause unexpec
5b40: 74 65 64 0a 2a 2a 20 72 65 73 75 6c 74 73 29 2e  ted.** results).
5b50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
5b60: 74 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 61  t of this call a
5b70: 72 65 20 63 61 63 68 65 64 20 66 6f 72 20 66 75  re cached for fu
5b80: 74 75 72 65 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 63  ture calls..*/.c
5b90: 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e  son_value * json
5ba0: 5f 61 75 74 68 5f 74 6f 6b 65 6e 28 29 7b 0a 20  _auth_token(){. 
5bb0: 20 69 66 28 20 21 67 2e 6a 73 6f 6e 2e 61 75 74   if( !g.json.aut
5bc0: 68 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 2f 2a  hToken ){.    /*
5bd0: 20 54 72 79 20 74 6f 20 67 65 74 20 61 6e 20 61   Try to get an a
5be0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 6b  uthorization tok
5bf0: 65 6e 20 66 72 6f 6d 20 47 45 54 20 70 61 72 61  en from GET para
5c00: 6d 65 74 65 72 2c 20 50 4f 53 54 65 64 0a 20 20  meter, POSTed.  
5c10: 20 20 20 20 20 4a 53 4f 4e 2c 20 6f 72 20 66 6f       JSON, or fo
5c20: 73 73 69 6c 20 63 6f 6f 6b 69 65 20 28 69 6e 20  ssil cookie (in 
5c30: 74 68 61 74 20 6f 72 64 65 72 29 2e 20 2a 2f 0a  that order). */.
5c40: 20 20 20 20 67 2e 6a 73 6f 6e 2e 61 75 74 68 54      g.json.authT
5c50: 6f 6b 65 6e 20 3d 20 6a 73 6f 6e 5f 67 65 74 65  oken = json_gete
5c60: 6e 76 28 46 6f 73 73 69 6c 4a 73 6f 6e 4b 65 79  nv(FossilJsonKey
5c70: 73 2e 61 75 74 68 54 6f 6b 65 6e 29 3b 0a 20 20  s.authToken);.  
5c80: 20 20 69 66 28 67 2e 6a 73 6f 6e 2e 61 75 74 68    if(g.json.auth
5c90: 54 6f 6b 65 6e 0a 20 20 20 20 20 20 20 26 26 20  Token.       && 
5ca0: 63 73 6f 6e 5f 76 61 6c 75 65 5f 69 73 5f 73 74  cson_value_is_st
5cb0: 72 69 6e 67 28 67 2e 6a 73 6f 6e 2e 61 75 74 68  ring(g.json.auth
5cc0: 54 6f 6b 65 6e 29 0a 20 20 20 20 20 20 20 26 26  Token).       &&
5cd0: 20 21 50 44 28 6c 6f 67 69 6e 5f 63 6f 6f 6b 69   !PD(login_cooki
5ce0: 65 5f 6e 61 6d 65 28 29 2c 4e 55 4c 4c 29 29 7b  e_name(),NULL)){
5cf0: 0a 20 20 20 20 20 20 2f 2a 20 74 65 6c 6c 20 66  .      /* tell f
5d00: 6f 73 73 69 6c 20 74 6f 20 75 73 65 20 74 68 69  ossil to use thi
5d10: 73 20 6c 6f 67 69 6e 20 69 6e 66 6f 2e 0a 0a 20  s login info... 
5d20: 20 20 20 20 20 46 49 58 4d 45 3f 3a 20 62 65 63       FIXME?: bec
5d30: 61 75 73 65 20 74 68 65 20 4a 53 4f 4e 20 62 69  ause the JSON bi
5d40: 74 73 20 64 6f 6e 27 74 20 63 61 72 72 79 20 61  ts don't carry a
5d50: 72 6f 75 6e 64 0a 20 20 20 20 20 20 6c 6f 67 69  round.      logi
5d60: 6e 5f 63 6f 6f 6b 69 65 5f 6e 61 6d 65 28 29 2c  n_cookie_name(),
5d70: 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65   there is a pote
5d80: 6e 74 69 61 6c 20 6c 6f 67 69 6e 20 68 69 6a 61  ntial login hija
5d90: 63 6b 69 6e 67 0a 20 20 20 20 20 20 77 69 6e 64  cking.      wind
5da0: 6f 77 20 68 65 72 65 2e 20 57 65 20 6d 61 79 20  ow here. We may 
5db0: 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
5dc0: 68 65 20 4a 53 4f 4e 20 61 75 74 68 20 74 6f 6b  he JSON auth tok
5dd0: 65 6e 20 74 6f 20 62 65 0a 20 20 20 20 20 20 69  en to be.      i
5de0: 6e 20 74 68 65 20 66 6f 72 6d 3a 20 6c 6f 67 69  n the form: logi
5df0: 6e 5f 63 6f 6f 6b 69 65 5f 6e 61 6d 65 28 29 3d  n_cookie_name()=
5e00: 2e 2e 2e 0a 0a 20 20 20 20 20 20 54 68 65 6e 20  .....      Then 
5e10: 61 67 61 69 6e 2c 20 74 68 65 20 68 61 72 64 65  again, the harde
5e20: 6e 65 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  ned cookie value
5e30: 20 68 65 6c 70 73 20 65 6e 73 75 72 65 20 74 68   helps ensure th
5e40: 61 74 0a 20 20 20 20 20 20 6f 6e 6c 79 20 61 20  at.      only a 
5e50: 70 72 6f 70 65 72 20 6b 65 79 2f 76 61 6c 75 65  proper key/value
5e60: 20 6d 61 74 63 68 20 69 73 20 76 61 6c 69 64 2e   match is valid.
5e70: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
5e80: 63 67 69 5f 72 65 70 6c 61 63 65 5f 70 61 72 61  cgi_replace_para
5e90: 6d 65 74 65 72 28 20 6c 6f 67 69 6e 5f 63 6f 6f  meter( login_coo
5ea0: 6b 69 65 5f 6e 61 6d 65 28 29 2c 20 63 73 6f 6e  kie_name(), cson
5eb0: 5f 76 61 6c 75 65 5f 67 65 74 5f 63 73 74 72 28  _value_get_cstr(
5ec0: 67 2e 6a 73 6f 6e 2e 61 75 74 68 54 6f 6b 65 6e  g.json.authToken
5ed0: 29 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ) );.    }else i
5ee0: 66 28 20 67 2e 69 73 48 54 54 50 20 29 7b 0a 20  f( g.isHTTP ){. 
5ef0: 20 20 20 20 20 2f 2a 20 74 72 79 20 66 6f 73 73       /* try foss
5f00: 69 6c 27 73 20 63 6f 6e 76 65 6e 74 69 6f 6e 61  il's conventiona
5f10: 6c 20 63 6f 6f 6b 69 65 2e 20 2a 2f 0a 20 20 20  l cookie. */.   
5f20: 20 20 20 2f 2a 20 52 65 6d 69 6e 64 65 72 3a 20     /* Reminder: 
5f30: 63 68 69 63 6b 65 6e 2f 65 67 67 20 73 63 65 6e  chicken/egg scen
5f40: 61 72 69 6f 20 72 65 67 61 72 64 69 6e 67 20 64  ario regarding d
5f50: 62 20 61 63 63 65 73 73 20 69 6e 20 43 4c 49 0a  b access in CLI.
5f60: 20 20 20 20 20 20 20 20 20 6d 6f 64 65 20 62 65           mode be
5f70: 63 61 75 73 65 20 6c 6f 67 69 6e 5f 63 6f 6f 6b  cause login_cook
5f80: 69 65 5f 6e 61 6d 65 28 29 20 6e 65 65 64 73 20  ie_name() needs 
5f90: 74 68 65 20 64 62 2e 20 43 4c 49 0a 20 20 20 20  the db. CLI.    
5fa0: 20 20 20 20 20 6d 6f 64 65 20 64 6f 65 73 20 6e       mode does n
5fb0: 6f 74 20 75 73 65 20 61 6e 79 20 61 75 74 68 65  ot use any authe
5fc0: 6e 74 69 63 61 74 69 6f 6e 2c 20 73 6f 20 77 65  ntication, so we
5fd0: 20 64 6f 6e 27 74 20 6e 65 65 64 0a 20 20 20 20   don't need.    
5fe0: 20 20 20 20 20 74 6f 20 73 75 70 70 6f 72 74 20       to support 
5ff0: 69 74 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a  it here..      *
6000: 2f 0a 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e  /.      char con
6010: 73 74 20 2a 20 7a 43 6f 6f 6b 69 65 20 3d 20 50  st * zCookie = P
6020: 28 6c 6f 67 69 6e 5f 63 6f 6f 6b 69 65 5f 6e 61  (login_cookie_na
6030: 6d 65 28 29 29 3b 0a 20 20 20 20 20 20 69 66 28  me());.      if(
6040: 20 7a 43 6f 6f 6b 69 65 20 26 26 20 2a 7a 43 6f   zCookie && *zCo
6050: 6f 6b 69 65 20 29 7b 0a 20 20 20 20 20 20 20 20  okie ){.        
6060: 2f 2a 20 54 72 61 6e 73 66 65 72 20 66 6f 73 73  /* Transfer foss
6070: 69 6c 27 73 20 63 6f 6f 6b 69 65 20 74 6f 20 4a  il's cookie to J
6080: 53 4f 4e 20 66 6f 72 20 64 6f 77 6e 73 74 72 65  SON for downstre
6090: 61 6d 20 63 6f 6e 76 65 6e 69 65 6e 63 65 2e 2e  am convenience..
60a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 73 6f  . */.        cso
60b0: 6e 5f 76 61 6c 75 65 20 2a 20 76 20 3d 20 63 73  n_value * v = cs
60c0: 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 73 74 72  on_value_new_str
60d0: 69 6e 67 28 7a 43 6f 6f 6b 69 65 2c 20 73 74 72  ing(zCookie, str
60e0: 6c 65 6e 28 7a 43 6f 6f 6b 69 65 29 29 3b 0a 20  len(zCookie));. 
60f0: 20 20 20 20 20 20 20 6a 73 6f 6e 5f 67 63 5f 61         json_gc_a
6100: 64 64 28 20 46 6f 73 73 69 6c 4a 73 6f 6e 4b 65  dd( FossilJsonKe
6110: 79 73 2e 61 75 74 68 54 6f 6b 65 6e 2c 20 76 20  ys.authToken, v 
6120: 29 3b 0a 20 20 20 20 20 20 20 20 67 2e 6a 73 6f  );.        g.jso
6130: 6e 2e 61 75 74 68 54 6f 6b 65 6e 20 3d 20 76 3b  n.authToken = v;
6140: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6150: 20 7d 0a 20 20 72 65 74 75 72 6e 20 67 2e 6a 73   }.  return g.js
6160: 6f 6e 2e 61 75 74 68 54 6f 6b 65 6e 3b 0a 7d 0a  on.authToken;.}.
6170: 0a 2f 2a 0a 2a 2a 20 49 66 20 67 2e 6a 73 6f 6e  ./*.** If g.json
6180: 2e 72 65 71 50 61 79 6c 6f 61 64 2e 6f 20 69 73  .reqPayload.o is
6190: 20 4e 55 4c 4c 20 74 68 65 6e 20 4e 55 4c 4c 20   NULL then NULL 
61a0: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 65 6c 73  is returned, els
61b0: 65 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 70  e the.** given p
61c0: 72 6f 70 65 72 74 79 20 69 73 20 73 65 61 72 63  roperty is searc
61d0: 68 65 64 20 66 6f 72 20 69 6e 20 74 68 65 20 72  hed for in the r
61e0: 65 71 75 65 73 74 20 70 61 79 6c 6f 61 64 2e 20  equest payload. 
61f0: 20 49 66 20 66 6f 75 6e 64 20 69 74 0a 2a 2a 20   If found it.** 
6200: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  is returned. The
6210: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
6220: 69 73 20 6f 77 6e 65 64 20 62 79 20 28 6f 72 20  is owned by (or 
6230: 73 68 61 72 65 73 20 6f 77 6e 65 72 73 68 69 70  shares ownership
6240: 0a 2a 2a 20 77 69 74 68 29 20 67 2e 6a 73 6f 6e  .** with) g.json
6250: 2c 20 61 6e 64 20 6d 75 73 74 20 4e 4f 54 20 62  , and must NOT b
6260: 65 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 66 72 65  e cson_value_fre
6270: 65 28 29 27 64 20 62 79 20 74 68 65 0a 2a 2a 20  e()'d by the.** 
6280: 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 63 73 6f 6e 5f  caller..*/.cson_
6290: 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 72 65 71  value * json_req
62a0: 5f 70 61 79 6c 6f 61 64 5f 67 65 74 28 63 68 61  _payload_get(cha
62b0: 72 20 63 6f 6e 73 74 20 2a 70 4b 65 79 29 7b 0a  r const *pKey){.
62c0: 20 20 72 65 74 75 72 6e 20 67 2e 6a 73 6f 6e 2e    return g.json.
62d0: 72 65 71 50 61 79 6c 6f 61 64 2e 6f 0a 20 20 20  reqPayload.o.   
62e0: 20 3f 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 67   ? cson_object_g
62f0: 65 74 28 67 2e 6a 73 6f 6e 2e 72 65 71 50 61 79  et(g.json.reqPay
6300: 6c 6f 61 64 2e 6f 2c 70 4b 65 79 29 0a 20 20 20  load.o,pKey).   
6310: 20 3a 20 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a   : NULL;.}../*.*
6320: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 73 20 73 6f  * Initializes so
6330: 6d 65 20 4a 53 4f 4e 20 62 69 74 73 20 77 68 69  me JSON bits whi
6340: 63 68 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e  ch need to be in
6350: 69 74 69 61 6c 69 7a 65 64 20 72 65 6c 61 74 69  itialized relati
6360: 76 65 6c 79 0a 2a 2a 20 65 61 72 6c 79 20 6f 6e  vely.** early on
6370: 2e 20 49 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  . It should only
6380: 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   be called from 
6390: 63 67 69 5f 69 6e 69 74 28 29 20 6f 72 0a 2a 2a  cgi_init() or.**
63a0: 20 6a 73 6f 6e 5f 63 6d 64 5f 74 6f 70 28 29 20   json_cmd_top() 
63b0: 28 65 61 72 6c 79 20 6f 6e 20 69 6e 20 74 68 6f  (early on in tho
63c0: 73 65 20 66 75 6e 63 74 69 6f 6e 73 29 2e 0a 2a  se functions)..*
63d0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 73  *.** Initializes
63e0: 20 67 2e 6a 73 6f 6e 2e 67 63 20 61 6e 64 20 67   g.json.gc and g
63f0: 2e 6a 73 6f 6e 2e 70 61 72 61 6d 2e 20 54 68 69  .json.param. Thi
6400: 73 20 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20  s code does not 
6410: 28 61 6e 64 0a 2a 2a 20 6d 75 73 74 20 6e 6f 74  (and.** must not
6420: 29 20 72 65 6c 79 20 6f 6e 20 61 6e 79 20 6f 66  ) rely on any of
6430: 20 74 68 65 20 66 6f 73 73 69 6c 20 65 6e 76 69   the fossil envi
6440: 72 6f 6e 6d 65 6e 74 20 68 61 76 69 6e 67 20 62  ronment having b
6450: 65 65 6e 20 73 65 74 0a 2a 2a 20 75 70 2e 20 65  een set.** up. e
6460: 2e 67 2e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20  .g. it must not 
6470: 75 73 65 20 63 67 69 5f 70 61 72 61 6d 65 74 65  use cgi_paramete
6480: 72 28 29 20 61 6e 64 20 66 72 69 65 6e 64 73 20  r() and friends 
6490: 62 65 63 61 75 73 65 20 74 68 69 73 0a 2a 2a 20  because this.** 
64a0: 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
64b0: 65 66 6f 72 65 20 74 68 6f 73 65 20 64 61 74 61  efore those data
64c0: 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
64d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 6a 73 6f 6e 5f 6d  ..*/.void json_m
64e0: 61 69 6e 5f 62 6f 6f 74 73 74 72 61 70 28 29 7b  ain_bootstrap(){
64f0: 0a 20 20 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20  .  cson_value * 
6500: 76 3b 0a 20 20 61 73 73 65 72 74 28 20 28 4e 55  v;.  assert( (NU
6510: 4c 4c 20 3d 3d 20 67 2e 6a 73 6f 6e 2e 67 63 2e  LL == g.json.gc.
6520: 76 29 20 26 26 20 22 63 67 69 5f 6a 73 6f 6e 5f  v) && "cgi_json_
6530: 62 6f 6f 74 73 74 72 61 70 28 29 20 77 61 73 20  bootstrap() was 
6540: 63 61 6c 6c 65 64 20 74 77 69 63 65 21 22 20 29  called twice!" )
6550: 3b 0a 0a 20 20 2f 2a 20 67 2e 6a 73 6f 6e 2e 67  ;..  /* g.json.g
6560: 63 20 69 73 20 6f 75 72 20 22 67 61 72 62 61 67  c is our "garbag
6570: 65 20 63 6f 6c 6c 65 63 74 6f 72 22 20 2d 20 77  e collector" - w
6580: 68 65 72 65 20 77 65 20 70 75 74 20 4a 53 4f 4e  here we put JSON
6590: 20 76 61 6c 75 65 73 0a 20 20 20 20 20 77 68 69   values.     whi
65a0: 63 68 20 6e 65 65 64 20 61 20 6c 6f 6e 67 20 6c  ch need a long l
65b0: 69 66 65 74 69 6d 65 20 62 75 74 20 64 6f 6e 27  ifetime but don'
65c0: 74 20 68 61 76 65 20 61 20 6c 6f 67 69 63 61 6c  t have a logical
65d0: 20 70 61 72 65 6e 74 20 74 6f 20 70 75 74 0a 20   parent to put. 
65e0: 20 20 20 20 74 68 65 6d 20 69 6e 2e 0a 20 20 2a      them in..  *
65f0: 2f 0a 20 20 76 20 3d 20 63 73 6f 6e 5f 76 61 6c  /.  v = cson_val
6600: 75 65 5f 6e 65 77 5f 61 72 72 61 79 28 29 3b 0a  ue_new_array();.
6610: 20 20 67 2e 6a 73 6f 6e 2e 67 63 2e 76 20 3d 20    g.json.gc.v = 
6620: 76 3b 0a 20 20 67 2e 6a 73 6f 6e 2e 67 63 2e 61  v;.  g.json.gc.a
6630: 20 3d 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 67 65   = cson_value_ge
6640: 74 5f 61 72 72 61 79 28 76 29 3b 0a 20 20 63 73  t_array(v);.  cs
6650: 6f 6e 5f 76 61 6c 75 65 5f 61 64 64 5f 72 65 66  on_value_add_ref
6660: 65 72 65 6e 63 65 28 76 29 0a 20 20 20 20 2f 2a  erence(v).    /*
6670: 20 4e 65 65 64 65 64 20 74 6f 20 61 6c 6c 6f 77   Needed to allow
6680: 20 75 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 74   us to include t
6690: 68 69 73 20 76 61 6c 75 65 20 69 6e 20 6f 74 68  his value in oth
66a0: 65 72 20 4a 53 4f 4e 0a 20 20 20 20 20 20 20 63  er JSON.       c
66b0: 6f 6e 74 61 69 6e 65 72 73 20 77 69 74 68 6f 75  ontainers withou
66c0: 74 20 74 72 61 6e 73 66 65 72 69 6e 67 20 6f 77  t transfering ow
66d0: 6e 65 72 73 68 69 70 20 74 6f 20 74 68 6f 73 65  nership to those
66e0: 20 63 6f 6e 74 61 69 6e 65 72 73 2e 0a 20 20 20   containers..   
66f0: 20 20 20 20 41 6c 6c 20 6f 74 68 65 72 20 70 65      All other pe
6700: 72 73 69 73 74 65 6e 74 20 67 2e 6a 73 6f 6e 2e  rsistent g.json.
6710: 58 58 58 2e 76 20 76 61 6c 75 65 73 20 67 65 74  XXX.v values get
6720: 20 61 70 70 65 6e 64 65 64 20 74 6f 0a 20 20 20   appended to.   
6730: 20 20 20 20 67 2e 6a 73 6f 6e 2e 67 63 2e 61 2c      g.json.gc.a,
6740: 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 61   and therefore a
6750: 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 69  lready have a li
6760: 76 65 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20  ve reference.   
6770: 20 20 20 20 66 6f 72 20 74 68 69 73 20 70 75 72      for this pur
6780: 70 6f 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  pose..    */.   
6790: 20 3b 0a 0a 20 20 2f 2a 0a 20 20 20 20 67 2e 6a   ;..  /*.    g.j
67a0: 73 6f 6e 2e 70 61 72 61 6d 20 68 6f 6c 64 73 20  son.param holds 
67b0: 74 68 65 20 4a 53 4f 4e 69 7a 65 64 20 63 6f 75  the JSONized cou
67c0: 6e 74 65 72 70 61 72 74 20 6f 66 20 66 6f 73 73  nterpart of foss
67d0: 69 6c 27 73 0a 20 20 20 20 63 67 69 5f 70 61 72  il's.    cgi_par
67e0: 61 6d 65 74 65 72 5f 78 78 78 28 29 20 66 61 6d  ameter_xxx() fam
67f0: 69 6c 79 20 6f 66 20 64 61 74 61 2e 20 57 65 20  ily of data. We 
6800: 73 74 6f 72 65 20 74 68 65 6d 20 61 73 20 4a 53  store them as JS
6810: 4f 4e 2c 20 61 73 0a 20 20 20 20 6f 70 70 6f 73  ON, as.    oppos
6820: 65 64 20 74 6f 20 75 73 69 6e 67 20 66 6f 73 73  ed to using foss
6830: 69 6c 27 73 20 64 61 74 61 20 64 69 72 65 63 74  il's data direct
6840: 6c 79 2c 20 62 65 63 61 75 73 65 20 77 65 20 63  ly, because we c
6850: 61 6e 20 72 65 74 61 69 6e 0a 20 20 20 20 66 75  an retain.    fu
6860: 6c 6c 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74  ll type informat
6870: 69 6f 6e 20 66 6f 72 20 64 61 74 61 20 74 68 69  ion for data thi
6880: 73 20 77 61 79 20 28 61 73 20 6f 70 70 6f 73 65  s way (as oppose
6890: 64 20 74 6f 20 69 74 20 61 6c 77 61 79 73 0a 20  d to it always. 
68a0: 20 20 20 62 65 69 6e 67 20 6f 66 20 74 79 70 65     being of type
68b0: 20 73 74 72 69 6e 67 29 2e 0a 20 20 2a 2f 0a 20   string)..  */. 
68c0: 20 76 20 3d 20 63 73 6f 6e 5f 76 61 6c 75 65 5f   v = cson_value_
68d0: 6e 65 77 5f 6f 62 6a 65 63 74 28 29 3b 0a 20 20  new_object();.  
68e0: 67 2e 6a 73 6f 6e 2e 70 61 72 61 6d 2e 76 20 3d  g.json.param.v =
68f0: 20 76 3b 0a 20 20 67 2e 6a 73 6f 6e 2e 70 61 72   v;.  g.json.par
6900: 61 6d 2e 6f 20 3d 20 63 73 6f 6e 5f 76 61 6c 75  am.o = cson_valu
6910: 65 5f 67 65 74 5f 6f 62 6a 65 63 74 28 76 29 3b  e_get_object(v);
6920: 0a 20 20 6a 73 6f 6e 5f 67 63 5f 61 64 64 28 22  .  json_gc_add("
6930: 24 50 41 52 41 4d 53 22 2c 20 76 29 3b 0a 7d 0a  $PARAMS", v);.}.
6940: 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 73 20 61  ./*.** Appends a
6950: 20 77 61 72 6e 69 6e 67 20 6f 62 6a 65 63 74 20   warning object 
6960: 74 6f 20 74 68 65 20 28 70 65 6e 64 69 6e 67 29  to the (pending)
6970: 20 4a 53 4f 4e 20 72 65 73 70 6f 6e 73 65 2e 0a   JSON response..
6980: 2a 2a 0a 2a 2a 20 43 6f 64 65 20 6d 75 73 74 20  **.** Code must 
6990: 62 65 20 61 20 46 53 4c 5f 4a 53 4f 4e 5f 57 5f  be a FSL_JSON_W_
69a0: 78 78 78 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  xxx value from t
69b0: 68 65 20 46 6f 73 73 69 6c 4a 73 6f 6e 43 6f 64  he FossilJsonCod
69c0: 65 73 20 65 6e 75 6d 2e 0a 2a 2a 0a 2a 2a 20 41  es enum..**.** A
69d0: 20 57 61 72 6e 69 6e 67 20 6f 62 6a 65 63 74 20   Warning object 
69e0: 68 61 73 20 74 68 69 73 20 4a 53 4f 4e 20 73 74  has this JSON st
69f0: 72 75 63 74 75 72 65 3a 0a 2a 2a 0a 2a 2a 20 7b  ructure:.**.** {
6a00: 20 22 63 6f 64 65 22 3a 69 6e 74 65 67 65 72 2c   "code":integer,
6a10: 20 22 74 65 78 74 22 3a 22 73 74 72 69 6e 67 22   "text":"string"
6a20: 20 7d 0a 2a 2a 0a 2a 2a 20 42 75 74 20 74 68 65   }.**.** But the
6a30: 20 74 65 78 74 20 70 61 72 74 20 69 73 20 6f 70   text part is op
6a40: 74 69 6f 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  tional..**.** If
6a50: 20 6d 73 67 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c   msg is non-NULL
6a60: 20 61 6e 64 20 6e 6f 74 20 65 6d 70 74 79 20 74   and not empty t
6a70: 68 65 6e 20 69 74 20 69 73 20 75 73 65 64 20 61  hen it is used a
6a80: 73 20 74 68 65 20 22 74 65 78 74 22 0a 2a 2a 20  s the "text".** 
6a90: 70 72 6f 70 65 72 74 79 27 73 20 76 61 6c 75 65  property's value
6aa0: 2e 20 49 74 20 69 73 20 63 6f 70 69 65 64 2c 20  . It is copied, 
6ab0: 61 6e 64 20 6e 65 65 64 20 6e 6f 74 20 72 65 66  and need not ref
6ac0: 65 72 20 74 6f 20 73 74 61 74 69 63 0a 2a 2a 20  er to static.** 
6ad0: 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 43 55  memory..**.** CU
6ae0: 52 52 45 4e 54 4c 59 20 74 68 69 73 20 63 6f 64  RRENTLY this cod
6af0: 65 20 6f 6e 6c 79 20 61 6c 6c 6f 77 73 20 61 20  e only allows a 
6b00: 67 69 76 65 6e 20 77 61 72 6e 69 6e 67 20 63 6f  given warning co
6b10: 64 65 20 74 6f 20 62 65 0a 2a 2a 20 61 64 64 65  de to be.** adde
6b20: 64 20 6f 6e 65 20 74 69 6d 65 2c 20 61 6e 64 20  d one time, and 
6b30: 65 6c 69 64 65 73 20 73 75 62 73 65 71 75 65 6e  elides subsequen
6b40: 74 20 77 61 72 6e 69 6e 67 73 2e 20 54 68 65 20  t warnings. The 
6b50: 69 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 69 73 20  intention.** is 
6b60: 74 6f 20 72 65 6d 6f 76 65 20 74 68 61 74 20 62  to remove that b
6b70: 75 72 64 65 6e 20 66 72 6f 6d 20 6c 6f 6f 70 73  urden from loops
6b80: 20 77 68 69 63 68 20 70 72 6f 64 75 63 65 20 77   which produce w
6b90: 61 72 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 46  arnings..**.** F
6ba0: 49 58 4d 45 3a 20 69 66 20 6d 73 67 20 69 73 20  IXME: if msg is 
6bb0: 4e 55 4c 4c 20 74 68 65 6e 20 75 73 65 20 61 20  NULL then use a 
6bc0: 73 74 61 6e 64 61 72 64 20 73 74 72 69 6e 67 20  standard string 
6bd0: 66 6f 72 0a 2a 2a 20 74 68 65 20 67 69 76 65 6e  for.** the given
6be0: 20 63 6f 64 65 2e 20 49 66 20 21 2a 6d 73 67 20   code. If !*msg 
6bf0: 74 68 65 6e 20 65 6c 69 64 65 20 74 68 65 20 22  then elide the "
6c00: 74 65 78 74 22 20 70 72 6f 70 65 72 74 79 2c 0a  text" property,.
6c10: 2a 2a 20 66 6f 72 20 63 6f 6e 73 69 73 74 65 6e  ** for consisten
6c20: 63 79 20 77 69 74 68 20 68 6f 77 20 6a 73 6f 6e  cy with how json
6c30: 5f 65 72 72 28 29 20 77 6f 72 6b 73 2e 0a 2a 2f  _err() works..*/
6c40: 0a 76 6f 69 64 20 6a 73 6f 6e 5f 77 61 72 6e 28  .void json_warn(
6c50: 20 69 6e 74 20 63 6f 64 65 2c 20 63 68 61 72 20   int code, char 
6c60: 63 6f 6e 73 74 20 2a 20 66 6d 74 2c 20 2e 2e 2e  const * fmt, ...
6c70: 20 29 7b 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63   ){.  cson_objec
6c80: 74 20 2a 20 6f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a  t * obj = NULL;.
6c90: 20 20 61 73 73 65 72 74 28 20 28 63 6f 64 65 3e    assert( (code>
6ca0: 46 53 4c 5f 4a 53 4f 4e 5f 57 5f 53 54 41 52 54  FSL_JSON_W_START
6cb0: 29 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  ).          && (
6cc0: 63 6f 64 65 3c 46 53 4c 5f 4a 53 4f 4e 5f 57 5f  code<FSL_JSON_W_
6cd0: 45 4e 44 29 0a 20 20 20 20 20 20 20 20 20 20 26  END).          &
6ce0: 26 20 22 49 6e 76 61 6c 69 64 20 77 61 72 6e 69  & "Invalid warni
6cf0: 6e 67 20 63 6f 64 65 2e 22 29 3b 0a 20 20 69 66  ng code.");.  if
6d00: 28 21 67 2e 6a 73 6f 6e 2e 77 61 72 6e 69 6e 67  (!g.json.warning
6d10: 73 2e 76 29 7b 0a 20 20 20 20 67 2e 6a 73 6f 6e  s.v){.    g.json
6d20: 2e 77 61 72 6e 69 6e 67 73 2e 76 20 3d 20 63 73  .warnings.v = cs
6d30: 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 61 72 72  on_value_new_arr
6d40: 61 79 28 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ay();.    assert
6d50: 28 28 4e 55 4c 4c 20 21 3d 20 67 2e 6a 73 6f 6e  ((NULL != g.json
6d60: 2e 77 61 72 6e 69 6e 67 73 2e 76 29 20 26 26 20  .warnings.v) && 
6d70: 22 41 6c 6c 6f 63 20 65 72 72 6f 72 2e 22 29 3b  "Alloc error.");
6d80: 0a 20 20 20 20 67 2e 6a 73 6f 6e 2e 77 61 72 6e  .    g.json.warn
6d90: 69 6e 67 73 2e 61 20 3d 20 63 73 6f 6e 5f 76 61  ings.a = cson_va
6da0: 6c 75 65 5f 67 65 74 5f 61 72 72 61 79 28 67 2e  lue_get_array(g.
6db0: 6a 73 6f 6e 2e 77 61 72 6e 69 6e 67 73 2e 76 29  json.warnings.v)
6dc0: 3b 0a 20 20 20 20 6a 73 6f 6e 5f 67 63 5f 61 64  ;.    json_gc_ad
6dd0: 64 28 22 24 57 41 52 4e 49 4e 47 53 22 2c 67 2e  d("$WARNINGS",g.
6de0: 6a 73 6f 6e 2e 77 61 72 6e 69 6e 67 73 2e 76 29  json.warnings.v)
6df0: 3b 0a 20 20 7d 0a 20 20 6f 62 6a 20 3d 20 63 73  ;.  }.  obj = cs
6e00: 6f 6e 5f 6e 65 77 5f 6f 62 6a 65 63 74 28 29 3b  on_new_object();
6e10: 0a 20 20 63 73 6f 6e 5f 61 72 72 61 79 5f 61 70  .  cson_array_ap
6e20: 70 65 6e 64 28 67 2e 6a 73 6f 6e 2e 77 61 72 6e  pend(g.json.warn
6e30: 69 6e 67 73 2e 61 2c 20 63 73 6f 6e 5f 6f 62 6a  ings.a, cson_obj
6e40: 65 63 74 5f 76 61 6c 75 65 28 6f 62 6a 29 29 3b  ect_value(obj));
6e50: 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73  .  cson_object_s
6e60: 65 74 28 6f 62 6a 2c 22 63 6f 64 65 22 2c 63 73  et(obj,"code",cs
6e70: 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 69 6e 74  on_value_new_int
6e80: 65 67 65 72 28 63 6f 64 65 29 29 3b 0a 20 20 69  eger(code));.  i
6e90: 66 28 66 6d 74 20 26 26 20 2a 66 6d 74 29 7b 0a  f(fmt && *fmt){.
6ea0: 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a 20 74 72      /* FIXME: tr
6eb0: 65 61 74 20 4e 55 4c 4c 20 66 6d 74 20 61 73 20  eat NULL fmt as 
6ec0: 73 74 61 6e 64 61 72 64 20 77 61 72 6e 69 6e 67  standard warning
6ed0: 20 6d 65 73 73 61 67 65 20 66 6f 72 0a 20 20 20   message for.   
6ee0: 20 20 20 20 74 68 65 20 63 6f 64 65 2c 20 62 75      the code, bu
6ef0: 74 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20  t we don't have 
6f00: 74 68 6f 73 65 20 79 65 74 2e 0a 20 20 20 20 2a  those yet..    *
6f10: 2f 0a 20 20 20 20 76 61 5f 6c 69 73 74 20 76 61  /.    va_list va
6f20: 72 67 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 20  rgs;.    char * 
6f30: 6d 73 67 3b 0a 20 20 20 20 76 61 5f 73 74 61 72  msg;.    va_star
6f40: 74 28 76 61 72 67 73 2c 66 6d 74 29 3b 0a 20 20  t(vargs,fmt);.  
6f50: 20 20 6d 73 67 20 3d 20 76 6d 70 72 69 6e 74 66    msg = vmprintf
6f60: 28 66 6d 74 2c 76 61 72 67 73 29 3b 0a 20 20 20  (fmt,vargs);.   
6f70: 20 76 61 5f 65 6e 64 28 76 61 72 67 73 29 3b 0a   va_end(vargs);.
6f80: 20 20 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f      cson_object_
6f90: 73 65 74 28 6f 62 6a 2c 22 74 65 78 74 22 2c 20  set(obj,"text", 
6fa0: 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 73  cson_value_new_s
6fb0: 74 72 69 6e 67 28 6d 73 67 2c 73 74 72 6c 65 6e  tring(msg,strlen
6fc0: 28 6d 73 67 29 29 29 3b 0a 20 20 20 20 66 72 65  (msg)));.    fre
6fd0: 65 28 6d 73 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e(msg);.  }.}../
6fe0: 2a 0a 2a 2a 20 53 70 6c 69 74 73 20 7a 53 74 72  *.** Splits zStr
6ff0: 20 28 77 68 69 63 68 20 6d 75 73 74 20 6e 6f 74   (which must not
7000: 20 62 65 20 4e 55 4c 4c 29 20 69 6e 74 6f 20 74   be NULL) into t
7010: 6f 6b 65 6e 73 20 73 65 70 61 72 61 74 65 64 20  okens separated 
7020: 62 79 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20  by the.** given 
7030: 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63  separator charac
7040: 74 65 72 2e 20 49 66 20 64 6f 44 65 48 74 74 70  ter. If doDeHttp
7050: 20 69 73 20 74 72 75 65 20 74 68 65 6e 20 65 61   is true then ea
7060: 63 68 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 77 69  ch element.** wi
7070: 6c 6c 20 62 65 20 70 61 73 73 65 64 20 74 68 72  ll be passed thr
7080: 6f 75 67 68 20 64 65 68 74 74 70 69 7a 65 28 29  ough dehttpize()
7090: 2c 20 6f 74 68 65 72 77 69 73 65 20 74 68 65 79  , otherwise they
70a0: 20 61 72 65 20 75 73 65 64 0a 2a 2a 20 61 73 2d   are used.** as-
70b0: 69 73 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 6f  is. Note that to
70c0: 6b 65 6e 69 7a 61 74 69 6f 6e 20 68 61 70 70 65  kenization happe
70d0: 6e 73 20 62 65 66 6f 72 65 20 64 65 68 74 74 70  ns before dehttp
70e0: 69 7a 65 28 29 2c 0a 2a 2a 20 77 68 69 63 68 20  ize(),.** which 
70f0: 69 73 20 73 69 67 6e 69 66 69 63 61 6e 74 20 69  is significant i
7100: 66 20 74 68 65 20 45 4e 63 6f 64 65 64 20 74 6f  f the ENcoded to
7110: 6b 65 6e 73 20 6d 69 67 68 74 20 63 6f 6e 74 61  kens might conta
7120: 69 6e 20 74 68 65 0a 2a 2a 20 73 65 70 61 72 61  in the.** separa
7130: 74 6f 72 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  tor character..*
7140: 2a 0a 2a 2a 20 45 61 63 68 20 6e 65 77 20 65 6c  *.** Each new el
7150: 65 6d 65 6e 74 20 69 73 20 61 70 70 65 6e 64 65  ement is appende
7160: 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 74  d to the given t
7170: 61 72 67 65 74 20 61 72 72 61 79 20 6f 62 6a 65  arget array obje
7180: 63 74 2c 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73  ct,.** which mus
7190: 74 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 61 6e  t not be NULL an
71a0: 64 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 69  d ownership of i
71b0: 74 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  t is not changed
71c0: 20 62 79 20 74 68 69 73 0a 2a 2a 20 63 61 6c 6c   by this.** call
71d0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
71e0: 73 73 2c 20 72 65 74 75 72 6e 73 20 74 68 65 20  ss, returns the 
71f0: 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73  number of tokens
7200: 20 5f 65 6e 63 6f 75 6e 74 65 72 65 64 5f 2e 20   _encountered_. 
7210: 4f 6e 20 65 72 72 6f 72 20 61 0a 2a 2a 20 4e 45  On error a.** NE
7220: 47 41 54 49 56 45 20 6e 75 6d 62 65 72 20 69 73  GATIVE number is
7230: 20 72 65 74 75 72 6e 65 64 20 2d 20 69 74 73 20   returned - its 
7240: 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 69  absolute value i
7250: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
7260: 2a 2a 20 74 6f 6b 65 6e 73 20 65 6e 63 6f 75 6e  ** tokens encoun
7270: 74 65 72 65 64 20 28 69 2e 65 2e 20 69 74 20 72  tered (i.e. it r
7280: 65 76 65 61 6c 73 20 77 68 69 63 68 20 74 6f 6b  eveals which tok
7290: 65 6e 20 69 6e 20 7a 53 74 72 20 77 61 73 0a 2a  en in zStr was.*
72a0: 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 29 2e 0a  * problematic)..
72b0: 2a 2a 0a 2a 2a 20 41 63 68 74 75 6e 67 3a 20 6c  **.** Achtung: l
72c0: 65 61 64 69 6e 67 20 61 6e 64 20 74 72 61 69 6c  eading and trail
72d0: 69 6e 67 20 77 68 69 74 65 73 70 61 63 65 20 6f  ing whitespace o
72e0: 66 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 65  f elements are e
72f0: 6c 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 63 68  lided..**.** Ach
7300: 74 75 6e 67 3a 20 65 6d 70 74 79 20 65 6c 65 6d  tung: empty elem
7310: 65 6e 74 73 20 77 69 6c 6c 20 62 65 20 73 6b 69  ents will be ski
7320: 70 70 65 64 2c 20 6d 65 61 6e 69 6e 67 20 63 6f  pped, meaning co
7330: 6e 73 65 63 75 74 69 76 65 20 65 6d 70 74 79 0a  nsecutive empty.
7340: 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20  ** elements are 
7350: 63 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a 69 6e  collapsed..*/.in
7360: 74 20 6a 73 6f 6e 5f 73 74 72 69 6e 67 5f 73 70  t json_string_sp
7370: 6c 69 74 28 20 63 68 61 72 20 63 6f 6e 73 74 20  lit( char const 
7380: 2a 20 7a 53 74 72 2c 0a 20 20 20 20 20 20 20 20  * zStr,.        
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
73a0: 68 61 72 20 73 65 70 61 72 61 74 6f 72 2c 0a 20  har separator,. 
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73c0: 20 20 20 20 20 20 63 68 61 72 20 64 6f 44 65 48        char doDeH
73d0: 74 74 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ttp,.           
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 63 73 6f 6e              cson
73f0: 5f 61 72 72 61 79 20 2a 20 74 61 72 67 65 74 20  _array * target 
7400: 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ){.  char const 
7410: 2a 20 70 20 3d 20 7a 53 74 72 20 2f 2a 20 63 75  * p = zStr /* cu
7420: 72 72 65 6e 74 20 62 79 74 65 20 2a 2f 3b 0a 20  rrent byte */;. 
7430: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 68 65   char const * he
7440: 61 64 20 20 2f 2a 20 63 75 72 72 65 6e 74 20 73  ad  /* current s
7450: 74 61 72 74 2d 6f 66 2d 74 6f 6b 65 6e 20 2a 2f  tart-of-token */
7460: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
7470: 20 6c 65 6e 20 3d 20 30 20 20 20 2f 2a 20 63 75   len = 0   /* cu
7480: 72 72 65 6e 74 20 74 6f 6b 65 6e 27 73 20 6c 65  rrent token's le
7490: 6e 67 74 68 20 2a 2f 3b 0a 20 20 69 6e 74 20 72  ngth */;.  int r
74a0: 63 20 3d 20 30 20 20 20 2f 2a 20 72 65 74 75 72  c = 0   /* retur
74b0: 6e 20 63 6f 64 65 20 28 6e 75 6d 62 65 72 20 6f  n code (number o
74c0: 66 20 61 64 64 65 64 20 65 6c 65 6d 65 6e 74 73  f added elements
74d0: 29 2a 2f 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  )*/;.  assert( z
74e0: 53 74 72 20 26 26 20 74 61 72 67 65 74 20 29 3b  Str && target );
74f0: 0a 20 20 77 68 69 6c 65 28 20 66 6f 73 73 69 6c  .  while( fossil
7500: 5f 69 73 73 70 61 63 65 28 2a 70 29 20 29 7b 0a  _isspace(*p) ){.
7510: 20 20 20 20 2b 2b 70 3b 0a 20 20 7d 0a 20 20 68      ++p;.  }.  h
7520: 65 61 64 20 3d 20 70 3b 0a 20 20 66 6f 72 28 20  ead = p;.  for( 
7530: 3b 20 3b 20 2b 2b 70 29 7b 0a 20 20 20 20 69 66  ; ; ++p){.    if
7540: 28 20 21 2a 70 20 7c 7c 20 28 73 65 70 61 72 61  ( !*p || (separa
7550: 74 6f 72 20 3d 3d 20 2a 70 29 20 29 7b 0a 20 20  tor == *p) ){.  
7560: 20 20 20 20 69 66 28 20 6c 65 6e 20 29 7b 2f 2a      if( len ){/*
7570: 20 61 70 70 65 6e 64 20 68 65 61 64 2e 2e 28 68   append head..(h
7580: 65 61 64 2b 6c 65 6e 29 20 61 73 20 6e 65 78 74  ead+len) as next
7590: 20 61 72 72 61 79 0a 20 20 20 20 20 20 20 20 20   array.         
75a0: 20 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e            elemen
75b0: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 73  t. */.        cs
75c0: 6f 6e 5f 76 61 6c 75 65 20 2a 20 70 61 72 74 20  on_value * part 
75d0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  = NULL;.        
75e0: 63 68 61 72 20 2a 20 7a 50 61 72 74 20 3d 20 4e  char * zPart = N
75f0: 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 2b 2b 72  ULL;.        ++r
7600: 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  c;.        asser
7610: 74 28 20 68 65 61 64 20 21 3d 20 70 20 29 3b 0a  t( head != p );.
7620: 20 20 20 20 20 20 20 20 7a 50 61 72 74 20 3d 20          zPart = 
7630: 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 6c 65  (char*)malloc(le
7640: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 61 73  n+1);.        as
7650: 73 65 72 74 28 20 28 7a 50 61 72 74 20 21 3d 20  sert( (zPart != 
7660: 4e 55 4c 4c 29 20 26 26 20 22 6d 61 6c 6c 6f 63  NULL) && "malloc
7670: 20 66 61 69 6c 75 72 65 22 20 29 3b 0a 20 20 20   failure" );.   
7680: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 50 61 72       memcpy(zPar
7690: 74 2c 20 68 65 61 64 2c 20 6c 65 6e 29 3b 0a 20  t, head, len);. 
76a0: 20 20 20 20 20 20 20 7a 50 61 72 74 5b 6c 65 6e         zPart[len
76b0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  ] = 0;.        i
76c0: 66 28 64 6f 44 65 48 74 74 70 29 7b 0a 20 20 20  f(doDeHttp){.   
76d0: 20 20 20 20 20 20 20 64 65 68 74 74 70 69 7a 65         dehttpize
76e0: 28 7a 50 61 72 74 29 3b 0a 20 20 20 20 20 20 20  (zPart);.       
76f0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a   }.        if( *
7700: 7a 50 61 72 74 20 29 7b 20 2f 2a 20 73 68 6f 75  zPart ){ /* shou
7710: 6c 64 20 6f 6e 6c 79 20 66 61 69 6c 20 69 66 20  ld only fail if 
7720: 73 6f 6d 65 6f 6e 65 20 6d 61 6e 61 67 65 73 20  someone manages 
7730: 74 6f 20 75 72 6c 2d 65 6e 63 6f 64 65 64 20 61  to url-encoded a
7740: 20 4e 55 4c 20 62 79 74 65 20 2a 2f 0a 20 20 20   NUL byte */.   
7750: 20 20 20 20 20 20 20 70 61 72 74 20 3d 20 63 73         part = cs
7760: 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 73 74 72  on_value_new_str
7770: 69 6e 67 28 7a 50 61 72 74 2c 20 73 74 72 6c 65  ing(zPart, strle
7780: 6e 28 7a 50 61 72 74 29 29 3b 0a 20 20 20 20 20  n(zPart));.     
7790: 20 20 20 20 20 69 66 28 20 30 20 21 3d 20 63 73       if( 0 != cs
77a0: 6f 6e 5f 61 72 72 61 79 5f 61 70 70 65 6e 64 28  on_array_append(
77b0: 20 74 61 72 67 65 74 2c 20 70 61 72 74 20 29 20   target, part ) 
77c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
77d0: 73 6f 6e 5f 76 61 6c 75 65 5f 66 72 65 65 28 70  son_value_free(p
77e0: 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  art);.          
77f0: 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20    rc = -rc;.    
7800: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7810: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7820: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7830: 20 20 20 20 61 73 73 65 72 74 28 30 20 26 26 20      assert(0 && 
7840: 22 69 20 64 69 64 6e 27 74 20 74 68 69 6e 6b 20  "i didn't think 
7850: 74 68 69 73 20 77 61 73 20 70 6f 73 73 69 62 6c  this was possibl
7860: 65 21 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e!");.          
7870: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
7880: 25 73 3a 25 64 3a 20 4d 79 20 47 6f 64 21 20 49  %s:%d: My God! I
7890: 74 27 73 20 66 75 6c 6c 20 6f 66 20 73 74 61 72  t's full of star
78a0: 73 21 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  s!\n",.         
78b0: 20 20 20 20 20 20 20 20 20 5f 5f 46 49 4c 45 5f           __FILE_
78c0: 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  _, __LINE__);.  
78d0: 20 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 65          fossil_e
78e0: 78 69 74 28 31 29 0a 20 20 20 20 20 20 20 20 20  xit(1).         
78f0: 20 20 20 2f 2a 20 4e 6f 74 20 66 6f 73 73 69 6c     /* Not fossil
7900: 5f 70 61 6e 69 63 28 29 20 62 2f 63 20 74 68 69  _panic() b/c thi
7910: 73 20 63 6f 64 65 20 6e 65 65 64 73 20 74 6f 20  s code needs to 
7920: 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  be able to.     
7930: 20 20 20 20 20 20 20 20 20 72 75 6e 20 62 65 66           run bef
7940: 6f 72 65 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  ore some of the 
7950: 66 6f 73 73 69 6c 2f 6a 73 6f 6e 20 62 69 74 73  fossil/json bits
7960: 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
7970: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7980: 61 6e 64 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63  and fossil_panic
7990: 28 29 20 63 61 6c 6c 73 20 69 6e 74 6f 20 74 68  () calls into th
79a0: 65 20 4a 53 4f 4e 20 41 50 49 2e 0a 20 20 20 20  e JSON API..    
79b0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
79c0: 20 20 20 20 20 20 20 3b 0a 20 20 20 20 20 20 20         ;.       
79d0: 20 7d 0a 20 20 20 20 20 20 20 20 66 72 65 65 28   }.        free(
79e0: 7a 50 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  zPart);.        
79f0: 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  len = 0;.      }
7a00: 0a 20 20 20 20 20 20 69 66 28 20 21 2a 70 20 29  .      if( !*p )
7a10: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
7a20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 68  .      }.      h
7a30: 65 61 64 20 3d 20 70 2b 31 3b 0a 20 20 20 20 20  ead = p+1;.     
7a40: 20 77 68 69 6c 65 28 20 2a 68 65 61 64 20 26 26   while( *head &&
7a50: 20 66 6f 73 73 69 6c 5f 69 73 73 70 61 63 65 28   fossil_isspace(
7a60: 2a 68 65 61 64 29 20 29 7b 0a 20 20 20 20 20 20  *head) ){.      
7a70: 20 20 2b 2b 68 65 61 64 3b 0a 20 20 20 20 20 20    ++head;.      
7a80: 20 20 2b 2b 70 3b 0a 20 20 20 20 20 20 7d 0a 20    ++p;.      }. 
7a90: 20 20 20 20 20 69 66 28 21 2a 68 65 61 64 29 7b       if(!*head){
7aa0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
7ab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f        }.      co
7ac0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
7ad0: 20 20 2b 2b 6c 65 6e 3b 0a 20 20 7d 0a 20 20 72    ++len;.  }.  r
7ae0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7af0: 2a 2a 20 57 72 61 70 70 65 72 20 61 72 6f 75 6e  ** Wrapper aroun
7b00: 64 20 6a 73 6f 6e 5f 73 74 72 69 6e 67 5f 73 70  d json_string_sp
7b10: 6c 69 74 28 29 2c 20 74 61 6b 69 6e 67 20 74 68  lit(), taking th
7b20: 65 20 73 61 6d 65 20 66 69 72 73 74 20 33 0a 2a  e same first 3.*
7b30: 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 73 20  * parameters as 
7b40: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 62  this function, b
7b50: 75 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 72  ut returns the r
7b60: 65 73 75 6c 74 73 20 61 73 20 61 20 4a 53 4f 4e  esults as a JSON
7b70: 0a 2a 2a 20 41 72 72 61 79 20 28 69 66 20 73 70  .** Array (if sp
7b80: 6c 69 74 74 69 6e 67 20 70 72 6f 64 75 63 65 64  litting produced
7b90: 20 74 6f 6b 65 6e 73 29 20 6f 72 20 4e 55 4c 4c   tokens) or NULL
7ba0: 20 28 69 66 20 73 70 6c 69 74 74 69 6e 67 20 66   (if splitting f
7bb0: 61 69 6c 65 64 0a 2a 2a 20 69 6e 20 61 6e 79 20  ailed.** in any 
7bc0: 77 61 79 20 6f 72 20 70 72 6f 64 75 63 65 64 20  way or produced 
7bd0: 6e 6f 20 74 6f 6b 65 6e 73 29 2e 0a 2a 2a 0a 2a  no tokens)..**.*
7be0: 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
7bf0: 61 6c 75 65 20 69 73 20 6f 77 6e 65 64 20 62 79  alue is owned by
7c00: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 66 20   the caller. If 
7c10: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74  not NULL then it
7c20: 0a 2a 2a 20 5f 77 69 6c 6c 5f 20 68 61 76 65 20  .** _will_ have 
7c30: 61 20 4a 53 4f 4e 20 74 79 70 65 20 6f 66 20 41  a JSON type of A
7c40: 72 72 61 79 2e 0a 2a 2f 0a 63 73 6f 6e 5f 76 61  rray..*/.cson_va
7c50: 6c 75 65 20 2a 20 6a 73 6f 6e 5f 73 74 72 69 6e  lue * json_strin
7c60: 67 5f 73 70 6c 69 74 32 28 20 63 68 61 72 20 63  g_split2( char c
7c70: 6f 6e 73 74 20 2a 20 7a 53 74 72 2c 0a 20 20 20  onst * zStr,.   
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68                ch
7ca0: 61 72 20 73 65 70 61 72 61 74 6f 72 2c 0a 20 20  ar separator,.  
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
7cd0: 68 61 72 20 64 6f 44 65 48 74 74 70 20 29 7b 0a  har doDeHttp ){.
7ce0: 20 20 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 76    cson_value * v
7cf0: 20 3d 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65   = cson_value_ne
7d00: 77 5f 61 72 72 61 79 28 29 3b 0a 20 20 63 73 6f  w_array();.  cso
7d10: 6e 5f 61 72 72 61 79 20 2a 20 61 20 3d 20 63 73  n_array * a = cs
7d20: 6f 6e 5f 76 61 6c 75 65 5f 67 65 74 5f 61 72 72  on_value_get_arr
7d30: 61 79 28 76 29 3b 0a 20 20 69 6e 74 20 72 63 20  ay(v);.  int rc 
7d40: 3d 20 6a 73 6f 6e 5f 73 74 72 69 6e 67 5f 73 70  = json_string_sp
7d50: 6c 69 74 28 20 7a 53 74 72 2c 20 73 65 70 61 72  lit( zStr, separ
7d60: 61 74 6f 72 2c 20 64 6f 44 65 48 74 74 70 2c 20  ator, doDeHttp, 
7d70: 61 20 29 3b 0a 20 20 69 66 28 20 30 20 3d 3d 20  a );.  if( 0 == 
7d80: 72 63 20 29 7b 0a 20 20 20 20 63 73 6f 6e 5f 76  rc ){.    cson_v
7d90: 61 6c 75 65 5f 66 72 65 65 28 76 29 3b 0a 20 20  alue_free(v);.  
7da0: 20 20 76 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 65    v = NULL;.  }e
7db0: 6c 73 65 20 69 66 28 72 63 3c 30 29 7b 0a 20 20  lse if(rc<0){.  
7dc0: 20 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 66 72 65    cson_value_fre
7dd0: 65 28 76 29 3b 0a 20 20 20 20 76 20 3d 20 4e 55  e(v);.    v = NU
7de0: 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  LL;.  }.  return
7df0: 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 65   v;.}.../*.** Pe
7e00: 72 66 6f 72 6d 73 20 73 6f 6d 65 20 63 6f 6d 6d  rforms some comm
7e10: 6f 6e 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  on initializatio
7e20: 6e 20 6f 66 20 4a 53 4f 4e 2d 72 65 6c 61 74 65  n of JSON-relate
7e30: 64 20 73 74 61 74 65 2e 20 20 4d 75 73 74 20 62  d state.  Must b
7e40: 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 62 79 20 74  e.** called by t
7e50: 68 65 20 6a 73 6f 6e 5f 70 61 67 65 5f 74 6f 70  he json_page_top
7e60: 28 29 20 61 6e 64 20 6a 73 6f 6e 5f 63 6d 64 5f  () and json_cmd_
7e70: 74 6f 70 28 29 20 64 69 73 70 61 74 63 68 69 6e  top() dispatchin
7e80: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 74  g.** functions t
7e90: 6f 20 73 65 74 20 75 70 20 74 68 65 20 4a 53 4f  o set up the JSO
7ea0: 4e 20 73 74 61 74 20 75 73 65 64 20 62 79 20 74  N stat used by t
7eb0: 68 65 20 64 69 73 70 61 74 63 68 65 64 20 66 75  he dispatched fu
7ec0: 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  nctions..**.** I
7ed0: 6d 70 6c 69 63 69 74 6c 79 20 73 65 74 73 20 75  mplicitly sets u
7ee0: 70 20 74 68 65 20 6c 6f 67 69 6e 20 69 6e 66 6f  p the login info
7ef0: 72 6d 61 74 69 6f 6e 20 73 74 61 74 65 20 69 6e  rmation state in
7f00: 20 43 47 49 20 6d 6f 64 65 2c 20 62 75 74 0a 2a   CGI mode, but.*
7f10: 2a 20 64 6f 65 73 20 6e 6f 74 20 70 65 72 66 6f  * does not perfo
7f20: 72 6d 20 61 6e 79 20 70 65 72 6d 69 73 73 69 6f  rm any permissio
7f30: 6e 73 20 63 68 65 63 6b 69 6e 67 2e 20 49 74 20  ns checking. It 
7f40: 5f 6d 69 67 68 74 5f 20 28 68 61 76 65 6e 27 74  _might_ (haven't
7f50: 0a 2a 2a 20 74 65 73 74 65 64 20 74 68 69 73 29  .** tested this)
7f60: 20 64 69 65 20 77 69 74 68 20 61 6e 20 65 72 72   die with an err
7f70: 6f 72 20 69 66 20 61 6e 20 61 75 74 68 20 63 6f  or if an auth co
7f80: 6f 6b 69 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  okie is malforme
7f90: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 75  d..**.** This mu
7fa0: 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20  st be called by 
7fb0: 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 4a 53  the top-level JS
7fc0: 4f 4e 20 63 6f 6d 6d 61 6e 64 20 64 69 73 70 61  ON command dispa
7fd0: 74 63 68 69 6e 67 20 63 6f 64 65 0a 2a 2a 20 62  tching code.** b
7fe0: 65 66 6f 72 65 20 74 68 65 79 20 64 6f 20 61 6e  efore they do an
7ff0: 79 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  y work..**.** Th
8000: 69 73 20 6d 75 73 74 20 6f 6e 6c 79 20 62 65 20  is must only be 
8010: 63 61 6c 6c 65 64 20 6f 6e 63 65 2c 20 6f 72 20  called once, or 
8020: 61 6e 20 61 73 73 65 72 74 69 6f 6e 20 6d 61 79  an assertion may
8030: 20 62 65 20 74 72 69 67 67 65 72 65 64 2e 0a 2a   be triggered..*
8040: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
8050: 6f 6e 5f 6d 6f 64 65 5f 62 6f 6f 74 73 74 72 61  on_mode_bootstra
8060: 70 28 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  p(){.  static ch
8070: 61 72 20 6f 6e 63 65 20 3d 20 30 20 20 2f 2a 20  ar once = 0  /* 
8080: 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 6d 75  guard against mu
8090: 6c 74 69 70 6c 65 20 72 75 6e 73 20 2a 2f 3b 0a  ltiple runs */;.
80a0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 7a    char const * z
80b0: 50 61 74 68 20 3d 20 50 28 22 50 41 54 48 5f 49  Path = P("PATH_I
80c0: 4e 46 4f 22 29 3b 0a 20 20 61 73 73 65 72 74 28  NFO");.  assert(
80d0: 20 28 30 3d 3d 6f 6e 63 65 29 20 26 26 20 22 6a   (0==once) && "j
80e0: 73 6f 6e 5f 6d 6f 64 65 5f 62 6f 6f 74 73 74 72  son_mode_bootstr
80f0: 61 70 28 29 20 63 61 6c 6c 65 64 20 74 6f 6f 20  ap() called too 
8100: 6d 61 6e 79 20 74 69 6d 65 73 21 22 29 3b 0a 20  many times!");. 
8110: 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20   if( once ){.   
8120: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
8130: 7b 0a 20 20 20 20 6f 6e 63 65 20 3d 20 31 3b 0a  {.    once = 1;.
8140: 20 20 7d 0a 20 20 67 2e 6a 73 6f 6e 2e 69 73 4a    }.  g.json.isJ
8150: 73 6f 6e 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 67  sonMode = 1;.  g
8160: 2e 6a 73 6f 6e 2e 72 65 73 75 6c 74 43 6f 64 65  .json.resultCode
8170: 20 3d 20 30 3b 0a 20 20 67 2e 6a 73 6f 6e 2e 63   = 0;.  g.json.c
8180: 6d 64 2e 6f 66 66 73 65 74 20 3d 20 2d 31 3b 0a  md.offset = -1;.
8190: 20 20 67 2e 6a 73 6f 6e 2e 6a 73 6f 6e 70 20 3d    g.json.jsonp =
81a0: 20 50 44 28 22 6a 73 6f 6e 70 22 2c 4e 55 4c 4c   PD("jsonp",NULL
81b0: 29 0a 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a 20  ).    /* FIXME: 
81c0: 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63  do some sanity c
81d0: 68 65 63 6b 69 6e 67 20 6f 6e 20 67 2e 6a 73 6f  hecking on g.jso
81e0: 6e 2e 6a 73 6f 6e 70 20 61 6e 64 20 69 67 6e 6f  n.jsonp and igno
81f0: 72 65 20 69 74 0a 20 20 20 20 20 20 20 69 66 20  re it.       if 
8200: 69 74 20 69 73 20 6e 6f 74 20 68 61 6c 66 77 61  it is not halfwa
8210: 79 20 72 65 61 73 6f 6e 61 62 6c 65 2e 0a 20 20  y reasonable..  
8220: 20 20 2a 2f 0a 20 20 20 20 3b 0a 20 20 69 66 28    */.    ;.  if(
8230: 20 21 67 2e 69 73 48 54 54 50 20 26 26 20 67 2e   !g.isHTTP && g.
8240: 66 75 6c 6c 48 74 74 70 52 65 70 6c 79 20 29 7b  fullHttpReply ){
8250: 0a 20 20 20 20 2f 2a 20 77 6f 72 6b 61 72 6f 75  .    /* workarou
8260: 6e 64 20 66 6f 72 20 73 65 72 76 65 72 20 6d 6f  nd for server mo
8270: 64 65 2c 20 73 6f 20 77 65 20 73 65 65 20 69 74  de, so we see it
8280: 20 61 73 20 43 47 49 20 6d 6f 64 65 2e 20 2a 2f   as CGI mode. */
8290: 0a 20 20 20 20 67 2e 69 73 48 54 54 50 20 3d 20  .    g.isHTTP = 
82a0: 31 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 67 2e 69  1;.  }..  if(g.i
82b0: 73 48 54 54 50 29 7b 0a 20 20 20 20 63 67 69 5f  sHTTP){.    cgi_
82c0: 73 65 74 5f 63 6f 6e 74 65 6e 74 5f 74 79 70 65  set_content_type
82d0: 28 6a 73 6f 6e 5f 67 75 65 73 73 5f 63 6f 6e 74  (json_guess_cont
82e0: 65 6e 74 5f 74 79 70 65 28 29 29 0a 20 20 20 20  ent_type()).    
82f0: 20 20 2f 2a 20 72 65 6d 69 6e 64 65 72 3a 20 6d    /* reminder: m
8300: 75 73 74 20 62 65 20 64 6f 6e 65 20 61 66 74 65  ust be done afte
8310: 72 20 67 2e 6a 73 6f 6e 2e 6a 73 6f 6e 70 20 69  r g.json.jsonp i
8320: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  s initialized */
8330: 0a 20 20 20 20 20 20 3b 0a 23 69 66 20 30 0a 20  .      ;.#if 0. 
8340: 20 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 74 68     /* Calling th
8350: 69 73 20 73 65 65 6d 73 20 74 6f 20 74 72 69 67  is seems to trig
8360: 67 65 72 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49  ger an SQLITE_MI
8370: 53 55 53 45 20 77 61 72 6e 69 6e 67 3f 3f 3f 0a  SUSE warning???.
8380: 20 20 20 20 20 20 20 4d 61 79 62 65 20 69 74 27         Maybe it'
8390: 73 20 6e 6f 74 20 6c 65 67 61 6c 20 74 6f 20 73  s not legal to s
83a0: 65 74 20 74 68 65 20 6c 6f 67 67 65 72 20 6d 6f  et the logger mo
83b0: 72 65 20 74 68 61 6e 20 6f 6e 63 65 3f 0a 20 20  re than once?.  
83c0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
83d0: 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
83e0: 4f 4e 46 49 47 5f 4c 4f 47 2c 20 4e 55 4c 4c 2c  ONFIG_LOG, NULL,
83f0: 20 30 29 0a 20 20 20 20 20 20 20 20 2f 2a 20 61   0).        /* a
8400: 76 6f 69 64 73 20 64 65 62 75 67 20 6d 65 73 73  voids debug mess
8410: 61 67 65 73 20 6f 6e 20 73 74 64 65 72 72 20 69  ages on stderr i
8420: 6e 20 4a 53 4f 4e 20 6d 6f 64 65 20 2a 2f 0a 20  n JSON mode */. 
8430: 20 20 20 20 20 20 20 3b 0a 23 65 6e 64 69 66 0a         ;.#endif.
8440: 20 20 7d 0a 0a 20 20 67 2e 6a 73 6f 6e 2e 63 6d    }..  g.json.cm
8450: 64 2e 76 20 3d 20 63 73 6f 6e 5f 76 61 6c 75 65  d.v = cson_value
8460: 5f 6e 65 77 5f 61 72 72 61 79 28 29 3b 0a 20 20  _new_array();.  
8470: 67 2e 6a 73 6f 6e 2e 63 6d 64 2e 61 20 3d 20 63  g.json.cmd.a = c
8480: 73 6f 6e 5f 76 61 6c 75 65 5f 67 65 74 5f 61 72  son_value_get_ar
8490: 72 61 79 28 67 2e 6a 73 6f 6e 2e 63 6d 64 2e 76  ray(g.json.cmd.v
84a0: 29 3b 0a 20 20 6a 73 6f 6e 5f 67 63 5f 61 64 64  );.  json_gc_add
84b0: 28 20 46 6f 73 73 69 6c 4a 73 6f 6e 4b 65 79 73  ( FossilJsonKeys
84c0: 2e 63 6f 6d 6d 61 6e 64 50 61 74 68 2c 20 67 2e  .commandPath, g.
84d0: 6a 73 6f 6e 2e 63 6d 64 2e 76 20 29 3b 0a 20 20  json.cmd.v );.  
84e0: 2f 2a 0a 20 20 20 20 54 68 65 20 66 6f 6c 6c 6f  /*.    The follo
84f0: 77 69 6e 67 20 69 66 2f 65 6c 73 65 20 62 6c 6f  wing if/else blo
8500: 63 6b 20 74 72 61 6e 73 6c 61 74 65 73 20 74 68  ck translates th
8510: 65 20 50 41 54 48 5f 49 4e 46 4f 20 70 61 74 68  e PATH_INFO path
8520: 20 28 69 6e 0a 20 20 20 20 43 4c 49 2f 73 65 72   (in.    CLI/ser
8530: 76 65 72 20 6d 6f 64 65 73 29 20 6f 72 20 67 2e  ver modes) or g.
8540: 61 72 67 76 20 28 43 4c 49 20 6d 6f 64 65 29 20  argv (CLI mode) 
8550: 69 6e 74 6f 20 61 6e 20 69 6e 74 65 72 6e 61 6c  into an internal
8560: 20 6c 69 73 74 20 73 6f 0a 20 20 20 20 74 68 61   list so.    tha
8570: 74 20 77 65 20 63 61 6e 20 73 69 6d 70 6c 69 66  t we can simplif
8580: 79 20 63 6f 6d 6d 61 6e 64 20 64 69 73 70 61 74  y command dispat
8590: 63 68 69 6e 67 20 6c 61 74 65 72 20 6f 6e 2e 0a  ching later on..
85a0: 0a 20 20 20 20 4e 6f 74 65 20 74 68 61 74 20 74  .    Note that t
85b0: 72 61 6e 73 6c 61 74 69 6e 67 20 67 2e 61 72 67  ranslating g.arg
85c0: 76 20 74 68 69 73 20 77 61 79 20 69 73 20 6f 76  v this way is ov
85d0: 65 72 6b 69 6c 6c 20 62 75 74 20 61 6c 6c 6f 77  erkill but allow
85e0: 73 20 75 73 20 74 6f 0a 20 20 20 20 61 76 6f 69  s us to.    avoi
85f0: 64 20 43 4c 49 2d 6f 6e 6c 79 20 73 70 65 63 69  d CLI-only speci
8600: 61 6c 2d 63 61 73 65 20 68 61 6e 64 6c 69 6e 67  al-case handling
8610: 20 69 6e 20 6f 74 68 65 72 20 63 6f 64 65 2c 20   in other code, 
8620: 65 2e 67 2e 0a 20 20 20 20 6a 73 6f 6e 5f 63 6f  e.g..    json_co
8630: 6d 6d 61 6e 64 5f 61 72 67 28 29 2e 0a 20 20 2a  mmand_arg()..  *
8640: 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 20 29 7b  /.  if( zPath ){
8650: 2f 2a 20 45 69 74 68 65 72 20 43 47 49 20 6f 72  /* Either CGI or
8660: 20 73 65 72 76 65 72 20 6d 6f 64 65 2e 2e 2e 20   server mode... 
8670: 2a 2f 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c  */.    /* Transl
8680: 61 74 65 20 50 41 54 48 5f 49 4e 46 4f 20 69 6e  ate PATH_INFO in
8690: 74 6f 20 4a 53 4f 4e 20 61 72 72 61 79 20 66 6f  to JSON array fo
86a0: 72 20 6c 61 74 65 72 20 63 6f 6e 76 65 6e 69 65  r later convenie
86b0: 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 6a 73 6f 6e  nce. */.    json
86c0: 5f 73 74 72 69 6e 67 5f 73 70 6c 69 74 28 7a 50  _string_split(zP
86d0: 61 74 68 2c 20 27 2f 27 2c 20 31 2c 20 67 2e 6a  ath, '/', 1, g.j
86e0: 73 6f 6e 2e 63 6d 64 2e 61 29 3b 0a 20 20 7d 65  son.cmd.a);.  }e
86f0: 6c 73 65 7b 2f 2a 20 61 73 73 75 6d 65 20 43 4c  lse{/* assume CL
8700: 49 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e  I mode */.    in
8710: 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 63 6f  t i;.    char co
8720: 6e 73 74 20 2a 20 61 72 67 3b 0a 20 20 20 20 63  nst * arg;.    c
8730: 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 70 61 72 74  son_value * part
8740: 3b 0a 20 20 20 20 66 6f 72 28 69 20 3d 20 31 2f  ;.    for(i = 1/
8750: 2a 73 6b 69 70 20 61 72 67 76 5b 30 5d 2a 2f 3b  *skip argv[0]*/;
8760: 20 69 20 3c 20 67 2e 61 72 67 63 3b 20 2b 2b 69   i < g.argc; ++i
8770: 20 29 7b 0a 20 20 20 20 20 20 61 72 67 20 3d 20   ){.      arg = 
8780: 67 2e 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 20  g.argv[i];.     
8790: 20 69 66 28 20 21 61 72 67 20 7c 7c 20 21 2a 61   if( !arg || !*a
87a0: 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  rg ){.        co
87b0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
87c0: 20 20 20 20 20 20 69 66 28 27 2d 27 20 3d 3d 20        if('-' == 
87d0: 2a 61 72 67 29 7b 0a 20 20 20 20 20 20 20 20 2f  *arg){.        /
87e0: 2a 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 6f 20  * workaround to 
87f0: 73 6b 69 70 20 43 4c 49 20 61 72 67 73 20 73 6f  skip CLI args so
8800: 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
8810: 20 6a 73 6f 6e 5f 63 6f 6d 6d 61 6e 64 5f 61 72   json_command_ar
8820: 67 28 29 20 64 6f 65 73 20 6e 6f 74 20 73 65 65  g() does not see
8830: 20 74 68 65 6d 2e 0a 20 20 20 20 20 20 20 20 20   them..         
8840: 20 20 54 68 69 73 20 61 73 73 75 6d 65 73 20 74    This assumes t
8850: 68 61 74 20 61 6c 6c 20 61 72 67 75 6d 65 6e 74  hat all argument
8860: 73 20 63 6f 6d 65 20 4c 41 53 54 0a 20 20 20 20  s come LAST.    
8870: 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 63 6f         on the co
8880: 6d 6d 61 6e 64 20 6c 69 6e 65 2e 0a 20 20 20 20  mmand line..    
8890: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62      */.        b
88a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
88b0: 20 20 20 20 70 61 72 74 20 3d 20 63 73 6f 6e 5f      part = cson_
88c0: 76 61 6c 75 65 5f 6e 65 77 5f 73 74 72 69 6e 67  value_new_string
88d0: 28 61 72 67 2c 73 74 72 6c 65 6e 28 61 72 67 29  (arg,strlen(arg)
88e0: 29 3b 0a 20 20 20 20 20 20 63 73 6f 6e 5f 61 72  );.      cson_ar
88f0: 72 61 79 5f 61 70 70 65 6e 64 28 67 2e 6a 73 6f  ray_append(g.jso
8900: 6e 2e 63 6d 64 2e 61 2c 20 70 61 72 74 29 3b 0a  n.cmd.a, part);.
8910: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 68 69      }.  }..  whi
8920: 6c 65 28 21 67 2e 69 73 48 54 54 50 29 7b 0a 20  le(!g.isHTTP){. 
8930: 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65 20 4a     /* Simulate J
8940: 53 4f 4e 20 50 4f 53 54 20 64 61 74 61 20 76 69  SON POST data vi
8950: 61 20 69 6e 70 75 74 20 66 69 6c 65 2e 20 20 50  a input file.  P
8960: 65 64 61 6e 74 69 63 20 72 65 6d 69 6e 64 65 72  edantic reminder
8970: 3a 0a 20 20 20 20 20 20 20 65 72 72 6f 72 20 68  :.       error h
8980: 61 6e 64 6c 69 6e 67 20 64 6f 65 73 20 6e 6f 74  andling does not
8990: 20 68 6f 6e 6f 72 20 75 73 65 72 2d 73 75 70 70   honor user-supp
89a0: 6c 69 65 64 20 67 2e 6a 73 6f 6e 2e 6f 75 74 4f  lied g.json.outO
89b0: 70 74 0a 20 20 20 20 20 20 20 62 65 63 61 75 73  pt.       becaus
89c0: 65 20 6f 75 74 4f 70 74 20 63 61 6e 6e 6f 74 20  e outOpt cannot 
89d0: 28 67 65 6e 65 72 69 63 61 6c 6c 79 29 20 62 65  (generically) be
89e0: 20 63 6f 6e 66 69 67 75 72 65 64 20 75 6e 74 69   configured unti
89f0: 6c 20 61 66 74 65 72 0a 20 20 20 20 20 20 20 50  l after.       P
8a00: 4f 53 54 2d 72 65 61 64 69 6e 67 20 69 73 20 66  OST-reading is f
8a10: 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2f 0a  inished..    */.
8a20: 20 20 20 20 46 49 4c 45 20 2a 20 69 6e 46 69 6c      FILE * inFil
8a30: 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68  e = NULL;.    ch
8a40: 61 72 20 63 6f 6e 73 74 20 2a 20 6a 66 69 6c 65  ar const * jfile
8a50: 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22   = find_option("
8a60: 6a 73 6f 6e 2d 69 6e 70 75 74 22 2c 4e 55 4c 4c  json-input",NULL
8a70: 2c 31 29 3b 0a 20 20 20 20 69 66 28 21 6a 66 69  ,1);.    if(!jfi
8a80: 6c 65 20 7c 7c 20 21 2a 6a 66 69 6c 65 29 7b 0a  le || !*jfile){.
8a90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8aa0: 20 7d 0a 20 20 20 20 69 6e 46 69 6c 65 20 3d 20   }.    inFile = 
8ab0: 28 30 3d 3d 73 74 72 63 6d 70 28 22 2d 22 2c 6a  (0==strcmp("-",j
8ac0: 66 69 6c 65 29 29 0a 20 20 20 20 20 20 3f 20 73  file)).      ? s
8ad0: 74 64 69 6e 0a 20 20 20 20 20 20 3a 20 66 6f 70  tdin.      : fop
8ae0: 65 6e 28 6a 66 69 6c 65 2c 22 72 62 22 29 3b 0a  en(jfile,"rb");.
8af0: 20 20 20 20 69 66 28 21 69 6e 46 69 6c 65 29 7b      if(!inFile){
8b00: 0a 20 20 20 20 20 20 67 2e 6a 73 6f 6e 2e 72 65  .      g.json.re
8b10: 73 75 6c 74 43 6f 64 65 20 3d 20 46 53 4c 5f 4a  sultCode = FSL_J
8b20: 53 4f 4e 5f 45 5f 46 49 4c 45 5f 4f 50 45 4e 5f  SON_E_FILE_OPEN_
8b30: 46 41 49 4c 45 44 3b 0a 20 20 20 20 20 20 66 6f  FAILED;.      fo
8b40: 73 73 69 6c 5f 66 61 74 61 6c 28 22 43 6f 75 6c  ssil_fatal("Coul
8b50: 64 20 6e 6f 74 20 6f 70 65 6e 20 4a 53 4f 4e 20  d not open JSON 
8b60: 66 69 6c 65 20 5b 25 73 5d 2e 22 2c 6a 66 69 6c  file [%s].",jfil
8b70: 65 29 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  e).        /* Do
8b80: 65 73 20 6e 6f 74 20 72 65 74 75 72 6e 2e 20 2a  es not return. *
8b90: 2f 0a 20 20 20 20 20 20 20 20 3b 0a 20 20 20 20  /.        ;.    
8ba0: 7d 0a 20 20 20 20 63 67 69 5f 70 61 72 73 65 5f  }.    cgi_parse_
8bb0: 50 4f 53 54 5f 4a 53 4f 4e 28 69 6e 46 69 6c 65  POST_JSON(inFile
8bc0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74  , 0);.    if( st
8bd0: 64 69 6e 20 21 3d 20 69 6e 46 69 6c 65 20 29 7b  din != inFile ){
8be0: 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e  .      fclose(in
8bf0: 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  File);.    }.   
8c00: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20   break;.  }.  . 
8c10: 20 2f 2a 20 67 2e 6a 73 6f 6e 2e 72 65 71 50 61   /* g.json.reqPa
8c20: 79 6c 6f 61 64 20 65 78 69 73 74 73 20 6f 6e 6c  yload exists onl
8c30: 79 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 73 6f  y to simplify so
8c40: 6d 65 20 6f 66 20 6f 75 72 20 61 63 63 65 73 73  me of our access
8c50: 20 74 6f 0a 20 20 20 20 20 74 68 65 20 72 65 71   to.     the req
8c60: 75 65 73 74 20 70 61 79 6c 6f 61 64 2e 20 57 65  uest payload. We
8c70: 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20   currently only 
8c80: 75 73 65 20 74 68 69 73 20 69 6e 20 74 68 65 20  use this in the 
8c90: 63 6f 6e 74 65 78 74 20 6f 66 0a 20 20 20 20 20  context of.     
8ca0: 4f 62 6a 65 63 74 20 70 61 79 6c 6f 61 64 73 2c  Object payloads,
8cb0: 20 6e 6f 74 20 41 72 72 61 79 73 2c 20 73 74 72   not Arrays, str
8cc0: 69 6e 67 73 2c 20 65 74 63 2e 0a 20 20 2a 2f 0a  ings, etc..  */.
8cd0: 20 20 67 2e 6a 73 6f 6e 2e 72 65 71 50 61 79 6c    g.json.reqPayl
8ce0: 6f 61 64 2e 76 20 3d 20 63 73 6f 6e 5f 6f 62 6a  oad.v = cson_obj
8cf0: 65 63 74 5f 67 65 74 28 20 67 2e 6a 73 6f 6e 2e  ect_get( g.json.
8d00: 70 6f 73 74 2e 6f 2c 20 46 6f 73 73 69 6c 4a 73  post.o, FossilJs
8d10: 6f 6e 4b 65 79 73 2e 70 61 79 6c 6f 61 64 20 29  onKeys.payload )
8d20: 3b 0a 20 20 69 66 28 20 67 2e 6a 73 6f 6e 2e 72  ;.  if( g.json.r
8d30: 65 71 50 61 79 6c 6f 61 64 2e 76 20 29 7b 0a 20  eqPayload.v ){. 
8d40: 20 20 20 67 2e 6a 73 6f 6e 2e 72 65 71 50 61 79     g.json.reqPay
8d50: 6c 6f 61 64 2e 6f 20 3d 20 63 73 6f 6e 5f 76 61  load.o = cson_va
8d60: 6c 75 65 5f 67 65 74 5f 6f 62 6a 65 63 74 28 20  lue_get_object( 
8d70: 67 2e 6a 73 6f 6e 2e 72 65 71 50 61 79 6c 6f 61  g.json.reqPayloa
8d80: 64 2e 76 20 29 0a 20 20 20 20 20 20 20 20 2f 2a  d.v ).        /*
8d90: 20 67 2e 6a 73 6f 6e 2e 72 65 71 50 61 79 6c 6f   g.json.reqPaylo
8da0: 61 64 2e 6f 20 6d 61 79 20 6c 65 67 61 6c 6c 79  ad.o may legally
8db0: 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20   be NULL, which 
8dc0: 6d 65 61 6e 73 20 6f 6e 6c 79 20 74 68 61 74 0a  means only that.
8dd0: 20 20 20 20 20 20 20 20 20 20 20 67 2e 6a 73 6f             g.jso
8de0: 6e 2e 72 65 71 50 61 79 6c 6f 61 64 2e 76 20 69  n.reqPayload.v i
8df0: 73 2d 6e 6f 74 2d 61 20 4f 62 6a 65 63 74 2e 0a  s-not-a Object..
8e00: 20 20 20 20 20 20 20 20 2a 2f 3b 0a 20 20 7d 0a          */;.  }.
8e10: 0a 20 20 2f 2a 20 41 6e 79 74 68 69 6e 67 20 77  .  /* Anything w
8e20: 68 69 63 68 20 6e 65 65 64 73 20 6a 73 6f 6e 5f  hich needs json_
8e30: 67 65 74 65 6e 76 28 29 20 61 6e 64 20 66 72 69  getenv() and fri
8e40: 65 6e 64 73 20 73 68 6f 75 6c 64 20 67 6f 20 61  ends should go a
8e50: 66 74 65 72 0a 20 20 20 20 20 74 68 69 73 20 70  fter.     this p
8e60: 6f 69 6e 74 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66  oint..  */..  if
8e70: 28 31 20 3d 3d 20 63 73 6f 6e 5f 61 72 72 61 79  (1 == cson_array
8e80: 5f 6c 65 6e 67 74 68 5f 67 65 74 28 67 2e 6a 73  _length_get(g.js
8e90: 6f 6e 2e 63 6d 64 2e 61 29 29 7b 0a 20 20 20 20  on.cmd.a)){.    
8ea0: 2f 2a 20 73 70 65 63 69 61 6c 20 63 61 73 65 3a  /* special case:
8eb0: 20 69 66 20 77 65 27 72 65 20 61 74 20 74 68 65   if we're at the
8ec0: 20 74 6f 70 20 70 61 74 68 2c 20 6c 6f 6f 6b 20   top path, look 
8ed0: 66 6f 72 0a 20 20 20 20 20 20 20 61 20 22 63 6f  for.       a "co
8ee0: 6d 6d 61 6e 64 22 20 72 65 71 75 65 73 74 20 61  mmand" request a
8ef0: 72 67 20 77 68 69 63 68 20 73 70 65 63 69 66 69  rg which specifi
8f00: 65 73 20 77 68 69 63 68 20 63 6f 6d 6d 61 6e 64  es which command
8f10: 0a 20 20 20 20 20 20 20 74 6f 20 72 75 6e 2e 0a  .       to run..
8f20: 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20      */.    char 
8f30: 63 6f 6e 73 74 20 2a 20 63 6d 64 20 3d 20 6a 73  const * cmd = js
8f40: 6f 6e 5f 67 65 74 65 6e 76 5f 63 73 74 72 28 22  on_getenv_cstr("
8f50: 63 6f 6d 6d 61 6e 64 22 29 3b 0a 20 20 20 20 69  command");.    i
8f60: 66 28 63 6d 64 29 7b 0a 20 20 20 20 20 20 6a 73  f(cmd){.      js
8f70: 6f 6e 5f 73 74 72 69 6e 67 5f 73 70 6c 69 74 28  on_string_split(
8f80: 63 6d 64 2c 20 27 2f 27 2c 20 30 2c 20 67 2e 6a  cmd, '/', 0, g.j
8f90: 73 6f 6e 2e 63 6d 64 2e 61 29 3b 0a 20 20 20 20  son.cmd.a);.    
8fa0: 20 20 67 2e 6a 73 6f 6e 2e 63 6d 64 2e 63 6f 6d    g.json.cmd.com
8fb0: 6d 61 6e 64 53 74 72 20 3d 20 63 6d 64 3b 0a 20  mandStr = cmd;. 
8fc0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 0a 20 20 69     }.  }..  .  i
8fd0: 66 28 21 67 2e 6a 73 6f 6e 2e 6a 73 6f 6e 70 29  f(!g.json.jsonp)
8fe0: 7b 0a 20 20 20 20 67 2e 6a 73 6f 6e 2e 6a 73 6f  {.    g.json.jso
8ff0: 6e 70 20 3d 20 6a 73 6f 6e 5f 66 69 6e 64 5f 6f  np = json_find_o
9000: 70 74 69 6f 6e 5f 63 73 74 72 28 22 6a 73 6f 6e  ption_cstr("json
9010: 70 22 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 20  p",NULL,NULL);. 
9020: 20 7d 0a 20 20 69 66 28 21 67 2e 69 73 48 54 54   }.  if(!g.isHTT
9030: 50 29 7b 0a 20 20 20 20 67 2e 6a 73 6f 6e 2e 65  P){.    g.json.e
9040: 72 72 6f 72 44 65 74 61 69 6c 50 61 72 61 6e 6f  rrorDetailParano
9050: 69 61 20 3d 20 30 20 2f 2a 64 69 73 61 62 6c 65  ia = 0 /*disable
9060: 20 65 72 72 6f 72 20 63 6f 64 65 20 64 75 6d 62   error code dumb
9070: 2d 64 6f 77 6e 20 66 6f 72 20 43 4c 49 20 6d 6f  -down for CLI mo
9080: 64 65 2a 2f 3b 0a 20 20 7d 0a 0a 20 20 7b 2f 2a  de*/;.  }..  {/*
9090: 20 73 65 74 20 75 70 20 4a 53 4f 4e 20 6f 75 74   set up JSON out
90a0: 70 75 74 20 66 6f 72 6d 61 74 74 69 6e 67 20 6f  put formatting o
90b0: 70 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69  ptions. */.    i
90c0: 6e 74 20 69 6e 64 65 6e 74 20 3d 20 2d 31 3b 0a  nt indent = -1;.
90d0: 20 20 20 20 69 6e 64 65 6e 74 20 3d 20 6a 73 6f      indent = jso
90e0: 6e 5f 66 69 6e 64 5f 6f 70 74 69 6f 6e 5f 69 6e  n_find_option_in
90f0: 74 28 22 69 6e 64 65 6e 74 22 2c 4e 55 4c 4c 2c  t("indent",NULL,
9100: 22 49 22 2c 2d 31 29 3b 0a 20 20 20 20 67 2e 6a  "I",-1);.    g.j
9110: 73 6f 6e 2e 6f 75 74 4f 70 74 2e 69 6e 64 65 6e  son.outOpt.inden
9120: 74 61 74 69 6f 6e 20 3d 20 28 30 3e 69 6e 64 65  tation = (0>inde
9130: 6e 74 29 0a 20 20 20 20 20 20 3f 20 28 67 2e 69  nt).      ? (g.i
9140: 73 48 54 54 50 20 3f 20 30 20 3a 20 31 29 0a 20  sHTTP ? 0 : 1). 
9150: 20 20 20 20 20 3a 20 28 75 6e 73 69 67 6e 65 64       : (unsigned
9160: 20 63 68 61 72 29 69 6e 64 65 6e 74 3b 0a 20 20   char)indent;.  
9170: 20 20 67 2e 6a 73 6f 6e 2e 6f 75 74 4f 70 74 2e    g.json.outOpt.
9180: 61 64 64 4e 65 77 6c 69 6e 65 20 3d 20 67 2e 69  addNewline = g.i
9190: 73 48 54 54 50 0a 20 20 20 20 20 20 3f 20 30 0a  sHTTP.      ? 0.
91a0: 20 20 20 20 20 20 3a 20 28 67 2e 6a 73 6f 6e 2e        : (g.json.
91b0: 6a 73 6f 6e 70 20 3f 20 30 20 3a 20 31 29 3b 0a  jsonp ? 0 : 1);.
91c0: 20 20 7d 0a 0a 20 20 69 66 28 20 67 2e 69 73 48    }..  if( g.isH
91d0: 54 54 50 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 5f  TTP ){.    json_
91e0: 61 75 74 68 5f 74 6f 6b 65 6e 28 29 2f 2a 20 77  auth_token()/* w
91f0: 69 6c 6c 20 63 6f 70 79 20 6f 75 72 20 61 75 74  ill copy our aut
9200: 68 20 74 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2c  h token, if any,
9210: 20 74 6f 20 66 6f 73 73 69 6c 27 73 0a 20 20 20   to fossil's.   
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9230: 20 20 20 20 20 63 6f 72 65 2c 20 77 68 69 63 68       core, which
9240: 20 77 65 20 6e 65 65 64 20 62 65 66 6f 72 65 20   we need before 
9250: 77 65 20 63 61 6c 6c 0a 20 20 20 20 20 20 20 20  we call.        
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9270: 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64  login_check_cred
9280: 65 6e 74 69 61 6c 73 28 29 2e 20 2a 2f 3b 0a 20  entials(). */;. 
9290: 20 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63     login_check_c
92a0: 72 65 64 65 6e 74 69 61 6c 73 28 29 2f 2a 20 70  redentials()/* p
92b0: 6f 70 75 6c 61 74 65 73 20 67 2e 70 65 72 6d 20  opulates g.perm 
92c0: 2a 2f 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a  */;.  }.  else{.
92d0: 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a 20 77 65      /* FIXME: we
92e0: 20 6e 65 65 64 20 61 6e 20 6f 70 74 69 6f 6e 20   need an option 
92f0: 77 68 69 63 68 20 61 6c 6c 6f 77 73 20 75 73 20  which allows us 
9300: 74 6f 20 73 6b 69 70 20 74 68 69 73 2e 20 41 74  to skip this. At
9310: 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 6f 6e   least.       on
9320: 65 20 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 20  e known command 
9330: 28 2f 6a 73 6f 6e 2f 76 65 72 73 69 6f 6e 29 20  (/json/version) 
9340: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 61 6e  does not need an
9350: 20 6f 70 65 6e 65 64 0a 20 20 20 20 20 20 20 72   opened.       r
9360: 65 70 6f 2e 20 54 68 65 20 70 72 6f 62 6c 65 6d  epo. The problem
9370: 20 68 65 72 65 20 69 73 20 77 65 20 63 61 6e 6e   here is we cann
9380: 6f 74 20 6b 6e 6f 77 20 77 68 69 63 68 20 66 75  ot know which fu
9390: 6e 63 74 69 6f 6e 73 20 6e 65 65 64 0a 20 20 20  nctions need.   
93a0: 20 20 20 20 69 74 20 66 72 6f 6d 20 68 65 72 65      it from here
93b0: 20 28 62 65 63 61 75 73 65 20 63 6f 6d 6d 61 6e   (because comman
93c0: 64 20 64 69 73 70 61 74 63 68 69 6e 67 20 68 61  d dispatching ha
93d0: 73 6e 27 74 20 79 65 74 20 68 61 70 70 65 6e 65  sn't yet happene
93e0: 64 29 0a 20 20 20 20 20 20 20 61 6e 64 20 61 6c  d).       and al
93f0: 6c 20 6f 74 68 65 72 20 63 6f 6d 6d 61 6e 64 73  l other commands
9400: 20 72 65 6c 79 20 6f 6e 20 74 68 65 20 72 65 70   rely on the rep
9410: 6f 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 62  o being opened b
9420: 65 66 6f 72 65 0a 20 20 20 20 20 20 20 74 68 65  efore.       the
9430: 79 20 61 72 65 20 63 61 6c 6c 65 64 2e 20 41 20  y are called. A 
9440: 74 65 78 74 62 6f 6f 6b 20 65 78 61 6d 70 6c 65  textbook example
9450: 20 6f 66 20 6c 61 63 6b 20 6f 66 20 66 6f 72 65   of lack of fore
9460: 73 69 67 68 74 20 3a 2f 2e 0a 20 20 20 20 20 2a  sight :/..     *
9470: 2f 0a 20 20 20 20 64 62 5f 66 69 6e 64 5f 61 6e  /.    db_find_an
9480: 64 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72  d_open_repositor
9490: 79 28 4f 50 45 4e 5f 41 4e 59 5f 53 43 48 45 4d  y(OPEN_ANY_SCHEM
94a0: 41 2c 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  A,0);.  }.}../*.
94b0: 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 6e  ** Returns the n
94c0: 64 78 27 74 68 20 69 74 65 6d 20 69 6e 20 74 68  dx'th item in th
94d0: 65 20 22 63 6f 6d 6d 61 6e 64 20 70 61 74 68 22  e "command path"
94e0: 2c 20 77 68 65 72 65 20 69 6e 64 65 78 20 30 20  , where index 0 
94f0: 69 73 20 74 68 65 0a 2a 2a 20 70 6f 73 69 74 69  is the.** positi
9500: 6f 6e 20 6f 66 20 74 68 65 20 22 6a 73 6f 6e 22  on of the "json"
9510: 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 61 74   part of the pat
9520: 68 2e 20 52 65 74 75 72 6e 73 20 4e 55 4c 4c 20  h. Returns NULL 
9530: 69 66 20 6e 64 78 20 69 73 20 6f 75 74 0a 2a 2a  if ndx is out.**
9540: 20 6f 66 20 62 6f 75 6e 64 73 20 6f 72 20 74 68   of bounds or th
9550: 65 72 65 20 69 73 20 6e 6f 20 22 6a 73 6f 6e 22  ere is no "json"
9560: 20 70 61 74 68 20 65 6c 65 6d 65 6e 74 2e 0a 2a   path element..*
9570: 2a 0a 2a 2a 20 49 6e 20 43 4c 49 20 6d 6f 64 65  *.** In CLI mode
9580: 20 74 68 65 20 22 70 61 74 68 22 20 69 73 20 74   the "path" is t
9590: 68 65 20 6c 69 73 74 20 6f 66 20 61 72 67 75 6d  he list of argum
95a0: 65 6e 74 73 20 28 73 6b 69 70 70 69 6e 67 20 61  ents (skipping a
95b0: 72 67 76 5b 30 5d 29 2e 0a 2a 2a 20 49 6e 20 73  rgv[0])..** In s
95c0: 65 72 76 65 72 2f 43 47 49 20 6d 6f 64 65 73 20  erver/CGI modes 
95d0: 74 68 65 20 70 61 74 68 20 69 73 20 74 61 6b 65  the path is take
95e0: 6e 20 66 72 6f 6d 20 50 41 54 48 5f 49 4e 46 4f  n from PATH_INFO
95f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
9600: 72 6e 65 64 20 62 79 74 65 73 20 61 72 65 20 6f  rned bytes are o
9610: 77 6e 65 64 20 62 79 20 67 2e 6a 73 6f 6e 2e 63  wned by g.json.c
9620: 6d 64 2e 76 20 61 6e 64 20 5f 6d 61 79 5f 20 62  md.v and _may_ b
9630: 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
9640: 20 69 66 20 74 68 61 74 20 6f 62 6a 65 63 74 20   if that object 
9650: 69 73 20 6d 6f 64 69 66 69 65 64 20 28 64 65 70  is modified (dep
9660: 65 6e 64 69 6e 67 20 6f 6e 20 68 6f 77 20 69 74  ending on how it
9670: 20 69 73 0a 2a 2a 20 6d 6f 64 69 66 69 65 64 29   is.** modified)
9680: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
9690: 74 20 43 4c 49 20 6f 70 74 69 6f 6e 73 20 61 72  t CLI options ar
96a0: 65 20 6e 6f 74 20 69 6e 63 6c 75 64 65 64 20 69  e not included i
96b0: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 70 61  n the command pa
96c0: 74 68 2e 20 55 73 65 0a 2a 2a 20 66 69 6e 64 5f  th. Use.** find_
96d0: 6f 70 74 69 6f 6e 28 29 20 74 6f 20 67 65 74 20  option() to get 
96e0: 74 68 6f 73 65 2e 0a 2a 2a 0a 2a 2f 0a 63 68 61  those..**.*/.cha
96f0: 72 20 63 6f 6e 73 74 20 2a 20 6a 73 6f 6e 5f 63  r const * json_c
9700: 6f 6d 6d 61 6e 64 5f 61 72 67 28 75 6e 73 69 67  ommand_arg(unsig
9710: 6e 65 64 20 63 68 61 72 20 6e 64 78 29 7b 0a 20  ned char ndx){. 
9720: 20 63 73 6f 6e 5f 61 72 72 61 79 20 2a 20 61 72   cson_array * ar
9730: 20 3d 20 67 2e 6a 73 6f 6e 2e 63 6d 64 2e 61 3b   = g.json.cmd.a;
9740: 0a 20 20 61 73 73 65 72 74 28 28 4e 55 4c 4c 21  .  assert((NULL!
9750: 3d 61 72 29 20 26 26 20 22 49 6e 74 65 72 6e 61  =ar) && "Interna
9760: 6c 20 65 72 72 6f 72 2e 20 57 61 73 20 6a 73 6f  l error. Was jso
9770: 6e 5f 6d 6f 64 65 5f 62 6f 6f 74 73 74 72 61 70  n_mode_bootstrap
9780: 28 29 20 63 61 6c 6c 65 64 3f 22 29 3b 0a 20 20  () called?");.  
9790: 61 73 73 65 72 74 28 28 67 2e 61 72 67 63 3e 31  assert((g.argc>1
97a0: 29 20 26 26 20 22 49 6e 74 65 72 6e 61 6c 20 65  ) && "Internal e
97b0: 72 72 6f 72 20 2d 20 77 65 20 6e 65 76 65 72 20  rror - we never 
97c0: 73 68 6f 75 6c 64 20 68 61 76 65 20 67 6f 74 74  should have gott
97d0: 65 6e 20 74 68 69 73 20 66 61 72 2e 22 29 3b 0a  en this far.");.
97e0: 20 20 69 66 28 20 67 2e 6a 73 6f 6e 2e 63 6d 64    if( g.json.cmd
97f0: 2e 6f 66 66 73 65 74 20 3c 20 30 20 29 7b 0a 20  .offset < 0 ){. 
9800: 20 20 20 2f 2a 20 66 69 72 73 74 2d 74 69 6d 65     /* first-time
9810: 20 73 65 74 75 70 2e 20 2a 2f 0a 20 20 20 20 73   setup. */.    s
9820: 68 6f 72 74 20 69 20 3d 20 30 3b 0a 23 64 65 66  hort i = 0;.#def
9830: 69 6e 65 20 4e 45 58 54 20 63 73 6f 6e 5f 73 74  ine NEXT cson_st
9840: 72 69 6e 67 5f 63 73 74 72 28 20 20 20 20 20 20  ring_cstr(      
9850: 20 20 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20      \.          
9860: 20 20 20 20 20 20 20 63 73 6f 6e 5f 76 61 6c 75         cson_valu
9870: 65 5f 67 65 74 5f 73 74 72 69 6e 67 28 20 5c 0a  e_get_string( \.
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9890: 20 20 20 63 73 6f 6e 5f 61 72 72 61 79 5f 67 65     cson_array_ge
98a0: 74 28 61 72 2c 69 29 20 5c 0a 20 20 20 20 20 20  t(ar,i) \.      
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 29 29 0a               )).
98c0: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
98d0: 20 74 6f 6b 20 3d 20 4e 45 58 54 3b 0a 20 20 20   tok = NEXT;.   
98e0: 20 77 68 69 6c 65 28 20 74 6f 6b 20 29 7b 0a 20   while( tok ){. 
98f0: 20 20 20 20 20 69 66 28 20 21 67 2e 69 73 48 54       if( !g.isHT
9900: 54 50 2f 2a 77 6f 72 6b 61 72 6f 75 6e 64 20 66  TP/*workaround f
9910: 6f 72 20 22 61 62 62 72 65 76 69 61 74 65 64 20  or "abbreviated 
9920: 6e 61 6d 65 22 20 69 6e 20 43 4c 49 20 6d 6f 64  name" in CLI mod
9930: 65 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 3f 20  e*/.          ? 
9940: 28 30 3d 3d 73 74 72 63 6d 70 28 67 2e 61 72 67  (0==strcmp(g.arg
9950: 76 5b 31 5d 2c 74 6f 6b 29 29 0a 20 20 20 20 20  v[1],tok)).     
9960: 20 20 20 20 20 3a 20 28 30 3d 3d 73 74 72 6e 63       : (0==strnc
9970: 6d 70 28 22 6a 73 6f 6e 22 2c 74 6f 6b 2c 34 29  mp("json",tok,4)
9980: 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
9990: 20 20 20 20 20 20 20 67 2e 6a 73 6f 6e 2e 63 6d         g.json.cm
99a0: 64 2e 6f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20  d.offset = i;.  
99b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
99c0: 20 20 20 7d 0a 20 20 20 20 20 20 2b 2b 69 3b 0a     }.      ++i;.
99d0: 20 20 20 20 20 20 74 6f 6b 20 3d 20 4e 45 58 54        tok = NEXT
99e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 75 6e 64  ;.    }.  }.#und
99f0: 65 66 20 4e 45 58 54 0a 20 20 69 66 28 67 2e 6a  ef NEXT.  if(g.j
9a00: 73 6f 6e 2e 63 6d 64 2e 6f 66 66 73 65 74 20 3c  son.cmd.offset <
9a10: 20 30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   0){.    return 
9a20: 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NULL;.  }else{. 
9a30: 20 20 20 6e 64 78 20 3d 20 67 2e 6a 73 6f 6e 2e     ndx = g.json.
9a40: 63 6d 64 2e 6f 66 66 73 65 74 20 2b 20 6e 64 78  cmd.offset + ndx
9a50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 73 6f  ;.    return cso
9a60: 6e 5f 73 74 72 69 6e 67 5f 63 73 74 72 28 63 73  n_string_cstr(cs
9a70: 6f 6e 5f 76 61 6c 75 65 5f 67 65 74 5f 73 74 72  on_value_get_str
9a80: 69 6e 67 28 63 73 6f 6e 5f 61 72 72 61 79 5f 67  ing(cson_array_g
9a90: 65 74 28 20 61 72 2c 20 67 2e 6a 73 6f 6e 2e 63  et( ar, g.json.c
9aa0: 6d 64 2e 6f 66 66 73 65 74 20 2b 20 6e 64 78 20  md.offset + ndx 
9ab0: 29 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52  )));.  }.}../* R
9ac0: 65 74 75 72 6e 73 20 74 68 65 20 43 2d 73 74 72  eturns the C-str
9ad0: 69 6e 67 20 66 6f 72 6d 20 6f 66 20 6a 73 6f 6e  ing form of json
9ae0: 5f 61 75 74 68 5f 74 6f 6b 65 6e 28 29 2c 20 6f  _auth_token(), o
9af0: 72 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6a 73 6f  r NULL.** if jso
9b00: 6e 5f 61 75 74 68 5f 74 6f 6b 65 6e 28 29 20 72  n_auth_token() r
9b10: 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  eturns NULL..*/.
9b20: 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 6a 73 6f  char const * jso
9b30: 6e 5f 61 75 74 68 5f 74 6f 6b 65 6e 5f 63 73 74  n_auth_token_cst
9b40: 72 28 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 73  r(){.  return cs
9b50: 6f 6e 5f 76 61 6c 75 65 5f 67 65 74 5f 63 73 74  on_value_get_cst
9b60: 72 28 20 6a 73 6f 6e 5f 61 75 74 68 5f 74 6f 6b  r( json_auth_tok
9b70: 65 6e 28 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  en() );.}../*.**
9b80: 20 52 65 74 75 72 6e 73 20 74 68 65 20 4a 73 6f   Returns the Jso
9b90: 6e 50 61 67 65 44 65 66 20 77 69 74 68 20 74 68  nPageDef with th
9ba0: 65 20 67 69 76 65 6e 20 6e 61 6d 65 2c 20 6f 72  e given name, or
9bb0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63   NULL if no matc
9bc0: 68 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2e 0a 2a  h is.** found..*
9bd0: 2a 0a 2a 2a 20 68 65 61 64 20 6d 75 73 74 20 62  *.** head must b
9be0: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
9bf0: 6e 20 61 72 72 61 79 20 6f 66 20 4a 73 6f 6e 50  n array of JsonP
9c00: 61 67 65 44 65 66 73 20 69 6e 20 77 68 69 63 68  ageDefs in which
9c10: 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 65 6e 74   the.** last ent
9c20: 72 79 20 68 61 73 20 61 20 4e 55 4c 4c 20 6e 61  ry has a NULL na
9c30: 6d 65 2e 0a 2a 2f 0a 4a 73 6f 6e 50 61 67 65 44  me..*/.JsonPageD
9c40: 65 66 20 63 6f 6e 73 74 20 2a 20 6a 73 6f 6e 5f  ef const * json_
9c50: 68 61 6e 64 6c 65 72 5f 66 6f 72 5f 6e 61 6d 65  handler_for_name
9c60: 28 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 6e  ( char const * n
9c70: 61 6d 65 2c 20 4a 73 6f 6e 50 61 67 65 44 65 66  ame, JsonPageDef
9c80: 20 63 6f 6e 73 74 20 2a 20 68 65 61 64 20 29 7b   const * head ){
9c90: 0a 20 20 4a 73 6f 6e 50 61 67 65 44 65 66 20 63  .  JsonPageDef c
9ca0: 6f 6e 73 74 20 2a 20 70 61 67 65 44 65 66 20 3d  onst * pageDef =
9cb0: 20 68 65 61 64 3b 0a 20 20 61 73 73 65 72 74 28   head;.  assert(
9cc0: 20 68 65 61 64 20 21 3d 20 4e 55 4c 4c 20 29 3b   head != NULL );
9cd0: 0a 20 20 69 66 28 6e 61 6d 65 20 26 26 20 2a 6e  .  if(name && *n
9ce0: 61 6d 65 29 20 66 6f 72 28 20 3b 20 70 61 67 65  ame) for( ; page
9cf0: 44 65 66 2d 3e 6e 61 6d 65 3b 20 2b 2b 70 61 67  Def->name; ++pag
9d00: 65 44 65 66 20 29 7b 0a 20 20 20 20 69 66 28 20  eDef ){.    if( 
9d10: 30 20 3d 3d 20 73 74 72 63 6d 70 28 6e 61 6d 65  0 == strcmp(name
9d20: 2c 20 70 61 67 65 44 65 66 2d 3e 6e 61 6d 65 29  , pageDef->name)
9d30: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9d40: 20 70 61 67 65 44 65 66 3b 0a 20 20 20 20 7d 0a   pageDef;.    }.
9d50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 4e 55 4c    }.  return NUL
9d60: 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  L;.}../*.** Give
9d70: 6e 20 61 20 46 6f 73 73 69 6c 2f 4a 53 4f 4e 20  n a Fossil/JSON 
9d80: 72 65 73 75 6c 74 20 63 6f 64 65 2c 20 74 68 69  result code, thi
9d90: 73 20 66 75 6e 63 74 69 6f 6e 20 22 64 75 6d 62  s function "dumb
9da0: 73 20 69 74 20 64 6f 77 6e 22 0a 2a 2a 20 61 63  s it down".** ac
9db0: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
9dc0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
9dd0: 67 2e 6a 73 6f 6e 2e 65 72 72 6f 72 44 65 74 61  g.json.errorDeta
9de0: 69 6c 50 61 72 61 6e 6f 69 61 2e 20 54 68 65 0a  ilParanoia. The.
9df0: 2a 2a 20 64 75 6d 62 65 64 2d 64 6f 77 6e 20 76  ** dumbed-down v
9e00: 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64  alue is returned
9e10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
9e20: 63 74 69 6f 6e 20 61 73 73 65 72 74 28 29 73 20  ction assert()s 
9e30: 74 68 61 74 20 63 6f 64 65 20 69 73 20 69 6e 20  that code is in 
9e40: 74 68 65 20 69 6e 63 6c 75 73 69 76 65 20 72 61  the inclusive ra
9e50: 6e 67 65 20 30 20 74 6f 0a 2a 2a 20 39 39 39 39  nge 0 to.** 9999
9e60: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
9e70: 74 20 57 41 52 4e 49 4e 47 20 63 6f 64 65 73 20  t WARNING codes 
9e80: 28 31 2e 2e 39 39 39 29 20 61 72 65 20 6e 65 76  (1..999) are nev
9e90: 65 72 20 64 75 6d 62 65 64 20 64 6f 77 6e 2e 0a  er dumbed down..
9ea0: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
9eb0: 20 6a 73 6f 6e 5f 64 75 6d 62 64 6f 77 6e 5f 72   json_dumbdown_r
9ec0: 63 28 20 69 6e 74 20 63 6f 64 65 20 29 7b 0a 20  c( int code ){. 
9ed0: 20 69 66 28 21 67 2e 6a 73 6f 6e 2e 65 72 72 6f   if(!g.json.erro
9ee0: 72 44 65 74 61 69 6c 50 61 72 61 6e 6f 69 61 0a  rDetailParanoia.
9ef0: 20 20 20 20 20 7c 7c 20 21 63 6f 64 65 0a 20 20       || !code.  
9f00: 20 20 20 7c 7c 20 28 28 63 6f 64 65 3e 3d 46 53     || ((code>=FS
9f10: 4c 5f 4a 53 4f 4e 5f 57 5f 53 54 41 52 54 29 20  L_JSON_W_START) 
9f20: 26 26 20 28 63 6f 64 65 3c 46 53 4c 5f 4a 53 4f  && (code<FSL_JSO
9f30: 4e 5f 57 5f 45 4e 44 29 29 29 7b 0a 20 20 20 20  N_W_END))){.    
9f40: 72 65 74 75 72 6e 20 63 6f 64 65 3b 0a 20 20 7d  return code;.  }
9f50: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 6f  else{.    int mo
9f60: 64 75 6c 6f 20 3d 20 30 3b 0a 20 20 20 20 61 73  dulo = 0;.    as
9f70: 73 65 72 74 28 28 63 6f 64 65 20 3e 3d 20 31 30  sert((code >= 10
9f80: 30 30 29 20 26 26 20 28 63 6f 64 65 20 3c 3d 20  00) && (code <= 
9f90: 39 39 39 39 29 20 26 26 20 22 49 6e 76 61 6c 69  9999) && "Invali
9fa0: 64 20 46 6f 73 73 69 6c 2f 4a 53 4f 4e 20 63 6f  d Fossil/JSON co
9fb0: 64 65 2e 22 29 3b 0a 20 20 20 20 73 77 69 74 63  de.");.    switc
9fc0: 68 28 20 67 2e 6a 73 6f 6e 2e 65 72 72 6f 72 44  h( g.json.errorD
9fd0: 65 74 61 69 6c 50 61 72 61 6e 6f 69 61 20 29 7b  etailParanoia ){
9fe0: 0a 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 6d  .      case 1: m
9ff0: 6f 64 75 6c 6f 20 3d 20 31 30 3b 20 62 72 65 61  odulo = 10; brea
a000: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 32 3a  k;.      case 2:
a010: 20 6d 6f 64 75 6c 6f 20 3d 20 31 30 30 3b 20 62   modulo = 100; b
a020: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a030: 20 33 3a 20 6d 6f 64 75 6c 6f 20 3d 20 31 30 30   3: modulo = 100
a040: 30 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  0; break;.      
a050: 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a  default: break;.
a060: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 6f      }.    if( mo
a070: 64 75 6c 6f 20 29 20 63 6f 64 65 20 3d 20 63 6f  dulo ) code = co
a080: 64 65 20 2d 20 28 63 6f 64 65 20 25 20 6d 6f 64  de - (code % mod
a090: 75 6c 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ulo);.    return
a0a0: 20 63 6f 64 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   code;.  }.}../*
a0b0: 0a 2a 2a 20 43 6f 6e 76 65 6e 69 65 6e 63 65 20  .** Convenience 
a0c0: 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20 63 6f  routine which co
a0d0: 6e 76 65 72 74 73 20 61 20 4a 75 6c 69 61 6e 20  nverts a Julian 
a0e0: 74 69 6d 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  time value into 
a0f0: 61 20 55 6e 69 78 0a 2a 2a 20 45 70 6f 63 68 20  a Unix.** Epoch 
a100: 74 69 6d 65 73 74 61 6d 70 2e 20 52 65 71 75 69  timestamp. Requi
a110: 72 65 73 20 74 68 65 20 64 62 2c 20 73 6f 20 74  res the db, so t
a120: 68 69 73 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  his cannot be us
a130: 65 64 20 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a  ed before the.**
a140: 20 72 65 70 6f 20 69 73 20 6f 70 65 6e 65 64 20   repo is opened 
a150: 28 77 69 6c 6c 20 74 72 69 67 67 65 72 20 61 20  (will trigger a 
a160: 66 61 74 61 6c 20 65 72 72 6f 72 20 69 6e 20 64  fatal error in d
a170: 62 5f 78 78 78 28 29 29 2e 20 54 68 65 20 72 65  b_xxx()). The re
a180: 74 75 72 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 20  turned.** value 
a190: 69 73 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20  is owned by the 
a1a0: 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 63 73 6f 6e 5f  caller..*/.cson_
a1b0: 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 6a 75 6c  value * json_jul
a1c0: 69 61 6e 5f 74 6f 5f 74 69 6d 65 73 74 61 6d 70  ian_to_timestamp
a1d0: 28 64 6f 75 62 6c 65 20 6a 29 7b 0a 20 20 72 65  (double j){.  re
a1e0: 74 75 72 6e 20 63 73 6f 6e 5f 76 61 6c 75 65 5f  turn cson_value_
a1f0: 6e 65 77 5f 69 6e 74 65 67 65 72 28 28 63 73 6f  new_integer((cso
a200: 6e 5f 69 6e 74 5f 74 29 0a 20 20 20 20 20 20 20  n_int_t).       
a210: 20 20 20 20 64 62 5f 69 6e 74 36 34 28 30 2c 22      db_int64(0,"
a220: 53 45 4c 45 43 54 20 63 61 73 74 28 73 74 72 66  SELECT cast(strf
a230: 74 69 6d 65 28 27 25 25 73 27 2c 25 6c 66 29 20  time('%%s',%lf) 
a240: 61 73 20 69 6e 74 29 22 2c 6a 29 0a 20 20 20 20  as int)",j).    
a250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a260: 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 7d              );.}
a270: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ../*.** Returns 
a280: 61 20 74 69 6d 65 73 74 61 6d 70 20 76 61 6c 75  a timestamp valu
a290: 65 2e 0a 2a 2f 0a 63 73 6f 6e 5f 69 6e 74 5f 74  e..*/.cson_int_t
a2a0: 20 6a 73 6f 6e 5f 74 69 6d 65 73 74 61 6d 70 28   json_timestamp(
a2b0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 63 73 6f  ){.  return (cso
a2c0: 6e 5f 69 6e 74 5f 74 29 74 69 6d 65 28 30 29 3b  n_int_t)time(0);
a2d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
a2e0: 73 20 61 20 6e 65 77 20 4a 53 4f 4e 20 76 61 6c  s a new JSON val
a2f0: 75 65 20 28 6f 77 6e 65 64 20 62 79 20 74 68 65  ue (owned by the
a300: 20 63 61 6c 6c 65 72 29 20 72 65 70 72 65 73 65   caller) represe
a310: 6e 74 69 6e 67 0a 2a 2a 20 61 20 74 69 6d 65 73  nting.** a times
a320: 74 61 6d 70 2e 20 49 66 20 74 69 6d 65 56 61 6c  tamp. If timeVal
a330: 20 69 73 20 3c 20 30 20 74 68 65 6e 20 74 69 6d   is < 0 then tim
a340: 65 28 30 29 20 69 73 20 75 73 65 64 20 74 6f 20  e(0) is used to 
a350: 66 65 74 63 68 0a 2a 2a 20 74 68 65 20 74 69 6d  fetch.** the tim
a360: 65 2c 20 65 6c 73 65 20 74 69 6d 65 56 61 6c 20  e, else timeVal 
a370: 69 73 20 75 73 65 64 20 61 73 2d 69 73 2e 20 54  is used as-is. T
a380: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
a390: 65 20 69 73 0a 2a 2a 20 6f 77 6e 65 64 20 62 79  e is.** owned by
a3a0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
a3b0: 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f  cson_value * jso
a3c0: 6e 5f 6e 65 77 5f 74 69 6d 65 73 74 61 6d 70 28  n_new_timestamp(
a3d0: 63 73 6f 6e 5f 69 6e 74 5f 74 20 74 69 6d 65 56  cson_int_t timeV
a3e0: 61 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 73  al){.  return cs
a3f0: 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 69 6e 74  on_value_new_int
a400: 65 67 65 72 28 28 74 69 6d 65 56 61 6c 3c 30 29  eger((timeVal<0)
a410: 20 3f 20 28 63 73 6f 6e 5f 69 6e 74 5f 74 29 74   ? (cson_int_t)t
a420: 69 6d 65 28 30 29 20 3a 20 74 69 6d 65 56 61 6c  ime(0) : timeVal
a430: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  );.}../*.** Inte
a440: 72 6e 61 6c 20 68 65 6c 70 65 72 20 66 6f 72 20  rnal helper for 
a450: 6a 73 6f 6e 5f 63 72 65 61 74 65 5f 72 65 73 70  json_create_resp
a460: 6f 6e 73 65 28 29 2e 20 41 70 70 65 6e 64 73 20  onse(). Appends 
a470: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 67 2e 6a  the first.** g.j
a480: 73 6f 6e 2e 64 69 73 70 61 74 63 68 44 65 70 74  son.dispatchDept
a490: 68 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 67 2e  h elements of g.
a4a0: 6a 73 6f 6e 2e 63 6d 64 2e 61 2c 20 73 6b 69 70  json.cmd.a, skip
a4b0: 70 69 6e 67 20 74 68 65 20 66 69 72 73 74 0a 2a  ping the first.*
a4c0: 2a 20 6f 6e 65 20 28 74 68 65 20 22 6a 73 6f 6e  * one (the "json
a4d0: 22 20 70 61 72 74 29 2c 20 74 6f 20 61 20 73 74  " part), to a st
a4e0: 72 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 73  ring and returns
a4f0: 20 74 68 61 74 20 73 74 72 69 6e 67 20 76 61 6c   that string val
a500: 75 65 0a 2a 2a 20 28 77 68 69 63 68 20 69 73 20  ue.** (which is 
a510: 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 61 6c  owned by the cal
a520: 6c 65 72 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ler)..*/.static 
a530: 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f  cson_value * jso
a540: 6e 5f 72 65 73 70 6f 6e 73 65 5f 63 6f 6d 6d 61  n_response_comma
a550: 6e 64 5f 70 61 74 68 28 29 7b 0a 20 20 69 66 28  nd_path(){.  if(
a560: 21 67 2e 6a 73 6f 6e 2e 63 6d 64 2e 61 29 7b 0a  !g.json.cmd.a){.
a570: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
a580: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 73  .  }else{.    cs
a590: 6f 6e 5f 76 61 6c 75 65 20 2a 20 72 63 20 3d 20  on_value * rc = 
a5a0: 4e 55 4c 4c 3b 0a 20 20 20 20 42 6c 6f 62 20 70  NULL;.    Blob p
a5b0: 61 74 68 20 3d 20 65 6d 70 74 79 5f 62 6c 6f 62  ath = empty_blob
a5c0: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
a5d0: 6e 74 20 61 4c 65 6e 20 3d 20 67 2e 6a 73 6f 6e  nt aLen = g.json
a5e0: 2e 64 69 73 70 61 74 63 68 44 65 70 74 68 2b 31  .dispatchDepth+1
a5f0: 3b 20 2f 2a 63 73 6f 6e 5f 61 72 72 61 79 5f 6c  ; /*cson_array_l
a600: 65 6e 67 74 68 5f 67 65 74 28 67 2e 6a 73 6f 6e  ength_get(g.json
a610: 2e 63 6d 64 2e 61 29 3b 2a 2f 0a 20 20 20 20 75  .cmd.a);*/.    u
a620: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 20 3d 20  nsigned int i = 
a630: 31 3b 0a 20 20 20 20 66 6f 72 28 20 3b 20 69 20  1;.    for( ; i 
a640: 3c 20 61 4c 65 6e 3b 20 2b 2b 69 20 29 7b 0a 20  < aLen; ++i ){. 
a650: 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20       char const 
a660: 2a 20 70 61 72 74 20 3d 20 63 73 6f 6e 5f 73 74  * part = cson_st
a670: 72 69 6e 67 5f 63 73 74 72 28 63 73 6f 6e 5f 76  ring_cstr(cson_v
a680: 61 6c 75 65 5f 67 65 74 5f 73 74 72 69 6e 67 28  alue_get_string(
a690: 63 73 6f 6e 5f 61 72 72 61 79 5f 67 65 74 28 67  cson_array_get(g
a6a0: 2e 6a 73 6f 6e 2e 63 6d 64 2e 61 2c 20 69 29 29  .json.cmd.a, i))
a6b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 21 70 61 72  );.      if(!par
a6c0: 74 29 7b 0a 23 69 66 20 31 0a 20 20 20 20 20 20  t){.#if 1.      
a6d0: 20 20 20 20 66 6f 73 73 69 6c 5f 77 61 72 6e 69      fossil_warni
a6e0: 6e 67 28 22 49 74 65 72 61 74 69 6e 67 20 66 75  ng("Iterating fu
a6f0: 72 74 68 65 72 20 74 68 61 6e 20 65 78 70 65 63  rther than expec
a700: 74 65 64 20 69 6e 20 25 73 2e 22 2c 0a 20 20 20  ted in %s.",.   
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a720: 20 20 20 20 5f 5f 46 49 4c 45 5f 5f 29 3b 0a 23      __FILE__);.#
a730: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
a740: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
a750: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
a760: 66 28 26 70 61 74 68 2c 22 25 73 25 73 22 2c 20  f(&path,"%s%s", 
a770: 28 69 3e 31 20 3f 20 22 2f 22 3a 20 22 22 29 2c  (i>1 ? "/": ""),
a780: 20 70 61 72 74 29 3b 0a 20 20 20 20 7d 0a 20 20   part);.    }.  
a790: 20 20 72 63 20 3d 20 6a 73 6f 6e 5f 6e 65 77 5f    rc = json_new_
a7a0: 73 74 72 69 6e 67 28 28 62 6c 6f 62 5f 73 69 7a  string((blob_siz
a7b0: 65 28 26 70 61 74 68 29 3e 30 29 0a 20 20 20 20  e(&path)>0).    
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7d0: 20 20 20 20 20 3f 20 62 6c 6f 62 5f 62 75 66 66       ? blob_buff
a7e0: 65 72 28 26 70 61 74 68 29 0a 20 20 20 20 20 20  er(&path).      
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a800: 20 20 20 3a 20 22 22 29 0a 20 20 20 20 20 20 2f     : "").      /
a810: 2a 20 72 65 6d 69 6e 64 65 72 3b 20 77 65 20 6e  * reminder; we n
a820: 65 65 64 20 61 6e 20 65 6d 70 74 79 20 73 74 72  eed an empty str
a830: 69 6e 67 20 69 6e 73 74 65 61 64 20 6f 66 20 4e  ing instead of N
a840: 55 4c 4c 0a 20 20 20 20 20 20 20 20 20 69 6e 20  ULL.         in 
a850: 74 68 69 73 20 63 61 73 65 2c 20 74 6f 20 61 76  this case, to av
a860: 6f 69 64 20 77 68 61 74 20 6f 75 74 77 61 72 64  oid what outward
a870: 6c 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 0a 20 20  ly looks like.  
a880: 20 20 20 20 20 20 20 28 62 75 74 20 69 73 20 6e         (but is n
a890: 6f 74 29 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f  ot) an allocatio
a8a0: 6e 20 65 72 72 6f 72 20 69 6e 0a 20 20 20 20 20  n error in.     
a8b0: 20 20 20 20 6a 73 6f 6e 5f 63 72 65 61 74 65 5f      json_create_
a8c0: 72 65 73 70 6f 6e 73 65 28 29 2e 0a 20 20 20 20  response()..    
a8d0: 20 20 2a 2f 0a 20 20 20 20 20 20 3b 0a 20 20 20    */.      ;.   
a8e0: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 70 61 74   blob_reset(&pat
a8f0: 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  h);.    return r
a900: 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
a910: 52 65 74 75 72 6e 73 20 61 20 4a 53 4f 4e 20 4f  Returns a JSON O
a920: 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 61  bject representa
a930: 74 69 6f 6e 20 6f 66 20 74 68 65 20 67 6c 6f 62  tion of the glob
a940: 61 6c 20 67 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20  al g object..** 
a950: 52 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69  Returned value i
a960: 73 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63  s owned by the c
a970: 61 6c 6c 65 72 2e 0a 2a 2f 0a 63 73 6f 6e 5f 76  aller..*/.cson_v
a980: 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 67 5f 74 6f  alue * json_g_to
a990: 5f 6a 73 6f 6e 28 29 7b 0a 20 20 63 73 6f 6e 5f  _json(){.  cson_
a9a0: 6f 62 6a 65 63 74 20 2a 20 6f 20 3d 20 4e 55 4c  object * o = NUL
a9b0: 4c 3b 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74  L;.  cson_object
a9c0: 20 2a 20 70 61 79 20 3d 20 4e 55 4c 4c 3b 0a 20   * pay = NULL;. 
a9d0: 20 70 61 79 20 3d 20 6f 20 3d 20 63 73 6f 6e 5f   pay = o = cson_
a9e0: 6e 65 77 5f 6f 62 6a 65 63 74 28 29 3b 0a 0a 23  new_object();..#
a9f0: 64 65 66 69 6e 65 20 49 4e 54 28 4f 42 4a 2c 4b  define INT(OBJ,K
aa00: 29 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65  ) cson_object_se
aa10: 74 28 6f 2c 20 23 4b 2c 20 6a 73 6f 6e 5f 6e 65  t(o, #K, json_ne
aa20: 77 5f 69 6e 74 28 4f 42 4a 2e 4b 29 29 0a 23 64  w_int(OBJ.K)).#d
aa30: 65 66 69 6e 65 20 43 53 54 52 28 4f 42 4a 2c 4b  efine CSTR(OBJ,K
aa40: 29 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65  ) cson_object_se
aa50: 74 28 6f 2c 20 23 4b 2c 20 4f 42 4a 2e 4b 20 3f  t(o, #K, OBJ.K ?
aa60: 20 6a 73 6f 6e 5f 6e 65 77 5f 73 74 72 69 6e 67   json_new_string
aa70: 28 4f 42 4a 2e 4b 29 20 3a 20 63 73 6f 6e 5f 76  (OBJ.K) : cson_v
aa80: 61 6c 75 65 5f 6e 75 6c 6c 28 29 29 0a 23 64 65  alue_null()).#de
aa90: 66 69 6e 65 20 56 41 4c 28 4b 2c 56 29 20 63 73  fine VAL(K,V) cs
aaa0: 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 6f 2c  on_object_set(o,
aab0: 20 23 4b 2c 20 28 56 29 20 3f 20 28 56 29 20 3a   #K, (V) ? (V) :
aac0: 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 75 6c 6c   cson_value_null
aad0: 28 29 29 0a 20 20 56 41 4c 28 63 61 70 61 62 69  ()).  VAL(capabi
aae0: 6c 69 74 69 65 73 2c 20 6a 73 6f 6e 5f 63 61 70  lities, json_cap
aaf0: 5f 76 61 6c 75 65 28 29 29 3b 0a 20 20 49 4e 54  _value());.  INT
ab00: 28 67 2c 20 61 72 67 63 29 3b 0a 20 20 49 4e 54  (g, argc);.  INT
ab10: 28 67 2c 20 69 73 43 6f 6e 73 74 29 3b 0a 20 20  (g, isConst);.  
ab20: 49 4e 54 28 67 2c 20 75 73 65 41 74 74 61 63 68  INT(g, useAttach
ab30: 29 3b 0a 20 20 49 4e 54 28 67 2c 20 63 6f 6e 66  );.  INT(g, conf
ab40: 69 67 4f 70 65 6e 29 3b 0a 20 20 49 4e 54 28 67  igOpen);.  INT(g
ab50: 2c 20 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e  , repositoryOpen
ab60: 29 3b 0a 20 20 49 4e 54 28 67 2c 20 6c 6f 63 61  );.  INT(g, loca
ab70: 6c 4f 70 65 6e 29 3b 0a 20 20 49 4e 54 28 67 2c  lOpen);.  INT(g,
ab80: 20 6d 69 6e 50 72 65 66 69 78 29 3b 0a 20 20 49   minPrefix);.  I
ab90: 4e 54 28 67 2c 20 66 53 71 6c 54 72 61 63 65 29  NT(g, fSqlTrace)
aba0: 3b 0a 20 20 49 4e 54 28 67 2c 20 66 53 71 6c 53  ;.  INT(g, fSqlS
abb0: 74 61 74 73 29 3b 0a 20 20 49 4e 54 28 67 2c 20  tats);.  INT(g, 
abc0: 66 53 71 6c 50 72 69 6e 74 29 3b 0a 20 20 49 4e  fSqlPrint);.  IN
abd0: 54 28 67 2c 20 66 51 75 69 65 74 29 3b 0a 20 20  T(g, fQuiet);.  
abe0: 49 4e 54 28 67 2c 20 66 48 74 74 70 54 72 61 63  INT(g, fHttpTrac
abf0: 65 29 3b 0a 20 20 49 4e 54 28 67 2c 20 66 53 79  e);.  INT(g, fSy
ac00: 73 74 65 6d 54 72 61 63 65 29 3b 0a 20 20 49 4e  stemTrace);.  IN
ac10: 54 28 67 2c 20 66 4e 6f 53 79 6e 63 29 3b 0a 20  T(g, fNoSync);. 
ac20: 20 49 4e 54 28 67 2c 20 69 45 72 72 50 72 69 6f   INT(g, iErrPrio
ac30: 72 69 74 79 29 3b 0a 20 20 49 4e 54 28 67 2c 20  rity);.  INT(g, 
ac40: 73 73 6c 4e 6f 74 41 76 61 69 6c 61 62 6c 65 29  sslNotAvailable)
ac50: 3b 0a 20 20 49 4e 54 28 67 2c 20 63 67 69 4f 75  ;.  INT(g, cgiOu
ac60: 74 70 75 74 29 3b 0a 20 20 49 4e 54 28 67 2c 20  tput);.  INT(g, 
ac70: 78 66 65 72 50 61 6e 69 63 29 3b 0a 20 20 49 4e  xferPanic);.  IN
ac80: 54 28 67 2c 20 66 75 6c 6c 48 74 74 70 52 65 70  T(g, fullHttpRep
ac90: 6c 79 29 3b 0a 20 20 49 4e 54 28 67 2c 20 78 6c  ly);.  INT(g, xl
aca0: 69 6e 6b 43 6c 75 73 74 65 72 4f 6e 6c 79 29 3b  inkClusterOnly);
acb0: 0a 20 20 49 4e 54 28 67 2c 20 66 54 69 6d 65 46  .  INT(g, fTimeF
acc0: 6f 72 6d 61 74 29 3b 0a 20 20 49 4e 54 28 67 2c  ormat);.  INT(g,
acd0: 20 6d 61 72 6b 50 72 69 76 61 74 65 29 3b 0a 20   markPrivate);. 
ace0: 20 49 4e 54 28 67 2c 20 63 6c 6f 63 6b 53 6b 65   INT(g, clockSke
acf0: 77 53 65 65 6e 29 3b 0a 20 20 49 4e 54 28 67 2c  wSeen);.  INT(g,
ad00: 20 69 73 48 54 54 50 29 3b 0a 20 20 49 4e 54 28   isHTTP);.  INT(
ad10: 67 2c 20 75 72 6c 49 73 46 69 6c 65 29 3b 0a 20  g, urlIsFile);. 
ad20: 20 49 4e 54 28 67 2c 20 75 72 6c 49 73 48 74 74   INT(g, urlIsHtt
ad30: 70 73 29 3b 0a 20 20 49 4e 54 28 67 2c 20 75 72  ps);.  INT(g, ur
ad40: 6c 49 73 53 73 68 29 3b 0a 20 20 49 4e 54 28 67  lIsSsh);.  INT(g
ad50: 2c 20 75 72 6c 50 6f 72 74 29 3b 0a 20 20 49 4e  , urlPort);.  IN
ad60: 54 28 67 2c 20 75 72 6c 44 66 6c 74 50 6f 72 74  T(g, urlDfltPort
ad70: 29 3b 0a 20 20 49 4e 54 28 67 2c 20 64 6f 6e 74  );.  INT(g, dont
ad80: 4b 65 65 70 55 72 6c 29 3b 0a 20 20 49 4e 54 28  KeepUrl);.  INT(
ad90: 67 2c 20 75 73 65 4c 6f 63 61 6c 61 75 74 68 29  g, useLocalauth)
ada0: 3b 0a 20 20 49 4e 54 28 67 2c 20 6e 6f 50 73 77  ;.  INT(g, noPsw
adb0: 64 29 3b 0a 20 20 49 4e 54 28 67 2c 20 75 73 65  d);.  INT(g, use
adc0: 72 55 69 64 29 3b 0a 20 20 49 4e 54 28 67 2c 20  rUid);.  INT(g, 
add0: 72 63 76 69 64 29 3b 0a 20 20 49 4e 54 28 67 2c  rcvid);.  INT(g,
ade0: 20 6f 6b 43 73 72 66 29 3b 0a 20 20 49 4e 54 28   okCsrf);.  INT(
adf0: 67 2c 20 74 68 54 72 61 63 65 29 3b 0a 20 20 49  g, thTrace);.  I
ae00: 4e 54 28 67 2c 20 69 73 48 6f 6d 65 29 3b 0a 20  NT(g, isHome);. 
ae10: 20 49 4e 54 28 67 2c 20 6e 41 75 78 29 3b 0a 20   INT(g, nAux);. 
ae20: 20 49 4e 54 28 67 2c 20 61 6c 6c 6f 77 53 79 6d   INT(g, allowSym
ae30: 6c 69 6e 6b 73 29 3b 0a 0a 20 20 43 53 54 52 28  links);..  CSTR(
ae40: 67 2c 20 7a 4d 61 69 6e 44 62 54 79 70 65 29 3b  g, zMainDbType);
ae50: 0a 20 20 43 53 54 52 28 67 2c 20 7a 48 6f 6d 65  .  CSTR(g, zHome
ae60: 29 3b 0a 20 20 43 53 54 52 28 67 2c 20 7a 4c 6f  );.  CSTR(g, zLo
ae70: 63 61 6c 52 6f 6f 74 29 3b 0a 20 20 43 53 54 52  calRoot);.  CSTR
ae80: 28 67 2c 20 7a 50 61 74 68 29 3b 0a 20 20 43 53  (g, zPath);.  CS
ae90: 54 52 28 67 2c 20 7a 45 78 74 72 61 29 3b 0a 20  TR(g, zExtra);. 
aea0: 20 43 53 54 52 28 67 2c 20 7a 42 61 73 65 55 52   CSTR(g, zBaseUR
aeb0: 4c 29 3b 0a 20 20 43 53 54 52 28 67 2c 20 7a 54  L);.  CSTR(g, zT
aec0: 6f 70 29 3b 0a 20 20 43 53 54 52 28 67 2c 20 7a  op);.  CSTR(g, z
aed0: 43 6f 6e 74 65 6e 74 54 79 70 65 29 3b 0a 20 20  ContentType);.  
aee0: 43 53 54 52 28 67 2c 20 7a 45 72 72 4d 73 67 29  CSTR(g, zErrMsg)
aef0: 3b 0a 20 20 43 53 54 52 28 67 2c 20 75 72 6c 4e  ;.  CSTR(g, urlN
af00: 61 6d 65 29 3b 0a 20 20 43 53 54 52 28 67 2c 20  ame);.  CSTR(g, 
af10: 75 72 6c 48 6f 73 74 6e 61 6d 65 29 3b 0a 20 20  urlHostname);.  
af20: 43 53 54 52 28 67 2c 20 75 72 6c 50 72 6f 74 6f  CSTR(g, urlProto
af30: 63 6f 6c 29 3b 0a 20 20 43 53 54 52 28 67 2c 20  col);.  CSTR(g, 
af40: 75 72 6c 50 61 74 68 29 3b 0a 20 20 43 53 54 52  urlPath);.  CSTR
af50: 28 67 2c 20 75 72 6c 55 73 65 72 29 3b 0a 20 20  (g, urlUser);.  
af60: 43 53 54 52 28 67 2c 20 75 72 6c 50 61 73 73 77  CSTR(g, urlPassw
af70: 64 29 3b 0a 20 20 43 53 54 52 28 67 2c 20 75 72  d);.  CSTR(g, ur
af80: 6c 43 61 6e 6f 6e 69 63 61 6c 29 3b 0a 20 20 43  lCanonical);.  C
af90: 53 54 52 28 67 2c 20 75 72 6c 50 72 6f 78 79 41  STR(g, urlProxyA
afa0: 75 74 68 29 3b 0a 20 20 43 53 54 52 28 67 2c 20  uth);.  CSTR(g, 
afb0: 75 72 6c 46 6f 73 73 69 6c 29 3b 0a 20 20 43 53  urlFossil);.  CS
afc0: 54 52 28 67 2c 20 7a 4c 6f 67 69 6e 29 3b 0a 20  TR(g, zLogin);. 
afd0: 20 43 53 54 52 28 67 2c 20 7a 53 53 4c 49 64 65   CSTR(g, zSSLIde
afe0: 6e 74 69 74 79 29 3b 0a 20 20 43 53 54 52 28 67  ntity);.  CSTR(g
aff0: 2c 20 7a 49 70 41 64 64 72 29 3b 0a 20 20 43 53  , zIpAddr);.  CS
b000: 54 52 28 67 2c 20 7a 4e 6f 6e 63 65 29 3b 0a 20  TR(g, zNonce);. 
b010: 20 43 53 54 52 28 67 2c 20 7a 43 73 72 66 54 6f   CSTR(g, zCsrfTo
b020: 6b 65 6e 29 3b 0a 0a 20 20 6f 20 3d 20 63 73 6f  ken);..  o = cso
b030: 6e 5f 6e 65 77 5f 6f 62 6a 65 63 74 28 29 3b 0a  n_new_object();.
b040: 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65    cson_object_se
b050: 74 28 70 61 79 2c 20 22 6a 73 6f 6e 22 2c 20 63  t(pay, "json", c
b060: 73 6f 6e 5f 6f 62 6a 65 63 74 5f 76 61 6c 75 65  son_object_value
b070: 28 6f 29 20 29 3b 0a 20 20 49 4e 54 28 67 2e 6a  (o) );.  INT(g.j
b080: 73 6f 6e 2c 20 69 73 4a 73 6f 6e 4d 6f 64 65 29  son, isJsonMode)
b090: 3b 0a 20 20 49 4e 54 28 67 2e 6a 73 6f 6e 2c 20  ;.  INT(g.json, 
b0a0: 72 65 73 75 6c 74 43 6f 64 65 29 3b 0a 20 20 49  resultCode);.  I
b0b0: 4e 54 28 67 2e 6a 73 6f 6e 2c 20 65 72 72 6f 72  NT(g.json, error
b0c0: 44 65 74 61 69 6c 50 61 72 61 6e 6f 69 61 29 3b  DetailParanoia);
b0d0: 0a 20 20 49 4e 54 28 67 2e 6a 73 6f 6e 2c 20 64  .  INT(g.json, d
b0e0: 69 73 70 61 74 63 68 44 65 70 74 68 29 3b 0a 20  ispatchDepth);. 
b0f0: 20 56 41 4c 28 61 75 74 68 54 6f 6b 65 6e 2c 20   VAL(authToken, 
b100: 67 2e 6a 73 6f 6e 2e 61 75 74 68 54 6f 6b 65 6e  g.json.authToken
b110: 29 3b 0a 20 20 43 53 54 52 28 67 2e 6a 73 6f 6e  );.  CSTR(g.json
b120: 2c 20 6a 73 6f 6e 70 29 3b 0a 20 20 56 41 4c 28  , jsonp);.  VAL(
b130: 67 63 2c 20 67 2e 6a 73 6f 6e 2e 67 63 2e 76 29  gc, g.json.gc.v)
b140: 3b 0a 20 20 56 41 4c 28 63 6d 64 2c 20 67 2e 6a  ;.  VAL(cmd, g.j
b150: 73 6f 6e 2e 63 6d 64 2e 76 29 3b 0a 20 20 56 41  son.cmd.v);.  VA
b160: 4c 28 70 61 72 61 6d 2c 20 67 2e 6a 73 6f 6e 2e  L(param, g.json.
b170: 70 61 72 61 6d 2e 76 29 3b 0a 20 20 56 41 4c 28  param.v);.  VAL(
b180: 50 4f 53 54 2c 20 67 2e 6a 73 6f 6e 2e 70 6f 73  POST, g.json.pos
b190: 74 2e 76 29 3b 0a 20 20 56 41 4c 28 77 61 72 6e  t.v);.  VAL(warn
b1a0: 69 6e 67 73 2c 20 67 2e 6a 73 6f 6e 2e 77 61 72  ings, g.json.war
b1b0: 6e 69 6e 67 73 2e 76 29 3b 0a 20 20 2f 2a 63 73  nings.v);.  /*cs
b1c0: 6f 6e 5f 6f 75 74 70 75 74 5f 6f 70 74 20 6f 75  on_output_opt ou
b1d0: 74 4f 70 74 3b 2a 2f 0a 0a 20 20 0a 23 75 6e 64  tOpt;*/..  .#und
b1e0: 65 66 20 49 4e 54 0a 23 75 6e 64 65 66 20 43 53  ef INT.#undef CS
b1f0: 54 52 0a 23 75 6e 64 65 66 20 56 41 4c 0a 20 20  TR.#undef VAL.  
b200: 72 65 74 75 72 6e 20 63 73 6f 6e 5f 6f 62 6a 65  return cson_obje
b210: 63 74 5f 76 61 6c 75 65 28 70 61 79 29 3b 0a 7d  ct_value(pay);.}
b220: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 73  .../*.** Creates
b230: 20 61 20 6e 65 77 20 46 6f 73 73 69 6c 2f 4a 53   a new Fossil/JS
b240: 4f 4e 20 72 65 73 70 6f 6e 73 65 20 65 6e 76 65  ON response enve
b250: 6c 6f 70 65 20 73 6b 65 6c 65 74 6f 6e 2e 20 20  lope skeleton.  
b260: 49 74 20 69 73 20 6f 77 6e 65 64 0a 2a 2a 20 62  It is owned.** b
b270: 79 20 74 68 65 20 63 61 6c 6c 65 72 2c 20 77 68  y the caller, wh
b280: 6f 20 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c  o must eventuall
b290: 79 20 66 72 65 65 20 69 74 20 75 73 69 6e 67 20  y free it using 
b2a0: 63 73 6f 6e 5f 76 61 6c 75 65 5f 66 72 65 65 28  cson_value_free(
b2b0: 29 2c 0a 2a 2a 20 6f 72 20 61 64 64 20 69 74 20  ),.** or add it 
b2c0: 74 6f 20 61 20 63 73 6f 6e 20 63 6f 6e 74 61 69  to a cson contai
b2d0: 6e 65 72 20 74 6f 20 74 72 61 6e 73 66 65 72 20  ner to transfer 
b2e0: 6f 77 6e 65 72 73 68 69 70 2e 20 52 65 74 75 72  ownership. Retur
b2f0: 6e 73 20 4e 55 4c 4c 0a 2a 2a 20 6f 6e 20 65 72  ns NULL.** on er
b300: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ror..**.** If pa
b310: 79 6c 6f 61 64 20 69 73 20 6e 6f 74 20 4e 55 4c  yload is not NUL
b320: 4c 20 61 6e 64 20 72 65 73 75 6c 74 43 6f 64 65  L and resultCode
b330: 20 69 73 20 30 20 74 68 65 6e 20 69 74 20 69 73   is 0 then it is
b340: 20 73 65 74 20 61 73 20 74 68 65 0a 2a 2a 20 22   set as the.** "
b350: 70 61 79 6c 6f 61 64 22 20 70 72 6f 70 65 72 74  payload" propert
b360: 79 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  y of the returne
b370: 64 20 6f 62 6a 65 63 74 2e 20 20 49 66 20 72 65  d object.  If re
b380: 73 75 6c 74 43 6f 64 65 20 69 73 20 30 20 74 68  sultCode is 0 th
b390: 65 6e 0a 2a 2a 20 69 74 20 64 65 66 61 75 6c 74  en.** it default
b3a0: 73 20 74 6f 20 67 2e 6a 73 6f 6e 2e 72 65 73 75  s to g.json.resu
b3b0: 6c 74 43 6f 64 65 2e 20 49 66 20 72 65 73 75 6c  ltCode. If resul
b3c0: 74 43 6f 64 65 20 69 73 20 28 6f 72 20 64 65 66  tCode is (or def
b3d0: 61 75 6c 74 73 20 74 6f 29 0a 2a 2a 20 6e 6f 6e  aults to).** non
b3e0: 2d 7a 65 72 6f 20 61 6e 64 20 70 61 79 6c 6f 61  -zero and payloa
b3f0: 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  d is not NULL th
b400: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
b410: 20 63 61 6c 6c 73 0a 2a 2a 20 63 73 6f 6e 5f 76   calls.** cson_v
b420: 61 6c 75 65 5f 66 72 65 65 28 70 61 79 6c 6f 61  alue_free(payloa
b430: 64 29 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  d) and does not 
b440: 69 6e 73 65 72 74 20 74 68 65 20 70 61 79 6c 6f  insert the paylo
b450: 61 64 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 72  ad into the.** r
b460: 65 73 70 6f 6e 73 65 2e 20 49 6e 20 65 69 74 68  esponse. In eith
b470: 65 72 20 63 61 73 65 2c 20 6f 6e 77 65 72 73 68  er case, onwersh
b480: 69 70 20 6f 66 20 70 61 79 6c 6f 61 64 20 69 73  ip of payload is
b490: 20 74 72 61 6e 73 66 65 72 65 64 20 74 6f 20 28   transfered to (
b4a0: 6f 72 0a 2a 2a 20 73 68 61 72 65 64 20 77 69 74  or.** shared wit
b4b0: 68 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  h, if the caller
b4c0: 20 68 6f 6c 64 73 20 61 20 72 65 66 65 72 65 6e   holds a referen
b4d0: 63 65 29 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ce) this functio
b4e0: 6e 2e 0a 2a 2a 0a 2a 2a 20 70 4d 73 67 20 69 73  n..**.** pMsg is
b4f0: 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 6d 65 73   an optional mes
b500: 73 61 67 65 20 73 74 72 69 6e 67 20 70 72 6f 70  sage string prop
b510: 65 72 74 79 20 28 72 65 73 75 6c 74 54 65 78 74  erty (resultText
b520: 29 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 73 70  ) of the.** resp
b530: 6f 6e 73 65 2e 20 49 66 20 72 65 73 75 6c 74 43  onse. If resultC
b540: 6f 64 65 20 69 73 20 6e 6f 6e 2d 30 20 61 6e 64  ode is non-0 and
b550: 20 70 4d 73 67 20 69 73 20 4e 55 4c 4c 20 74 68   pMsg is NULL th
b560: 65 6e 0a 2a 2a 20 6a 73 6f 6e 5f 65 72 72 5f 63  en.** json_err_c
b570: 73 74 72 28 29 20 69 73 20 75 73 65 64 20 74 6f  str() is used to
b580: 20 67 65 74 20 74 68 65 20 65 72 72 6f 72 20 73   get the error s
b590: 74 72 69 6e 67 2e 20 54 68 65 20 63 61 6c 6c 65  tring. The calle
b5a0: 72 20 6d 61 79 0a 2a 2a 20 70 72 6f 76 69 64 65  r may.** provide
b5b0: 20 68 69 73 20 6f 77 6e 20 6f 72 20 6d 61 79 20   his own or may 
b5c0: 75 73 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72  use an empty str
b5d0: 69 6e 67 20 74 6f 20 73 75 70 70 72 65 73 73 20  ing to suppress 
b5e0: 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 54 65 78  the.** resultTex
b5f0: 74 20 70 72 6f 70 65 72 74 79 2e 0a 2a 2a 0a 2a  t property..**.*
b600: 2f 0a 73 74 61 74 69 63 20 63 73 6f 6e 5f 76 61  /.static cson_va
b610: 6c 75 65 20 2a 20 6a 73 6f 6e 5f 63 72 65 61 74  lue * json_creat
b620: 65 5f 72 65 73 70 6f 6e 73 65 28 20 69 6e 74 20  e_response( int 
b630: 72 65 73 75 6c 74 43 6f 64 65 2c 0a 20 20 20 20  resultCode,.    
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b660: 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74        char const
b670: 20 2a 20 70 4d 73 67 2c 0a 20 20 20 20 20 20 20   * pMsg,.       
b680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6a0: 20 20 20 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20     cson_value * 
b6b0: 70 61 79 6c 6f 61 64 29 7b 0a 20 20 63 73 6f 6e  payload){.  cson
b6c0: 5f 76 61 6c 75 65 20 2a 20 76 20 3d 20 4e 55 4c  _value * v = NUL
b6d0: 4c 3b 0a 20 20 63 73 6f 6e 5f 76 61 6c 75 65 20  L;.  cson_value 
b6e0: 2a 20 74 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  * tmp = NULL;.  
b6f0: 63 73 6f 6e 5f 6f 62 6a 65 63 74 20 2a 20 6f 20  cson_object * o 
b700: 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 72 63  = NULL;.  int rc
b710: 3b 0a 20 20 72 65 73 75 6c 74 43 6f 64 65 20 3d  ;.  resultCode =
b720: 20 6a 73 6f 6e 5f 64 75 6d 62 64 6f 77 6e 5f 72   json_dumbdown_r
b730: 63 28 72 65 73 75 6c 74 43 6f 64 65 20 3f 20 72  c(resultCode ? r
b740: 65 73 75 6c 74 43 6f 64 65 20 3a 20 67 2e 6a 73  esultCode : g.js
b750: 6f 6e 2e 72 65 73 75 6c 74 43 6f 64 65 29 3b 0a  on.resultCode);.
b760: 20 20 6f 20 3d 20 63 73 6f 6e 5f 6e 65 77 5f 6f    o = cson_new_o
b770: 62 6a 65 63 74 28 29 3b 0a 20 20 76 20 3d 20 63  bject();.  v = c
b780: 73 6f 6e 5f 6f 62 6a 65 63 74 5f 76 61 6c 75 65  son_object_value
b790: 28 6f 29 3b 0a 20 20 69 66 28 20 21 20 6f 20 29  (o);.  if( ! o )
b7a0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 64   return NULL;.#d
b7b0: 65 66 69 6e 65 20 53 45 54 28 4b 29 20 69 66 28  efine SET(K) if(
b7c0: 21 74 6d 70 29 20 67 6f 74 6f 20 63 6c 65 61 6e  !tmp) goto clean
b7d0: 75 70 3b 20 5c 0a 20 20 72 63 20 3d 20 63 73 6f  up; \.  rc = cso
b7e0: 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 20 6f 2c  n_object_set( o,
b7f0: 20 4b 2c 20 74 6d 70 20 29 3b 20 5c 0a 20 20 69   K, tmp ); \.  i
b800: 66 28 72 63 29 20 64 6f 7b 5c 0a 20 20 20 20 63  f(rc) do{\.    c
b810: 73 6f 6e 5f 76 61 6c 75 65 5f 66 72 65 65 28 74  son_value_free(t
b820: 6d 70 29 3b 20 5c 0a 20 20 20 20 74 6d 70 20 3d  mp); \.    tmp =
b830: 20 4e 55 4c 4c 3b 20 5c 0a 20 20 20 20 67 6f 74   NULL; \.    got
b840: 6f 20 63 6c 65 61 6e 75 70 3b 20 5c 0a 20 20 7d  o cleanup; \.  }
b850: 77 68 69 6c 65 28 30 29 0a 0a 20 20 0a 20 20 74  while(0)..  .  t
b860: 6d 70 20 3d 20 6a 73 6f 6e 5f 6e 65 77 5f 73 74  mp = json_new_st
b870: 72 69 6e 67 28 4d 41 4e 49 46 45 53 54 5f 55 55  ring(MANIFEST_UU
b880: 49 44 29 3b 0a 20 20 53 45 54 28 22 66 6f 73 73  ID);.  SET("foss
b890: 69 6c 22 29 3b 0a 0a 20 20 74 6d 70 20 3d 20 6a  il");..  tmp = j
b8a0: 73 6f 6e 5f 6e 65 77 5f 74 69 6d 65 73 74 61 6d  son_new_timestam
b8b0: 70 28 2d 31 29 3b 0a 20 20 53 45 54 28 46 6f 73  p(-1);.  SET(Fos
b8c0: 73 69 6c 4a 73 6f 6e 4b 65 79 73 2e 74 69 6d 65  silJsonKeys.time
b8d0: 73 74 61 6d 70 29 3b 0a 0a 20 20 69 66 28 20 30  stamp);..  if( 0
b8e0: 20 21 3d 20 72 65 73 75 6c 74 43 6f 64 65 20 29   != resultCode )
b8f0: 7b 0a 20 20 20 20 69 66 28 20 21 20 70 4d 73 67  {.    if( ! pMsg
b900: 20 29 7b 0a 20 20 20 20 20 20 70 4d 73 67 20 3d   ){.      pMsg =
b910: 20 67 2e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20   g.zErrMsg;.    
b920: 20 20 69 66 28 21 70 4d 73 67 29 7b 0a 20 20 20    if(!pMsg){.   
b930: 20 20 20 20 20 70 4d 73 67 20 3d 20 6a 73 6f 6e       pMsg = json
b940: 5f 65 72 72 5f 63 73 74 72 28 72 65 73 75 6c 74  _err_cstr(result
b950: 43 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Code);.      }. 
b960: 20 20 20 7d 0a 20 20 20 20 74 6d 70 20 3d 20 6a     }.    tmp = j
b970: 73 6f 6e 5f 6e 65 77 5f 73 74 72 69 6e 67 28 6a  son_new_string(j
b980: 73 6f 6e 5f 72 63 5f 63 73 74 72 28 72 65 73 75  son_rc_cstr(resu
b990: 6c 74 43 6f 64 65 29 29 3b 0a 20 20 20 20 53 45  ltCode));.    SE
b9a0: 54 28 46 6f 73 73 69 6c 4a 73 6f 6e 4b 65 79 73  T(FossilJsonKeys
b9b0: 2e 72 65 73 75 6c 74 43 6f 64 65 29 3b 0a 20 20  .resultCode);.  
b9c0: 7d 0a 0a 20 20 69 66 28 20 70 4d 73 67 20 26 26  }..  if( pMsg &&
b9d0: 20 2a 70 4d 73 67 20 29 7b 0a 20 20 20 20 74 6d   *pMsg ){.    tm
b9e0: 70 20 3d 20 6a 73 6f 6e 5f 6e 65 77 5f 73 74 72  p = json_new_str
b9f0: 69 6e 67 28 70 4d 73 67 29 3b 0a 20 20 20 20 53  ing(pMsg);.    S
ba00: 45 54 28 46 6f 73 73 69 6c 4a 73 6f 6e 4b 65 79  ET(FossilJsonKey
ba10: 73 2e 72 65 73 75 6c 74 54 65 78 74 29 3b 0a 20  s.resultText);. 
ba20: 20 7d 0a 0a 20 20 69 66 28 67 2e 6a 73 6f 6e 2e   }..  if(g.json.
ba30: 63 6d 64 2e 63 6f 6d 6d 61 6e 64 53 74 72 29 7b  cmd.commandStr){
ba40: 0a 20 20 20 20 74 6d 70 20 3d 20 6a 73 6f 6e 5f  .    tmp = json_
ba50: 6e 65 77 5f 73 74 72 69 6e 67 28 67 2e 6a 73 6f  new_string(g.jso
ba60: 6e 2e 63 6d 64 2e 63 6f 6d 6d 61 6e 64 53 74 72  n.cmd.commandStr
ba70: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
ba80: 74 6d 70 20 3d 20 6a 73 6f 6e 5f 72 65 73 70 6f  tmp = json_respo
ba90: 6e 73 65 5f 63 6f 6d 6d 61 6e 64 5f 70 61 74 68  nse_command_path
baa0: 28 29 3b 0a 20 20 7d 0a 20 20 53 45 54 28 22 63  ();.  }.  SET("c
bab0: 6f 6d 6d 61 6e 64 22 29 3b 0a 20 20 0a 20 20 74  ommand");.  .  t
bac0: 6d 70 20 3d 20 6a 73 6f 6e 5f 67 65 74 65 6e 76  mp = json_getenv
bad0: 28 46 6f 73 73 69 6c 4a 73 6f 6e 4b 65 79 73 2e  (FossilJsonKeys.
bae0: 72 65 71 75 65 73 74 49 64 29 3b 0a 20 20 69 66  requestId);.  if
baf0: 28 20 74 6d 70 20 29 20 63 73 6f 6e 5f 6f 62 6a  ( tmp ) cson_obj
bb00: 65 63 74 5f 73 65 74 28 20 6f 2c 20 46 6f 73 73  ect_set( o, Foss
bb10: 69 6c 4a 73 6f 6e 4b 65 79 73 2e 72 65 71 75 65  ilJsonKeys.reque
bb20: 73 74 49 64 2c 20 74 6d 70 20 29 3b 0a 0a 20 20  stId, tmp );..  
bb30: 69 66 28 30 29 7b 2f 2a 20 74 68 65 73 65 20 61  if(0){/* these a
bb40: 72 65 20 6f 6e 6c 79 20 69 6e 74 65 6e 64 65 64  re only intended
bb50: 20 66 6f 72 20 6d 79 20 6f 77 6e 20 74 65 73 74   for my own test
bb60: 69 6e 67 2e 2e 2e 2a 2f 0a 20 20 20 20 69 66 28  ing...*/.    if(
bb70: 67 2e 6a 73 6f 6e 2e 63 6d 64 2e 76 29 7b 0a 20  g.json.cmd.v){. 
bb80: 20 20 20 20 20 74 6d 70 20 3d 20 67 2e 6a 73 6f       tmp = g.jso
bb90: 6e 2e 63 6d 64 2e 76 3b 0a 20 20 20 20 20 20 53  n.cmd.v;.      S
bba0: 45 54 28 22 24 63 6f 6d 6d 61 6e 64 50 61 74 68  ET("$commandPath
bbb0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
bbc0: 28 67 2e 6a 73 6f 6e 2e 70 61 72 61 6d 2e 76 29  (g.json.param.v)
bbd0: 7b 0a 20 20 20 20 20 20 74 6d 70 20 3d 20 67 2e  {.      tmp = g.
bbe0: 6a 73 6f 6e 2e 70 61 72 61 6d 2e 76 3b 0a 20 20  json.param.v;.  
bbf0: 20 20 20 20 53 45 54 28 22 24 70 61 72 61 6d 73      SET("$params
bc00: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
bc10: 28 30 29 7b 2f 2a 4f 6e 6c 79 20 66 6f 72 20 64  (0){/*Only for d
bc20: 65 62 75 67 67 65 72 69 6e 67 2c 20 61 64 64 20  ebuggering, add 
bc30: 73 6f 6d 65 20 69 6e 66 6f 20 74 6f 20 74 68 65  some info to the
bc40: 20 72 65 73 70 6f 6e 73 65 2e 2a 2f 0a 20 20 20   response.*/.   
bc50: 20 20 20 74 6d 70 20 3d 20 63 73 6f 6e 5f 76 61     tmp = cson_va
bc60: 6c 75 65 5f 6e 65 77 5f 69 6e 74 65 67 65 72 28  lue_new_integer(
bc70: 20 67 2e 6a 73 6f 6e 2e 63 6d 64 2e 6f 66 66 73   g.json.cmd.offs
bc80: 65 74 20 29 3b 0a 20 20 20 20 20 20 63 73 6f 6e  et );.      cson
bc90: 5f 6f 62 6a 65 63 74 5f 73 65 74 28 20 6f 2c 20  _object_set( o, 
bca0: 22 63 6d 64 2e 6f 66 66 73 65 74 22 2c 20 74 6d  "cmd.offset", tm
bcb0: 70 20 29 3b 0a 20 20 20 20 20 20 63 73 6f 6e 5f  p );.      cson_
bcc0: 6f 62 6a 65 63 74 5f 73 65 74 28 20 6f 2c 20 22  object_set( o, "
bcd0: 69 73 43 47 49 22 2c 20 63 73 6f 6e 5f 76 61 6c  isCGI", cson_val
bce0: 75 65 5f 6e 65 77 5f 62 6f 6f 6c 28 20 67 2e 69  ue_new_bool( g.i
bcf0: 73 48 54 54 50 20 29 20 29 3b 0a 20 20 20 20 7d  sHTTP ) );.    }
bd00: 0a 20 20 7d 0a 0a 20 20 69 66 28 48 41 53 5f 54  .  }..  if(HAS_T
bd10: 49 4d 45 52 29 7b 0a 20 20 20 20 2f 2a 20 54 68  IMER){.    /* Th
bd20: 69 73 20 69 73 2c 20 70 68 69 6c 6f 73 6f 70 68  is is, philosoph
bd30: 69 63 61 6c 6c 79 20 73 70 65 61 6b 69 6e 67 2c  ically speaking,
bd40: 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20 72   not quite the r
bd50: 69 67 68 74 20 70 6c 61 63 65 0a 20 20 20 20 20  ight place.     
bd60: 20 20 66 6f 72 20 65 6e 64 69 6e 67 20 74 68 65    for ending the
bd70: 20 74 69 6d 65 72 2c 20 62 75 74 20 74 68 69 73   timer, but this
bd80: 20 69 73 20 74 68 65 20 6f 6e 65 20 66 75 6e 63   is the one func
bd90: 74 69 6f 6e 20 77 68 69 63 68 20 61 6c 6c 20 6f  tion which all o
bda0: 66 0a 20 20 20 20 20 20 20 74 68 65 20 4a 53 4f  f.       the JSO
bdb0: 4e 20 65 78 69 74 20 70 61 74 68 73 20 75 73 65  N exit paths use
bdc0: 20 28 61 6e 64 20 74 68 65 79 20 63 61 6c 6c 20   (and they call 
bdd0: 69 74 20 61 66 74 65 72 20 70 72 6f 63 65 73 73  it after process
bde0: 69 6e 67 2c 0a 20 20 20 20 20 20 20 6a 75 73 74  ing,.       just
bdf0: 20 62 65 66 6f 72 65 20 74 68 65 79 20 65 6e 64   before they end
be00: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  )..    */.    do
be10: 75 62 6c 65 20 73 70 61 6e 3b 0a 20 20 20 20 73  uble span;.    s
be20: 70 61 6e 20 3d 20 45 4e 44 5f 54 49 4d 45 52 3b  pan = END_TIMER;
be30: 0a 20 20 20 20 2f 2a 20 69 27 6d 20 61 63 74 75  .    /* i'm actu
be40: 61 6c 6c 79 20 73 65 65 69 6e 67 20 73 75 62 2d  ally seeing sub-
be50: 6d 73 20 72 75 6e 74 69 6d 65 73 20 69 6e 20 73  ms runtimes in s
be60: 6f 6d 65 20 74 65 73 74 73 2c 20 62 75 74 20 61  ome tests, but a
be70: 20 74 69 6d 65 20 6f 66 0a 20 20 20 20 20 20 20   time of.       
be80: 30 20 69 73 20 22 6a 75 73 74 20 77 72 6f 6e 67  0 is "just wrong
be90: 22 2c 20 73 6f 20 77 65 27 6c 6c 20 62 75 6d 70  ", so we'll bump
bea0: 20 74 68 61 74 20 75 70 20 74 6f 20 31 6d 73 2e   that up to 1ms.
beb0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 73 6f 6e  .    */.    cson
bec0: 5f 6f 62 6a 65 63 74 5f 73 65 74 28 6f 2c 22 70  _object_set(o,"p
bed0: 72 6f 63 54 69 6d 65 4d 73 22 2c 20 63 73 6f 6e  rocTimeMs", cson
bee0: 5f 76 61 6c 75 65 5f 6e 65 77 5f 69 6e 74 65 67  _value_new_integ
bef0: 65 72 28 28 63 73 6f 6e 5f 69 6e 74 5f 74 29 28  er((cson_int_t)(
bf00: 28 73 70 61 6e 3e 31 2e 30 29 3f 73 70 61 6e 3a  (span>1.0)?span:
bf10: 31 29 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 67  1)));.  }.  if(g
bf20: 2e 6a 73 6f 6e 2e 77 61 72 6e 69 6e 67 73 2e 76  .json.warnings.v
bf30: 29 7b 0a 20 20 20 20 74 6d 70 20 3d 20 67 2e 6a  ){.    tmp = g.j
bf40: 73 6f 6e 2e 77 61 72 6e 69 6e 67 73 2e 76 3b 0a  son.warnings.v;.
bf50: 20 20 20 20 53 45 54 28 22 77 61 72 6e 69 6e 67      SET("warning
bf60: 73 22 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  s");.  }.  .  /*
bf70: 20 4f 6e 6c 79 20 61 64 64 20 74 68 65 20 70 61   Only add the pa
bf80: 79 6c 6f 61 64 20 74 6f 20 53 55 43 43 45 53 53  yload to SUCCESS
bf90: 20 72 65 73 70 6f 6e 73 65 73 2e 20 45 6c 73 65   responses. Else
bfa0: 20 64 65 6c 65 74 65 20 69 74 2e 20 2a 2f 0a 20   delete it. */. 
bfb0: 20 69 66 28 20 4e 55 4c 4c 20 21 3d 20 70 61 79   if( NULL != pay
bfc0: 6c 6f 61 64 20 29 7b 0a 20 20 20 20 69 66 28 20  load ){.    if( 
bfd0: 72 65 73 75 6c 74 43 6f 64 65 20 29 7b 0a 20 20  resultCode ){.  
bfe0: 20 20 20 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 66      cson_value_f
bff0: 72 65 65 28 70 61 79 6c 6f 61 64 29 3b 0a 20 20  ree(payload);.  
c000: 20 20 20 20 70 61 79 6c 6f 61 64 20 3d 20 4e 55      payload = NU
c010: 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
c020: 20 20 20 20 20 74 6d 70 20 3d 20 70 61 79 6c 6f       tmp = paylo
c030: 61 64 3b 0a 20 20 20 20 20 20 53 45 54 28 46 6f  ad;.      SET(Fo
c040: 73 73 69 6c 4a 73 6f 6e 4b 65 79 73 2e 70 61 79  ssilJsonKeys.pay
c050: 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  load);.    }.  }
c060: 0a 0a 20 20 69 66 28 6a 73 6f 6e 5f 66 69 6e 64  ..  if(json_find
c070: 5f 6f 70 74 69 6f 6e 5f 62 6f 6f 6c 28 22 64 65  _option_bool("de
c080: 62 75 67 46 6f 73 73 69 6c 47 22 2c 22 6a 73 6f  bugFossilG","jso
c090: 6e 2d 64 65 62 75 67 2d 67 22 2c 4e 55 4c 4c 2c  n-debug-g",NULL,
c0a0: 30 29 0a 20 20 20 20 20 26 26 28 67 2e 70 65 72  0).     &&(g.per
c0b0: 6d 2e 41 64 6d 69 6e 7c 7c 67 2e 70 65 72 6d 2e  m.Admin||g.perm.
c0c0: 53 65 74 75 70 29 29 7b 0a 20 20 20 20 74 6d 70  Setup)){.    tmp
c0d0: 20 3d 20 6a 73 6f 6e 5f 67 5f 74 6f 5f 6a 73 6f   = json_g_to_jso
c0e0: 6e 28 29 3b 0a 20 20 20 20 53 45 54 28 22 67 22  n();.    SET("g"
c0f0: 29 3b 0a 20 20 7d 0a 20 20 0a 23 75 6e 64 65 66  );.  }.  .#undef
c100: 20 53 45 54 0a 20 20 67 6f 74 6f 20 6f 6b 3b 0a   SET.  goto ok;.
c110: 20 20 63 6c 65 61 6e 75 70 3a 0a 20 20 63 73 6f    cleanup:.  cso
c120: 6e 5f 76 61 6c 75 65 5f 66 72 65 65 28 76 29 3b  n_value_free(v);
c130: 0a 20 20 76 20 3d 20 4e 55 4c 4c 3b 0a 20 20 6f  .  v = NULL;.  o
c140: 6b 3a 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d  k:.  return v;.}
c150: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 73 20  ../*.** Outputs 
c160: 61 20 4a 53 4f 4e 20 65 72 72 6f 72 20 72 65 73  a JSON error res
c170: 70 6f 6e 73 65 20 74 6f 20 65 69 74 68 65 72 20  ponse to either 
c180: 74 68 65 20 63 67 69 5f 78 78 78 28 29 20 66 61  the cgi_xxx() fa
c190: 6d 69 6c 79 20 6f 66 0a 2a 2a 20 62 75 66 66 65  mily of.** buffe
c1a0: 72 73 20 28 69 6e 20 43 47 49 2f 73 65 72 76 65  rs (in CGI/serve
c1b0: 72 20 6d 6f 64 65 29 20 6f 72 20 73 74 64 6f 75  r mode) or stdou
c1c0: 74 20 28 69 6e 20 43 4c 49 20 6d 6f 64 65 29 2e  t (in CLI mode).
c1d0: 20 49 66 20 72 63 20 69 73 20 30 0a 2a 2a 20 74   If rc is 0.** t
c1e0: 68 65 6e 20 67 2e 6a 73 6f 6e 2e 72 65 73 75 6c  hen g.json.resul
c1f0: 74 43 6f 64 65 20 69 73 20 75 73 65 64 2e 20 49  tCode is used. I
c200: 66 20 74 68 61 74 20 69 73 20 61 6c 73 6f 20 30  f that is also 0
c210: 20 74 68 65 6e 20 74 68 65 20 22 55 6e 6b 6e 6f   then the "Unkno
c220: 77 6e 0a 2a 2a 20 45 72 72 6f 72 22 20 63 6f 64  wn.** Error" cod
c230: 65 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  e is used..**.**
c240: 20 49 66 20 67 2e 69 73 48 54 54 50 20 74 68 65   If g.isHTTP the
c250: 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  n the generated 
c260: 4a 53 4f 4e 20 65 72 72 6f 72 20 72 65 73 70 6f  JSON error respo
c270: 6e 73 65 20 6f 62 6a 65 63 74 20 72 65 70 6c 61  nse object repla
c280: 63 65 73 0a 2a 2a 20 61 6e 79 20 63 75 72 72 65  ces.** any curre
c290: 6e 74 6c 79 20 62 75 66 66 65 72 65 64 20 70 61  ntly buffered pa
c2a0: 67 65 20 6f 75 74 70 75 74 2e 20 42 65 63 61 75  ge output. Becau
c2b0: 73 65 20 74 68 65 20 6f 75 74 70 75 74 20 67 6f  se the output go
c2c0: 65 73 20 76 69 61 0a 2a 2a 20 74 68 65 20 63 67  es via.** the cg
c2d0: 69 5f 78 78 78 28 29 20 66 61 6d 69 6c 79 20 6f  i_xxx() family o
c2e0: 66 20 66 75 6e 63 74 69 6f 6e 73 2c 20 74 68 69  f functions, thi
c2f0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 68 65 72  s function inher
c300: 69 74 73 20 61 6e 79 0a 2a 2a 20 63 6f 6d 70 72  its any.** compr
c310: 65 73 73 69 6f 6e 20 77 68 69 63 68 20 66 6f 73  ession which fos
c320: 73 69 6c 20 64 6f 65 73 20 66 6f 72 20 69 74 73  sil does for its
c330: 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 49   output..**.** I
c340: 66 20 61 6c 73 6f 4f 75 74 70 75 74 20 69 73 20  f alsoOutput is 
c350: 74 72 75 65 20 41 4e 44 20 67 2e 69 73 48 54 54  true AND g.isHTT
c360: 50 20 74 68 65 6e 20 63 67 69 5f 72 65 70 6c 79  P then cgi_reply
c370: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 0a  () is called to.
c380: 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 6f 75 74  ** flush the out
c390: 70 75 74 20 28 61 6e 64 20 68 65 61 64 65 72 73  put (and headers
c3a0: 29 2e 20 47 65 6e 65 72 61 6c 6c 79 20 6f 6e 6c  ). Generally onl
c3b0: 79 20 64 6f 20 74 68 69 73 20 69 66 20 79 6f 75  y do this if you
c3c0: 20 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 6f   are.** about to
c3d0: 20 63 61 6c 6c 20 65 78 69 74 28 29 2e 0a 2a 2a   call exit()..**
c3e0: 0a 2a 2a 20 49 66 20 21 67 2e 69 73 48 54 54 50  .** If !g.isHTTP
c3f0: 20 74 68 65 6e 20 61 6c 73 6f 4f 75 74 70 75 74   then alsoOutput
c400: 20 69 73 20 69 67 6e 6f 72 65 64 20 61 6e 64 20   is ignored and 
c410: 61 6c 6c 20 6f 75 74 70 75 74 20 69 73 20 73 65  all output is se
c420: 6e 74 20 74 6f 0a 2a 2a 20 73 74 64 6f 75 74 20  nt to.** stdout 
c430: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2a 0a  immediately..**.
c440: 2a 2a 20 46 6f 72 20 67 65 6e 65 72 61 74 69 6e  ** For generatin
c450: 67 20 74 68 65 20 72 65 73 75 6c 74 54 65 78 74  g the resultText
c460: 20 70 72 6f 70 65 72 74 79 3a 20 69 66 20 6d 73   property: if ms
c470: 67 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  g is not NULL th
c480: 65 6e 20 69 74 0a 2a 2a 20 69 73 20 75 73 65 64  en it.** is used
c490: 20 61 73 2d 69 73 2e 20 49 66 20 69 74 20 69 73   as-is. If it is
c4a0: 20 4e 55 4c 4c 20 74 68 65 6e 20 67 2e 7a 45 72   NULL then g.zEr
c4b0: 72 4d 73 67 20 69 73 20 63 68 65 63 6b 65 64 2c  rMsg is checked,
c4c0: 20 61 6e 64 20 69 66 20 74 68 61 74 0a 2a 2a 20   and if that.** 
c4d0: 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 6a 73 6f  is NULL then jso
c4e0: 6e 5f 65 72 72 5f 63 73 74 72 28 63 6f 64 65 29  n_err_cstr(code)
c4f0: 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69   is used..*/.voi
c500: 64 20 6a 73 6f 6e 5f 65 72 72 28 20 69 6e 74 20  d json_err( int 
c510: 63 6f 64 65 2c 20 63 68 61 72 20 63 6f 6e 73 74  code, char const
c520: 20 2a 20 6d 73 67 2c 20 63 68 61 72 20 61 6c 73   * msg, char als
c530: 6f 4f 75 74 70 75 74 20 29 7b 0a 20 20 69 6e 74  oOutput ){.  int
c540: 20 72 63 20 3d 20 63 6f 64 65 20 3f 20 63 6f 64   rc = code ? cod
c550: 65 20 3a 20 28 67 2e 6a 73 6f 6e 2e 72 65 73 75  e : (g.json.resu
c560: 6c 74 43 6f 64 65 0a 20 20 20 20 20 20 20 20 20  ltCode.         
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c580: 20 3f 20 67 2e 6a 73 6f 6e 2e 72 65 73 75 6c 74   ? g.json.result
c590: 43 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20 20  Code.           
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
c5b0: 20 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 55 4e 4b 4e   FSL_JSON_E_UNKN
c5c0: 4f 57 4e 29 3b 0a 20 20 63 73 6f 6e 5f 76 61 6c  OWN);.  cson_val
c5d0: 75 65 20 2a 20 72 65 73 70 20 3d 20 4e 55 4c 4c  ue * resp = NULL
c5e0: 3b 0a 20 20 72 63 20 3d 20 6a 73 6f 6e 5f 64 75  ;.  rc = json_du
c5f0: 6d 62 64 6f 77 6e 5f 72 63 28 72 63 29 3b 0a 20  mbdown_rc(rc);. 
c600: 20 69 66 28 20 72 63 20 26 26 20 21 6d 73 67 20   if( rc && !msg 
c610: 29 7b 0a 20 20 20 20 6d 73 67 20 3d 20 67 2e 7a  ){.    msg = g.z
c620: 45 72 72 4d 73 67 3b 0a 20 20 20 20 69 66 28 21  ErrMsg;.    if(!
c630: 6d 73 67 29 7b 0a 20 20 20 20 20 20 6d 73 67 20  msg){.      msg 
c640: 3d 20 6a 73 6f 6e 5f 65 72 72 5f 63 73 74 72 28  = json_err_cstr(
c650: 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rc);.    }.  }. 
c660: 20 72 65 73 70 20 3d 20 6a 73 6f 6e 5f 63 72 65   resp = json_cre
c670: 61 74 65 5f 72 65 73 70 6f 6e 73 65 28 72 63 2c  ate_response(rc,
c680: 20 6d 73 67 2c 20 4e 55 4c 4c 29 3b 0a 20 20 69   msg, NULL);.  i
c690: 66 28 21 72 65 73 70 29 7b 0a 20 20 20 20 2f 2a  f(!resp){.    /*
c6a0: 20 61 62 6f 75 74 20 74 68 65 20 6f 6e 6c 79 20   about the only 
c6b0: 65 72 72 6f 72 20 63 61 73 65 20 68 65 72 65 20  error case here 
c6c0: 69 73 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  is out-of-memory
c6d0: 2e 20 44 4f 20 4e 4f 54 0a 20 20 20 20 20 20 20  . DO NOT.       
c6e0: 63 61 6c 6c 20 66 6f 73 73 69 6c 5f 70 61 6e 69  call fossil_pani
c6f0: 63 28 29 20 68 65 72 65 20 62 65 63 61 75 73 65  c() here because
c700: 20 74 68 61 74 20 63 61 6c 6c 73 20 74 68 69 73   that calls this
c710: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a   function..    *
c720: 2f 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  /.    fprintf(st
c730: 64 65 72 72 2c 20 22 25 73 3a 20 46 61 74 61 6c  derr, "%s: Fatal
c740: 20 65 72 72 6f 72 3a 20 63 6f 75 6c 64 20 6e 6f   error: could no
c750: 74 20 61 6c 6c 6f 63 61 74 65 20 22 0a 20 20 20  t allocate ".   
c760: 20 20 20 20 20 20 20 20 20 22 72 65 73 70 6f 6e           "respon
c770: 73 65 20 6f 62 6a 65 63 74 2e 5c 6e 22 2c 20 66  se object.\n", f
c780: 6f 73 73 69 6c 5f 6e 61 6d 65 6f 66 65 78 65 28  ossil_nameofexe(
c790: 29 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 65  ));.    fossil_e
c7a0: 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 69 66  xit(1);.  }.  if
c7b0: 28 20 67 2e 69 73 48 54 54 50 20 29 7b 0a 20 20  ( g.isHTTP ){.  
c7c0: 20 20 69 66 28 61 6c 73 6f 4f 75 74 70 75 74 29    if(alsoOutput)
c7d0: 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 5f 73 65 6e  {.      json_sen
c7e0: 64 5f 72 65 73 70 6f 6e 73 65 28 72 65 73 70 29  d_response(resp)
c7f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c800: 20 20 20 2f 2a 20 61 6c 6d 6f 73 74 20 61 20 64     /* almost a d
c810: 75 70 6c 69 63 61 74 65 20 6f 66 20 6a 73 6f 6e  uplicate of json
c820: 5f 73 65 6e 64 5f 72 65 73 70 6f 6e 73 65 28 29  _send_response()
c830: 20 3a 28 20 2a 2f 0a 20 20 20 20 20 20 63 67 69   :( */.      cgi
c840: 5f 72 65 73 65 74 5f 63 6f 6e 74 65 6e 74 28 29  _reset_content()
c850: 3b 0a 20 20 20 20 20 20 69 66 28 20 67 2e 6a 73  ;.      if( g.js
c860: 6f 6e 2e 6a 73 6f 6e 70 20 29 7b 0a 20 20 20 20  on.jsonp ){.    
c870: 20 20 20 20 63 67 69 5f 70 72 69 6e 74 66 28 22      cgi_printf("
c880: 25 73 28 22 2c 67 2e 6a 73 6f 6e 2e 6a 73 6f 6e  %s(",g.json.json
c890: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
c8a0: 20 20 63 73 6f 6e 5f 6f 75 74 70 75 74 28 20 72    cson_output( r
c8b0: 65 73 70 2c 20 63 73 6f 6e 5f 64 61 74 61 5f 64  esp, cson_data_d
c8c0: 65 73 74 5f 63 67 69 2c 20 4e 55 4c 4c 2c 20 26  est_cgi, NULL, &
c8d0: 67 2e 6a 73 6f 6e 2e 6f 75 74 4f 70 74 20 29 3b  g.json.outOpt );
c8e0: 0a 20 20 20 20 20 20 69 66 28 20 67 2e 6a 73 6f  .      if( g.jso
c8f0: 6e 2e 6a 73 6f 6e 70 20 29 7b 0a 20 20 20 20 20  n.jsonp ){.     
c900: 20 20 20 63 67 69 5f 61 70 70 65 6e 64 5f 63 6f     cgi_append_co
c910: 6e 74 65 6e 74 28 22 29 22 2c 31 29 3b 0a 20 20  ntent(")",1);.  
c920: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
c930: 6c 73 65 7b 0a 20 20 20 20 6a 73 6f 6e 5f 73 65  lse{.    json_se
c940: 6e 64 5f 72 65 73 70 6f 6e 73 65 28 72 65 73 70  nd_response(resp
c950: 29 3b 0a 20 20 7d 0a 20 20 63 73 6f 6e 5f 76 61  );.  }.  cson_va
c960: 6c 75 65 5f 66 72 65 65 28 72 65 73 70 29 3b 0a  lue_free(resp);.
c970: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 73 20 67 2e  }../*.** Sets g.
c980: 6a 73 6f 6e 2e 72 65 73 75 6c 74 43 6f 64 65 20  json.resultCode 
c990: 61 6e 64 20 67 2e 7a 45 72 72 4d 73 67 2c 20 62  and g.zErrMsg, b
c9a0: 75 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 70 6f  ut does not repo
c9b0: 72 74 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  rt the error.** 
c9c0: 76 69 61 20 6a 73 6f 6e 5f 65 72 72 28 29 2e 20  via json_err(). 
c9d0: 52 65 74 75 72 6e 73 20 74 68 65 20 63 6f 64 65  Returns the code
c9e0: 20 70 61 73 73 65 64 20 74 6f 20 69 74 2e 0a 2a   passed to it..*
c9f0: 2a 0a 2a 2a 20 63 6f 64 65 20 6d 75 73 74 20 62  *.** code must b
ca00: 65 20 69 6e 20 74 68 65 20 69 6e 63 6c 75 73 69  e in the inclusi
ca10: 76 65 20 72 61 6e 67 65 20 31 30 30 30 2e 2e 39  ve range 1000..9
ca20: 39 39 39 2e 0a 2a 2f 0a 69 6e 74 20 6a 73 6f 6e  999..*/.int json
ca30: 5f 73 65 74 5f 65 72 72 28 20 69 6e 74 20 63 6f  _set_err( int co
ca40: 64 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  de, char const *
ca50: 20 66 6d 74 2c 20 2e 2e 2e 20 29 7b 0a 20 20 61   fmt, ... ){.  a
ca60: 73 73 65 72 74 28 20 28 63 6f 64 65 3e 3d 31 30  ssert( (code>=10
ca70: 30 30 29 20 26 26 20 28 63 6f 64 65 3c 3d 39 39  00) && (code<=99
ca80: 39 39 29 20 29 3b 0a 20 20 66 72 65 65 28 67 2e  99) );.  free(g.
ca90: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 67 2e 6a 73  zErrMsg);.  g.js
caa0: 6f 6e 2e 72 65 73 75 6c 74 43 6f 64 65 20 3d 20  on.resultCode = 
cab0: 63 6f 64 65 3b 0a 20 20 69 66 28 21 66 6d 74 20  code;.  if(!fmt 
cac0: 7c 7c 20 21 2a 66 6d 74 29 7b 0a 20 20 20 20 67  || !*fmt){.    g
cad0: 2e 7a 45 72 72 4d 73 67 20 3d 20 6d 70 72 69 6e  .zErrMsg = mprin
cae0: 74 66 28 22 25 73 22 2c 20 6a 73 6f 6e 5f 65 72  tf("%s", json_er
caf0: 72 5f 63 73 74 72 28 63 6f 64 65 29 29 3b 0a 20  r_cstr(code));. 
cb00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 61 5f 6c   }else{.    va_l
cb10: 69 73 74 20 76 61 72 67 73 3b 0a 20 20 20 20 76  ist vargs;.    v
cb20: 61 5f 73 74 61 72 74 28 76 61 72 67 73 2c 66 6d  a_start(vargs,fm
cb30: 74 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 20 6d  t);.    char * m
cb40: 73 67 20 3d 20 76 6d 70 72 69 6e 74 66 28 66 6d  sg = vmprintf(fm
cb50: 74 2c 20 76 61 72 67 73 29 3b 0a 20 20 20 20 76  t, vargs);.    v
cb60: 61 5f 65 6e 64 28 76 61 72 67 73 29 3b 0a 20 20  a_end(vargs);.  
cb70: 20 20 67 2e 7a 45 72 72 4d 73 67 20 3d 20 6d 73    g.zErrMsg = ms
cb80: 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
cb90: 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  code;.}../*.** I
cba0: 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68 20  terates through 
cbb0: 61 20 70 72 65 70 61 72 65 64 20 53 45 4c 45 43  a prepared SELEC
cbc0: 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  T statement and 
cbd0: 63 6f 6e 76 65 72 74 73 20 65 61 63 68 20 72 6f  converts each ro
cbe0: 77 0a 2a 2a 20 74 6f 20 61 20 4a 53 4f 4e 20 6f  w.** to a JSON o
cbf0: 62 6a 65 63 74 2e 20 49 66 20 70 54 67 74 20 69  bject. If pTgt i
cc00: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
cc10: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
cc20: 6c 6c 0a 2a 2a 20 61 70 70 65 6e 64 20 74 68 65  ll.** append the
cc30: 20 72 65 73 75 6c 74 73 20 74 6f 20 70 54 67 74   results to pTgt
cc40: 20 61 6e 64 20 72 65 74 75 72 6e 20 63 73 6f 6e   and return cson
cc50: 5f 61 72 72 61 79 5f 76 61 6c 75 65 28 70 54 67  _array_value(pTg
cc60: 74 29 2e 20 49 66 0a 2a 2a 20 70 54 67 74 20 69  t). If.** pTgt i
cc70: 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 6e 65  s NULL then a ne
cc80: 77 20 41 72 72 61 79 20 6f 62 6a 65 63 74 20 69  w Array object i
cc90: 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 72 65  s created and re
cca0: 74 75 72 6e 65 64 20 28 6f 77 6e 65 64 0a 2a 2a  turned (owned.**
ccb0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 29 2e   by the caller).
ccc0: 20 45 61 63 68 20 72 6f 77 20 6f 66 20 70 53 74   Each row of pSt
ccd0: 6d 74 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20  mt is converted 
cce0: 74 6f 20 61 6e 20 4f 62 6a 65 63 74 20 61 6e 64  to an Object and
ccf0: 0a 2a 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20  .** appended to 
cd00: 74 68 65 20 61 72 72 61 79 2e 20 49 66 20 74 68  the array. If th
cd10: 65 20 72 65 73 75 6c 74 20 73 65 74 20 68 61 73  e result set has
cd20: 20 6e 6f 20 72 6f 77 73 20 41 4e 44 20 70 54 67   no rows AND pTg
cd30: 74 20 69 73 0a 2a 2a 20 4e 55 4c 4c 20 74 68 65  t is.** NULL the
cd40: 6e 20 4e 55 4c 4c 20 28 6e 6f 74 20 61 6e 20 65  n NULL (not an e
cd50: 6d 70 74 79 20 61 72 72 61 79 29 20 69 73 20 72  mpty array) is r
cd60: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 73 6f 6e  eturned..*/.cson
cd70: 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 73 74  _value * json_st
cd80: 6d 74 5f 74 6f 5f 61 72 72 61 79 5f 6f 66 5f 6f  mt_to_array_of_o
cd90: 62 6a 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 0a  bj(Stmt *pStmt,.
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 20 20 20 20 20 20                  
cdc0: 20 20 20 20 20 20 20 63 73 6f 6e 5f 61 72 72 61         cson_arra
cdd0: 79 20 2a 20 70 54 67 74 29 7b 0a 20 20 63 73 6f  y * pTgt){.  cso
cde0: 6e 5f 61 72 72 61 79 20 2a 20 61 20 3d 20 70 54  n_array * a = pT
cdf0: 67 74 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  gt;.  char const
ce00: 20 2a 20 77 61 72 6e 4d 73 67 20 3d 20 4e 55 4c   * warnMsg = NUL
ce10: 4c 3b 0a 20 20 63 73 6f 6e 5f 76 61 6c 75 65 20  L;.  cson_value 
ce20: 2a 20 63 6f 6c 4e 61 6d 65 73 56 20 3d 20 4e 55  * colNamesV = NU
ce30: 4c 4c 3b 0a 20 20 63 73 6f 6e 5f 61 72 72 61 79  LL;.  cson_array
ce40: 20 2a 20 63 6f 6c 4e 61 6d 65 73 20 3d 20 4e 55   * colNames = NU
ce50: 4c 4c 3b 0a 20 20 77 68 69 6c 65 28 20 28 53 51  LL;.  while( (SQ
ce60: 4c 49 54 45 5f 52 4f 57 3d 3d 64 62 5f 73 74 65  LITE_ROW==db_ste
ce70: 70 28 70 53 74 6d 74 29 29 20 29 7b 0a 20 20 20  p(pStmt)) ){.   
ce80: 20 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 72 6f   cson_value * ro
ce90: 77 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66  w = NULL;.    if
cea0: 28 21 61 29 7b 0a 20 20 20 20 20 20 61 20 3d 20  (!a){.      a = 
ceb0: 63 73 6f 6e 5f 6e 65 77 5f 61 72 72 61 79 28 29  cson_new_array()
cec0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 4e  ;.      assert(N
ced0: 55 4c 4c 21 3d 61 29 3b 0a 20 20 20 20 7d 0a 20  ULL!=a);.    }. 
cee0: 20 20 20 69 66 28 21 63 6f 6c 4e 61 6d 65 73 29     if(!colNames)
cef0: 7b 0a 20 20 20 20 20 20 63 6f 6c 4e 61 6d 65 73  {.      colNames
cf00: 56 20 3d 20 63 73 6f 6e 5f 73 71 6c 69 74 65 33  V = cson_sqlite3
cf10: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 28 70 53  _column_names(pS
cf20: 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  tmt->pStmt);.   
cf30: 20 20 20 61 73 73 65 72 74 28 4e 55 4c 4c 20 21     assert(NULL !
cf40: 3d 20 63 6f 6c 4e 61 6d 65 73 56 29 3b 0a 20 20  = colNamesV);.  
cf50: 20 20 20 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 61      cson_value_a
cf60: 64 64 5f 72 65 66 65 72 65 6e 63 65 28 63 6f 6c  dd_reference(col
cf70: 4e 61 6d 65 73 56 29 2f 2a 61 76 6f 69 64 73 20  NamesV)/*avoids 
cf80: 61 6e 20 6f 77 6e 65 72 73 68 69 70 20 70 72 6f  an ownership pro
cf90: 62 6c 65 6d 2a 2f 3b 0a 20 20 20 20 20 20 63 6f  blem*/;.      co
cfa0: 6c 4e 61 6d 65 73 20 3d 20 63 73 6f 6e 5f 76 61  lNames = cson_va
cfb0: 6c 75 65 5f 67 65 74 5f 61 72 72 61 79 28 63 6f  lue_get_array(co
cfc0: 6c 4e 61 6d 65 73 56 29 3b 0a 20 20 20 20 20 20  lNamesV);.      
cfd0: 61 73 73 65 72 74 28 4e 55 4c 4c 20 21 3d 20 63  assert(NULL != c
cfe0: 6f 6c 4e 61 6d 65 73 29 3b 0a 20 20 20 20 7d 20  olNames);.    } 
cff0: 20 20 20 20 20 0a 20 20 20 20 72 6f 77 20 3d 20       .    row = 
d000: 63 73 6f 6e 5f 73 71 6c 69 74 65 33 5f 72 6f 77  cson_sqlite3_row
d010: 5f 74 6f 5f 6f 62 6a 65 63 74 32 28 70 53 74 6d  _to_object2(pStm
d020: 74 2d 3e 70 53 74 6d 74 2c 20 63 6f 6c 4e 61 6d  t->pStmt, colNam
d030: 65 73 29 3b 0a 20 20 20 20 69 66 28 21 72 6f 77  es);.    if(!row
d040: 20 26 26 20 21 77 61 72 6e 4d 73 67 29 7b 0a 20   && !warnMsg){. 
d050: 20 20 20 20 20 77 61 72 6e 4d 73 67 20 3d 20 22       warnMsg = "
d060: 43 6f 75 6c 64 20 6e 6f 74 20 63 6f 6e 76 65 72  Could not conver
d070: 74 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72  t at least one r
d080: 65 73 75 6c 74 20 72 6f 77 20 74 6f 20 4a 53 4f  esult row to JSO
d090: 4e 2e 22 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  N.";.      conti
d0a0: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
d0b0: 66 28 20 30 20 21 3d 20 63 73 6f 6e 5f 61 72 72  f( 0 != cson_arr
d0c0: 61 79 5f 61 70 70 65 6e 64 28 61 2c 20 72 6f 77  ay_append(a, row
d0d0: 29 20 29 7b 0a 20 20 20 20 20 20 63 73 6f 6e 5f  ) ){.      cson_
d0e0: 76 61 6c 75 65 5f 66 72 65 65 28 72 6f 77 29 3b  value_free(row);
d0f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
d100: 20 26 26 20 22 41 6c 6c 6f 63 20 65 72 72 6f 72   && "Alloc error
d110: 2e 22 29 3b 0a 20 20 20 20 20 20 69 66 28 70 54  .");.      if(pT
d120: 67 74 20 21 3d 20 61 29 20 7b 0a 20 20 20 20 20  gt != a) {.     
d130: 20 20 20 63 73 6f 6e 5f 66 72 65 65 5f 61 72 72     cson_free_arr
d140: 61 79 28 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ay(a);.      }. 
d150: 20 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c       return NULL
d160: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 73  ;.    }.  }.  cs
d170: 6f 6e 5f 76 61 6c 75 65 5f 66 72 65 65 28 63 6f  on_value_free(co
d180: 6c 4e 61 6d 65 73 56 29 3b 0a 20 20 69 66 28 77  lNamesV);.  if(w
d190: 61 72 6e 4d 73 67 29 7b 0a 20 20 20 20 6a 73 6f  arnMsg){.    jso
d1a0: 6e 5f 77 61 72 6e 28 20 46 53 4c 5f 4a 53 4f 4e  n_warn( FSL_JSON
d1b0: 5f 57 5f 52 4f 57 5f 54 4f 5f 4a 53 4f 4e 5f 46  _W_ROW_TO_JSON_F
d1c0: 41 49 4c 45 44 2c 20 77 61 72 6e 4d 73 67 20 29  AILED, warnMsg )
d1d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
d1e0: 73 6f 6e 5f 61 72 72 61 79 5f 76 61 6c 75 65 28  son_array_value(
d1f0: 61 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  a);  .}../*.** W
d200: 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 6a  orks just like j
d210: 73 6f 6e 5f 73 74 6d 74 5f 74 6f 5f 61 72 72 61  son_stmt_to_arra
d220: 79 5f 6f 66 5f 6f 62 6a 28 29 2c 20 62 75 74 20  y_of_obj(), but 
d230: 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 0a  each row in the.
d240: 2a 2a 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  ** result set is
d250: 20 72 65 70 72 65 73 65 6e 74 65 64 20 61 73 20   represented as 
d260: 61 6e 20 41 72 72 61 79 20 6f 66 20 76 61 6c 75  an Array of valu
d270: 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e  es instead of an
d280: 0a 2a 2a 20 4f 62 6a 65 63 74 20 28 6b 65 79 2f  .** Object (key/
d290: 76 61 6c 75 65 20 70 61 69 72 73 29 2e 20 49 66  value pairs). If
d2a0: 20 70 54 67 74 20 69 73 20 4e 55 4c 4c 20 61 6e   pTgt is NULL an
d2b0: 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  d the statement.
d2c0: 2a 2a 20 68 61 73 20 6e 6f 20 72 65 73 75 6c 74  ** has no result
d2d0: 73 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 72  s then NULL is r
d2e0: 65 74 75 72 6e 65 64 2c 20 6e 6f 74 20 61 6e 20  eturned, not an 
d2f0: 65 6d 70 74 79 20 61 72 72 61 79 2e 0a 2a 2f 0a  empty array..*/.
d300: 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f  cson_value * jso
d310: 6e 5f 73 74 6d 74 5f 74 6f 5f 61 72 72 61 79 5f  n_stmt_to_array_
d320: 6f 66 5f 61 72 72 61 79 28 53 74 6d 74 20 2a 70  of_array(Stmt *p
d330: 53 74 6d 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Stmt,.          
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
d360: 73 6f 6e 5f 61 72 72 61 79 20 2a 20 70 54 67 74  son_array * pTgt
d370: 29 7b 0a 20 20 63 73 6f 6e 5f 61 72 72 61 79 20  ){.  cson_array 
d380: 2a 20 61 20 3d 20 70 54 67 74 3b 0a 20 20 77 68  * a = pTgt;.  wh
d390: 69 6c 65 28 20 28 53 51 4c 49 54 45 5f 52 4f 57  ile( (SQLITE_ROW
d3a0: 3d 3d 64 62 5f 73 74 65 70 28 70 53 74 6d 74 29  ==db_step(pStmt)
d3b0: 29 20 29 7b 0a 20 20 20 20 63 73 6f 6e 5f 76 61  ) ){.    cson_va
d3c0: 6c 75 65 20 2a 20 72 6f 77 20 3d 20 4e 55 4c 4c  lue * row = NULL
d3d0: 3b 0a 20 20 20 20 69 66 28 21 61 29 7b 0a 20 20  ;.    if(!a){.  
d3e0: 20 20 20 20 61 20 3d 20 63 73 6f 6e 5f 6e 65 77      a = cson_new
d3f0: 5f 61 72 72 61 79 28 29 3b 0a 20 20 20 20 20 20  _array();.      
d400: 61 73 73 65 72 74 28 4e 55 4c 4c 21 3d 61 29 3b  assert(NULL!=a);
d410: 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f 77 20 3d  .    }.    row =
d420: 20 63 73 6f 6e 5f 73 71 6c 69 74 65 33 5f 72 6f   cson_sqlite3_ro
d430: 77 5f 74 6f 5f 61 72 72 61 79 28 70 53 74 6d 74  w_to_array(pStmt
d440: 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 63 73  ->pStmt);.    cs
d450: 6f 6e 5f 61 72 72 61 79 5f 61 70 70 65 6e 64 28  on_array_append(
d460: 61 2c 20 72 6f 77 29 3b 0a 20 20 7d 0a 20 20 72  a, row);.  }.  r
d470: 65 74 75 72 6e 20 63 73 6f 6e 5f 61 72 72 61 79  eturn cson_array
d480: 5f 76 61 6c 75 65 28 61 29 3b 0a 7d 0a 0a 63 73  _value(a);.}..cs
d490: 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f  on_value * json_
d4a0: 73 74 6d 74 5f 74 6f 5f 61 72 72 61 79 5f 6f 66  stmt_to_array_of
d4b0: 5f 76 61 6c 75 65 73 28 53 74 6d 74 20 2a 70 53  _values(Stmt *pS
d4c0: 74 6d 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tmt,.           
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
d4f0: 6e 74 20 72 65 73 75 6c 74 43 6f 6c 75 6d 6e 2c  nt resultColumn,
d500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d520: 20 20 20 20 20 20 20 20 20 20 20 63 73 6f 6e 5f             cson_
d530: 61 72 72 61 79 20 2a 20 70 54 67 74 29 7b 0a 20  array * pTgt){. 
d540: 20 63 73 6f 6e 5f 61 72 72 61 79 20 2a 20 61 20   cson_array * a 
d550: 3d 20 70 54 67 74 3b 0a 20 20 77 68 69 6c 65 28  = pTgt;.  while(
d560: 20 28 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 64 62   (SQLITE_ROW==db
d570: 5f 73 74 65 70 28 70 53 74 6d 74 29 29 20 29 7b  _step(pStmt)) ){
d580: 0a 20 20 20 20 63 73 6f 6e 5f 76 61 6c 75 65 20  .    cson_value 
d590: 2a 20 72 6f 77 20 3d 20 63 73 6f 6e 5f 73 71 6c  * row = cson_sql
d5a0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 6f 5f 76  ite3_column_to_v
d5b0: 61 6c 75 65 28 70 53 74 6d 74 2d 3e 70 53 74 6d  alue(pStmt->pStm
d5c0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 20 20 20 20 20 20 72 65 73 75 6c 74 43 6f 6c         resultCol
d600: 75 6d 6e 29 3b 0a 20 20 20 20 69 66 28 72 6f 77  umn);.    if(row
d610: 29 7b 0a 20 20 20 20 20 20 69 66 28 21 61 29 7b  ){.      if(!a){
d620: 0a 20 20 20 20 20 20 20 20 61 20 3d 20 63 73 6f  .        a = cso
d630: 6e 5f 6e 65 77 5f 61 72 72 61 79 28 29 3b 0a 20  n_new_array();. 
d640: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 4e 55         assert(NU
d650: 4c 4c 21 3d 61 29 3b 0a 20 20 20 20 20 20 7d 0a  LL!=a);.      }.
d660: 20 20 20 20 20 20 63 73 6f 6e 5f 61 72 72 61 79        cson_array
d670: 5f 61 70 70 65 6e 64 28 61 2c 20 72 6f 77 29 3b  _append(a, row);
d680: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
d690: 75 72 6e 20 63 73 6f 6e 5f 61 72 72 61 79 5f 76  urn cson_array_v
d6a0: 61 6c 75 65 28 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  alue(a);.}../*.*
d6b0: 2a 20 45 78 65 63 75 74 65 73 20 74 68 65 20 67  * Executes the g
d6c0: 69 76 65 6e 20 53 51 4c 20 61 6e 64 20 72 75 6e  iven SQL and run
d6d0: 73 20 69 74 20 74 68 72 6f 75 67 68 0a 2a 2a 20  s it through.** 
d6e0: 6a 73 6f 6e 5f 73 74 6d 74 5f 74 6f 5f 61 72 72  json_stmt_to_arr
d6f0: 61 79 5f 6f 66 5f 6f 62 6a 28 29 2c 20 72 65 74  ay_of_obj(), ret
d700: 75 72 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  urning the resul
d710: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 75 6e  t of that.** fun
d720: 63 74 69 6f 6e 2e 20 49 66 20 72 65 73 65 74 42  ction. If resetB
d730: 6c 6f 62 20 69 73 20 74 72 75 65 20 74 68 65 6e  lob is true then
d740: 20 62 6c 6f 62 5f 72 65 73 65 74 28 70 53 71 6c   blob_reset(pSql
d750: 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61  ) is called.** a
d760: 66 74 65 72 20 70 72 65 70 61 72 69 6e 67 20 74  fter preparing t
d770: 68 65 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  he query..**.** 
d780: 70 54 67 74 20 68 61 73 20 74 68 65 20 73 61 6d  pTgt has the sam
d790: 65 20 73 65 6d 61 6e 74 69 63 73 20 61 73 20 64  e semantics as d
d7a0: 65 73 63 72 69 62 65 64 20 66 6f 72 0a 2a 2a 20  escribed for.** 
d7b0: 6a 73 6f 6e 5f 73 74 6d 74 5f 74 6f 5f 61 72 72  json_stmt_to_arr
d7c0: 61 79 5f 6f 66 5f 6f 62 6a 28 29 2e 0a 2a 2a 0a  ay_of_obj()..**.
d7d0: 2a 2a 20 46 49 58 4d 45 3a 20 63 68 61 6e 67 65  ** FIXME: change
d7e0: 20 74 68 69 73 20 74 6f 20 74 61 6b 65 20 61 20   this to take a 
d7f0: 28 63 68 61 72 20 63 6f 6e 73 74 20 2a 29 20 69  (char const *) i
d800: 6e 73 74 65 61 64 20 6f 66 20 61 20 62 6c 6f 62  nstead of a blob
d810: 2c 0a 2a 2a 20 74 6f 20 73 69 6d 70 6c 69 66 79  ,.** to simplify
d820: 20 74 68 65 20 74 72 69 76 69 61 6c 20 75 73 65   the trivial use
d830: 2d 63 61 73 65 73 20 28 77 68 69 63 68 20 64 6f  -cases (which do
d840: 6e 27 74 20 6e 65 65 64 20 61 20 42 6c 6f 62 29  n't need a Blob)
d850: 2e 0a 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65 20  ..*/.cson_value 
d860: 2a 20 6a 73 6f 6e 5f 73 71 6c 5f 74 6f 5f 61 72  * json_sql_to_ar
d870: 72 61 79 5f 6f 66 5f 6f 62 6a 28 42 6c 6f 62 20  ray_of_obj(Blob 
d880: 2a 20 70 53 71 6c 2c 20 63 73 6f 6e 5f 61 72 72  * pSql, cson_arr
d890: 61 79 20 2a 20 70 54 67 74 2c 0a 20 20 20 20 20  ay * pTgt,.     
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8c0: 20 63 68 61 72 20 72 65 73 65 74 42 6c 6f 62 29   char resetBlob)
d8d0: 7b 0a 20 20 53 74 6d 74 20 71 20 3d 20 65 6d 70  {.  Stmt q = emp
d8e0: 74 79 5f 53 74 6d 74 3b 0a 20 20 63 73 6f 6e 5f  ty_Stmt;.  cson_
d8f0: 76 61 6c 75 65 20 2a 20 70 61 79 20 3d 20 4e 55  value * pay = NU
d900: 4c 4c 3b 0a 20 20 61 73 73 65 72 74 28 20 62 6c  LL;.  assert( bl
d910: 6f 62 5f 73 69 7a 65 28 70 53 71 6c 29 20 3e 20  ob_size(pSql) > 
d920: 30 20 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72  0 );.  db_prepar
d930: 65 28 26 71 2c 20 22 25 73 22 2c 20 62 6c 6f 62  e(&q, "%s", blob
d940: 5f 73 74 72 28 70 53 71 6c 29 29 3b 0a 20 20 69  _str(pSql));.  i
d950: 66 28 72 65 73 65 74 42 6c 6f 62 29 7b 0a 20 20  f(resetBlob){.  
d960: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 70 53 71    blob_reset(pSq
d970: 6c 29 3b 0a 20 20 7d 0a 20 20 70 61 79 20 3d 20  l);.  }.  pay = 
d980: 6a 73 6f 6e 5f 73 74 6d 74 5f 74 6f 5f 61 72 72  json_stmt_to_arr
d990: 61 79 5f 6f 66 5f 6f 62 6a 28 26 71 2c 20 70 54  ay_of_obj(&q, pT
d9a0: 67 74 29 3b 0a 20 20 64 62 5f 66 69 6e 61 6c 69  gt);.  db_finali
d9b0: 7a 65 28 26 71 29 3b 0a 20 20 72 65 74 75 72 6e  ze(&q);.  return
d9c0: 20 70 61 79 3b 0a 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pay;..}../*.** 
d9d0: 49 66 20 74 68 65 20 67 69 76 65 6e 20 43 4f 4d  If the given COM
d9e0: 4d 49 54 20 72 69 64 20 68 61 73 20 61 6e 79 20  MIT rid has any 
d9f0: 74 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20  tags associated 
da00: 77 69 74 68 20 69 74 2c 20 74 68 69 73 0a 2a 2a  with it, this.**
da10: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
da20: 73 20 61 20 4a 53 4f 4e 20 41 72 72 61 79 20 63  s a JSON Array c
da30: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
da40: 67 20 6e 61 6d 65 73 20 28 6f 77 6e 65 64 20 62  g names (owned b
da50: 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 29  y.** the caller)
da60: 2c 20 65 6c 73 65 20 69 74 20 72 65 74 75 72 6e  , else it return
da70: 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  s NULL..**.** Se
da80: 65 20 69 6e 66 6f 5f 74 61 67 73 5f 6f 66 5f 63  e info_tags_of_c
da90: 68 65 63 6b 69 6e 28 29 20 66 6f 72 20 6d 6f 72  heckin() for mor
daa0: 65 20 64 65 74 61 69 6c 73 20 28 74 68 69 73 20  e details (this 
dab0: 69 73 20 73 69 6d 70 6c 79 20 61 20 4a 53 4f 4e  is simply a JSON
dac0: 0a 2a 2a 20 77 72 61 70 70 65 72 20 66 6f 72 20  .** wrapper for 
dad0: 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 29 2e 0a  that function)..
dae0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
daf0: 72 65 20 6e 6f 20 74 61 67 73 20 74 68 65 6e 20  re no tags then 
db00: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
db10: 74 75 72 6e 73 20 4e 55 4c 4c 2c 20 6e 6f 74 20  turns NULL, not 
db20: 61 6e 20 65 6d 70 74 79 0a 2a 2a 20 41 72 72 61  an empty.** Arra
db30: 79 2e 0a 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65  y..*/.cson_value
db40: 20 2a 20 6a 73 6f 6e 5f 74 61 67 73 5f 66 6f 72   * json_tags_for
db50: 5f 63 68 65 63 6b 69 6e 5f 72 69 64 28 69 6e 74  _checkin_rid(int
db60: 20 72 69 64 2c 20 63 68 61 72 20 70 72 6f 70 61   rid, char propa
db70: 67 61 74 69 6e 67 4f 6e 6c 79 29 7b 0a 20 20 63  gatingOnly){.  c
db80: 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 76 20 3d 20  son_value * v = 
db90: 4e 55 4c 4c 3b 0a 20 20 63 68 61 72 20 2a 20 74  NULL;.  char * t
dba0: 61 67 73 20 3d 20 69 6e 66 6f 5f 74 61 67 73 5f  ags = info_tags_
dbb0: 6f 66 5f 63 68 65 63 6b 69 6e 28 72 69 64 2c 20  of_checkin(rid, 
dbc0: 70 72 6f 70 61 67 61 74 69 6e 67 4f 6e 6c 79 29  propagatingOnly)
dbd0: 3b 0a 20 20 69 66 28 74 61 67 73 29 7b 0a 20 20  ;.  if(tags){.  
dbe0: 20 20 69 66 28 2a 74 61 67 73 29 7b 0a 20 20 20    if(*tags){.   
dbf0: 20 20 20 76 20 3d 20 6a 73 6f 6e 5f 73 74 72 69     v = json_stri
dc00: 6e 67 5f 73 70 6c 69 74 32 28 74 61 67 73 2c 27  ng_split2(tags,'
dc10: 2c 27 2c 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ,',0);.    }.   
dc20: 20 66 72 65 65 28 74 61 67 73 29 3b 0a 20 20 7d   free(tags);.  }
dc30: 0a 20 20 72 65 74 75 72 6e 20 76 3b 20 20 0a 7d  .  return v;  .}
dc40: 0a 0a 2f 2a 0a 20 2a 2a 20 52 65 74 75 72 6e 73  ../*. ** Returns
dc50: 20 61 20 22 6e 65 77 22 20 76 61 6c 75 65 20 72   a "new" value r
dc60: 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
dc70: 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 6f 66  boolean value of
dc80: 20 7a 56 61 6c 0a 20 2a 2a 20 28 66 61 6c 73 65   zVal. ** (false
dc90: 20 69 66 20 7a 56 61 6c 20 69 73 20 4e 55 4c 4c   if zVal is NULL
dca0: 29 2e 20 4e 6f 74 65 20 74 68 61 74 20 63 73 6f  ). Note that cso
dcb0: 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c 6c  n does not reall
dcc0: 79 20 61 6c 6c 6f 63 61 74 65 0a 20 2a 2a 20 61  y allocate. ** a
dcd0: 6e 79 20 6d 65 6d 6f 72 79 20 66 6f 72 20 62 6f  ny memory for bo
dce0: 6f 6c 65 61 6e 20 76 61 6c 75 65 73 2c 20 62 75  olean values, bu
dcf0: 74 20 74 68 65 79 20 22 73 68 6f 75 6c 64 22 20  t they "should" 
dd00: 28 66 6f 72 20 72 65 61 73 6f 6e 73 20 6f 66 0a  (for reasons of.
dd10: 20 2a 2a 20 73 74 79 6c 65 20 61 6e 64 20 70 68   ** style and ph
dd20: 69 6c 6f 73 6f 70 68 79 29 20 62 65 20 63 6c 65  ilosophy) be cle
dd30: 61 6e 65 64 20 75 70 20 6c 69 6b 65 20 61 6e 79  aned up like any
dd40: 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 28 62   other values (b
dd50: 75 74 0a 20 2a 2a 20 69 74 27 73 20 61 20 6e 6f  ut. ** it's a no
dd60: 2d 6f 70 20 66 6f 72 20 62 6f 6f 6c 73 29 2e 0a  -op for bools)..
dd70: 20 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65 20 2a   */.cson_value *
dd80: 20 6a 73 6f 6e 5f 76 61 6c 75 65 5f 74 6f 5f 62   json_value_to_b
dd90: 6f 6f 6c 28 63 73 6f 6e 5f 76 61 6c 75 65 20 63  ool(cson_value c
dda0: 6f 6e 73 74 20 2a 20 7a 56 61 6c 29 7b 0a 20 20  onst * zVal){.  
ddb0: 72 65 74 75 72 6e 20 63 73 6f 6e 5f 76 61 6c 75  return cson_valu
ddc0: 65 5f 67 65 74 5f 62 6f 6f 6c 28 7a 56 61 6c 29  e_get_bool(zVal)
ddd0: 0a 20 20 20 20 3f 20 63 73 6f 6e 5f 76 61 6c 75  .    ? cson_valu
dde0: 65 5f 74 72 75 65 28 29 0a 20 20 20 20 3a 20 63  e_true().    : c
ddf0: 73 6f 6e 5f 76 61 6c 75 65 5f 66 61 6c 73 65 28  son_value_false(
de00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
de10: 20 6f 66 20 2f 6a 73 6f 6e 2f 72 65 73 75 6c 74   of /json/result
de20: 43 6f 64 65 73 0a 2a 2a 0a 2a 2f 0a 63 73 6f 6e  Codes.**.*/.cson
de30: 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 70 61  _value * json_pa
de40: 67 65 5f 72 65 73 75 6c 74 43 6f 64 65 73 28 29  ge_resultCodes()
de50: 7b 0a 20 20 20 20 63 73 6f 6e 5f 76 61 6c 75 65  {.    cson_value
de60: 20 2a 20 6c 69 73 74 56 20 3d 20 63 73 6f 6e 5f   * listV = cson_
de70: 76 61 6c 75 65 5f 6e 65 77 5f 61 72 72 61 79 28  value_new_array(
de80: 29 3b 0a 20 20 20 20 63 73 6f 6e 5f 61 72 72 61  );.    cson_arra
de90: 79 20 2a 20 6c 69 73 74 20 3d 20 63 73 6f 6e 5f  y * list = cson_
dea0: 76 61 6c 75 65 5f 67 65 74 5f 61 72 72 61 79 28  value_get_array(
deb0: 6c 69 73 74 56 29 3b 0a 20 20 20 20 63 73 6f 6e  listV);.    cson
dec0: 5f 76 61 6c 75 65 20 2a 20 6f 62 6a 56 20 3d 20  _value * objV = 
ded0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 73 6f 6e 5f 6f  NULL;.    cson_o
dee0: 62 6a 65 63 74 20 2a 20 6f 62 6a 20 3d 20 4e 55  bject * obj = NU
def0: 4c 4c 3b 0a 20 20 20 20 63 73 6f 6e 5f 73 74 72  LL;.    cson_str
df00: 69 6e 67 20 2a 20 6b 52 43 3b 0a 20 20 20 20 63  ing * kRC;.    c
df10: 73 6f 6e 5f 73 74 72 69 6e 67 20 2a 20 6b 53 79  son_string * kSy
df20: 6d 62 6f 6c 3b 0a 20 20 20 20 63 73 6f 6e 5f 73  mbol;.    cson_s
df30: 74 72 69 6e 67 20 2a 20 6b 4e 75 6d 62 65 72 3b  tring * kNumber;
df40: 0a 20 20 20 20 63 73 6f 6e 5f 73 74 72 69 6e 67  .    cson_string
df50: 20 2a 20 6b 44 65 73 63 3b 0a 20 20 20 20 63 73   * kDesc;.    cs
df60: 6f 6e 5f 61 72 72 61 79 5f 72 65 73 65 72 76 65  on_array_reserve
df70: 28 20 6c 69 73 74 2c 20 33 35 20 29 3b 0a 20 20  ( list, 35 );.  
df80: 20 20 6b 52 43 20 3d 20 63 73 6f 6e 5f 6e 65 77    kRC = cson_new
df90: 5f 73 74 72 69 6e 67 28 22 72 65 73 75 6c 74 43  _string("resultC
dfa0: 6f 64 65 22 2c 31 30 29 3b 0a 20 20 20 20 6b 53  ode",10);.    kS
dfb0: 79 6d 62 6f 6c 20 3d 20 63 73 6f 6e 5f 6e 65 77  ymbol = cson_new
dfc0: 5f 73 74 72 69 6e 67 28 22 63 53 79 6d 62 6f 6c  _string("cSymbol
dfd0: 22 2c 37 29 3b 0a 20 20 20 20 6b 4e 75 6d 62 65  ",7);.    kNumbe
dfe0: 72 20 3d 20 63 73 6f 6e 5f 6e 65 77 5f 73 74 72  r = cson_new_str
dff0: 69 6e 67 28 22 6e 75 6d 62 65 72 22 2c 36 29 3b  ing("number",6);
e000: 0a 20 20 20 20 6b 44 65 73 63 20 3d 20 63 73 6f  .    kDesc = cso
e010: 6e 5f 6e 65 77 5f 73 74 72 69 6e 67 28 22 64 65  n_new_string("de
e020: 73 63 72 69 70 74 69 6f 6e 22 2c 31 31 29 3b 0a  scription",11);.
e030: 23 64 65 66 69 6e 65 20 43 28 4b 29 20 6f 62 6a  #define C(K) obj
e040: 56 20 3d 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e  V = cson_value_n
e050: 65 77 5f 6f 62 6a 65 63 74 28 29 3b 20 6f 62 6a  ew_object(); obj
e060: 20 3d 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 67 65   = cson_value_ge
e070: 74 5f 6f 62 6a 65 63 74 28 6f 62 6a 56 29 3b 20  t_object(objV); 
e080: 5c 0a 20 20 20 20 63 73 6f 6e 5f 6f 62 6a 65 63  \.    cson_objec
e090: 74 5f 73 65 74 5f 73 28 6f 62 6a 2c 20 6b 52 43  t_set_s(obj, kRC
e0a0: 2c 20 6a 73 6f 6e 5f 6e 65 77 5f 73 74 72 69 6e  , json_new_strin
e0b0: 67 28 6a 73 6f 6e 5f 72 63 5f 63 73 74 72 28 46  g(json_rc_cstr(F
e0c0: 53 4c 5f 4a 53 4f 4e 5f 45 5f 23 23 4b 29 29 20  SL_JSON_E_##K)) 
e0d0: 29 3b 20 5c 0a 20 20 20 20 63 73 6f 6e 5f 6f 62  ); \.    cson_ob
e0e0: 6a 65 63 74 5f 73 65 74 5f 73 28 6f 62 6a 2c 20  ject_set_s(obj, 
e0f0: 6b 53 79 6d 62 6f 6c 2c 20 6a 73 6f 6e 5f 6e 65  kSymbol, json_ne
e100: 77 5f 73 74 72 69 6e 67 28 22 46 53 4c 5f 4a 53  w_string("FSL_JS
e110: 4f 4e 5f 45 5f 22 23 4b 29 20 29 3b 20 20 20 20  ON_E_"#K) );    
e120: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 63           \.    c
e130: 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 5f 73  son_object_set_s
e140: 28 6f 62 6a 2c 20 6b 4e 75 6d 62 65 72 2c 20 63  (obj, kNumber, c
e150: 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 69 6e  son_value_new_in
e160: 74 65 67 65 72 28 46 53 4c 5f 4a 53 4f 4e 5f 45  teger(FSL_JSON_E
e170: 5f 23 23 4b 29 20 29 3b 20 20 20 20 20 20 20 20  _##K) );        
e180: 5c 0a 20 20 20 20 63 73 6f 6e 5f 6f 62 6a 65 63  \.    cson_objec
e190: 74 5f 73 65 74 5f 73 28 6f 62 6a 2c 20 6b 44 65  t_set_s(obj, kDe
e1a0: 73 63 2c 20 6a 73 6f 6e 5f 6e 65 77 5f 73 74 72  sc, json_new_str
e1b0: 69 6e 67 28 6a 73 6f 6e 5f 65 72 72 5f 63 73 74  ing(json_err_cst
e1c0: 72 28 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 23 23 4b  r(FSL_JSON_E_##K
e1d0: 29 29 29 3b 20 5c 0a 20 20 20 20 63 73 6f 6e 5f  ))); \.    cson_
e1e0: 61 72 72 61 79 5f 61 70 70 65 6e 64 28 20 6c 69  array_append( li
e1f0: 73 74 2c 20 6f 62 6a 56 20 29 3b 20 6f 62 6a 20  st, objV ); obj 
e200: 3d 20 4e 55 4c 4c 3b 20 6f 62 6a 56 20 3d 20 4e  = NULL; objV = N
e210: 55 4c 4c 0a 0a 20 20 20 20 43 28 47 45 4e 45 52  ULL..    C(GENER
e220: 49 43 29 3b 0a 20 20 20 20 43 28 49 4e 56 41 4c  IC);.    C(INVAL
e230: 49 44 5f 52 45 51 55 45 53 54 29 3b 0a 20 20 20  ID_REQUEST);.   
e240: 20 43 28 55 4e 4b 4e 4f 57 4e 5f 43 4f 4d 4d 41   C(UNKNOWN_COMMA
e250: 4e 44 29 3b 0a 20 20 20 20 43 28 55 4e 4b 4e 4f  ND);.    C(UNKNO
e260: 57 4e 29 3b 0a 20 20 20 20 43 28 54 49 4d 45 4f  WN);.    C(TIMEO
e270: 55 54 29 3b 0a 20 20 20 20 43 28 41 53 53 45 52  UT);.    C(ASSER
e280: 54 29 3b 0a 20 20 20 20 43 28 41 4c 4c 4f 43 29  T);.    C(ALLOC)
e290: 3b 0a 20 20 20 20 43 28 4e 59 49 29 3b 0a 20 20  ;.    C(NYI);.  
e2a0: 20 20 43 28 50 41 4e 49 43 29 3b 0a 20 20 20 20    C(PANIC);.    
e2b0: 43 28 4d 41 4e 49 46 45 53 54 5f 52 45 41 44 5f  C(MANIFEST_READ_
e2c0: 46 41 49 4c 45 44 29 3b 0a 20 20 20 20 43 28 46  FAILED);.    C(F
e2d0: 49 4c 45 5f 4f 50 45 4e 5f 46 41 49 4c 45 44 29  ILE_OPEN_FAILED)
e2e0: 3b 0a 20 20 20 20 0a 20 20 20 20 43 28 41 55 54  ;.    .    C(AUT
e2f0: 48 29 3b 0a 20 20 20 20 43 28 4d 49 53 53 49 4e  H);.    C(MISSIN
e300: 47 5f 41 55 54 48 29 3b 0a 20 20 20 20 43 28 44  G_AUTH);.    C(D
e310: 45 4e 49 45 44 29 3b 0a 20 20 20 20 43 28 57 52  ENIED);.    C(WR
e320: 4f 4e 47 5f 4d 4f 44 45 29 3b 0a 20 20 20 20 43  ONG_MODE);.    C
e330: 28 4c 4f 47 49 4e 5f 46 41 49 4c 45 44 29 3b 0a  (LOGIN_FAILED);.
e340: 20 20 20 20 43 28 4c 4f 47 49 4e 5f 46 41 49 4c      C(LOGIN_FAIL
e350: 45 44 5f 4e 4f 53 45 45 44 29 3b 0a 20 20 20 20  ED_NOSEED);.    
e360: 43 28 4c 4f 47 49 4e 5f 46 41 49 4c 45 44 5f 4e  C(LOGIN_FAILED_N
e370: 4f 4e 41 4d 45 29 3b 0a 20 20 20 20 43 28 4c 4f  ONAME);.    C(LO
e380: 47 49 4e 5f 46 41 49 4c 45 44 5f 4e 4f 50 57 29  GIN_FAILED_NOPW)
e390: 3b 0a 20 20 20 20 43 28 4c 4f 47 49 4e 5f 46 41  ;.    C(LOGIN_FA
e3a0: 49 4c 45 44 5f 4e 4f 54 46 4f 55 4e 44 29 3b 0a  ILED_NOTFOUND);.
e3b0: 0a 20 20 20 20 43 28 55 53 41 47 45 29 3b 0a 20  .    C(USAGE);. 
e3c0: 20 20 20 43 28 49 4e 56 41 4c 49 44 5f 41 52 47     C(INVALID_ARG
e3d0: 53 29 3b 0a 20 20 20 20 43 28 4d 49 53 53 49 4e  S);.    C(MISSIN
e3e0: 47 5f 41 52 47 53 29 3b 0a 20 20 20 20 43 28 41  G_ARGS);.    C(A
e3f0: 4d 42 49 47 55 4f 55 53 5f 55 55 49 44 29 3b 0a  MBIGUOUS_UUID);.
e400: 20 20 20 20 43 28 55 4e 52 45 53 4f 4c 56 45 44      C(UNRESOLVED
e410: 5f 55 55 49 44 29 3b 0a 20 20 20 20 43 28 52 45  _UUID);.    C(RE
e420: 53 4f 55 52 43 45 5f 41 4c 52 45 41 44 59 5f 45  SOURCE_ALREADY_E
e430: 58 49 53 54 53 29 3b 0a 20 20 20 20 43 28 52 45  XISTS);.    C(RE
e440: 53 4f 55 52 43 45 5f 4e 4f 54 5f 46 4f 55 4e 44  SOURCE_NOT_FOUND
e450: 29 3b 0a 0a 20 20 20 20 43 28 44 42 29 3b 0a 20  );..    C(DB);. 
e460: 20 20 20 43 28 53 54 4d 54 5f 50 52 45 50 29 3b     C(STMT_PREP);
e470: 0a 20 20 20 20 43 28 53 54 4d 54 5f 42 49 4e 44  .    C(STMT_BIND
e480: 29 3b 0a 20 20 20 20 43 28 53 54 4d 54 5f 45 58  );.    C(STMT_EX
e490: 45 43 29 3b 0a 20 20 20 20 43 28 44 42 5f 4c 4f  EC);.    C(DB_LO
e4a0: 43 4b 45 44 29 3b 0a 20 20 20 20 43 28 44 42 5f  CKED);.    C(DB_
e4b0: 4e 45 45 44 53 5f 52 45 42 55 49 4c 44 29 3b 0a  NEEDS_REBUILD);.
e4c0: 20 20 20 20 43 28 44 42 5f 4e 4f 54 5f 46 4f 55      C(DB_NOT_FOU
e4d0: 4e 44 29 3b 0a 20 20 20 20 43 28 44 42 5f 4e 4f  ND);.    C(DB_NO
e4e0: 54 5f 56 41 4c 49 44 29 3b 0a 23 75 6e 64 65 66  T_VALID);.#undef
e4f0: 20 43 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 69   C.    return li
e500: 73 74 56 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 2f  stV;.}.../*.** /
e510: 6a 73 6f 6e 2f 76 65 72 73 69 6f 6e 20 69 6d 70  json/version imp
e520: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a  lementation..**.
e530: 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 70  ** Returns the p
e540: 61 79 6c 6f 61 64 20 6f 62 6a 65 63 74 20 28 6f  ayload object (o
e550: 77 6e 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  wned by the call
e560: 65 72 29 2e 0a 2a 2f 0a 63 73 6f 6e 5f 76 61 6c  er)..*/.cson_val
e570: 75 65 20 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f 76  ue * json_page_v
e580: 65 72 73 69 6f 6e 28 29 7b 0a 20 20 63 73 6f 6e  ersion(){.  cson
e590: 5f 76 61 6c 75 65 20 2a 20 6a 76 61 6c 20 3d 20  _value * jval = 
e5a0: 4e 55 4c 4c 3b 0a 20 20 63 73 6f 6e 5f 6f 62 6a  NULL;.  cson_obj
e5b0: 65 63 74 20 2a 20 6a 6f 62 6a 20 3d 20 4e 55 4c  ect * jobj = NUL
e5c0: 4c 3b 0a 20 20 6a 76 61 6c 20 3d 20 63 73 6f 6e  L;.  jval = cson
e5d0: 5f 76 61 6c 75 65 5f 6e 65 77 5f 6f 62 6a 65 63  _value_new_objec
e5e0: 74 28 29 3b 0a 20 20 6a 6f 62 6a 20 3d 20 63 73  t();.  jobj = cs
e5f0: 6f 6e 5f 76 61 6c 75 65 5f 67 65 74 5f 6f 62 6a  on_value_get_obj
e600: 65 63 74 28 6a 76 61 6c 29 3b 0a 23 64 65 66 69  ect(jval);.#defi
e610: 6e 65 20 46 53 45 54 28 58 2c 4b 29 20 63 73 6f  ne FSET(X,K) cso
e620: 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 20 6a 6f  n_object_set( jo
e630: 62 6a 2c 20 4b 2c 20 63 73 6f 6e 5f 76 61 6c 75  bj, K, cson_valu
e640: 65 5f 6e 65 77 5f 73 74 72 69 6e 67 28 58 2c 73  e_new_string(X,s
e650: 74 72 6c 65 6e 28 58 29 29 29 0a 20 20 46 53 45  trlen(X))).  FSE
e660: 54 28 4d 41 4e 49 46 45 53 54 5f 55 55 49 44 2c  T(MANIFEST_UUID,
e670: 22 6d 61 6e 69 66 65 73 74 55 75 69 64 22 29 3b  "manifestUuid");
e680: 0a 20 20 46 53 45 54 28 4d 41 4e 49 46 45 53 54  .  FSET(MANIFEST
e690: 5f 56 45 52 53 49 4f 4e 2c 22 6d 61 6e 69 66 65  _VERSION,"manife
e6a0: 73 74 56 65 72 73 69 6f 6e 22 29 3b 0a 20 20 46  stVersion");.  F
e6b0: 53 45 54 28 4d 41 4e 49 46 45 53 54 5f 44 41 54  SET(MANIFEST_DAT
e6c0: 45 2c 22 6d 61 6e 69 66 65 73 74 44 61 74 65 22  E,"manifestDate"
e6d0: 29 3b 0a 20 20 46 53 45 54 28 4d 41 4e 49 46 45  );.  FSET(MANIFE
e6e0: 53 54 5f 59 45 41 52 2c 22 6d 61 6e 69 66 65 73  ST_YEAR,"manifes
e6f0: 74 59 65 61 72 22 29 3b 0a 20 20 46 53 45 54 28  tYear");.  FSET(
e700: 52 45 4c 45 41 53 45 5f 56 45 52 53 49 4f 4e 2c  RELEASE_VERSION,
e710: 22 72 65 6c 65 61 73 65 56 65 72 73 69 6f 6e 22  "releaseVersion"
e720: 29 3b 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74  );.  cson_object
e730: 5f 73 65 74 28 20 6a 6f 62 6a 2c 20 22 72 65 6c  _set( jobj, "rel
e740: 65 61 73 65 56 65 72 73 69 6f 6e 4e 75 6d 62 65  easeVersionNumbe
e750: 72 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r",.            
e760: 20 20 20 20 20 20 20 63 73 6f 6e 5f 76 61 6c 75         cson_valu
e770: 65 5f 6e 65 77 5f 69 6e 74 65 67 65 72 28 52 45  e_new_integer(RE
e780: 4c 45 41 53 45 5f 56 45 52 53 49 4f 4e 5f 4e 55  LEASE_VERSION_NU
e790: 4d 42 45 52 29 20 29 3b 0a 20 20 63 73 6f 6e 5f  MBER) );.  cson_
e7a0: 6f 62 6a 65 63 74 5f 73 65 74 28 20 6a 6f 62 6a  object_set( jobj
e7b0: 2c 20 22 72 65 73 75 6c 74 43 6f 64 65 50 61 72  , "resultCodePar
e7c0: 61 6e 6f 69 61 4c 65 76 65 6c 22 2c 0a 20 20 20  anoiaLevel",.   
e7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7e0: 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 69  cson_value_new_i
e7f0: 6e 74 65 67 65 72 28 67 2e 6a 73 6f 6e 2e 65 72  nteger(g.json.er
e800: 72 6f 72 44 65 74 61 69 6c 50 61 72 61 6e 6f 69  rorDetailParanoi
e810: 61 29 20 29 3b 0a 20 20 2f 2a 46 53 45 54 28 46  a) );.  /*FSET(F
e820: 4f 53 53 49 4c 5f 4a 53 4f 4e 5f 41 50 49 5f 56  OSSIL_JSON_API_V
e830: 45 52 53 49 4f 4e 2c 20 22 6a 73 6f 6e 41 70 69  ERSION, "jsonApi
e840: 56 65 72 73 69 6f 6e 22 20 29 3b 2a 2f 0a 23 75  Version" );*/.#u
e850: 6e 64 65 66 20 46 53 45 54 0a 20 20 72 65 74 75  ndef FSET.  retu
e860: 72 6e 20 6a 76 61 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn jval;.}.../*.
e870: 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 63  ** Returns the c
e880: 75 72 72 65 6e 74 20 75 73 65 72 27 73 20 63 61  urrent user's ca
e890: 70 61 62 69 6c 69 74 69 65 73 20 73 74 72 69 6e  pabilities strin
e8a0: 67 20 61 73 20 61 20 53 74 72 69 6e 67 20 76 61  g as a String va
e8b0: 6c 75 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 65 64  lue..** Returned
e8c0: 20 76 61 6c 75 65 20 69 73 20 6f 77 6e 65 64 20   value is owned 
e8d0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2c 20 61  by the caller, a
e8e0: 6e 64 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20  nd will only be 
e8f0: 4e 55 4c 4c 20 69 66 0a 2a 2a 20 67 2e 75 73 65  NULL if.** g.use
e900: 72 55 69 64 20 69 73 20 69 6e 76 61 6c 69 64 20  rUid is invalid 
e910: 6f 72 20 61 6e 20 6f 75 74 20 6f 66 20 6d 65 6d  or an out of mem
e920: 6f 72 79 20 65 72 72 6f 72 2e 20 4f 72 2c 20 69  ory error. Or, i
e930: 74 20 74 75 72 6e 73 20 6f 75 74 2c 0a 2a 2a 20  t turns out,.** 
e940: 69 6e 20 43 4c 49 20 6d 6f 64 65 20 28 77 68 65  in CLI mode (whe
e950: 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  re there is no l
e960: 6f 67 67 65 64 2d 69 6e 20 75 73 65 72 29 2e 0a  ogged-in user)..
e970: 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20  */.cson_value * 
e980: 6a 73 6f 6e 5f 63 61 70 5f 76 61 6c 75 65 28 29  json_cap_value()
e990: 7b 0a 20 20 69 66 28 67 2e 75 73 65 72 55 69 64  {.  if(g.userUid
e9a0: 3c 3d 30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <=0){.    return
e9b0: 20 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a   NULL;.  }else{.
e9c0: 20 20 20 20 53 74 6d 74 20 71 20 3d 20 65 6d 70      Stmt q = emp
e9d0: 74 79 5f 53 74 6d 74 3b 0a 20 20 20 20 63 73 6f  ty_Stmt;.    cso
e9e0: 6e 5f 76 61 6c 75 65 20 2a 20 76 61 6c 20 3d 20  n_value * val = 
e9f0: 4e 55 4c 4c 3b 0a 20 20 20 20 64 62 5f 70 72 65  NULL;.    db_pre
ea00: 70 61 72 65 28 26 71 2c 20 22 53 45 4c 45 43 54  pare(&q, "SELECT
ea10: 20 63 61 70 20 46 52 4f 4d 20 75 73 65 72 20 57   cap FROM user W
ea20: 48 45 52 45 20 75 69 64 3d 25 64 22 2c 20 67 2e  HERE uid=%d", g.
ea30: 75 73 65 72 55 69 64 29 3b 0a 20 20 20 20 69 66  userUid);.    if
ea40: 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53  ( db_step(&q)==S
ea50: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
ea60: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 20     char const * 
ea70: 73 74 72 20 3d 20 28 63 68 61 72 20 63 6f 6e 73  str = (char cons
ea80: 74 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  t *)sqlite3_colu
ea90: 6d 6e 5f 74 65 78 74 28 71 2e 70 53 74 6d 74 2c  mn_text(q.pStmt,
eaa0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  0);.      if( st
eab0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 76 61 6c  r ){.        val
eac0: 20 3d 20 6a 73 6f 6e 5f 6e 65 77 5f 73 74 72 69   = json_new_stri
ead0: 6e 67 28 73 74 72 29 3b 0a 20 20 20 20 20 20 7d  ng(str);.      }
eae0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 66 69  .    }.    db_fi
eaf0: 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 20 20  nalize(&q);.    
eb00: 72 65 74 75 72 6e 20 76 61 6c 3b 0a 20 20 7d 0a  return val;.  }.
eb10: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
eb20: 6e 74 61 74 69 6f 6e 20 66 6f 72 20 2f 6a 73 6f  ntation for /jso
eb30: 6e 2f 63 61 70 0a 2a 2a 0a 2a 2a 20 52 65 74 75  n/cap.**.** Retu
eb40: 72 6e 65 64 20 6f 62 6a 65 63 74 20 63 6f 6e 74  rned object cont
eb50: 61 69 6e 73 20 64 65 74 61 69 6c 73 20 61 62 6f  ains details abo
eb60: 75 74 20 74 68 65 20 22 63 61 70 61 62 69 6c 69  ut the "capabili
eb70: 74 69 65 73 22 20 6f 66 20 74 68 65 0a 2a 2a 20  ties" of the.** 
eb80: 63 75 72 72 65 6e 74 20 75 73 65 72 20 28 77 68  current user (wh
eb90: 61 74 20 68 65 20 6d 61 79 2f 6d 61 79 20 6e 6f  at he may/may no
eba0: 74 20 64 6f 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  t do)..**.** Thi
ebb0: 73 20 69 73 20 70 72 69 6d 61 72 69 6c 79 20 69  s is primarily i
ebc0: 6e 74 65 6e 64 65 64 20 66 6f 72 20 64 65 62 75  ntended for debu
ebd0: 67 67 65 72 69 6e 67 2c 20 62 75 74 20 6d 61 79  ggering, but may
ebe0: 20 68 61 76 65 0a 2a 2a 20 61 20 75 73 65 20 69   have.** a use i
ebf0: 6e 20 63 6c 69 65 6e 74 20 63 6f 64 65 2e 20 28  n client code. (
ec00: 3f 29 0a 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65  ?).*/.cson_value
ec10: 20 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f 63 61 70   * json_page_cap
ec20: 28 29 7b 0a 20 20 63 73 6f 6e 5f 76 61 6c 75 65  (){.  cson_value
ec30: 20 2a 20 70 61 79 6c 6f 61 64 20 3d 20 63 73 6f   * payload = cso
ec40: 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 6f 62 6a 65  n_value_new_obje
ec50: 63 74 28 29 3b 0a 20 20 63 73 6f 6e 5f 76 61 6c  ct();.  cson_val
ec60: 75 65 20 2a 20 73 75 62 20 3d 20 63 73 6f 6e 5f  ue * sub = cson_
ec70: 76 61 6c 75 65 5f 6e 65 77 5f 6f 62 6a 65 63 74  value_new_object
ec80: 28 29 3b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20  ();.  Stmt q;.  
ec90: 63 73 6f 6e 5f 6f 62 6a 65 63 74 20 2a 20 6f 62  cson_object * ob
eca0: 6a 20 3d 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 67  j = cson_value_g
ecb0: 65 74 5f 6f 62 6a 65 63 74 28 70 61 79 6c 6f 61  et_object(payloa
ecc0: 64 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65  d);.  db_prepare
ecd0: 28 26 71 2c 20 22 53 45 4c 45 43 54 20 6c 6f 67  (&q, "SELECT log
ece0: 69 6e 2c 20 63 61 70 20 46 52 4f 4d 20 75 73 65  in, cap FROM use
ecf0: 72 20 57 48 45 52 45 20 75 69 64 3d 25 64 22 2c  r WHERE uid=%d",
ed00: 20 67 2e 75 73 65 72 55 69 64 29 3b 0a 20 20 69   g.userUid);.  i
ed10: 66 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d  f( db_step(&q)==
ed20: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
ed30: 20 20 2f 2a 20 72 65 6d 69 6e 64 65 72 3a 20 77    /* reminder: w
ed40: 65 20 64 6f 6e 27 74 20 75 73 65 20 67 2e 7a 4c  e don't use g.zL
ed50: 6f 67 69 6e 20 62 65 63 61 75 73 65 20 69 74 27  ogin because it'
ed60: 73 20 30 20 66 6f 72 20 74 68 65 20 67 75 65 73  s 0 for the gues
ed70: 74 0a 20 20 20 20 20 20 20 75 73 65 72 20 61 6e  t.       user an
ed80: 64 20 74 68 65 20 48 54 4d 4c 20 55 49 20 61 70  d the HTML UI ap
ed90: 70 65 61 72 73 20 74 6f 20 63 75 72 72 65 6e 74  pears to current
eda0: 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6e 61 6d  ly allow the nam
edb0: 65 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 63  e to be.       c
edc0: 68 61 6e 67 65 64 20 28 62 75 74 20 64 6f 69 6e  hanged (but doin
edd0: 67 20 73 6f 20 77 6f 75 6c 64 20 62 72 65 61 6b  g so would break
ede0: 20 6f 74 68 65 72 20 63 6f 64 65 29 2e 20 2a 2f   other code). */
edf0: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
ee00: 2a 20 73 74 72 20 3d 20 28 63 68 61 72 20 63 6f  * str = (char co
ee10: 6e 73 74 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  nst *)sqlite3_co
ee20: 6c 75 6d 6e 5f 74 65 78 74 28 71 2e 70 53 74 6d  lumn_text(q.pStm
ee30: 74 2c 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74  t,0);.    if( st
ee40: 72 20 29 7b 0a 20 20 20 20 20 20 63 73 6f 6e 5f  r ){.      cson_
ee50: 6f 62 6a 65 63 74 5f 73 65 74 28 20 6f 62 6a 2c  object_set( obj,
ee60: 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20 20   "name",.       
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee80: 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 73  cson_value_new_s
ee90: 74 72 69 6e 67 28 73 74 72 2c 73 74 72 6c 65 6e  tring(str,strlen
eea0: 28 73 74 72 29 29 20 29 3b 0a 20 20 20 20 7d 0a  (str)) );.    }.
eeb0: 20 20 20 20 73 74 72 20 3d 20 28 63 68 61 72 20      str = (char 
eec0: 63 6f 6e 73 74 20 2a 29 73 71 6c 69 74 65 33 5f  const *)sqlite3_
eed0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 71 2e 70 53  column_text(q.pS
eee0: 74 6d 74 2c 31 29 3b 0a 20 20 20 20 69 66 28 20  tmt,1);.    if( 
eef0: 73 74 72 20 29 7b 0a 20 20 20 20 20 20 63 73 6f  str ){.      cso
ef00: 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 20 6f 62  n_object_set( ob
ef10: 6a 2c 20 22 63 61 70 61 62 69 6c 69 74 69 65 73  j, "capabilities
ef20: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
ef30: 20 20 20 20 20 20 20 20 20 20 63 73 6f 6e 5f 76            cson_v
ef40: 61 6c 75 65 5f 6e 65 77 5f 73 74 72 69 6e 67 28  alue_new_string(
ef50: 73 74 72 2c 73 74 72 6c 65 6e 28 73 74 72 29 29  str,strlen(str))
ef60: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
ef70: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b  db_finalize(&q);
ef80: 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73  .  cson_object_s
ef90: 65 74 28 20 6f 62 6a 2c 20 22 70 65 72 6d 69 73  et( obj, "permis
efa0: 73 69 6f 6e 46 6c 61 67 73 22 2c 20 73 75 62 20  sionFlags", sub 
efb0: 29 3b 0a 20 20 6f 62 6a 20 3d 20 63 73 6f 6e 5f  );.  obj = cson_
efc0: 76 61 6c 75 65 5f 67 65 74 5f 6f 62 6a 65 63 74  value_get_object
efd0: 28 73 75 62 29 3b 0a 0a 23 64 65 66 69 6e 65 20  (sub);..#define 
efe0: 41 44 44 28 58 2c 4b 29 20 63 73 6f 6e 5f 6f 62  ADD(X,K) cson_ob
eff0: 6a 65 63 74 5f 73 65 74 28 6f 62 6a 2c 20 4b 2c  ject_set(obj, K,
f000: 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f   cson_value_new_
f010: 62 6f 6f 6c 28 67 2e 70 65 72 6d 2e 58 29 29 0a  bool(g.perm.X)).
f020: 20 20 41 44 44 28 53 65 74 75 70 2c 22 73 65 74    ADD(Setup,"set
f030: 75 70 22 29 3b 0a 20 20 41 44 44 28 41 64 6d 69  up");.  ADD(Admi
f040: 6e 2c 22 61 64 6d 69 6e 22 29 3b 0a 20 20 41 44  n,"admin");.  AD
f050: 44 28 44 65 6c 65 74 65 2c 22 64 65 6c 65 74 65  D(Delete,"delete
f060: 22 29 3b 0a 20 20 41 44 44 28 50 61 73 73 77 6f  ");.  ADD(Passwo
f070: 72 64 2c 22 70 61 73 73 77 6f 72 64 22 29 3b 0a  rd,"password");.
f080: 20 20 41 44 44 28 51 75 65 72 79 2c 22 71 75 65    ADD(Query,"que
f090: 72 79 22 29 3b 20 2f 2a 20 64 6f 6e 27 74 20 74  ry"); /* don't t
f0a0: 68 69 6e 6b 20 74 68 69 73 20 6f 6e 65 20 69 73  hink this one is
f0b0: 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 20 2a   actually used *
f0c0: 2f 0a 20 20 41 44 44 28 57 72 69 74 65 2c 22 63  /.  ADD(Write,"c
f0d0: 68 65 63 6b 69 6e 22 29 3b 0a 20 20 41 44 44 28  heckin");.  ADD(
f0e0: 52 65 61 64 2c 22 63 68 65 63 6b 6f 75 74 22 29  Read,"checkout")
f0f0: 3b 0a 20 20 41 44 44 28 48 79 70 65 72 6c 69 6e  ;.  ADD(Hyperlin
f100: 6b 2c 22 68 69 73 74 6f 72 79 22 29 3b 0a 20 20  k,"history");.  
f110: 41 44 44 28 43 6c 6f 6e 65 2c 22 63 6c 6f 6e 65  ADD(Clone,"clone
f120: 22 29 3b 0a 20 20 41 44 44 28 52 64 57 69 6b 69  ");.  ADD(RdWiki
f130: 2c 22 72 65 61 64 57 69 6b 69 22 29 3b 0a 20 20  ,"readWiki");.  
f140: 41 44 44 28 4e 65 77 57 69 6b 69 2c 22 63 72 65  ADD(NewWiki,"cre
f150: 61 74 65 57 69 6b 69 22 29 3b 0a 20 20 41 44 44  ateWiki");.  ADD
f160: 28 41 70 6e 64 57 69 6b 69 2c 22 61 70 70 65 6e  (ApndWiki,"appen
f170: 64 57 69 6b 69 22 29 3b 0a 20 20 41 44 44 28 57  dWiki");.  ADD(W
f180: 72 57 69 6b 69 2c 22 65 64 69 74 57 69 6b 69 22  rWiki,"editWiki"
f190: 29 3b 0a 20 20 41 44 44 28 52 64 54 6b 74 2c 22  );.  ADD(RdTkt,"
f1a0: 72 65 61 64 54 69 63 6b 65 74 22 29 3b 0a 20 20  readTicket");.  
f1b0: 41 44 44 28 4e 65 77 54 6b 74 2c 22 63 72 65 61  ADD(NewTkt,"crea
f1c0: 74 65 54 69 63 6b 65 74 22 29 3b 0a 20 20 41 44  teTicket");.  AD
f1d0: 44 28 41 70 6e 64 54 6b 74 2c 22 61 70 70 65 6e  D(ApndTkt,"appen
f1e0: 64 54 69 63 6b 65 74 22 29 3b 0a 20 20 41 44 44  dTicket");.  ADD
f1f0: 28 57 72 54 6b 74 2c 22 65 64 69 74 54 69 63 6b  (WrTkt,"editTick
f200: 65 74 22 29 3b 0a 20 20 41 44 44 28 41 74 74 61  et");.  ADD(Atta
f210: 63 68 2c 22 61 74 74 61 63 68 46 69 6c 65 22 29  ch,"attachFile")
f220: 3b 0a 20 20 41 44 44 28 54 6b 74 46 6d 74 2c 22  ;.  ADD(TktFmt,"
f230: 63 72 65 61 74 65 54 69 63 6b 65 74 52 65 70 6f  createTicketRepo
f240: 72 74 22 29 3b 0a 20 20 41 44 44 28 52 64 41 64  rt");.  ADD(RdAd
f250: 64 72 2c 22 72 65 61 64 50 72 69 76 61 74 65 22  dr,"readPrivate"
f260: 29 3b 0a 20 20 41 44 44 28 5a 69 70 2c 22 7a 69  );.  ADD(Zip,"zi
f270: 70 22 29 3b 0a 20 20 41 44 44 28 50 72 69 76 61  p");.  ADD(Priva
f280: 74 65 2c 22 78 66 65 72 50 72 69 76 61 74 65 22  te,"xferPrivate"
f290: 29 3b 0a 23 75 6e 64 65 66 20 41 44 44 0a 20 20  );.#undef ADD.  
f2a0: 72 65 74 75 72 6e 20 70 61 79 6c 6f 61 64 3b 0a  return payload;.
f2b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
f2c0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 2f  ntation of the /
f2d0: 6a 73 6f 6e 2f 73 74 61 74 20 70 61 67 65 2f 63  json/stat page/c
f2e0: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2f 0a 63 73  ommand..**.*/.cs
f2f0: 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f  on_value * json_
f300: 70 61 67 65 5f 73 74 61 74 28 29 7b 0a 20 20 69  page_stat(){.  i
f310: 36 34 20 74 2c 20 66 73 69 7a 65 3b 0a 20 20 69  64 t, fsize;.  i
f320: 6e 74 20 6e 2c 20 6d 3b 0a 20 20 69 6e 74 20 66  nt n, m;.  int f
f330: 75 6c 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ull;.  const cha
f340: 72 20 2a 7a 44 62 3b 0a 20 20 65 6e 75 6d 20 7b  r *zDb;.  enum {
f350: 20 42 75 66 4c 65 6e 20 3d 20 31 30 30 30 20 7d   BufLen = 1000 }
f360: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 42 75  ;.  char zBuf[Bu
f370: 66 4c 65 6e 5d 3b 0a 20 20 63 73 6f 6e 5f 76 61  fLen];.  cson_va
f380: 6c 75 65 20 2a 20 6a 76 20 3d 20 4e 55 4c 4c 3b  lue * jv = NULL;
f390: 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 20 2a  .  cson_object *
f3a0: 20 6a 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 73   jo = NULL;.  cs
f3b0: 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 76 32 20 3d  on_value * jv2 =
f3c0: 20 4e 55 4c 4c 3b 0a 20 20 63 73 6f 6e 5f 6f 62   NULL;.  cson_ob
f3d0: 6a 65 63 74 20 2a 20 6a 6f 32 20 3d 20 4e 55 4c  ject * jo2 = NUL
f3e0: 4c 3b 0a 20 20 63 68 61 72 20 2a 20 7a 54 6d 70  L;.  char * zTmp
f3f0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 66 28 20 21   = NULL;.  if( !
f400: 67 2e 70 65 72 6d 2e 52 65 61 64 20 29 7b 0a 20  g.perm.Read ){. 
f410: 20 20 20 6a 73 6f 6e 5f 73 65 74 5f 65 72 72 28     json_set_err(
f420: 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 44 45 4e 49 45  FSL_JSON_E_DENIE
f430: 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  D,.             
f440: 20 20 20 20 22 52 65 71 75 69 72 65 73 20 27 6f      "Requires 'o
f450: 27 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 22 29  ' permissions.")
f460: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ;.    return NUL
f470: 4c 3b 0a 20 20 7d 0a 20 20 66 75 6c 6c 20 3d 20  L;.  }.  full = 
f480: 6a 73 6f 6e 5f 66 69 6e 64 5f 6f 70 74 69 6f 6e  json_find_option
f490: 5f 62 6f 6f 6c 28 22 66 75 6c 6c 22 2c 4e 55 4c  _bool("full",NUL
f4a0: 4c 2c 22 66 22 2c 30 29 3b 0a 23 64 65 66 69 6e  L,"f",0);.#defin
f4b0: 65 20 53 45 54 42 55 46 28 4f 2c 4b 29 20 63 73  e SETBUF(O,K) cs
f4c0: 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 4f 2c  on_object_set(O,
f4d0: 20 4b 2c 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e   K, cson_value_n
f4e0: 65 77 5f 73 74 72 69 6e 67 28 7a 42 75 66 2c 20  ew_string(zBuf, 
f4f0: 73 74 72 6c 65 6e 28 7a 42 75 66 29 29 29 3b 0a  strlen(zBuf)));.
f500: 0a 20 20 6a 76 20 3d 20 63 73 6f 6e 5f 76 61 6c  .  jv = cson_val
f510: 75 65 5f 6e 65 77 5f 6f 62 6a 65 63 74 28 29 3b  ue_new_object();
f520: 0a 20 20 6a 6f 20 3d 20 63 73 6f 6e 5f 76 61 6c  .  jo = cson_val
f530: 75 65 5f 67 65 74 5f 6f 62 6a 65 63 74 28 6a 76  ue_get_object(jv
f540: 29 3b 0a 0a 20 20 7a 54 6d 70 20 3d 20 64 62 5f  );..  zTmp = db_
f550: 67 65 74 28 22 70 72 6f 6a 65 63 74 2d 6e 61 6d  get("project-nam
f560: 65 22 2c 4e 55 4c 4c 29 3b 0a 20 20 63 73 6f 6e  e",NULL);.  cson
f570: 5f 6f 62 6a 65 63 74 5f 73 65 74 28 6a 6f 2c 20  _object_set(jo, 
f580: 22 70 72 6f 6a 65 63 74 4e 61 6d 65 22 2c 20 6a  "projectName", j
f590: 73 6f 6e 5f 6e 65 77 5f 73 74 72 69 6e 67 28 7a  son_new_string(z
f5a0: 54 6d 70 29 29 3b 0a 20 20 66 72 65 65 28 7a 54  Tmp));.  free(zT
f5b0: 6d 70 29 3b 0a 20 20 7a 54 6d 70 20 3d 20 64 62  mp);.  zTmp = db
f5c0: 5f 67 65 74 28 22 70 72 6f 6a 65 63 74 2d 64 65  _get("project-de
f5d0: 73 63 72 69 70 74 69 6f 6e 22 2c 4e 55 4c 4c 29  scription",NULL)
f5e0: 3b 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f  ;.  cson_object_
f5f0: 73 65 74 28 6a 6f 2c 20 22 70 72 6f 6a 65 63 74  set(jo, "project
f600: 44 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 6a 73  Description", js
f610: 6f 6e 5f 6e 65 77 5f 73 74 72 69 6e 67 28 7a 54  on_new_string(zT
f620: 6d 70 29 29 3b 0a 20 20 66 72 65 65 28 7a 54 6d  mp));.  free(zTm
f630: 70 29 3b 0a 20 20 7a 54 6d 70 20 3d 20 4e 55 4c  p);.  zTmp = NUL
f640: 4c 3b 0a 20 20 66 73 69 7a 65 20 3d 20 66 69 6c  L;.  fsize = fil
f650: 65 5f 73 69 7a 65 28 67 2e 7a 52 65 70 6f 73 69  e_size(g.zReposi
f660: 74 6f 72 79 4e 61 6d 65 29 3b 0a 20 20 63 73 6f  toryName);.  cso
f670: 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 6a 6f 2c  n_object_set(jo,
f680: 20 22 72 65 70 6f 73 69 74 6f 72 79 53 69 7a 65   "repositorySize
f690: 22 2c 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65  ", cson_value_ne
f6a0: 77 5f 69 6e 74 65 67 65 72 28 28 63 73 6f 6e 5f  w_integer((cson_
f6b0: 69 6e 74 5f 74 29 66 73 69 7a 65 29 29 3b 0a 0a  int_t)fsize));..
f6c0: 20 20 69 66 28 66 75 6c 6c 29 7b 0a 20 20 20 20    if(full){.    
f6d0: 6e 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53  n = db_int(0, "S
f6e0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
f6f0: 52 4f 4d 20 62 6c 6f 62 22 29 3b 0a 20 20 20 20  ROM blob");.    
f700: 6d 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53  m = db_int(0, "S
f710: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
f720: 52 4f 4d 20 64 65 6c 74 61 22 29 3b 0a 20 20 20  ROM delta");.   
f730: 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65 74   cson_object_set
f740: 28 6a 6f 2c 20 22 62 6c 6f 62 43 6f 75 6e 74 22  (jo, "blobCount"
f750: 2c 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77  , cson_value_new
f760: 5f 69 6e 74 65 67 65 72 28 28 63 73 6f 6e 5f 69  _integer((cson_i
f770: 6e 74 5f 74 29 6e 29 29 3b 0a 20 20 20 20 63 73  nt_t)n));.    cs
f780: 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 6a 6f  on_object_set(jo
f790: 2c 20 22 64 65 6c 74 61 43 6f 75 6e 74 22 2c 20  , "deltaCount", 
f7a0: 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 69  cson_value_new_i
f7b0: 6e 74 65 67 65 72 28 28 63 73 6f 6e 5f 69 6e 74  nteger((cson_int
f7c0: 5f 74 29 6d 29 29 3b 0a 20 20 20 20 69 66 28 20  _t)m));.    if( 
f7d0: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  n>0 ){.      int
f7e0: 20 61 2c 20 62 3b 0a 20 20 20 20 20 20 53 74 6d   a, b;.      Stm
f7f0: 74 20 71 3b 0a 20 20 20 20 20 20 64 62 5f 70 72  t q;.      db_pr
f800: 65 70 61 72 65 28 26 71 2c 20 22 53 45 4c 45 43  epare(&q, "SELEC
f810: 54 20 74 6f 74 61 6c 28 73 69 7a 65 29 2c 20 61  T total(size), a
f820: 76 67 28 73 69 7a 65 29 2c 20 6d 61 78 28 73 69  vg(size), max(si
f830: 7a 65 29 22 0a 20 20 20 20 20 20 20 20 20 20 20  ze)".           
f840: 20 20 20 20 20 20 22 20 46 52 4f 4d 20 62 6c 6f        " FROM blo
f850: 62 20 57 48 45 52 45 20 73 69 7a 65 3e 30 22 29  b WHERE size>0")
f860: 3b 0a 20 20 20 20 20 20 64 62 5f 73 74 65 70 28  ;.      db_step(
f870: 26 71 29 3b 0a 20 20 20 20 20 20 74 20 3d 20 64  &q);.      t = d
f880: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 26  b_column_int64(&
f890: 71 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 73 6f  q, 0);.      cso
f8a0: 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 6a 6f 2c  n_object_set(jo,
f8b0: 20 22 75 6e 63 6f 6d 70 72 65 73 73 65 64 41 72   "uncompressedAr
f8c0: 74 69 66 61 63 74 53 69 7a 65 22 2c 0a 20 20 20  tifactSize",.   
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8e0: 20 20 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65     cson_value_ne
f8f0: 77 5f 69 6e 74 65 67 65 72 28 28 63 73 6f 6e 5f  w_integer((cson_
f900: 69 6e 74 5f 74 29 74 29 29 3b 0a 20 20 20 20 20  int_t)t));.     
f910: 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65 74   cson_object_set
f920: 28 6a 6f 2c 20 22 61 76 65 72 61 67 65 41 72 74  (jo, "averageArt
f930: 69 66 61 63 74 53 69 7a 65 22 2c 0a 20 20 20 20  ifactSize",.    
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f950: 20 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77    cson_value_new
f960: 5f 69 6e 74 65 67 65 72 28 28 63 73 6f 6e 5f 69  _integer((cson_i
f970: 6e 74 5f 74 29 64 62 5f 63 6f 6c 75 6d 6e 5f 69  nt_t)db_column_i
f980: 6e 74 28 26 71 2c 20 31 29 29 29 3b 0a 20 20 20  nt(&q, 1)));.   
f990: 20 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73     cson_object_s
f9a0: 65 74 28 6a 6f 2c 20 22 6d 61 78 41 72 74 69 66  et(jo, "maxArtif
f9b0: 61 63 74 53 69 7a 65 22 2c 0a 20 20 20 20 20 20  actSize",.      
f9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9d0: 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 69  cson_value_new_i
f9e0: 6e 74 65 67 65 72 28 28 63 73 6f 6e 5f 69 6e 74  nteger((cson_int
f9f0: 5f 74 29 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  _t)db_column_int
fa00: 28 26 71 2c 20 32 29 29 29 3b 0a 20 20 20 20 20  (&q, 2)));.     
fa10: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29   db_finalize(&q)
fa20: 3b 0a 20 20 20 20 20 20 69 66 28 20 74 2f 66 73  ;.      if( t/fs
fa30: 69 7a 65 20 3c 20 35 20 29 7b 0a 20 20 20 20 20  ize < 5 ){.     
fa40: 20 20 20 62 20 3d 20 31 30 3b 0a 20 20 20 20 20     b = 10;.     
fa50: 20 20 20 66 73 69 7a 65 20 2f 3d 20 31 30 3b 0a     fsize /= 10;.
fa60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fa70: 20 20 20 20 20 62 20 3d 20 31 3b 0a 20 20 20 20       b = 1;.    
fa80: 20 20 7d 0a 20 20 20 20 20 20 61 20 3d 20 74 2f    }.      a = t/
fa90: 66 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c  fsize;.      sql
faa0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 42 75  ite3_snprintf(Bu
fab0: 66 4c 65 6e 2c 7a 42 75 66 2c 20 22 25 64 3a 25  fLen,zBuf, "%d:%
fac0: 64 22 2c 20 61 2c 20 62 29 3b 0a 20 20 20 20 20  d", a, b);.     
fad0: 20 53 45 54 42 55 46 28 6a 6f 2c 20 22 63 6f 6d   SETBUF(jo, "com
fae0: 70 72 65 73 73 69 6f 6e 52 61 74 69 6f 22 29 3b  pressionRatio");
faf0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 64  .    }.    n = d
fb00: 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c 45 43 54  b_int(0, "SELECT
fb10: 20 63 6f 75 6e 74 28 64 69 73 74 69 6e 63 74 20   count(distinct 
fb20: 6d 69 64 29 20 46 52 4f 4d 20 6d 6c 69 6e 6b 20  mid) FROM mlink 
fb30: 2f 2a 73 63 61 6e 2a 2f 22 29 3b 0a 20 20 20 20  /*scan*/");.    
fb40: 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28  cson_object_set(
fb50: 6a 6f 2c 20 22 63 68 65 63 6b 69 6e 43 6f 75 6e  jo, "checkinCoun
fb60: 74 22 2c 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e  t", cson_value_n
fb70: 65 77 5f 69 6e 74 65 67 65 72 28 28 63 73 6f 6e  ew_integer((cson
fb80: 5f 69 6e 74 5f 74 29 6e 29 29 3b 0a 20 20 20 20  _int_t)n));.    
fb90: 6e 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53  n = db_int(0, "S
fba0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
fbb0: 52 4f 4d 20 66 69 6c 65 6e 61 6d 65 20 2f 2a 73  ROM filename /*s
fbc0: 63 61 6e 2a 2f 22 29 3b 0a 20 20 20 20 63 73 6f  can*/");.    cso
fbd0: 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 6a 6f 2c  n_object_set(jo,
fbe0: 20 22 66 69 6c 65 43 6f 75 6e 74 22 2c 20 63 73   "fileCount", cs
fbf0: 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 69 6e 74  on_value_new_int
fc00: 65 67 65 72 28 28 63 73 6f 6e 5f 69 6e 74 5f 74  eger((cson_int_t
fc10: 29 6e 29 29 3b 0a 20 20 20 20 6e 20 3d 20 64 62  )n));.    n = db
fc20: 5f 69 6e 74 28 30 2c 20 22 53 45 4c 45 43 54 20  _int(0, "SELECT 
fc30: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 61  count(*) FROM ta
fc40: 67 20 20 2f 2a 73 63 61 6e 2a 2f 22 0a 20 20 20  g  /*scan*/".   
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
fc60: 45 52 45 20 2b 74 61 67 6e 61 6d 65 20 47 4c 4f  ERE +tagname GLO
fc70: 42 20 27 77 69 6b 69 2d 2a 27 22 29 3b 0a 20 20  B 'wiki-*'");.  
fc80: 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65    cson_object_se
fc90: 74 28 6a 6f 2c 20 22 77 69 6b 69 50 61 67 65 43  t(jo, "wikiPageC
fca0: 6f 75 6e 74 22 2c 20 63 73 6f 6e 5f 76 61 6c 75  ount", cson_valu
fcb0: 65 5f 6e 65 77 5f 69 6e 74 65 67 65 72 28 28 63  e_new_integer((c
fcc0: 73 6f 6e 5f 69 6e 74 5f 74 29 6e 29 29 3b 0a 20  son_int_t)n));. 
fcd0: 20 20 20 6e 20 3d 20 64 62 5f 69 6e 74 28 30 2c     n = db_int(0,
fce0: 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
fcf0: 29 20 46 52 4f 4d 20 74 61 67 20 20 2f 2a 73 63  ) FROM tag  /*sc
fd00: 61 6e 2a 2f 22 0a 20 20 20 20 20 20 20 20 20 20  an*/".          
fd10: 20 20 20 20 20 22 20 57 48 45 52 45 20 2b 74 61       " WHERE +ta
fd20: 67 6e 61 6d 65 20 47 4c 4f 42 20 27 74 6b 74 2d  gname GLOB 'tkt-
fd30: 2a 27 22 29 3b 0a 20 20 20 20 63 73 6f 6e 5f 6f  *'");.    cson_o
fd40: 62 6a 65 63 74 5f 73 65 74 28 6a 6f 2c 20 22 74  bject_set(jo, "t
fd50: 69 63 6b 65 74 43 6f 75 6e 74 22 2c 20 63 73 6f  icketCount", cso
fd60: 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 69 6e 74 65  n_value_new_inte
fd70: 67 65 72 28 28 63 73 6f 6e 5f 69 6e 74 5f 74 29  ger((cson_int_t)
fd80: 6e 29 29 3b 0a 20 20 7d 2f 2a 66 75 6c 6c 2a 2f  n));.  }/*full*/
fd90: 0a 20 20 6e 20 3d 20 64 62 5f 69 6e 74 28 30 2c  .  n = db_int(0,
fda0: 20 22 53 45 4c 45 43 54 20 6a 75 6c 69 61 6e 64   "SELECT juliand
fdb0: 61 79 28 27 6e 6f 77 27 29 20 2d 20 28 53 45 4c  ay('now') - (SEL
fdc0: 45 43 54 20 6d 69 6e 28 6d 74 69 6d 65 29 20 46  ECT min(mtime) F
fdd0: 52 4f 4d 20 65 76 65 6e 74 29 22 0a 20 20 20 20  ROM event)".    
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 2b 20              " + 
fdf0: 30 2e 39 39 22 29 3b 0a 20 20 63 73 6f 6e 5f 6f  0.99");.  cson_o
fe00: 62 6a 65 63 74 5f 73 65 74 28 6a 6f 2c 20 22 61  bject_set(jo, "a
fe10: 67 65 44 61 79 73 22 2c 20 63 73 6f 6e 5f 76 61  geDays", cson_va
fe20: 6c 75 65 5f 6e 65 77 5f 69 6e 74 65 67 65 72 28  lue_new_integer(
fe30: 28 63 73 6f 6e 5f 69 6e 74 5f 74 29 6e 29 29 3b  (cson_int_t)n));
fe40: 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73  .  cson_object_s
fe50: 65 74 28 6a 6f 2c 20 22 61 67 65 59 65 61 72 73  et(jo, "ageYears
fe60: 22 2c 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65  ", cson_value_ne
fe70: 77 5f 64 6f 75 62 6c 65 28 6e 2f 33 36 35 2e 32  w_double(n/365.2
fe80: 34 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  4));.  sqlite3_s
fe90: 6e 70 72 69 6e 74 66 28 42 75 66 4c 65 6e 2c 20  nprintf(BufLen, 
fea0: 7a 42 75 66 2c 20 64 62 5f 67 65 74 28 22 70 72  zBuf, db_get("pr
feb0: 6f 6a 65 63 74 2d 63 6f 64 65 22 2c 22 22 29 29  oject-code",""))
fec0: 3b 0a 20 20 53 45 54 42 55 46 28 6a 6f 2c 20 22  ;.  SETBUF(jo, "
fed0: 70 72 6f 6a 65 63 74 43 6f 64 65 22 29 3b 0a 20  projectCode");. 
fee0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
fef0: 66 28 42 75 66 4c 65 6e 2c 20 7a 42 75 66 2c 20  f(BufLen, zBuf, 
ff00: 64 62 5f 67 65 74 28 22 73 65 72 76 65 72 2d 63  db_get("server-c
ff10: 6f 64 65 22 2c 22 22 29 29 3b 0a 20 20 53 45 54  ode",""));.  SET
ff20: 42 55 46 28 6a 6f 2c 20 22 73 65 72 76 65 72 43  BUF(jo, "serverC
ff30: 6f 64 65 22 29 3b 0a 20 20 63 73 6f 6e 5f 6f 62  ode");.  cson_ob
ff40: 6a 65 63 74 5f 73 65 74 28 6a 6f 2c 20 22 63 6f  ject_set(jo, "co
ff50: 6d 70 69 6c 65 72 22 2c 20 63 73 6f 6e 5f 76 61  mpiler", cson_va
ff60: 6c 75 65 5f 6e 65 77 5f 73 74 72 69 6e 67 28 43  lue_new_string(C
ff70: 4f 4d 50 49 4c 45 52 5f 4e 41 4d 45 2c 20 73 74  OMPILER_NAME, st
ff80: 72 6c 65 6e 28 43 4f 4d 50 49 4c 45 52 5f 4e 41  rlen(COMPILER_NA
ff90: 4d 45 29 29 29 3b 0a 0a 20 20 6a 76 32 20 3d 20  ME)));..  jv2 = 
ffa0: 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 6f  cson_value_new_o
ffb0: 62 6a 65 63 74 28 29 3b 0a 20 20 6a 6f 32 20 3d  bject();.  jo2 =
ffc0: 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 67 65 74 5f   cson_value_get_
ffd0: 6f 62 6a 65 63 74 28 6a 76 32 29 3b 0a 20 20 63  object(jv2);.  c
ffe0: 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 6a  son_object_set(j
fff0: 6f 2c 20 22 73 71 6c 69 74 65 22 2c 20 6a 76 32  o, "sqlite", jv2
10000 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  );.  sqlite3_snp
10010 72 69 6e 74 66 28 42 75 66 4c 65 6e 2c 20 7a 42  rintf(BufLen, zB
10020 75 66 2c 20 22 25 2e 31 39 73 20 5b 25 2e 31 30  uf, "%.19s [%.10
10030 73 5d 20 28 25 73 29 22 2c 0a 20 20 20 20 20 20  s] (%s)",.      
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
10050 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 2c 20 26  ITE_SOURCE_ID, &
10060 53 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44  SQLITE_SOURCE_ID
10070 5b 32 30 5d 2c 20 53 51 4c 49 54 45 5f 56 45 52  [20], SQLITE_VER
10080 53 49 4f 4e 29 3b 0a 20 20 53 45 54 42 55 46 28  SION);.  SETBUF(
10090 6a 6f 32 2c 20 22 76 65 72 73 69 6f 6e 22 29 3b  jo2, "version");
100a0 0a 20 20 7a 44 62 20 3d 20 64 62 5f 6e 61 6d 65  .  zDb = db_name
100b0 28 22 72 65 70 6f 73 69 74 6f 72 79 22 29 3b 0a  ("repository");.
100c0 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65    cson_object_se
100d0 74 28 6a 6f 32 2c 20 22 70 61 67 65 43 6f 75 6e  t(jo2, "pageCoun
100e0 74 22 2c 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e  t", cson_value_n
100f0 65 77 5f 69 6e 74 65 67 65 72 28 28 63 73 6f 6e  ew_integer((cson
10100 5f 69 6e 74 5f 74 29 64 62 5f 69 6e 74 28 30 2c  _int_t)db_int(0,
10110 20 22 50 52 41 47 4d 41 20 25 73 2e 70 61 67 65   "PRAGMA %s.page
10120 5f 63 6f 75 6e 74 22 2c 20 7a 44 62 29 29 29 3b  _count", zDb)));
10130 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73  .  cson_object_s
10140 65 74 28 6a 6f 32 2c 20 22 70 61 67 65 53 69 7a  et(jo2, "pageSiz
10150 65 22 2c 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e  e", cson_value_n
10160 65 77 5f 69 6e 74 65 67 65 72 28 28 63 73 6f 6e  ew_integer((cson
10170 5f 69 6e 74 5f 74 29 64 62 5f 69 6e 74 28 30 2c  _int_t)db_int(0,
10180 20 22 50 52 41 47 4d 41 20 25 73 2e 70 61 67 65   "PRAGMA %s.page
10190 5f 73 69 7a 65 22 2c 20 7a 44 62 29 29 29 3b 0a  _size", zDb)));.
101a0 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65    cson_object_se
101b0 74 28 6a 6f 32 2c 20 22 66 72 65 65 4c 69 73 74  t(jo2, "freeList
101c0 22 2c 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65  ", cson_value_ne
101d0 77 5f 69 6e 74 65 67 65 72 28 28 63 73 6f 6e 5f  w_integer((cson_
101e0 69 6e 74 5f 74 29 64 62 5f 69 6e 74 28 30 2c 20  int_t)db_int(0, 
101f0 22 50 52 41 47 4d 41 20 25 73 2e 66 72 65 65 6c  "PRAGMA %s.freel
10200 69 73 74 5f 63 6f 75 6e 74 22 2c 20 7a 44 62 29  ist_count", zDb)
10210 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ));.  sqlite3_sn
10220 70 72 69 6e 74 66 28 42 75 66 4c 65 6e 2c 20 7a  printf(BufLen, z
10230 42 75 66 2c 20 22 25 73 22 2c 20 64 62 5f 74 65  Buf, "%s", db_te
10240 78 74 28 30 2c 20 22 50 52 41 47 4d 41 20 25 73  xt(0, "PRAGMA %s
10250 2e 65 6e 63 6f 64 69 6e 67 22 2c 20 7a 44 62 29  .encoding", zDb)
10260 29 3b 0a 20 20 53 45 54 42 55 46 28 6a 6f 32 2c  );.  SETBUF(jo2,
10270 20 22 65 6e 63 6f 64 69 6e 67 22 29 3b 0a 20 20   "encoding");.  
10280 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
10290 28 42 75 66 4c 65 6e 2c 20 7a 42 75 66 2c 20 22  (BufLen, zBuf, "
102a0 25 73 22 2c 20 64 62 5f 74 65 78 74 28 30 2c 20  %s", db_text(0, 
102b0 22 50 52 41 47 4d 41 20 25 73 2e 6a 6f 75 72 6e  "PRAGMA %s.journ
102c0 61 6c 5f 6d 6f 64 65 22 2c 20 7a 44 62 29 29 3b  al_mode", zDb));
102d0 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73  .  cson_object_s
102e0 65 74 28 6a 6f 32 2c 20 22 6a 6f 75 72 6e 61 6c  et(jo2, "journal
102f0 4d 6f 64 65 22 2c 20 2a 7a 42 75 66 20 3f 20 63  Mode", *zBuf ? c
10300 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 73 74  son_value_new_st
10310 72 69 6e 67 28 7a 42 75 66 2c 20 73 74 72 6c 65  ring(zBuf, strle
10320 6e 28 7a 42 75 66 29 29 20 3a 20 63 73 6f 6e 5f  n(zBuf)) : cson_
10330 76 61 6c 75 65 5f 6e 75 6c 6c 28 29 29 3b 0a 20  value_null());. 
10340 20 72 65 74 75 72 6e 20 6a 76 3b 0a 23 75 6e 64   return jv;.#und
10350 65 66 20 53 45 54 42 55 46 0a 7d 0a 0a 0a 0a 0a  ef SETBUF.}.....
10360 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 73 20 61 20  /*.** Creates a 
10370 63 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 20  comma-separated 
10380 6c 69 73 74 20 6f 66 20 63 6f 6d 6d 61 6e 64 20  list of command 
10390 6e 61 6d 65 73 0a 2a 2a 20 74 61 6b 65 6e 20 66  names.** taken f
103a0 72 6f 6d 20 7a 50 61 67 65 73 2e 20 7a 50 61 67  rom zPages. zPag
103b0 65 73 20 6d 75 73 74 20 62 65 20 61 6e 20 61 72  es must be an ar
103c0 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 0a 2a  ray of objects.*
103d0 2a 20 77 68 6f 73 65 20 66 69 6e 61 6c 20 65 6e  * whose final en
103e0 74 72 79 20 4d 55 53 54 20 68 61 76 65 20 61 20  try MUST have a 
103f0 4e 55 4c 4c 20 6e 61 6d 65 20 76 61 6c 75 65 20  NULL name value 
10400 6f 72 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72  or results.** ar
10410 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  e undefined..**.
10420 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 61  ** The list is a
10430 70 70 65 6e 64 65 64 20 74 6f 20 70 4f 75 74 2e  ppended to pOut.
10440 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   The number of i
10450 74 65 6d 73 20 28 6e 6f 74 20 62 79 74 65 73 29  tems (not bytes)
10460 0a 2a 2a 20 61 70 70 65 6e 64 65 64 20 61 72 65  .** appended are
10470 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
10480 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 5f 70 61  atic int json_pa
10490 67 65 64 65 66 73 5f 74 6f 5f 73 74 72 69 6e 67  gedefs_to_string
104a0 28 4a 73 6f 6e 50 61 67 65 44 65 66 20 63 6f 6e  (JsonPageDef con
104b0 73 74 20 2a 20 7a 50 61 67 65 73 2c 0a 20 20 20  st * zPages,.   
104c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104e0 42 6c 6f 62 20 2a 20 70 4f 75 74 29 7b 0a 20 20  Blob * pOut){.  
104f0 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 66 6f 72  int i = 0;.  for
10500 28 20 3b 20 7a 50 61 67 65 73 2d 3e 6e 61 6d 65  ( ; zPages->name
10510 3b 20 2b 2b 7a 50 61 67 65 73 2c 20 2b 2b 69 20  ; ++zPages, ++i 
10520 29 7b 0a 20 20 20 20 69 66 28 67 2e 69 73 48 54  ){.    if(g.isHT
10530 54 50 20 26 26 20 7a 50 61 67 65 73 2d 3e 72 75  TP && zPages->ru
10540 6e 4d 6f 64 65 20 3c 20 30 29 20 63 6f 6e 74 69  nMode < 0) conti
10550 6e 75 65 3b 0a 20 20 20 20 65 6c 73 65 20 69 66  nue;.    else if
10560 28 7a 50 61 67 65 73 2d 3e 72 75 6e 4d 6f 64 65  (zPages->runMode
10570 20 3e 20 30 29 20 63 6f 6e 74 69 6e 75 65 3b 0a   > 0) continue;.
10580 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
10590 28 70 4f 75 74 2c 20 7a 50 61 67 65 73 2d 3e 6e  (pOut, zPages->n
105a0 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20 69 66  ame, -1);.    if
105b0 28 28 7a 50 61 67 65 73 2b 31 29 2d 3e 6e 61 6d  ((zPages+1)->nam
105c0 65 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61  e){.      blob_a
105d0 70 70 65 6e 64 28 70 4f 75 74 2c 20 22 2c 20 22  ppend(pOut, ", "
105e0 2c 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ,2);.    }.  }. 
105f0 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
10600 0a 2a 2a 20 43 72 65 61 74 65 73 20 61 6e 20 65  .** Creates an e
10610 72 72 6f 72 20 6d 65 73 73 61 67 65 20 75 73 69  rror message usi
10620 6e 67 20 7a 45 72 72 50 72 65 66 69 78 20 61 6e  ng zErrPrefix an
10630 64 20 74 68 65 20 67 69 76 65 6e 20 61 72 72 61  d the given arra
10640 79 20 6f 66 0a 2a 2a 20 4a 53 4f 4e 20 63 6f 6d  y of.** JSON com
10650 6d 61 6e 64 20 64 65 66 69 6e 69 74 69 6f 6e 73  mand definitions
10660 2c 20 61 6e 64 20 73 65 74 73 20 74 68 65 20 67  , and sets the g
10670 2e 6a 73 6f 6e 20 65 72 72 6f 72 20 73 74 61 74  .json error stat
10680 65 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20  e to.** reflect 
10690 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 4d 49 53 53 49  FSL_JSON_E_MISSI
106a0 4e 47 5f 41 52 47 53 2e 20 49 66 20 7a 45 72 72  NG_ARGS. If zErr
106b0 50 72 65 66 69 78 20 69 73 20 4e 55 4c 4c 20 74  Prefix is NULL t
106c0 68 65 6e 0a 2a 2a 20 73 6f 6d 65 20 64 65 66 61  hen.** some defa
106d0 75 6c 74 20 69 73 20 75 73 65 64 20 28 65 2e 67  ult is used (e.g
106e0 2e 20 22 54 72 79 20 6f 6e 65 20 6f 66 3a 20 22  . "Try one of: "
106f0 29 2e 20 49 66 20 69 74 20 69 73 20 22 22 20 74  ). If it is "" t
10700 68 65 6e 0a 2a 2a 20 6e 6f 20 70 72 65 66 69 78  hen.** no prefix
10710 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   is used..**.** 
10720 54 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 69 73  The intention is
10730 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
10740 75 73 65 72 20 28 76 69 61 20 74 68 65 20 72 65  user (via the re
10750 73 70 6f 6e 73 65 2e 72 65 73 75 6c 74 54 65 78  sponse.resultTex
10760 74 29 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20  t).** a list of 
10770 61 76 61 69 6c 61 62 6c 65 20 63 6f 6d 6d 61 6e  available comman
10780 64 73 2f 73 75 62 63 6f 6d 6d 61 6e 64 73 2e 0a  ds/subcommands..
10790 2a 2a 0a 2a 2f 0a 76 6f 69 64 20 6a 73 6f 6e 5f  **.*/.void json_
107a0 64 69 73 70 61 74 63 68 5f 6d 69 73 73 69 6e 67  dispatch_missing
107b0 5f 61 72 67 73 5f 65 72 72 28 20 4a 73 6f 6e 50  _args_err( JsonP
107c0 61 67 65 44 65 66 20 63 6f 6e 73 74 20 2a 20 70  ageDef const * p
107d0 43 6f 6d 6d 61 6e 64 73 2c 0a 20 20 20 20 20 20  Commands,.      
107e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
10800 68 61 72 20 63 6f 6e 73 74 20 2a 20 7a 45 72 72  har const * zErr
10810 50 72 65 66 69 78 20 29 7b 0a 20 20 42 6c 6f 62  Prefix ){.  Blob
10820 20 63 6d 64 4e 61 6d 65 73 20 3d 20 65 6d 70 74   cmdNames = empt
10830 79 5f 62 6c 6f 62 3b 0a 20 20 62 6c 6f 62 5f 69  y_blob;.  blob_i
10840 6e 69 74 28 26 63 6d 64 4e 61 6d 65 73 2c 4e 55  nit(&cmdNames,NU
10850 4c 4c 2c 30 29 3b 0a 20 20 69 66 28 20 21 7a 45  LL,0);.  if( !zE
10860 72 72 50 72 65 66 69 78 20 29 20 7b 0a 20 20 20  rrPrefix ) {.   
10870 20 7a 45 72 72 50 72 65 66 69 78 20 3d 20 22 54   zErrPrefix = "T
10880 72 79 20 6f 6e 65 20 6f 66 3a 20 22 3b 0a 20 20  ry one of: ";.  
10890 7d 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28  }.  blob_append(
108a0 20 26 63 6d 64 4e 61 6d 65 73 2c 20 7a 45 72 72   &cmdNames, zErr
108b0 50 72 65 66 69 78 2c 20 73 74 72 6c 65 6e 28 7a  Prefix, strlen(z
108c0 45 72 72 50 72 65 66 69 78 29 20 29 3b 0a 20 20  ErrPrefix) );.  
108d0 6a 73 6f 6e 5f 70 61 67 65 64 65 66 73 5f 74 6f  json_pagedefs_to
108e0 5f 73 74 72 69 6e 67 28 70 43 6f 6d 6d 61 6e 64  _string(pCommand
108f0 73 2c 20 26 63 6d 64 4e 61 6d 65 73 29 3b 0a 20  s, &cmdNames);. 
10900 20 6a 73 6f 6e 5f 73 65 74 5f 65 72 72 28 46 53   json_set_err(FS
10910 4c 5f 4a 53 4f 4e 5f 45 5f 4d 49 53 53 49 4e 47  L_JSON_E_MISSING
10920 5f 41 52 47 53 2c 20 22 25 73 22 2c 0a 20 20 20  _ARGS, "%s",.   
10930 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62              blob
10940 5f 73 74 72 28 26 63 6d 64 4e 61 6d 65 73 29 29  _str(&cmdNames))
10950 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26  ;.  blob_reset(&
10960 63 6d 64 4e 61 6d 65 73 29 3b 0a 7d 0a 0a 63 73  cmdNames);.}..cs
10970 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f  on_value * json_
10980 70 61 67 65 5f 64 69 73 70 61 74 63 68 5f 68 65  page_dispatch_he
10990 6c 70 65 72 28 4a 73 6f 6e 50 61 67 65 44 65 66  lper(JsonPageDef
109a0 20 63 6f 6e 73 74 20 2a 20 70 61 67 65 73 29 7b   const * pages){
109b0 0a 20 20 4a 73 6f 6e 50 61 67 65 44 65 66 20 63  .  JsonPageDef c
109c0 6f 6e 73 74 20 2a 20 64 65 66 3b 0a 20 20 63 68  onst * def;.  ch
109d0 61 72 20 63 6f 6e 73 74 20 2a 20 63 6d 64 20 3d  ar const * cmd =
109e0 20 6a 73 6f 6e 5f 63 6f 6d 6d 61 6e 64 5f 61 72   json_command_ar
109f0 67 28 31 2b 67 2e 6a 73 6f 6e 2e 64 69 73 70 61  g(1+g.json.dispa
10a00 74 63 68 44 65 70 74 68 29 3b 0a 20 20 61 73 73  tchDepth);.  ass
10a10 65 72 74 28 20 4e 55 4c 4c 20 21 3d 20 70 61 67  ert( NULL != pag
10a20 65 73 20 29 3b 0a 20 20 69 66 28 20 21 20 63 6d  es );.  if( ! cm
10a30 64 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 5f 64 69  d ){.    json_di
10a40 73 70 61 74 63 68 5f 6d 69 73 73 69 6e 67 5f 61  spatch_missing_a
10a50 72 67 73 5f 65 72 72 28 70 61 67 65 73 2c 0a 20  rgs_err(pages,. 
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a80 20 20 22 4e 6f 20 73 75 62 63 6f 6d 6d 61 6e 64    "No subcommand
10a90 20 73 70 65 63 69 66 69 65 64 2e 20 22 0a 20 20   specified. ".  
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ac0 20 22 54 72 79 20 6f 6e 65 20 6f 66 3a 20 22 29   "Try one of: ")
10ad0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ;.    return NUL
10ae0 4c 3b 0a 20 20 7d 0a 20 20 64 65 66 20 3d 20 6a  L;.  }.  def = j
10af0 73 6f 6e 5f 68 61 6e 64 6c 65 72 5f 66 6f 72 5f  son_handler_for_
10b00 6e 61 6d 65 28 20 63 6d 64 2c 20 70 61 67 65 73  name( cmd, pages
10b10 20 29 3b 0a 20 20 69 66 28 21 64 65 66 29 7b 0a   );.  if(!def){.
10b20 20 20 20 20 6a 73 6f 6e 5f 73 65 74 5f 65 72 72      json_set_err
10b30 28 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 55 4e 4b 4e  (FSL_JSON_E_UNKN
10b40 4f 57 4e 5f 43 4f 4d 4d 41 4e 44 2c 0a 20 20 20  OWN_COMMAND,.   
10b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55                "U
10b60 6e 6b 6e 6f 77 6e 20 73 75 62 63 6f 6d 6d 61 6e  nknown subcomman
10b70 64 3a 20 25 73 22 2c 20 63 6d 64 29 3b 0a 20 20  d: %s", cmd);.  
10b80 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20    return NULL;. 
10b90 20 7d 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 2b   }.  else{.    +
10ba0 2b 67 2e 6a 73 6f 6e 2e 64 69 73 70 61 74 63 68  +g.json.dispatch
10bb0 44 65 70 74 68 3b 0a 20 20 20 20 72 65 74 75 72  Depth;.    retur
10bc0 6e 20 28 2a 64 65 66 2d 3e 66 75 6e 63 29 28 29  n (*def->func)()
10bd0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
10be0 49 6d 70 6c 20 6f 66 20 2f 6a 73 6f 6e 2f 72 65  Impl of /json/re
10bf0 62 75 69 6c 64 2e 20 52 65 71 75 69 72 65 73 20  build. Requires 
10c00 61 64 6d 69 6e 20 70 72 65 76 69 6c 65 67 65 73  admin previleges
10c10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 73 6f 6e  ..*/.static cson
10c20 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 70 61  _value * json_pa
10c30 67 65 5f 72 65 62 75 69 6c 64 28 29 7b 0a 20 20  ge_rebuild(){.  
10c40 69 66 28 20 21 67 2e 70 65 72 6d 2e 41 64 6d 69  if( !g.perm.Admi
10c50 6e 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 5f 73 65  n ){.    json_se
10c60 74 5f 65 72 72 28 46 53 4c 5f 4a 53 4f 4e 5f 45  t_err(FSL_JSON_E
10c70 5f 44 45 4e 49 45 44 2c 22 52 65 71 75 69 72 65  _DENIED,"Require
10c80 73 20 27 61 27 20 70 72 69 76 69 6c 65 67 65 73  s 'a' privileges
10c90 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  .");.    return 
10ca0 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NULL;.  }else{. 
10cb0 20 2f 2a 20 52 65 6d 69 6e 64 65 72 3a 20 74 68   /* Reminder: th
10cc0 65 20 64 62 5f 78 78 78 28 29 20 6f 70 73 20 22  e db_xxx() ops "
10cd0 73 68 6f 75 6c 64 22 20 66 61 69 6c 20 76 69 61  should" fail via
10ce0 20 74 68 65 20 66 6f 73 73 69 6c 20 63 6f 72 65   the fossil core
10cf0 0a 20 20 20 20 20 65 72 72 6f 72 20 68 61 6e 64  .     error hand
10d00 6c 65 72 73 2c 20 77 68 69 63 68 20 77 69 6c 6c  lers, which will
10d10 20 63 61 75 73 65 20 61 20 4a 53 4f 4e 20 65 72   cause a JSON er
10d20 72 6f 72 20 61 6e 64 20 65 78 69 74 28 29 2e 20  ror and exit(). 
10d30 69 2e 65 2e 20 77 65 0a 20 20 20 20 20 64 6f 6e  i.e. we.     don
10d40 27 74 20 68 61 6e 64 6c 65 20 74 68 65 20 65 72  't handle the er
10d50 72 6f 72 73 20 68 65 72 65 2e 20 54 4f 44 4f 3a  rors here. TODO:
10d60 20 63 6f 6e 66 69 72 6d 20 74 68 61 74 20 61 6c   confirm that al
10d70 6c 20 74 68 65 73 65 20 64 62 0a 20 20 20 20 20  l these db.     
10d80 72 6f 75 74 69 6e 65 20 66 61 69 6c 20 67 72 61  routine fail gra
10d90 63 65 66 75 6c 6c 79 20 69 6e 20 4a 53 4f 4e 20  cefully in JSON 
10da0 6d 6f 64 65 2e 0a 0a 20 20 20 20 20 4f 6e 20 6c  mode...     On l
10db0 61 72 67 65 20 72 65 70 6f 73 20 28 65 2e 67 2e  arge repos (e.g.
10dc0 20 66 6f 73 73 69 6c 27 73 29 20 74 68 69 73 20   fossil's) this 
10dd0 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 6c 69 6b  operation is lik
10de0 65 6c 79 20 74 6f 20 74 61 6b 65 0a 20 20 20 20  ely to take.    
10df0 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65   longer than the
10e00 20 63 6c 69 65 6e 74 20 74 69 6d 65 6f 75 74 2c   client timeout,
10e10 20 77 68 69 63 68 20 77 69 6c 6c 20 63 61 75 73   which will caus
10e20 65 20 69 74 20 74 6f 20 66 61 69 6c 20 28 62 75  e it to fail (bu
10e30 74 0a 20 20 20 20 20 69 74 27 73 20 73 71 6c 69  t.     it's sqli
10e40 74 65 33 2c 20 73 6f 20 69 74 27 6c 6c 20 66 61  te3, so it'll fa
10e50 69 6c 20 67 72 61 63 65 66 75 6c 6c 79 29 2e 0a  il gracefully)..
10e60 20 20 2a 2f 0a 20 20 20 20 64 62 5f 63 6c 6f 73    */.    db_clos
10e70 65 28 31 29 3b 0a 20 20 20 20 64 62 5f 6f 70 65  e(1);.    db_ope
10e80 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 67 2e 7a  n_repository(g.z
10e90 52 65 70 6f 73 69 74 6f 72 79 4e 61 6d 65 29 3b  RepositoryName);
10ea0 0a 20 20 20 20 64 62 5f 62 65 67 69 6e 5f 74 72  .    db_begin_tr
10eb0 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 20  ansaction();.   
10ec0 20 72 65 62 75 69 6c 64 5f 64 62 28 30 2c 20 30   rebuild_db(0, 0
10ed0 2c 20 30 29 3b 0a 20 20 20 20 64 62 5f 65 6e 64  , 0);.    db_end
10ee0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 30 29 3b  _transaction(0);
10ef0 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
10f00 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
10f10 6d 70 6c 20 6f 66 20 2f 6a 73 6f 6e 2f 67 2e 20  mpl of /json/g. 
10f20 52 65 71 75 69 72 65 73 20 61 64 6d 69 6e 2f 73  Requires admin/s
10f30 65 74 75 70 20 72 69 67 68 74 73 2e 0a 2a 2f 0a  etup rights..*/.
10f40 73 74 61 74 69 63 20 63 73 6f 6e 5f 76 61 6c 75  static cson_valu
10f50 65 20 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f 67 28  e * json_page_g(
10f60 29 7b 0a 20 20 69 66 28 21 67 2e 70 65 72 6d 2e  ){.  if(!g.perm.
10f70 41 64 6d 69 6e 20 7c 7c 20 21 67 2e 70 65 72 6d  Admin || !g.perm
10f80 2e 53 65 74 75 70 29 7b 0a 20 20 20 20 6a 73 6f  .Setup){.    jso
10f90 6e 5f 73 65 74 5f 65 72 72 28 46 53 4c 5f 4a 53  n_set_err(FSL_JS
10fa0 4f 4e 5f 45 5f 44 45 4e 49 45 44 2c 0a 20 20 20  ON_E_DENIED,.   
10fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
10fc0 65 71 75 69 72 65 73 20 27 61 27 20 6f 72 20 27  equires 'a' or '
10fd0 73 27 20 70 72 69 76 69 6c 65 67 65 73 2e 22 29  s' privileges.")
10fe0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ;.    return NUL
10ff0 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  L;.  }.  return 
11000 6a 73 6f 6e 5f 67 5f 74 6f 5f 6a 73 6f 6e 28 29  json_g_to_json()
11010 3b 0a 7d 0a 0a 2f 2a 20 49 6d 70 6c 20 69 6e 20  ;.}../* Impl in 
11020 6a 73 6f 6e 5f 6c 6f 67 69 6e 2e 63 2e 20 2a 2f  json_login.c. */
11030 0a 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73  .cson_value * js
11040 6f 6e 5f 70 61 67 65 5f 61 6e 6f 6e 5f 70 61 73  on_page_anon_pas
11050 73 77 6f 72 64 28 29 3b 0a 2f 2a 20 49 6d 70 6c  sword();./* Impl
11060 20 69 6e 20 6a 73 6f 6e 5f 61 72 74 69 66 61 63   in json_artifac
11070 74 2e 63 2e 20 2a 2f 0a 63 73 6f 6e 5f 76 61 6c  t.c. */.cson_val
11080 75 65 20 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f 61  ue * json_page_a
11090 72 74 69 66 61 63 74 28 29 3b 0a 2f 2a 20 49 6d  rtifact();./* Im
110a0 70 6c 20 69 6e 20 6a 73 6f 6e 5f 62 72 61 6e 63  pl in json_branc
110b0 68 2e 63 2e 20 2a 2f 0a 63 73 6f 6e 5f 76 61 6c  h.c. */.cson_val
110c0 75 65 20 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f 62  ue * json_page_b
110d0 72 61 6e 63 68 28 29 3b 0a 2f 2a 20 49 6d 70 6c  ranch();./* Impl
110e0 20 69 6e 20 6a 73 6f 6e 5f 64 69 66 66 2e 63 2e   in json_diff.c.
110f0 20 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65 20 2a   */.cson_value *
11100 20 6a 73 6f 6e 5f 70 61 67 65 5f 64 69 66 66 28   json_page_diff(
11110 29 3b 0a 2f 2a 20 49 6d 70 6c 20 69 6e 20 6a 73  );./* Impl in js
11120 6f 6e 5f 64 69 72 2e 63 2e 20 2a 2f 0a 63 73 6f  on_dir.c. */.cso
11130 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 70  n_value * json_p
11140 61 67 65 5f 64 69 72 28 29 3b 0a 2f 2a 20 49 6d  age_dir();./* Im
11150 70 6c 20 69 6e 20 6a 73 6f 6e 5f 6c 6f 67 69 6e  pl in json_login
11160 2e 63 2e 20 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75  .c. */.cson_valu
11170 65 20 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f 6c 6f  e * json_page_lo
11180 67 69 6e 28 29 3b 0a 2f 2a 20 49 6d 70 6c 20 69  gin();./* Impl i
11190 6e 20 6a 73 6f 6e 5f 6c 6f 67 69 6e 2e 63 2e 20  n json_login.c. 
111a0 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20  */.cson_value * 
111b0 6a 73 6f 6e 5f 70 61 67 65 5f 6c 6f 67 6f 75 74  json_page_logout
111c0 28 29 3b 0a 2f 2a 20 49 6d 70 6c 20 69 6e 20 6a  ();./* Impl in j
111d0 73 6f 6e 5f 71 75 65 72 79 2e 63 2e 20 2a 2f 0a  son_query.c. */.
111e0 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f  cson_value * jso
111f0 6e 5f 70 61 67 65 5f 71 75 65 72 79 28 29 3b 0a  n_page_query();.
11200 2f 2a 20 49 6d 70 6c 20 69 6e 20 6a 73 6f 6e 5f  /* Impl in json_
11210 72 65 70 6f 72 74 2e 63 2e 20 2a 2f 0a 63 73 6f  report.c. */.cso
11220 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 70  n_value * json_p
11230 61 67 65 5f 72 65 70 6f 72 74 28 29 3b 0a 2f 2a  age_report();./*
11240 20 49 6d 70 6c 20 69 6e 20 6a 73 6f 6e 5f 74 61   Impl in json_ta
11250 67 2e 63 2e 20 2a 2f 0a 63 73 6f 6e 5f 76 61 6c  g.c. */.cson_val
11260 75 65 20 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f 74  ue * json_page_t
11270 61 67 28 29 3b 0a 2f 2a 20 49 6d 70 6c 20 69 6e  ag();./* Impl in
11280 20 6a 73 6f 6e 5f 75 73 65 72 2e 63 2e 20 2a 2f   json_user.c. */
11290 0a 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73  .cson_value * js
112a0 6f 6e 5f 70 61 67 65 5f 75 73 65 72 28 29 3b 0a  on_page_user();.
112b0 2f 2a 20 49 6d 70 6c 20 69 6e 20 6a 73 6f 6e 5f  /* Impl in json_
112c0 63 6f 6e 66 69 67 2e 63 2e 20 2a 2f 0a 63 73 6f  config.c. */.cso
112d0 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 70  n_value * json_p
112e0 61 67 65 5f 63 6f 6e 66 69 67 28 29 3b 0a 2f 2a  age_config();./*
112f0 20 49 6d 70 6c 20 69 6e 20 6a 73 6f 6e 5f 66 69   Impl in json_fi
11300 6e 66 6f 2e 63 2e 20 2a 2f 0a 63 73 6f 6e 5f 76  nfo.c. */.cson_v
11310 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 70 61 67 65  alue * json_page
11320 5f 66 69 6e 66 6f 28 29 3b 0a 0a 2f 2a 0a 2a 2a  _finfo();../*.**
11330 20 4d 61 70 70 69 6e 67 20 6f 66 20 6e 61 6d 65   Mapping of name
11340 73 20 74 6f 20 4a 53 4f 4e 20 70 61 67 65 73 2f  s to JSON pages/
11350 63 6f 6d 6d 61 6e 64 73 2e 20 20 45 61 63 68 20  commands.  Each 
11360 6e 61 6d 65 20 69 73 20 61 20 73 75 62 70 61 74  name is a subpat
11370 68 20 6f 66 0a 2a 2a 20 2f 6a 73 6f 6e 20 28 69  h of.** /json (i
11380 6e 20 43 47 49 20 6d 6f 64 65 29 20 6f 72 20 61  n CGI mode) or a
11390 20 73 75 62 63 6f 6d 6d 61 6e 64 20 6f 66 20 74   subcommand of t
113a0 68 65 20 6a 73 6f 6e 20 63 6f 6d 6d 61 6e 64 20  he json command 
113b0 69 6e 20 43 4c 49 20 6d 6f 64 65 0a 2a 2f 0a 73  in CLI mode.*/.s
113c0 74 61 74 69 63 20 63 6f 6e 73 74 20 4a 73 6f 6e  tatic const Json
113d0 50 61 67 65 44 65 66 20 4a 73 6f 6e 50 61 67 65  PageDef JsonPage
113e0 44 65 66 73 5b 5d 20 3d 20 7b 0a 2f 2a 20 70 6c  Defs[] = {./* pl
113f0 65 61 73 65 20 6b 65 65 70 20 61 6c 70 68 61 62  ease keep alphab
11400 65 74 69 63 61 6c 6c 79 20 73 6f 72 74 65 64 20  etically sorted 
11410 28 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76  (case-insensitiv
11420 65 29 20 66 6f 72 20 6d 61 69 6e 74 65 6e 61 6e  e) for maintenan
11430 63 65 20 72 65 61 73 6f 6e 73 2e 20 2a 2f 0a 7b  ce reasons. */.{
11440 22 61 6e 6f 6e 79 6d 6f 75 73 50 61 73 73 77 6f  "anonymousPasswo
11450 72 64 22 2c 20 6a 73 6f 6e 5f 70 61 67 65 5f 61  rd", json_page_a
11460 6e 6f 6e 5f 70 61 73 73 77 6f 72 64 2c 20 30 7d  non_password, 0}
11470 2c 0a 7b 22 61 72 74 69 66 61 63 74 22 2c 20 6a  ,.{"artifact", j
11480 73 6f 6e 5f 70 61 67 65 5f 61 72 74 69 66 61 63  son_page_artifac
11490 74 2c 20 30 7d 2c 0a 7b 22 62 72 61 6e 63 68 22  t, 0},.{"branch"
114a0 2c 20 6a 73 6f 6e 5f 70 61 67 65 5f 62 72 61 6e  , json_page_bran
114b0 63 68 2c 30 7d 2c 0a 7b 22 63 61 70 22 2c 20 6a  ch,0},.{"cap", j
114c0 73 6f 6e 5f 70 61 67 65 5f 63 61 70 2c 20 30 7d  son_page_cap, 0}
114d0 2c 0a 7b 22 63 6f 6e 66 69 67 22 2c 20 6a 73 6f  ,.{"config", jso
114e0 6e 5f 70 61 67 65 5f 63 6f 6e 66 69 67 2c 20 30  n_page_config, 0
114f0 20 7d 2c 0a 7b 22 64 69 66 66 22 2c 20 6a 73 6f   },.{"diff", jso
11500 6e 5f 70 61 67 65 5f 64 69 66 66 2c 20 30 7d 2c  n_page_diff, 0},
11510 0a 7b 22 64 69 72 22 2c 20 6a 73 6f 6e 5f 70 61  .{"dir", json_pa
11520 67 65 5f 64 69 72 2c 20 30 7d 2c 0a 7b 22 66 69  ge_dir, 0},.{"fi
11530 6e 66 6f 22 2c 20 6a 73 6f 6e 5f 70 61 67 65 5f  nfo", json_page_
11540 66 69 6e 66 6f 2c 20 30 7d 2c 0a 7b 22 67 22 2c  finfo, 0},.{"g",
11550 20 6a 73 6f 6e 5f 70 61 67 65 5f 67 2c 20 30 7d   json_page_g, 0}
11560 2c 0a 7b 22 48 41 49 22 2c 6a 73 6f 6e 5f 70 61  ,.{"HAI",json_pa
11570 67 65 5f 76 65 72 73 69 6f 6e 2c 30 7d 2c 0a 7b  ge_version,0},.{
11580 22 6c 6f 67 69 6e 22 2c 6a 73 6f 6e 5f 70 61 67  "login",json_pag
11590 65 5f 6c 6f 67 69 6e 2c 30 7d 2c 0a 7b 22 6c 6f  e_login,0},.{"lo
115a0 67 6f 75 74 22 2c 6a 73 6f 6e 5f 70 61 67 65 5f  gout",json_page_
115b0 6c 6f 67 6f 75 74 2c 30 7d 2c 0a 7b 22 71 75 65  logout,0},.{"que
115c0 72 79 22 2c 6a 73 6f 6e 5f 70 61 67 65 5f 71 75  ry",json_page_qu
115d0 65 72 79 2c 30 7d 2c 0a 7b 22 72 65 62 75 69 6c  ery,0},.{"rebuil
115e0 64 22 2c 6a 73 6f 6e 5f 70 61 67 65 5f 72 65 62  d",json_page_reb
115f0 75 69 6c 64 2c 30 7d 2c 0a 7b 22 72 65 70 6f 72  uild,0},.{"repor
11600 74 22 2c 20 6a 73 6f 6e 5f 70 61 67 65 5f 72 65  t", json_page_re
11610 70 6f 72 74 2c 20 30 7d 2c 0a 7b 22 72 65 73 75  port, 0},.{"resu
11620 6c 74 43 6f 64 65 73 22 2c 20 6a 73 6f 6e 5f 70  ltCodes", json_p
11630 61 67 65 5f 72 65 73 75 6c 74 43 6f 64 65 73 2c  age_resultCodes,
11640 30 7d 2c 0a 7b 22 73 74 61 74 22 2c 6a 73 6f 6e  0},.{"stat",json
11650 5f 70 61 67 65 5f 73 74 61 74 2c 30 7d 2c 0a 7b  _page_stat,0},.{
11660 22 74 61 67 22 2c 20 6a 73 6f 6e 5f 70 61 67 65  "tag", json_page
11670 5f 74 61 67 2c 30 7d 2c 0a 2f 2a 7b 22 74 69 63  _tag,0},./*{"tic
11680 6b 65 74 22 2c 20 6a 73 6f 6e 5f 70 61 67 65 5f  ket", json_page_
11690 6e 79 69 2c 30 7d 2c 2a 2f 0a 7b 22 74 69 6d 65  nyi,0},*/.{"time
116a0 6c 69 6e 65 22 2c 20 6a 73 6f 6e 5f 70 61 67 65  line", json_page
116b0 5f 74 69 6d 65 6c 69 6e 65 2c 30 7d 2c 0a 7b 22  _timeline,0},.{"
116c0 75 73 65 72 22 2c 6a 73 6f 6e 5f 70 61 67 65 5f  user",json_page_
116d0 75 73 65 72 2c 30 7d 2c 0a 7b 22 76 65 72 73 69  user,0},.{"versi
116e0 6f 6e 22 2c 6a 73 6f 6e 5f 70 61 67 65 5f 76 65  on",json_page_ve
116f0 72 73 69 6f 6e 2c 30 7d 2c 0a 7b 22 77 68 6f 61  rsion,0},.{"whoa
11700 6d 69 22 2c 6a 73 6f 6e 5f 70 61 67 65 5f 77 68  mi",json_page_wh
11710 6f 61 6d 69 2c 30 7d 2c 0a 7b 22 77 69 6b 69 22  oami,0},.{"wiki"
11720 2c 6a 73 6f 6e 5f 70 61 67 65 5f 77 69 6b 69 2c  ,json_page_wiki,
11730 30 7d 2c 0a 2f 2a 20 4c 61 73 74 20 65 6e 74 72  0},./* Last entr
11740 79 20 4d 55 53 54 20 68 61 76 65 20 61 20 4e 55  y MUST have a NU
11750 4c 4c 20 6e 61 6d 65 2e 20 2a 2f 0a 7b 4e 55 4c  LL name. */.{NUL
11760 4c 2c 4e 55 4c 4c 2c 30 7d 0a 7d 3b 0a 0a 2f 2a  L,NULL,0}.};../*
11770 0a 2a 2a 20 49 6e 74 65 72 6e 61 6c 20 68 65 6c  .** Internal hel
11780 70 65 72 20 66 6f 72 20 6a 73 6f 6e 5f 63 6d 64  per for json_cmd
11790 5f 74 6f 70 28 29 20 61 6e 64 20 6a 73 6f 6e 5f  _top() and json_
117a0 70 61 67 65 5f 74 6f 70 28 29 2e 0a 2a 2a 0a 2a  page_top()..**.*
117b0 2a 20 53 65 61 72 63 68 65 73 20 4a 73 6f 6e 50  * Searches JsonP
117c0 61 67 65 44 65 66 73 20 66 6f 72 20 61 20 63 6f  ageDefs for a co
117d0 6d 6d 61 6e 64 20 77 69 74 68 20 74 68 65 20 67  mmand with the g
117e0 69 76 65 6e 20 6e 61 6d 65 2e 20 49 66 20 66 6f  iven name. If fo
117f0 75 6e 64 2c 0a 2a 2a 20 69 74 20 69 73 20 75 73  und,.** it is us
11800 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
11810 6e 64 20 6f 75 74 70 75 74 20 61 20 4a 53 4f 4e  nd output a JSON
11820 20 72 65 73 70 6f 6e 73 65 2e 20 49 66 20 6e 6f   response. If no
11830 74 20 66 6f 75 6e 64 2c 20 69 74 0a 2a 2a 20 67  t found, it.** g
11840 65 6e 65 72 61 74 65 73 20 61 20 4a 53 4f 4e 2d  enerates a JSON-
11850 73 74 79 6c 65 20 65 72 72 6f 72 20 72 65 73 70  style error resp
11860 6f 6e 73 65 2e 20 52 65 74 75 72 6e 73 20 30 20  onse. Returns 0 
11870 6f 6e 20 73 75 63 63 65 73 73 2c 20 6e 6f 6e 2d  on success, non-
11880 30 0a 2a 2a 20 6f 6e 20 65 72 72 6f 72 2e 20 4f  0.** on error. O
11890 6e 20 65 72 72 6f 72 20 69 74 20 77 69 6c 6c 20  n error it will 
118a0 73 65 74 20 67 2e 6a 73 6f 6e 27 73 20 65 72 72  set g.json's err
118b0 6f 72 20 73 74 61 74 65 2e 0a 2a 2f 0a 73 74 61  or state..*/.sta
118c0 74 69 63 20 69 6e 74 20 6a 73 6f 6e 5f 64 69 73  tic int json_dis
118d0 70 61 74 63 68 5f 72 6f 6f 74 5f 63 6f 6d 6d 61  patch_root_comma
118e0 6e 64 28 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  nd( char const *
118f0 20 7a 43 6f 6d 6d 61 6e 64 20 29 7b 0a 20 20 69   zCommand ){.  i
11900 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 73 6f  nt rc = 0;.  cso
11910 6e 5f 76 61 6c 75 65 20 2a 20 70 61 79 6c 6f 61  n_value * payloa
11920 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 4a 73 6f 6e  d = NULL;.  Json
11930 50 61 67 65 44 65 66 20 63 6f 6e 73 74 20 2a 20  PageDef const * 
11940 70 61 67 65 44 65 66 20 3d 20 4e 55 4c 4c 3b 0a  pageDef = NULL;.
11950 20 20 70 61 67 65 44 65 66 20 3d 20 6a 73 6f 6e    pageDef = json
11960 5f 68 61 6e 64 6c 65 72 5f 66 6f 72 5f 6e 61 6d  _handler_for_nam
11970 65 28 7a 43 6f 6d 6d 61 6e 64 2c 26 4a 73 6f 6e  e(zCommand,&Json
11980 50 61 67 65 44 65 66 73 5b 30 5d 29 3b 0a 20 20  PageDefs[0]);.  
11990 69 66 28 20 21 20 70 61 67 65 44 65 66 20 29 7b  if( ! pageDef ){
119a0 0a 20 20 20 20 72 63 20 3d 20 46 53 4c 5f 4a 53  .    rc = FSL_JS
119b0 4f 4e 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 4f 4d  ON_E_UNKNOWN_COM
119c0 4d 41 4e 44 3b 0a 20 20 20 20 6a 73 6f 6e 5f 73  MAND;.    json_s
119d0 65 74 5f 65 72 72 28 20 72 63 2c 20 22 55 6e 6b  et_err( rc, "Unk
119e0 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 3a 20 25 73  nown command: %s
119f0 22 2c 20 7a 43 6f 6d 6d 61 6e 64 20 29 3b 0a 20  ", zCommand );. 
11a00 20 7d 65 6c 73 65 20 69 66 28 20 70 61 67 65 44   }else if( pageD
11a10 65 66 2d 3e 72 75 6e 4d 6f 64 65 20 3c 20 30 20  ef->runMode < 0 
11a20 2f 2a 43 4c 49 20 6f 6e 6c 79 2a 2f 29 7b 0a 20  /*CLI only*/){. 
11a30 20 20 20 72 63 20 3d 20 46 53 4c 5f 4a 53 4f 4e     rc = FSL_JSON
11a40 5f 45 5f 57 52 4f 4e 47 5f 4d 4f 44 45 3b 0a 20  _E_WRONG_MODE;. 
11a50 20 7d 65 6c 73 65 20 69 66 28 20 28 67 2e 69 73   }else if( (g.is
11a60 48 54 54 50 20 26 26 20 28 70 61 67 65 44 65 66  HTTP && (pageDef
11a70 2d 3e 72 75 6e 4d 6f 64 65 20 3c 20 30 20 2f 2a  ->runMode < 0 /*
11a80 43 4c 49 20 6f 6e 6c 79 2a 2f 29 29 0a 20 20 20  CLI only*/)).   
11a90 20 20 20 20 20 20 20 20 20 7c 7c 0a 20 20 20 20           ||.    
11aa0 20 20 20 20 20 20 20 20 28 21 67 2e 69 73 48 54          (!g.isHT
11ab0 54 50 20 26 26 20 28 70 61 67 65 44 65 66 2d 3e  TP && (pageDef->
11ac0 72 75 6e 4d 6f 64 65 20 3e 20 30 20 2f 2a 48 54  runMode > 0 /*HT
11ad0 54 50 20 6f 6e 6c 79 2a 2f 29 29 0a 20 20 20 20  TP only*/)).    
11ae0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 72          ){.    r
11af0 63 20 3d 20 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 57  c = FSL_JSON_E_W
11b00 52 4f 4e 47 5f 4d 4f 44 45 3b 0a 20 20 7d 0a 20  RONG_MODE;.  }. 
11b10 20 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20   else{.    rc = 
11b20 30 3b 0a 20 20 20 20 67 2e 6a 73 6f 6e 2e 64 69  0;.    g.json.di
11b30 73 70 61 74 63 68 44 65 70 74 68 20 3d 20 31 3b  spatchDepth = 1;
11b40 0a 20 20 20 20 70 61 79 6c 6f 61 64 20 3d 20 28  .    payload = (
11b50 2a 70 61 67 65 44 65 66 2d 3e 66 75 6e 63 29 28  *pageDef->func)(
11b60 29 3b 0a 20 20 7d 0a 20 20 70 61 79 6c 6f 61 64  );.  }.  payload
11b70 20 3d 20 6a 73 6f 6e 5f 63 72 65 61 74 65 5f 72   = json_create_r
11b80 65 73 70 6f 6e 73 65 28 72 63 2c 20 4e 55 4c 4c  esponse(rc, NULL
11b90 2c 20 70 61 79 6c 6f 61 64 29 3b 0a 20 20 6a 73  , payload);.  js
11ba0 6f 6e 5f 73 65 6e 64 5f 72 65 73 70 6f 6e 73 65  on_send_response
11bb0 28 70 61 79 6c 6f 61 64 29 3b 0a 20 20 63 73 6f  (payload);.  cso
11bc0 6e 5f 76 61 6c 75 65 5f 66 72 65 65 28 70 61 79  n_value_free(pay
11bd0 6c 6f 61 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  load);.  return 
11be0 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 46 4f  rc;.}..#ifdef FO
11bf0 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e  SSIL_ENABLE_JSON
11c00 20 2f 2a 20 64 75 70 65 20 69 66 64 65 66 20 6e   /* dupe ifdef n
11c10 65 65 64 65 64 20 66 6f 72 20 6d 6b 69 6e 64 65  eeded for mkinde
11c20 78 20 2a 2f 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41  x */./*.** WEBPA
11c30 47 45 3a 20 6a 73 6f 6e 0a 2a 2a 0a 2a 2a 20 50  GE: json.**.** P
11c40 61 67 65 73 20 75 6e 64 65 72 20 2f 6a 73 6f 6e  ages under /json
11c50 2f 2e 2e 2e 20 6d 75 73 74 20 62 65 20 65 6e 74  /... must be ent
11c60 65 72 65 64 20 69 6e 74 6f 20 4a 73 6f 6e 50 61  ered into JsonPa
11c70 67 65 44 65 66 73 2e 0a 2a 2a 20 54 68 69 73 20  geDefs..** This 
11c80 66 75 6e 63 74 69 6f 6e 20 64 69 73 70 61 74 63  function dispatc
11c90 68 65 73 20 74 68 65 6d 2c 20 61 6e 64 20 69 73  hes them, and is
11ca0 20 74 68 65 20 48 54 54 50 20 65 71 75 69 76 61   the HTTP equiva
11cb0 6c 65 6e 74 20 6f 66 0a 2a 2a 20 6a 73 6f 6e 5f  lent of.** json_
11cc0 63 6d 64 5f 74 6f 70 28 29 2e 0a 2a 2f 0a 76 6f  cmd_top()..*/.vo
11cd0 69 64 20 6a 73 6f 6e 5f 70 61 67 65 5f 74 6f 70  id json_page_top
11ce0 28 76 6f 69 64 29 7b 0a 20 20 63 68 61 72 20 63  (void){.  char c
11cf0 6f 6e 73 74 20 2a 20 7a 43 6f 6d 6d 61 6e 64 3b  onst * zCommand;
11d00 0a 20 20 42 45 47 49 4e 5f 54 49 4d 45 52 3b 0a  .  BEGIN_TIMER;.
11d10 20 20 6a 73 6f 6e 5f 6d 6f 64 65 5f 62 6f 6f 74    json_mode_boot
11d20 73 74 72 61 70 28 29 3b 0a 20 20 7a 43 6f 6d 6d  strap();.  zComm
11d30 61 6e 64 20 3d 20 6a 73 6f 6e 5f 63 6f 6d 6d 61  and = json_comma
11d40 6e 64 5f 61 72 67 28 31 29 3b 0a 20 20 69 66 28  nd_arg(1);.  if(
11d50 21 7a 43 6f 6d 6d 61 6e 64 20 7c 7c 20 21 2a 7a  !zCommand || !*z
11d60 43 6f 6d 6d 61 6e 64 29 7b 0a 20 20 20 20 6a 73  Command){.    js
11d70 6f 6e 5f 64 69 73 70 61 74 63 68 5f 6d 69 73 73  on_dispatch_miss
11d80 69 6e 67 5f 61 72 67 73 5f 65 72 72 28 20 4a 73  ing_args_err( Js
11d90 6f 6e 50 61 67 65 44 65 66 73 2c 0a 20 20 20 20  onPageDefs,.    
11da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dc0 22 4e 6f 20 63 6f 6d 6d 61 6e 64 20 28 73 75 62  "No command (sub
11dd0 2d 70 61 74 68 29 20 73 70 65 63 69 66 69 65 64  -path) specified
11de0 2e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  .".             
11df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e00 20 20 20 20 20 20 20 22 20 54 72 79 20 6f 6e 65         " Try one
11e10 20 6f 66 3a 20 22 29 3b 0a 20 20 20 20 72 65 74   of: ");.    ret
11e20 75 72 6e 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 5f  urn;.  }.  json_
11e30 64 69 73 70 61 74 63 68 5f 72 6f 6f 74 5f 63 6f  dispatch_root_co
11e40 6d 6d 61 6e 64 28 20 7a 43 6f 6d 6d 61 6e 64 20  mmand( zCommand 
11e50 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 46  );.}.#endif /* F
11e60 4f 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f  OSSIL_ENABLE_JSO
11e70 4e 20 66 6f 72 20 6d 6b 69 6e 64 65 78 20 2a 2f  N for mkindex */
11e80 0a 0a 23 69 66 64 65 66 20 46 4f 53 53 49 4c 5f  ..#ifdef FOSSIL_
11e90 45 4e 41 42 4c 45 5f 4a 53 4f 4e 20 2f 2a 20 64  ENABLE_JSON /* d
11ea0 75 70 65 20 69 66 64 65 66 20 6e 65 65 64 65 64  upe ifdef needed
11eb0 20 66 6f 72 20 6d 6b 69 6e 64 65 78 20 2a 2f 0a   for mkindex */.
11ec0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
11ed0 69 6f 6e 20 64 69 73 70 61 74 63 68 65 73 20 6a  ion dispatches j
11ee0 73 6f 6e 20 63 6f 6d 6d 61 6e 64 73 20 61 6e 64  son commands and
11ef0 20 69 73 20 74 68 65 20 43 4c 49 20 65 71 75 69   is the CLI equi
11f00 76 61 6c 65 6e 74 20 6f 66 0a 2a 2a 20 6a 73 6f  valent of.** jso
11f10 6e 5f 70 61 67 65 5f 74 6f 70 28 29 2e 0a 2a 2a  n_page_top()..**
11f20 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 6a 73 6f  .** COMMAND: jso
11f30 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 25  n.**.** Usage: %
11f40 66 6f 73 73 69 6c 20 6a 73 6f 6e 20 53 55 42 43  fossil json SUBC
11f50 4f 4d 4d 41 4e 44 20 3f 4f 50 54 49 4f 4e 53 3f  OMMAND ?OPTIONS?
11f60 0a 2a 2a 0a 2a 2a 20 49 6e 20 43 4c 49 20 6d 6f  .**.** In CLI mo
11f70 64 65 2c 20 74 68 65 20 2d 52 20 52 45 50 4f 20  de, the -R REPO 
11f80 63 6f 6d 6d 6f 6e 20 6f 70 74 69 6f 6e 20 69 73  common option is
11f90 20 73 75 70 70 6f 72 74 65 64 2e 20 44 75 65 20   supported. Due 
11fa0 74 6f 20 6c 69 6d 69 74 61 74 69 6f 6e 73 0a 2a  to limitations.*
11fb0 2a 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  * in the argumen
11fc0 74 20 64 69 73 70 61 74 63 68 69 6e 67 20 63 6f  t dispatching co
11fd0 64 65 2c 20 61 6e 79 20 2d 46 4c 41 47 53 20 6d  de, any -FLAGS m
11fe0 75 73 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74  ust come after t
11ff0 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 73 75 62 2d  he final.** sub-
12000 20 28 6f 72 20 73 75 62 73 75 62 2d 29 20 63 6f   (or subsub-) co
12010 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  mmand..**.** The
12020 20 63 6f 6d 6d 61 6e 64 73 20 69 6e 63 6c 75 64   commands includ
12030 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 6e 6f 6e 79  e:.**.**   anony
12040 6d 6f 75 73 50 61 73 73 6f 72 64 0a 2a 2a 20 20  mousPassord.**  
12050 20 61 72 74 69 66 61 63 74 0a 2a 2a 20 20 20 62   artifact.**   b
12060 72 61 6e 63 68 0a 2a 2a 20 20 20 63 61 70 0a 2a  ranch.**   cap.*
12070 2a 20 20 20 64 69 66 66 0a 2a 2a 20 20 20 67 0a  *   diff.**   g.
12080 2a 2a 20 20 20 6c 6f 67 69 6e 0a 2a 2a 20 20 20  **   login.**   
12090 6c 6f 67 6f 75 74 0a 2a 2a 20 20 20 71 75 65 72  logout.**   quer
120a0 79 0a 2a 2a 20 20 20 72 65 62 75 69 6c 64 0a 2a  y.**   rebuild.*
120b0 2a 20 20 20 72 65 70 6f 72 74 0a 2a 2a 20 20 20  *   report.**   
120c0 72 65 73 75 6c 74 43 6f 64 65 73 0a 2a 2a 20 20  resultCodes.**  
120d0 20 73 74 61 74 0a 2a 2a 20 20 20 74 61 67 0a 2a   stat.**   tag.*
120e0 2a 20 20 20 74 69 6d 65 6c 69 6e 65 0a 2a 2a 20  *   timeline.** 
120f0 20 20 75 73 65 72 0a 2a 2a 20 20 20 76 65 72 73    user.**   vers
12100 69 6f 6e 20 28 61 6c 69 61 73 3a 20 48 41 49 29  ion (alias: HAI)
12110 0a 2a 2a 20 20 20 77 68 6f 61 6d 69 0a 2a 2a 20  .**   whoami.** 
12120 20 20 77 69 6b 69 0a 2a 2a 0a 2a 2a 20 52 75 6e    wiki.**.** Run
12130 20 27 25 66 6f 73 73 69 6c 20 6a 73 6f 6e 27 20   '%fossil json' 
12140 77 69 74 68 6f 75 74 20 61 6e 79 20 73 75 62 63  without any subc
12150 6f 6d 6d 61 6e 64 20 74 6f 20 73 65 65 20 74 68  ommand to see th
12160 65 20 66 75 6c 6c 20 6c 69 73 74 20 28 62 75 74  e full list (but
12170 20 62 65 0a 2a 2a 20 61 77 61 72 65 20 74 68 61   be.** aware tha
12180 74 20 73 6f 6d 65 20 6c 69 73 74 65 64 20 6d 69  t some listed mi
12190 67 68 74 20 6e 6f 74 20 79 65 74 20 62 65 20 69  ght not yet be i
121a0 6d 70 6c 65 6d 65 6e 74 65 64 29 2e 0a 2a 2a 0a  mplemented)..**.
121b0 2a 2a 20 50 53 3a 20 74 68 65 20 6e 6f 74 61 62  ** PS: the notab
121c0 6c 65 20 54 4f 44 4f 2d 63 6f 6d 6d 61 6e 64 73  le TODO-commands
121d0 20 69 6e 63 6c 75 64 65 3a 20 63 6f 6e 66 69 67   include: config
121e0 2c 20 64 69 72 2c 20 66 69 6e 66 6f 2c 20 74 69  , dir, finfo, ti
121f0 63 6b 65 74 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20  cket.**.*/.void 
12200 6a 73 6f 6e 5f 63 6d 64 5f 74 6f 70 28 76 6f 69  json_cmd_top(voi
12210 64 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  d){.  char const
12220 20 2a 20 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20   * cmd = NULL;. 
12230 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 42   int rc = 0;.  B
12240 45 47 49 4e 5f 54 49 4d 45 52 3b 0a 20 20 6d 65  EGIN_TIMER;.  me
12250 6d 73 65 74 28 20 26 67 2e 70 65 72 6d 2c 20 30  mset( &g.perm, 0
12260 78 66 66 2c 20 73 69 7a 65 6f 66 28 67 2e 70 65  xff, sizeof(g.pe
12270 72 6d 29 20 29 0a 20 20 20 20 2f 2a 20 49 6e 20  rm) ).    /* In 
12280 43 4c 49 20 6d 6f 64 65 20 66 6f 73 73 69 6c 20  CLI mode fossil 
12290 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 70 65 72  does not use per
122a0 6d 69 73 73 69 6f 6e 73 0a 20 20 20 20 20 20 20  missions.       
122b0 61 6e 64 20 74 68 65 79 20 61 6c 6c 20 64 65 66  and they all def
122c0 61 75 6c 74 20 74 6f 20 66 61 6c 73 65 2e 20 57  ault to false. W
122d0 65 20 65 6e 61 62 6c 65 20 74 68 65 6d 0a 20 20  e enable them.  
122e0 20 20 20 20 20 68 65 72 65 20 62 65 63 61 75 73       here becaus
122f0 65 20 28 41 29 20 66 6f 73 73 69 6c 20 64 6f 65  e (A) fossil doe
12300 73 6e 27 74 20 75 73 65 20 74 68 65 6d 20 69 6e  sn't use them in
12310 20 6c 6f 63 61 6c 0a 20 20 20 20 20 20 20 6d 6f   local.       mo
12320 64 65 20 62 75 74 20 28 42 29 20 68 61 76 69 6e  de but (B) havin
12330 67 20 74 68 65 6d 20 73 65 74 20 67 69 76 65 73  g them set gives
12340 20 75 73 20 6f 6e 65 20 6c 65 73 73 0a 20 20 20   us one less.   
12350 20 20 20 20 64 69 66 66 65 72 65 6e 63 65 20 69      difference i
12360 6e 20 74 68 65 20 43 4c 49 2f 43 47 49 2f 53 65  n the CLI/CGI/Se
12370 72 76 65 72 2d 6d 6f 64 65 20 4a 53 4f 4e 0a 20  rver-mode JSON. 
12380 20 20 20 20 20 20 68 61 6e 64 6c 69 6e 67 2e 0a        handling..
12390 20 20 20 20 2a 2f 0a 20 20 20 20 3b 0a 20 20 6a      */.    ;.  j
123a0 73 6f 6e 5f 6d 61 69 6e 5f 62 6f 6f 74 73 74 72  son_main_bootstr
123b0 61 70 28 29 3b 0a 20 20 6a 73 6f 6e 5f 6d 6f 64  ap();.  json_mod
123c0 65 5f 62 6f 6f 74 73 74 72 61 70 28 29 3b 0a 20  e_bootstrap();. 
123d0 20 69 66 28 20 32 20 3e 20 63 73 6f 6e 5f 61 72   if( 2 > cson_ar
123e0 72 61 79 5f 6c 65 6e 67 74 68 5f 67 65 74 28 67  ray_length_get(g
123f0 2e 6a 73 6f 6e 2e 63 6d 64 2e 61 29 20 29 7b 0a  .json.cmd.a) ){.
12400 20 20 20 20 67 6f 74 6f 20 75 73 61 67 65 3b 0a      goto usage;.
12410 20 20 7d 0a 23 69 66 20 30 0a 20 20 6a 73 6f 6e    }.#if 0.  json
12420 5f 77 61 72 6e 28 46 53 4c 5f 4a 53 4f 4e 5f 57  _warn(FSL_JSON_W
12430 5f 52 4f 57 5f 54 4f 5f 4a 53 4f 4e 5f 46 41 49  _ROW_TO_JSON_FAI
12440 4c 45 44 2c 20 22 4a 75 73 74 20 74 65 73 74 69  LED, "Just testi
12450 6e 67 2e 22 29 3b 0a 20 20 6a 73 6f 6e 5f 77 61  ng.");.  json_wa
12460 72 6e 28 46 53 4c 5f 4a 53 4f 4e 5f 57 5f 52 4f  rn(FSL_JSON_W_RO
12470 57 5f 54 4f 5f 4a 53 4f 4e 5f 46 41 49 4c 45 44  W_TO_JSON_FAILED
12480 2c 20 22 4a 75 73 74 20 74 65 73 74 69 6e 67 20  , "Just testing 
12490 61 67 61 69 6e 2e 22 29 3b 0a 23 65 6e 64 69 66  again.");.#endif
124a0 0a 20 20 63 6d 64 20 3d 20 6a 73 6f 6e 5f 63 6f  .  cmd = json_co
124b0 6d 6d 61 6e 64 5f 61 72 67 28 31 29 3b 0a 20 20  mmand_arg(1);.  
124c0 69 66 28 20 21 63 6d 64 20 7c 7c 20 21 2a 63 6d  if( !cmd || !*cm
124d0 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 75 73  d ){.    goto us
124e0 61 67 65 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  age;.  }.  rc = 
124f0 6a 73 6f 6e 5f 64 69 73 70 61 74 63 68 5f 72 6f  json_dispatch_ro
12500 6f 74 5f 63 6f 6d 6d 61 6e 64 28 20 63 6d 64 20  ot_command( cmd 
12510 29 3b 0a 20 20 69 66 28 30 20 21 3d 20 72 63 29  );.  if(0 != rc)
12520 7b 0a 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a 20  {.    /* FIXME: 
12530 77 65 20 6e 65 65 64 20 61 20 77 61 79 20 6f 66  we need a way of
12540 20 70 61 73 73 69 6e 67 20 74 68 69 73 20 65 72   passing this er
12550 72 6f 72 20 62 61 63 6b 0a 20 20 20 20 20 20 20  ror back.       
12560 75 70 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e  up to the routin
12570 65 20 77 68 69 63 68 20 63 61 6c 6c 65 64 20 74  e which called t
12580 68 69 73 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 20  his callback..  
12590 20 20 20 20 20 65 2e 67 2e 20 61 64 64 20 67 2e       e.g. add g.
125a0 65 72 72 43 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a  errCode..    */.
125b0 20 20 20 20 66 6f 73 73 69 6c 5f 65 78 69 74 28      fossil_exit(
125c0 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
125d0 3b 0a 20 20 75 73 61 67 65 3a 0a 20 20 7b 0a 20  ;.  usage:.  {. 
125e0 20 20 20 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20     cson_value * 
125f0 70 61 79 6c 6f 61 64 3b 0a 20 20 20 20 6a 73 6f  payload;.    jso
12600 6e 5f 64 69 73 70 61 74 63 68 5f 6d 69 73 73 69  n_dispatch_missi
12610 6e 67 5f 61 72 67 73 5f 65 72 72 28 20 4a 73 6f  ng_args_err( Jso
12620 6e 50 61 67 65 44 65 66 73 2c 0a 20 20 20 20 20  nPageDefs,.     
12630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
12650 4e 6f 20 73 75 62 63 6f 6d 6d 61 6e 64 20 73 70  No subcommand sp
12660 65 63 69 66 69 65 64 2e 22 0a 20 20 20 20 20 20  ecified.".      
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
12690 54 72 79 20 6f 6e 65 20 6f 66 3a 20 22 29 3b 0a  Try one of: ");.
126a0 20 20 20 20 70 61 79 6c 6f 61 64 20 3d 20 6a 73      payload = js
126b0 6f 6e 5f 63 72 65 61 74 65 5f 72 65 73 70 6f 6e  on_create_respon
126c0 73 65 28 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  se(0, NULL, NULL
126d0 29 3b 0a 20 20 20 20 6a 73 6f 6e 5f 73 65 6e 64  );.    json_send
126e0 5f 72 65 73 70 6f 6e 73 65 28 70 61 79 6c 6f 61  _response(payloa
126f0 64 29 3b 0a 20 20 20 20 63 73 6f 6e 5f 76 61 6c  d);.    cson_val
12700 75 65 5f 66 72 65 65 28 70 61 79 6c 6f 61 64 29  ue_free(payload)
12710 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 65 78 69  ;.    fossil_exi
12720 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  t(1);.  }.}.#end
12730 69 66 20 2f 2a 20 46 4f 53 53 49 4c 5f 45 4e 41  if /* FOSSIL_ENA
12740 42 4c 45 5f 4a 53 4f 4e 20 66 6f 72 20 6d 6b 69  BLE_JSON for mki
12750 6e 64 65 78 20 2a 2f 0a 0a 23 65 6e 64 69 66 20  ndex */..#endif 
12760 2f 2a 20 46 4f 53 53 49 4c 5f 45 4e 41 42 4c 45  /* FOSSIL_ENABLE
12770 5f 4a 53 4f 4e 20 2a 2f 0a 0a 2f 2a 20 0a 20 2a  _JSON */../* . *
12780 20 76 69 6d 3a 74 73 3d 32 3a 73 74 73 3d 32 3a   vim:ts=2:sts=2:
12790 65 74 3a 73 77 3d 32 3a 66 74 3d 63 20 0a 20 2a  et:sw=2:ft=c . *
127a0 2f 0a 0a                                         /..