Fossil

Hex Artifact Content
Login

Artifact 737e847b642d2bc9556de6b587ae7612dee7b9c4:


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 46 53 45 54 28 46 4f 53  a) );.  FSET(FOS
e820: 53 49 4c 5f 4a 53 4f 4e 5f 41 50 49 5f 56 45 52  SIL_JSON_API_VER
e830: 53 49 4f 4e 2c 20 22 6a 73 6f 6e 41 70 69 56 65  SION, "jsonApiVe
e840: 72 73 69 6f 6e 22 20 29 3b 0a 23 75 6e 64 65 66  rsion" );.#undef
e850: 20 46 53 45 54 0a 20 20 72 65 74 75 72 6e 20 6a   FSET.  return j
e860: 76 61 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  val;.}.../*.** R
e870: 65 74 75 72 6e 73 20 74 68 65 20 63 75 72 72 65  eturns the curre
e880: 6e 74 20 75 73 65 72 27 73 20 63 61 70 61 62 69  nt user's capabi
e890: 6c 69 74 69 65 73 20 73 74 72 69 6e 67 20 61 73  lities string as
e8a0: 20 61 20 53 74 72 69 6e 67 20 76 61 6c 75 65 2e   a String value.
e8b0: 0a 2a 2a 20 52 65 74 75 72 6e 65 64 20 76 61 6c  .** Returned val
e8c0: 75 65 20 69 73 20 6f 77 6e 65 64 20 62 79 20 74  ue is owned by t
e8d0: 68 65 20 63 61 6c 6c 65 72 2c 20 61 6e 64 20 77  he caller, and w
e8e0: 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 4e 55 4c 4c  ill only be NULL
e8f0: 20 69 66 0a 2a 2a 20 67 2e 75 73 65 72 55 69 64   if.** g.userUid
e900: 20 69 73 20 69 6e 76 61 6c 69 64 20 6f 72 20 61   is invalid or a
e910: 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  n out of memory 
e920: 65 72 72 6f 72 2e 20 4f 72 2c 20 69 74 20 74 75  error. Or, it tu
e930: 72 6e 73 20 6f 75 74 2c 0a 2a 2a 20 69 6e 20 43  rns out,.** in C
e940: 4c 49 20 6d 6f 64 65 20 28 77 68 65 72 65 20 74  LI mode (where t
e950: 68 65 72 65 20 69 73 20 6e 6f 20 6c 6f 67 67 65  here is no logge
e960: 64 2d 69 6e 20 75 73 65 72 29 2e 0a 2a 2f 0a 63  d-in user)..*/.c
e970: 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e  son_value * json
e980: 5f 63 61 70 5f 76 61 6c 75 65 28 29 7b 0a 20 20  _cap_value(){.  
e990: 69 66 28 67 2e 75 73 65 72 55 69 64 3c 3d 30 29  if(g.userUid<=0)
e9a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  {.    return NUL
e9b0: 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
e9c0: 53 74 6d 74 20 71 20 3d 20 65 6d 70 74 79 5f 53  Stmt q = empty_S
e9d0: 74 6d 74 3b 0a 20 20 20 20 63 73 6f 6e 5f 76 61  tmt;.    cson_va
e9e0: 6c 75 65 20 2a 20 76 61 6c 20 3d 20 4e 55 4c 4c  lue * val = NULL
e9f0: 3b 0a 20 20 20 20 64 62 5f 70 72 65 70 61 72 65  ;.    db_prepare
ea00: 28 26 71 2c 20 22 53 45 4c 45 43 54 20 63 61 70  (&q, "SELECT cap
ea10: 20 46 52 4f 4d 20 75 73 65 72 20 57 48 45 52 45   FROM user WHERE
ea20: 20 75 69 64 3d 25 64 22 2c 20 67 2e 75 73 65 72   uid=%d", g.user
ea30: 55 69 64 29 3b 0a 20 20 20 20 69 66 28 20 64 62  Uid);.    if( db
ea40: 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54  _step(&q)==SQLIT
ea50: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 63  E_ROW ){.      c
ea60: 68 61 72 20 63 6f 6e 73 74 20 2a 20 73 74 72 20  har const * str 
ea70: 3d 20 28 63 68 61 72 20 63 6f 6e 73 74 20 2a 29  = (char const *)
ea80: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
ea90: 65 78 74 28 71 2e 70 53 74 6d 74 2c 30 29 3b 0a  ext(q.pStmt,0);.
eaa0: 20 20 20 20 20 20 69 66 28 20 73 74 72 20 29 7b        if( str ){
eab0: 0a 20 20 20 20 20 20 20 20 76 61 6c 20 3d 20 6a  .        val = j
eac0: 73 6f 6e 5f 6e 65 77 5f 73 74 72 69 6e 67 28 73  son_new_string(s
ead0: 74 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  tr);.      }.   
eae0: 20 7d 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69   }.    db_finali
eaf0: 7a 65 28 26 71 29 3b 0a 20 20 20 20 72 65 74 75  ze(&q);.    retu
eb00: 72 6e 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  rn val;.  }.}../
eb10: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
eb20: 69 6f 6e 20 66 6f 72 20 2f 6a 73 6f 6e 2f 63 61  ion for /json/ca
eb30: 70 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 65 64  p.**.** Returned
eb40: 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73   object contains
eb50: 20 64 65 74 61 69 6c 73 20 61 62 6f 75 74 20 74   details about t
eb60: 68 65 20 22 63 61 70 61 62 69 6c 69 74 69 65 73  he "capabilities
eb70: 22 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72  " of the.** curr
eb80: 65 6e 74 20 75 73 65 72 20 28 77 68 61 74 20 68  ent user (what h
eb90: 65 20 6d 61 79 2f 6d 61 79 20 6e 6f 74 20 64 6f  e may/may not do
eba0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  )..**.** This is
ebb0: 20 70 72 69 6d 61 72 69 6c 79 20 69 6e 74 65 6e   primarily inten
ebc0: 64 65 64 20 66 6f 72 20 64 65 62 75 67 67 65 72  ded for debugger
ebd0: 69 6e 67 2c 20 62 75 74 20 6d 61 79 20 68 61 76  ing, but may hav
ebe0: 65 0a 2a 2a 20 61 20 75 73 65 20 69 6e 20 63 6c  e.** a use in cl
ebf0: 69 65 6e 74 20 63 6f 64 65 2e 20 28 3f 29 0a 2a  ient code. (?).*
ec00: 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a  /.cson_value * j
ec10: 73 6f 6e 5f 70 61 67 65 5f 63 61 70 28 29 7b 0a  son_page_cap(){.
ec20: 20 20 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 70    cson_value * p
ec30: 61 79 6c 6f 61 64 20 3d 20 63 73 6f 6e 5f 76 61  ayload = cson_va
ec40: 6c 75 65 5f 6e 65 77 5f 6f 62 6a 65 63 74 28 29  lue_new_object()
ec50: 3b 0a 20 20 63 73 6f 6e 5f 76 61 6c 75 65 20 2a  ;.  cson_value *
ec60: 20 73 75 62 20 3d 20 63 73 6f 6e 5f 76 61 6c 75   sub = cson_valu
ec70: 65 5f 6e 65 77 5f 6f 62 6a 65 63 74 28 29 3b 0a  e_new_object();.
ec80: 20 20 53 74 6d 74 20 71 3b 0a 20 20 63 73 6f 6e    Stmt q;.  cson
ec90: 5f 6f 62 6a 65 63 74 20 2a 20 6f 62 6a 20 3d 20  _object * obj = 
eca0: 63 73 6f 6e 5f 76 61 6c 75 65 5f 67 65 74 5f 6f  cson_value_get_o
ecb0: 62 6a 65 63 74 28 70 61 79 6c 6f 61 64 29 3b 0a  bject(payload);.
ecc0: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c    db_prepare(&q,
ecd0: 20 22 53 45 4c 45 43 54 20 6c 6f 67 69 6e 2c 20   "SELECT login, 
ece0: 63 61 70 20 46 52 4f 4d 20 75 73 65 72 20 57 48  cap FROM user WH
ecf0: 45 52 45 20 75 69 64 3d 25 64 22 2c 20 67 2e 75  ERE uid=%d", g.u
ed00: 73 65 72 55 69 64 29 3b 0a 20 20 69 66 28 20 64  serUid);.  if( d
ed10: 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49  b_step(&q)==SQLI
ed20: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 2f 2a  TE_ROW ){.    /*
ed30: 20 72 65 6d 69 6e 64 65 72 3a 20 77 65 20 64 6f   reminder: we do
ed40: 6e 27 74 20 75 73 65 20 67 2e 7a 4c 6f 67 69 6e  n't use g.zLogin
ed50: 20 62 65 63 61 75 73 65 20 69 74 27 73 20 30 20   because it's 0 
ed60: 66 6f 72 20 74 68 65 20 67 75 65 73 74 0a 20 20  for the guest.  
ed70: 20 20 20 20 20 75 73 65 72 20 61 6e 64 20 74 68       user and th
ed80: 65 20 48 54 4d 4c 20 55 49 20 61 70 70 65 61 72  e HTML UI appear
ed90: 73 20 74 6f 20 63 75 72 72 65 6e 74 6c 79 20 61  s to currently a
eda0: 6c 6c 6f 77 20 74 68 65 20 6e 61 6d 65 20 74 6f  llow the name to
edb0: 20 62 65 0a 20 20 20 20 20 20 20 63 68 61 6e 67   be.       chang
edc0: 65 64 20 28 62 75 74 20 64 6f 69 6e 67 20 73 6f  ed (but doing so
edd0: 20 77 6f 75 6c 64 20 62 72 65 61 6b 20 6f 74 68   would break oth
ede0: 65 72 20 63 6f 64 65 29 2e 20 2a 2f 0a 20 20 20  er code). */.   
edf0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 73 74   char const * st
ee00: 72 20 3d 20 28 63 68 61 72 20 63 6f 6e 73 74 20  r = (char const 
ee10: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
ee20: 5f 74 65 78 74 28 71 2e 70 53 74 6d 74 2c 30 29  _text(q.pStmt,0)
ee30: 3b 0a 20 20 20 20 69 66 28 20 73 74 72 20 29 7b  ;.    if( str ){
ee40: 0a 20 20 20 20 20 20 63 73 6f 6e 5f 6f 62 6a 65  .      cson_obje
ee50: 63 74 5f 73 65 74 28 20 6f 62 6a 2c 20 22 6e 61  ct_set( obj, "na
ee60: 6d 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me",.           
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 63 73 6f 6e              cson
ee80: 5f 76 61 6c 75 65 5f 6e 65 77 5f 73 74 72 69 6e  _value_new_strin
ee90: 67 28 73 74 72 2c 73 74 72 6c 65 6e 28 73 74 72  g(str,strlen(str
eea0: 29 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  )) );.    }.    
eeb0: 73 74 72 20 3d 20 28 63 68 61 72 20 63 6f 6e 73  str = (char cons
eec0: 74 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  t *)sqlite3_colu
eed0: 6d 6e 5f 74 65 78 74 28 71 2e 70 53 74 6d 74 2c  mn_text(q.pStmt,
eee0: 31 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 20  1);.    if( str 
eef0: 29 7b 0a 20 20 20 20 20 20 63 73 6f 6e 5f 6f 62  ){.      cson_ob
ef00: 6a 65 63 74 5f 73 65 74 28 20 6f 62 6a 2c 20 22  ject_set( obj, "
ef10: 63 61 70 61 62 69 6c 69 74 69 65 73 22 2c 0a 20  capabilities",. 
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef30: 20 20 20 20 20 20 63 73 6f 6e 5f 76 61 6c 75 65        cson_value
ef40: 5f 6e 65 77 5f 73 74 72 69 6e 67 28 73 74 72 2c  _new_string(str,
ef50: 73 74 72 6c 65 6e 28 73 74 72 29 29 20 29 3b 0a  strlen(str)) );.
ef60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 5f 66      }.  }.  db_f
ef70: 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 63  inalize(&q);.  c
ef80: 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 20  son_object_set( 
ef90: 6f 62 6a 2c 20 22 70 65 72 6d 69 73 73 69 6f 6e  obj, "permission
efa0: 46 6c 61 67 73 22 2c 20 73 75 62 20 29 3b 0a 20  Flags", sub );. 
efb0: 20 6f 62 6a 20 3d 20 63 73 6f 6e 5f 76 61 6c 75   obj = cson_valu
efc0: 65 5f 67 65 74 5f 6f 62 6a 65 63 74 28 73 75 62  e_get_object(sub
efd0: 29 3b 0a 0a 23 64 65 66 69 6e 65 20 41 44 44 28  );..#define ADD(
efe0: 58 2c 4b 29 20 63 73 6f 6e 5f 6f 62 6a 65 63 74  X,K) cson_object
eff0: 5f 73 65 74 28 6f 62 6a 2c 20 4b 2c 20 63 73 6f  _set(obj, K, cso
f000: 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 62 6f 6f 6c  n_value_new_bool
f010: 28 67 2e 70 65 72 6d 2e 58 29 29 0a 20 20 41 44  (g.perm.X)).  AD
f020: 44 28 53 65 74 75 70 2c 22 73 65 74 75 70 22 29  D(Setup,"setup")
f030: 3b 0a 20 20 41 44 44 28 41 64 6d 69 6e 2c 22 61  ;.  ADD(Admin,"a
f040: 64 6d 69 6e 22 29 3b 0a 20 20 41 44 44 28 44 65  dmin");.  ADD(De
f050: 6c 65 74 65 2c 22 64 65 6c 65 74 65 22 29 3b 0a  lete,"delete");.
f060: 20 20 41 44 44 28 50 61 73 73 77 6f 72 64 2c 22    ADD(Password,"
f070: 70 61 73 73 77 6f 72 64 22 29 3b 0a 20 20 41 44  password");.  AD
f080: 44 28 51 75 65 72 79 2c 22 71 75 65 72 79 22 29  D(Query,"query")
f090: 3b 20 2f 2a 20 64 6f 6e 27 74 20 74 68 69 6e 6b  ; /* don't think
f0a0: 20 74 68 69 73 20 6f 6e 65 20 69 73 20 61 63 74   this one is act
f0b0: 75 61 6c 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20  ually used */.  
f0c0: 41 44 44 28 57 72 69 74 65 2c 22 63 68 65 63 6b  ADD(Write,"check
f0d0: 69 6e 22 29 3b 0a 20 20 41 44 44 28 52 65 61 64  in");.  ADD(Read
f0e0: 2c 22 63 68 65 63 6b 6f 75 74 22 29 3b 0a 20 20  ,"checkout");.  
f0f0: 41 44 44 28 48 69 73 74 6f 72 79 2c 22 68 69 73  ADD(History,"his
f100: 74 6f 72 79 22 29 3b 0a 20 20 41 44 44 28 43 6c  tory");.  ADD(Cl
f110: 6f 6e 65 2c 22 63 6c 6f 6e 65 22 29 3b 0a 20 20  one,"clone");.  
f120: 41 44 44 28 52 64 57 69 6b 69 2c 22 72 65 61 64  ADD(RdWiki,"read
f130: 57 69 6b 69 22 29 3b 0a 20 20 41 44 44 28 4e 65  Wiki");.  ADD(Ne
f140: 77 57 69 6b 69 2c 22 63 72 65 61 74 65 57 69 6b  wWiki,"createWik
f150: 69 22 29 3b 0a 20 20 41 44 44 28 41 70 6e 64 57  i");.  ADD(ApndW
f160: 69 6b 69 2c 22 61 70 70 65 6e 64 57 69 6b 69 22  iki,"appendWiki"
f170: 29 3b 0a 20 20 41 44 44 28 57 72 57 69 6b 69 2c  );.  ADD(WrWiki,
f180: 22 65 64 69 74 57 69 6b 69 22 29 3b 0a 20 20 41  "editWiki");.  A
f190: 44 44 28 52 64 54 6b 74 2c 22 72 65 61 64 54 69  DD(RdTkt,"readTi
f1a0: 63 6b 65 74 22 29 3b 0a 20 20 41 44 44 28 4e 65  cket");.  ADD(Ne
f1b0: 77 54 6b 74 2c 22 63 72 65 61 74 65 54 69 63 6b  wTkt,"createTick
f1c0: 65 74 22 29 3b 0a 20 20 41 44 44 28 41 70 6e 64  et");.  ADD(Apnd
f1d0: 54 6b 74 2c 22 61 70 70 65 6e 64 54 69 63 6b 65  Tkt,"appendTicke
f1e0: 74 22 29 3b 0a 20 20 41 44 44 28 57 72 54 6b 74  t");.  ADD(WrTkt
f1f0: 2c 22 65 64 69 74 54 69 63 6b 65 74 22 29 3b 0a  ,"editTicket");.
f200: 20 20 41 44 44 28 41 74 74 61 63 68 2c 22 61 74    ADD(Attach,"at
f210: 74 61 63 68 46 69 6c 65 22 29 3b 0a 20 20 41 44  tachFile");.  AD
f220: 44 28 54 6b 74 46 6d 74 2c 22 63 72 65 61 74 65  D(TktFmt,"create
f230: 54 69 63 6b 65 74 52 65 70 6f 72 74 22 29 3b 0a  TicketReport");.
f240: 20 20 41 44 44 28 52 64 41 64 64 72 2c 22 72 65    ADD(RdAddr,"re
f250: 61 64 50 72 69 76 61 74 65 22 29 3b 0a 20 20 41  adPrivate");.  A
f260: 44 44 28 5a 69 70 2c 22 7a 69 70 22 29 3b 0a 20  DD(Zip,"zip");. 
f270: 20 41 44 44 28 50 72 69 76 61 74 65 2c 22 78 66   ADD(Private,"xf
f280: 65 72 50 72 69 76 61 74 65 22 29 3b 0a 23 75 6e  erPrivate");.#un
f290: 64 65 66 20 41 44 44 0a 20 20 72 65 74 75 72 6e  def ADD.  return
f2a0: 20 70 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a   payload;.}../*.
f2b0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
f2c0: 6e 20 6f 66 20 74 68 65 20 2f 6a 73 6f 6e 2f 73  n of the /json/s
f2d0: 74 61 74 20 70 61 67 65 2f 63 6f 6d 6d 61 6e 64  tat page/command
f2e0: 2e 0a 2a 2a 0a 2a 2f 0a 63 73 6f 6e 5f 76 61 6c  ..**.*/.cson_val
f2f0: 75 65 20 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f 73  ue * json_page_s
f300: 74 61 74 28 29 7b 0a 20 20 69 36 34 20 74 2c 20  tat(){.  i64 t, 
f310: 66 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 2c 20  fsize;.  int n, 
f320: 6d 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 3b 0a 20  m;.  int full;. 
f330: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
f340: 3b 0a 20 20 65 6e 75 6d 20 7b 20 42 75 66 4c 65  ;.  enum { BufLe
f350: 6e 20 3d 20 31 30 30 30 20 7d 3b 0a 20 20 63 68  n = 1000 };.  ch
f360: 61 72 20 7a 42 75 66 5b 42 75 66 4c 65 6e 5d 3b  ar zBuf[BufLen];
f370: 0a 20 20 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20  .  cson_value * 
f380: 6a 76 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 73 6f  jv = NULL;.  cso
f390: 6e 5f 6f 62 6a 65 63 74 20 2a 20 6a 6f 20 3d 20  n_object * jo = 
f3a0: 4e 55 4c 4c 3b 0a 20 20 63 73 6f 6e 5f 76 61 6c  NULL;.  cson_val
f3b0: 75 65 20 2a 20 6a 76 32 20 3d 20 4e 55 4c 4c 3b  ue * jv2 = NULL;
f3c0: 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 20 2a  .  cson_object *
f3d0: 20 6a 6f 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63   jo2 = NULL;.  c
f3e0: 68 61 72 20 2a 20 7a 54 6d 70 20 3d 20 4e 55 4c  har * zTmp = NUL
f3f0: 4c 3b 0a 20 20 69 66 28 20 21 67 2e 70 65 72 6d  L;.  if( !g.perm
f400: 2e 52 65 61 64 20 29 7b 0a 20 20 20 20 6a 73 6f  .Read ){.    jso
f410: 6e 5f 73 65 74 5f 65 72 72 28 46 53 4c 5f 4a 53  n_set_err(FSL_JS
f420: 4f 4e 5f 45 5f 44 45 4e 49 45 44 2c 0a 20 20 20  ON_E_DENIED,.   
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
f440: 65 71 75 69 72 65 73 20 27 6f 27 20 70 65 72 6d  equires 'o' perm
f450: 69 73 73 69 6f 6e 73 2e 22 29 3b 0a 20 20 20 20  issions.");.    
f460: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 7d  return NULL;.  }
f470: 0a 20 20 66 75 6c 6c 20 3d 20 6a 73 6f 6e 5f 66  .  full = json_f
f480: 69 6e 64 5f 6f 70 74 69 6f 6e 5f 62 6f 6f 6c 28  ind_option_bool(
f490: 22 66 75 6c 6c 22 2c 4e 55 4c 4c 2c 22 66 22 2c  "full",NULL,"f",
f4a0: 30 29 3b 0a 23 64 65 66 69 6e 65 20 53 45 54 42  0);.#define SETB
f4b0: 55 46 28 4f 2c 4b 29 20 63 73 6f 6e 5f 6f 62 6a  UF(O,K) cson_obj
f4c0: 65 63 74 5f 73 65 74 28 4f 2c 20 4b 2c 20 63 73  ect_set(O, K, cs
f4d0: 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 73 74 72  on_value_new_str
f4e0: 69 6e 67 28 7a 42 75 66 2c 20 73 74 72 6c 65 6e  ing(zBuf, strlen
f4f0: 28 7a 42 75 66 29 29 29 3b 0a 0a 20 20 6a 76 20  (zBuf)));..  jv 
f500: 3d 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77  = cson_value_new
f510: 5f 6f 62 6a 65 63 74 28 29 3b 0a 20 20 6a 6f 20  _object();.  jo 
f520: 3d 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 67 65 74  = cson_value_get
f530: 5f 6f 62 6a 65 63 74 28 6a 76 29 3b 0a 0a 20 20  _object(jv);..  
f540: 7a 54 6d 70 20 3d 20 64 62 5f 67 65 74 28 22 70  zTmp = db_get("p
f550: 72 6f 6a 65 63 74 2d 6e 61 6d 65 22 2c 4e 55 4c  roject-name",NUL
f560: 4c 29 3b 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63  L);.  cson_objec
f570: 74 5f 73 65 74 28 6a 6f 2c 20 22 70 72 6f 6a 65  t_set(jo, "proje
f580: 63 74 4e 61 6d 65 22 2c 20 6a 73 6f 6e 5f 6e 65  ctName", json_ne
f590: 77 5f 73 74 72 69 6e 67 28 7a 54 6d 70 29 29 3b  w_string(zTmp));
f5a0: 0a 20 20 66 72 65 65 28 7a 54 6d 70 29 3b 0a 20  .  free(zTmp);. 
f5b0: 20 7a 54 6d 70 20 3d 20 64 62 5f 67 65 74 28 22   zTmp = db_get("
f5c0: 70 72 6f 6a 65 63 74 2d 64 65 73 63 72 69 70 74  project-descript
f5d0: 69 6f 6e 22 2c 4e 55 4c 4c 29 3b 0a 20 20 63 73  ion",NULL);.  cs
f5e0: 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 6a 6f  on_object_set(jo
f5f0: 2c 20 22 70 72 6f 6a 65 63 74 44 65 73 63 72 69  , "projectDescri
f600: 70 74 69 6f 6e 22 2c 20 6a 73 6f 6e 5f 6e 65 77  ption", json_new
f610: 5f 73 74 72 69 6e 67 28 7a 54 6d 70 29 29 3b 0a  _string(zTmp));.
f620: 20 20 66 72 65 65 28 7a 54 6d 70 29 3b 0a 20 20    free(zTmp);.  
f630: 7a 54 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 66  zTmp = NULL;.  f
f640: 73 69 7a 65 20 3d 20 66 69 6c 65 5f 73 69 7a 65  size = file_size
f650: 28 67 2e 7a 52 65 70 6f 73 69 74 6f 72 79 4e 61  (g.zRepositoryNa
f660: 6d 65 29 3b 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65  me);.  cson_obje
f670: 63 74 5f 73 65 74 28 6a 6f 2c 20 22 72 65 70 6f  ct_set(jo, "repo
f680: 73 69 74 6f 72 79 53 69 7a 65 22 2c 20 63 73 6f  sitorySize", cso
f690: 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 69 6e 74 65  n_value_new_inte
f6a0: 67 65 72 28 28 63 73 6f 6e 5f 69 6e 74 5f 74 29  ger((cson_int_t)
f6b0: 66 73 69 7a 65 29 29 3b 0a 0a 20 20 69 66 28 66  fsize));..  if(f
f6c0: 75 6c 6c 29 7b 0a 20 20 20 20 6e 20 3d 20 64 62  ull){.    n = db
f6d0: 5f 69 6e 74 28 30 2c 20 22 53 45 4c 45 43 54 20  _int(0, "SELECT 
f6e0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 62 6c  count(*) FROM bl
f6f0: 6f 62 22 29 3b 0a 20 20 20 20 6d 20 3d 20 64 62  ob");.    m = db
f700: 5f 69 6e 74 28 30 2c 20 22 53 45 4c 45 43 54 20  _int(0, "SELECT 
f710: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 64 65  count(*) FROM de
f720: 6c 74 61 22 29 3b 0a 20 20 20 20 63 73 6f 6e 5f  lta");.    cson_
f730: 6f 62 6a 65 63 74 5f 73 65 74 28 6a 6f 2c 20 22  object_set(jo, "
f740: 62 6c 6f 62 43 6f 75 6e 74 22 2c 20 63 73 6f 6e  blobCount", cson
f750: 5f 76 61 6c 75 65 5f 6e 65 77 5f 69 6e 74 65 67  _value_new_integ
f760: 65 72 28 28 63 73 6f 6e 5f 69 6e 74 5f 74 29 6e  er((cson_int_t)n
f770: 29 29 3b 0a 20 20 20 20 63 73 6f 6e 5f 6f 62 6a  ));.    cson_obj
f780: 65 63 74 5f 73 65 74 28 6a 6f 2c 20 22 64 65 6c  ect_set(jo, "del
f790: 74 61 43 6f 75 6e 74 22 2c 20 63 73 6f 6e 5f 76  taCount", cson_v
f7a0: 61 6c 75 65 5f 6e 65 77 5f 69 6e 74 65 67 65 72  alue_new_integer
f7b0: 28 28 63 73 6f 6e 5f 69 6e 74 5f 74 29 6d 29 29  ((cson_int_t)m))
f7c0: 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 29 7b  ;.    if( n>0 ){
f7d0: 0a 20 20 20 20 20 20 69 6e 74 20 61 2c 20 62 3b  .      int a, b;
f7e0: 0a 20 20 20 20 20 20 53 74 6d 74 20 71 3b 0a 20  .      Stmt q;. 
f7f0: 20 20 20 20 20 64 62 5f 70 72 65 70 61 72 65 28       db_prepare(
f800: 26 71 2c 20 22 53 45 4c 45 43 54 20 74 6f 74 61  &q, "SELECT tota
f810: 6c 28 73 69 7a 65 29 2c 20 61 76 67 28 73 69 7a  l(size), avg(siz
f820: 65 29 2c 20 6d 61 78 28 73 69 7a 65 29 22 0a 20  e), max(size)". 
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 22 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52  " FROM blob WHER
f850: 45 20 73 69 7a 65 3e 30 22 29 3b 0a 20 20 20 20  E size>0");.    
f860: 20 20 64 62 5f 73 74 65 70 28 26 71 29 3b 0a 20    db_step(&q);. 
f870: 20 20 20 20 20 74 20 3d 20 64 62 5f 63 6f 6c 75       t = db_colu
f880: 6d 6e 5f 69 6e 74 36 34 28 26 71 2c 20 30 29 3b  mn_int64(&q, 0);
f890: 0a 20 20 20 20 20 20 63 73 6f 6e 5f 6f 62 6a 65  .      cson_obje
f8a0: 63 74 5f 73 65 74 28 6a 6f 2c 20 22 75 6e 63 6f  ct_set(jo, "unco
f8b0: 6d 70 72 65 73 73 65 64 41 72 74 69 66 61 63 74  mpressedArtifact
f8c0: 53 69 7a 65 22 2c 0a 20 20 20 20 20 20 20 20 20  Size",.         
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 73 6f               cso
f8e0: 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 69 6e 74 65  n_value_new_inte
f8f0: 67 65 72 28 28 63 73 6f 6e 5f 69 6e 74 5f 74 29  ger((cson_int_t)
f900: 74 29 29 3b 0a 20 20 20 20 20 20 63 73 6f 6e 5f  t));.      cson_
f910: 6f 62 6a 65 63 74 5f 73 65 74 28 6a 6f 2c 20 22  object_set(jo, "
f920: 61 76 65 72 61 67 65 41 72 74 69 66 61 63 74 53  averageArtifactS
f930: 69 7a 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ize",.          
f940: 20 20 20 20 20 20 20 20 20 20 20 20 63 73 6f 6e              cson
f950: 5f 76 61 6c 75 65 5f 6e 65 77 5f 69 6e 74 65 67  _value_new_integ
f960: 65 72 28 28 63 73 6f 6e 5f 69 6e 74 5f 74 29 64  er((cson_int_t)d
f970: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c  b_column_int(&q,
f980: 20 31 29 29 29 3b 0a 20 20 20 20 20 20 63 73 6f   1)));.      cso
f990: 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 6a 6f 2c  n_object_set(jo,
f9a0: 20 22 6d 61 78 41 72 74 69 66 61 63 74 53 69 7a   "maxArtifactSiz
f9b0: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
f9c0: 20 20 20 20 20 20 20 20 20 20 63 73 6f 6e 5f 76            cson_v
f9d0: 61 6c 75 65 5f 6e 65 77 5f 69 6e 74 65 67 65 72  alue_new_integer
f9e0: 28 28 63 73 6f 6e 5f 69 6e 74 5f 74 29 64 62 5f  ((cson_int_t)db_
f9f0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 32  column_int(&q, 2
fa00: 29 29 29 3b 0a 20 20 20 20 20 20 64 62 5f 66 69  )));.      db_fi
fa10: 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 20 20  nalize(&q);.    
fa20: 20 20 69 66 28 20 74 2f 66 73 69 7a 65 20 3c 20    if( t/fsize < 
fa30: 35 20 29 7b 0a 20 20 20 20 20 20 20 20 62 20 3d  5 ){.        b =
fa40: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 66 73 69   10;.        fsi
fa50: 7a 65 20 2f 3d 20 31 30 3b 0a 20 20 20 20 20 20  ze /= 10;.      
fa60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62  }else{.        b
fa70: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
fa80: 20 20 20 20 61 20 3d 20 74 2f 66 73 69 7a 65 3b      a = t/fsize;
fa90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
faa0: 6e 70 72 69 6e 74 66 28 42 75 66 4c 65 6e 2c 7a  nprintf(BufLen,z
fab0: 42 75 66 2c 20 22 25 64 3a 25 64 22 2c 20 61 2c  Buf, "%d:%d", a,
fac0: 20 62 29 3b 0a 20 20 20 20 20 20 53 45 54 42 55   b);.      SETBU
fad0: 46 28 6a 6f 2c 20 22 63 6f 6d 70 72 65 73 73 69  F(jo, "compressi
fae0: 6f 6e 52 61 74 69 6f 22 29 3b 0a 20 20 20 20 7d  onRatio");.    }
faf0: 0a 20 20 20 20 6e 20 3d 20 64 62 5f 69 6e 74 28  .    n = db_int(
fb00: 30 2c 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  0, "SELECT count
fb10: 28 64 69 73 74 69 6e 63 74 20 6d 69 64 29 20 46  (distinct mid) F
fb20: 52 4f 4d 20 6d 6c 69 6e 6b 20 2f 2a 73 63 61 6e  ROM mlink /*scan
fb30: 2a 2f 22 29 3b 0a 20 20 20 20 63 73 6f 6e 5f 6f  */");.    cson_o
fb40: 62 6a 65 63 74 5f 73 65 74 28 6a 6f 2c 20 22 63  bject_set(jo, "c
fb50: 68 65 63 6b 69 6e 43 6f 75 6e 74 22 2c 20 63 73  heckinCount", cs
fb60: 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 69 6e 74  on_value_new_int
fb70: 65 67 65 72 28 28 63 73 6f 6e 5f 69 6e 74 5f 74  eger((cson_int_t
fb80: 29 6e 29 29 3b 0a 20 20 20 20 6e 20 3d 20 64 62  )n));.    n = db
fb90: 5f 69 6e 74 28 30 2c 20 22 53 45 4c 45 43 54 20  _int(0, "SELECT 
fba0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 66 69  count(*) FROM fi
fbb0: 6c 65 6e 61 6d 65 20 2f 2a 73 63 61 6e 2a 2f 22  lename /*scan*/"
fbc0: 29 3b 0a 20 20 20 20 63 73 6f 6e 5f 6f 62 6a 65  );.    cson_obje
fbd0: 63 74 5f 73 65 74 28 6a 6f 2c 20 22 66 69 6c 65  ct_set(jo, "file
fbe0: 43 6f 75 6e 74 22 2c 20 63 73 6f 6e 5f 76 61 6c  Count", cson_val
fbf0: 75 65 5f 6e 65 77 5f 69 6e 74 65 67 65 72 28 28  ue_new_integer((
fc00: 63 73 6f 6e 5f 69 6e 74 5f 74 29 6e 29 29 3b 0a  cson_int_t)n));.
fc10: 20 20 20 20 6e 20 3d 20 64 62 5f 69 6e 74 28 30      n = db_int(0
fc20: 2c 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  , "SELECT count(
fc30: 2a 29 20 46 52 4f 4d 20 74 61 67 20 20 2f 2a 73  *) FROM tag  /*s
fc40: 63 61 6e 2a 2f 22 0a 20 20 20 20 20 20 20 20 20  can*/".         
fc50: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 2b 74        " WHERE +t
fc60: 61 67 6e 61 6d 65 20 47 4c 4f 42 20 27 77 69 6b  agname GLOB 'wik
fc70: 69 2d 2a 27 22 29 3b 0a 20 20 20 20 63 73 6f 6e  i-*'");.    cson
fc80: 5f 6f 62 6a 65 63 74 5f 73 65 74 28 6a 6f 2c 20  _object_set(jo, 
fc90: 22 77 69 6b 69 50 61 67 65 43 6f 75 6e 74 22 2c  "wikiPageCount",
fca0: 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f   cson_value_new_
fcb0: 69 6e 74 65 67 65 72 28 28 63 73 6f 6e 5f 69 6e  integer((cson_in
fcc0: 74 5f 74 29 6e 29 29 3b 0a 20 20 20 20 6e 20 3d  t_t)n));.    n =
fcd0: 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c 45   db_int(0, "SELE
fce0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
fcf0: 20 74 61 67 20 20 2f 2a 73 63 61 6e 2a 2f 22 0a   tag  /*scan*/".
fd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
fd10: 20 57 48 45 52 45 20 2b 74 61 67 6e 61 6d 65 20   WHERE +tagname 
fd20: 47 4c 4f 42 20 27 74 6b 74 2d 2a 27 22 29 3b 0a  GLOB 'tkt-*'");.
fd30: 20 20 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f      cson_object_
fd40: 73 65 74 28 6a 6f 2c 20 22 74 69 63 6b 65 74 43  set(jo, "ticketC
fd50: 6f 75 6e 74 22 2c 20 63 73 6f 6e 5f 76 61 6c 75  ount", cson_valu
fd60: 65 5f 6e 65 77 5f 69 6e 74 65 67 65 72 28 28 63  e_new_integer((c
fd70: 73 6f 6e 5f 69 6e 74 5f 74 29 6e 29 29 3b 0a 20  son_int_t)n));. 
fd80: 20 7d 2f 2a 66 75 6c 6c 2a 2f 0a 20 20 6e 20 3d   }/*full*/.  n =
fd90: 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c 45   db_int(0, "SELE
fda0: 43 54 20 6a 75 6c 69 61 6e 64 61 79 28 27 6e 6f  CT julianday('no
fdb0: 77 27 29 20 2d 20 28 53 45 4c 45 43 54 20 6d 69  w') - (SELECT mi
fdc0: 6e 28 6d 74 69 6d 65 29 20 46 52 4f 4d 20 65 76  n(mtime) FROM ev
fdd0: 65 6e 74 29 22 0a 20 20 20 20 20 20 20 20 20 20  ent)".          
fde0: 20 20 20 20 20 20 22 20 2b 20 30 2e 39 39 22 29        " + 0.99")
fdf0: 3b 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f  ;.  cson_object_
fe00: 73 65 74 28 6a 6f 2c 20 22 61 67 65 44 61 79 73  set(jo, "ageDays
fe10: 22 2c 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65  ", cson_value_ne
fe20: 77 5f 69 6e 74 65 67 65 72 28 28 63 73 6f 6e 5f  w_integer((cson_
fe30: 69 6e 74 5f 74 29 6e 29 29 3b 0a 20 20 63 73 6f  int_t)n));.  cso
fe40: 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 6a 6f 2c  n_object_set(jo,
fe50: 20 22 61 67 65 59 65 61 72 73 22 2c 20 63 73 6f   "ageYears", cso
fe60: 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 64 6f 75 62  n_value_new_doub
fe70: 6c 65 28 6e 2f 33 36 35 2e 32 34 29 29 3b 0a 20  le(n/365.24));. 
fe80: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
fe90: 66 28 42 75 66 4c 65 6e 2c 20 7a 42 75 66 2c 20  f(BufLen, zBuf, 
fea0: 64 62 5f 67 65 74 28 22 70 72 6f 6a 65 63 74 2d  db_get("project-
feb0: 63 6f 64 65 22 2c 22 22 29 29 3b 0a 20 20 53 45  code",""));.  SE
fec0: 54 42 55 46 28 6a 6f 2c 20 22 70 72 6f 6a 65 63  TBUF(jo, "projec
fed0: 74 43 6f 64 65 22 29 3b 0a 20 20 73 71 6c 69 74  tCode");.  sqlit
fee0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 42 75 66 4c  e3_snprintf(BufL
fef0: 65 6e 2c 20 7a 42 75 66 2c 20 64 62 5f 67 65 74  en, zBuf, db_get
ff00: 28 22 73 65 72 76 65 72 2d 63 6f 64 65 22 2c 22  ("server-code","
ff10: 22 29 29 3b 0a 20 20 53 45 54 42 55 46 28 6a 6f  "));.  SETBUF(jo
ff20: 2c 20 22 73 65 72 76 65 72 43 6f 64 65 22 29 3b  , "serverCode");
ff30: 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73  .  cson_object_s
ff40: 65 74 28 6a 6f 2c 20 22 63 6f 6d 70 69 6c 65 72  et(jo, "compiler
ff50: 22 2c 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65  ", cson_value_ne
ff60: 77 5f 73 74 72 69 6e 67 28 43 4f 4d 50 49 4c 45  w_string(COMPILE
ff70: 52 5f 4e 41 4d 45 2c 20 73 74 72 6c 65 6e 28 43  R_NAME, strlen(C
ff80: 4f 4d 50 49 4c 45 52 5f 4e 41 4d 45 29 29 29 3b  OMPILER_NAME)));
ff90: 0a 0a 20 20 6a 76 32 20 3d 20 63 73 6f 6e 5f 76  ..  jv2 = cson_v
ffa0: 61 6c 75 65 5f 6e 65 77 5f 6f 62 6a 65 63 74 28  alue_new_object(
ffb0: 29 3b 0a 20 20 6a 6f 32 20 3d 20 63 73 6f 6e 5f  );.  jo2 = cson_
ffc0: 76 61 6c 75 65 5f 67 65 74 5f 6f 62 6a 65 63 74  value_get_object
ffd0: 28 6a 76 32 29 3b 0a 20 20 63 73 6f 6e 5f 6f 62  (jv2);.  cson_ob
ffe0: 6a 65 63 74 5f 73 65 74 28 6a 6f 2c 20 22 73 71  ject_set(jo, "sq
fff0: 6c 69 74 65 22 2c 20 6a 76 32 29 3b 0a 20 20 73  lite", jv2);.  s
10000 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
10010 42 75 66 4c 65 6e 2c 20 7a 42 75 66 2c 20 22 25  BufLen, zBuf, "%
10020 2e 31 39 73 20 5b 25 2e 31 30 73 5d 20 28 25 73  .19s [%.10s] (%s
10030 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
10040 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4f         SQLITE_SO
10050 55 52 43 45 5f 49 44 2c 20 26 53 51 4c 49 54 45  URCE_ID, &SQLITE
10060 5f 53 4f 55 52 43 45 5f 49 44 5b 32 30 5d 2c 20  _SOURCE_ID[20], 
10070 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 29 3b  SQLITE_VERSION);
10080 0a 20 20 53 45 54 42 55 46 28 6a 6f 32 2c 20 22  .  SETBUF(jo2, "
10090 76 65 72 73 69 6f 6e 22 29 3b 0a 20 20 7a 44 62  version");.  zDb
100a0 20 3d 20 64 62 5f 6e 61 6d 65 28 22 72 65 70 6f   = db_name("repo
100b0 73 69 74 6f 72 79 22 29 3b 0a 20 20 63 73 6f 6e  sitory");.  cson
100c0 5f 6f 62 6a 65 63 74 5f 73 65 74 28 6a 6f 32 2c  _object_set(jo2,
100d0 20 22 70 61 67 65 43 6f 75 6e 74 22 2c 20 63 73   "pageCount", cs
100e0 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 69 6e 74  on_value_new_int
100f0 65 67 65 72 28 28 63 73 6f 6e 5f 69 6e 74 5f 74  eger((cson_int_t
10100 29 64 62 5f 69 6e 74 28 30 2c 20 22 50 52 41 47  )db_int(0, "PRAG
10110 4d 41 20 25 73 2e 70 61 67 65 5f 63 6f 75 6e 74  MA %s.page_count
10120 22 2c 20 7a 44 62 29 29 29 3b 0a 20 20 63 73 6f  ", zDb)));.  cso
10130 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 6a 6f 32  n_object_set(jo2
10140 2c 20 22 70 61 67 65 53 69 7a 65 22 2c 20 63 73  , "pageSize", cs
10150 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 69 6e 74  on_value_new_int
10160 65 67 65 72 28 28 63 73 6f 6e 5f 69 6e 74 5f 74  eger((cson_int_t
10170 29 64 62 5f 69 6e 74 28 30 2c 20 22 50 52 41 47  )db_int(0, "PRAG
10180 4d 41 20 25 73 2e 70 61 67 65 5f 73 69 7a 65 22  MA %s.page_size"
10190 2c 20 7a 44 62 29 29 29 3b 0a 20 20 63 73 6f 6e  , zDb)));.  cson
101a0 5f 6f 62 6a 65 63 74 5f 73 65 74 28 6a 6f 32 2c  _object_set(jo2,
101b0 20 22 66 72 65 65 4c 69 73 74 22 2c 20 63 73 6f   "freeList", cso
101c0 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 69 6e 74 65  n_value_new_inte
101d0 67 65 72 28 28 63 73 6f 6e 5f 69 6e 74 5f 74 29  ger((cson_int_t)
101e0 64 62 5f 69 6e 74 28 30 2c 20 22 50 52 41 47 4d  db_int(0, "PRAGM
101f0 41 20 25 73 2e 66 72 65 65 6c 69 73 74 5f 63 6f  A %s.freelist_co
10200 75 6e 74 22 2c 20 7a 44 62 29 29 29 3b 0a 20 20  unt", zDb)));.  
10210 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
10220 28 42 75 66 4c 65 6e 2c 20 7a 42 75 66 2c 20 22  (BufLen, zBuf, "
10230 25 73 22 2c 20 64 62 5f 74 65 78 74 28 30 2c 20  %s", db_text(0, 
10240 22 50 52 41 47 4d 41 20 25 73 2e 65 6e 63 6f 64  "PRAGMA %s.encod
10250 69 6e 67 22 2c 20 7a 44 62 29 29 3b 0a 20 20 53  ing", zDb));.  S
10260 45 54 42 55 46 28 6a 6f 32 2c 20 22 65 6e 63 6f  ETBUF(jo2, "enco
10270 64 69 6e 67 22 29 3b 0a 20 20 73 71 6c 69 74 65  ding");.  sqlite
10280 33 5f 73 6e 70 72 69 6e 74 66 28 42 75 66 4c 65  3_snprintf(BufLe
10290 6e 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 64  n, zBuf, "%s", d
102a0 62 5f 74 65 78 74 28 30 2c 20 22 50 52 41 47 4d  b_text(0, "PRAGM
102b0 41 20 25 73 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  A %s.journal_mod
102c0 65 22 2c 20 7a 44 62 29 29 3b 0a 20 20 63 73 6f  e", zDb));.  cso
102d0 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 6a 6f 32  n_object_set(jo2
102e0 2c 20 22 6a 6f 75 72 6e 61 6c 4d 6f 64 65 22 2c  , "journalMode",
102f0 20 2a 7a 42 75 66 20 3f 20 63 73 6f 6e 5f 76 61   *zBuf ? cson_va
10300 6c 75 65 5f 6e 65 77 5f 73 74 72 69 6e 67 28 7a  lue_new_string(z
10310 42 75 66 2c 20 73 74 72 6c 65 6e 28 7a 42 75 66  Buf, strlen(zBuf
10320 29 29 20 3a 20 63 73 6f 6e 5f 76 61 6c 75 65 5f  )) : cson_value_
10330 6e 75 6c 6c 28 29 29 3b 0a 20 20 72 65 74 75 72  null());.  retur
10340 6e 20 6a 76 3b 0a 23 75 6e 64 65 66 20 53 45 54  n jv;.#undef SET
10350 42 55 46 0a 7d 0a 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  BUF.}...../*.** 
10360 43 72 65 61 74 65 73 20 61 20 63 6f 6d 6d 61 2d  Creates a comma-
10370 73 65 70 61 72 61 74 65 64 20 6c 69 73 74 20 6f  separated list o
10380 66 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 73 0a  f command names.
10390 2a 2a 20 74 61 6b 65 6e 20 66 72 6f 6d 20 7a 50  ** taken from zP
103a0 61 67 65 73 2e 20 7a 50 61 67 65 73 20 6d 75 73  ages. zPages mus
103b0 74 20 62 65 20 61 6e 20 61 72 72 61 79 20 6f 66  t be an array of
103c0 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 77 68 6f 73   objects.** whos
103d0 65 20 66 69 6e 61 6c 20 65 6e 74 72 79 20 4d 55  e final entry MU
103e0 53 54 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 6e  ST have a NULL n
103f0 61 6d 65 20 76 61 6c 75 65 20 6f 72 20 72 65 73  ame value or res
10400 75 6c 74 73 0a 2a 2a 20 61 72 65 20 75 6e 64 65  ults.** are unde
10410 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  fined..**.** The
10420 20 6c 69 73 74 20 69 73 20 61 70 70 65 6e 64 65   list is appende
10430 64 20 74 6f 20 70 4f 75 74 2e 20 54 68 65 20 6e  d to pOut. The n
10440 75 6d 62 65 72 20 6f 66 20 69 74 65 6d 73 20 28  umber of items (
10450 6e 6f 74 20 62 79 74 65 73 29 0a 2a 2a 20 61 70  not bytes).** ap
10460 70 65 6e 64 65 64 20 61 72 65 20 72 65 74 75 72  pended are retur
10470 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
10480 6e 74 20 6a 73 6f 6e 5f 70 61 67 65 64 65 66 73  nt json_pagedefs
10490 5f 74 6f 5f 73 74 72 69 6e 67 28 4a 73 6f 6e 50  _to_string(JsonP
104a0 61 67 65 44 65 66 20 63 6f 6e 73 74 20 2a 20 7a  ageDef const * z
104b0 50 61 67 65 73 2c 0a 20 20 20 20 20 20 20 20 20  Pages,.         
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 42 6c 6f 62 20 2a            Blob *
104e0 20 70 4f 75 74 29 7b 0a 20 20 69 6e 74 20 69 20   pOut){.  int i 
104f0 3d 20 30 3b 0a 20 20 66 6f 72 28 20 3b 20 7a 50  = 0;.  for( ; zP
10500 61 67 65 73 2d 3e 6e 61 6d 65 3b 20 2b 2b 7a 50  ages->name; ++zP
10510 61 67 65 73 2c 20 2b 2b 69 20 29 7b 0a 20 20 20  ages, ++i ){.   
10520 20 69 66 28 67 2e 69 73 48 54 54 50 20 26 26 20   if(g.isHTTP && 
10530 7a 50 61 67 65 73 2d 3e 72 75 6e 4d 6f 64 65 20  zPages->runMode 
10540 3c 20 30 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  < 0) continue;. 
10550 20 20 20 65 6c 73 65 20 69 66 28 7a 50 61 67 65     else if(zPage
10560 73 2d 3e 72 75 6e 4d 6f 64 65 20 3e 20 30 29 20  s->runMode > 0) 
10570 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62 6c  continue;.    bl
10580 6f 62 5f 61 70 70 65 6e 64 66 28 70 4f 75 74 2c  ob_appendf(pOut,
10590 20 7a 50 61 67 65 73 2d 3e 6e 61 6d 65 2c 20 2d   zPages->name, -
105a0 31 29 3b 0a 20 20 20 20 69 66 28 28 7a 50 61 67  1);.    if((zPag
105b0 65 73 2b 31 29 2d 3e 6e 61 6d 65 29 7b 0a 20 20  es+1)->name){.  
105c0 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28      blob_append(
105d0 70 4f 75 74 2c 20 22 2c 20 22 2c 32 29 3b 0a 20  pOut, ", ",2);. 
105e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
105f0 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n i;.}../*.** Cr
10600 65 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  eates an error m
10610 65 73 73 61 67 65 20 75 73 69 6e 67 20 7a 45 72  essage using zEr
10620 72 50 72 65 66 69 78 20 61 6e 64 20 74 68 65 20  rPrefix and the 
10630 67 69 76 65 6e 20 61 72 72 61 79 20 6f 66 0a 2a  given array of.*
10640 2a 20 4a 53 4f 4e 20 63 6f 6d 6d 61 6e 64 20 64  * JSON command d
10650 65 66 69 6e 69 74 69 6f 6e 73 2c 20 61 6e 64 20  efinitions, and 
10660 73 65 74 73 20 74 68 65 20 67 2e 6a 73 6f 6e 20  sets the g.json 
10670 65 72 72 6f 72 20 73 74 61 74 65 20 74 6f 0a 2a  error state to.*
10680 2a 20 72 65 66 6c 65 63 74 20 46 53 4c 5f 4a 53  * reflect FSL_JS
10690 4f 4e 5f 45 5f 4d 49 53 53 49 4e 47 5f 41 52 47  ON_E_MISSING_ARG
106a0 53 2e 20 49 66 20 7a 45 72 72 50 72 65 66 69 78  S. If zErrPrefix
106b0 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 0a 2a 2a   is NULL then.**
106c0 20 73 6f 6d 65 20 64 65 66 61 75 6c 74 20 69 73   some default is
106d0 20 75 73 65 64 20 28 65 2e 67 2e 20 22 54 72 79   used (e.g. "Try
106e0 20 6f 6e 65 20 6f 66 3a 20 22 29 2e 20 49 66 20   one of: "). If 
106f0 69 74 20 69 73 20 22 22 20 74 68 65 6e 0a 2a 2a  it is "" then.**
10700 20 6e 6f 20 70 72 65 66 69 78 20 69 73 20 75 73   no prefix is us
10710 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ed..**.** The in
10720 74 65 6e 74 69 6f 6e 20 69 73 20 74 6f 20 70 72  tention is to pr
10730 6f 76 69 64 65 20 74 68 65 20 75 73 65 72 20 28  ovide the user (
10740 76 69 61 20 74 68 65 20 72 65 73 70 6f 6e 73 65  via the response
10750 2e 72 65 73 75 6c 74 54 65 78 74 29 0a 2a 2a 20  .resultText).** 
10760 61 20 6c 69 73 74 20 6f 66 20 61 76 61 69 6c 61  a list of availa
10770 62 6c 65 20 63 6f 6d 6d 61 6e 64 73 2f 73 75 62  ble commands/sub
10780 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2a 0a 2a 2f 0a  commands..**.*/.
10790 76 6f 69 64 20 6a 73 6f 6e 5f 64 69 73 70 61 74  void json_dispat
107a0 63 68 5f 6d 69 73 73 69 6e 67 5f 61 72 67 73 5f  ch_missing_args_
107b0 65 72 72 28 20 4a 73 6f 6e 50 61 67 65 44 65 66  err( JsonPageDef
107c0 20 63 6f 6e 73 74 20 2a 20 70 43 6f 6d 6d 61 6e   const * pComman
107d0 64 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ds,.            
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 63 68 61 72 20 63 6f           char co
10800 6e 73 74 20 2a 20 7a 45 72 72 50 72 65 66 69 78  nst * zErrPrefix
10810 20 29 7b 0a 20 20 42 6c 6f 62 20 63 6d 64 4e 61   ){.  Blob cmdNa
10820 6d 65 73 20 3d 20 65 6d 70 74 79 5f 62 6c 6f 62  mes = empty_blob
10830 3b 0a 20 20 62 6c 6f 62 5f 69 6e 69 74 28 26 63  ;.  blob_init(&c
10840 6d 64 4e 61 6d 65 73 2c 4e 55 4c 4c 2c 30 29 3b  mdNames,NULL,0);
10850 0a 20 20 69 66 28 20 21 7a 45 72 72 50 72 65 66  .  if( !zErrPref
10860 69 78 20 29 20 7b 0a 20 20 20 20 7a 45 72 72 50  ix ) {.    zErrP
10870 72 65 66 69 78 20 3d 20 22 54 72 79 20 6f 6e 65  refix = "Try one
10880 20 6f 66 3a 20 22 3b 0a 20 20 7d 0a 20 20 62 6c   of: ";.  }.  bl
10890 6f 62 5f 61 70 70 65 6e 64 28 20 26 63 6d 64 4e  ob_append( &cmdN
108a0 61 6d 65 73 2c 20 7a 45 72 72 50 72 65 66 69 78  ames, zErrPrefix
108b0 2c 20 73 74 72 6c 65 6e 28 7a 45 72 72 50 72 65  , strlen(zErrPre
108c0 66 69 78 29 20 29 3b 0a 20 20 6a 73 6f 6e 5f 70  fix) );.  json_p
108d0 61 67 65 64 65 66 73 5f 74 6f 5f 73 74 72 69 6e  agedefs_to_strin
108e0 67 28 70 43 6f 6d 6d 61 6e 64 73 2c 20 26 63 6d  g(pCommands, &cm
108f0 64 4e 61 6d 65 73 29 3b 0a 20 20 6a 73 6f 6e 5f  dNames);.  json_
10900 73 65 74 5f 65 72 72 28 46 53 4c 5f 4a 53 4f 4e  set_err(FSL_JSON
10910 5f 45 5f 4d 49 53 53 49 4e 47 5f 41 52 47 53 2c  _E_MISSING_ARGS,
10920 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20   "%s",.         
10930 20 20 20 20 20 20 62 6c 6f 62 5f 73 74 72 28 26        blob_str(&
10940 63 6d 64 4e 61 6d 65 73 29 29 3b 0a 20 20 62 6c  cmdNames));.  bl
10950 6f 62 5f 72 65 73 65 74 28 26 63 6d 64 4e 61 6d  ob_reset(&cmdNam
10960 65 73 29 3b 0a 7d 0a 0a 63 73 6f 6e 5f 76 61 6c  es);.}..cson_val
10970 75 65 20 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f 64  ue * json_page_d
10980 69 73 70 61 74 63 68 5f 68 65 6c 70 65 72 28 4a  ispatch_helper(J
10990 73 6f 6e 50 61 67 65 44 65 66 20 63 6f 6e 73 74  sonPageDef const
109a0 20 2a 20 70 61 67 65 73 29 7b 0a 20 20 4a 73 6f   * pages){.  Jso
109b0 6e 50 61 67 65 44 65 66 20 63 6f 6e 73 74 20 2a  nPageDef const *
109c0 20 64 65 66 3b 0a 20 20 63 68 61 72 20 63 6f 6e   def;.  char con
109d0 73 74 20 2a 20 63 6d 64 20 3d 20 6a 73 6f 6e 5f  st * cmd = json_
109e0 63 6f 6d 6d 61 6e 64 5f 61 72 67 28 31 2b 67 2e  command_arg(1+g.
109f0 6a 73 6f 6e 2e 64 69 73 70 61 74 63 68 44 65 70  json.dispatchDep
10a00 74 68 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4e  th);.  assert( N
10a10 55 4c 4c 20 21 3d 20 70 61 67 65 73 20 29 3b 0a  ULL != pages );.
10a20 20 20 69 66 28 20 21 20 63 6d 64 20 29 7b 0a 20    if( ! cmd ){. 
10a30 20 20 20 6a 73 6f 6e 5f 64 69 73 70 61 74 63 68     json_dispatch
10a40 5f 6d 69 73 73 69 6e 67 5f 61 72 67 73 5f 65 72  _missing_args_er
10a50 72 28 70 61 67 65 73 2c 0a 20 20 20 20 20 20 20  r(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 22 4e 6f 20              "No 
10a80 73 75 62 63 6f 6d 6d 61 6e 64 20 73 70 65 63 69  subcommand speci
10a90 66 69 65 64 2e 20 22 0a 20 20 20 20 20 20 20 20  fied. ".        
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 22 54 72 79 20             "Try 
10ac0 6f 6e 65 20 6f 66 3a 20 22 29 3b 0a 20 20 20 20  one of: ");.    
10ad0 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 7d  return NULL;.  }
10ae0 0a 20 20 64 65 66 20 3d 20 6a 73 6f 6e 5f 68 61  .  def = json_ha
10af0 6e 64 6c 65 72 5f 66 6f 72 5f 6e 61 6d 65 28 20  ndler_for_name( 
10b00 63 6d 64 2c 20 70 61 67 65 73 20 29 3b 0a 20 20  cmd, pages );.  
10b10 69 66 28 21 64 65 66 29 7b 0a 20 20 20 20 6a 73  if(!def){.    js
10b20 6f 6e 5f 73 65 74 5f 65 72 72 28 46 53 4c 5f 4a  on_set_err(FSL_J
10b30 53 4f 4e 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 4f  SON_E_UNKNOWN_CO
10b40 4d 4d 41 4e 44 2c 0a 20 20 20 20 20 20 20 20 20  MMAND,.         
10b50 20 20 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e          "Unknown
10b60 20 73 75 62 63 6f 6d 6d 61 6e 64 3a 20 25 73 22   subcommand: %s"
10b70 2c 20 63 6d 64 29 3b 0a 20 20 20 20 72 65 74 75  , cmd);.    retu
10b80 72 6e 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 65  rn NULL;.  }.  e
10b90 6c 73 65 7b 0a 20 20 20 20 2b 2b 67 2e 6a 73 6f  lse{.    ++g.jso
10ba0 6e 2e 64 69 73 70 61 74 63 68 44 65 70 74 68 3b  n.dispatchDepth;
10bb0 0a 20 20 20 20 72 65 74 75 72 6e 20 28 2a 64 65  .    return (*de
10bc0 66 2d 3e 66 75 6e 63 29 28 29 3b 0a 20 20 7d 0a  f->func)();.  }.
10bd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 20 6f  }.../*.** Impl o
10be0 66 20 2f 6a 73 6f 6e 2f 72 65 62 75 69 6c 64 2e  f /json/rebuild.
10bf0 20 52 65 71 75 69 72 65 73 20 61 64 6d 69 6e 20   Requires admin 
10c00 70 72 65 76 69 6c 65 67 65 73 2e 0a 2a 2f 0a 73  previleges..*/.s
10c10 74 61 74 69 63 20 63 73 6f 6e 5f 76 61 6c 75 65  tatic cson_value
10c20 20 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f 72 65 62   * json_page_reb
10c30 75 69 6c 64 28 29 7b 0a 20 20 69 66 28 20 21 67  uild(){.  if( !g
10c40 2e 70 65 72 6d 2e 41 64 6d 69 6e 20 29 7b 0a 20  .perm.Admin ){. 
10c50 20 20 20 6a 73 6f 6e 5f 73 65 74 5f 65 72 72 28     json_set_err(
10c60 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 44 45 4e 49 45  FSL_JSON_E_DENIE
10c70 44 2c 22 52 65 71 75 69 72 65 73 20 27 61 27 20  D,"Requires 'a' 
10c80 70 72 69 76 69 6c 65 67 65 73 2e 22 29 3b 0a 20  privileges.");. 
10c90 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a     return NULL;.
10ca0 20 20 7d 65 6c 73 65 7b 0a 20 20 2f 2a 20 52 65    }else{.  /* Re
10cb0 6d 69 6e 64 65 72 3a 20 74 68 65 20 64 62 5f 78  minder: the db_x
10cc0 78 78 28 29 20 6f 70 73 20 22 73 68 6f 75 6c 64  xx() ops "should
10cd0 22 20 66 61 69 6c 20 76 69 61 20 74 68 65 20 66  " fail via the f
10ce0 6f 73 73 69 6c 20 63 6f 72 65 0a 20 20 20 20 20  ossil core.     
10cf0 65 72 72 6f 72 20 68 61 6e 64 6c 65 72 73 2c 20  error handlers, 
10d00 77 68 69 63 68 20 77 69 6c 6c 20 63 61 75 73 65  which will cause
10d10 20 61 20 4a 53 4f 4e 20 65 72 72 6f 72 20 61 6e   a JSON error an
10d20 64 20 65 78 69 74 28 29 2e 20 69 2e 65 2e 20 77  d exit(). i.e. w
10d30 65 0a 20 20 20 20 20 64 6f 6e 27 74 20 68 61 6e  e.     don't han
10d40 64 6c 65 20 74 68 65 20 65 72 72 6f 72 73 20 68  dle the errors h
10d50 65 72 65 2e 20 54 4f 44 4f 3a 20 63 6f 6e 66 69  ere. TODO: confi
10d60 72 6d 20 74 68 61 74 20 61 6c 6c 20 74 68 65 73  rm that all thes
10d70 65 20 64 62 0a 20 20 20 20 20 72 6f 75 74 69 6e  e db.     routin
10d80 65 20 66 61 69 6c 20 67 72 61 63 65 66 75 6c 6c  e fail gracefull
10d90 79 20 69 6e 20 4a 53 4f 4e 20 6d 6f 64 65 2e 0a  y in JSON mode..
10da0 0a 20 20 20 20 20 4f 6e 20 6c 61 72 67 65 20 72  .     On large r
10db0 65 70 6f 73 20 28 65 2e 67 2e 20 66 6f 73 73 69  epos (e.g. fossi
10dc0 6c 27 73 29 20 74 68 69 73 20 6f 70 65 72 61 74  l's) this operat
10dd0 69 6f 6e 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f  ion is likely to
10de0 20 74 61 6b 65 0a 20 20 20 20 20 6c 6f 6e 67 65   take.     longe
10df0 72 20 74 68 61 6e 20 74 68 65 20 63 6c 69 65 6e  r than the clien
10e00 74 20 74 69 6d 65 6f 75 74 2c 20 77 68 69 63 68  t timeout, which
10e10 20 77 69 6c 6c 20 63 61 75 73 65 20 69 74 20 74   will cause it t
10e20 6f 20 66 61 69 6c 20 28 62 75 74 0a 20 20 20 20  o fail (but.    
10e30 20 69 74 27 73 20 73 71 6c 69 74 65 33 2c 20 73   it's sqlite3, s
10e40 6f 20 69 74 27 6c 6c 20 66 61 69 6c 20 67 72 61  o it'll fail gra
10e50 63 65 66 75 6c 6c 79 29 2e 0a 20 20 2a 2f 0a 20  cefully)..  */. 
10e60 20 20 20 64 62 5f 63 6c 6f 73 65 28 31 29 3b 0a     db_close(1);.
10e70 20 20 20 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f      db_open_repo
10e80 73 69 74 6f 72 79 28 67 2e 7a 52 65 70 6f 73 69  sitory(g.zReposi
10e90 74 6f 72 79 4e 61 6d 65 29 3b 0a 20 20 20 20 64  toryName);.    d
10ea0 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  b_begin_transact
10eb0 69 6f 6e 28 29 3b 0a 20 20 20 20 72 65 62 75 69  ion();.    rebui
10ec0 6c 64 5f 64 62 28 30 2c 20 30 2c 20 30 29 3b 0a  ld_db(0, 0, 0);.
10ed0 20 20 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73      db_end_trans
10ee0 61 63 74 69 6f 6e 28 30 29 3b 0a 20 20 20 20 72  action(0);.    r
10ef0 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  eturn NULL;.  }.
10f00 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 20 6f 66  }../*.** Impl of
10f10 20 2f 6a 73 6f 6e 2f 67 2e 20 52 65 71 75 69 72   /json/g. Requir
10f20 65 73 20 61 64 6d 69 6e 2f 73 65 74 75 70 20 72  es admin/setup r
10f30 69 67 68 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ights..*/.static
10f40 20 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73   cson_value * js
10f50 6f 6e 5f 70 61 67 65 5f 67 28 29 7b 0a 20 20 69  on_page_g(){.  i
10f60 66 28 21 67 2e 70 65 72 6d 2e 41 64 6d 69 6e 20  f(!g.perm.Admin 
10f70 7c 7c 20 21 67 2e 70 65 72 6d 2e 53 65 74 75 70  || !g.perm.Setup
10f80 29 7b 0a 20 20 20 20 6a 73 6f 6e 5f 73 65 74 5f  ){.    json_set_
10f90 65 72 72 28 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 44  err(FSL_JSON_E_D
10fa0 45 4e 49 45 44 2c 0a 20 20 20 20 20 20 20 20 20  ENIED,.         
10fb0 20 20 20 20 20 20 20 20 22 52 65 71 75 69 72 65          "Require
10fc0 73 20 27 61 27 20 6f 72 20 27 73 27 20 70 72 69  s 'a' or 's' pri
10fd0 76 69 6c 65 67 65 73 2e 22 29 3b 0a 20 20 20 20  vileges.");.    
10fe0 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 7d  return NULL;.  }
10ff0 0a 20 20 72 65 74 75 72 6e 20 6a 73 6f 6e 5f 67  .  return json_g
11000 5f 74 6f 5f 6a 73 6f 6e 28 29 3b 0a 7d 0a 0a 2f  _to_json();.}../
11010 2a 20 49 6d 70 6c 20 69 6e 20 6a 73 6f 6e 5f 6c  * Impl in json_l
11020 6f 67 69 6e 2e 63 2e 20 2a 2f 0a 63 73 6f 6e 5f  ogin.c. */.cson_
11030 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 70 61 67  value * json_pag
11040 65 5f 61 6e 6f 6e 5f 70 61 73 73 77 6f 72 64 28  e_anon_password(
11050 29 3b 0a 2f 2a 20 49 6d 70 6c 20 69 6e 20 6a 73  );./* Impl in js
11060 6f 6e 5f 61 72 74 69 66 61 63 74 2e 63 2e 20 2a  on_artifact.c. *
11070 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a  /.cson_value * j
11080 73 6f 6e 5f 70 61 67 65 5f 61 72 74 69 66 61 63  son_page_artifac
11090 74 28 29 3b 0a 2f 2a 20 49 6d 70 6c 20 69 6e 20  t();./* Impl in 
110a0 6a 73 6f 6e 5f 62 72 61 6e 63 68 2e 63 2e 20 2a  json_branch.c. *
110b0 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a  /.cson_value * j
110c0 73 6f 6e 5f 70 61 67 65 5f 62 72 61 6e 63 68 28  son_page_branch(
110d0 29 3b 0a 2f 2a 20 49 6d 70 6c 20 69 6e 20 6a 73  );./* Impl in js
110e0 6f 6e 5f 64 69 66 66 2e 63 2e 20 2a 2f 0a 63 73  on_diff.c. */.cs
110f0 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f  on_value * json_
11100 70 61 67 65 5f 64 69 66 66 28 29 3b 0a 2f 2a 20  page_diff();./* 
11110 49 6d 70 6c 20 69 6e 20 6a 73 6f 6e 5f 64 69 72  Impl in json_dir
11120 2e 63 2e 20 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75  .c. */.cson_valu
11130 65 20 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f 64 69  e * json_page_di
11140 72 28 29 3b 0a 2f 2a 20 49 6d 70 6c 20 69 6e 20  r();./* Impl in 
11150 6a 73 6f 6e 5f 6c 6f 67 69 6e 2e 63 2e 20 2a 2f  json_login.c. */
11160 0a 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73  .cson_value * js
11170 6f 6e 5f 70 61 67 65 5f 6c 6f 67 69 6e 28 29 3b  on_page_login();
11180 0a 2f 2a 20 49 6d 70 6c 20 69 6e 20 6a 73 6f 6e  ./* Impl in json
11190 5f 6c 6f 67 69 6e 2e 63 2e 20 2a 2f 0a 63 73 6f  _login.c. */.cso
111a0 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 70  n_value * json_p
111b0 61 67 65 5f 6c 6f 67 6f 75 74 28 29 3b 0a 2f 2a  age_logout();./*
111c0 20 49 6d 70 6c 20 69 6e 20 6a 73 6f 6e 5f 71 75   Impl in json_qu
111d0 65 72 79 2e 63 2e 20 2a 2f 0a 63 73 6f 6e 5f 76  ery.c. */.cson_v
111e0 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 70 61 67 65  alue * json_page
111f0 5f 71 75 65 72 79 28 29 3b 0a 2f 2a 20 49 6d 70  _query();./* Imp
11200 6c 20 69 6e 20 6a 73 6f 6e 5f 72 65 70 6f 72 74  l in json_report
11210 2e 63 2e 20 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75  .c. */.cson_valu
11220 65 20 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f 72 65  e * json_page_re
11230 70 6f 72 74 28 29 3b 0a 2f 2a 20 49 6d 70 6c 20  port();./* Impl 
11240 69 6e 20 6a 73 6f 6e 5f 74 61 67 2e 63 2e 20 2a  in json_tag.c. *
11250 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a  /.cson_value * j
11260 73 6f 6e 5f 70 61 67 65 5f 74 61 67 28 29 3b 0a  son_page_tag();.
11270 2f 2a 20 49 6d 70 6c 20 69 6e 20 6a 73 6f 6e 5f  /* Impl in json_
11280 75 73 65 72 2e 63 2e 20 2a 2f 0a 63 73 6f 6e 5f  user.c. */.cson_
11290 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 70 61 67  value * json_pag
112a0 65 5f 75 73 65 72 28 29 3b 0a 2f 2a 20 49 6d 70  e_user();./* Imp
112b0 6c 20 69 6e 20 6a 73 6f 6e 5f 63 6f 6e 66 69 67  l in json_config
112c0 2e 63 2e 20 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75  .c. */.cson_valu
112d0 65 20 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f 63 6f  e * json_page_co
112e0 6e 66 69 67 28 29 3b 0a 2f 2a 20 49 6d 70 6c 20  nfig();./* Impl 
112f0 69 6e 20 6a 73 6f 6e 5f 66 69 6e 66 6f 2e 63 2e  in json_finfo.c.
11300 20 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65 20 2a   */.cson_value *
11310 20 6a 73 6f 6e 5f 70 61 67 65 5f 66 69 6e 66 6f   json_page_finfo
11320 28 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 70 70 69  ();../*.** Mappi
11330 6e 67 20 6f 66 20 6e 61 6d 65 73 20 74 6f 20 4a  ng of names to J
11340 53 4f 4e 20 70 61 67 65 73 2f 63 6f 6d 6d 61 6e  SON pages/comman
11350 64 73 2e 20 20 45 61 63 68 20 6e 61 6d 65 20 69  ds.  Each name i
11360 73 20 61 20 73 75 62 70 61 74 68 20 6f 66 0a 2a  s a subpath of.*
11370 2a 20 2f 6a 73 6f 6e 20 28 69 6e 20 43 47 49 20  * /json (in CGI 
11380 6d 6f 64 65 29 20 6f 72 20 61 20 73 75 62 63 6f  mode) or a subco
11390 6d 6d 61 6e 64 20 6f 66 20 74 68 65 20 6a 73 6f  mmand of the jso
113a0 6e 20 63 6f 6d 6d 61 6e 64 20 69 6e 20 43 4c 49  n command in CLI
113b0 20 6d 6f 64 65 0a 2a 2f 0a 73 74 61 74 69 63 20   mode.*/.static 
113c0 63 6f 6e 73 74 20 4a 73 6f 6e 50 61 67 65 44 65  const JsonPageDe
113d0 66 20 4a 73 6f 6e 50 61 67 65 44 65 66 73 5b 5d  f JsonPageDefs[]
113e0 20 3d 20 7b 0a 2f 2a 20 70 6c 65 61 73 65 20 6b   = {./* please k
113f0 65 65 70 20 61 6c 70 68 61 62 65 74 69 63 61 6c  eep alphabetical
11400 6c 79 20 73 6f 72 74 65 64 20 28 63 61 73 65 2d  ly sorted (case-
11410 69 6e 73 65 6e 73 69 74 69 76 65 29 20 66 6f 72  insensitive) for
11420 20 6d 61 69 6e 74 65 6e 61 6e 63 65 20 72 65 61   maintenance rea
11430 73 6f 6e 73 2e 20 2a 2f 0a 7b 22 61 6e 6f 6e 79  sons. */.{"anony
11440 6d 6f 75 73 50 61 73 73 77 6f 72 64 22 2c 20 6a  mousPassword", j
11450 73 6f 6e 5f 70 61 67 65 5f 61 6e 6f 6e 5f 70 61  son_page_anon_pa
11460 73 73 77 6f 72 64 2c 20 30 7d 2c 0a 7b 22 61 72  ssword, 0},.{"ar
11470 74 69 66 61 63 74 22 2c 20 6a 73 6f 6e 5f 70 61  tifact", json_pa
11480 67 65 5f 61 72 74 69 66 61 63 74 2c 20 30 7d 2c  ge_artifact, 0},
11490 0a 7b 22 62 72 61 6e 63 68 22 2c 20 6a 73 6f 6e  .{"branch", json
114a0 5f 70 61 67 65 5f 62 72 61 6e 63 68 2c 30 7d 2c  _page_branch,0},
114b0 0a 7b 22 63 61 70 22 2c 20 6a 73 6f 6e 5f 70 61  .{"cap", json_pa
114c0 67 65 5f 63 61 70 2c 20 30 7d 2c 0a 7b 22 63 6f  ge_cap, 0},.{"co
114d0 6e 66 69 67 22 2c 20 6a 73 6f 6e 5f 70 61 67 65  nfig", json_page
114e0 5f 63 6f 6e 66 69 67 2c 20 30 20 7d 2c 0a 7b 22  _config, 0 },.{"
114f0 64 69 66 66 22 2c 20 6a 73 6f 6e 5f 70 61 67 65  diff", json_page
11500 5f 64 69 66 66 2c 20 30 7d 2c 0a 7b 22 64 69 72  _diff, 0},.{"dir
11510 22 2c 20 6a 73 6f 6e 5f 70 61 67 65 5f 64 69 72  ", json_page_dir
11520 2c 20 30 7d 2c 0a 7b 22 66 69 6e 66 6f 22 2c 20  , 0},.{"finfo", 
11530 6a 73 6f 6e 5f 70 61 67 65 5f 66 69 6e 66 6f 2c  json_page_finfo,
11540 20 30 7d 2c 0a 7b 22 67 22 2c 20 6a 73 6f 6e 5f   0},.{"g", json_
11550 70 61 67 65 5f 67 2c 20 30 7d 2c 0a 7b 22 48 41  page_g, 0},.{"HA
11560 49 22 2c 6a 73 6f 6e 5f 70 61 67 65 5f 76 65 72  I",json_page_ver
11570 73 69 6f 6e 2c 30 7d 2c 0a 7b 22 6c 6f 67 69 6e  sion,0},.{"login
11580 22 2c 6a 73 6f 6e 5f 70 61 67 65 5f 6c 6f 67 69  ",json_page_logi
11590 6e 2c 30 7d 2c 0a 7b 22 6c 6f 67 6f 75 74 22 2c  n,0},.{"logout",
115a0 6a 73 6f 6e 5f 70 61 67 65 5f 6c 6f 67 6f 75 74  json_page_logout
115b0 2c 30 7d 2c 0a 7b 22 71 75 65 72 79 22 2c 6a 73  ,0},.{"query",js
115c0 6f 6e 5f 70 61 67 65 5f 71 75 65 72 79 2c 30 7d  on_page_query,0}
115d0 2c 0a 7b 22 72 65 62 75 69 6c 64 22 2c 6a 73 6f  ,.{"rebuild",jso
115e0 6e 5f 70 61 67 65 5f 72 65 62 75 69 6c 64 2c 30  n_page_rebuild,0
115f0 7d 2c 0a 7b 22 72 65 70 6f 72 74 22 2c 20 6a 73  },.{"report", js
11600 6f 6e 5f 70 61 67 65 5f 72 65 70 6f 72 74 2c 20  on_page_report, 
11610 30 7d 2c 0a 7b 22 72 65 73 75 6c 74 43 6f 64 65  0},.{"resultCode
11620 73 22 2c 20 6a 73 6f 6e 5f 70 61 67 65 5f 72 65  s", json_page_re
11630 73 75 6c 74 43 6f 64 65 73 2c 30 7d 2c 0a 7b 22  sultCodes,0},.{"
11640 73 74 61 74 22 2c 6a 73 6f 6e 5f 70 61 67 65 5f  stat",json_page_
11650 73 74 61 74 2c 30 7d 2c 0a 7b 22 74 61 67 22 2c  stat,0},.{"tag",
11660 20 6a 73 6f 6e 5f 70 61 67 65 5f 74 61 67 2c 30   json_page_tag,0
11670 7d 2c 0a 2f 2a 7b 22 74 69 63 6b 65 74 22 2c 20  },./*{"ticket", 
11680 6a 73 6f 6e 5f 70 61 67 65 5f 6e 79 69 2c 30 7d  json_page_nyi,0}
11690 2c 2a 2f 0a 7b 22 74 69 6d 65 6c 69 6e 65 22 2c  ,*/.{"timeline",
116a0 20 6a 73 6f 6e 5f 70 61 67 65 5f 74 69 6d 65 6c   json_page_timel
116b0 69 6e 65 2c 30 7d 2c 0a 7b 22 75 73 65 72 22 2c  ine,0},.{"user",
116c0 6a 73 6f 6e 5f 70 61 67 65 5f 75 73 65 72 2c 30  json_page_user,0
116d0 7d 2c 0a 7b 22 76 65 72 73 69 6f 6e 22 2c 6a 73  },.{"version",js
116e0 6f 6e 5f 70 61 67 65 5f 76 65 72 73 69 6f 6e 2c  on_page_version,
116f0 30 7d 2c 0a 7b 22 77 68 6f 61 6d 69 22 2c 6a 73  0},.{"whoami",js
11700 6f 6e 5f 70 61 67 65 5f 77 68 6f 61 6d 69 2c 30  on_page_whoami,0
11710 7d 2c 0a 7b 22 77 69 6b 69 22 2c 6a 73 6f 6e 5f  },.{"wiki",json_
11720 70 61 67 65 5f 77 69 6b 69 2c 30 7d 2c 0a 2f 2a  page_wiki,0},./*
11730 20 4c 61 73 74 20 65 6e 74 72 79 20 4d 55 53 54   Last entry MUST
11740 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 6e 61 6d   have a NULL nam
11750 65 2e 20 2a 2f 0a 7b 4e 55 4c 4c 2c 4e 55 4c 4c  e. */.{NULL,NULL
11760 2c 30 7d 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ,0}.};../*.** In
11770 74 65 72 6e 61 6c 20 68 65 6c 70 65 72 20 66 6f  ternal helper fo
11780 72 20 6a 73 6f 6e 5f 63 6d 64 5f 74 6f 70 28 29  r json_cmd_top()
11790 20 61 6e 64 20 6a 73 6f 6e 5f 70 61 67 65 5f 74   and json_page_t
117a0 6f 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 53 65 61 72  op()..**.** Sear
117b0 63 68 65 73 20 4a 73 6f 6e 50 61 67 65 44 65 66  ches JsonPageDef
117c0 73 20 66 6f 72 20 61 20 63 6f 6d 6d 61 6e 64 20  s for a command 
117d0 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 6e  with the given n
117e0 61 6d 65 2e 20 49 66 20 66 6f 75 6e 64 2c 0a 2a  ame. If found,.*
117f0 2a 20 69 74 20 69 73 20 75 73 65 64 20 74 6f 20  * it is used to 
11800 67 65 6e 65 72 61 74 65 20 61 6e 64 20 6f 75 74  generate and out
11810 70 75 74 20 61 20 4a 53 4f 4e 20 72 65 73 70 6f  put a JSON respo
11820 6e 73 65 2e 20 49 66 20 6e 6f 74 20 66 6f 75 6e  nse. If not foun
11830 64 2c 20 69 74 0a 2a 2a 20 67 65 6e 65 72 61 74  d, it.** generat
11840 65 73 20 61 20 4a 53 4f 4e 2d 73 74 79 6c 65 20  es a JSON-style 
11850 65 72 72 6f 72 20 72 65 73 70 6f 6e 73 65 2e 20  error response. 
11860 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63  Returns 0 on suc
11870 63 65 73 73 2c 20 6e 6f 6e 2d 30 0a 2a 2a 20 6f  cess, non-0.** o
11880 6e 20 65 72 72 6f 72 2e 20 4f 6e 20 65 72 72 6f  n error. On erro
11890 72 20 69 74 20 77 69 6c 6c 20 73 65 74 20 67 2e  r it will set g.
118a0 6a 73 6f 6e 27 73 20 65 72 72 6f 72 20 73 74 61  json's error sta
118b0 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
118c0 74 20 6a 73 6f 6e 5f 64 69 73 70 61 74 63 68 5f  t json_dispatch_
118d0 72 6f 6f 74 5f 63 6f 6d 6d 61 6e 64 28 20 63 68  root_command( ch
118e0 61 72 20 63 6f 6e 73 74 20 2a 20 7a 43 6f 6d 6d  ar const * zComm
118f0 61 6e 64 20 29 7b 0a 20 20 69 6e 74 20 72 63 20  and ){.  int rc 
11900 3d 20 30 3b 0a 20 20 63 73 6f 6e 5f 76 61 6c 75  = 0;.  cson_valu
11910 65 20 2a 20 70 61 79 6c 6f 61 64 20 3d 20 4e 55  e * payload = NU
11920 4c 4c 3b 0a 20 20 4a 73 6f 6e 50 61 67 65 44 65  LL;.  JsonPageDe
11930 66 20 63 6f 6e 73 74 20 2a 20 70 61 67 65 44 65  f const * pageDe
11940 66 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70 61 67 65  f = NULL;.  page
11950 44 65 66 20 3d 20 6a 73 6f 6e 5f 68 61 6e 64 6c  Def = json_handl
11960 65 72 5f 66 6f 72 5f 6e 61 6d 65 28 7a 43 6f 6d  er_for_name(zCom
11970 6d 61 6e 64 2c 26 4a 73 6f 6e 50 61 67 65 44 65  mand,&JsonPageDe
11980 66 73 5b 30 5d 29 3b 0a 20 20 69 66 28 20 21 20  fs[0]);.  if( ! 
11990 70 61 67 65 44 65 66 20 29 7b 0a 20 20 20 20 72  pageDef ){.    r
119a0 63 20 3d 20 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 55  c = FSL_JSON_E_U
119b0 4e 4b 4e 4f 57 4e 5f 43 4f 4d 4d 41 4e 44 3b 0a  NKNOWN_COMMAND;.
119c0 20 20 20 20 6a 73 6f 6e 5f 73 65 74 5f 65 72 72      json_set_err
119d0 28 20 72 63 2c 20 22 55 6e 6b 6e 6f 77 6e 20 63  ( rc, "Unknown c
119e0 6f 6d 6d 61 6e 64 3a 20 25 73 22 2c 20 7a 43 6f  ommand: %s", zCo
119f0 6d 6d 61 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65  mmand );.  }else
11a00 20 69 66 28 20 70 61 67 65 44 65 66 2d 3e 72 75   if( pageDef->ru
11a10 6e 4d 6f 64 65 20 3c 20 30 20 2f 2a 43 4c 49 20  nMode < 0 /*CLI 
11a20 6f 6e 6c 79 2a 2f 29 7b 0a 20 20 20 20 72 63 20  only*/){.    rc 
11a30 3d 20 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 57 52 4f  = FSL_JSON_E_WRO
11a40 4e 47 5f 4d 4f 44 45 3b 0a 20 20 7d 65 6c 73 65  NG_MODE;.  }else
11a50 20 69 66 28 20 28 67 2e 69 73 48 54 54 50 20 26   if( (g.isHTTP &
11a60 26 20 28 70 61 67 65 44 65 66 2d 3e 72 75 6e 4d  & (pageDef->runM
11a70 6f 64 65 20 3c 20 30 20 2f 2a 43 4c 49 20 6f 6e  ode < 0 /*CLI on
11a80 6c 79 2a 2f 29 29 0a 20 20 20 20 20 20 20 20 20  ly*/)).         
11a90 20 20 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20     ||.          
11aa0 20 20 28 21 67 2e 69 73 48 54 54 50 20 26 26 20    (!g.isHTTP && 
11ab0 28 70 61 67 65 44 65 66 2d 3e 72 75 6e 4d 6f 64  (pageDef->runMod
11ac0 65 20 3e 20 30 20 2f 2a 48 54 54 50 20 6f 6e 6c  e > 0 /*HTTP onl
11ad0 79 2a 2f 29 29 0a 20 20 20 20 20 20 20 20 20 20  y*/)).          
11ae0 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 46 53    ){.    rc = FS
11af0 4c 5f 4a 53 4f 4e 5f 45 5f 57 52 4f 4e 47 5f 4d  L_JSON_E_WRONG_M
11b00 4f 44 45 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 7b  ODE;.  }.  else{
11b10 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20  .    rc = 0;.   
11b20 20 67 2e 6a 73 6f 6e 2e 64 69 73 70 61 74 63 68   g.json.dispatch
11b30 44 65 70 74 68 20 3d 20 31 3b 0a 20 20 20 20 70  Depth = 1;.    p
11b40 61 79 6c 6f 61 64 20 3d 20 28 2a 70 61 67 65 44  ayload = (*pageD
11b50 65 66 2d 3e 66 75 6e 63 29 28 29 3b 0a 20 20 7d  ef->func)();.  }
11b60 0a 20 20 70 61 79 6c 6f 61 64 20 3d 20 6a 73 6f  .  payload = jso
11b70 6e 5f 63 72 65 61 74 65 5f 72 65 73 70 6f 6e 73  n_create_respons
11b80 65 28 72 63 2c 20 4e 55 4c 4c 2c 20 70 61 79 6c  e(rc, NULL, payl
11b90 6f 61 64 29 3b 0a 20 20 6a 73 6f 6e 5f 73 65 6e  oad);.  json_sen
11ba0 64 5f 72 65 73 70 6f 6e 73 65 28 70 61 79 6c 6f  d_response(paylo
11bb0 61 64 29 3b 0a 20 20 63 73 6f 6e 5f 76 61 6c 75  ad);.  cson_valu
11bc0 65 5f 66 72 65 65 28 70 61 79 6c 6f 61 64 29 3b  e_free(payload);
11bd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11be0 0a 23 69 66 64 65 66 20 46 4f 53 53 49 4c 5f 45  .#ifdef FOSSIL_E
11bf0 4e 41 42 4c 45 5f 4a 53 4f 4e 20 2f 2a 20 64 75  NABLE_JSON /* du
11c00 70 65 20 69 66 64 65 66 20 6e 65 65 64 65 64 20  pe ifdef needed 
11c10 66 6f 72 20 6d 6b 69 6e 64 65 78 20 2a 2f 0a 2f  for mkindex */./
11c20 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 6a 73  *.** WEBPAGE: js
11c30 6f 6e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 73 20 75  on.**.** Pages u
11c40 6e 64 65 72 20 2f 6a 73 6f 6e 2f 2e 2e 2e 20 6d  nder /json/... m
11c50 75 73 74 20 62 65 20 65 6e 74 65 72 65 64 20 69  ust be entered i
11c60 6e 74 6f 20 4a 73 6f 6e 50 61 67 65 44 65 66 73  nto JsonPageDefs
11c70 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  ..** This functi
11c80 6f 6e 20 64 69 73 70 61 74 63 68 65 73 20 74 68  on dispatches th
11c90 65 6d 2c 20 61 6e 64 20 69 73 20 74 68 65 20 48  em, and is the H
11ca0 54 54 50 20 65 71 75 69 76 61 6c 65 6e 74 20 6f  TTP equivalent o
11cb0 66 0a 2a 2a 20 6a 73 6f 6e 5f 63 6d 64 5f 74 6f  f.** json_cmd_to
11cc0 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 6a 73 6f  p()..*/.void jso
11cd0 6e 5f 70 61 67 65 5f 74 6f 70 28 76 6f 69 64 29  n_page_top(void)
11ce0 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
11cf0 20 7a 43 6f 6d 6d 61 6e 64 3b 0a 20 20 42 45 47   zCommand;.  BEG
11d00 49 4e 5f 54 49 4d 45 52 3b 0a 20 20 6a 73 6f 6e  IN_TIMER;.  json
11d10 5f 6d 6f 64 65 5f 62 6f 6f 74 73 74 72 61 70 28  _mode_bootstrap(
11d20 29 3b 0a 20 20 7a 43 6f 6d 6d 61 6e 64 20 3d 20  );.  zCommand = 
11d30 6a 73 6f 6e 5f 63 6f 6d 6d 61 6e 64 5f 61 72 67  json_command_arg
11d40 28 31 29 3b 0a 20 20 69 66 28 21 7a 43 6f 6d 6d  (1);.  if(!zComm
11d50 61 6e 64 20 7c 7c 20 21 2a 7a 43 6f 6d 6d 61 6e  and || !*zComman
11d60 64 29 7b 0a 20 20 20 20 6a 73 6f 6e 5f 64 69 73  d){.    json_dis
11d70 70 61 74 63 68 5f 6d 69 73 73 69 6e 67 5f 61 72  patch_missing_ar
11d80 67 73 5f 65 72 72 28 20 4a 73 6f 6e 50 61 67 65  gs_err( JsonPage
11d90 44 65 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20  Defs,.          
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 22 4e 6f 20 63 6f            "No co
11dc0 6d 6d 61 6e 64 20 28 73 75 62 2d 70 61 74 68 29  mmand (sub-path)
11dd0 20 73 70 65 63 69 66 69 65 64 2e 22 0a 20 20 20   specified.".   
11de0 20 20 20 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 22 20 54 72 79 20 6f 6e 65 20 6f 66 3a 20 22   " Try one of: "
11e10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
11e20 20 7d 0a 20 20 6a 73 6f 6e 5f 64 69 73 70 61 74   }.  json_dispat
11e30 63 68 5f 72 6f 6f 74 5f 63 6f 6d 6d 61 6e 64 28  ch_root_command(
11e40 20 7a 43 6f 6d 6d 61 6e 64 20 29 3b 0a 7d 0a 23   zCommand );.}.#
11e50 65 6e 64 69 66 20 2f 2a 20 46 4f 53 53 49 4c 5f  endif /* FOSSIL_
11e60 45 4e 41 42 4c 45 5f 4a 53 4f 4e 20 66 6f 72 20  ENABLE_JSON for 
11e70 6d 6b 69 6e 64 65 78 20 2a 2f 0a 0a 23 69 66 64  mkindex */..#ifd
11e80 65 66 20 46 4f 53 53 49 4c 5f 45 4e 41 42 4c 45  ef FOSSIL_ENABLE
11e90 5f 4a 53 4f 4e 20 2f 2a 20 64 75 70 65 20 69 66  _JSON /* dupe if
11ea0 64 65 66 20 6e 65 65 64 65 64 20 66 6f 72 20 6d  def needed for m
11eb0 6b 69 6e 64 65 78 20 2a 2f 0a 2f 2a 0a 2a 2a 20  kindex */./*.** 
11ec0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69  This function di
11ed0 73 70 61 74 63 68 65 73 20 6a 73 6f 6e 20 63 6f  spatches json co
11ee0 6d 6d 61 6e 64 73 20 61 6e 64 20 69 73 20 74 68  mmands and is th
11ef0 65 20 43 4c 49 20 65 71 75 69 76 61 6c 65 6e 74  e CLI equivalent
11f00 20 6f 66 0a 2a 2a 20 6a 73 6f 6e 5f 70 61 67 65   of.** json_page
11f10 5f 74 6f 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 43 4f  _top()..**.** CO
11f20 4d 4d 41 4e 44 3a 20 6a 73 6f 6e 0a 2a 2a 0a 2a  MMAND: json.**.*
11f30 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c  * Usage: %fossil
11f40 20 6a 73 6f 6e 20 53 55 42 43 4f 4d 4d 41 4e 44   json SUBCOMMAND
11f50 20 3f 4f 50 54 49 4f 4e 53 3f 0a 2a 2a 0a 2a 2a   ?OPTIONS?.**.**
11f60 20 49 6e 20 43 4c 49 20 6d 6f 64 65 2c 20 74 68   In CLI mode, th
11f70 65 20 2d 52 20 52 45 50 4f 20 63 6f 6d 6d 6f 6e  e -R REPO common
11f80 20 6f 70 74 69 6f 6e 20 69 73 20 73 75 70 70 6f   option is suppo
11f90 72 74 65 64 2e 20 44 75 65 20 74 6f 20 6c 69 6d  rted. Due to lim
11fa0 69 74 61 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 74  itations.** in t
11fb0 68 65 20 61 72 67 75 6d 65 6e 74 20 64 69 73 70  he argument disp
11fc0 61 74 63 68 69 6e 67 20 63 6f 64 65 2c 20 61 6e  atching code, an
11fd0 79 20 2d 46 4c 41 47 53 20 6d 75 73 74 20 63 6f  y -FLAGS must co
11fe0 6d 65 20 61 66 74 65 72 20 74 68 65 20 66 69 6e  me after the fin
11ff0 61 6c 0a 2a 2a 20 73 75 62 2d 20 28 6f 72 20 73  al.** sub- (or s
12000 75 62 73 75 62 2d 29 20 63 6f 6d 6d 61 6e 64 2e  ubsub-) command.
12010 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 61  .**.** The comma
12020 6e 64 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a  nds include:.**.
12030 2a 2a 20 20 20 61 6e 6f 6e 79 6d 6f 75 73 50 61  **   anonymousPa
12040 73 73 6f 72 64 0a 2a 2a 20 20 20 61 72 74 69 66  ssord.**   artif
12050 61 63 74 0a 2a 2a 20 20 20 62 72 61 6e 63 68 0a  act.**   branch.
12060 2a 2a 20 20 20 63 61 70 0a 2a 2a 20 20 20 64 69  **   cap.**   di
12070 66 66 0a 2a 2a 20 20 20 67 0a 2a 2a 20 20 20 6c  ff.**   g.**   l
12080 6f 67 69 6e 0a 2a 2a 20 20 20 6c 6f 67 6f 75 74  ogin.**   logout
12090 0a 2a 2a 20 20 20 71 75 65 72 79 0a 2a 2a 20 20  .**   query.**  
120a0 20 72 65 62 75 69 6c 64 0a 2a 2a 20 20 20 72 65   rebuild.**   re
120b0 70 6f 72 74 0a 2a 2a 20 20 20 72 65 73 75 6c 74  port.**   result
120c0 43 6f 64 65 73 0a 2a 2a 20 20 20 73 74 61 74 0a  Codes.**   stat.
120d0 2a 2a 20 20 20 74 61 67 0a 2a 2a 20 20 20 74 69  **   tag.**   ti
120e0 6d 65 6c 69 6e 65 0a 2a 2a 20 20 20 75 73 65 72  meline.**   user
120f0 0a 2a 2a 20 20 20 76 65 72 73 69 6f 6e 20 28 61  .**   version (a
12100 6c 69 61 73 3a 20 48 41 49 29 0a 2a 2a 20 20 20  lias: HAI).**   
12110 77 68 6f 61 6d 69 0a 2a 2a 20 20 20 77 69 6b 69  whoami.**   wiki
12120 0a 2a 2a 0a 2a 2a 20 52 75 6e 20 27 25 66 6f 73  .**.** Run '%fos
12130 73 69 6c 20 6a 73 6f 6e 27 20 77 69 74 68 6f 75  sil json' withou
12140 74 20 61 6e 79 20 73 75 62 63 6f 6d 6d 61 6e 64  t any subcommand
12150 20 74 6f 20 73 65 65 20 74 68 65 20 66 75 6c 6c   to see the full
12160 20 6c 69 73 74 20 28 62 75 74 20 62 65 0a 2a 2a   list (but be.**
12170 20 61 77 61 72 65 20 74 68 61 74 20 73 6f 6d 65   aware that some
12180 20 6c 69 73 74 65 64 20 6d 69 67 68 74 20 6e 6f   listed might no
12190 74 20 79 65 74 20 62 65 20 69 6d 70 6c 65 6d 65  t yet be impleme
121a0 6e 74 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 50 53 3a  nted)..**.** PS:
121b0 20 74 68 65 20 6e 6f 74 61 62 6c 65 20 54 4f 44   the notable TOD
121c0 4f 2d 63 6f 6d 6d 61 6e 64 73 20 69 6e 63 6c 75  O-commands inclu
121d0 64 65 3a 20 63 6f 6e 66 69 67 2c 20 64 69 72 2c  de: config, dir,
121e0 20 66 69 6e 66 6f 2c 20 74 69 63 6b 65 74 0a 2a   finfo, ticket.*
121f0 2a 0a 2a 2f 0a 76 6f 69 64 20 6a 73 6f 6e 5f 63  *.*/.void json_c
12200 6d 64 5f 74 6f 70 28 76 6f 69 64 29 7b 0a 20 20  md_top(void){.  
12210 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 63 6d 64  char const * cmd
12220 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 72   = NULL;.  int r
12230 63 20 3d 20 30 3b 0a 20 20 42 45 47 49 4e 5f 54  c = 0;.  BEGIN_T
12240 49 4d 45 52 3b 0a 20 20 6d 65 6d 73 65 74 28 20  IMER;.  memset( 
12250 26 67 2e 70 65 72 6d 2c 20 30 78 66 66 2c 20 73  &g.perm, 0xff, s
12260 69 7a 65 6f 66 28 67 2e 70 65 72 6d 29 20 29 0a  izeof(g.perm) ).
12270 20 20 20 20 2f 2a 20 49 6e 20 43 4c 49 20 6d 6f      /* In CLI mo
12280 64 65 20 66 6f 73 73 69 6c 20 64 6f 65 73 20 6e  de fossil does n
12290 6f 74 20 75 73 65 20 70 65 72 6d 69 73 73 69 6f  ot use permissio
122a0 6e 73 0a 20 20 20 20 20 20 20 61 6e 64 20 74 68  ns.       and th
122b0 65 79 20 61 6c 6c 20 64 65 66 61 75 6c 74 20 74  ey all default t
122c0 6f 20 66 61 6c 73 65 2e 20 57 65 20 65 6e 61 62  o false. We enab
122d0 6c 65 20 74 68 65 6d 0a 20 20 20 20 20 20 20 68  le them.       h
122e0 65 72 65 20 62 65 63 61 75 73 65 20 28 41 29 20  ere because (A) 
122f0 66 6f 73 73 69 6c 20 64 6f 65 73 6e 27 74 20 75  fossil doesn't u
12300 73 65 20 74 68 65 6d 20 69 6e 20 6c 6f 63 61 6c  se them in local
12310 0a 20 20 20 20 20 20 20 6d 6f 64 65 20 62 75 74  .       mode but
12320 20 28 42 29 20 68 61 76 69 6e 67 20 74 68 65 6d   (B) having them
12330 20 73 65 74 20 67 69 76 65 73 20 75 73 20 6f 6e   set gives us on
12340 65 20 6c 65 73 73 0a 20 20 20 20 20 20 20 64 69  e less.       di
12350 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20  fference in the 
12360 43 4c 49 2f 43 47 49 2f 53 65 72 76 65 72 2d 6d  CLI/CGI/Server-m
12370 6f 64 65 20 4a 53 4f 4e 0a 20 20 20 20 20 20 20  ode JSON.       
12380 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f  handling..    */
12390 0a 20 20 20 20 3b 0a 20 20 6a 73 6f 6e 5f 6d 61  .    ;.  json_ma
123a0 69 6e 5f 62 6f 6f 74 73 74 72 61 70 28 29 3b 0a  in_bootstrap();.
123b0 20 20 6a 73 6f 6e 5f 6d 6f 64 65 5f 62 6f 6f 74    json_mode_boot
123c0 73 74 72 61 70 28 29 3b 0a 20 20 69 66 28 20 32  strap();.  if( 2
123d0 20 3e 20 63 73 6f 6e 5f 61 72 72 61 79 5f 6c 65   > cson_array_le
123e0 6e 67 74 68 5f 67 65 74 28 67 2e 6a 73 6f 6e 2e  ngth_get(g.json.
123f0 63 6d 64 2e 61 29 20 29 7b 0a 20 20 20 20 67 6f  cmd.a) ){.    go
12400 74 6f 20 75 73 61 67 65 3b 0a 20 20 7d 0a 23 69  to usage;.  }.#i
12410 66 20 30 0a 20 20 6a 73 6f 6e 5f 77 61 72 6e 28  f 0.  json_warn(
12420 46 53 4c 5f 4a 53 4f 4e 5f 57 5f 52 4f 57 5f 54  FSL_JSON_W_ROW_T
12430 4f 5f 4a 53 4f 4e 5f 46 41 49 4c 45 44 2c 20 22  O_JSON_FAILED, "
12440 4a 75 73 74 20 74 65 73 74 69 6e 67 2e 22 29 3b  Just testing.");
12450 0a 20 20 6a 73 6f 6e 5f 77 61 72 6e 28 46 53 4c  .  json_warn(FSL
12460 5f 4a 53 4f 4e 5f 57 5f 52 4f 57 5f 54 4f 5f 4a  _JSON_W_ROW_TO_J
12470 53 4f 4e 5f 46 41 49 4c 45 44 2c 20 22 4a 75 73  SON_FAILED, "Jus
12480 74 20 74 65 73 74 69 6e 67 20 61 67 61 69 6e 2e  t testing again.
12490 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 63 6d 64  ");.#endif.  cmd
124a0 20 3d 20 6a 73 6f 6e 5f 63 6f 6d 6d 61 6e 64 5f   = json_command_
124b0 61 72 67 28 31 29 3b 0a 20 20 69 66 28 20 21 63  arg(1);.  if( !c
124c0 6d 64 20 7c 7c 20 21 2a 63 6d 64 20 29 7b 0a 20  md || !*cmd ){. 
124d0 20 20 20 67 6f 74 6f 20 75 73 61 67 65 3b 0a 20     goto usage;. 
124e0 20 7d 0a 20 20 72 63 20 3d 20 6a 73 6f 6e 5f 64   }.  rc = json_d
124f0 69 73 70 61 74 63 68 5f 72 6f 6f 74 5f 63 6f 6d  ispatch_root_com
12500 6d 61 6e 64 28 20 63 6d 64 20 29 3b 0a 20 20 69  mand( cmd );.  i
12510 66 28 30 20 21 3d 20 72 63 29 7b 0a 20 20 20 20  f(0 != rc){.    
12520 2f 2a 20 46 49 58 4d 45 3a 20 77 65 20 6e 65 65  /* FIXME: we nee
12530 64 20 61 20 77 61 79 20 6f 66 20 70 61 73 73 69  d a way of passi
12540 6e 67 20 74 68 69 73 20 65 72 72 6f 72 20 62 61  ng this error ba
12550 63 6b 0a 20 20 20 20 20 20 20 75 70 20 74 6f 20  ck.       up to 
12560 74 68 65 20 72 6f 75 74 69 6e 65 20 77 68 69 63  the routine whic
12570 68 20 63 61 6c 6c 65 64 20 74 68 69 73 20 63 61  h called this ca
12580 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 65  llback..       e
12590 2e 67 2e 20 61 64 64 20 67 2e 65 72 72 43 6f 64  .g. add g.errCod
125a0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
125b0 73 73 69 6c 5f 65 78 69 74 28 31 29 3b 0a 20 20  ssil_exit(1);.  
125c0 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 20 20 75 73  }.  return;.  us
125d0 61 67 65 3a 0a 20 20 7b 0a 20 20 20 20 63 73 6f  age:.  {.    cso
125e0 6e 5f 76 61 6c 75 65 20 2a 20 70 61 79 6c 6f 61  n_value * payloa
125f0 64 3b 0a 20 20 20 20 6a 73 6f 6e 5f 64 69 73 70  d;.    json_disp
12600 61 74 63 68 5f 6d 69 73 73 69 6e 67 5f 61 72 67  atch_missing_arg
12610 73 5f 65 72 72 28 20 4a 73 6f 6e 50 61 67 65 44  s_err( JsonPageD
12620 65 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  efs,.           
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 22 4e 6f 20 73 75 62           "No sub
12650 63 6f 6d 6d 61 6e 64 20 73 70 65 63 69 66 69 65  command specifie
12660 64 2e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  d.".            
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 22 20 54 72 79 20 6f 6e          " Try on
12690 65 20 6f 66 3a 20 22 29 3b 0a 20 20 20 20 70 61  e of: ");.    pa
126a0 79 6c 6f 61 64 20 3d 20 6a 73 6f 6e 5f 63 72 65  yload = json_cre
126b0 61 74 65 5f 72 65 73 70 6f 6e 73 65 28 30 2c 20  ate_response(0, 
126c0 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  NULL, NULL);.   
126d0 20 6a 73 6f 6e 5f 73 65 6e 64 5f 72 65 73 70 6f   json_send_respo
126e0 6e 73 65 28 70 61 79 6c 6f 61 64 29 3b 0a 20 20  nse(payload);.  
126f0 20 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 66 72 65    cson_value_fre
12700 65 28 70 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  e(payload);.    
12710 66 6f 73 73 69 6c 5f 65 78 69 74 28 31 29 3b 0a  fossil_exit(1);.
12720 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
12730 46 4f 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 4a 53  FOSSIL_ENABLE_JS
12740 4f 4e 20 66 6f 72 20 6d 6b 69 6e 64 65 78 20 2a  ON for mkindex *
12750 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 46 4f 53  /..#endif /* FOS
12760 53 49 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 20  SIL_ENABLE_JSON 
12770 2a 2f 0a                                         */.