Fossil

Hex Artifact Content
Login

Artifact 6530c919e6671cbec7f72e6240c361229e21d8f4:


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 23 69 6e 63  /drh/.**.*/.#inc
0220: 6c 75 64 65 20 22 56 45 52 53 49 4f 4e 2e 68 22  lude "VERSION.h"
0230: 0a 23 69 6e 63 6c 75 64 65 20 22 63 6f 6e 66 69  .#include "confi
0240: 67 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6a  g.h".#include "j
0250: 73 6f 6e 5f 61 72 74 69 66 61 63 74 2e 68 22 0a  son_artifact.h".
0260: 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45 0a 23  .#if INTERFACE.#
0270: 69 6e 63 6c 75 64 65 20 22 6a 73 6f 6e 5f 64 65  include "json_de
0280: 74 61 69 6c 2e 68 22 0a 23 65 6e 64 69 66 0a 0a  tail.h".#endif..
0290: 2f 2a 0a 2a 2a 20 49 6e 74 65 72 6e 61 6c 20 63  /*.** Internal c
02a0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 2f 6a 73 6f  allback for /jso
02b0: 6e 2f 61 72 74 69 66 61 63 74 20 68 61 6e 64 6c  n/artifact handl
02c0: 65 72 73 2e 20 72 69 64 20 72 65 66 65 72 73 20  ers. rid refers 
02d0: 74 6f 0a 2a 2a 20 74 68 65 20 72 69 64 20 6f 66  to.** the rid of
02e0: 20 61 20 67 69 76 65 6e 20 74 79 70 65 20 6f 66   a given type of
02f0: 20 61 72 74 69 66 61 63 74 2c 20 61 6e 64 20 65   artifact, and e
0300: 61 63 68 20 63 61 6c 6c 62 61 63 6b 20 69 73 0a  ach callback is.
0310: 2a 2a 20 73 70 65 63 69 61 6c 69 7a 65 64 20 74  ** specialized t
0320: 6f 20 72 65 74 75 72 6e 20 61 20 4a 53 4f 4e 20  o return a JSON 
0330: 66 6f 72 6d 20 6f 66 20 6f 6e 65 20 74 79 70 65  form of one type
0340: 20 6f 66 20 61 72 74 69 66 61 63 74 2e 0a 2a 2a   of artifact..**
0350: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
0360: 6f 6e 73 20 6d 61 79 20 61 73 73 65 72 74 28 29  ons may assert()
0370: 20 74 68 61 74 20 72 69 64 20 72 65 66 65 72 73   that rid refers
0380: 20 74 6f 20 72 65 71 75 65 73 74 65 64 20 61 72   to requested ar
0390: 74 69 66 61 63 74 0a 2a 2a 20 74 79 70 65 2c 20  tifact.** type, 
03a0: 73 69 6e 63 65 20 6d 69 73 6d 61 74 63 68 65 73  since mismatches
03b0: 20 69 6e 20 74 68 65 20 61 72 74 69 66 61 63 74   in the artifact
03c0: 20 74 79 70 65 73 20 63 6f 6d 65 20 66 72 6f 6d   types come from
03d0: 0a 2a 2a 20 6a 73 6f 6e 5f 70 61 67 65 5f 61 72  .** json_page_ar
03e0: 74 69 66 61 63 74 28 29 20 61 73 20 6f 70 70 6f  tifact() as oppo
03f0: 73 65 64 20 74 6f 20 63 6c 69 65 6e 74 20 64 61  sed to client da
0400: 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50  ta..**.** The pP
0410: 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  arent parameter 
0420: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 65  points to the re
0430: 73 70 6f 6e 73 65 20 70 61 79 6c 6f 61 64 20 6f  sponse payload o
0440: 62 6a 65 63 74 2e 20 20 49 74 0a 2a 2a 20 5f 6d  bject.  It.** _m
0450: 61 79 5f 20 62 65 20 75 73 65 64 20 74 6f 20 70  ay_ be used to p
0460: 6f 70 75 6c 61 74 65 20 22 74 6f 70 2d 6c 65 76  opulate "top-lev
0470: 65 6c 22 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  el" information 
0480: 69 6e 20 74 68 65 20 72 65 73 70 6f 6e 73 65 0a  in the response.
0490: 2a 2a 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20  ** payload, but 
04a0: 6e 6f 72 6d 61 6c 6c 79 20 74 68 69 73 20 69 73  normally this is
04b0: 20 6e 65 69 74 68 65 72 20 6e 65 63 65 73 73 61   neither necessa
04c0: 72 79 20 6e 6f 72 20 64 65 73 69 72 65 64 2e 0a  ry nor desired..
04d0: 2a 2f 0a 74 79 70 65 64 65 66 20 63 73 6f 6e 5f  */.typedef cson_
04e0: 76 61 6c 75 65 20 2a 20 28 2a 61 72 74 69 66 61  value * (*artifa
04f0: 63 74 5f 66 29 28 20 63 73 6f 6e 5f 6f 62 6a 65  ct_f)( cson_obje
0500: 63 74 20 2a 20 70 50 61 72 65 6e 74 2c 20 69 6e  ct * pParent, in
0510: 74 20 72 69 64 20 29 3b 0a 0a 2f 2a 0a 2a 2a 20  t rid );../*.** 
0520: 49 6e 74 65 72 6e 61 6c 20 70 65 72 2d 61 72 74  Internal per-art
0530: 69 66 61 63 74 2d 74 79 70 65 20 64 69 73 70 61  ifact-type dispa
0540: 74 63 68 69 6e 67 20 68 65 6c 70 65 72 2e 0a 2a  tching helper..*
0550: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0560: 20 41 72 74 69 66 61 63 74 44 69 73 70 61 74 63   ArtifactDispatc
0570: 68 45 6e 74 72 79 20 7b 0a 20 20 2f 2a 2a 0a 20  hEntry {.  /**. 
0580: 20 20 20 20 41 72 74 69 66 61 63 74 20 74 79 70      Artifact typ
0590: 65 20 6e 61 6d 65 2c 20 65 2e 67 2e 20 22 63 68  e name, e.g. "ch
05a0: 65 63 6b 69 6e 22 2c 20 22 74 69 63 6b 65 74 22  eckin", "ticket"
05b0: 2c 20 22 77 69 6b 69 22 2e 0a 20 20 20 2a 2f 0a  , "wiki"..   */.
05c0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 6e    char const * n
05d0: 61 6d 65 3b 0a 0a 20 20 2f 2a 2a 0a 20 20 20 20  ame;..  /**.    
05e0: 20 4a 53 4f 4e 20 63 6f 6e 73 74 72 75 63 74 69   JSON constructi
05f0: 6f 6e 20 63 61 6c 6c 62 61 63 6b 2e 20 43 72 65  on callback. Cre
0600: 61 74 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  ates the content
0610: 73 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 70  s for the.     p
0620: 61 79 6c 6f 61 64 2e 61 72 74 69 66 61 63 74 20  ayload.artifact 
0630: 70 72 6f 70 65 72 74 79 20 6f 66 20 2f 6a 73 6f  property of /jso
0640: 6e 2f 61 72 74 69 66 61 63 74 20 72 65 73 70 6f  n/artifact respo
0650: 6e 73 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 72 74  nses..  */.  art
0660: 69 66 61 63 74 5f 66 20 66 75 6e 63 3b 0a 7d 20  ifact_f func;.} 
0670: 41 72 74 69 66 61 63 74 44 69 73 70 61 74 63 68  ArtifactDispatch
0680: 45 6e 74 72 79 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47  Entry;.../*.** G
0690: 65 6e 65 72 61 74 65 73 20 61 20 4a 53 4f 4e 20  enerates a JSON 
06a0: 41 72 72 61 79 20 72 65 66 65 72 65 6e 63 65 20  Array reference 
06b0: 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 61 72 65  holding the pare
06c0: 6e 74 20 55 55 49 44 73 20 28 61 73 20 73 74 72  nt UUIDs (as str
06d0: 69 6e 67 73 29 2e 0a 2a 2a 20 49 66 20 69 74 20  ings)..** If it 
06e0: 66 69 6e 64 73 20 6e 6f 20 6d 61 74 63 68 65 73  finds no matches
06f0: 20 74 68 65 6e 20 69 74 20 72 65 74 75 72 6e 73   then it returns
0700: 20 4e 55 4c 4c 20 28 4f 4f 4d 20 69 73 20 61 20   NULL (OOM is a 
0710: 66 61 74 61 6c 20 65 72 72 6f 72 29 2e 0a 2a 2a  fatal error)..**
0720: 0a 2a 2a 20 52 65 74 75 72 6e 65 64 20 76 61 6c  .** Returned val
0730: 75 65 20 69 73 20 4e 55 4c 4c 20 6f 72 20 61 6e  ue is NULL or an
0740: 20 41 72 72 61 79 20 6f 77 6e 65 64 20 62 79 20   Array owned by 
0750: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 63  the caller..*/.c
0760: 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e  son_value * json
0770: 5f 70 61 72 65 6e 74 5f 75 75 69 64 73 5f 66 6f  _parent_uuids_fo
0780: 72 5f 63 69 28 20 69 6e 74 20 72 69 64 20 29 7b  r_ci( int rid ){
0790: 0a 20 20 53 74 6d 74 20 71 20 3d 20 65 6d 70 74  .  Stmt q = empt
07a0: 79 5f 53 74 6d 74 3b 0a 20 20 63 73 6f 6e 5f 61  y_Stmt;.  cson_a
07b0: 72 72 61 79 20 2a 20 70 50 61 72 65 6e 74 73 20  rray * pParents 
07c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 64 62 5f 70 72 65  = NULL;.  db_pre
07d0: 70 61 72 65 28 20 26 71 2c 0a 20 20 20 20 20 20  pare( &q,.      
07e0: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
07f0: 75 75 69 64 20 46 52 4f 4d 20 70 6c 69 6e 6b 2c  uuid FROM plink,
0800: 20 62 6c 6f 62 22 0a 20 20 20 20 20 20 20 20 20   blob".         
0810: 20 20 20 20 20 22 20 57 48 45 52 45 20 70 6c 69       " WHERE pli
0820: 6e 6b 2e 63 69 64 3d 25 64 20 41 4e 44 20 62 6c  nk.cid=%d AND bl
0830: 6f 62 2e 72 69 64 3d 70 6c 69 6e 6b 2e 70 69 64  ob.rid=plink.pid
0840: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
0850: 22 20 4f 52 44 45 52 20 42 59 20 70 6c 69 6e 6b  " ORDER BY plink
0860: 2e 69 73 70 72 69 6d 20 44 45 53 43 22 2c 0a 20  .isprim DESC",. 
0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 69 64               rid
0880: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c   );.  while( SQL
0890: 49 54 45 5f 52 4f 57 3d 3d 64 62 5f 73 74 65 70  ITE_ROW==db_step
08a0: 28 26 71 29 20 29 7b 0a 20 20 20 20 69 66 28 21  (&q) ){.    if(!
08b0: 70 50 61 72 65 6e 74 73 29 20 7b 0a 20 20 20 20  pParents) {.    
08c0: 20 20 70 50 61 72 65 6e 74 73 20 3d 20 63 73 6f    pParents = cso
08d0: 6e 5f 6e 65 77 5f 61 72 72 61 79 28 29 3b 0a 20  n_new_array();. 
08e0: 20 20 20 7d 0a 20 20 20 20 63 73 6f 6e 5f 61 72     }.    cson_ar
08f0: 72 61 79 5f 61 70 70 65 6e 64 28 20 70 50 61 72  ray_append( pPar
0900: 65 6e 74 73 2c 20 63 73 6f 6e 5f 73 71 6c 69 74  ents, cson_sqlit
0910: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 6f 5f 76 61 6c  e3_column_to_val
0920: 75 65 28 20 71 2e 70 53 74 6d 74 2c 20 30 20 29  ue( q.pStmt, 0 )
0930: 20 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e   );.  }.  db_fin
0940: 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 72 65 74  alize(&q);.  ret
0950: 75 72 6e 20 63 73 6f 6e 5f 61 72 72 61 79 5f 76  urn cson_array_v
0960: 61 6c 75 65 28 70 50 61 72 65 6e 74 73 29 3b 0a  alue(pParents);.
0970: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
0980: 65 73 20 61 6e 20 61 72 74 69 66 61 63 74 20 4f  es an artifact O
0990: 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 67 69  bject for the gi
09a0: 76 65 6e 20 72 69 64 2c 0a 2a 2a 20 77 68 69 63  ven rid,.** whic
09b0: 68 20 6d 75 73 74 20 72 65 66 65 72 20 74 6f 20  h must refer to 
09c0: 61 20 43 68 65 63 6b 2d 69 6e 2e 0a 2a 2a 0a 2a  a Check-in..**.*
09d0: 2a 20 52 65 74 75 72 6e 65 64 20 76 61 6c 75 65  * Returned value
09e0: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 61 6e 20 4f   is NULL or an O
09f0: 62 6a 65 63 74 20 6f 77 6e 65 64 20 62 79 20 74  bject owned by t
0a00: 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 63 73  he caller..*/.cs
0a10: 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f  on_value * json_
0a20: 61 72 74 69 66 61 63 74 5f 66 6f 72 5f 63 69 28  artifact_for_ci(
0a30: 20 69 6e 74 20 72 69 64 2c 20 63 68 61 72 20 73   int rid, char s
0a40: 68 6f 77 46 69 6c 65 73 20 29 7b 0a 20 20 63 73  howFiles ){.  cs
0a50: 6f 6e 5f 76 61 6c 75 65 20 2a 20 76 20 3d 20 4e  on_value * v = N
0a60: 55 4c 4c 3b 0a 20 20 53 74 6d 74 20 71 20 3d 20  ULL;.  Stmt q = 
0a70: 65 6d 70 74 79 5f 53 74 6d 74 3b 0a 20 20 73 74  empty_Stmt;.  st
0a80: 61 74 69 63 20 63 73 6f 6e 5f 76 61 6c 75 65 20  atic cson_value 
0a90: 2a 20 65 76 65 6e 74 54 79 70 65 4c 61 62 65 6c  * eventTypeLabel
0aa0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 66 28 21 65   = NULL;.  if(!e
0ab0: 76 65 6e 74 54 79 70 65 4c 61 62 65 6c 29 7b 0a  ventTypeLabel){.
0ac0: 20 20 20 20 65 76 65 6e 74 54 79 70 65 4c 61 62      eventTypeLab
0ad0: 65 6c 20 3d 20 6a 73 6f 6e 5f 6e 65 77 5f 73 74  el = json_new_st
0ae0: 72 69 6e 67 28 22 63 68 65 63 6b 69 6e 22 29 3b  ring("checkin");
0af0: 0a 20 20 20 20 6a 73 6f 6e 5f 67 63 5f 61 64 64  .    json_gc_add
0b00: 28 22 24 45 56 45 4e 54 5f 54 59 50 45 5f 4c 41  ("$EVENT_TYPE_LA
0b10: 42 45 4c 28 63 6f 6d 6d 69 74 29 22 2c 20 65 76  BEL(commit)", ev
0b20: 65 6e 74 54 79 70 65 4c 61 62 65 6c 29 3b 0a 20  entTypeLabel);. 
0b30: 20 7d 0a 0a 20 20 64 62 5f 70 72 65 70 61 72 65   }..  db_prepare
0b40: 28 26 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20  (&q,.           
0b50: 20 20 22 53 45 4c 45 43 54 20 62 2e 75 75 69 64    "SELECT b.uuid
0b60: 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
0b70: 20 22 20 63 61 73 74 28 73 74 72 66 74 69 6d 65   " cast(strftime
0b80: 28 27 25 25 73 27 2c 65 2e 6d 74 69 6d 65 29 20  ('%%s',e.mtime) 
0b90: 61 73 20 69 6e 74 29 2c 20 22 0a 20 20 20 20 20  as int), ".     
0ba0: 20 20 20 20 20 20 20 20 22 20 73 74 72 66 74 69          " strfti
0bb0: 6d 65 28 27 25 25 73 27 2c 65 2e 6f 6d 74 69 6d  me('%%s',e.omtim
0bc0: 65 29 2c 22 0a 20 20 20 20 20 20 20 20 20 20 20  e),".           
0bd0: 20 20 22 20 65 2e 75 73 65 72 2c 20 22 0a 20 20    " e.user, ".  
0be0: 20 20 20 20 20 20 20 20 20 20 20 22 20 65 2e 63             " e.c
0bf0: 6f 6d 6d 65 6e 74 22 0a 20 20 20 20 20 20 20 20  omment".        
0c00: 20 20 20 20 20 22 20 46 52 4f 4d 20 62 6c 6f 62       " FROM blob
0c10: 20 62 2c 20 65 76 65 6e 74 20 65 22 0a 20 20 20   b, event e".   
0c20: 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
0c30: 45 20 62 2e 72 69 64 3d 25 64 22 0a 20 20 20 20  E b.rid=%d".    
0c40: 20 20 20 20 20 20 20 20 20 22 20 20 20 41 4e 44           "   AND
0c50: 20 65 2e 6f 62 6a 69 64 3d 25 64 22 2c 0a 20 20   e.objid=%d",.  
0c60: 20 20 20 20 20 20 20 20 20 20 20 72 69 64 2c 20             rid, 
0c70: 72 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  rid.            
0c80: 20 29 3b 0a 20 20 69 66 28 20 64 62 5f 73 74 65   );.  if( db_ste
0c90: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
0ca0: 57 20 29 7b 0a 20 20 20 20 63 73 6f 6e 5f 6f 62  W ){.    cson_ob
0cb0: 6a 65 63 74 20 2a 20 6f 3b 0a 20 20 20 20 63 73  ject * o;.    cs
0cc0: 6f 6e 5f 76 61 6c 75 65 20 2a 20 74 6d 70 56 20  on_value * tmpV 
0cd0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73  = NULL;.    cons
0ce0: 74 20 63 68 61 72 20 2a 7a 55 75 69 64 20 3d 20  t char *zUuid = 
0cf0: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
0d00: 71 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74  q, 0);.    const
0d10: 20 63 68 61 72 20 2a 7a 55 73 65 72 3b 0a 20 20   char *zUser;.  
0d20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
0d30: 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 63 68 61 72  omment;.    char
0d40: 20 2a 20 7a 45 55 73 65 72 2c 20 2a 20 7a 45 43   * zEUser, * zEC
0d50: 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 69 36 34 20  omment;.    i64 
0d60: 6d 74 69 6d 65 2c 20 6f 6d 74 69 6d 65 3b 0a 20  mtime, omtime;. 
0d70: 20 20 20 76 20 3d 20 63 73 6f 6e 5f 76 61 6c 75     v = cson_valu
0d80: 65 5f 6e 65 77 5f 6f 62 6a 65 63 74 28 29 3b 0a  e_new_object();.
0d90: 20 20 20 20 6f 20 3d 20 63 73 6f 6e 5f 76 61 6c      o = cson_val
0da0: 75 65 5f 67 65 74 5f 6f 62 6a 65 63 74 28 76 29  ue_get_object(v)
0db0: 3b 0a 23 64 65 66 69 6e 65 20 53 45 54 28 4b 2c  ;.#define SET(K,
0dc0: 56 29 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73  V) cson_object_s
0dd0: 65 74 28 6f 2c 28 4b 29 2c 20 28 56 29 29 0a 20  et(o,(K), (V)). 
0de0: 20 20 20 53 45 54 28 22 74 79 70 65 22 2c 20 65     SET("type", e
0df0: 76 65 6e 74 54 79 70 65 4c 61 62 65 6c 20 29 3b  ventTypeLabel );
0e00: 0a 20 20 20 20 53 45 54 28 22 75 75 69 64 22 2c  .    SET("uuid",
0e10: 6a 73 6f 6e 5f 6e 65 77 5f 73 74 72 69 6e 67 28  json_new_string(
0e20: 7a 55 75 69 64 29 29 3b 0a 20 20 20 20 53 45 54  zUuid));.    SET
0e30: 28 22 69 73 4c 65 61 66 22 2c 20 63 73 6f 6e 5f  ("isLeaf", cson_
0e40: 76 61 6c 75 65 5f 6e 65 77 5f 62 6f 6f 6c 28 69  value_new_bool(i
0e50: 73 5f 61 5f 6c 65 61 66 28 72 69 64 29 29 29 3b  s_a_leaf(rid)));
0e60: 0a 0a 20 20 20 20 6d 74 69 6d 65 20 3d 20 64 62  ..    mtime = db
0e70: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 26 71  _column_int64(&q
0e80: 2c 31 29 3b 0a 20 20 20 20 53 45 54 28 22 74 69  ,1);.    SET("ti
0e90: 6d 65 73 74 61 6d 70 22 2c 6a 73 6f 6e 5f 6e 65  mestamp",json_ne
0ea0: 77 5f 69 6e 74 28 6d 74 69 6d 65 29 29 3b 0a 20  w_int(mtime));. 
0eb0: 20 20 20 6f 6d 74 69 6d 65 20 3d 20 64 62 5f 63     omtime = db_c
0ec0: 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 26 71 2c 32  olumn_int64(&q,2
0ed0: 29 3b 0a 20 20 20 20 69 66 28 6f 6d 74 69 6d 65  );.    if(omtime
0ee0: 20 26 26 20 28 6f 6d 74 69 6d 65 21 3d 6d 74 69   && (omtime!=mti
0ef0: 6d 65 29 29 7b 0a 20 20 20 20 20 20 53 45 54 28  me)){.      SET(
0f00: 22 6f 72 69 67 69 6e 54 69 6d 65 22 2c 6a 73 6f  "originTime",jso
0f10: 6e 5f 6e 65 77 5f 69 6e 74 28 6f 6d 74 69 6d 65  n_new_int(omtime
0f20: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a  ));.    }..    z
0f30: 55 73 65 72 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  User = db_column
0f40: 5f 74 65 78 74 28 26 71 2c 33 29 3b 0a 20 20 20  _text(&q,3);.   
0f50: 20 7a 45 55 73 65 72 20 3d 20 64 62 5f 74 65 78   zEUser = db_tex
0f60: 74 28 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  t(0,.           
0f70: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
0f80: 76 61 6c 75 65 20 46 52 4f 4d 20 74 61 67 78 72  value FROM tagxr
0f90: 65 66 20 57 48 45 52 45 20 74 61 67 69 64 3d 25  ef WHERE tagid=%
0fa0: 64 20 41 4e 44 20 72 69 64 3d 25 64 22 2c 0a 20  d AND rid=%d",. 
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fc0: 20 20 54 41 47 5f 55 53 45 52 2c 20 72 69 64 29    TAG_USER, rid)
0fd0: 3b 0a 20 20 20 20 69 66 28 7a 45 55 73 65 72 29  ;.    if(zEUser)
0fe0: 7b 0a 20 20 20 20 20 20 53 45 54 28 22 75 73 65  {.      SET("use
0ff0: 72 22 2c 20 6a 73 6f 6e 5f 6e 65 77 5f 73 74 72  r", json_new_str
1000: 69 6e 67 28 7a 45 55 73 65 72 29 29 3b 0a 20 20  ing(zEUser));.  
1010: 20 20 20 20 69 66 28 30 21 3d 66 6f 73 73 69 6c      if(0!=fossil
1020: 5f 73 74 72 63 6d 70 28 7a 45 55 73 65 72 2c 7a  _strcmp(zEUser,z
1030: 55 73 65 72 29 29 7b 0a 20 20 20 20 20 20 20 20  User)){.        
1040: 53 45 54 28 22 6f 72 69 67 69 6e 55 73 65 72 22  SET("originUser"
1050: 2c 6a 73 6f 6e 5f 6e 65 77 5f 73 74 72 69 6e 67  ,json_new_string
1060: 28 7a 55 73 65 72 29 29 3b 0a 20 20 20 20 20 20  (zUser));.      
1070: 7d 0a 20 20 20 20 20 20 66 72 65 65 28 7a 45 55  }.      free(zEU
1080: 73 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ser);.    }else{
1090: 0a 20 20 20 20 20 20 53 45 54 28 22 75 73 65 72  .      SET("user
10a0: 22 2c 6a 73 6f 6e 5f 6e 65 77 5f 73 74 72 69 6e  ",json_new_strin
10b0: 67 28 7a 55 73 65 72 29 29 3b 0a 20 20 20 20 7d  g(zUser));.    }
10c0: 0a 0a 20 20 20 20 7a 43 6f 6d 6d 65 6e 74 20 3d  ..    zComment =
10d0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
10e0: 26 71 2c 34 29 3b 0a 20 20 20 20 7a 45 43 6f 6d  &q,4);.    zECom
10f0: 6d 65 6e 74 20 3d 20 64 62 5f 74 65 78 74 28 30  ment = db_text(0
1100: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1110: 20 20 20 20 20 22 53 45 4c 45 43 54 20 76 61 6c       "SELECT val
1120: 75 65 20 46 52 4f 4d 20 74 61 67 78 72 65 66 20  ue FROM tagxref 
1130: 57 48 45 52 45 20 74 61 67 69 64 3d 25 64 20 41  WHERE tagid=%d A
1140: 4e 44 20 72 69 64 3d 25 64 22 2c 0a 20 20 20 20  ND rid=%d",.    
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
1160: 41 47 5f 43 4f 4d 4d 45 4e 54 2c 20 72 69 64 29  AG_COMMENT, rid)
1170: 3b 0a 20 20 20 20 69 66 28 7a 45 43 6f 6d 6d 65  ;.    if(zEComme
1180: 6e 74 29 7b 0a 20 20 20 20 20 20 53 45 54 28 22  nt){.      SET("
1190: 63 6f 6d 6d 65 6e 74 22 2c 6a 73 6f 6e 5f 6e 65  comment",json_ne
11a0: 77 5f 73 74 72 69 6e 67 28 7a 45 43 6f 6d 6d 65  w_string(zEComme
11b0: 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 30  nt));.      if(0
11c0: 20 21 3d 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d   != fossil_strcm
11d0: 70 28 7a 45 43 6f 6d 6d 65 6e 74 2c 7a 43 6f 6d  p(zEComment,zCom
11e0: 6d 65 6e 74 29 29 7b 0a 20 20 20 20 20 20 20 20  ment)){.        
11f0: 53 45 54 28 22 6f 72 69 67 69 6e 43 6f 6d 6d 65  SET("originComme
1200: 6e 74 22 2c 20 6a 73 6f 6e 5f 6e 65 77 5f 73 74  nt", json_new_st
1210: 72 69 6e 67 28 7a 43 6f 6d 6d 65 6e 74 29 29 3b  ring(zComment));
1220: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
1230: 72 65 65 28 7a 45 43 6f 6d 6d 65 6e 74 29 3b 0a  ree(zEComment);.
1240: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1250: 20 53 45 54 28 22 63 6f 6d 6d 65 6e 74 22 2c 6a   SET("comment",j
1260: 73 6f 6e 5f 6e 65 77 5f 73 74 72 69 6e 67 28 7a  son_new_string(z
1270: 43 6f 6d 6d 65 6e 74 29 29 3b 0a 20 20 20 20 7d  Comment));.    }
1280: 0a 0a 20 20 20 20 74 6d 70 56 20 3d 20 6a 73 6f  ..    tmpV = jso
1290: 6e 5f 70 61 72 65 6e 74 5f 75 75 69 64 73 5f 66  n_parent_uuids_f
12a0: 6f 72 5f 63 69 28 72 69 64 29 3b 0a 20 20 20 20  or_ci(rid);.    
12b0: 69 66 28 74 6d 70 56 29 7b 0a 20 20 20 20 20 20  if(tmpV){.      
12c0: 53 45 54 28 22 70 61 72 65 6e 74 73 22 2c 20 74  SET("parents", t
12d0: 6d 70 56 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mpV);.    }..   
12e0: 20 74 6d 70 56 20 3d 20 6a 73 6f 6e 5f 74 61 67   tmpV = json_tag
12f0: 73 5f 66 6f 72 5f 63 68 65 63 6b 69 6e 5f 72 69  s_for_checkin_ri
1300: 64 28 72 69 64 2c 30 29 3b 0a 20 20 20 20 69 66  d(rid,0);.    if
1310: 28 74 6d 70 56 29 7b 0a 20 20 20 20 20 20 53 45  (tmpV){.      SE
1320: 54 28 22 74 61 67 73 22 2c 74 6d 70 56 29 3b 0a  T("tags",tmpV);.
1330: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73      }..    if( s
1340: 68 6f 77 46 69 6c 65 73 20 29 7b 0a 20 20 20 20  howFiles ){.    
1350: 20 20 74 6d 70 56 20 3d 20 6a 73 6f 6e 5f 67 65    tmpV = json_ge
1360: 74 5f 63 68 61 6e 67 65 64 5f 66 69 6c 65 73 28  t_changed_files(
1370: 72 69 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  rid, 1);.      i
1380: 66 28 74 6d 70 56 29 7b 0a 20 20 20 20 20 20 20  f(tmpV){.       
1390: 20 53 45 54 28 22 66 69 6c 65 73 22 2c 74 6d 70   SET("files",tmp
13a0: 56 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  V);.      }.    
13b0: 7d 0a 0a 23 75 6e 64 65 66 20 53 45 54 0a 20 20  }..#undef SET.  
13c0: 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28  }.  db_finalize(
13d0: 26 71 29 3b 0a 20 20 72 65 74 75 72 6e 20 76 3b  &q);.  return v;
13e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 79 20 69  .}../*.** Very i
13f0: 6e 63 6f 6d 70 6c 65 74 65 2f 69 6e 63 6f 72 72  ncomplete/incorr
1400: 65 63 74 20 69 6d 70 6c 20 6f 66 20 2f 6a 73 6f  ect impl of /jso
1410: 6e 2f 61 72 74 69 66 61 63 74 2f 54 49 43 4b 45  n/artifact/TICKE
1420: 54 5f 49 44 2e 0a 2a 2f 0a 63 73 6f 6e 5f 76 61  T_ID..*/.cson_va
1430: 6c 75 65 20 2a 20 6a 73 6f 6e 5f 61 72 74 69 66  lue * json_artif
1440: 61 63 74 5f 74 69 63 6b 65 74 28 20 63 73 6f 6e  act_ticket( cson
1450: 5f 6f 62 6a 65 63 74 20 2a 20 7a 50 61 72 65 6e  _object * zParen
1460: 74 2c 20 69 6e 74 20 72 69 64 20 29 7b 0a 20 20  t, int rid ){.  
1470: 63 73 6f 6e 5f 6f 62 6a 65 63 74 20 2a 20 70 61  cson_object * pa
1480: 79 20 3d 20 4e 55 4c 4c 3b 0a 20 20 4d 61 6e 69  y = NULL;.  Mani
1490: 66 65 73 74 20 2a 70 54 6b 74 43 68 6e 67 20 3d  fest *pTktChng =
14a0: 20 4e 55 4c 4c 3b 0a 20 20 73 74 61 74 69 63 20   NULL;.  static 
14b0: 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 65 76 65  cson_value * eve
14c0: 6e 74 54 79 70 65 4c 61 62 65 6c 20 3d 20 4e 55  ntTypeLabel = NU
14d0: 4c 4c 3b 0a 20 20 69 66 28 21 20 67 2e 70 65 72  LL;.  if(! g.per
14e0: 6d 2e 52 64 54 6b 74 20 29 7b 0a 20 20 20 20 67  m.RdTkt ){.    g
14f0: 2e 6a 73 6f 6e 2e 72 65 73 75 6c 74 43 6f 64 65  .json.resultCode
1500: 20 3d 20 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 44 45   = FSL_JSON_E_DE
1510: 4e 49 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  NIED;.    return
1520: 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 69 66 28   NULL;.  }.  if(
1530: 21 65 76 65 6e 74 54 79 70 65 4c 61 62 65 6c 29  !eventTypeLabel)
1540: 7b 0a 20 20 20 20 65 76 65 6e 74 54 79 70 65 4c  {.    eventTypeL
1550: 61 62 65 6c 20 3d 20 6a 73 6f 6e 5f 6e 65 77 5f  abel = json_new_
1560: 73 74 72 69 6e 67 28 22 74 69 63 6b 65 74 22 29  string("ticket")
1570: 3b 0a 20 20 20 20 6a 73 6f 6e 5f 67 63 5f 61 64  ;.    json_gc_ad
1580: 64 28 22 24 45 56 45 4e 54 5f 54 59 50 45 5f 4c  d("$EVENT_TYPE_L
1590: 41 42 45 4c 28 74 69 63 6b 65 74 29 22 2c 20 65  ABEL(ticket)", e
15a0: 76 65 6e 74 54 79 70 65 4c 61 62 65 6c 29 3b 0a  ventTypeLabel);.
15b0: 20 20 7d 0a 0a 20 20 70 54 6b 74 43 68 6e 67 20    }..  pTktChng 
15c0: 3d 20 6d 61 6e 69 66 65 73 74 5f 67 65 74 28 72  = manifest_get(r
15d0: 69 64 2c 20 43 46 54 59 50 45 5f 54 49 43 4b 45  id, CFTYPE_TICKE
15e0: 54 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 6b  T, 0);.  if( pTk
15f0: 74 43 68 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20  tChng==0 ){.    
1600: 67 2e 6a 73 6f 6e 2e 72 65 73 75 6c 74 43 6f 64  g.json.resultCod
1610: 65 20 3d 20 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 4d  e = FSL_JSON_E_M
1620: 41 4e 49 46 45 53 54 5f 52 45 41 44 5f 46 41 49  ANIFEST_READ_FAI
1630: 4c 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LED;.    return 
1640: 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 70 61 79 20  NULL;.  }.  pay 
1650: 3d 20 63 73 6f 6e 5f 6e 65 77 5f 6f 62 6a 65 63  = cson_new_objec
1660: 74 28 29 3b 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65  t();.  cson_obje
1670: 63 74 5f 73 65 74 28 70 61 79 2c 20 22 65 76 65  ct_set(pay, "eve
1680: 6e 74 54 79 70 65 22 2c 20 65 76 65 6e 74 54 79  ntType", eventTy
1690: 70 65 4c 61 62 65 6c 20 29 3b 0a 20 20 63 73 6f  peLabel );.  cso
16a0: 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 70 61 79  n_object_set(pay
16b0: 2c 20 22 75 75 69 64 22 2c 20 6a 73 6f 6e 5f 6e  , "uuid", json_n
16c0: 65 77 5f 73 74 72 69 6e 67 28 70 54 6b 74 43 68  ew_string(pTktCh
16d0: 6e 67 2d 3e 7a 54 69 63 6b 65 74 55 75 69 64 29  ng->zTicketUuid)
16e0: 29 3b 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74  );.  cson_object
16f0: 5f 73 65 74 28 70 61 79 2c 20 22 75 73 65 72 22  _set(pay, "user"
1700: 2c 20 6a 73 6f 6e 5f 6e 65 77 5f 73 74 72 69 6e  , json_new_strin
1710: 67 28 70 54 6b 74 43 68 6e 67 2d 3e 7a 55 73 65  g(pTktChng->zUse
1720: 72 29 29 3b 0a 20 20 63 73 6f 6e 5f 6f 62 6a 65  r));.  cson_obje
1730: 63 74 5f 73 65 74 28 70 61 79 2c 20 22 74 69 6d  ct_set(pay, "tim
1740: 65 73 74 61 6d 70 22 2c 20 6a 73 6f 6e 5f 6a 75  estamp", json_ju
1750: 6c 69 61 6e 5f 74 6f 5f 74 69 6d 65 73 74 61 6d  lian_to_timestam
1760: 70 28 70 54 6b 74 43 68 6e 67 2d 3e 72 44 61 74  p(pTktChng->rDat
1770: 65 29 29 3b 0a 20 20 6d 61 6e 69 66 65 73 74 5f  e));.  manifest_
1780: 64 65 73 74 72 6f 79 28 70 54 6b 74 43 68 6e 67  destroy(pTktChng
1790: 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 73 6f 6e  );.  return cson
17a0: 5f 6f 62 6a 65 63 74 5f 76 61 6c 75 65 28 70 61  _object_value(pa
17b0: 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62  y);.}../*.** Sub
17c0: 2d 69 6d 70 6c 20 6f 66 20 2f 6a 73 6f 6e 2f 61  -impl of /json/a
17d0: 72 74 69 66 61 63 74 20 66 6f 72 20 63 68 65 63  rtifact for chec
17e0: 6b 2d 69 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  k-ins..*/.static
17f0: 20 63 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73   cson_value * js
1800: 6f 6e 5f 61 72 74 69 66 61 63 74 5f 63 69 28 20  on_artifact_ci( 
1810: 63 73 6f 6e 5f 6f 62 6a 65 63 74 20 2a 20 7a 50  cson_object * zP
1820: 61 72 65 6e 74 2c 20 69 6e 74 20 72 69 64 20 29  arent, int rid )
1830: 7b 0a 20 20 69 66 28 21 67 2e 70 65 72 6d 2e 52  {.  if(!g.perm.R
1840: 65 61 64 29 7b 0a 20 20 20 20 6a 73 6f 6e 5f 73  ead){.    json_s
1850: 65 74 5f 65 72 72 28 20 46 53 4c 5f 4a 53 4f 4e  et_err( FSL_JSON
1860: 5f 45 5f 44 45 4e 49 45 44 2c 20 22 56 69 65 77  _E_DENIED, "View
1870: 69 6e 67 20 63 68 65 63 6b 2d 69 6e 73 20 72 65  ing check-ins re
1880: 71 75 69 72 65 73 20 27 6f 27 20 70 72 69 76 69  quires 'o' privi
1890: 6c 65 67 65 73 2e 22 20 29 3b 0a 20 20 20 20 72  leges." );.    r
18a0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 7d 65  eturn NULL;.  }e
18b0: 6c 73 65 7b 0a 20 20 20 20 63 73 6f 6e 5f 76 61  lse{.    cson_va
18c0: 6c 75 65 20 2a 20 61 72 74 56 20 3d 20 6a 73 6f  lue * artV = jso
18d0: 6e 5f 61 72 74 69 66 61 63 74 5f 66 6f 72 5f 63  n_artifact_for_c
18e0: 69 28 72 69 64 2c 20 31 29 3b 0a 20 20 20 20 63  i(rid, 1);.    c
18f0: 73 6f 6e 5f 6f 62 6a 65 63 74 20 2a 20 61 72 74  son_object * art
1900: 20 3d 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 67 65   = cson_value_ge
1910: 74 5f 6f 62 6a 65 63 74 28 61 72 74 56 29 3b 0a  t_object(artV);.
1920: 20 20 20 20 69 66 28 61 72 74 29 7b 0a 20 20 20      if(art){.   
1930: 20 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 6d     cson_object_m
1940: 65 72 67 65 28 20 7a 50 61 72 65 6e 74 2c 20 61  erge( zParent, a
1950: 72 74 2c 20 43 53 4f 4e 5f 4d 45 52 47 45 5f 52  rt, CSON_MERGE_R
1960: 45 50 4c 41 43 45 20 29 3b 0a 20 20 20 20 20 20  EPLACE );.      
1970: 63 73 6f 6e 5f 66 72 65 65 5f 6f 62 6a 65 63 74  cson_free_object
1980: 28 61 72 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (art);.    }.   
1990: 20 72 65 74 75 72 6e 20 63 73 6f 6e 5f 6f 62 6a   return cson_obj
19a0: 65 63 74 5f 76 61 6c 75 65 28 7a 50 61 72 65 6e  ect_value(zParen
19b0: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
19c0: 20 49 6e 74 65 72 6e 61 6c 20 6d 61 70 70 69 6e   Internal mappin
19d0: 67 20 6f 66 20 2f 6a 73 6f 6e 2f 61 72 74 69 66  g of /json/artif
19e0: 61 63 74 2f 46 4f 4f 20 63 6f 6d 6d 61 6e 64 73  act/FOO commands
19f0: 2f 63 61 6c 6c 62 61 63 6b 73 2e 0a 2a 2f 0a 73  /callbacks..*/.s
1a00: 74 61 74 69 63 20 41 72 74 69 66 61 63 74 44 69  tatic ArtifactDi
1a10: 73 70 61 74 63 68 45 6e 74 72 79 20 41 72 74 69  spatchEntry Arti
1a20: 66 61 63 74 44 69 73 70 61 74 63 68 4c 69 73 74  factDispatchList
1a30: 5b 5d 20 3d 20 7b 0a 7b 22 63 68 65 63 6b 69 6e  [] = {.{"checkin
1a40: 22 2c 20 6a 73 6f 6e 5f 61 72 74 69 66 61 63 74  ", json_artifact
1a50: 5f 63 69 7d 2c 0a 7b 22 66 69 6c 65 22 2c 20 6a  _ci},.{"file", j
1a60: 73 6f 6e 5f 61 72 74 69 66 61 63 74 5f 66 69 6c  son_artifact_fil
1a70: 65 7d 2c 0a 7b 22 74 61 67 22 2c 20 4e 55 4c 4c  e},.{"tag", NULL
1a80: 7d 2c 0a 7b 22 74 69 63 6b 65 74 22 2c 20 6a 73  },.{"ticket", js
1a90: 6f 6e 5f 61 72 74 69 66 61 63 74 5f 74 69 63 6b  on_artifact_tick
1aa0: 65 74 7d 2c 0a 7b 22 77 69 6b 69 22 2c 20 6a 73  et},.{"wiki", js
1ab0: 6f 6e 5f 61 72 74 69 66 61 63 74 5f 77 69 6b 69  on_artifact_wiki
1ac0: 7d 2c 0a 2f 2a 20 46 69 6e 61 6c 20 65 6e 74 72  },./* Final entr
1ad0: 79 20 4d 55 53 54 20 68 61 76 65 20 61 20 4e 55  y MUST have a NU
1ae0: 4c 4c 20 6e 61 6d 65 2e 20 2a 2f 0a 7b 4e 55 4c  LL name. */.{NUL
1af0: 4c 2c 4e 55 4c 4c 7d 0a 7d 3b 0a 0a 2f 2a 0a 2a  L,NULL}.};../*.*
1b00: 2a 20 49 6e 74 65 72 6e 61 6c 20 68 65 6c 70 65  * Internal helpe
1b10: 72 20 77 68 69 63 68 20 72 65 74 75 72 6e 73 3a  r which returns:
1b20: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 66  .**.** If the "f
1b30: 6f 72 6d 61 74 22 20 28 43 4c 49 3a 20 2d 66 29  ormat" (CLI: -f)
1b40: 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 75 6e   flag is set fun
1b50: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
1b60: 65 20 73 61 6d 65 20 61 73 0a 2a 2a 20 6a 73 6f  e same as.** jso
1b70: 6e 5f 77 69 6b 69 5f 67 65 74 5f 63 6f 6e 74 65  n_wiki_get_conte
1b80: 6e 74 5f 66 6f 72 6d 61 74 5f 66 6c 61 67 28 29  nt_format_flag()
1b90: 2c 20 65 6c 73 65 20 69 74 20 72 65 74 75 72 6e  , else it return
1ba0: 73 20 74 72 75 65 20 28 6e 6f 6e 2d 30 29 0a 2a  s true (non-0).*
1bb0: 2a 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20  * if either the 
1bc0: 69 6e 63 6c 75 64 65 43 6f 6e 74 65 6e 74 20 28  includeContent (
1bd0: 48 54 54 50 29 20 6f 72 20 2d 63 6f 6e 74 65 6e  HTTP) or -conten
1be0: 74 7c 2d 63 20 62 6f 6f 6c 65 61 6e 20 66 6c 61  t|-c boolean fla
1bf0: 67 73 0a 2a 2a 20 28 43 4c 49 29 20 61 72 65 20  gs.** (CLI) are 
1c00: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
1c10: 6e 74 20 6a 73 6f 6e 5f 61 72 74 69 66 61 63 74  nt json_artifact
1c20: 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 5f 66 6f 72  _get_content_for
1c30: 6d 61 74 5f 66 6c 61 67 28 29 7b 0a 20 20 65 6e  mat_flag(){.  en
1c40: 75 6d 20 7b 20 4d 61 67 69 63 56 61 6c 75 65 20  um { MagicValue 
1c50: 3d 20 2d 39 20 7d 3b 0a 20 20 69 6e 74 20 63 6f  = -9 };.  int co
1c60: 6e 74 65 6e 74 46 6f 72 6d 61 74 20 3d 20 6a 73  ntentFormat = js
1c70: 6f 6e 5f 77 69 6b 69 5f 67 65 74 5f 63 6f 6e 74  on_wiki_get_cont
1c80: 65 6e 74 5f 66 6f 72 6d 61 74 5f 66 6c 61 67 28  ent_format_flag(
1c90: 4d 61 67 69 63 56 61 6c 75 65 29 3b 0a 20 20 69  MagicValue);.  i
1ca0: 66 28 4d 61 67 69 63 56 61 6c 75 65 20 3d 3d 20  f(MagicValue == 
1cb0: 63 6f 6e 74 65 6e 74 46 6f 72 6d 61 74 29 7b 0a  contentFormat){.
1cc0: 20 20 20 20 63 6f 6e 74 65 6e 74 46 6f 72 6d 61      contentForma
1cd0: 74 20 3d 20 6a 73 6f 6e 5f 66 69 6e 64 5f 6f 70  t = json_find_op
1ce0: 74 69 6f 6e 5f 62 6f 6f 6c 28 22 69 6e 63 6c 75  tion_bool("inclu
1cf0: 64 65 43 6f 6e 74 65 6e 74 22 2c 22 63 6f 6e 74  deContent","cont
1d00: 65 6e 74 22 2c 22 63 22 2c 30 29 20 2f 2a 20 64  ent","c",0) /* d
1d10: 65 70 72 65 63 61 74 65 64 20 2a 2f 20 3f 20 2d  eprecated */ ? -
1d20: 31 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  1 : 0;.  }.  ret
1d30: 75 72 6e 20 63 6f 6e 74 65 6e 74 46 6f 72 6d 61  urn contentForma
1d40: 74 3b 0a 7d 0a 0a 65 78 74 65 72 6e 20 69 6e 74  t;.}..extern int
1d50: 20 6a 73 6f 6e 5f 77 69 6b 69 5f 67 65 74 5f 63   json_wiki_get_c
1d60: 6f 6e 74 65 6e 74 5f 66 6f 72 6d 61 74 5f 66 6c  ontent_format_fl
1d70: 61 67 28 20 69 6e 74 20 64 65 66 61 75 6c 74 56  ag( int defaultV
1d80: 61 6c 75 65 20 29 20 2f 2a 20 6a 73 6f 6e 5f 77  alue ) /* json_w
1d90: 69 6b 69 2e 63 20 2a 2f 3b 0a 0a 63 73 6f 6e 5f  iki.c */;..cson_
1da0: 76 61 6c 75 65 20 2a 20 6a 73 6f 6e 5f 61 72 74  value * json_art
1db0: 69 66 61 63 74 5f 77 69 6b 69 28 63 73 6f 6e 5f  ifact_wiki(cson_
1dc0: 6f 62 6a 65 63 74 20 2a 20 7a 50 61 72 65 6e 74  object * zParent
1dd0: 2c 20 69 6e 74 20 72 69 64 29 7b 0a 20 20 69 66  , int rid){.  if
1de0: 28 20 21 20 67 2e 70 65 72 6d 2e 52 64 57 69 6b  ( ! g.perm.RdWik
1df0: 69 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 5f 73 65  i ){.    json_se
1e00: 74 5f 65 72 72 28 46 53 4c 5f 4a 53 4f 4e 5f 45  t_err(FSL_JSON_E
1e10: 5f 44 45 4e 49 45 44 2c 0a 20 20 20 20 20 20 20  _DENIED,.       
1e20: 20 20 20 20 20 20 20 20 20 20 22 52 65 71 75 69            "Requi
1e30: 72 65 73 20 27 6a 27 20 70 72 69 76 69 6c 65 67  res 'j' privileg
1e40: 65 73 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  es.");.    retur
1e50: 6e 20 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  n NULL;.  }else{
1e60: 0a 20 20 20 20 65 6e 75 6d 20 7b 20 4d 61 67 69  .    enum { Magi
1e70: 63 56 61 6c 75 65 20 3d 20 2d 39 20 7d 3b 0a 20  cValue = -9 };. 
1e80: 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 63 6f 6e     int const con
1e90: 74 65 6e 74 46 6f 72 6d 61 74 20 3d 20 6a 73 6f  tentFormat = jso
1ea0: 6e 5f 61 72 74 69 66 61 63 74 5f 67 65 74 5f 63  n_artifact_get_c
1eb0: 6f 6e 74 65 6e 74 5f 66 6f 72 6d 61 74 5f 66 6c  ontent_format_fl
1ec0: 61 67 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ag();.    return
1ed0: 20 6a 73 6f 6e 5f 67 65 74 5f 77 69 6b 69 5f 70   json_get_wiki_p
1ee0: 61 67 65 5f 62 79 5f 72 69 64 28 72 69 64 2c 20  age_by_rid(rid, 
1ef0: 63 6f 6e 74 65 6e 74 46 6f 72 6d 61 74 29 3b 0a  contentFormat);.
1f00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74    }.}../*.** Int
1f10: 65 72 6e 61 6c 20 68 65 6c 70 65 72 20 66 6f 72  ernal helper for
1f20: 20 72 6f 75 74 69 6e 65 73 20 77 68 69 63 68 20   routines which 
1f30: 61 64 64 20 61 20 22 73 74 61 74 75 73 22 20 66  add a "status" f
1f40: 6c 61 67 20 74 6f 20 66 69 6c 65 0a 2a 2a 20 61  lag to file.** a
1f50: 72 74 69 66 61 63 74 20 64 61 74 61 2e 20 69 73  rtifact data. is
1f60: 4e 65 77 20 61 6e 64 20 69 73 44 65 6c 20 73 68  New and isDel sh
1f70: 6f 75 6c 64 20 62 65 20 74 68 65 20 22 69 73 20  ould be the "is 
1f80: 74 68 69 73 20 6f 62 6a 65 63 74 20 6e 65 77 3f  this object new?
1f90: 22 0a 2a 2a 20 61 6e 64 20 22 69 73 20 74 68 69  ".** and "is thi
1fa0: 73 20 6f 62 6a 65 63 74 20 72 65 6d 6f 76 65 64  s object removed
1fb0: 3f 22 20 66 6c 61 67 73 20 6f 66 20 74 68 65 20  ?" flags of the 
1fc0: 75 6e 64 65 72 6c 79 69 6e 67 20 71 75 65 72 79  underlying query
1fd0: 2e 20 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  .  This.** funct
1fe0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 73 74  ion returns a st
1ff0: 61 74 69 63 20 73 74 72 69 6e 67 20 66 72 6f 6d  atic string from
2000: 20 74 68 65 20 73 65 74 20 28 61 64 64 65 64 2c   the set (added,
2010: 20 72 65 6d 6f 76 65 64 2c 0a 2a 2a 20 6d 6f 64   removed,.** mod
2020: 69 66 69 65 64 29 2c 20 64 65 70 65 6e 64 69 6e  ified), dependin
2030: 67 20 6f 6e 20 74 68 65 20 63 6f 6d 62 69 6e 61  g on the combina
2040: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20  tion of the two 
2050: 61 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 69  args..**.** Remi
2060: 6e 64 65 72 20 74 6f 20 73 65 6c 66 3a 20 28 6d  nder to self: (m
2070: 6c 69 6e 6b 2e 70 69 64 3d 3d 30 29 20 41 53 20  link.pid==0) AS 
2080: 69 73 4e 65 77 2c 20 28 6d 6c 69 6e 6b 2e 66 69  isNew, (mlink.fi
2090: 64 3d 3d 30 29 20 41 53 20 69 73 44 65 6c 0a 2a  d==0) AS isDel.*
20a0: 2f 0a 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 6a  /.char const * j
20b0: 73 6f 6e 5f 61 72 74 69 66 61 63 74 5f 73 74 61  son_artifact_sta
20c0: 74 75 73 5f 74 6f 5f 73 74 72 69 6e 67 28 20 63  tus_to_string( c
20d0: 68 61 72 20 69 73 4e 65 77 2c 20 63 68 61 72 20  har isNew, char 
20e0: 69 73 44 65 6c 20 29 7b 0a 20 20 72 65 74 75 72  isDel ){.  retur
20f0: 6e 20 69 73 4e 65 77 0a 20 20 20 20 3f 20 22 61  n isNew.    ? "a
2100: 64 64 65 64 22 0a 20 20 20 20 3a 20 28 69 73 44  dded".    : (isD
2110: 65 6c 0a 20 20 20 20 20 20 20 3f 20 22 72 65 6d  el.       ? "rem
2120: 6f 76 65 64 22 0a 20 20 20 20 20 20 20 3a 20 22  oved".       : "
2130: 6d 6f 64 69 66 69 65 64 22 29 3b 0a 7d 0a 0a 63  modified");.}..c
2140: 73 6f 6e 5f 76 61 6c 75 65 20 2a 20 6a 73 6f 6e  son_value * json
2150: 5f 61 72 74 69 66 61 63 74 5f 66 69 6c 65 28 63  _artifact_file(c
2160: 73 6f 6e 5f 6f 62 6a 65 63 74 20 2a 20 7a 50 61  son_object * zPa
2170: 72 65 6e 74 2c 20 69 6e 74 20 72 69 64 29 7b 0a  rent, int rid){.
2180: 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 20 2a 20    cson_object * 
2190: 70 61 79 20 3d 20 4e 55 4c 4c 3b 0a 20 20 53 74  pay = NULL;.  St
21a0: 6d 74 20 71 20 3d 20 65 6d 70 74 79 5f 53 74 6d  mt q = empty_Stm
21b0: 74 3b 0a 20 20 63 73 6f 6e 5f 61 72 72 61 79 20  t;.  cson_array 
21c0: 2a 20 63 68 65 63 6b 69 6e 5f 61 72 72 20 3d 20  * checkin_arr = 
21d0: 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 63 6f 6e 74  NULL;.  int cont
21e0: 65 6e 74 46 6f 72 6d 61 74 3b 0a 20 20 69 36 34  entFormat;.  i64
21f0: 20 63 6f 6e 74 65 6e 74 53 69 7a 65 20 3d 20 2d   contentSize = -
2200: 31 3b 0a 20 20 63 68 61 72 20 2a 20 70 61 72 65  1;.  char * pare
2210: 6e 74 55 75 69 64 3b 0a 20 20 69 66 28 20 21 20  ntUuid;.  if( ! 
2220: 67 2e 70 65 72 6d 2e 52 65 61 64 20 29 7b 0a 20  g.perm.Read ){. 
2230: 20 20 20 6a 73 6f 6e 5f 73 65 74 5f 65 72 72 28     json_set_err(
2240: 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 44 45 4e 49 45  FSL_JSON_E_DENIE
2250: 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  D,.             
2260: 20 20 20 20 22 52 65 71 75 69 72 65 73 20 27 6f      "Requires 'o
2270: 27 20 70 72 69 76 69 6c 65 67 65 73 2e 22 29 3b  ' privileges.");
2280: 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
2290: 3b 0a 20 20 7d 0a 0a 20 20 70 61 79 20 3d 20 7a  ;.  }..  pay = z
22a0: 50 61 72 65 6e 74 3b 0a 0a 20 20 63 6f 6e 74 65  Parent;..  conte
22b0: 6e 74 46 6f 72 6d 61 74 20 3d 20 6a 73 6f 6e 5f  ntFormat = json_
22c0: 61 72 74 69 66 61 63 74 5f 67 65 74 5f 63 6f 6e  artifact_get_con
22d0: 74 65 6e 74 5f 66 6f 72 6d 61 74 5f 66 6c 61 67  tent_format_flag
22e0: 28 29 3b 0a 20 20 69 66 28 20 30 20 21 3d 20 63  ();.  if( 0 != c
22f0: 6f 6e 74 65 6e 74 46 6f 72 6d 61 74 20 29 7b 0a  ontentFormat ){.
2300: 20 20 20 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74      Blob content
2310: 20 3d 20 65 6d 70 74 79 5f 62 6c 6f 62 3b 0a 20   = empty_blob;. 
2320: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2330: 4d 69 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 63  Mime;.    char c
2340: 6f 6e 73 74 20 2a 20 7a 46 6f 72 6d 61 74 20 3d  onst * zFormat =
2350: 20 28 63 6f 6e 74 65 6e 74 46 6f 72 6d 61 74 3c   (contentFormat<
2360: 31 29 20 3f 20 22 72 61 77 22 20 3a 20 22 68 74  1) ? "raw" : "ht
2370: 6d 6c 22 3b 0a 20 20 20 20 63 6f 6e 74 65 6e 74  ml";.    content
2380: 5f 67 65 74 28 72 69 64 2c 20 26 63 6f 6e 74 65  _get(rid, &conte
2390: 6e 74 29 3b 0a 20 20 20 20 7a 4d 69 6d 65 20 3d  nt);.    zMime =
23a0: 20 6d 69 6d 65 74 79 70 65 5f 66 72 6f 6d 5f 63   mimetype_from_c
23b0: 6f 6e 74 65 6e 74 28 26 63 6f 6e 74 65 6e 74 29  ontent(&content)
23c0: 3b 0a 20 20 20 20 63 73 6f 6e 5f 6f 62 6a 65 63  ;.    cson_objec
23d0: 74 5f 73 65 74 28 7a 50 61 72 65 6e 74 2c 20 22  t_set(zParent, "
23e0: 63 6f 6e 74 65 6e 74 54 79 70 65 22 2c 0a 20 20  contentType",.  
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 20 20 6a 73 6f 6e 5f 6e 65 77 5f 73 74 72 69 6e    json_new_strin
2410: 67 28 7a 4d 69 6d 65 20 3f 20 7a 4d 69 6d 65 20  g(zMime ? zMime 
2420: 3a 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 29 29  : "text/plain"))
2430: 3b 0a 20 20 20 20 69 66 28 21 7a 4d 69 6d 65 29  ;.    if(!zMime)
2440: 7b 2f 2a 20 74 65 78 74 2f 70 6c 61 69 6e 20 2a  {/* text/plain *
2450: 2f 0a 20 20 20 20 20 20 69 66 28 30 20 3c 20 62  /.      if(0 < b
2460: 6c 6f 62 5f 73 69 7a 65 28 26 63 6f 6e 74 65 6e  lob_size(&conten
2470: 74 29 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t)){.        if(
2480: 20 30 20 3c 20 63 6f 6e 74 65 6e 74 46 6f 72 6d   0 < contentForm
2490: 61 74 20 29 7b 2f 2a 48 54 4d 4c 2d 73 69 7a 65  at ){/*HTML-size
24a0: 20 69 74 2a 2f 0a 20 20 20 20 20 20 20 20 20 20   it*/.          
24b0: 42 6c 6f 62 20 68 74 6d 6c 20 3d 20 65 6d 70 74  Blob html = empt
24c0: 79 5f 62 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20  y_blob;.        
24d0: 20 20 77 69 6b 69 5f 63 6f 6e 76 65 72 74 28 26    wiki_convert(&
24e0: 63 6f 6e 74 65 6e 74 2c 20 26 68 74 6d 6c 2c 20  content, &html, 
24f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  0);.          as
2500: 73 65 72 74 28 20 62 6c 6f 62 5f 73 69 7a 65 28  sert( blob_size(
2510: 26 63 6f 6e 74 65 6e 74 29 20 3c 20 62 6c 6f 62  &content) < blob
2520: 5f 73 69 7a 65 28 26 68 74 6d 6c 29 20 29 3b 0a  _size(&html) );.
2530: 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 73            blob_s
2540: 77 61 70 28 20 26 68 74 6d 6c 2c 20 26 63 6f 6e  wap( &html, &con
2550: 74 65 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20  tent );.        
2560: 20 20 61 73 73 65 72 74 28 20 62 6c 6f 62 5f 73    assert( blob_s
2570: 69 7a 65 28 26 63 6f 6e 74 65 6e 74 29 20 3e 20  ize(&content) > 
2580: 62 6c 6f 62 5f 73 69 7a 65 28 26 68 74 6d 6c 29  blob_size(&html)
2590: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 6c   );.          bl
25a0: 6f 62 5f 72 65 73 65 74 28 20 26 68 74 6d 6c 20  ob_reset( &html 
25b0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 2f 2a 65 6c  );.        }/*el
25c0: 73 65 20 61 73 2d 69 73 2a 2f 0a 20 20 20 20 20  se as-is*/.     
25d0: 20 7d 0a 20 20 20 20 20 20 63 73 6f 6e 5f 6f 62   }.      cson_ob
25e0: 6a 65 63 74 5f 73 65 74 28 7a 50 61 72 65 6e 74  ject_set(zParent
25f0: 2c 20 22 63 6f 6e 74 65 6e 74 22 2c 0a 20 20 20  , "content",.   
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2610: 20 20 20 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65     cson_value_ne
2620: 77 5f 73 74 72 69 6e 67 28 62 6c 6f 62 5f 73 74  w_string(blob_st
2630: 72 28 26 63 6f 6e 74 65 6e 74 29 2c 0a 20 20 20  r(&content),.   
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 20 20 20 20 20 20 20 28 75 6e 73 69 67 6e           (unsign
2670: 65 64 20 69 6e 74 29 62 6c 6f 62 5f 73 69 7a 65  ed int)blob_size
2680: 28 26 63 6f 6e 74 65 6e 74 29 29 29 3b 0a 20 20  (&content)));.  
2690: 20 20 7d 2f 2a 65 6c 73 65 20 62 69 6e 61 72 79    }/*else binary
26a0: 3a 20 69 67 6e 6f 72 65 2a 2f 0a 20 20 20 20 63  : ignore*/.    c
26b0: 6f 6e 74 65 6e 74 53 69 7a 65 20 3d 20 62 6c 6f  ontentSize = blo
26c0: 62 5f 73 69 7a 65 28 26 63 6f 6e 74 65 6e 74 29  b_size(&content)
26d0: 3b 0a 20 20 20 20 63 73 6f 6e 5f 6f 62 6a 65 63  ;.    cson_objec
26e0: 74 5f 73 65 74 28 7a 50 61 72 65 6e 74 2c 20 22  t_set(zParent, "
26f0: 63 6f 6e 74 65 6e 74 53 69 7a 65 22 2c 20 6a 73  contentSize", js
2700: 6f 6e 5f 6e 65 77 5f 69 6e 74 28 63 6f 6e 74 65  on_new_int(conte
2710: 6e 74 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 63  ntSize) );.    c
2720: 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 7a  son_object_set(z
2730: 50 61 72 65 6e 74 2c 20 22 63 6f 6e 74 65 6e 74  Parent, "content
2740: 46 6f 72 6d 61 74 22 2c 20 6a 73 6f 6e 5f 6e 65  Format", json_ne
2750: 77 5f 73 74 72 69 6e 67 28 7a 46 6f 72 6d 61 74  w_string(zFormat
2760: 29 20 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65  ) );.    blob_re
2770: 73 65 74 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 20  set(&content);. 
2780: 20 7d 0a 20 20 63 6f 6e 74 65 6e 74 53 69 7a 65   }.  contentSize
2790: 20 3d 20 64 62 5f 69 6e 74 36 34 28 2d 31 2c 20   = db_int64(-1, 
27a0: 22 53 45 4c 45 43 54 20 73 69 7a 65 20 46 52 4f  "SELECT size FRO
27b0: 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64  M blob WHERE rid
27c0: 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 61 73  =%d", rid);.  as
27d0: 73 65 72 74 28 20 2d 31 20 3c 20 63 6f 6e 74 65  sert( -1 < conte
27e0: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 63 73 6f 6e  ntSize );.  cson
27f0: 5f 6f 62 6a 65 63 74 5f 73 65 74 28 7a 50 61 72  _object_set(zPar
2800: 65 6e 74 2c 20 22 73 69 7a 65 22 2c 20 6a 73 6f  ent, "size", jso
2810: 6e 5f 6e 65 77 5f 69 6e 74 28 63 6f 6e 74 65 6e  n_new_int(conten
2820: 74 53 69 7a 65 29 20 29 3b 0a 0a 20 20 70 61 72  tSize) );..  par
2830: 65 6e 74 55 75 69 64 20 3d 20 64 62 5f 74 65 78  entUuid = db_tex
2840: 74 28 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  t(NULL,.        
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2860: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
2870: 70 2e 75 75 69 64 20 22 0a 20 20 20 20 20 20 20  p.uuid ".       
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2890: 22 46 52 4f 4d 20 62 6c 6f 62 20 70 2c 20 62 6c  "FROM blob p, bl
28a0: 6f 62 20 66 2c 20 6d 6c 69 6e 6b 20 6d 20 22 0a  ob f, mlink m ".
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 20 20 20 20 20 20 22 57 48 45 52 45 20 6d 2e         "WHERE m.
28d0: 70 69 64 3d 70 2e 72 69 64 20 22 0a 20 20 20 20  pid=p.rid ".    
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f0: 20 20 20 22 41 4e 44 20 6d 2e 66 69 64 3d 66 2e     "AND m.fid=f.
2900: 72 69 64 20 22 0a 20 20 20 20 20 20 20 20 20 20  rid ".          
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41 4e               "AN
2920: 44 20 66 2e 72 69 64 3d 25 64 22 2c 0a 20 20 20  D f.rid=%d",.   
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2940: 20 20 20 20 72 69 64 0a 20 20 20 20 20 20 20 20      rid.        
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
2960: 3b 0a 20 20 69 66 28 70 61 72 65 6e 74 55 75 69  ;.  if(parentUui
2970: 64 29 7b 0a 20 20 20 20 63 73 6f 6e 5f 6f 62 6a  d){.    cson_obj
2980: 65 63 74 5f 73 65 74 28 20 7a 50 61 72 65 6e 74  ect_set( zParent
2990: 2c 20 22 70 61 72 65 6e 74 22 2c 20 6a 73 6f 6e  , "parent", json
29a0: 5f 6e 65 77 5f 73 74 72 69 6e 67 28 70 61 72 65  _new_string(pare
29b0: 6e 74 55 75 69 64 29 20 29 3b 0a 20 20 20 20 66  ntUuid) );.    f
29c0: 6f 73 73 69 6c 5f 66 72 65 65 28 70 61 72 65 6e  ossil_free(paren
29d0: 74 55 75 69 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f  tUuid);.  }..  /
29e0: 2a 20 46 69 6e 64 20 63 68 65 63 6b 2d 69 6e 73  * Find check-ins
29f0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2a00: 20 74 68 69 73 20 66 69 6c 65 2e 2e 2e 20 2a 2f   this file... */
2a10: 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71  .  db_prepare(&q
2a20: 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  ,.      "SELECT 
2a30: 66 69 6c 65 6e 61 6d 65 2e 6e 61 6d 65 20 41 53  filename.name AS
2a40: 20 6e 61 6d 65 2c 20 22 0a 20 20 20 20 20 20 22   name, ".      "
2a50: 20 20 28 6d 6c 69 6e 6b 2e 70 69 64 3d 3d 30 29    (mlink.pid==0)
2a60: 20 41 53 20 69 73 4e 65 77 2c 22 0a 20 20 20 20   AS isNew,".    
2a70: 20 20 22 20 20 28 6d 6c 69 6e 6b 2e 66 69 64 3d    "  (mlink.fid=
2a80: 3d 30 29 20 41 53 20 69 73 44 65 6c 2c 22 0a 20  =0) AS isDel,". 
2a90: 20 20 20 20 20 22 20 20 63 61 73 74 28 73 74 72       "  cast(str
2aa0: 66 74 69 6d 65 28 27 25 25 73 27 2c 65 76 65 6e  ftime('%%s',even
2ab0: 74 2e 6d 74 69 6d 65 29 20 61 73 20 69 6e 74 29  t.mtime) as int)
2ac0: 20 41 53 20 74 69 6d 65 73 74 61 6d 70 2c 22 0a   AS timestamp,".
2ad0: 20 20 20 20 20 20 22 20 20 63 6f 61 6c 65 73 63        "  coalesc
2ae0: 65 28 65 76 65 6e 74 2e 65 63 6f 6d 6d 65 6e 74  e(event.ecomment
2af0: 2c 65 76 65 6e 74 2e 63 6f 6d 6d 65 6e 74 29 20  ,event.comment) 
2b00: 61 73 20 63 6f 6d 6d 65 6e 74 2c 22 0a 20 20 20  as comment,".   
2b10: 20 20 20 22 20 20 63 6f 61 6c 65 73 63 65 28 65     "  coalesce(e
2b20: 76 65 6e 74 2e 65 75 73 65 72 2c 65 76 65 6e 74  vent.euser,event
2b30: 2e 75 73 65 72 29 20 61 73 20 75 73 65 72 2c 22  .user) as user,"
2b40: 0a 23 69 66 20 30 0a 20 20 20 20 20 20 22 20 20  .#if 0.      "  
2b50: 61 2e 73 69 7a 65 20 41 53 20 73 69 7a 65 2c 22  a.size AS size,"
2b60: 20 2f 2a 20 73 61 6d 65 20 66 6f 72 20 61 6c 6c   /* same for all
2b70: 20 63 68 65 63 6b 2d 69 6e 73 2e 20 2a 2f 0a 23   check-ins. */.#
2b80: 65 6e 64 69 66 0a 20 20 20 20 20 20 22 20 20 62  endif.      "  b
2b90: 2e 75 75 69 64 20 61 73 20 63 68 65 63 6b 69 6e  .uuid as checkin
2ba0: 2c 20 22 0a 23 69 66 20 30 0a 20 20 20 20 20 20  , ".#if 0.      
2bb0: 22 20 20 6d 6c 69 6e 6b 2e 6d 70 65 72 6d 20 61  "  mlink.mperm a
2bc0: 73 20 6d 70 65 72 6d 2c 22 0a 23 65 6e 64 69 66  s mperm,".#endif
2bd0: 0a 20 20 20 20 20 20 22 20 20 63 6f 61 6c 65 73  .      "  coales
2be0: 63 65 28 28 53 45 4c 45 43 54 20 76 61 6c 75 65  ce((SELECT value
2bf0: 20 46 52 4f 4d 20 74 61 67 78 72 65 66 22 0a 20   FROM tagxref". 
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 20 20 20 20 20 22 20 20 57 48 45 52 45 20 74 61       "  WHERE ta
2c20: 67 69 64 3d 25 64 20 41 4e 44 20 74 61 67 74 79  gid=%d AND tagty
2c30: 70 65 3e 30 20 41 4e 44 20 22 0a 20 20 20 20 20  pe>0 AND ".     
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c50: 20 22 20 72 69 64 3d 6d 6c 69 6e 6b 2e 6d 69 64   " rid=mlink.mid
2c60: 29 2c 27 74 72 75 6e 6b 27 29 20 61 73 20 62 72  ),'trunk') as br
2c70: 61 6e 63 68 22 0a 20 20 20 20 20 20 22 20 20 46  anch".      "  F
2c80: 52 4f 4d 20 6d 6c 69 6e 6b 2c 20 66 69 6c 65 6e  ROM mlink, filen
2c90: 61 6d 65 2c 20 65 76 65 6e 74 2c 20 62 6c 6f 62  ame, event, blob
2ca0: 20 61 2c 20 62 6c 6f 62 20 62 22 0a 20 20 20 20   a, blob b".    
2cb0: 20 20 22 20 57 48 45 52 45 20 66 69 6c 65 6e 61    " WHERE filena
2cc0: 6d 65 2e 66 6e 69 64 3d 6d 6c 69 6e 6b 2e 66 6e  me.fnid=mlink.fn
2cd0: 69 64 22 0a 20 20 20 20 20 20 22 20 20 20 41 4e  id".      "   AN
2ce0: 44 20 65 76 65 6e 74 2e 6f 62 6a 69 64 3d 6d 6c  D event.objid=ml
2cf0: 69 6e 6b 2e 6d 69 64 22 0a 20 20 20 20 20 20 22  ink.mid".      "
2d00: 20 20 20 41 4e 44 20 61 2e 72 69 64 3d 6d 6c 69     AND a.rid=mli
2d10: 6e 6b 2e 66 69 64 22 0a 20 20 20 20 20 20 22 20  nk.fid".      " 
2d20: 20 20 41 4e 44 20 62 2e 72 69 64 3d 6d 6c 69 6e    AND b.rid=mlin
2d30: 6b 2e 6d 69 64 22 0a 20 20 20 20 20 20 22 20 20  k.mid".      "  
2d40: 20 41 4e 44 20 6d 6c 69 6e 6b 2e 66 69 64 3d 25   AND mlink.fid=%
2d50: 64 22 0a 20 20 20 20 20 20 22 20 20 20 4f 52 44  d".      "   ORD
2d60: 45 52 20 42 59 20 66 69 6c 65 6e 61 6d 65 2e 6e  ER BY filename.n
2d70: 61 6d 65 2c 20 65 76 65 6e 74 2e 6d 74 69 6d 65  ame, event.mtime
2d80: 22 2c 0a 20 20 20 20 20 20 54 41 47 5f 42 52 41  ",.      TAG_BRA
2d90: 4e 43 48 2c 20 72 69 64 0a 20 20 20 20 29 3b 0a  NCH, rid.    );.
2da0: 20 20 2f 2a 20 54 4f 44 4f 3a 20 61 64 64 20 61    /* TODO: add a
2db0: 20 22 73 74 61 74 65 22 20 66 6c 61 67 20 66 6f   "state" flag fo
2dc0: 72 20 74 68 65 20 66 69 6c 65 20 69 6e 20 65 61  r the file in ea
2dd0: 63 68 20 63 68 65 63 6b 2d 69 6e 2c 0a 20 20 20  ch check-in,.   
2de0: 20 20 65 2e 67 2e 20 22 6d 6f 64 69 66 69 65 64    e.g. "modified
2df0: 22 2c 20 22 6e 65 77 22 2c 20 22 64 65 6c 65 74  ", "new", "delet
2e00: 65 64 22 2e 0a 20 20 20 2a 2f 0a 20 20 63 68 65  ed"..   */.  che
2e10: 63 6b 69 6e 5f 61 72 72 20 3d 20 63 73 6f 6e 5f  ckin_arr = cson_
2e20: 6e 65 77 5f 61 72 72 61 79 28 29 3b 0a 20 20 63  new_array();.  c
2e30: 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 70  son_object_set(p
2e40: 61 79 2c 20 22 63 68 65 63 6b 69 6e 73 22 2c 20  ay, "checkins", 
2e50: 63 73 6f 6e 5f 61 72 72 61 79 5f 76 61 6c 75 65  cson_array_value
2e60: 28 63 68 65 63 6b 69 6e 5f 61 72 72 29 29 3b 0a  (checkin_arr));.
2e70: 20 20 77 68 69 6c 65 28 20 28 53 51 4c 49 54 45    while( (SQLITE
2e80: 5f 52 4f 57 3d 3d 64 62 5f 73 74 65 70 28 26 71  _ROW==db_step(&q
2e90: 29 20 29 20 29 7b 0a 20 20 20 20 63 73 6f 6e 5f  ) ) ){.    cson_
2ea0: 6f 62 6a 65 63 74 20 2a 20 72 6f 77 20 3d 20 63  object * row = c
2eb0: 73 6f 6e 5f 76 61 6c 75 65 5f 67 65 74 5f 6f 62  son_value_get_ob
2ec0: 6a 65 63 74 28 63 73 6f 6e 5f 73 71 6c 69 74 65  ject(cson_sqlite
2ed0: 33 5f 72 6f 77 5f 74 6f 5f 6f 62 6a 65 63 74 28  3_row_to_object(
2ee0: 71 2e 70 53 74 6d 74 29 29 3b 0a 20 20 20 20 2f  q.pStmt));.    /
2ef0: 2a 20 46 49 58 4d 45 3a 20 6d 6f 76 65 20 74 68  * FIXME: move th
2f00: 69 73 20 69 73 4e 65 77 2f 69 73 44 65 6c 20 73  is isNew/isDel s
2f10: 74 75 66 66 20 69 6e 74 6f 20 61 6e 20 53 51 4c  tuff into an SQL
2f20: 20 43 41 53 45 20 73 74 61 74 65 6d 65 6e 74 2e   CASE statement.
2f30: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   */.    char con
2f40: 73 74 20 69 73 4e 65 77 20 3d 20 63 73 6f 6e 5f  st isNew = cson_
2f50: 76 61 6c 75 65 5f 67 65 74 5f 62 6f 6f 6c 28 63  value_get_bool(c
2f60: 73 6f 6e 5f 6f 62 6a 65 63 74 5f 67 65 74 28 72  son_object_get(r
2f70: 6f 77 2c 22 69 73 4e 65 77 22 29 29 3b 0a 20 20  ow,"isNew"));.  
2f80: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 69 73 44    char const isD
2f90: 65 6c 20 3d 20 63 73 6f 6e 5f 76 61 6c 75 65 5f  el = cson_value_
2fa0: 67 65 74 5f 62 6f 6f 6c 28 63 73 6f 6e 5f 6f 62  get_bool(cson_ob
2fb0: 6a 65 63 74 5f 67 65 74 28 72 6f 77 2c 22 69 73  ject_get(row,"is
2fc0: 44 65 6c 22 29 29 3b 0a 20 20 20 20 63 73 6f 6e  Del"));.    cson
2fd0: 5f 6f 62 6a 65 63 74 5f 73 65 74 28 72 6f 77 2c  _object_set(row,
2fe0: 20 22 69 73 4e 65 77 22 2c 20 4e 55 4c 4c 29 3b   "isNew", NULL);
2ff0: 0a 20 20 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74  .    cson_object
3000: 5f 73 65 74 28 72 6f 77 2c 20 22 69 73 44 65 6c  _set(row, "isDel
3010: 22 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 63 73  ", NULL);.    cs
3020: 6f 6e 5f 6f 62 6a 65 63 74 5f 73 65 74 28 72 6f  on_object_set(ro
3030: 77 2c 20 22 73 74 61 74 65 22 2c 0a 20 20 20 20  w, "state",.    
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3050: 6a 73 6f 6e 5f 6e 65 77 5f 73 74 72 69 6e 67 28  json_new_string(
3060: 6a 73 6f 6e 5f 61 72 74 69 66 61 63 74 5f 73 74  json_artifact_st
3070: 61 74 75 73 5f 74 6f 5f 73 74 72 69 6e 67 28 69  atus_to_string(i
3080: 73 4e 65 77 2c 20 69 73 44 65 6c 29 29 29 3b 0a  sNew, isDel)));.
3090: 20 20 20 20 63 73 6f 6e 5f 61 72 72 61 79 5f 61      cson_array_a
30a0: 70 70 65 6e 64 28 20 63 68 65 63 6b 69 6e 5f 61  ppend( checkin_a
30b0: 72 72 2c 20 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f  rr, cson_object_
30c0: 76 61 6c 75 65 28 72 6f 77 29 20 29 3b 0a 20 20  value(row) );.  
30d0: 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28  }.  db_finalize(
30e0: 26 71 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 73  &q);.  return cs
30f0: 6f 6e 5f 6f 62 6a 65 63 74 5f 76 61 6c 75 65 28  on_object_value(
3100: 70 61 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pay);.}../*.** I
3110: 6d 70 6c 20 6f 66 20 2f 6a 73 6f 6e 2f 61 72 74  mpl of /json/art
3120: 69 66 61 63 74 2e 20 54 68 69 73 20 62 61 73 69  ifact. This basi
3130: 63 61 6c 6c 79 20 6a 75 73 74 20 64 65 74 65 72  cally just deter
3140: 6d 69 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f  mines the type o
3150: 66 0a 2a 2a 20 61 6e 20 61 72 74 69 66 61 63 74  f.** an artifact
3160: 20 61 6e 64 20 66 6f 72 77 61 72 64 73 20 74 68   and forwards th
3170: 65 20 72 65 61 6c 20 77 6f 72 6b 20 74 6f 20 61  e real work to a
3180: 6e 6f 74 68 65 72 20 66 75 6e 63 74 69 6f 6e 2e  nother function.
3190: 0a 2a 2f 0a 63 73 6f 6e 5f 76 61 6c 75 65 20 2a  .*/.cson_value *
31a0: 20 6a 73 6f 6e 5f 70 61 67 65 5f 61 72 74 69 66   json_page_artif
31b0: 61 63 74 28 29 7b 0a 20 20 63 73 6f 6e 5f 6f 62  act(){.  cson_ob
31c0: 6a 65 63 74 20 2a 20 70 61 79 20 3d 20 4e 55 4c  ject * pay = NUL
31d0: 4c 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  L;.  char const 
31e0: 2a 20 7a 4e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a  * zName = NULL;.
31f0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 20 7a    char const * z
3200: 54 79 70 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63  Type = NULL;.  c
3210: 68 61 72 20 63 6f 6e 73 74 20 2a 20 7a 55 75 69  har const * zUui
3220: 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 73 6f 6e  d = NULL;.  cson
3230: 5f 76 61 6c 75 65 20 2a 20 65 6e 74 72 79 20 3d  _value * entry =
3240: 20 4e 55 4c 4c 3b 0a 20 20 42 6c 6f 62 20 75 75   NULL;.  Blob uu
3250: 69 64 20 3d 20 65 6d 70 74 79 5f 62 6c 6f 62 3b  id = empty_blob;
3260: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
3270: 20 72 69 64 20 3d 20 30 3b 0a 20 20 41 72 74 69   rid = 0;.  Arti
3280: 66 61 63 74 44 69 73 70 61 74 63 68 45 6e 74 72  factDispatchEntr
3290: 79 20 63 6f 6e 73 74 20 2a 20 64 69 73 70 61 74  y const * dispat
32a0: 63 68 65 72 20 3d 20 26 41 72 74 69 66 61 63 74  cher = &Artifact
32b0: 44 69 73 70 61 74 63 68 4c 69 73 74 5b 30 5d 3b  DispatchList[0];
32c0: 0a 20 20 7a 4e 61 6d 65 20 3d 20 6a 73 6f 6e 5f  .  zName = json_
32d0: 66 69 6e 64 5f 6f 70 74 69 6f 6e 5f 63 73 74 72  find_option_cstr
32e0: 32 28 22 6e 61 6d 65 22 2c 20 4e 55 4c 4c 2c 20  2("name", NULL, 
32f0: 4e 55 4c 4c 2c 20 67 2e 6a 73 6f 6e 2e 64 69 73  NULL, g.json.dis
3300: 70 61 74 63 68 44 65 70 74 68 2b 31 29 3b 0a 20  patchDepth+1);. 
3310: 20 69 66 28 21 7a 4e 61 6d 65 20 7c 7c 20 21 2a   if(!zName || !*
3320: 7a 4e 61 6d 65 29 20 7b 0a 20 20 20 20 6a 73 6f  zName) {.    jso
3330: 6e 5f 73 65 74 5f 65 72 72 28 46 53 4c 5f 4a 53  n_set_err(FSL_JS
3340: 4f 4e 5f 45 5f 4d 49 53 53 49 4e 47 5f 41 52 47  ON_E_MISSING_ARG
3350: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
3360: 20 20 20 20 22 4d 69 73 73 69 6e 67 20 27 6e 61      "Missing 'na
3370: 6d 65 27 20 61 72 67 75 6d 65 6e 74 2e 22 29 3b  me' argument.");
3380: 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
3390: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 61 6c  ;.  }..  if( val
33a0: 69 64 61 74 65 31 36 28 7a 4e 61 6d 65 2c 20 73  idate16(zName, s
33b0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 20 29 7b  trlen(zName)) ){
33c0: 0a 20 20 20 20 69 66 28 20 64 62 5f 65 78 69 73  .    if( db_exis
33d0: 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f  ts("SELECT 1 FRO
33e0: 4d 20 74 69 63 6b 65 74 20 57 48 45 52 45 20 74  M ticket WHERE t
33f0: 6b 74 5f 75 75 69 64 20 47 4c 4f 42 20 27 25 71  kt_uuid GLOB '%q
3400: 2a 27 22 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  *'", zName) ){. 
3410: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 69       zType = "ti
3420: 63 6b 65 74 22 3b 0a 20 20 20 20 20 20 67 6f 74  cket";.      got
3430: 6f 20 68 61 6e 64 6c 65 5f 65 6e 74 72 79 3b 0a  o handle_entry;.
3440: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
3450: 5f 65 78 69 73 74 73 28 22 53 45 4c 45 43 54 20  _exists("SELECT 
3460: 31 20 46 52 4f 4d 20 74 61 67 20 57 48 45 52 45  1 FROM tag WHERE
3470: 20 74 61 67 6e 61 6d 65 20 47 4c 4f 42 20 27 65   tagname GLOB 'e
3480: 76 65 6e 74 2d 25 71 2a 27 22 2c 20 7a 4e 61 6d  vent-%q*'", zNam
3490: 65 29 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  e) ){.      zTyp
34a0: 65 20 3d 20 22 74 61 67 22 3b 0a 20 20 20 20 20  e = "tag";.     
34b0: 20 67 6f 74 6f 20 68 61 6e 64 6c 65 5f 65 6e 74   goto handle_ent
34c0: 72 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ry;.    }.  }.  
34d0: 62 6c 6f 62 5f 73 65 74 28 26 75 75 69 64 2c 7a  blob_set(&uuid,z
34e0: 4e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20 6e 61  Name);.  rc = na
34f0: 6d 65 5f 74 6f 5f 75 75 69 64 28 26 75 75 69 64  me_to_uuid(&uuid
3500: 2c 2d 31 2c 22 2a 22 29 3b 0a 20 20 2f 2a 20 46  ,-1,"*");.  /* F
3510: 49 58 4d 45 3a 20 63 68 65 63 6b 20 66 6f 72 20  IXME: check for 
3520: 61 20 66 69 6c 65 6e 61 6d 65 20 69 66 20 61 6c  a filename if al
3530: 6c 20 65 6c 73 65 20 66 61 69 6c 73 2e 20 2a 2f  l else fails. */
3540: 0a 20 20 69 66 28 31 3d 3d 72 63 29 7b 0a 20 20  .  if(1==rc){.  
3550: 20 20 67 2e 6a 73 6f 6e 2e 72 65 73 75 6c 74 43    g.json.resultC
3560: 6f 64 65 20 3d 20 46 53 4c 5f 4a 53 4f 4e 5f 45  ode = FSL_JSON_E
3570: 5f 52 45 53 4f 55 52 43 45 5f 4e 4f 54 5f 46 4f  _RESOURCE_NOT_FO
3580: 55 4e 44 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72  UND;.    goto er
3590: 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ror;.  }else if(
35a0: 32 3d 3d 72 63 29 7b 0a 20 20 20 20 67 2e 6a 73  2==rc){.    g.js
35b0: 6f 6e 2e 72 65 73 75 6c 74 43 6f 64 65 20 3d 20  on.resultCode = 
35c0: 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 41 4d 42 49 47  FSL_JSON_E_AMBIG
35d0: 55 4f 55 53 5f 55 55 49 44 3b 0a 20 20 20 20 67  UOUS_UUID;.    g
35e0: 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  oto error;.  }. 
35f0: 20 7a 55 75 69 64 20 3d 20 62 6c 6f 62 5f 73 74   zUuid = blob_st
3600: 72 28 26 75 75 69 64 29 3b 0a 20 20 72 69 64 20  r(&uuid);.  rid 
3610: 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c  = db_int(0, "SEL
3620: 45 43 54 20 72 69 64 20 46 52 4f 4d 20 62 6c 6f  ECT rid FROM blo
3630: 62 20 57 48 45 52 45 20 75 75 69 64 3d 25 51 22  b WHERE uuid=%Q"
3640: 2c 20 7a 55 75 69 64 29 3b 0a 20 20 69 66 28 30  , zUuid);.  if(0
3650: 3d 3d 72 69 64 29 7b 0a 20 20 20 20 67 2e 6a 73  ==rid){.    g.js
3660: 6f 6e 2e 72 65 73 75 6c 74 43 6f 64 65 20 3d 20  on.resultCode = 
3670: 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 52 45 53 4f 55  FSL_JSON_E_RESOU
3680: 52 43 45 5f 4e 4f 54 5f 46 4f 55 4e 44 3b 0a 20  RCE_NOT_FOUND;. 
3690: 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20     goto error;. 
36a0: 20 7d 0a 0a 20 20 69 66 28 20 64 62 5f 65 78 69   }..  if( db_exi
36b0: 73 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52  sts("SELECT 1 FR
36c0: 4f 4d 20 6d 6c 69 6e 6b 20 57 48 45 52 45 20 6d  OM mlink WHERE m
36d0: 69 64 3d 25 64 22 2c 20 72 69 64 29 0a 20 20 20  id=%d", rid).   
36e0: 20 20 20 7c 7c 20 64 62 5f 65 78 69 73 74 73 28     || db_exists(
36f0: 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 70  "SELECT 1 FROM p
3700: 6c 69 6e 6b 20 57 48 45 52 45 20 63 69 64 3d 25  link WHERE cid=%
3710: 64 22 2c 20 72 69 64 29 0a 20 20 20 20 20 20 7c  d", rid).      |
3720: 7c 20 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c  | db_exists("SEL
3730: 45 43 54 20 31 20 46 52 4f 4d 20 70 6c 69 6e 6b  ECT 1 FROM plink
3740: 20 57 48 45 52 45 20 70 69 64 3d 25 64 22 2c 20   WHERE pid=%d", 
3750: 72 69 64 29 29 7b 0a 20 20 20 20 7a 54 79 70 65  rid)){.    zType
3760: 20 3d 20 22 63 68 65 63 6b 69 6e 22 3b 0a 20 20   = "checkin";.  
3770: 20 20 67 6f 74 6f 20 68 61 6e 64 6c 65 5f 65 6e    goto handle_en
3780: 74 72 79 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  try;.  }else if(
3790: 20 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45   db_exists("SELE
37a0: 43 54 20 31 20 46 52 4f 4d 20 74 61 67 78 72 65  CT 1 FROM tagxre
37b0: 66 20 4a 4f 49 4e 20 74 61 67 20 55 53 49 4e 47  f JOIN tag USING
37c0: 28 74 61 67 69 64 29 22 0a 20 20 20 20 20 20 20  (tagid)".       
37d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
37e0: 20 57 48 45 52 45 20 72 69 64 3d 25 64 20 41 4e   WHERE rid=%d AN
37f0: 44 20 74 61 67 6e 61 6d 65 20 4c 49 4b 45 20 27  D tagname LIKE '
3800: 77 69 6b 69 2d 25 25 27 22 2c 20 72 69 64 29 20  wiki-%%'", rid) 
3810: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
3820: 77 69 6b 69 22 3b 0a 20 20 20 20 67 6f 74 6f 20  wiki";.    goto 
3830: 68 61 6e 64 6c 65 5f 65 6e 74 72 79 3b 0a 20 20  handle_entry;.  
3840: 7d 65 6c 73 65 20 69 66 28 20 64 62 5f 65 78 69  }else if( db_exi
3850: 73 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52  sts("SELECT 1 FR
3860: 4f 4d 20 74 61 67 78 72 65 66 20 4a 4f 49 4e 20  OM tagxref JOIN 
3870: 74 61 67 20 55 53 49 4e 47 28 74 61 67 69 64 29  tag USING(tagid)
3880: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
3890: 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
38a0: 72 69 64 3d 25 64 20 41 4e 44 20 74 61 67 6e 61  rid=%d AND tagna
38b0: 6d 65 20 4c 49 4b 45 20 27 74 6b 74 2d 25 25 27  me LIKE 'tkt-%%'
38c0: 22 2c 20 72 69 64 29 20 29 7b 0a 20 20 20 20 7a  ", rid) ){.    z
38d0: 54 79 70 65 20 3d 20 22 74 69 63 6b 65 74 22 3b  Type = "ticket";
38e0: 0a 20 20 20 20 67 6f 74 6f 20 68 61 6e 64 6c 65  .    goto handle
38f0: 5f 65 6e 74 72 79 3b 0a 20 20 7d 65 6c 73 65 20  _entry;.  }else 
3900: 69 66 20 28 20 64 62 5f 65 78 69 73 74 73 28 22  if ( db_exists("
3910: 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 6d 6c  SELECT 1 FROM ml
3920: 69 6e 6b 20 57 48 45 52 45 20 66 69 64 20 3d 20  ink WHERE fid = 
3930: 25 64 22 2c 20 72 69 64 29 20 29 7b 0a 20 20 20  %d", rid) ){.   
3940: 20 7a 54 79 70 65 20 3d 20 22 66 69 6c 65 22 3b   zType = "file";
3950: 0a 20 20 20 20 67 6f 74 6f 20 68 61 6e 64 6c 65  .    goto handle
3960: 5f 65 6e 74 72 79 3b 0a 20 20 7d 65 6c 73 65 7b  _entry;.  }else{
3970: 0a 20 20 20 20 67 2e 6a 73 6f 6e 2e 72 65 73 75  .    g.json.resu
3980: 6c 74 43 6f 64 65 20 3d 20 46 53 4c 5f 4a 53 4f  ltCode = FSL_JSO
3990: 4e 5f 45 5f 52 45 53 4f 55 52 43 45 5f 4e 4f 54  N_E_RESOURCE_NOT
39a0: 5f 46 4f 55 4e 44 3b 0a 20 20 20 20 67 6f 74 6f  _FOUND;.    goto
39b0: 20 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 65   error;.  }..  e
39c0: 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20  rror:.  assert( 
39d0: 30 20 21 3d 20 67 2e 6a 73 6f 6e 2e 72 65 73 75  0 != g.json.resu
39e0: 6c 74 43 6f 64 65 20 29 3b 0a 20 20 67 6f 74 6f  ltCode );.  goto
39f0: 20 76 65 72 79 65 6e 64 3b 0a 0a 20 20 68 61 6e   veryend;..  han
3a00: 64 6c 65 5f 65 6e 74 72 79 3a 0a 20 20 70 61 79  dle_entry:.  pay
3a10: 20 3d 20 63 73 6f 6e 5f 6e 65 77 5f 6f 62 6a 65   = cson_new_obje
3a20: 63 74 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ct();.  assert( 
3a30: 28 4e 55 4c 4c 20 21 3d 20 7a 54 79 70 65 29 20  (NULL != zType) 
3a40: 26 26 20 22 49 6e 74 65 72 6e 61 6c 20 64 69 73  && "Internal dis
3a50: 70 61 74 63 68 69 6e 67 20 65 72 72 6f 72 2e 22  patching error."
3a60: 20 29 3b 0a 20 20 66 6f 72 28 20 3b 20 64 69 73   );.  for( ; dis
3a70: 70 61 74 63 68 65 72 2d 3e 6e 61 6d 65 3b 20 2b  patcher->name; +
3a80: 2b 64 69 73 70 61 74 63 68 65 72 20 29 7b 0a 20  +dispatcher ){. 
3a90: 20 20 20 69 66 28 30 21 3d 66 6f 73 73 69 6c 5f     if(0!=fossil_
3aa0: 73 74 72 63 6d 70 28 64 69 73 70 61 74 63 68 65  strcmp(dispatche
3ab0: 72 2d 3e 6e 61 6d 65 2c 20 7a 54 79 70 65 29 29  r->name, zType))
3ac0: 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
3ad0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3ae0: 20 20 20 65 6e 74 72 79 20 3d 20 28 2a 64 69 73     entry = (*dis
3af0: 70 61 74 63 68 65 72 2d 3e 66 75 6e 63 29 28 70  patcher->func)(p
3b00: 61 79 2c 20 72 69 64 29 3b 0a 20 20 20 20 20 20  ay, rid);.      
3b10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
3b20: 0a 20 20 69 66 28 21 67 2e 6a 73 6f 6e 2e 72 65  .  if(!g.json.re
3b30: 73 75 6c 74 43 6f 64 65 29 7b 0a 20 20 20 20 61  sultCode){.    a
3b40: 73 73 65 72 74 28 20 4e 55 4c 4c 20 21 3d 20 65  ssert( NULL != e
3b50: 6e 74 72 79 20 29 3b 0a 20 20 20 20 61 73 73 65  ntry );.    asse
3b60: 72 74 28 20 4e 55 4c 4c 20 21 3d 20 7a 54 79 70  rt( NULL != zTyp
3b70: 65 20 29 3b 0a 20 20 20 20 63 73 6f 6e 5f 6f 62  e );.    cson_ob
3b80: 6a 65 63 74 5f 73 65 74 28 20 70 61 79 2c 20 22  ject_set( pay, "
3b90: 74 79 70 65 22 2c 20 6a 73 6f 6e 5f 6e 65 77 5f  type", json_new_
3ba0: 73 74 72 69 6e 67 28 7a 54 79 70 65 29 20 29 3b  string(zType) );
3bb0: 0a 20 20 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74  .    cson_object
3bc0: 5f 73 65 74 28 20 70 61 79 2c 20 22 75 75 69 64  _set( pay, "uuid
3bd0: 22 2c 20 6a 73 6f 6e 5f 6e 65 77 5f 73 74 72 69  ", json_new_stri
3be0: 6e 67 28 7a 55 75 69 64 29 20 29 3b 0a 20 20 20  ng(zUuid) );.   
3bf0: 20 2f 2a 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73   /*cson_object_s
3c00: 65 74 28 20 70 61 79 2c 20 22 6e 61 6d 65 22 2c  et( pay, "name",
3c10: 20 6a 73 6f 6e 5f 6e 65 77 5f 73 74 72 69 6e 67   json_new_string
3c20: 28 7a 4e 61 6d 65 20 3f 20 7a 4e 61 6d 65 20 3a  (zName ? zName :
3c30: 20 7a 55 75 69 64 29 20 29 3b 2a 2f 0a 20 20 20   zUuid) );*/.   
3c40: 20 2f 2a 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 73   /*cson_object_s
3c50: 65 74 28 20 70 61 79 2c 20 22 72 69 64 22 2c 20  et( pay, "rid", 
3c60: 63 73 6f 6e 5f 76 61 6c 75 65 5f 6e 65 77 5f 69  cson_value_new_i
3c70: 6e 74 65 67 65 72 28 72 69 64 29 20 29 3b 2a 2f  nteger(rid) );*/
3c80: 0a 20 20 20 20 69 66 28 63 73 6f 6e 5f 76 61 6c  .    if(cson_val
3c90: 75 65 5f 69 73 5f 6f 62 6a 65 63 74 28 65 6e 74  ue_is_object(ent
3ca0: 72 79 29 20 26 26 20 28 63 73 6f 6e 5f 76 61 6c  ry) && (cson_val
3cb0: 75 65 5f 67 65 74 5f 6f 62 6a 65 63 74 28 65 6e  ue_get_object(en
3cc0: 74 72 79 29 20 21 3d 20 70 61 79 29 29 7b 0a 20  try) != pay)){. 
3cd0: 20 20 20 20 20 63 73 6f 6e 5f 6f 62 6a 65 63 74       cson_object
3ce0: 5f 73 65 74 28 70 61 79 2c 20 22 61 72 74 69 66  _set(pay, "artif
3cf0: 61 63 74 22 2c 20 65 6e 74 72 79 29 3b 0a 20 20  act", entry);.  
3d00: 20 20 7d 0a 20 20 7d 0a 20 20 76 65 72 79 65 6e    }.  }.  veryen
3d10: 64 3a 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28  d:.  blob_reset(
3d20: 26 75 75 69 64 29 3b 0a 20 20 69 66 28 67 2e 6a  &uuid);.  if(g.j
3d30: 73 6f 6e 2e 72 65 73 75 6c 74 43 6f 64 65 20 26  son.resultCode &
3d40: 26 20 70 61 79 29 7b 0a 20 20 20 20 63 73 6f 6e  & pay){.    cson
3d50: 5f 66 72 65 65 5f 6f 62 6a 65 63 74 28 70 61 79  _free_object(pay
3d60: 29 3b 0a 20 20 20 20 70 61 79 20 3d 20 4e 55 4c  );.    pay = NUL
3d70: 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  L;.  }.  return 
3d80: 63 73 6f 6e 5f 6f 62 6a 65 63 74 5f 76 61 6c 75  cson_object_valu
3d90: 65 28 70 61 79 29 3b 0a 7d 0a 0a 23 65 6e 64 69  e(pay);.}..#endi
3da0: 66 20 2f 2a 20 46 4f 53 53 49 4c 5f 45 4e 41 42  f /* FOSSIL_ENAB
3db0: 4c 45 5f 4a 53 4f 4e 20 2a 2f 0a                 LE_JSON */.