Hex Artifact Content
Not logged in

Artifact 5cd9dc9d0bac2c6e60dd51af7c48b22f40649ce4:

File src/timeline.c part of check-in [4d051c1eda] - New timeline formatting experiment. Foreground font color changes when mousing over the vinfo hyperline show all immediate parents in red and immediate children in green and hide all entries that are not part of the current line. by drh on 2007-08-29 11:48:58.

0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68  (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76  lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c  ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65  ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73  s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20  tributed in the 
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c  hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20  l be useful,.** 
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20  but WITHOUT ANY 
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75  WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69  t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a  ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52  Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55   A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20  RPOSE.  See the 
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50  GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f  ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a  r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c  ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  d have received 
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e  a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e  .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72  g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69  ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65  te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20  ation, Inc., 59 
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53  Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73  uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31  ton, MA  02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20  307, USA..**.** 
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69  Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20  nformation:.**  
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a   drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68  *   http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a  waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  .**.** This file
0370: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 74   contains code t
0380: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
0390: 74 69 6d 65 6c 69 6e 65 20 77 65 62 20 70 61 67  timeline web pag
03a0: 65 0a 2a 2a 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  e.**.*/.#include
03b0: 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63   "config.h".#inc
03c0: 6c 75 64 65 20 22 74 69 6d 65 6c 69 6e 65 2e 68  lude "timeline.h
03d0: 22 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  "../*.** Generat
03e0: 65 20 61 20 68 79 70 65 72 6c 69 6e 6b 20 74 6f  e a hyperlink to
03f0: 20 61 20 76 65 72 73 69 6f 6e 2e 0a 2a 2f 0a 76   a version..*/.v
0400: 6f 69 64 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f  oid hyperlink_to
0410: 5f 75 75 69 64 28 63 6f 6e 73 74 20 63 68 61 72  _uuid(const char
0420: 20 2a 7a 55 75 69 64 29 7b 0a 20 20 63 68 61 72   *zUuid){.  char
0430: 20 7a 53 68 6f 72 74 55 75 69 64 5b 55 55 49 44   zShortUuid[UUID
0440: 5f 53 49 5a 45 2b 31 5d 3b 0a 20 20 73 70 72 69  _SIZE+1];.  spri
0450: 6e 74 66 28 7a 53 68 6f 72 74 55 75 69 64 2c 20  ntf(zShortUuid, 
0460: 22 25 2e 31 30 73 22 2c 20 7a 55 75 69 64 29 3b  "%.10s", zUuid);
0470: 0a 20 20 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f  .  if( g.okHisto
0480: 72 79 20 29 7b 0a 20 20 20 20 40 20 3c 61 20 68  ry ){.    @ <a h
0490: 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55  ref="%s(g.zBaseU
04a0: 52 4c 29 2f 76 69 6e 66 6f 2f 25 73 28 7a 55 75  RL)/vinfo/%s(zUu
04b0: 69 64 29 22 3e 5b 25 73 28 7a 53 68 6f 72 74 55  id)">[%s(zShortU
04c0: 75 69 64 29 5d 3c 2f 61 3e 0a 20 20 7d 65 6c 73  uid)]</a>.  }els
04d0: 65 7b 0a 20 20 20 20 40 20 3c 62 3e 5b 25 73 28  e{.    @ <b>[%s(
04e0: 7a 53 68 6f 72 74 55 75 69 64 29 5d 3c 2f 62 3e  zShortUuid)]</b>
04f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
0500: 6e 65 72 61 74 65 20 61 20 68 79 70 65 72 6c 69  nerate a hyperli
0510: 6e 6b 20 74 68 61 74 20 69 6e 76 6f 6b 65 73 20  nk that invokes 
0520: 6a 61 76 61 73 63 72 69 70 74 20 74 6f 20 68 69  javascript to hi
0530: 67 68 6c 69 67 68 74 0a 2a 2a 20 61 20 76 65 72  ghlight.** a ver
0540: 73 69 6f 6e 20 6f 6e 20 6d 6f 75 73 65 6f 76 65  sion on mouseove
0550: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 68 79 70 65 72  r..*/.void hyper
0560: 6c 69 6e 6b 5f 74 6f 5f 75 75 69 64 5f 77 69 74  link_to_uuid_wit
0570: 68 5f 6d 6f 75 73 65 6f 76 65 72 28 0a 20 20 63  h_mouseover(.  c
0580: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 75 69 64  onst char *zUuid
0590: 2c 20 20 20 2f 2a 20 54 68 65 20 55 55 49 44 20  ,   /* The UUID 
05a0: 74 6f 20 64 69 73 70 6c 61 79 20 2a 2f 0a 20 20  to display */.  
05b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c  const char *zIn,
05c0: 20 20 20 20 20 2f 2a 20 4a 61 76 61 73 63 72 69       /* Javascri
05d0: 70 74 20 70 72 6f 63 20 66 6f 72 20 6d 6f 75 73  pt proc for mous
05e0: 65 6f 76 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  eover */.  const
05f0: 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20 20 20 20   char *zOut,    
0600: 2f 2a 20 4a 61 76 61 73 63 72 69 70 74 20 70 72  /* Javascript pr
0610: 6f 63 20 66 6f 72 20 6d 6f 75 73 65 6f 75 74 20  oc for mouseout 
0620: 2a 2f 0a 20 20 69 6e 74 20 69 64 20 20 20 20 20  */.  int id     
0630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
0640: 75 6d 65 6e 74 20 74 6f 20 6a 61 76 61 73 63 72  ument to javascr
0650: 69 70 74 20 70 72 6f 63 73 20 2a 2f 0a 29 7b 0a  ipt procs */.){.
0660: 20 20 63 68 61 72 20 7a 53 68 6f 72 74 55 75 69    char zShortUui
0670: 64 5b 55 55 49 44 5f 53 49 5a 45 2b 31 5d 3b 0a  d[UUID_SIZE+1];.
0680: 20 20 73 70 72 69 6e 74 66 28 7a 53 68 6f 72 74    sprintf(zShort
0690: 55 75 69 64 2c 20 22 25 2e 31 30 73 22 2c 20 7a  Uuid, "%.10s", z
06a0: 55 75 69 64 29 3b 0a 20 20 69 66 28 20 67 2e 6f  Uuid);.  if( g.o
06b0: 6b 48 69 73 74 6f 72 79 20 29 7b 0a 20 20 20 20  kHistory ){.    
06c0: 40 20 3c 61 20 6f 6e 6d 6f 75 73 65 6f 76 65 72  @ <a onmouseover
06d0: 3d 27 25 73 28 7a 49 6e 29 28 22 6d 25 64 28 69  ='%s(zIn)("m%d(i
06e0: 64 29 22 29 27 20 6f 6e 6d 6f 75 73 65 6f 75 74  d)")' onmouseout
06f0: 3d 27 25 73 28 7a 4f 75 74 29 28 22 6d 25 64 28  ='%s(zOut)("m%d(
0700: 69 64 29 22 29 27 0a 20 20 20 20 40 20 20 20 20  id)")'.    @    
0710: 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65  href="%s(g.zBase
0720: 55 52 4c 29 2f 76 69 6e 66 6f 2f 25 73 28 7a 55  URL)/vinfo/%s(zU
0730: 75 69 64 29 22 3e 5b 25 73 28 7a 53 68 6f 72 74  uid)">[%s(zShort
0740: 55 75 69 64 29 5d 3c 2f 61 3e 0a 20 20 7d 65 6c  Uuid)]</a>.  }el
0750: 73 65 7b 0a 20 20 20 20 40 20 3c 62 20 6f 6e 6d  se{.    @ <b onm
0760: 6f 75 73 65 6f 76 65 72 3d 27 25 73 28 7a 49 6e  ouseover='%s(zIn
0770: 29 28 22 6d 25 64 28 69 64 29 22 29 27 20 6f 6e  )("m%d(id)")' on
0780: 6d 6f 75 73 65 6f 75 74 3d 27 25 73 28 7a 4f 75  mouseout='%s(zOu
0790: 74 29 28 22 6d 25 64 28 69 64 29 22 29 27 3e 0a  t)("m%d(id)")'>.
07a0: 20 20 20 20 40 20 5b 25 73 28 7a 53 68 6f 72 74      @ [%s(zShort
07b0: 55 75 69 64 29 5d 3c 2f 62 3e 0a 20 20 7d 0a 7d  Uuid)]</b>.  }.}
07c0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
07d0: 20 61 20 68 79 70 65 72 6c 69 6e 6b 20 74 6f 20   a hyperlink to 
07e0: 61 20 64 69 66 66 20 62 65 74 77 65 65 6e 20 74  a diff between t
07f0: 77 6f 20 76 65 72 73 69 6f 6e 73 2e 0a 2a 2f 0a  wo versions..*/.
0800: 76 6f 69 64 20 68 79 70 65 72 6c 69 6e 6b 5f 74  void hyperlink_t
0810: 6f 5f 64 69 66 66 28 63 6f 6e 73 74 20 63 68 61  o_diff(const cha
0820: 72 20 2a 7a 56 31 2c 20 63 6f 6e 73 74 20 63 68  r *zV1, const ch
0830: 61 72 20 2a 7a 56 32 29 7b 0a 20 20 69 66 28 20  ar *zV2){.  if( 
0840: 67 2e 6f 6b 48 69 73 74 6f 72 79 20 29 7b 0a 20  g.okHistory ){. 
0850: 20 20 20 69 66 28 20 7a 56 32 3d 3d 30 20 29 7b     if( zV2==0 ){
0860: 0a 20 20 20 20 20 20 40 20 3c 61 20 68 72 65 66  .      @ <a href
0870: 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29  ="%s(g.zBaseURL)
0880: 2f 64 69 66 66 3f 76 32 3d 25 73 28 7a 56 31 29  /diff?v2=%s(zV1)
0890: 22 3e 5b 64 69 66 66 5d 3c 2f 61 3e 0a 20 20 20  ">[diff]</a>.   
08a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 40 20   }else{.      @ 
08b0: 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42  <a href="%s(g.zB
08c0: 61 73 65 55 52 4c 29 2f 64 69 66 66 3f 76 31 3d  aseURL)/diff?v1=
08d0: 25 73 28 7a 56 31 29 26 76 32 3d 25 73 28 7a 56  %s(zV1)&v2=%s(zV
08e0: 32 29 22 3e 5b 64 69 66 66 5d 3c 2f 61 3e 0a 20  2)">[diff]</a>. 
08f0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
0900: 2a 20 4f 75 74 70 75 74 20 61 20 74 69 6d 65 6c  * Output a timel
0910: 69 6e 65 20 69 6e 20 74 68 65 20 77 65 62 20 66  ine in the web f
0920: 6f 72 6d 61 74 20 67 69 76 65 6e 20 61 20 71 75  ormat given a qu
0930: 65 72 79 2e 20 20 54 68 65 20 71 75 65 72 79 0a  ery.  The query.
0940: 2a 2a 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  ** should return
0950: 20 34 20 63 6f 6c 75 6d 6e 73 3a 0a 2a 2a 0a 2a   4 columns:.**.*
0960: 2a 20 20 20 20 30 2e 20 20 72 69 64 0a 2a 2a 20  *    0.  rid.** 
0970: 20 20 20 31 2e 20 20 55 55 49 44 0a 2a 2a 20 20     1.  UUID.**  
0980: 20 20 32 2e 20 20 44 61 74 65 2f 54 69 6d 65 0a    2.  Date/Time.
0990: 2a 2a 20 20 20 20 33 2e 20 20 43 6f 6d 6d 65 6e  **    3.  Commen
09a0: 74 20 73 74 72 69 6e 67 0a 2a 2a 20 20 20 20 34  t string.**    4
09b0: 2e 20 20 55 73 65 72 0a 2a 2a 20 20 20 20 35 2e  .  User.**    5.
09c0: 20 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d    Number of non-
09d0: 6d 65 72 67 65 20 63 68 69 6c 64 72 65 6e 0a 2a  merge children.*
09e0: 2a 20 20 20 20 36 2e 20 20 4e 75 6d 62 65 72 20  *    6.  Number 
09f0: 6f 66 20 70 61 72 65 6e 74 73 0a 2a 2a 20 20 20  of parents.**   
0a00: 20 37 2e 20 20 54 72 75 65 20 69 66 20 69 73 20   7.  True if is 
0a10: 61 20 6c 65 61 66 0a 2a 2f 0a 76 6f 69 64 20 77  a leaf.*/.void w
0a20: 77 77 5f 70 72 69 6e 74 5f 74 69 6d 65 6c 69 6e  ww_print_timelin
0a30: 65 28 0a 20 20 53 74 6d 74 20 2a 70 51 75 65 72  e(.  Stmt *pQuer
0a40: 79 2c 0a 20 20 63 68 61 72 20 2a 7a 4c 61 73 74  y,.  char *zLast
0a50: 44 61 74 65 2c 0a 20 20 69 6e 74 20 28 2a 78 43  Date,.  int (*xC
0a60: 61 6c 6c 62 61 63 6b 29 28 69 6e 74 2c 20 42 6c  allback)(int, Bl
0a70: 6f 62 2a 29 2c 0a 20 20 42 6c 6f 62 20 2a 70 41  ob*),.  Blob *pA
0a80: 72 67 0a 20 29 7b 0a 20 20 63 68 61 72 20 7a 50  rg. ){.  char zP
0a90: 72 65 76 44 61 74 65 5b 32 30 5d 3b 0a 20 20 7a  revDate[20];.  z
0aa0: 50 72 65 76 44 61 74 65 5b 30 5d 20 3d 20 30 3b  PrevDate[0] = 0;
0ab0: 0a 20 20 40 20 3c 74 61 62 6c 65 20 63 65 6c 6c  .  @ <table cell
0ac0: 73 70 61 63 69 6e 67 3d 30 20 62 6f 72 64 65 72  spacing=0 border
0ad0: 3d 30 20 63 65 6c 6c 70 61 64 64 69 6e 67 3d 30  =0 cellpadding=0
0ae0: 3e 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74  >.  while( db_st
0af0: 65 70 28 70 51 75 65 72 79 29 3d 3d 53 51 4c 49  ep(pQuery)==SQLI
0b00: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e  TE_ROW ){.    in
0b10: 74 20 72 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d  t rid = db_colum
0b20: 6e 5f 69 6e 74 28 70 51 75 65 72 79 2c 20 30 29  n_int(pQuery, 0)
0b30: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
0b40: 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f 63 6f 6c   *zUuid = db_col
0b50: 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c  umn_text(pQuery,
0b60: 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 6e 50 43   1);.    int nPC
0b70: 68 69 6c 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  hild = db_column
0b80: 5f 69 6e 74 28 70 51 75 65 72 79 2c 20 35 29 3b  _int(pQuery, 5);
0b90: 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 65 6e 74  .    int nParent
0ba0: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   = db_column_int
0bb0: 28 70 51 75 65 72 79 2c 20 36 29 3b 0a 20 20 20  (pQuery, 6);.   
0bc0: 20 69 6e 74 20 69 73 4c 65 61 66 20 3d 20 64 62   int isLeaf = db
0bd0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 51 75 65  _column_int(pQue
0be0: 72 79 2c 20 37 29 3b 0a 20 20 20 20 63 6f 6e 73  ry, 7);.    cons
0bf0: 74 20 63 68 61 72 20 2a 7a 44 61 74 65 20 3d 20  t char *zDate = 
0c00: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  db_column_text(p
0c10: 51 75 65 72 79 2c 20 32 29 3b 0a 20 20 20 20 69  Query, 2);.    i
0c20: 66 28 20 78 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  f( xCallback ){.
0c30: 20 20 20 20 20 20 78 43 61 6c 6c 62 61 63 6b 28        xCallback(
0c40: 72 69 64 2c 20 70 41 72 67 29 3b 0a 20 20 20 20  rid, pArg);.    
0c50: 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  }.    if( memcmp
0c60: 28 7a 44 61 74 65 2c 20 7a 50 72 65 76 44 61 74  (zDate, zPrevDat
0c70: 65 2c 20 31 30 29 20 29 7b 0a 20 20 20 20 20 20  e, 10) ){.      
0c80: 73 70 72 69 6e 74 66 28 7a 50 72 65 76 44 61 74  sprintf(zPrevDat
0c90: 65 2c 20 22 25 2e 31 30 73 22 2c 20 7a 44 61 74  e, "%.10s", zDat
0ca0: 65 29 3b 0a 20 20 20 20 20 20 40 20 3c 74 72 3e  e);.      @ <tr>
0cb0: 3c 74 64 20 63 6f 6c 73 70 61 6e 3d 33 3e 0a 20  <td colspan=3>. 
0cc0: 20 20 20 20 20 40 20 3c 74 61 62 6c 65 20 63 65       @ <table ce
0cd0: 6c 6c 70 61 64 64 69 6e 67 3d 32 20 62 6f 72 64  llpadding=2 bord
0ce0: 65 72 3d 30 3e 0a 20 20 20 20 20 20 40 20 3c 74  er=0>.      @ <t
0cf0: 72 3e 3c 74 64 20 62 67 63 6f 6c 6f 72 3d 22 23  r><td bgcolor="#
0d00: 61 30 62 35 66 34 22 20 63 6c 61 73 73 3d 22 62  a0b5f4" class="b
0d10: 6f 72 64 65 72 31 22 3e 0a 20 20 20 20 20 20 40  order1">.      @
0d20: 20 3c 74 61 62 6c 65 20 63 65 6c 6c 70 61 64 64   <table cellpadd
0d30: 69 6e 67 3d 32 20 63 65 6c 6c 73 70 61 63 69 6e  ing=2 cellspacin
0d40: 67 3d 30 20 62 6f 72 64 65 72 3d 30 3e 3c 74 72  g=0 border=0><tr
0d50: 3e 0a 20 20 20 20 20 20 40 20 3c 74 64 20 62 67  >.      @ <td bg
0d60: 63 6f 6c 6f 72 3d 22 23 64 30 64 39 66 34 22 20  color="#d0d9f4" 
0d70: 63 6c 61 73 73 3d 22 62 6b 67 6e 64 31 22 3e 25  class="bkgnd1">%
0d80: 73 28 7a 50 72 65 76 44 61 74 65 29 3c 2f 74 64  s(zPrevDate)</td
0d90: 3e 0a 20 20 20 20 20 20 40 20 3c 2f 74 72 3e 3c  >.      @ </tr><
0da0: 2f 74 61 62 6c 65 3e 0a 20 20 20 20 20 20 40 20  /table>.      @ 
0db0: 3c 2f 74 64 3e 3c 2f 74 72 3e 3c 2f 74 61 62 6c  </td></tr></tabl
0dc0: 65 3e 0a 20 20 20 20 20 20 40 20 3c 2f 74 64 3e  e>.      @ </td>
0dd0: 3c 2f 74 72 3e 0a 20 20 20 20 7d 0a 20 20 20 20  </tr>.    }.    
0de0: 40 20 3c 74 72 20 69 64 3d 22 6d 25 64 28 72 69  @ <tr id="m%d(ri
0df0: 64 29 22 3e 0a 20 20 20 20 40 20 3c 74 64 20 76  d)">.    @ <td v
0e00: 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 25 73 28 26  align="top">%s(&
0e10: 7a 44 61 74 65 5b 31 31 5d 29 3c 2f 74 64 3e 0a  zDate[11])</td>.
0e20: 20 20 20 20 40 20 3c 74 64 20 77 69 64 74 68 3d      @ <td width=
0e30: 22 32 30 22 3e 3c 2f 74 64 3e 0a 20 20 20 20 40  "20"></td>.    @
0e40: 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70   <td valign="top
0e50: 22 20 61 6c 69 67 6e 3d 22 6c 65 66 74 22 3e 0a  " align="left">.
0e60: 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f      hyperlink_to
0e70: 5f 75 75 69 64 5f 77 69 74 68 5f 6d 6f 75 73 65  _uuid_with_mouse
0e80: 6f 76 65 72 28 7a 55 75 69 64 2c 20 22 78 69 6e  over(zUuid, "xin
0e90: 22 2c 20 22 78 6f 75 74 22 2c 20 72 69 64 29 3b  ", "xout", rid);
0ea0: 0a 20 20 20 20 69 66 28 20 6e 50 61 72 65 6e 74  .    if( nParent
0eb0: 3e 31 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 62  >1 ){.      @ <b
0ec0: 3e 4d 65 72 67 65 3c 2f 62 3e 20 0a 20 20 20 20  >Merge</b> .    
0ed0: 7d 0a 20 20 20 20 69 66 28 20 6e 50 43 68 69 6c  }.    if( nPChil
0ee0: 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 40 20 3c  d>1 ){.      @ <
0ef0: 62 3e 46 6f 72 6b 3c 2f 62 3e 0a 20 20 20 20 7d  b>Fork</b>.    }
0f00: 0a 20 20 20 20 69 66 28 20 69 73 4c 65 61 66 20  .    if( isLeaf 
0f10: 29 7b 0a 20 20 20 20 20 20 40 20 3c 62 3e 4c 65  ){.      @ <b>Le
0f20: 61 66 3c 2f 62 3e 0a 20 20 20 20 7d 0a 20 20 20  af</b>.    }.   
0f30: 20 40 20 25 68 28 64 62 5f 63 6f 6c 75 6d 6e 5f   @ %h(db_column_
0f40: 74 65 78 74 28 70 51 75 65 72 79 2c 33 29 29 0a  text(pQuery,3)).
0f50: 20 20 20 20 40 20 28 62 79 20 25 68 28 64 62 5f      @ (by %h(db_
0f60: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65  column_text(pQue
0f70: 72 79 2c 34 29 29 29 3c 2f 74 64 3e 3c 2f 74 72  ry,4)))</td></tr
0f80: 3e 0a 20 20 20 20 69 66 28 20 7a 4c 61 73 74 44  >.    if( zLastD
0f90: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 74 72  ate ){.      str
0fa0: 63 70 79 28 7a 4c 61 73 74 44 61 74 65 2c 20 7a  cpy(zLastDate, z
0fb0: 44 61 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Date);.    }.  }
0fc0: 0a 20 20 40 20 3c 2f 74 61 62 6c 65 3e 0a 7d 0a  .  @ </table>.}.
0fd0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
0fe0: 6a 61 76 61 73 63 72 69 70 74 20 63 6f 64 65 20  javascript code 
0ff0: 74 68 61 74 20 72 65 63 6f 72 64 73 20 74 68 65  that records the
1000: 20 70 61 72 65 6e 74 73 20 61 6e 64 20 63 68 69   parents and chi
1010: 6c 64 72 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  ldren.** of the 
1020: 76 65 72 73 69 6f 6e 20 72 69 64 2e 0a 2a 2f 0a  version rid..*/.
1030: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 5f  static int save_
1040: 70 61 72 65 6e 74 61 67 65 5f 6a 61 76 61 73 63  parentage_javasc
1050: 72 69 70 74 28 69 6e 74 20 72 69 64 2c 20 42 6c  ript(int rid, Bl
1060: 6f 62 20 2a 70 4f 75 74 29 7b 0a 20 20 63 6f 6e  ob *pOut){.  con
1070: 73 74 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20  st char *zSep;. 
1080: 20 53 74 6d 74 20 71 3b 0a 0a 20 20 64 62 5f 70   Stmt q;..  db_p
1090: 72 65 70 61 72 65 28 26 71 2c 20 22 53 45 4c 45  repare(&q, "SELE
10a0: 43 54 20 70 69 64 20 46 52 4f 4d 20 70 6c 69 6e  CT pid FROM plin
10b0: 6b 20 57 48 45 52 45 20 63 69 64 3d 25 64 22 2c  k WHERE cid=%d",
10c0: 20 72 69 64 29 3b 0a 20 20 7a 53 65 70 20 3d 20   rid);.  zSep = 
10d0: 22 22 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e  "";.  blob_appen
10e0: 64 66 28 70 4f 75 74 2c 20 22 70 61 72 65 6e 74  df(pOut, "parent
10f0: 6f 66 5b 5c 22 6d 25 64 5c 22 5d 20 3d 20 5b 22  of[\"m%d\"] = ["
1100: 2c 20 72 69 64 29 3b 0a 20 20 77 68 69 6c 65 28  , rid);.  while(
1110: 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51   db_step(&q)==SQ
1120: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
1130: 69 6e 74 20 70 69 64 20 3d 20 64 62 5f 63 6f 6c  int pid = db_col
1140: 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 30 29 3b 0a  umn_int(&q, 0);.
1150: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
1160: 28 70 4f 75 74 2c 20 22 25 73 5c 22 6d 25 64 5c  (pOut, "%s\"m%d\
1170: 22 22 2c 20 7a 53 65 70 2c 20 70 69 64 29 3b 0a  "", zSep, pid);.
1180: 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 22 3b 0a      zSep = ",";.
1190: 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a    }.  db_finaliz
11a0: 65 28 26 71 29 3b 0a 20 20 62 6c 6f 62 5f 61 70  e(&q);.  blob_ap
11b0: 70 65 6e 64 66 28 70 4f 75 74 2c 20 22 5d 3b 5c  pendf(pOut, "];\
11c0: 6e 22 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72  n");.  db_prepar
11d0: 65 28 26 71 2c 20 22 53 45 4c 45 43 54 20 63 69  e(&q, "SELECT ci
11e0: 64 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45  d FROM plink WHE
11f0: 52 45 20 70 69 64 3d 25 64 22 2c 20 72 69 64 29  RE pid=%d", rid)
1200: 3b 0a 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20  ;.  zSep = "";. 
1210: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 4f   blob_appendf(pO
1220: 75 74 2c 20 22 63 68 69 6c 64 6f 66 5b 5c 22 6d  ut, "childof[\"m
1230: 25 64 5c 22 5d 20 3d 20 5b 22 2c 20 72 69 64 29  %d\"] = [", rid)
1240: 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74  ;.  while( db_st
1250: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(&q)==SQLITE_R
1260: 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 69  OW ){.    int pi
1270: 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e  d = db_column_in
1280: 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 62 6c  t(&q, 0);.    bl
1290: 6f 62 5f 61 70 70 65 6e 64 66 28 70 4f 75 74 2c  ob_appendf(pOut,
12a0: 20 22 25 73 5c 22 6d 25 64 5c 22 22 2c 20 7a 53   "%s\"m%d\"", zS
12b0: 65 70 2c 20 70 69 64 29 3b 0a 20 20 20 20 7a 53  ep, pid);.    zS
12c0: 65 70 20 3d 20 22 2c 22 3b 0a 20 20 7d 0a 20 20  ep = ",";.  }.  
12d0: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b  db_finalize(&q);
12e0: 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28  .  blob_appendf(
12f0: 70 4f 75 74 2c 20 22 5d 3b 5c 6e 22 29 3b 0a 20  pOut, "];\n");. 
1300: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1310: 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 74 69 6d  .** WEBPAGE: tim
1320: 65 6c 69 6e 65 0a 2a 2f 0a 76 6f 69 64 20 70 61  eline.*/.void pa
1330: 67 65 5f 74 69 6d 65 6c 69 6e 65 28 76 6f 69 64  ge_timeline(void
1340: 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 63  ){.  Stmt q;.  c
1350: 68 61 72 20 2a 7a 53 51 4c 3b 0a 20 20 42 6c 6f  har *zSQL;.  Blo
1360: 62 20 73 63 72 69 70 74 49 6e 69 74 3b 0a 20 20  b scriptInit;.  
1370: 63 68 61 72 20 7a 44 61 74 65 5b 31 30 30 5d 3b  char zDate[100];
1380: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1390: 53 74 61 72 74 20 3d 20 50 28 22 64 22 29 3b 0a  Start = P("d");.
13a0: 20 20 69 6e 74 20 6e 45 6e 74 72 79 20 3d 20 61    int nEntry = a
13b0: 74 6f 69 28 50 44 28 22 6e 22 2c 22 32 35 22 29  toi(PD("n","25")
13c0: 29 3b 0a 0a 20 20 2f 2a 20 54 6f 20 76 69 65 77  );..  /* To view
13d0: 20 74 68 65 20 74 69 6d 65 6c 69 6e 65 2c 20 6d   the timeline, m
13e0: 75 73 74 20 68 61 76 65 20 70 65 72 6d 69 73 73  ust have permiss
13f0: 69 6f 6e 20 74 6f 20 72 65 61 64 20 70 72 6f 6a  ion to read proj
1400: 65 63 74 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20  ect data..  */. 
1410: 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65   login_check_cre
1420: 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66  dentials();.  if
1430: 28 20 21 67 2e 6f 6b 52 65 61 64 20 29 7b 20 6c  ( !g.okRead ){ l
1440: 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72  ogin_needed(); r
1450: 65 74 75 72 6e 3b 20 7d 0a 0a 20 20 73 74 79 6c  eturn; }..  styl
1460: 65 5f 68 65 61 64 65 72 28 22 54 69 6d 65 6c 69  e_header("Timeli
1470: 6e 65 22 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f  ne");.  if( !g.o
1480: 6b 48 69 73 74 6f 72 79 20 26 26 0a 20 20 20 20  kHistory &&.    
1490: 20 20 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c    db_exists("SEL
14a0: 45 43 54 20 31 20 46 52 4f 4d 20 75 73 65 72 22  ECT 1 FROM user"
14b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14c0: 20 22 20 57 48 45 52 45 20 6c 6f 67 69 6e 3d 27   " WHERE login='
14d0: 61 6e 6f 6e 79 6d 6f 75 73 27 22 0a 20 20 20 20  anonymous'".    
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20              "   
14f0: 41 4e 44 20 63 61 70 20 4c 49 4b 45 20 27 25 25  AND cap LIKE '%%
1500: 68 25 25 27 22 29 20 29 7b 0a 20 20 20 20 40 20  h%%'") ){.    @ 
1510: 3c 70 3e 3c 62 3e 4e 6f 74 65 3a 3c 2f 62 3e 20  <p><b>Note:</b> 
1520: 59 6f 75 20 77 69 6c 6c 20 62 65 20 61 62 6c 65  You will be able
1530: 20 74 6f 20 61 63 63 65 73 73 20 3c 75 3e 6d 75   to access <u>mu
1540: 63 68 3c 2f 75 3e 20 6d 6f 72 65 0a 20 20 20 20  ch</u> more.    
1550: 40 20 68 69 73 74 6f 72 69 63 61 6c 20 69 6e 66  @ historical inf
1560: 6f 72 6d 61 74 69 6f 6e 20 69 66 20 3c 61 20 68  ormation if <a h
1570: 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55  ref="%s(g.zBaseU
1580: 52 4c 29 2f 6c 6f 67 69 6e 22 3e 6c 6f 67 69 6e  RL)/login">login
1590: 3c 2f 61 3e 2e 3c 2f 70 3e 0a 20 20 7d 0a 20 20  </a>.</p>.  }.  
15a0: 7a 53 51 4c 20 3d 20 6d 70 72 69 6e 74 66 28 0a  zSQL = mprintf(.
15b0: 20 20 20 20 22 53 45 4c 45 43 54 20 62 6c 6f 62      "SELECT blob
15c0: 2e 72 69 64 2c 20 75 75 69 64 2c 20 64 61 74 65  .rid, uuid, date
15d0: 74 69 6d 65 28 65 76 65 6e 74 2e 6d 74 69 6d 65  time(event.mtime
15e0: 2c 27 6c 6f 63 61 6c 74 69 6d 65 27 29 2c 20 63  ,'localtime'), c
15f0: 6f 6d 6d 65 6e 74 2c 20 75 73 65 72 2c 22 0a 20  omment, user,". 
1600: 20 20 20 22 20 20 20 20 20 20 20 28 53 45 4c 45     "       (SELE
1610: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1620: 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 70 69 64   plink WHERE pid
1630: 3d 62 6c 6f 62 2e 72 69 64 20 41 4e 44 20 69 73  =blob.rid AND is
1640: 70 72 69 6d 3d 31 29 2c 22 0a 20 20 20 20 22 20  prim=1),".    " 
1650: 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 63 6f        (SELECT co
1660: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 6c 69 6e  unt(*) FROM plin
1670: 6b 20 57 48 45 52 45 20 63 69 64 3d 62 6c 6f 62  k WHERE cid=blob
1680: 2e 72 69 64 29 2c 22 0a 20 20 20 20 22 20 20 20  .rid),".    "   
1690: 20 20 20 20 4e 4f 54 20 45 58 49 53 54 53 20 28      NOT EXISTS (
16a0: 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 70 6c  SELECT 1 FROM pl
16b0: 69 6e 6b 20 57 48 45 52 45 20 70 69 64 3d 62 6c  ink WHERE pid=bl
16c0: 6f 62 2e 72 69 64 29 22 0a 20 20 20 20 22 20 20  ob.rid)".    "  
16d0: 46 52 4f 4d 20 65 76 65 6e 74 2c 20 62 6c 6f 62  FROM event, blob
16e0: 22 0a 20 20 20 20 22 20 57 48 45 52 45 20 65 76  ".    " WHERE ev
16f0: 65 6e 74 2e 74 79 70 65 3d 27 63 69 27 20 41 4e  ent.type='ci' AN
1700: 44 20 62 6c 6f 62 2e 72 69 64 3d 65 76 65 6e 74  D blob.rid=event
1710: 2e 6f 62 6a 69 64 22 0a 20 20 29 3b 0a 20 20 69  .objid".  );.  i
1720: 66 28 20 7a 53 74 61 72 74 20 29 7b 0a 20 20 20  f( zStart ){.   
1730: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
1740: 7a 53 74 61 72 74 5b 30 5d 29 20 29 7b 20 7a 53  zStart[0]) ){ zS
1750: 74 61 72 74 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  tart++; }.    if
1760: 28 20 7a 53 74 61 72 74 5b 30 5d 20 29 7b 0a 20  ( zStart[0] ){. 
1770: 20 20 20 20 20 7a 53 51 4c 20 3d 20 6d 70 72 69       zSQL = mpri
1780: 6e 74 66 28 22 25 7a 20 41 4e 44 20 65 76 65 6e  ntf("%z AND even
1790: 74 2e 6d 74 69 6d 65 3c 3d 6a 75 6c 69 61 6e 64  t.mtime<=juliand
17a0: 61 79 28 25 51 2c 20 27 6c 6f 63 61 6c 74 69 6d  ay(%Q, 'localtim
17b0: 65 27 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  e')",.          
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 51 4c              zSQL
17d0: 2c 20 7a 53 74 61 72 74 29 3b 0a 20 20 20 20 7d  , zStart);.    }
17e0: 0a 20 20 7d 0a 20 20 7a 53 51 4c 20 3d 20 6d 70  .  }.  zSQL = mp
17f0: 72 69 6e 74 66 28 22 25 7a 20 4f 52 44 45 52 20  rintf("%z ORDER 
1800: 42 59 20 65 76 65 6e 74 2e 6d 74 69 6d 65 20 44  BY event.mtime D
1810: 45 53 43 20 4c 49 4d 49 54 20 25 64 22 2c 20 7a  ESC LIMIT %d", z
1820: 53 51 4c 2c 20 6e 45 6e 74 72 79 29 3b 0a 20 20  SQL, nEntry);.  
1830: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 7a  db_prepare(&q, z
1840: 53 51 4c 29 3b 0a 20 20 66 72 65 65 28 7a 53 51  SQL);.  free(zSQ
1850: 4c 29 3b 0a 20 20 7a 44 61 74 65 5b 30 5d 20 3d  L);.  zDate[0] =
1860: 20 30 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28   0;.  blob_zero(
1870: 26 73 63 72 69 70 74 49 6e 69 74 29 3b 0a 20 20  &scriptInit);.  
1880: 77 77 77 5f 70 72 69 6e 74 5f 74 69 6d 65 6c 69  www_print_timeli
1890: 6e 65 28 26 71 2c 20 7a 44 61 74 65 2c 20 73 61  ne(&q, zDate, sa
18a0: 76 65 5f 70 61 72 65 6e 74 61 67 65 5f 6a 61 76  ve_parentage_jav
18b0: 61 73 63 72 69 70 74 2c 20 26 73 63 72 69 70 74  ascript, &script
18c0: 49 6e 69 74 29 3b 0a 20 20 64 62 5f 66 69 6e 61  Init);.  db_fina
18d0: 6c 69 7a 65 28 26 71 29 3b 0a 20 20 69 66 28 20  lize(&q);.  if( 
18e0: 7a 53 74 61 72 74 3d 3d 30 20 29 7b 0a 20 20 20  zStart==0 ){.   
18f0: 20 7a 53 74 61 72 74 20 3d 20 7a 44 61 74 65 3b   zStart = zDate;
1900: 0a 20 20 7d 0a 20 20 40 20 3c 73 63 72 69 70 74  .  }.  @ <script
1910: 3e 0a 20 20 40 20 76 61 72 20 70 61 72 65 6e 74  >.  @ var parent
1920: 6f 66 20 3d 20 6e 65 77 20 4f 62 6a 65 63 74 28  of = new Object(
1930: 29 3b 0a 20 20 40 20 76 61 72 20 63 68 69 6c 64  );.  @ var child
1940: 6f 66 20 3d 20 6e 65 77 20 4f 62 6a 65 63 74 28  of = new Object(
1950: 29 3b 0a 20 20 63 67 69 5f 61 70 70 65 6e 64 5f  );.  cgi_append_
1960: 63 6f 6e 74 65 6e 74 28 62 6c 6f 62 5f 62 75 66  content(blob_buf
1970: 66 65 72 28 26 73 63 72 69 70 74 49 6e 69 74 29  fer(&scriptInit)
1980: 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 73 63 72  , blob_size(&scr
1990: 69 70 74 49 6e 69 74 29 29 3b 0a 20 20 62 6c 6f  iptInit));.  blo
19a0: 62 5f 72 65 73 65 74 28 26 73 63 72 69 70 74 49  b_reset(&scriptI
19b0: 6e 69 74 29 3b 0a 20 20 40 20 66 75 6e 63 74 69  nit);.  @ functi
19c0: 6f 6e 20 73 65 74 61 6c 6c 28 76 61 6c 75 65 29  on setall(value)
19d0: 7b 0a 20 20 40 20 20 20 66 6f 72 28 76 61 72 20  {.  @   for(var 
19e0: 78 20 69 6e 20 70 61 72 65 6e 74 6f 66 29 7b 0a  x in parentof){.
19f0: 20 20 40 20 20 20 20 20 73 65 74 6f 6e 65 28 78    @     setone(x
1a00: 2c 76 61 6c 75 65 29 3b 0a 20 20 40 20 20 20 7d  ,value);.  @   }
1a10: 0a 20 20 40 20 7d 0a 20 20 40 20 66 75 6e 63 74  .  @ }.  @ funct
1a20: 69 6f 6e 20 73 65 74 6f 6e 65 28 69 64 2c 20 63  ion setone(id, c
1a30: 6c 72 29 7b 0a 20 20 40 20 20 20 69 66 28 20 70  lr){.  @   if( p
1a40: 61 72 65 6e 74 6f 66 5b 69 64 5d 3d 3d 6e 75 6c  arentof[id]==nul
1a50: 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  l ) return 0;.  
1a60: 40 20 20 20 76 61 72 20 77 20 3d 20 64 6f 63 75  @   var w = docu
1a70: 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42  ment.getElementB
1a80: 79 49 64 28 69 64 29 3b 0a 20 20 40 20 20 20 69  yId(id);.  @   i
1a90: 66 28 20 77 2e 73 74 79 6c 65 2e 63 6f 6c 6f 72  f( w.style.color
1aa0: 3d 3d 63 6c 72 20 29 7b 0a 20 20 40 20 20 20 20  ==clr ){.  @    
1ab0: 20 72 65 74 75 72 6e 20 30 0a 20 20 40 20 20 20   return 0.  @   
1ac0: 7d 65 6c 73 65 7b 0a 20 20 40 20 20 20 20 20 77  }else{.  @     w
1ad0: 2e 73 74 79 6c 65 2e 63 6f 6c 6f 72 20 3d 20 63  .style.color = c
1ae0: 6c 72 0a 20 20 40 20 20 20 20 20 72 65 74 75 72  lr.  @     retur
1af0: 6e 20 31 0a 20 20 40 20 20 20 7d 0a 20 20 40 20  n 1.  @   }.  @ 
1b00: 7d 0a 20 20 40 20 66 75 6e 63 74 69 6f 6e 20 78  }.  @ function x
1b10: 69 6e 28 69 64 29 20 7b 0a 20 20 40 20 20 20 73  in(id) {.  @   s
1b20: 65 74 61 6c 6c 28 22 23 66 66 66 66 66 66 22 29  etall("#ffffff")
1b30: 3b 0a 20 20 40 20 20 20 73 65 74 6f 6e 65 28 69  ;.  @   setone(i
1b40: 64 2c 22 23 30 30 30 30 30 30 22 29 3b 0a 20 20  d,"#000000");.  
1b50: 40 20 20 20 73 65 74 5f 63 68 69 6c 64 72 65 6e  @   set_children
1b60: 28 69 64 2c 20 22 23 30 30 32 30 30 30 22 29 3b  (id, "#002000");
1b70: 0a 20 20 40 20 20 20 73 65 74 5f 70 61 72 65 6e  .  @   set_paren
1b80: 74 73 28 69 64 2c 20 22 23 32 30 30 30 30 30 22  ts(id, "#200000"
1b90: 29 3b 0a 20 20 40 20 20 20 66 6f 72 28 76 61 72  );.  @   for(var
1ba0: 20 78 20 69 6e 20 70 61 72 65 6e 74 6f 66 5b 69   x in parentof[i
1bb0: 64 5d 29 7b 0a 20 20 40 20 20 20 20 20 76 61 72  d]){.  @     var
1bc0: 20 70 69 64 20 3d 20 70 61 72 65 6e 74 6f 66 5b   pid = parentof[
1bd0: 69 64 5d 5b 78 5d 0a 20 20 40 20 20 20 20 20 76  id][x].  @     v
1be0: 61 72 20 77 20 3d 20 64 6f 63 75 6d 65 6e 74 2e  ar w = document.
1bf0: 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 70  getElementById(p
1c00: 69 64 29 3b 0a 20 20 40 20 20 20 20 20 69 66 28  id);.  @     if(
1c10: 20 77 21 3d 6e 75 6c 6c 20 29 7b 0a 20 20 40 20   w!=null ){.  @ 
1c20: 20 20 20 20 20 20 77 2e 73 74 79 6c 65 2e 63 6f        w.style.co
1c30: 6c 6f 72 20 3d 20 22 23 66 66 30 30 30 30 22 3b  lor = "#ff0000";
1c40: 0a 20 20 40 20 20 20 20 20 7d 0a 20 20 40 20 20  .  @     }.  @  
1c50: 20 7d 0a 20 20 40 20 20 20 66 6f 72 28 76 61 72   }.  @   for(var
1c60: 20 78 20 69 6e 20 63 68 69 6c 64 6f 66 5b 69 64   x in childof[id
1c70: 5d 29 7b 0a 20 20 40 20 20 20 20 20 76 61 72 20  ]){.  @     var 
1c80: 63 69 64 20 3d 20 63 68 69 6c 64 6f 66 5b 69 64  cid = childof[id
1c90: 5d 5b 78 5d 0a 20 20 40 20 20 20 20 20 76 61 72  ][x].  @     var
1ca0: 20 77 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65   w = document.ge
1cb0: 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 63 69 64  tElementById(cid
1cc0: 29 3b 0a 20 20 40 20 20 20 20 20 69 66 28 20 77  );.  @     if( w
1cd0: 21 3d 6e 75 6c 6c 20 29 7b 0a 20 20 40 20 20 20  !=null ){.  @   
1ce0: 20 20 20 20 77 2e 73 74 79 6c 65 2e 63 6f 6c 6f      w.style.colo
1cf0: 72 20 3d 20 22 23 30 30 38 30 30 30 22 3b 0a 20  r = "#008000";. 
1d00: 20 40 20 20 20 20 20 7d 0a 20 20 40 20 20 20 7d   @     }.  @   }
1d10: 0a 20 20 40 20 7d 0a 20 20 40 20 66 75 6e 63 74  .  @ }.  @ funct
1d20: 69 6f 6e 20 78 6f 75 74 28 69 64 29 20 7b 0a 20  ion xout(id) {. 
1d30: 20 40 20 20 20 73 65 74 61 6c 6c 28 22 23 30 30   @   setall("#00
1d40: 30 30 30 30 22 29 3b 0a 20 20 40 20 7d 0a 20 20  0000");.  @ }.  
1d50: 40 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 5f 70  @ function set_p
1d60: 61 72 65 6e 74 73 28 69 64 2c 20 63 6c 72 29 7b  arents(id, clr){
1d70: 0a 20 20 40 20 20 20 76 61 72 20 70 6c 69 73 74  .  @   var plist
1d80: 20 3d 20 70 61 72 65 6e 74 6f 66 5b 69 64 5d 3b   = parentof[id];
1d90: 0a 20 20 40 20 20 20 69 66 28 20 70 6c 69 73 74  .  @   if( plist
1da0: 3d 3d 6e 75 6c 6c 20 29 20 72 65 74 75 72 6e 3b  ==null ) return;
1db0: 0a 20 20 40 20 20 20 66 6f 72 28 76 61 72 20 78  .  @   for(var x
1dc0: 20 69 6e 20 70 6c 69 73 74 29 7b 0a 20 20 40 20   in plist){.  @ 
1dd0: 20 20 20 20 76 61 72 20 70 69 64 20 3d 20 70 6c      var pid = pl
1de0: 69 73 74 5b 78 5d 3b 0a 20 20 40 20 20 20 20 20  ist[x];.  @     
1df0: 69 66 28 20 73 65 74 6f 6e 65 28 70 69 64 2c 63  if( setone(pid,c
1e00: 6c 72 29 3d 3d 31 20 29 7b 0a 20 20 40 20 20 20  lr)==1 ){.  @   
1e10: 20 20 20 20 73 65 74 5f 70 61 72 65 6e 74 73 28      set_parents(
1e20: 70 69 64 2c 63 6c 72 29 3b 0a 20 20 40 20 20 20  pid,clr);.  @   
1e30: 20 20 7d 0a 20 20 40 20 20 20 7d 0a 20 20 40 20    }.  @   }.  @ 
1e40: 7d 0a 20 20 40 20 66 75 6e 63 74 69 6f 6e 20 73  }.  @ function s
1e50: 65 74 5f 63 68 69 6c 64 72 65 6e 28 69 64 2c 63  et_children(id,c
1e60: 6c 72 29 7b 0a 20 20 40 20 20 20 76 61 72 20 63  lr){.  @   var c
1e70: 6c 69 73 74 20 3d 20 63 68 69 6c 64 6f 66 5b 69  list = childof[i
1e80: 64 5d 3b 0a 20 20 40 20 20 20 69 66 28 20 63 6c  d];.  @   if( cl
1e90: 69 73 74 3d 3d 6e 75 6c 6c 20 29 20 72 65 74 75  ist==null ) retu
1ea0: 72 6e 3b 0a 20 20 40 20 20 20 66 6f 72 28 76 61  rn;.  @   for(va
1eb0: 72 20 78 20 69 6e 20 63 6c 69 73 74 29 7b 0a 20  r x in clist){. 
1ec0: 20 40 20 20 20 20 20 76 61 72 20 63 69 64 20 3d   @     var cid =
1ed0: 20 63 6c 69 73 74 5b 78 5d 3b 0a 20 20 40 20 20   clist[x];.  @  
1ee0: 20 20 20 69 66 28 20 73 65 74 6f 6e 65 28 63 69     if( setone(ci
1ef0: 64 2c 63 6c 72 29 3d 3d 31 20 29 7b 0a 20 20 40  d,clr)==1 ){.  @
1f00: 20 20 20 20 20 20 20 73 65 74 5f 63 68 69 6c 64         set_child
1f10: 72 65 6e 28 63 69 64 2c 63 6c 72 29 3b 0a 20 20  ren(cid,clr);.  
1f20: 40 20 20 20 20 20 7d 0a 20 20 40 20 20 20 7d 0a  @     }.  @   }.
1f30: 20 20 40 20 7d 0a 20 20 40 20 3c 2f 73 63 72 69    @ }.  @ </scri
1f40: 70 74 3e 0a 20 20 40 20 3c 68 72 3e 0a 20 20 40  pt>.  @ <hr>.  @
1f50: 20 3c 66 6f 72 6d 20 6d 65 74 68 6f 64 3d 22 47   <form method="G
1f60: 45 54 22 20 61 63 74 69 6f 6e 3d 22 25 73 28 67  ET" action="%s(g
1f70: 2e 7a 42 61 73 65 55 52 4c 29 2f 74 69 6d 65 6c  .zBaseURL)/timel
1f80: 69 6e 65 22 3e 0a 20 20 40 20 53 74 61 72 74 20  ine">.  @ Start 
1f90: 44 61 74 65 3a 0a 20 20 40 20 3c 69 6e 70 75 74  Date:.  @ <input
1fa0: 20 74 79 70 65 3d 22 74 65 78 74 22 20 73 69 7a   type="text" siz
1fb0: 65 3d 22 33 30 22 20 76 61 6c 75 65 3d 22 25 68  e="30" value="%h
1fc0: 28 7a 53 74 61 72 74 29 22 20 6e 61 6d 65 3d 22  (zStart)" name="
1fd0: 64 22 3e 0a 20 20 40 20 4e 75 6d 62 65 72 20 4f  d">.  @ Number O
1fe0: 66 20 45 6e 74 72 69 65 73 3a 20 20 0a 20 20 40  f Entries:  .  @
1ff0: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 74 65   <input type="te
2000: 78 74 22 20 73 69 7a 65 3d 22 34 22 20 76 61 6c  xt" size="4" val
2010: 75 65 3d 22 25 64 28 6e 45 6e 74 72 79 29 22 20  ue="%d(nEntry)" 
2020: 6e 61 6d 65 3d 22 6e 22 3e 0a 20 20 40 20 3c 62  name="n">.  @ <b
2030: 72 3e 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73  r><input type="s
2040: 75 62 6d 69 74 22 20 76 61 6c 75 65 3d 22 53 75  ubmit" value="Su
2050: 62 6d 69 74 22 3e 0a 20 20 40 20 3c 2f 66 6f 72  bmit">.  @ </for
2060: 6d 3e 0a 20 20 40 20 3c 66 6f 72 6d 20 6d 65 74  m>.  @ <form met
2070: 68 6f 64 3d 22 47 45 54 22 20 61 63 74 69 6f 6e  hod="GET" action
2080: 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29  ="%s(g.zBaseURL)
2090: 2f 74 69 6d 65 6c 69 6e 65 22 3e 0a 20 20 40 20  /timeline">.  @ 
20a0: 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 68 69 64  <input type="hid
20b0: 64 65 6e 22 20 76 61 6c 75 65 3d 22 25 68 28 7a  den" value="%h(z
20c0: 44 61 74 65 29 22 20 6e 61 6d 65 3d 22 64 22 3e  Date)" name="d">
20d0: 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65  .  @ <input type
20e0: 3d 22 68 69 64 64 65 6e 22 20 76 61 6c 75 65 3d  ="hidden" value=
20f0: 22 25 64 28 6e 45 6e 74 72 79 29 22 20 6e 61 6d  "%d(nEntry)" nam
2100: 65 3d 22 6e 22 3e 0a 20 20 40 20 3c 69 6e 70 75  e="n">.  @ <inpu
2110: 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20  t type="submit" 
2120: 76 61 6c 75 65 3d 22 4e 65 78 74 20 25 64 28 6e  value="Next %d(n
2130: 45 6e 74 72 79 29 20 52 6f 77 73 22 3e 0a 20 20  Entry) Rows">.  
2140: 40 20 3c 2f 66 6f 72 6d 3e 0a 20 20 73 74 79 6c  @ </form>.  styl
2150: 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f  e_footer();.}../
2160: 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 71  *.** The input q
2170: 75 65 72 79 20 71 20 73 65 6c 65 63 74 73 20 76  uery q selects v
2180: 61 72 69 6f 75 73 20 72 65 63 6f 72 64 73 2e 20  arious records. 
2190: 20 50 72 69 6e 74 20 61 20 68 75 6d 61 6e 2d 72   Print a human-r
21a0: 65 61 64 61 62 6c 65 0a 2a 2a 20 73 75 6d 6d 61  eadable.** summa
21b0: 72 79 20 6f 66 20 74 68 6f 73 65 20 72 65 63 6f  ry of those reco
21c0: 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 4c 69 6d 69 74  rds..**.** Limit
21d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
21e0: 6e 74 72 69 65 73 20 70 72 69 6e 74 65 64 20 74  ntries printed t
21f0: 6f 20 6e 4c 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64  o nLine..*/.void
2200: 20 70 72 69 6e 74 5f 74 69 6d 65 6c 69 6e 65 28   print_timeline(
2210: 53 74 6d 74 20 2a 71 2c 20 69 6e 74 20 6d 78 4c  Stmt *q, int mxL
2220: 69 6e 65 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e  ine){.  int nLin
2230: 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 50  e = 0;.  char zP
2240: 72 65 76 44 61 74 65 5b 32 30 5d 3b 0a 20 20 7a  revDate[20];.  z
2250: 50 72 65 76 44 61 74 65 5b 30 5d 20 3d 20 30 3b  PrevDate[0] = 0;
2260: 0a 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74  ..  while( db_st
2270: 65 70 28 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  ep(q)==SQLITE_RO
2280: 57 20 26 26 20 6e 4c 69 6e 65 3c 3d 6d 78 4c 69  W && nLine<=mxLi
2290: 6e 65 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ne ){.    const 
22a0: 63 68 61 72 20 2a 7a 49 64 20 3d 20 64 62 5f 63  char *zId = db_c
22b0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 71 2c 20 31 29  olumn_text(q, 1)
22c0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
22d0: 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63 6f 6c   *zDate = db_col
22e0: 75 6d 6e 5f 74 65 78 74 28 71 2c 20 32 29 3b 0a  umn_text(q, 2);.
22f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2300: 7a 43 6f 6d 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  zCom = db_column
2310: 5f 74 65 78 74 28 71 2c 20 33 29 3b 0a 20 20 20  _text(q, 3);.   
2320: 20 69 6e 74 20 6e 43 68 69 6c 64 20 3d 20 64 62   int nChild = db
2330: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 71 2c 20 34  _column_int(q, 4
2340: 29 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 65  );.    int nPare
2350: 6e 74 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69  nt = db_column_i
2360: 6e 74 28 71 2c 20 35 29 3b 0a 20 20 20 20 63 68  nt(q, 5);.    ch
2370: 61 72 20 2a 7a 46 72 65 65 20 3d 20 30 3b 0a 20  ar *zFree = 0;. 
2380: 20 20 20 63 68 61 72 20 7a 55 75 69 64 5b 55 55     char zUuid[UU
2390: 49 44 5f 53 49 5a 45 2b 31 5d 3b 0a 0a 20 20 20  ID_SIZE+1];..   
23a0: 20 73 70 72 69 6e 74 66 28 7a 55 75 69 64 2c 20   sprintf(zUuid, 
23b0: 22 25 2e 31 30 73 22 2c 20 7a 49 64 29 3b 0a 20  "%.10s", zId);. 
23c0: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 7a 44     if( memcmp(zD
23d0: 61 74 65 2c 20 7a 50 72 65 76 44 61 74 65 2c 20  ate, zPrevDate, 
23e0: 31 30 29 20 29 7b 0a 20 20 20 20 20 20 70 72 69  10) ){.      pri
23f0: 6e 74 66 28 22 3d 3d 3d 20 25 2e 31 30 73 20 3d  ntf("=== %.10s =
2400: 3d 3d 5c 6e 22 2c 20 7a 44 61 74 65 29 3b 0a 20  ==\n", zDate);. 
2410: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 50 72 65       memcpy(zPre
2420: 76 44 61 74 65 2c 20 7a 44 61 74 65 2c 20 31 30  vDate, zDate, 10
2430: 29 3b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 2b 2b  );.      nLine++
2440: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2450: 7a 43 6f 6d 3d 3d 30 20 29 20 7a 43 6f 6d 20 3d  zCom==0 ) zCom =
2460: 20 22 22 3b 0a 20 20 20 20 70 72 69 6e 74 66 28   "";.    printf(
2470: 22 25 2e 35 73 20 5b 25 2e 31 30 73 5d 20 22 2c  "%.5s [%.10s] ",
2480: 20 26 7a 44 61 74 65 5b 31 31 5d 2c 20 7a 55 75   &zDate[11], zUu
2490: 69 64 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 68  id);.    if( nCh
24a0: 69 6c 64 3e 31 20 7c 7c 20 6e 50 61 72 65 6e 74  ild>1 || nParent
24b0: 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
24c0: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61  n = 0;.      cha
24d0: 72 20 7a 50 72 65 66 69 78 5b 35 30 5d 3b 0a 20  r zPrefix[50];. 
24e0: 20 20 20 20 20 69 66 28 20 6e 50 61 72 65 6e 74       if( nParent
24f0: 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >1 ){.        sq
2500: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2510: 69 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2c 20  izeof(zPrefix), 
2520: 7a 50 72 65 66 69 78 2c 20 22 2a 4d 45 52 47 45  zPrefix, "*MERGE
2530: 2a 20 22 29 3b 0a 20 20 20 20 20 20 20 20 6e 20  * ");.        n 
2540: 3d 20 73 74 72 6c 65 6e 28 7a 50 72 65 66 69 78  = strlen(zPrefix
2550: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2560: 20 69 66 28 20 6e 43 68 69 6c 64 3e 31 20 29 7b   if( nChild>1 ){
2570: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2580: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2590: 28 7a 50 72 65 66 69 78 29 2d 6e 2c 20 26 7a 50  (zPrefix)-n, &zP
25a0: 72 65 66 69 78 5b 6e 5d 2c 20 22 2a 46 4f 52 4b  refix[n], "*FORK
25b0: 2a 20 22 29 3b 0a 20 20 20 20 20 20 20 20 6e 20  * ");.        n 
25c0: 3d 20 73 74 72 6c 65 6e 28 7a 50 72 65 66 69 78  = strlen(zPrefix
25d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
25e0: 20 7a 43 6f 6d 20 3d 20 7a 46 72 65 65 20 3d 20   zCom = zFree = 
25f0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2600: 22 25 73 25 73 22 2c 20 7a 50 72 65 66 69 78 2c  "%s%s", zPrefix,
2610: 20 7a 43 6f 6d 29 3b 0a 20 20 20 20 7d 0a 20 20   zCom);.    }.  
2620: 20 20 6e 4c 69 6e 65 20 2b 3d 20 63 6f 6d 6d 65    nLine += comme
2630: 6e 74 5f 70 72 69 6e 74 28 7a 43 6f 6d 2c 20 31  nt_print(zCom, 1
2640: 39 2c 20 37 39 29 3b 0a 20 20 20 20 73 71 6c 69  9, 79);.    sqli
2650: 74 65 33 5f 66 72 65 65 28 7a 46 72 65 65 29 3b  te3_free(zFree);
2660: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  .  }.}.../*.** C
2670: 4f 4d 4d 41 4e 44 3a 20 74 69 6d 65 6c 69 6e 65  OMMAND: timeline
2680: 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66  .**.** Usage: %f
2690: 6f 73 73 69 6c 20 74 69 6d 65 6c 69 6e 65 20 3f  ossil timeline ?
26a0: 44 41 54 45 54 49 4d 45 3f 20 3f 2d 6e 7c 2d 2d  DATETIME? ?-n|--
26b0: 63 6f 75 6e 74 20 4e 3f 0a 2a 2a 0a 2a 2a 20 50  count N?.**.** P
26c0: 72 69 6e 74 20 61 20 73 75 6d 6d 61 72 79 20 6f  rint a summary o
26d0: 66 20 61 63 74 69 76 69 74 79 20 67 6f 69 6e 67  f activity going
26e0: 20 62 61 63 6b 77 61 72 64 73 20 69 6e 20 64 61   backwards in da
26f0: 74 65 20 61 6e 64 20 74 69 6d 65 0a 2a 2a 20 73  te and time.** s
2700: 70 65 63 69 66 69 65 64 20 6f 72 20 66 72 6f 6d  pecified or from
2710: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
2720: 65 20 61 6e 64 20 74 69 6d 65 20 69 66 20 6e 6f  e and time if no
2730: 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2a 20 61 72   arguments.** ar
2740: 65 20 67 69 76 65 6e 2e 20 20 53 68 6f 77 20 61  e given.  Show a
2750: 73 20 6d 61 6e 79 20 61 73 20 4e 20 28 64 65 66  s many as N (def
2760: 61 75 6c 74 20 32 30 29 20 63 68 65 63 6b 2d 69  ault 20) check-i
2770: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  ns..**.** The da
2780: 74 65 20 61 6e 64 20 74 69 6d 65 20 73 68 6f 75  te and time shou
2790: 6c 64 20 62 65 20 69 6e 20 74 68 65 20 49 53 4f  ld be in the ISO
27a0: 38 36 30 31 20 66 6f 72 6d 61 74 2e 20 20 46 6f  8601 format.  Fo
27b0: 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 73 3a 20 22  r.** examples: "
27c0: 32 30 30 37 2d 30 38 2d 31 38 20 30 37 3a 32 31  2007-08-18 07:21
27d0: 3a 32 31 22 2e 20 20 54 68 65 20 74 69 6d 65 20  :21".  The time 
27e0: 6d 61 79 20 62 65 20 6f 6d 69 74 74 65 64 2e 0a  may be omitted..
27f0: 2a 2a 20 54 69 6d 65 73 20 61 72 65 20 61 63 63  ** Times are acc
2800: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f  ording to the lo
2810: 63 61 6c 20 74 69 6d 65 7a 6f 6e 65 2e 0a 2a 2f  cal timezone..*/
2820: 0a 76 6f 69 64 20 74 69 6d 65 6c 69 6e 65 5f 63  .void timeline_c
2830: 6d 64 28 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74  md(void){.  Stmt
2840: 20 71 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63   q;.  int n;.  c
2850: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 75 6e  onst char *zCoun
2860: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 65  t;.  char *zDate
2870: 3b 0a 20 20 64 62 5f 66 69 6e 64 5f 61 6e 64 5f  ;.  db_find_and_
2880: 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28  open_repository(
2890: 29 3b 0a 20 20 7a 43 6f 75 6e 74 20 3d 20 66 69  );.  zCount = fi
28a0: 6e 64 5f 6f 70 74 69 6f 6e 28 22 6e 22 2c 22 63  nd_option("n","c
28b0: 6f 75 6e 74 22 2c 31 29 3b 0a 20 20 69 66 28 20  ount",1);.  if( 
28c0: 7a 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 6e 20  zCount ){.    n 
28d0: 3d 20 61 74 6f 69 28 7a 43 6f 75 6e 74 29 3b 0a  = atoi(zCount);.
28e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 20 3d    }else{.    n =
28f0: 20 32 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67   20;.  }.  if( g
2900: 2e 61 72 67 63 21 3d 32 20 26 26 20 67 2e 61 72  .argc!=2 && g.ar
2910: 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 75 73 61  gc!=3 ){.    usa
2920: 67 65 28 22 59 59 59 59 2d 4d 4d 2d 44 44 74 48  ge("YYYY-MM-DDtH
2930: 48 3a 4d 4d 3a 53 53 22 29 3b 0a 20 20 7d 0a 20  H:MM:SS");.  }. 
2940: 20 69 66 28 20 67 2e 61 72 67 63 3d 3d 33 20 29   if( g.argc==3 )
2950: 7b 0a 20 20 20 20 7a 44 61 74 65 20 3d 20 67 2e  {.    zDate = g.
2960: 61 72 67 76 5b 32 5d 3b 0a 20 20 7d 65 6c 73 65  argv[2];.  }else
2970: 7b 0a 20 20 20 20 7a 44 61 74 65 20 3d 20 22 6e  {.    zDate = "n
2980: 6f 77 22 3b 0a 20 20 7d 0a 20 20 64 62 5f 70 72  ow";.  }.  db_pr
2990: 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20 22 53  epare(&q,.    "S
29a0: 45 4c 45 43 54 20 62 6c 6f 62 2e 72 69 64 2c 20  ELECT blob.rid, 
29b0: 75 75 69 64 2c 20 64 61 74 65 74 69 6d 65 28 65  uuid, datetime(e
29c0: 76 65 6e 74 2e 6d 74 69 6d 65 2c 27 6c 6f 63 61  vent.mtime,'loca
29d0: 6c 74 69 6d 65 27 29 2c 22 0a 20 20 20 20 22 20  ltime'),".    " 
29e0: 20 20 20 20 20 20 63 6f 6d 6d 65 6e 74 20 7c 7c        comment ||
29f0: 20 27 20 28 62 79 20 27 20 7c 7c 20 75 73 65 72   ' (by ' || user
2a00: 20 7c 7c 20 27 29 27 2c 22 0a 20 20 20 20 22 20   || ')',".    " 
2a10: 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 63 6f        (SELECT co
2a20: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 6c 69 6e  unt(*) FROM plin
2a30: 6b 20 57 48 45 52 45 20 70 69 64 3d 62 6c 6f 62  k WHERE pid=blob
2a40: 2e 72 69 64 20 41 4e 44 20 69 73 70 72 69 6d 29  .rid AND isprim)
2a50: 2c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 28  ,".    "       (
2a60: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
2a70: 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45  FROM plink WHERE
2a80: 20 63 69 64 3d 62 6c 6f 62 2e 72 69 64 29 22 0a   cid=blob.rid)".
2a90: 20 20 20 20 22 20 20 46 52 4f 4d 20 65 76 65 6e      "  FROM even
2aa0: 74 2c 20 62 6c 6f 62 22 0a 20 20 20 20 22 20 57  t, blob".    " W
2ab0: 48 45 52 45 20 65 76 65 6e 74 2e 74 79 70 65 3d  HERE event.type=
2ac0: 27 63 69 27 20 41 4e 44 20 62 6c 6f 62 2e 72 69  'ci' AND blob.ri
2ad0: 64 3d 65 76 65 6e 74 2e 6f 62 6a 69 64 22 0a 20  d=event.objid". 
2ae0: 20 20 20 22 20 20 20 41 4e 44 20 65 76 65 6e 74     "   AND event
2af0: 2e 6d 74 69 6d 65 3c 3d 28 53 45 4c 45 43 54 20  .mtime<=(SELECT 
2b00: 6a 75 6c 69 61 6e 64 61 79 28 25 51 2c 27 75 74  julianday(%Q,'ut
2b10: 63 27 29 29 22 0a 20 20 20 20 22 20 4f 52 44 45  c'))".    " ORDE
2b20: 52 20 42 59 20 65 76 65 6e 74 2e 6d 74 69 6d 65  R BY event.mtime
2b30: 20 44 45 53 43 22 2c 20 7a 44 61 74 65 0a 20 20   DESC", zDate.  
2b40: 29 3b 0a 20 20 70 72 69 6e 74 5f 74 69 6d 65 6c  );.  print_timel
2b50: 69 6e 65 28 26 71 2c 20 6e 29 3b 0a 20 20 64 62  ine(&q, n);.  db
2b60: 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 7d  _finalize(&q);.}
2b70: 0a                                               .