Fossil

Hex Artifact Content
Login

Artifact abda9047e6031f55078e6254f9c1dd50dc54f2b2:


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 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f  ).**.** This pro
0110: 67 72 61 6d 20 69 73 20 64 69 73 74 72 69 62 75  gram is distribu
0120: 74 65 64 20 69 6e 20 74 68 65 20 68 6f 70 65 20  ted in the hope 
0130: 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
0140: 75 73 65 66 75 6c 2c 0a 2a 2a 20 62 75 74 20 77  useful,.** but w
0150: 69 74 68 6f 75 74 20 61 6e 79 20 77 61 72 72 61  ithout any warra
0160: 6e 74 79 3b 20 77 69 74 68 6f 75 74 20 65 76 65  nty; without eve
0170: 6e 20 74 68 65 20 69 6d 70 6c 69 65 64 20 77 61  n the implied wa
0180: 72 72 61 6e 74 79 20 6f 66 0a 2a 2a 20 6d 65 72  rranty of.** mer
0190: 63 68 61 6e 74 61 62 69 6c 69 74 79 20 6f 72 20  chantability or 
01a0: 66 69 74 6e 65 73 73 20 66 6f 72 20 61 20 70 61  fitness for a pa
01b0: 72 74 69 63 75 6c 61 72 20 70 75 72 70 6f 73 65  rticular purpose
01c0: 2e 0a 2a 2a 0a 2a 2a 20 41 75 74 68 6f 72 20 63  ..**.** Author c
01d0: 6f 6e 74 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  ontact informati
01e0: 6f 6e 3a 0a 2a 2a 20 20 20 64 72 68 40 68 77 61  on:.**   drh@hwa
01f0: 63 69 2e 63 6f 6d 0a 2a 2a 20 20 20 68 74 74 70  ci.com.**   http
0200: 3a 2f 2f 77 77 77 2e 68 77 61 63 69 2e 63 6f 6d  ://www.hwaci.com
0210: 2f 64 72 68 2f 0a 2a 2a 0a 2a 2f 0a 0a 23 69 6e  /drh/.**.*/..#in
0220: 63 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e 68 22  clude "config.h"
0230: 0a 23 69 6e 63 6c 75 64 65 20 22 6a 73 6f 6e 5f  .#include "json_
0240: 72 65 70 6f 72 74 2e 68 22 0a 0a 23 69 66 20 49  report.h"..#if I
0250: 4e 54 45 52 46 41 43 45 0a 23 69 6e 63 6c 75 64  NTERFACE.#includ
0260: 65 20 22 6a 73 6f 6e 5f 64 65 74 61 69 6c 2e 68  e "json_detail.h
0270: 22 0a 23 65 6e 64 69 66 0a 0a 0a 73 74 61 74 69  ".#endif...stati
0280: 63 20 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a  c cson_value * j
0290: 73 6f 6e 5f 72 65 70 6f 72 74 5f 63 72 65 61 74  son_report_creat
02a0: 65 28 29 3b 0a 73 74 61 74 69 63 20 63 73 6f 6e  e();.static cson
02b0: 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 72 65  _value * json_re
02c0: 70 6f 72 74 5f 67 65 74 28 29 3b 0a 73 74 61 74  port_get();.stat
02d0: 69 63 20 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20  ic cson_value * 
02e0: 6a 73 6f 6e 5f 72 65 70 6f 72 74 5f 6c 69 73 74  json_report_list
02f0: 28 29 3b 0a 73 74 61 74 69 63 20 63 73 6f 6e 5f  ();.static cson_
0300: 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 72 65 70  value * json_rep
0310: 6f 72 74 5f 72 75 6e 28 29 3b 0a 73 74 61 74 69  ort_run();.stati
0320: 63 20 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a  c cson_value * j
0330: 73 6f 6e 5f 72 65 70 6f 72 74 5f 73 61 76 65 28  son_report_save(
0340: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 70 70 69 6e  );../*.** Mappin
0350: 67 20 6f 66 20 2f 6a 73 6f 6e 2f 72 65 70 6f 72  g of /json/repor
0360: 74 2f 58 58 58 20 63 6f 6d 6d 61 6e 64 73 2f 70  t/XXX commands/p
0370: 61 74 68 73 20 74 6f 20 63 61 6c 6c 62 61 63 6b  aths to callback
0380: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
0390: 73 74 20 4a 73 6f 6e 50 61 67 65 44 65 66 20 4a  st JsonPageDef J
03a0: 73 6f 6e 50 61 67 65 44 65 66 73 5f 52 65 70 6f  sonPageDefs_Repo
03b0: 72 74 5b 5d 20 3d 20 7b 0a 7b 22 63 72 65 61 74  rt[] = {.{"creat
03c0: 65 22 2c 20 6a 73 6f 6e 5f 72 65 70 6f 72 74 5f  e", json_report_
03d0: 63 72 65 61 74 65 2c 20 30 7d 2c 0a 7b 22 67 65  create, 0},.{"ge
03e0: 74 22 2c 20 6a 73 6f 6e 5f 72 65 70 6f 72 74 5f  t", json_report_
03f0: 67 65 74 2c 20 30 7d 2c 0a 7b 22 6c 69 73 74 22  get, 0},.{"list"
0400: 2c 20 6a 73 6f 6e 5f 72 65 70 6f 72 74 5f 6c 69  , json_report_li
0410: 73 74 2c 20 30 7d 2c 0a 7b 22 72 75 6e 22 2c 20  st, 0},.{"run", 
0420: 6a 73 6f 6e 5f 72 65 70 6f 72 74 5f 72 75 6e 2c  json_report_run,
0430: 20 30 7d 2c 0a 7b 22 73 61 76 65 22 2c 20 6a 73   0},.{"save", js
0440: 6f 6e 5f 72 65 70 6f 72 74 5f 73 61 76 65 2c 20  on_report_save, 
0450: 30 7d 2c 0a 2f 2a 20 4c 61 73 74 20 65 6e 74 72  0},./* Last entr
0460: 79 20 4d 55 53 54 20 68 61 76 65 20 61 20 4e 55  y MUST have a NU
0470: 4c 4c 20 6e 61 6d 65 2e 20 2a 2f 0a 7b 4e 55 4c  LL name. */.{NUL
0480: 4c 2c 4e 55 4c 4c 2c 30 7d 0a 7d 3b 0a 2f 2a 0a  L,NULL,0}.};./*.
0490: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
04a0: 6e 20 6f 66 20 74 68 65 20 2f 6a 73 6f 6e 2f 72  n of the /json/r
04b0: 65 70 6f 72 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  eport page..**.*
04c0: 2a 0a 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65 20  *.*/.cson_value 
04d0: 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f 72 65 70 6f  * json_page_repo
04e0: 72 74 28 29 7b 0a 20 20 69 66 28 21 67 2e 70 65  rt(){.  if(!g.pe
04f0: 72 6d 2e 52 64 54 6b 74 20 26 26 20 21 67 2e 70  rm.RdTkt && !g.p
0500: 65 72 6d 2e 4e 65 77 54 6b 74 20 29 7b 0a 20 20  erm.NewTkt ){.  
0510: 20 20 6a 73 6f 6e 5f 73 65 74 5f 65 72 72 28 46    json_set_err(F
0520: 53 4c 5f 4a 53 4f 4e 5f 45 5f 44 45 4e 49 45 44  SL_JSON_E_DENIED
0530: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0540: 20 20 20 22 52 65 71 75 69 72 65 73 20 27 72 27     "Requires 'r'
0550: 20 6f 72 20 27 6e 27 20 70 65 72 6d 69 73 73 69   or 'n' permissi
0560: 6f 6e 73 2e 22 29 3b 0a 20 20 20 20 72 65 74 75  ons.");.    retu
0570: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72  rn NULL;.  }.  r
0580: 65 74 75 72 6e 20 6a 73 6f 6e 5f 70 61 67 65 5f  eturn json_page_
0590: 64 69 73 70 61 74 63 68 5f 68 65 6c 70 65 72 28  dispatch_helper(
05a0: 4a 73 6f 6e 50 61 67 65 44 65 66 73 5f 52 65 70  JsonPageDefs_Rep
05b0: 6f 72 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ort);.}../*.** S
05c0: 65 61 72 63 68 65 73 20 74 68 65 20 65 6e 76 69  earches the envi
05d0: 72 6f 6e 6d 65 6e 74 20 66 6f 72 20 61 20 22 72  ronment for a "r
05e0: 65 70 6f 72 74 22 20 70 61 72 61 6d 65 74 65 72  eport" parameter
05f0: 0a 2a 2a 20 28 43 4c 49 3a 20 2d 72 65 70 6f 72  .** (CLI: -repor
0600: 74 2f 2d 72 20 23 29 2e 0a 2a 2a 0a 2a 2a 20 49  t/-r #)..**.** I
0610: 66 20 6f 6e 65 20 69 73 20 6e 6f 74 20 66 6f 75  f one is not fou
0620: 6e 64 20 61 6e 64 20 61 72 67 50 6f 73 20 69 73  nd and argPos is
0630: 20 3e 30 20 74 68 65 6e 20 6a 73 6f 6e 5f 63 6f   >0 then json_co
0640: 6d 6d 61 6e 64 5f 61 72 67 28 29 0a 2a 2a 20 69  mmand_arg().** i
0650: 73 20 63 68 65 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a  s checked..**.**
0660: 20 52 65 74 75 72 6e 73 20 3e 30 20 28 74 68 65   Returns >0 (the
0670: 20 72 65 70 6f 72 74 20 6e 75 6d 62 65 72 29 20   report number) 
0680: 6f 6e 20 73 75 63 63 65 73 73 20 2e 0a 2a 2f 0a  on success ..*/.
0690: 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 5f  static int json_
06a0: 72 65 70 6f 72 74 5f 67 65 74 5f 6e 75 6d 62 65  report_get_numbe
06b0: 72 28 69 6e 74 20 61 72 67 50 6f 73 29 7b 0a 20  r(int argPos){. 
06c0: 20 69 6e 74 20 6e 52 65 70 6f 72 74 20 3d 20 6a   int nReport = j
06d0: 73 6f 6e 5f 66 69 6e 64 5f 6f 70 74 69 6f 6e 5f  son_find_option_
06e0: 69 6e 74 28 22 72 65 70 6f 72 74 22 2c 4e 55 4c  int("report",NUL
06f0: 4c 2c 22 72 22 2c 2d 31 29 3b 0a 20 20 69 66 28  L,"r",-1);.  if(
0700: 20 28 6e 52 65 70 6f 72 74 3c 3d 30 29 20 26 26   (nReport<=0) &&
0710: 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 69 73 5f 69   cson_value_is_i
0720: 6e 74 65 67 65 72 28 67 2e 6a 73 6f 6e 2e 72 65  nteger(g.json.re
0730: 71 50 61 79 6c 6f 61 64 2e 76 29 29 7b 0a 20 20  qPayload.v)){.  
0740: 20 20 6e 52 65 70 6f 72 74 20 3d 20 63 73 6f 6e    nReport = cson
0750: 5f 76 61 6c 75 65 5f 67 65 74 5f 69 6e 74 65 67  _value_get_integ
0760: 65 72 28 67 2e 6a 73 6f 6e 2e 72 65 71 50 61 79  er(g.json.reqPay
0770: 6c 6f 61 64 2e 76 29 3b 0a 20 20 7d 0a 20 20 69  load.v);.  }.  i
0780: 66 28 20 28 6e 52 65 70 6f 72 74 20 3c 3d 20 30  f( (nReport <= 0
0790: 29 20 26 26 20 28 61 72 67 50 6f 73 3e 30 29 20  ) && (argPos>0) 
07a0: 29 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  ){.    char cons
07b0: 74 20 2a 20 61 72 67 20 3d 20 6a 73 6f 6e 5f 63  t * arg = json_c
07c0: 6f 6d 6d 61 6e 64 5f 61 72 67 28 61 72 67 50 6f  ommand_arg(argPo
07d0: 73 29 3b 0a 20 20 20 20 69 66 28 61 72 67 20 26  s);.    if(arg &
07e0: 26 20 66 6f 73 73 69 6c 5f 69 73 64 69 67 69 74  & fossil_isdigit
07f0: 28 2a 61 72 67 29 29 20 7b 0a 20 20 20 20 20 20  (*arg)) {.      
0800: 6e 52 65 70 6f 72 74 20 3d 20 61 74 6f 69 28 61  nReport = atoi(a
0810: 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rg);.    }.  }. 
0820: 20 72 65 74 75 72 6e 20 6e 52 65 70 6f 72 74 3b   return nReport;
0830: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 73 6f 6e 5f  .}..static cson_
0840: 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 72 65 70  value * json_rep
0850: 6f 72 74 5f 63 72 65 61 74 65 28 29 7b 0a 20 20  ort_create(){.  
0860: 6a 73 6f 6e 5f 73 65 74 5f 65 72 72 28 46 53 4c  json_set_err(FSL
0870: 5f 4a 53 4f 4e 5f 45 5f 4e 59 49 2c 20 4e 55 4c  _JSON_E_NYI, NUL
0880: 4c 29 3b 0a 20 20 72 65 74 75 72 6e 20 4e 55 4c  L);.  return NUL
0890: 4c 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 73 6f  L;.}..static cso
08a0: 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 72  n_value * json_r
08b0: 65 70 6f 72 74 5f 67 65 74 28 29 7b 0a 20 20 69  eport_get(){.  i
08c0: 6e 74 20 6e 52 65 70 6f 72 74 3b 0a 20 20 53 74  nt nReport;.  St
08d0: 6d 74 20 71 20 3d 20 65 6d 70 74 79 5f 53 74 6d  mt q = empty_Stm
08e0: 74 3b 0a 20 20 63 73 6f 6e 5f 76 61 6c 75 65 20  t;.  cson_value 
08f0: 2a 20 70 61 79 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  * pay = NULL;.. 
0900: 20 69 66 28 21 67 2e 70 65 72 6d 2e 54 6b 74 46   if(!g.perm.TktF
0910: 6d 74 29 7b 0a 20 20 20 20 6a 73 6f 6e 5f 73 65  mt){.    json_se
0920: 74 5f 65 72 72 28 46 53 4c 5f 4a 53 4f 4e 5f 45  t_err(FSL_JSON_E
0930: 5f 44 45 4e 49 45 44 2c 0a 20 20 20 20 20 20 20  _DENIED,.       
0940: 20 20 20 20 20 20 20 20 20 20 22 52 65 71 75 69            "Requi
0950: 72 65 73 20 27 74 27 20 70 72 69 76 69 6c 65 67  res 't' privileg
0960: 65 73 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  es.");.    retur
0970: 6e 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 6e 52  n NULL;.  }.  nR
0980: 65 70 6f 72 74 20 3d 20 6a 73 6f 6e 5f 72 65 70  eport = json_rep
0990: 6f 72 74 5f 67 65 74 5f 6e 75 6d 62 65 72 28 33  ort_get_number(3
09a0: 29 3b 0a 20 20 69 66 28 6e 52 65 70 6f 72 74 20  );.  if(nReport 
09b0: 3c 3d 30 29 7b 0a 20 20 20 20 6a 73 6f 6e 5f 73  <=0){.    json_s
09c0: 65 74 5f 65 72 72 28 46 53 4c 5f 4a 53 4f 4e 5f  et_err(FSL_JSON_
09d0: 45 5f 4d 49 53 53 49 4e 47 5f 41 52 47 53 2c 0a  E_MISSING_ARGS,.
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09f0: 20 22 4d 69 73 73 69 6e 67 20 6f 72 20 69 6e 76   "Missing or inv
0a00: 61 6c 69 64 20 27 72 65 70 6f 72 74 27 20 28 2d  alid 'report' (-
0a10: 72 29 20 70 61 72 61 6d 65 74 65 72 2e 22 29 3b  r) parameter.");
0a20: 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
0a30: 3b 0a 20 20 7d 0a 0a 20 20 64 62 5f 70 72 65 70  ;.  }..  db_prep
0a40: 61 72 65 28 26 71 2c 22 53 45 4c 45 43 54 20 72  are(&q,"SELECT r
0a50: 6e 20 41 53 20 72 65 70 6f 72 74 2c 22 0a 20 20  n AS report,".  
0a60: 20 20 20 20 20 20 20 20 20 20 20 22 20 6f 77 6e             " own
0a70: 65 72 20 41 53 20 6f 77 6e 65 72 2c 22 0a 20 20  er AS owner,".  
0a80: 20 20 20 20 20 20 20 20 20 20 20 22 20 74 69 74             " tit
0a90: 6c 65 20 41 53 20 74 69 74 6c 65 2c 22 0a 20 20  le AS title,".  
0aa0: 20 20 20 20 20 20 20 20 20 20 20 22 20 63 61 73             " cas
0ab0: 74 28 73 74 72 66 74 69 6d 65 28 27 25 25 73 27  t(strftime('%%s'
0ac0: 2c 6d 74 69 6d 65 29 20 61 73 20 69 6e 74 29 20  ,mtime) as int) 
0ad0: 61 73 20 74 69 6d 65 73 74 61 6d 70 2c 22 0a 20  as timestamp,". 
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 63 6f              " co
0af0: 6c 73 20 61 73 20 63 6f 6c 75 6d 6e 73 2c 22 0a  ls as columns,".
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 73               " s
0b10: 71 6c 63 6f 64 65 20 61 73 20 73 71 6c 43 6f 64  qlcode as sqlCod
0b20: 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e".             
0b30: 22 20 46 52 4f 4d 20 72 65 70 6f 72 74 66 6d 74  " FROM reportfmt
0b40: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ".             "
0b50: 20 57 48 45 52 45 20 72 6e 3d 25 64 22 2c 0a 20   WHERE rn=%d",. 
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 6e 52 65 70              nRep
0b70: 6f 72 74 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  ort);.  if( SQLI
0b80: 54 45 5f 52 4f 57 20 21 3d 20 64 62 5f 73 74 65  TE_ROW != db_ste
0b90: 70 28 26 71 29 20 29 7b 0a 20 20 20 20 64 62 5f  p(&q) ){.    db_
0ba0: 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20  finalize(&q);.  
0bb0: 20 20 6a 73 6f 6e 5f 73 65 74 5f 65 72 72 28 46    json_set_err(F
0bc0: 53 4c 5f 4a 53 4f 4e 5f 45 5f 52 45 53 4f 55 52  SL_JSON_E_RESOUR
0bd0: 43 45 5f 4e 4f 54 5f 46 4f 55 4e 44 2c 0a 20 20  CE_NOT_FOUND,.  
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
0bf0: 52 65 70 6f 72 74 20 23 25 64 20 6e 6f 74 20 66  Report #%d not f
0c00: 6f 75 6e 64 2e 22 2c 20 6e 52 65 70 6f 72 74 29  ound.", nReport)
0c10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ;.    return NUL
0c20: 4c 3b 0a 20 20 7d 0a 20 20 70 61 79 20 3d 20 63  L;.  }.  pay = c
0c30: 73 6f 6e 5f 73 71 6c 69 74 65 33 5f 72 6f 77 5f  son_sqlite3_row_
0c40: 74 6f 5f 6f 62 6a 65 63 74 28 71 2e 70 53 74 6d  to_object(q.pStm
0c50: 74 29 3b 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a  t);.  db_finaliz
0c60: 65 28 26 71 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&q);.  return 
0c70: 70 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  pay;.}../*.** Im
0c80: 70 6c 20 6f 66 20 2f 6a 73 6f 6e 2f 72 65 70 6f  pl of /json/repo
0c90: 72 74 2f 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  rt/list..*/.stat
0ca0: 69 63 20 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20  ic cson_value * 
0cb0: 6a 73 6f 6e 5f 72 65 70 6f 72 74 5f 6c 69 73 74  json_report_list
0cc0: 28 29 7b 0a 20 20 42 6c 6f 62 20 73 71 6c 20 3d  (){.  Blob sql =
0cd0: 20 65 6d 70 74 79 5f 62 6c 6f 62 3b 0a 20 20 63   empty_blob;.  c
0ce0: 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 70 61 79 20  son_value * pay 
0cf0: 3d 20 4e 55 4c 4c 3b 0a 20 20 69 66 28 21 67 2e  = NULL;.  if(!g.
0d00: 70 65 72 6d 2e 52 64 54 6b 74 29 7b 0a 20 20 20  perm.RdTkt){.   
0d10: 20 6a 73 6f 6e 5f 73 65 74 5f 65 72 72 28 46 53   json_set_err(FS
0d20: 4c 5f 4a 53 4f 4e 5f 45 5f 44 45 4e 49 45 44 2c  L_JSON_E_DENIED,
0d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0d40: 20 20 22 52 65 71 75 69 72 65 73 20 27 72 27 20    "Requires 'r' 
0d50: 70 72 69 76 69 6c 65 67 65 73 2e 22 29 3b 0a 20  privileges.");. 
0d60: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a     return NULL;.
0d70: 20 20 7d 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e    }.  blob_appen
0d80: 64 28 26 73 71 6c 2c 20 22 53 45 4c 45 43 54 22  d(&sql, "SELECT"
0d90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
0da0: 20 72 6e 20 41 53 20 72 65 70 6f 72 74 2c 22 0a   rn AS report,".
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
0dc0: 74 69 74 6c 65 20 61 73 20 74 69 74 6c 65 2c 22  title as title,"
0dd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
0de0: 20 6f 77 6e 65 72 20 61 73 20 6f 77 6e 65 72 22   owner as owner"
0df0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
0e00: 20 46 52 4f 4d 20 72 65 70 6f 72 74 66 6d 74 22   FROM reportfmt"
0e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
0e20: 20 57 48 45 52 45 20 31 22 0a 20 20 20 20 20 20   WHERE 1".      
0e30: 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20          " ORDER 
0e40: 42 59 20 74 69 74 6c 65 22 2c 0a 20 20 20 20 20  BY title",.     
0e50: 20 20 20 20 20 20 20 20 20 2d 31 29 3b 0a 20 20           -1);.  
0e60: 70 61 79 20 3d 20 6a 73 6f 6e 5f 73 71 6c 5f 74  pay = json_sql_t
0e70: 6f 5f 61 72 72 61 79 5f 6f 66 5f 6f 62 6a 28 26  o_array_of_obj(&
0e80: 73 71 6c 2c 20 4e 55 4c 4c 2c 20 31 29 3b 0a 20  sql, NULL, 1);. 
0e90: 20 69 66 28 21 70 61 79 29 7b 0a 20 20 20 20 6a   if(!pay){.    j
0ea0: 73 6f 6e 5f 73 65 74 5f 65 72 72 28 46 53 4c 5f  son_set_err(FSL_
0eb0: 4a 53 4f 4e 5f 45 5f 55 4e 4b 4e 4f 57 4e 2c 0a  JSON_E_UNKNOWN,.
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ed0: 20 22 51 75 69 74 65 20 75 6e 65 78 70 65 63 74   "Quite unexpect
0ee0: 65 64 3a 20 6e 6f 20 74 69 63 6b 65 74 20 72 65  ed: no ticket re
0ef0: 70 6f 72 74 73 20 66 6f 75 6e 64 2e 22 29 3b 0a  ports found.");.
0f00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 61 79    }.  return pay
0f10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 20  ;.}../*.** Impl 
0f20: 66 6f 72 20 2f 6a 73 6f 6e 2f 72 65 70 6f 72 74  for /json/report
0f30: 2f 72 75 6e 0a 2a 2a 0a 2a 2a 20 4f 70 74 69 6f  /run.**.** Optio
0f40: 6e 73 2f 61 72 67 75 6d 65 6e 74 73 3a 0a 2a 2a  ns/arguments:.**
0f50: 0a 2a 2a 20 72 65 70 6f 72 74 3d 69 6e 74 20 28  .** report=int (
0f60: 43 4c 49 3a 20 2d 72 65 70 6f 72 74 20 23 20 6f  CLI: -report # o
0f70: 72 20 2d 72 20 23 29 20 69 73 20 74 68 65 20 72  r -r #) is the r
0f80: 65 70 6f 72 74 20 6e 75 6d 62 65 72 20 74 6f 20  eport number to 
0f90: 72 75 6e 2e 0a 2a 2a 0a 2a 2a 20 6c 69 6d 69 74  run..**.** limit
0fa0: 3d 69 6e 74 20 28 43 4c 49 3a 20 2d 6c 69 6d 69  =int (CLI: -limi
0fb0: 74 20 23 20 6f 72 20 2d 6e 20 23 29 20 2d 6e 20  t # or -n #) -n 
0fc0: 69 73 20 66 6f 72 20 63 6f 6d 70 61 74 2e 20 77  is for compat. w
0fd0: 69 74 68 20 6f 74 68 65 72 20 63 6f 6d 6d 61 6e  ith other comman
0fe0: 64 73 2e 0a 2a 2a 0a 2a 2a 20 66 6f 72 6d 61 74  ds..**.** format
0ff0: 3d 61 7c 6f 20 53 70 65 63 69 66 69 65 73 20 72  =a|o Specifies r
1000: 65 73 75 6c 74 20 66 6f 72 6d 61 74 3a 20 61 3d  esult format: a=
1010: 65 61 63 68 20 72 6f 77 20 69 73 20 61 6e 20 61  each row is an a
1020: 72 72 79 2c 20 6f 3d 65 61 63 68 0a 2a 2a 20 72  rry, o=each.** r
1030: 6f 77 20 69 73 20 61 6e 20 6f 62 6a 65 63 74 2e  ow is an object.
1040: 20 20 44 65 66 61 75 6c 74 3d 6f 2e 0a 2a 2f 0a    Default=o..*/.
1050: 73 74 61 74 69 63 20 63 73 6f 6e 5f 76 61 6c 75  static cson_valu
1060: 65 20 2a 20 6a 73 6f 6e 5f 72 65 70 6f 72 74 5f  e * json_report_
1070: 72 75 6e 28 29 7b 0a 20 20 69 6e 74 20 6e 52 65  run(){.  int nRe
1080: 70 6f 72 74 3b 0a 20 20 53 74 6d 74 20 71 20 3d  port;.  Stmt q =
1090: 20 65 6d 70 74 79 5f 53 74 6d 74 3b 0a 20 20 63   empty_Stmt;.  c
10a0: 73 6f 6e 5f 6f 62 6a 65 63 74 20 2a 20 70 61 79  son_object * pay
10b0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 73 6f 6e 5f   = NULL;.  cson_
10c0: 61 72 72 61 79 20 2a 20 74 6b 74 4c 69 73 74 20  array * tktList 
10d0: 3d 20 4e 55 4c 4c 3b 0a 20 20 63 68 61 72 20 63  = NULL;.  char c
10e0: 6f 6e 73 74 20 2a 20 7a 46 6d 74 3b 0a 20 20 63  onst * zFmt;.  c
10f0: 68 61 72 20 2a 20 7a 54 69 74 6c 65 20 3d 20 4e  har * zTitle = N
1100: 55 4c 4c 3b 0a 20 20 42 6c 6f 62 20 73 71 6c 20  ULL;.  Blob sql 
1110: 3d 20 65 6d 70 74 79 5f 62 6c 6f 62 3b 0a 20 20  = empty_blob;.  
1120: 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a 20  int limit = 0;. 
1130: 20 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 63 6f   cson_value * co
1140: 6c 4e 61 6d 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20  lNames = NULL;. 
1150: 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 21 67   int i;..  if(!g
1160: 2e 70 65 72 6d 2e 52 64 54 6b 74 29 7b 0a 20 20  .perm.RdTkt){.  
1170: 20 20 6a 73 6f 6e 5f 73 65 74 5f 65 72 72 28 46    json_set_err(F
1180: 53 4c 5f 4a 53 4f 4e 5f 45 5f 44 45 4e 49 45 44  SL_JSON_E_DENIED
1190: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11a0: 20 20 20 22 52 65 71 75 69 72 65 73 20 27 72 27     "Requires 'r'
11b0: 20 70 72 69 76 69 6c 65 67 65 73 2e 22 29 3b 0a   privileges.");.
11c0: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
11d0: 0a 20 20 7d 0a 20 20 6e 52 65 70 6f 72 74 20 3d  .  }.  nReport =
11e0: 20 6a 73 6f 6e 5f 72 65 70 6f 72 74 5f 67 65 74   json_report_get
11f0: 5f 6e 75 6d 62 65 72 28 33 29 3b 0a 20 20 69 66  _number(3);.  if
1200: 28 6e 52 65 70 6f 72 74 20 3c 3d 30 29 7b 0a 20  (nReport <=0){. 
1210: 20 20 20 6a 73 6f 6e 5f 73 65 74 5f 65 72 72 28     json_set_err(
1220: 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 4d 49 53 53 49  FSL_JSON_E_MISSI
1230: 4e 47 5f 41 52 47 53 2c 0a 20 20 20 20 20 20 20  NG_ARGS,.       
1240: 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69            "Missi
1250: 6e 67 20 6f 72 20 69 6e 76 61 6c 69 64 20 27 6e  ng or invalid 'n
1260: 75 6d 62 65 72 27 20 28 2d 6e 29 20 70 61 72 61  umber' (-n) para
1270: 6d 65 74 65 72 2e 22 29 3b 0a 20 20 20 20 67 6f  meter.");.    go
1280: 74 6f 20 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  to error;.  }.  
1290: 7a 46 6d 74 20 3d 20 6a 73 6f 6e 5f 66 69 6e 64  zFmt = json_find
12a0: 5f 6f 70 74 69 6f 6e 5f 63 73 74 72 32 28 22 66  _option_cstr2("f
12b0: 6f 72 6d 61 74 22 2c 4e 55 4c 4c 2c 22 66 22 2c  ormat",NULL,"f",
12c0: 33 29 3b 0a 20 20 69 66 28 21 7a 46 6d 74 29 20  3);.  if(!zFmt) 
12d0: 7a 46 6d 74 20 3d 20 22 6f 22 3b 0a 20 20 64 62  zFmt = "o";.  db
12e0: 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20 20  _prepare(&q,.   
12f0: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
1300: 54 20 73 71 6c 63 6f 64 65 2c 20 22 0a 20 20 20  T sqlcode, ".   
1310: 20 20 20 20 20 20 20 20 20 20 22 20 74 69 74 6c            " titl
1320: 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e".             
1330: 22 20 46 52 4f 4d 20 72 65 70 6f 72 74 66 6d 74  " FROM reportfmt
1340: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ".             "
1350: 20 57 48 45 52 45 20 72 6e 3d 25 64 22 2c 0a 20   WHERE rn=%d",. 
1360: 20 20 20 20 20 20 20 20 20 20 20 20 6e 52 65 70              nRep
1370: 6f 72 74 29 3b 0a 20 20 69 66 28 53 51 4c 49 54  ort);.  if(SQLIT
1380: 45 5f 52 4f 57 20 21 3d 20 64 62 5f 73 74 65 70  E_ROW != db_step
1390: 28 26 71 29 29 7b 0a 20 20 20 20 6a 73 6f 6e 5f  (&q)){.    json_
13a0: 73 65 74 5f 65 72 72 28 46 53 4c 5f 4a 53 4f 4e  set_err(FSL_JSON
13b0: 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 52 47 53 2c  _E_INVALID_ARGS,
13c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13d0: 20 20 22 52 65 70 6f 72 74 20 6e 75 6d 62 65 72    "Report number
13e0: 20 25 64 20 6e 6f 74 20 66 6f 75 6e 64 2e 22 2c   %d not found.",
13f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1400: 20 20 6e 52 65 70 6f 72 74 29 3b 0a 20 20 20 20    nReport);.    
1410: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b  db_finalize(&q);
1420: 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b  .    goto error;
1430: 0a 20 20 7d 0a 0a 20 20 6c 69 6d 69 74 20 3d 20  .  }..  limit = 
1440: 6a 73 6f 6e 5f 66 69 6e 64 5f 6f 70 74 69 6f 6e  json_find_option
1450: 5f 69 6e 74 28 22 6c 69 6d 69 74 22 2c 4e 55 4c  _int("limit",NUL
1460: 4c 2c 22 6e 22 2c 2d 31 29 3b 0a 0a 0a 20 20 2f  L,"n",-1);...  /
1470: 2a 20 43 6f 70 79 20 6f 76 65 72 20 72 65 70 6f  * Copy over repo
1480: 72 74 27 73 20 53 51 4c 2e 2e 2e 2a 2f 0a 20 20  rt's SQL...*/.  
1490: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 73 71 6c  blob_append(&sql
14a0: 2c 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  , db_column_text
14b0: 28 26 71 2c 30 29 2c 20 2d 31 29 3b 0a 20 20 7a  (&q,0), -1);.  z
14c0: 54 69 74 6c 65 20 3d 20 6d 70 72 69 6e 74 66 28  Title = mprintf(
14d0: 22 25 73 22 2c 20 64 62 5f 63 6f 6c 75 6d 6e 5f  "%s", db_column_
14e0: 74 65 78 74 28 26 71 2c 31 29 29 3b 0a 20 20 64  text(&q,1));.  d
14f0: 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a  b_finalize(&q);.
1500: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c    db_prepare(&q,
1510: 20 22 25 73 22 2c 20 62 6c 6f 62 5f 73 71 6c 5f   "%s", blob_sql_
1520: 74 65 78 74 28 26 73 71 6c 29 29 3b 0a 0a 20 20  text(&sql));..  
1530: 2f 2a 2a 20 42 75 69 6c 64 20 74 68 65 20 72 65  /** Build the re
1540: 73 70 6f 6e 73 65 2e 2e 2e 20 2a 2f 0a 20 20 70  sponse... */.  p
1550: 61 79 20 3d 20 63 73 6f 6e 5f 6e 65 77 5f 6f 62  ay = cson_new_ob
1560: 6a 65 63 74 28 29 3b 0a 0a 20 20 63 73 6f 6e 5f  ject();..  cson_
1570: 6f 62 6a 65 63 74 5f 73 65 74 28 70 61 79 2c 20  object_set(pay, 
1580: 22 72 65 70 6f 72 74 22 2c 20 6a 73 6f 6e 5f 6e  "report", json_n
1590: 65 77 5f 69 6e 74 28 6e 52 65 70 6f 72 74 29 29  ew_int(nReport))
15a0: 3b 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f  ;.  cson_object_
15b0: 73 65 74 28 70 61 79 2c 20 22 74 69 74 6c 65 22  set(pay, "title"
15c0: 2c 20 6a 73 6f 6e 5f 6e 65 77 5f 73 74 72 69 6e  , json_new_strin
15d0: 67 28 7a 54 69 74 6c 65 29 29 3b 0a 20 20 69 66  g(zTitle));.  if
15e0: 28 6c 69 6d 69 74 3e 30 29 7b 0a 20 20 20 20 63  (limit>0){.    c
15f0: 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 70  son_object_set(p
1600: 61 79 2c 20 22 6c 69 6d 69 74 22 2c 20 6a 73 6f  ay, "limit", jso
1610: 6e 5f 6e 65 77 5f 69 6e 74 28 28 6c 69 6d 69 74  n_new_int((limit
1620: 3c 30 29 20 3f 20 30 20 3a 20 6c 69 6d 69 74 29  <0) ? 0 : limit)
1630: 29 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 54  );.  }.  free(zT
1640: 69 74 6c 65 29 3b 0a 20 20 7a 54 69 74 6c 65 20  itle);.  zTitle 
1650: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 69 66 28 67 2e  = NULL;..  if(g.
1660: 70 65 72 6d 2e 54 6b 74 46 6d 74 29 7b 0a 20 20  perm.TktFmt){.  
1670: 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65    cson_object_se
1680: 74 28 70 61 79 2c 20 22 73 71 6c 63 6f 64 65 22  t(pay, "sqlcode"
1690: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16a0: 20 20 20 20 20 20 63 73 6f 6e 5f 76 61 6c 75 65        cson_value
16b0: 5f 6e 65 77 5f 73 74 72 69 6e 67 28 62 6c 6f 62  _new_string(blob
16c0: 5f 73 74 72 28 26 73 71 6c 29 2c 0a 20 20 20 20  _str(&sql),.    
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 28 75 6e 73 69 67 6e 65 64 20        (unsigned 
1700: 69 6e 74 29 62 6c 6f 62 5f 73 69 7a 65 28 26 73  int)blob_size(&s
1710: 71 6c 29 29 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f  ql)));.  }.  blo
1720: 62 5f 72 65 73 65 74 28 26 73 71 6c 29 3b 0a 0a  b_reset(&sql);..
1730: 20 20 63 6f 6c 4e 61 6d 65 73 20 3d 20 63 73 6f    colNames = cso
1740: 6e 5f 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  n_sqlite3_column
1750: 5f 6e 61 6d 65 73 28 71 2e 70 53 74 6d 74 29 3b  _names(q.pStmt);
1760: 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73  .  cson_object_s
1770: 65 74 28 20 70 61 79 2c 20 22 63 6f 6c 75 6d 6e  et( pay, "column
1780: 4e 61 6d 65 73 22 2c 20 63 6f 6c 4e 61 6d 65 73  Names", colNames
1790: 29 3b 0a 20 20 66 6f 72 28 20 69 20 3d 20 30 20  );.  for( i = 0 
17a0: 3b 20 28 28 6c 69 6d 69 74 3e 30 29 20 3f 28 69  ; ((limit>0) ?(i
17b0: 20 3c 20 6c 69 6d 69 74 29 20 3a 20 31 29 0a 20   < limit) : 1). 
17c0: 20 20 20 20 20 20 20 20 26 26 20 28 53 51 4c 49          && (SQLI
17d0: 54 45 5f 52 4f 57 20 3d 3d 20 64 62 5f 73 74 65  TE_ROW == db_ste
17e0: 70 28 26 71 29 29 3b 0a 20 20 20 20 20 20 20 2b  p(&q));.       +
17f0: 2b 69 29 7b 0a 20 20 20 20 63 73 6f 6e 5f 76 61  +i){.    cson_va
1800: 6c 75 65 20 2a 20 72 6f 77 20 3d 20 28 27 61 27  lue * row = ('a'
1810: 3d 3d 2a 7a 46 6d 74 29 0a 20 20 20 20 20 20 3f  ==*zFmt).      ?
1820: 20 63 73 6f 6e 5f 73 71 6c 69 74 65 33 5f 72 6f   cson_sqlite3_ro
1830: 77 5f 74 6f 5f 61 72 72 61 79 28 71 2e 70 53 74  w_to_array(q.pSt
1840: 6d 74 29 0a 20 20 20 20 20 20 3a 20 63 73 6f 6e  mt).      : cson
1850: 5f 73 71 6c 69 74 65 33 5f 72 6f 77 5f 74 6f 5f  _sqlite3_row_to_
1860: 6f 62 6a 65 63 74 32 28 71 2e 70 53 74 6d 74 2c  object2(q.pStmt,
1870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 20 20 20 20 20 63 73 6f 6e 5f 76 61 6c 75 65 5f       cson_value_
18a0: 67 65 74 5f 61 72 72 61 79 28 63 6f 6c 4e 61 6d  get_array(colNam
18b0: 65 73 29 29 3b 0a 20 20 20 20 3b 0a 20 20 20 20  es));.    ;.    
18c0: 69 66 28 72 6f 77 20 26 26 20 21 74 6b 74 4c 69  if(row && !tktLi
18d0: 73 74 29 7b 0a 20 20 20 20 20 20 74 6b 74 4c 69  st){.      tktLi
18e0: 73 74 20 3d 20 63 73 6f 6e 5f 6e 65 77 5f 61 72  st = cson_new_ar
18f0: 72 61 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ray();.    }.   
1900: 20 63 73 6f 6e 5f 61 72 72 61 79 5f 61 70 70 65   cson_array_appe
1910: 6e 64 28 74 6b 74 4c 69 73 74 2c 20 72 6f 77 29  nd(tktList, row)
1920: 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c  ;.  }.  db_final
1930: 69 7a 65 28 26 71 29 3b 0a 20 20 63 73 6f 6e 5f  ize(&q);.  cson_
1940: 6f 62 6a 65 63 74 5f 73 65 74 28 70 61 79 2c 20  object_set(pay, 
1950: 22 74 69 63 6b 65 74 73 22 2c 0a 20 20 20 20 20  "tickets",.     
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6b 74               tkt
1970: 4c 69 73 74 20 3f 20 63 73 6f 6e 5f 61 72 72 61  List ? cson_arra
1980: 79 5f 76 61 6c 75 65 28 74 6b 74 4c 69 73 74 29  y_value(tktList)
1990: 20 3a 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 75   : cson_value_nu
19a0: 6c 6c 28 29 29 3b 0a 0a 20 20 67 6f 74 6f 20 65  ll());..  goto e
19b0: 6e 64 3b 0a 0a 20 20 65 72 72 6f 72 3a 0a 20 20  nd;..  error:.  
19c0: 61 73 73 65 72 74 28 30 20 21 3d 20 67 2e 6a 73  assert(0 != g.js
19d0: 6f 6e 2e 72 65 73 75 6c 74 43 6f 64 65 29 3b 0a  on.resultCode);.
19e0: 20 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 66 72 65    cson_value_fre
19f0: 65 28 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 76  e( cson_object_v
1a00: 61 6c 75 65 28 70 61 79 29 20 29 3b 0a 20 20 70  alue(pay) );.  p
1a10: 61 79 20 3d 20 4e 55 4c 4c 3b 0a 20 20 65 6e 64  ay = NULL;.  end
1a20: 3a 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 79 20  :..  return pay 
1a30: 3f 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 76 61  ? cson_object_va
1a40: 6c 75 65 28 70 61 79 29 20 3a 20 4e 55 4c 4c 3b  lue(pay) : NULL;
1a50: 0a 0a 7d 0a 0a 73 74 61 74 69 63 20 63 73 6f 6e  ..}..static cson
1a60: 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 72 65  _value * json_re
1a70: 70 6f 72 74 5f 73 61 76 65 28 29 7b 0a 20 20 72  port_save(){.  r
1a80: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a 23 65  eturn NULL;.}.#e
1a90: 6e 64 69 66 20 2f 2a 20 46 4f 53 53 49 4c 5f 45  ndif /* FOSSIL_E
1aa0: 4e 41 42 4c 45 5f 4a 53 4f 4e 20 2a 2f 0a        NABLE_JSON */.