Hex Artifact Content
Not logged in

Artifact 06d966f168563b544921ea9fd9ce140c85d8d83b:

File src/timeline.c part of check-in [e6aa161204] - Work on a new timeline implementation. Currently implemented as "ntimeline" since it is not yet ready to replace the existing timeline. by drh on 2008-02-26 16:48:21.

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 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63   <string.h>.#inc
03c0: 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e 68 22 0a  lude "config.h".
03d0: 23 69 6e 63 6c 75 64 65 20 22 74 69 6d 65 6c 69  #include "timeli
03e0: 6e 65 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ne.h"../*.** Gen
03f0: 65 72 61 74 65 20 61 20 68 79 70 65 72 6c 69 6e  erate a hyperlin
0400: 6b 20 74 6f 20 61 20 76 65 72 73 69 6f 6e 2e 0a  k to a version..
0410: 2a 2f 0a 76 6f 69 64 20 68 79 70 65 72 6c 69 6e  */.void hyperlin
0420: 6b 5f 74 6f 5f 75 75 69 64 28 63 6f 6e 73 74 20  k_to_uuid(const 
0430: 63 68 61 72 20 2a 7a 55 75 69 64 29 7b 0a 20 20  char *zUuid){.  
0440: 63 68 61 72 20 7a 53 68 6f 72 74 55 75 69 64 5b  char zShortUuid[
0450: 55 55 49 44 5f 53 49 5a 45 2b 31 5d 3b 0a 20 20  UUID_SIZE+1];.  
0460: 73 70 72 69 6e 74 66 28 7a 53 68 6f 72 74 55 75  sprintf(zShortUu
0470: 69 64 2c 20 22 25 2e 31 30 73 22 2c 20 7a 55 75  id, "%.10s", zUu
0480: 69 64 29 3b 0a 20 20 69 66 28 20 67 2e 6f 6b 48  id);.  if( g.okH
0490: 69 73 74 6f 72 79 20 29 7b 0a 20 20 20 20 40 20  istory ){.    @ 
04a0: 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42  <a href="%s(g.zB
04b0: 61 73 65 55 52 4c 29 2f 69 6e 66 6f 2f 25 73 28  aseURL)/info/%s(
04c0: 7a 55 75 69 64 29 22 3e 5b 25 73 28 7a 53 68 6f  zUuid)">[%s(zSho
04d0: 72 74 55 75 69 64 29 5d 3c 2f 61 3e 0a 20 20 7d  rtUuid)]</a>.  }
04e0: 65 6c 73 65 7b 0a 20 20 20 20 40 20 3c 62 3e 5b  else{.    @ <b>[
04f0: 25 73 28 7a 53 68 6f 72 74 55 75 69 64 29 5d 3c  %s(zShortUuid)]<
0500: 2f 62 3e 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  /b>.  }.}../*.**
0510: 20 47 65 6e 65 72 61 74 65 20 61 20 68 79 70 65   Generate a hype
0520: 72 6c 69 6e 6b 20 74 68 61 74 20 69 6e 76 6f 6b  rlink that invok
0530: 65 73 20 6a 61 76 61 73 63 72 69 70 74 20 74 6f  es javascript to
0540: 20 68 69 67 68 6c 69 67 68 74 0a 2a 2a 20 61 20   highlight.** a 
0550: 76 65 72 73 69 6f 6e 20 6f 6e 20 6d 6f 75 73 65  version on mouse
0560: 6f 76 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 68 79  over..*/.void hy
0570: 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 75 69 64 5f  perlink_to_uuid_
0580: 77 69 74 68 5f 6d 6f 75 73 65 6f 76 65 72 28 0a  with_mouseover(.
0590: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
05a0: 75 69 64 2c 20 20 20 2f 2a 20 54 68 65 20 55 55  uid,   /* The UU
05b0: 49 44 20 74 6f 20 64 69 73 70 6c 61 79 20 2a 2f  ID to display */
05c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
05d0: 49 6e 2c 20 20 20 20 20 2f 2a 20 4a 61 76 61 73  In,     /* Javas
05e0: 63 72 69 70 74 20 70 72 6f 63 20 66 6f 72 20 6d  cript proc for m
05f0: 6f 75 73 65 6f 76 65 72 20 2a 2f 0a 20 20 63 6f  ouseover */.  co
0600: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20  nst char *zOut, 
0610: 20 20 20 2f 2a 20 4a 61 76 61 73 63 72 69 70 74     /* Javascript
0620: 20 70 72 6f 63 20 66 6f 72 20 6d 6f 75 73 65 6f   proc for mouseo
0630: 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 64 20 20  ut */.  int id  
0640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0650: 41 72 67 75 6d 65 6e 74 20 74 6f 20 6a 61 76 61  Argument to java
0660: 73 63 72 69 70 74 20 70 72 6f 63 73 20 2a 2f 0a  script procs */.
0670: 29 7b 0a 20 20 63 68 61 72 20 7a 53 68 6f 72 74  ){.  char zShort
0680: 55 75 69 64 5b 55 55 49 44 5f 53 49 5a 45 2b 31  Uuid[UUID_SIZE+1
0690: 5d 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 53 68  ];.  sprintf(zSh
06a0: 6f 72 74 55 75 69 64 2c 20 22 25 2e 31 30 73 22  ortUuid, "%.10s"
06b0: 2c 20 7a 55 75 69 64 29 3b 0a 20 20 69 66 28 20  , zUuid);.  if( 
06c0: 67 2e 6f 6b 48 69 73 74 6f 72 79 20 29 7b 0a 20  g.okHistory ){. 
06d0: 20 20 20 40 20 3c 61 20 6f 6e 6d 6f 75 73 65 6f     @ <a onmouseo
06e0: 76 65 72 3d 27 25 73 28 7a 49 6e 29 28 22 6d 25  ver='%s(zIn)("m%
06f0: 64 28 69 64 29 22 29 27 20 6f 6e 6d 6f 75 73 65  d(id)")' onmouse
0700: 6f 75 74 3d 27 25 73 28 7a 4f 75 74 29 28 22 6d  out='%s(zOut)("m
0710: 25 64 28 69 64 29 22 29 27 0a 20 20 20 20 40 20  %d(id)")'.    @ 
0720: 20 20 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42     href="%s(g.zB
0730: 61 73 65 55 52 4c 29 2f 76 69 6e 66 6f 2f 25 73  aseURL)/vinfo/%s
0740: 28 7a 55 75 69 64 29 22 3e 5b 25 73 28 7a 53 68  (zUuid)">[%s(zSh
0750: 6f 72 74 55 75 69 64 29 5d 3c 2f 61 3e 0a 20 20  ortUuid)]</a>.  
0760: 7d 65 6c 73 65 7b 0a 20 20 20 20 40 20 3c 62 20  }else{.    @ <b 
0770: 6f 6e 6d 6f 75 73 65 6f 76 65 72 3d 27 25 73 28  onmouseover='%s(
0780: 7a 49 6e 29 28 22 6d 25 64 28 69 64 29 22 29 27  zIn)("m%d(id)")'
0790: 20 6f 6e 6d 6f 75 73 65 6f 75 74 3d 27 25 73 28   onmouseout='%s(
07a0: 7a 4f 75 74 29 28 22 6d 25 64 28 69 64 29 22 29  zOut)("m%d(id)")
07b0: 27 3e 0a 20 20 20 20 40 20 5b 25 73 28 7a 53 68  '>.    @ [%s(zSh
07c0: 6f 72 74 55 75 69 64 29 5d 3c 2f 62 3e 0a 20 20  ortUuid)]</b>.  
07d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
07e0: 61 74 65 20 61 20 68 79 70 65 72 6c 69 6e 6b 20  ate a hyperlink 
07f0: 74 6f 20 61 20 64 69 66 66 20 62 65 74 77 65 65  to a diff betwee
0800: 6e 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 2e 0a  n two versions..
0810: 2a 2f 0a 76 6f 69 64 20 68 79 70 65 72 6c 69 6e  */.void hyperlin
0820: 6b 5f 74 6f 5f 64 69 66 66 28 63 6f 6e 73 74 20  k_to_diff(const 
0830: 63 68 61 72 20 2a 7a 56 31 2c 20 63 6f 6e 73 74  char *zV1, const
0840: 20 63 68 61 72 20 2a 7a 56 32 29 7b 0a 20 20 69   char *zV2){.  i
0850: 66 28 20 67 2e 6f 6b 48 69 73 74 6f 72 79 20 29  f( g.okHistory )
0860: 7b 0a 20 20 20 20 69 66 28 20 7a 56 32 3d 3d 30  {.    if( zV2==0
0870: 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 61 20 68   ){.      @ <a h
0880: 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55  ref="%s(g.zBaseU
0890: 52 4c 29 2f 64 69 66 66 3f 76 32 3d 25 73 28 7a  RL)/diff?v2=%s(z
08a0: 56 31 29 22 3e 5b 64 69 66 66 5d 3c 2f 61 3e 0a  V1)">[diff]</a>.
08b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
08c0: 20 40 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67   @ <a href="%s(g
08d0: 2e 7a 42 61 73 65 55 52 4c 29 2f 64 69 66 66 3f  .zBaseURL)/diff?
08e0: 76 31 3d 25 73 28 7a 56 31 29 26 76 32 3d 25 73  v1=%s(zV1)&v2=%s
08f0: 28 7a 56 32 29 22 3e 5b 64 69 66 66 5d 3c 2f 61  (zV2)">[diff]</a
0900: 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  >.    }.  }.}../
0910: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20 74 69  *.** Output a ti
0920: 6d 65 6c 69 6e 65 20 69 6e 20 74 68 65 20 77 65  meline in the we
0930: 62 20 66 6f 72 6d 61 74 20 67 69 76 65 6e 20 61  b format given a
0940: 20 71 75 65 72 79 2e 20 20 54 68 65 20 71 75 65   query.  The que
0950: 72 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 72 65 74  ry.** should ret
0960: 75 72 6e 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e  urn these column
0970: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 30 2e 20 20  s:.**.**    0.  
0980: 72 69 64 0a 2a 2a 20 20 20 20 31 2e 20 20 55 55  rid.**    1.  UU
0990: 49 44 0a 2a 2a 20 20 20 20 32 2e 20 20 44 61 74  ID.**    2.  Dat
09a0: 65 2f 54 69 6d 65 0a 2a 2a 20 20 20 20 33 2e 20  e/Time.**    3. 
09b0: 20 43 6f 6d 6d 65 6e 74 20 73 74 72 69 6e 67 0a   Comment string.
09c0: 2a 2a 20 20 20 20 34 2e 20 20 55 73 65 72 0a 2a  **    4.  User.*
09d0: 2a 20 20 20 20 35 2e 20 20 4e 75 6d 62 65 72 20  *    5.  Number 
09e0: 6f 66 20 6e 6f 6e 2d 6d 65 72 67 65 20 63 68 69  of non-merge chi
09f0: 6c 64 72 65 6e 0a 2a 2a 20 20 20 20 36 2e 20 20  ldren.**    6.  
0a00: 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 65 6e 74  Number of parent
0a10: 73 0a 2a 2a 20 20 20 20 37 2e 20 20 54 72 75 65  s.**    7.  True
0a20: 20 69 66 20 69 73 20 61 20 6c 65 61 66 0a 2a 2a   if is a leaf.**
0a30: 20 20 20 20 38 2e 20 20 62 61 63 6b 67 72 6f 75      8.  backgrou
0a40: 6e 64 20 63 6f 6c 6f 72 0a 2a 2a 20 20 20 20 39  nd color.**    9
0a50: 2e 20 20 74 79 70 65 20 28 22 63 69 22 2c 20 22  .  type ("ci", "
0a60: 77 22 29 0a 2a 2f 0a 76 6f 69 64 20 77 77 77 5f  w").*/.void www_
0a70: 70 72 69 6e 74 5f 74 69 6d 65 6c 69 6e 65 28 0a  print_timeline(.
0a80: 20 20 53 74 6d 74 20 2a 70 51 75 65 72 79 2c 0a    Stmt *pQuery,.
0a90: 20 20 69 6e 74 20 2a 70 46 69 72 73 74 45 76 65    int *pFirstEve
0aa0: 6e 74 2c 0a 20 20 69 6e 74 20 2a 70 4c 61 73 74  nt,.  int *pLast
0ab0: 45 76 65 6e 74 2c 0a 20 20 69 6e 74 20 28 2a 78  Event,.  int (*x
0ac0: 43 61 6c 6c 62 61 63 6b 29 28 69 6e 74 2c 20 42  Callback)(int, B
0ad0: 6c 6f 62 2a 29 2c 0a 20 20 42 6c 6f 62 20 2a 70  lob*),.  Blob *p
0ae0: 41 72 67 0a 20 29 7b 0a 20 20 69 6e 74 20 63 6e  Arg. ){.  int cn
0af0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 77 69 6b  t = 0;.  int wik
0b00: 69 46 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6d 78  iFlags;.  int mx
0b10: 57 69 6b 69 4c 65 6e 3b 0a 20 20 42 6c 6f 62 20  WikiLen;.  Blob 
0b20: 63 6f 6d 6d 65 6e 74 3b 0a 20 20 63 68 61 72 20  comment;.  char 
0b30: 7a 50 72 65 76 44 61 74 65 5b 32 30 5d 3b 0a 20  zPrevDate[20];. 
0b40: 20 7a 50 72 65 76 44 61 74 65 5b 30 5d 20 3d 20   zPrevDate[0] = 
0b50: 30 3b 0a 0a 20 20 6d 78 57 69 6b 69 4c 65 6e 20  0;..  mxWikiLen 
0b60: 3d 20 64 62 5f 67 65 74 5f 69 6e 74 28 22 74 69  = db_get_int("ti
0b70: 6d 65 6c 69 6e 65 2d 6d 61 78 2d 63 6f 6d 6d 65  meline-max-comme
0b80: 6e 74 22 2c 20 30 29 3b 0a 20 20 69 66 28 20 64  nt", 0);.  if( d
0b90: 62 5f 67 65 74 5f 62 6f 6f 6c 65 61 6e 28 22 74  b_get_boolean("t
0ba0: 69 6d 65 6c 69 6e 65 2d 62 6c 6f 63 6b 2d 6d 61  imeline-block-ma
0bb0: 72 6b 75 70 22 2c 20 30 29 20 29 7b 0a 20 20 20  rkup", 0) ){.   
0bc0: 20 77 69 6b 69 46 6c 61 67 73 20 3d 20 57 49 4b   wikiFlags = WIK
0bd0: 49 5f 49 4e 4c 49 4e 45 3b 0a 20 20 7d 65 6c 73  I_INLINE;.  }els
0be0: 65 7b 0a 20 20 20 20 77 69 6b 69 46 6c 61 67 73  e{.    wikiFlags
0bf0: 20 3d 20 57 49 4b 49 5f 49 4e 4c 49 4e 45 20 7c   = WIKI_INLINE |
0c00: 20 57 49 4b 49 5f 4e 4f 42 4c 4f 43 4b 3b 0a 20   WIKI_NOBLOCK;. 
0c10: 20 7d 0a 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65   }..  db_multi_e
0c20: 78 65 63 28 0a 20 20 20 20 20 22 43 52 45 41 54  xec(.     "CREAT
0c30: 45 20 54 45 4d 50 20 54 41 42 4c 45 20 49 46 20  E TEMP TABLE IF 
0c40: 4e 4f 54 20 45 58 49 53 54 53 20 73 65 65 6e 28  NOT EXISTS seen(
0c50: 72 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  rid INTEGER PRIM
0c60: 41 52 59 20 4b 45 59 29 3b 22 0a 20 20 20 20 20  ARY KEY);".     
0c70: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 65 65  "DELETE FROM see
0c80: 6e 3b 22 0a 20 20 29 3b 0a 20 20 40 20 3c 74 61  n;".  );.  @ <ta
0c90: 62 6c 65 20 63 65 6c 6c 73 70 61 63 69 6e 67 3d  ble cellspacing=
0ca0: 30 20 62 6f 72 64 65 72 3d 30 20 63 65 6c 6c 70  0 border=0 cellp
0cb0: 61 64 64 69 6e 67 3d 30 3e 0a 20 20 62 6c 6f 62  adding=0>.  blob
0cc0: 5f 7a 65 72 6f 28 26 63 6f 6d 6d 65 6e 74 29 3b  _zero(&comment);
0cd0: 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65  .  while( db_ste
0ce0: 70 28 70 51 75 65 72 79 29 3d 3d 53 51 4c 49 54  p(pQuery)==SQLIT
0cf0: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74  E_ROW ){.    int
0d00: 20 72 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e   rid = db_column
0d10: 5f 69 6e 74 28 70 51 75 65 72 79 2c 20 30 29 3b  _int(pQuery, 0);
0d20: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
0d30: 2a 7a 55 75 69 64 20 3d 20 64 62 5f 63 6f 6c 75  *zUuid = db_colu
0d40: 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20  mn_text(pQuery, 
0d50: 31 29 3b 0a 20 20 20 20 69 6e 74 20 6e 50 43 68  1);.    int nPCh
0d60: 69 6c 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ild = db_column_
0d70: 69 6e 74 28 70 51 75 65 72 79 2c 20 35 29 3b 0a  int(pQuery, 5);.
0d80: 20 20 20 20 69 6e 74 20 6e 50 61 72 65 6e 74 20      int nParent 
0d90: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  = db_column_int(
0da0: 70 51 75 65 72 79 2c 20 36 29 3b 0a 20 20 20 20  pQuery, 6);.    
0db0: 69 6e 74 20 69 73 4c 65 61 66 20 3d 20 64 62 5f  int isLeaf = db_
0dc0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 51 75 65 72  column_int(pQuer
0dd0: 79 2c 20 37 29 3b 0a 20 20 20 20 63 6f 6e 73 74  y, 7);.    const
0de0: 20 63 68 61 72 20 2a 7a 42 67 43 6c 72 20 3d 20   char *zBgClr = 
0df0: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  db_column_text(p
0e00: 51 75 65 72 79 2c 20 38 29 3b 0a 20 20 20 20 63  Query, 8);.    c
0e10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 65  onst char *zDate
0e20: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
0e30: 74 28 70 51 75 65 72 79 2c 20 32 29 3b 0a 20 20  t(pQuery, 2);.  
0e40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
0e50: 79 70 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ype = db_column_
0e60: 74 65 78 74 28 70 51 75 65 72 79 2c 20 39 29 3b  text(pQuery, 9);
0e70: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
0e80: 2a 7a 55 73 65 72 20 3d 20 64 62 5f 63 6f 6c 75  *zUser = db_colu
0e90: 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20  mn_text(pQuery, 
0ea0: 34 29 3b 0a 20 20 20 20 69 66 28 20 63 6e 74 3d  4);.    if( cnt=
0eb0: 3d 30 20 26 26 20 70 46 69 72 73 74 45 76 65 6e  =0 && pFirstEven
0ec0: 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 46 69 72  t ){.      *pFir
0ed0: 73 74 45 76 65 6e 74 20 3d 20 72 69 64 3b 0a 20  stEvent = rid;. 
0ee0: 20 20 20 7d 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a     }.    cnt++;.
0ef0: 20 20 20 20 69 66 28 20 70 4c 61 73 74 45 76 65      if( pLastEve
0f00: 6e 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 4c 61  nt ){.      *pLa
0f10: 73 74 45 76 65 6e 74 20 3d 20 72 69 64 3b 0a 20  stEvent = rid;. 
0f20: 20 20 20 7d 0a 20 20 20 20 64 62 5f 6d 75 6c 74     }.    db_mult
0f30: 69 5f 65 78 65 63 28 22 49 4e 53 45 52 54 20 4f  i_exec("INSERT O
0f40: 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 73 65  R IGNORE INTO se
0f50: 65 6e 20 56 41 4c 55 45 53 28 25 64 29 22 2c 20  en VALUES(%d)", 
0f60: 72 69 64 29 3b 0a 20 20 20 20 69 66 28 20 78 43  rid);.    if( xC
0f70: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
0f80: 20 78 43 61 6c 6c 62 61 63 6b 28 72 69 64 2c 20   xCallback(rid, 
0f90: 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pArg);.    }.   
0fa0: 20 69 66 28 20 6d 65 6d 63 6d 70 28 7a 44 61 74   if( memcmp(zDat
0fb0: 65 2c 20 7a 50 72 65 76 44 61 74 65 2c 20 31 30  e, zPrevDate, 10
0fc0: 29 20 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e  ) ){.      sprin
0fd0: 74 66 28 7a 50 72 65 76 44 61 74 65 2c 20 22 25  tf(zPrevDate, "%
0fe0: 2e 31 30 73 22 2c 20 7a 44 61 74 65 29 3b 0a 20  .10s", zDate);. 
0ff0: 20 20 20 20 20 40 20 3c 74 72 3e 3c 74 64 20 63       @ <tr><td c
1000: 6f 6c 73 70 61 6e 3d 33 3e 0a 20 20 20 20 20 20  olspan=3>.      
1010: 40 20 20 20 3c 64 69 76 20 63 6c 61 73 73 3d 22  @   <div class="
1020: 64 69 76 69 64 65 72 22 3e 25 73 28 7a 50 72 65  divider">%s(zPre
1030: 76 44 61 74 65 29 3c 2f 64 69 76 3e 0a 20 20 20  vDate)</div>.   
1040: 20 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a     @ </td></tr>.
1050: 20 20 20 20 7d 0a 20 20 20 20 40 20 3c 74 72 3e      }.    @ <tr>
1060: 0a 20 20 20 20 40 20 3c 74 64 20 76 61 6c 69 67  .    @ <td valig
1070: 6e 3d 22 74 6f 70 22 3e 25 73 28 26 7a 44 61 74  n="top">%s(&zDat
1080: 65 5b 31 31 5d 29 3c 2f 74 64 3e 0a 20 20 20 20  e[11])</td>.    
1090: 40 20 3c 74 64 20 77 69 64 74 68 3d 22 32 30 22  @ <td width="20"
10a0: 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22 20   align="center" 
10b0: 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 0a 20 20  valign="top">.  
10c0: 20 20 40 20 3c 66 6f 6e 74 20 69 64 3d 22 6d 25    @ <font id="m%
10d0: 64 28 72 69 64 29 22 20 73 69 7a 65 3d 22 2b 31  d(rid)" size="+1
10e0: 22 20 63 6f 6c 6f 72 3d 22 77 68 69 74 65 22 3e  " color="white">
10f0: 2a 3c 2f 66 6f 6e 74 3e 3c 2f 74 64 3e 0a 20 20  *</font></td>.  
1100: 20 20 69 66 28 20 7a 42 67 43 6c 72 20 26 26 20    if( zBgClr && 
1110: 7a 42 67 43 6c 72 5b 30 5d 20 29 7b 0a 20 20 20  zBgClr[0] ){.   
1120: 20 20 20 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d     @ <td valign=
1130: 22 74 6f 70 22 20 61 6c 69 67 6e 3d 22 6c 65 66  "top" align="lef
1140: 74 22 20 62 67 63 6f 6c 6f 72 3d 22 25 68 28 7a  t" bgcolor="%h(z
1150: 42 67 43 6c 72 29 22 3e 0a 20 20 20 20 7d 65 6c  BgClr)">.    }el
1160: 73 65 7b 0a 20 20 20 20 20 20 40 20 3c 74 64 20  se{.      @ <td 
1170: 76 61 6c 69 67 6e 3d 22 74 6f 70 22 20 61 6c 69  valign="top" ali
1180: 67 6e 3d 22 6c 65 66 74 22 3e 0a 20 20 20 20 7d  gn="left">.    }
1190: 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 5b 30  .    if( zType[0
11a0: 5d 3d 3d 27 63 27 20 29 7b 0a 20 20 20 20 20 20  ]=='c' ){.      
11b0: 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 75 69  hyperlink_to_uui
11c0: 64 5f 77 69 74 68 5f 6d 6f 75 73 65 6f 76 65 72  d_with_mouseover
11d0: 28 7a 55 75 69 64 2c 20 22 78 69 6e 22 2c 20 22  (zUuid, "xin", "
11e0: 78 6f 75 74 22 2c 20 72 69 64 29 3b 0a 20 20 20  xout", rid);.   
11f0: 20 20 20 69 66 28 20 6e 50 61 72 65 6e 74 3e 31     if( nParent>1
1200: 20 29 7b 0a 20 20 20 20 20 20 20 20 40 20 3c 62   ){.        @ <b
1210: 3e 4d 65 72 67 65 3c 2f 62 3e 20 0a 20 20 20 20  >Merge</b> .    
1220: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 50    }.      if( nP
1230: 43 68 69 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20  Child>1 ){.     
1240: 20 20 20 40 20 3c 62 3e 46 6f 72 6b 3c 2f 62 3e     @ <b>Fork</b>
1250: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1260: 66 28 20 69 73 4c 65 61 66 20 29 7b 0a 20 20 20  f( isLeaf ){.   
1270: 20 20 20 20 20 40 20 3c 62 3e 4c 65 61 66 3c 2f       @ <b>Leaf</
1280: 62 3e 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b>.      }.    }
1290: 65 6c 73 65 7b 0a 20 20 20 20 20 20 68 79 70 65  else{.      hype
12a0: 72 6c 69 6e 6b 5f 74 6f 5f 75 75 69 64 28 7a 55  rlink_to_uuid(zU
12b0: 75 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  uid);.    }.    
12c0: 64 62 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  db_column_blob(p
12d0: 51 75 65 72 79 2c 20 33 2c 20 26 63 6f 6d 6d 65  Query, 3, &comme
12e0: 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 6d 78 57  nt);.    if( mxW
12f0: 69 6b 69 4c 65 6e 3e 30 20 26 26 20 62 6c 6f 62  ikiLen>0 && blob
1300: 5f 73 69 7a 65 28 26 63 6f 6d 6d 65 6e 74 29 3e  _size(&comment)>
1310: 6d 78 57 69 6b 69 4c 65 6e 20 29 7b 0a 20 20 20  mxWikiLen ){.   
1320: 20 20 20 42 6c 6f 62 20 74 72 75 6e 63 61 74 65     Blob truncate
1330: 64 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 7a 65  d;.      blob_ze
1340: 72 6f 28 26 74 72 75 6e 63 61 74 65 64 29 3b 0a  ro(&truncated);.
1350: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
1360: 64 28 26 74 72 75 6e 63 61 74 65 64 2c 20 62 6c  d(&truncated, bl
1370: 6f 62 5f 62 75 66 66 65 72 28 26 63 6f 6d 6d 65  ob_buffer(&comme
1380: 6e 74 29 2c 20 6d 78 57 69 6b 69 4c 65 6e 29 3b  nt), mxWikiLen);
1390: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  .      blob_appe
13a0: 6e 64 28 26 74 72 75 6e 63 61 74 65 64 2c 20 22  nd(&truncated, "
13b0: 2e 2e 2e 22 2c 20 33 29 3b 0a 20 20 20 20 20 20  ...", 3);.      
13c0: 77 69 6b 69 5f 63 6f 6e 76 65 72 74 28 26 74 72  wiki_convert(&tr
13d0: 75 6e 63 61 74 65 64 2c 20 30 2c 20 77 69 6b 69  uncated, 0, wiki
13e0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 62 6c  Flags);.      bl
13f0: 6f 62 5f 72 65 73 65 74 28 26 74 72 75 6e 63 61  ob_reset(&trunca
1400: 74 65 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ted);.    }else{
1410: 0a 20 20 20 20 20 20 77 69 6b 69 5f 63 6f 6e 76  .      wiki_conv
1420: 65 72 74 28 26 63 6f 6d 6d 65 6e 74 2c 20 30 2c  ert(&comment, 0,
1430: 20 77 69 6b 69 46 6c 61 67 73 29 3b 0a 20 20 20   wikiFlags);.   
1440: 20 7d 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65   }.    blob_rese
1450: 74 28 26 63 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  t(&comment);.   
1460: 20 40 20 28 62 79 20 25 68 28 7a 55 73 65 72 29   @ (by %h(zUser)
1470: 29 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 7d 0a  )</td></tr>.  }.
1480: 20 20 40 20 3c 2f 74 61 62 6c 65 3e 0a 7d 0a 0a    @ </table>.}..
1490: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 6a  /*.** Generate j
14a0: 61 76 61 73 63 72 69 70 74 20 63 6f 64 65 20 74  avascript code t
14b0: 68 61 74 20 72 65 63 6f 72 64 73 20 74 68 65 20  hat records the 
14c0: 70 61 72 65 6e 74 73 20 61 6e 64 20 63 68 69 6c  parents and chil
14d0: 64 72 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 76  dren.** of the v
14e0: 65 72 73 69 6f 6e 20 72 69 64 2e 0a 2a 2f 0a 73  ersion rid..*/.s
14f0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 5f 70  tatic int save_p
1500: 61 72 65 6e 74 61 67 65 5f 6a 61 76 61 73 63 72  arentage_javascr
1510: 69 70 74 28 69 6e 74 20 72 69 64 2c 20 42 6c 6f  ipt(int rid, Blo
1520: 62 20 2a 70 4f 75 74 29 7b 0a 20 20 63 6f 6e 73  b *pOut){.  cons
1530: 74 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20  t char *zSep;.  
1540: 53 74 6d 74 20 71 3b 0a 0a 20 20 64 62 5f 70 72  Stmt q;..  db_pr
1550: 65 70 61 72 65 28 26 71 2c 20 22 53 45 4c 45 43  epare(&q, "SELEC
1560: 54 20 70 69 64 20 46 52 4f 4d 20 70 6c 69 6e 6b  T pid FROM plink
1570: 20 57 48 45 52 45 20 63 69 64 3d 25 64 22 2c 20   WHERE cid=%d", 
1580: 72 69 64 29 3b 0a 20 20 7a 53 65 70 20 3d 20 22  rid);.  zSep = "
1590: 22 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64  ";.  blob_append
15a0: 66 28 70 4f 75 74 2c 20 22 70 61 72 65 6e 74 6f  f(pOut, "parento
15b0: 66 5b 5c 22 6d 25 64 5c 22 5d 20 3d 20 5b 22 2c  f[\"m%d\"] = [",
15c0: 20 72 69 64 29 3b 0a 20 20 77 68 69 6c 65 28 20   rid);.  while( 
15d0: 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c  db_step(&q)==SQL
15e0: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69  ITE_ROW ){.    i
15f0: 6e 74 20 70 69 64 20 3d 20 64 62 5f 63 6f 6c 75  nt pid = db_colu
1600: 6d 6e 5f 69 6e 74 28 26 71 2c 20 30 29 3b 0a 20  mn_int(&q, 0);. 
1610: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
1620: 70 4f 75 74 2c 20 22 25 73 5c 22 6d 25 64 5c 22  pOut, "%s\"m%d\"
1630: 22 2c 20 7a 53 65 70 2c 20 70 69 64 29 3b 0a 20  ", zSep, pid);. 
1640: 20 20 20 7a 53 65 70 20 3d 20 22 2c 22 3b 0a 20     zSep = ",";. 
1650: 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65   }.  db_finalize
1660: 28 26 71 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70  (&q);.  blob_app
1670: 65 6e 64 66 28 70 4f 75 74 2c 20 22 5d 3b 5c 6e  endf(pOut, "];\n
1680: 22 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65  ");.  db_prepare
1690: 28 26 71 2c 20 22 53 45 4c 45 43 54 20 63 69 64  (&q, "SELECT cid
16a0: 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52   FROM plink WHER
16b0: 45 20 70 69 64 3d 25 64 22 2c 20 72 69 64 29 3b  E pid=%d", rid);
16c0: 0a 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20  .  zSep = "";.  
16d0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 4f 75  blob_appendf(pOu
16e0: 74 2c 20 22 63 68 69 6c 64 6f 66 5b 5c 22 6d 25  t, "childof[\"m%
16f0: 64 5c 22 5d 20 3d 20 5b 22 2c 20 72 69 64 29 3b  d\"] = [", rid);
1700: 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65  .  while( db_ste
1710: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
1720: 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 69 64  W ){.    int pid
1730: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   = db_column_int
1740: 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 62 6c 6f  (&q, 0);.    blo
1750: 62 5f 61 70 70 65 6e 64 66 28 70 4f 75 74 2c 20  b_appendf(pOut, 
1760: 22 25 73 5c 22 6d 25 64 5c 22 22 2c 20 7a 53 65  "%s\"m%d\"", zSe
1770: 70 2c 20 70 69 64 29 3b 0a 20 20 20 20 7a 53 65  p, pid);.    zSe
1780: 70 20 3d 20 22 2c 22 3b 0a 20 20 7d 0a 20 20 64  p = ",";.  }.  d
1790: 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a  b_finalize(&q);.
17a0: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70    blob_appendf(p
17b0: 4f 75 74 2c 20 22 5d 3b 5c 6e 22 29 3b 0a 20 20  Out, "];\n");.  
17c0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
17d0: 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
17e0: 6f 72 61 72 79 20 74 61 62 6c 65 20 73 75 69 74  orary table suit
17f0: 61 62 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  able for storing
1800: 20 74 69 6d 65 6c 69 6e 65 20 64 61 74 61 2e 0a   timeline data..
1810: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
1820: 69 6d 65 6c 69 6e 65 5f 74 65 6d 70 5f 74 61 62  imeline_temp_tab
1830: 6c 65 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  le(void){.  stat
1840: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 53  ic const char zS
1850: 71 6c 5b 5d 20 3d 20 0a 20 20 20 20 40 20 43 52  ql[] = .    @ CR
1860: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
1870: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 69  IF NOT EXISTS ti
1880: 6d 65 6c 69 6e 65 28 0a 20 20 20 20 40 20 20 20  meline(.    @   
1890: 72 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  rid INTEGER PRIM
18a0: 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 40 20 20  ARY KEY,.    @  
18b0: 20 75 75 69 64 20 54 45 58 54 2c 0a 20 20 20 20   uuid TEXT,.    
18c0: 40 20 20 20 74 69 6d 65 73 74 61 6d 70 20 54 45  @   timestamp TE
18d0: 58 54 2c 0a 20 20 20 20 40 20 20 20 63 6f 6d 6d  XT,.    @   comm
18e0: 65 6e 74 20 54 45 58 54 2c 0a 20 20 20 20 40 20  ent TEXT,.    @ 
18f0: 20 20 75 73 65 72 20 54 45 58 54 2c 0a 20 20 20    user TEXT,.   
1900: 20 40 20 20 20 6e 63 68 69 6c 64 20 49 4e 54 45   @   nchild INTE
1910: 47 45 52 2c 0a 20 20 20 20 40 20 20 20 6e 70 61  GER,.    @   npa
1920: 72 65 6e 74 20 49 4e 54 45 47 45 52 2c 0a 20 20  rent INTEGER,.  
1930: 20 20 40 20 20 20 69 73 6c 65 61 66 20 42 4f 4f    @   isleaf BOO
1940: 4c 45 41 4e 2c 0a 20 20 20 20 40 20 20 20 62 67  LEAN,.    @   bg
1950: 63 6f 6c 6f 72 20 54 45 58 54 2c 0a 20 20 20 20  color TEXT,.    
1960: 40 20 20 20 65 74 79 70 65 20 54 45 58 54 0a 20  @   etype TEXT. 
1970: 20 20 20 40 20 29 0a 20 20 3b 0a 20 20 64 62 5f     @ ).  ;.  db_
1980: 6d 75 6c 74 69 5f 65 78 65 63 28 7a 53 71 6c 29  multi_exec(zSql)
1990: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19a0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
19b0: 20 63 6f 6e 73 74 61 6e 74 20 73 74 72 69 6e 67   constant string
19c0: 20 74 68 61 74 20 66 6f 72 6d 73 20 74 68 65 20   that forms the 
19d0: 62 61 73 69 73 0a 2a 2a 20 66 6f 72 20 61 20 74  basis.** for a t
19e0: 69 6d 65 6c 69 6e 65 20 71 75 65 72 79 20 66 6f  imeline query fo
19f0: 72 20 74 68 65 20 57 57 57 20 69 6e 74 65 72 66  r the WWW interf
1a00: 61 63 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ace..*/.const ch
1a10: 61 72 20 2a 74 69 6d 65 6c 69 6e 65 5f 71 75 65  ar *timeline_que
1a20: 72 79 5f 66 6f 72 5f 77 77 77 28 76 6f 69 64 29  ry_for_www(void)
1a30: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
1a40: 20 63 68 61 72 20 7a 42 61 73 65 53 71 6c 5b 5d   char zBaseSql[]
1a50: 20 3d 0a 20 20 20 20 40 20 53 45 4c 45 43 54 0a   =.    @ SELECT.
1a60: 20 20 20 20 40 20 20 20 62 6c 6f 62 2e 72 69 64      @   blob.rid
1a70: 2c 0a 20 20 20 20 40 20 20 20 75 75 69 64 2c 0a  ,.    @   uuid,.
1a80: 20 20 20 20 40 20 20 20 64 61 74 65 74 69 6d 65      @   datetime
1a90: 28 65 76 65 6e 74 2e 6d 74 69 6d 65 2c 27 6c 6f  (event.mtime,'lo
1aa0: 63 61 6c 74 69 6d 65 27 29 20 41 53 20 74 69 6d  caltime') AS tim
1ab0: 65 73 74 61 6d 70 2c 0a 20 20 20 20 40 20 20 20  estamp,.    @   
1ac0: 63 6f 61 6c 65 73 63 65 28 65 63 6f 6d 6d 65 6e  coalesce(ecommen
1ad0: 74 2c 20 63 6f 6d 6d 65 6e 74 29 2c 0a 20 20 20  t, comment),.   
1ae0: 20 40 20 20 20 63 6f 61 6c 65 73 63 65 28 65 75   @   coalesce(eu
1af0: 73 65 72 2c 20 75 73 65 72 29 2c 0a 20 20 20 20  ser, user),.    
1b00: 40 20 20 20 28 53 45 4c 45 43 54 20 63 6f 75 6e  @   (SELECT coun
1b10: 74 28 2a 29 20 46 52 4f 4d 20 70 6c 69 6e 6b 20  t(*) FROM plink 
1b20: 57 48 45 52 45 20 70 69 64 3d 62 6c 6f 62 2e 72  WHERE pid=blob.r
1b30: 69 64 20 41 4e 44 20 69 73 70 72 69 6d 3d 31 29  id AND isprim=1)
1b40: 2c 0a 20 20 20 20 40 20 20 20 28 53 45 4c 45 43  ,.    @   (SELEC
1b50: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1b60: 70 6c 69 6e 6b 20 57 48 45 52 45 20 63 69 64 3d  plink WHERE cid=
1b70: 62 6c 6f 62 2e 72 69 64 29 2c 0a 20 20 20 20 40  blob.rid),.    @
1b80: 20 20 20 4e 4f 54 20 45 58 49 53 54 53 20 28 53     NOT EXISTS (S
1b90: 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 70 6c 69  ELECT 1 FROM pli
1ba0: 6e 6b 20 57 48 45 52 45 20 70 69 64 3d 62 6c 6f  nk WHERE pid=blo
1bb0: 62 2e 72 69 64 29 2c 0a 20 20 20 20 40 20 20 20  b.rid),.    @   
1bc0: 63 6f 61 6c 65 73 63 65 28 62 67 63 6f 6c 6f 72  coalesce(bgcolor
1bd0: 2c 20 62 72 62 67 63 6f 6c 6f 72 29 2c 0a 20 20  , brbgcolor),.  
1be0: 20 20 40 20 20 20 65 76 65 6e 74 2e 74 79 70 65    @   event.type
1bf0: 0a 20 20 20 20 40 20 20 46 52 4f 4d 20 65 76 65  .    @  FROM eve
1c00: 6e 74 20 4a 4f 49 4e 20 62 6c 6f 62 20 0a 20 20  nt JOIN blob .  
1c10: 20 20 40 20 57 48 45 52 45 20 62 6c 6f 62 2e 72    @ WHERE blob.r
1c20: 69 64 3d 65 76 65 6e 74 2e 6f 62 6a 69 64 0a 20  id=event.objid. 
1c30: 20 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42 61 73   ;.  return zBas
1c40: 65 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  eSql;.}../*.** W
1c50: 45 42 50 41 47 45 3a 20 6e 74 69 6d 65 6c 69 6e  EBPAGE: ntimelin
1c60: 65 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79 20 70 61  e.**.** Query pa
1c70: 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20  rameters:.**.** 
1c80: 20 20 20 61 3d 54 49 4d 45 53 54 41 4d 50 20 20     a=TIMESTAMP  
1c90: 20 20 61 66 74 65 72 20 74 68 69 73 20 64 61 74    after this dat
1ca0: 65 0a 2a 2a 20 20 20 20 62 3d 54 49 4d 45 53 54  e.**    b=TIMEST
1cb0: 41 4d 50 20 20 20 20 62 65 66 6f 72 65 20 74 68  AMP    before th
1cc0: 69 73 20 64 61 74 65 2e 0a 2a 2a 20 20 20 20 6e  is date..**    n
1cd0: 3d 43 4f 55 4e 54 20 20 20 20 20 20 20 20 6e 75  =COUNT        nu
1ce0: 6d 62 65 72 20 6f 66 20 65 76 65 6e 74 73 20 69  mber of events i
1cf0: 6e 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 70  n output.**    p
1d00: 3d 52 49 44 20 20 20 20 20 20 20 20 20 20 61 72  =RID          ar
1d10: 74 69 66 61 63 74 20 52 49 44 20 61 6e 64 20 75  tifact RID and u
1d20: 70 20 74 6f 20 43 4f 55 4e 54 20 70 61 72 65 6e  p to COUNT paren
1d30: 74 73 20 61 6e 64 20 61 6e 63 65 73 74 6f 72 73  ts and ancestors
1d40: 0a 2a 2a 20 20 20 20 64 3d 52 49 44 20 20 20 20  .**    d=RID    
1d50: 20 20 20 20 20 20 61 72 74 69 66 61 63 74 20 52        artifact R
1d60: 49 44 20 61 6e 64 20 75 70 20 74 6f 20 43 4f 55  ID and up to COU
1d70: 4e 54 20 64 65 73 63 65 6e 64 65 6e 74 73 0a 2a  NT descendents.*
1d80: 2a 20 20 20 20 75 3d 55 53 45 52 20 20 20 20 20  *    u=USER     
1d90: 20 20 20 20 6f 6e 6c 79 20 69 66 20 62 65 6c 6f      only if belo
1da0: 6e 67 69 6e 67 20 74 6f 20 74 68 69 73 20 75 73  nging to this us
1db0: 65 72 0a 2a 2a 20 20 20 20 79 3d 54 59 50 45 20  er.**    y=TYPE 
1dc0: 20 20 20 20 20 20 20 20 27 63 69 27 2c 20 27 77          'ci', 'w
1dd0: 27 2c 20 27 74 6b 74 27 0a 2a 2a 0a 2a 2a 20 70  ', 'tkt'.**.** p
1de0: 3d 20 61 6e 64 20 64 3d 20 63 61 6e 20 61 70 70  = and d= can app
1df0: 65 61 72 20 69 6e 64 69 76 69 64 75 61 6c 6c 79  ear individually
1e00: 20 6f 72 20 74 6f 67 65 74 68 65 72 2e 20 20 49   or together.  I
1e10: 66 20 65 69 74 68 65 72 20 70 3d 20 6f 72 20 64  f either p= or d
1e20: 3d 0a 2a 2a 20 61 70 70 65 61 72 2c 20 74 68 65  =.** appear, the
1e30: 6e 20 75 3d 2c 20 79 3d 2c 20 61 3d 2c 20 61 6e  n u=, y=, a=, an
1e40: 64 20 62 3d 20 61 72 65 20 69 67 6e 6f 72 65 64  d b= are ignored
1e50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 3d 20 61 6e  ..**.** If a= an
1e60: 64 20 62 3d 20 61 70 70 65 61 72 2c 20 6f 6e 6c  d b= appear, onl
1e70: 79 20 61 3d 20 69 73 20 75 73 65 64 2e 20 20 49  y a= is used.  I
1e80: 66 20 6e 65 69 74 68 65 72 20 61 70 70 65 61 72  f neither appear
1e90: 2c 20 74 68 65 20 6d 6f 73 74 0a 2a 2a 20 72 65  , the most.** re
1ea0: 63 65 6e 74 20 65 76 65 6e 74 73 20 61 72 65 20  cent events are 
1eb0: 63 68 6f 6f 73 65 6e 2e 0a 2a 2a 0a 2a 2a 20 49  choosen..**.** I
1ec0: 66 20 6e 3d 20 69 73 20 6d 69 73 73 69 6e 67 2c  f n= is missing,
1ed0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 75   the default cou
1ee0: 6e 74 20 69 73 20 32 30 2e 0a 2a 2f 0a 76 6f 69  nt is 20..*/.voi
1ef0: 64 20 70 61 67 65 5f 6e 74 69 6d 65 6c 69 6e 65  d page_ntimeline
1f00: 28 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74 20 71  (void){.  Stmt q
1f10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f30: 51 75 65 72 79 20 75 73 65 64 20 74 6f 20 67 65  Query used to ge
1f40: 6e 65 72 61 74 65 20 74 68 65 20 74 69 6d 65 6c  nerate the timel
1f50: 69 6e 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 73 71  ine */.  Blob sq
1f60: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
1f80: 65 78 74 20 6f 66 20 53 51 4c 20 75 73 65 64 20  ext of SQL used 
1f90: 74 6f 20 67 65 6e 65 72 61 74 65 20 74 69 6d 65  to generate time
1fa0: 6c 69 6e 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 64  line */.  Blob d
1fb0: 65 73 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  esc;            
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fd0: 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1fe0: 68 65 20 74 69 6d 65 6c 69 6e 65 20 2a 2f 0a 20  he timeline */. 
1ff0: 20 69 6e 74 20 6e 45 6e 74 72 79 20 3d 20 61 74   int nEntry = at
2000: 6f 69 28 50 44 28 22 6e 22 2c 22 32 30 22 29 29  oi(PD("n","20"))
2010: 3b 20 20 20 2f 2a 20 4d 61 78 20 6e 75 6d 62 65  ;   /* Max numbe
2020: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20  r of entries on 
2030: 74 69 6d 65 6c 69 6e 65 20 2a 2f 0a 20 20 69 6e  timeline */.  in
2040: 74 20 70 5f 72 69 64 20 3d 20 61 74 6f 69 28 50  t p_rid = atoi(P
2050: 44 28 22 70 22 2c 22 30 22 29 29 3b 20 20 20 20  D("p","0"));    
2060: 20 2f 2a 20 61 72 74 69 66 61 63 74 20 70 20 61   /* artifact p a
2070: 6e 64 20 69 74 73 20 70 61 72 65 6e 74 73 20 2a  nd its parents *
2080: 2f 0a 20 20 69 6e 74 20 64 5f 72 69 64 20 3d 20  /.  int d_rid = 
2090: 61 74 6f 69 28 50 44 28 22 64 22 2c 22 30 22 29  atoi(PD("d","0")
20a0: 29 3b 20 20 20 20 20 2f 2a 20 61 72 74 69 66 61  );     /* artifa
20b0: 63 74 20 64 20 61 6e 64 20 69 74 73 20 64 65 73  ct d and its des
20c0: 63 65 6e 64 65 6e 74 73 20 2a 2f 0a 20 20 63 6f  cendents */.  co
20d0: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72 20  nst char *zUser 
20e0: 3d 20 50 28 22 75 22 29 3b 20 20 20 20 20 20 20  = P("u");       
20f0: 20 2f 2a 20 41 6c 6c 20 65 6e 74 72 69 65 73 20   /* All entries 
2100: 62 79 20 74 68 69 73 20 75 73 65 72 20 69 66 20  by this user if 
2110: 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f  not NULL */.  co
2120: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
2130: 3d 20 50 28 22 79 22 29 3b 20 20 20 20 20 20 20  = P("y");       
2140: 20 2f 2a 20 54 79 70 65 20 6f 66 20 65 76 65 6e   /* Type of even
2150: 74 73 2e 20 20 41 6c 6c 20 69 66 20 4e 55 4c 4c  ts.  All if NULL
2160: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2170: 20 2a 7a 41 66 74 65 72 20 3d 20 50 28 22 61 22   *zAfter = P("a"
2180: 29 3b 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e  );       /* Even
2190: 74 73 20 61 66 74 65 72 20 74 68 69 73 20 74 69  ts after this ti
21a0: 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  me */.  const ch
21b0: 61 72 20 2a 7a 42 65 66 6f 72 65 20 3d 20 50 28  ar *zBefore = P(
21c0: 22 62 22 29 3b 20 20 20 20 20 20 2f 2a 20 45 76  "b");      /* Ev
21d0: 65 6e 74 73 20 62 65 66 6f 72 65 20 74 68 69 73  ents before this
21e0: 20 74 69 6d 65 20 2a 2f 0a 20 20 42 6c 6f 62 20   time */.  Blob 
21f0: 73 63 72 69 70 74 49 6e 69 74 3b 0a 0a 20 20 2f  scriptInit;..  /
2200: 2a 20 54 6f 20 76 69 65 77 20 74 68 65 20 74 69  * To view the ti
2210: 6d 65 6c 69 6e 65 2c 20 6d 75 73 74 20 68 61 76  meline, must hav
2220: 65 20 70 65 72 6d 69 73 73 69 6f 6e 20 74 6f 20  e permission to 
2230: 72 65 61 64 20 70 72 6f 6a 65 63 74 20 64 61 74  read project dat
2240: 61 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 67 69 6e 5f  a..  */.  login_
2250: 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c  check_credential
2260: 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b  s();.  if( !g.ok
2270: 52 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65  Read ){ login_ne
2280: 65 64 65 64 28 29 3b 20 72 65 74 75 72 6e 3b 20  eded(); return; 
2290: 7d 0a 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65  }..  style_heade
22a0: 72 28 22 54 69 6d 65 6c 69 6e 65 22 29 3b 0a 20  r("Timeline");. 
22b0: 20 69 66 28 20 21 67 2e 6f 6b 48 69 73 74 6f 72   if( !g.okHistor
22c0: 79 20 26 26 0a 20 20 20 20 20 20 64 62 5f 65 78  y &&.      db_ex
22d0: 69 73 74 73 28 22 53 45 4c 45 43 54 20 31 20 46  ists("SELECT 1 F
22e0: 52 4f 4d 20 75 73 65 72 22 0a 20 20 20 20 20 20  ROM user".      
22f0: 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
2300: 45 20 6c 6f 67 69 6e 3d 27 61 6e 6f 6e 79 6d 6f  E login='anonymo
2310: 75 73 27 22 0a 20 20 20 20 20 20 20 20 20 20 20  us'".           
2320: 20 20 20 20 20 22 20 20 20 41 4e 44 20 63 61 70       "   AND cap
2330: 20 4c 49 4b 45 20 27 25 25 68 25 25 27 22 29 20   LIKE '%%h%%'") 
2340: 29 7b 0a 20 20 20 20 40 20 3c 70 3e 3c 62 3e 4e  ){.    @ <p><b>N
2350: 6f 74 65 3a 3c 2f 62 3e 20 59 6f 75 20 77 69 6c  ote:</b> You wil
2360: 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 61 63 63  l be able to acc
2370: 65 73 73 20 3c 75 3e 6d 75 63 68 3c 2f 75 3e 20  ess <u>much</u> 
2380: 6d 6f 72 65 0a 20 20 20 20 40 20 68 69 73 74 6f  more.    @ histo
2390: 72 69 63 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  rical informatio
23a0: 6e 20 69 66 20 79 6f 75 20 3c 61 20 68 72 65 66  n if you <a href
23b0: 3d 22 25 73 28 67 2e 7a 54 6f 70 29 2f 6c 6f 67  ="%s(g.zTop)/log
23c0: 69 6e 22 3e 6c 6f 67 69 6e 3c 2f 61 3e 2e 3c 2f  in">login</a>.</
23d0: 70 3e 0a 20 20 7d 0a 20 20 74 69 6d 65 6c 69 6e  p>.  }.  timelin
23e0: 65 5f 74 65 6d 70 5f 74 61 62 6c 65 28 29 3b 0a  e_temp_table();.
23f0: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 73 71 6c    blob_zero(&sql
2400: 29 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26  );.  blob_zero(&
2410: 64 65 73 63 29 3b 0a 20 20 62 6c 6f 62 5f 61 70  desc);.  blob_ap
2420: 70 65 6e 64 28 26 73 71 6c 2c 20 22 49 4e 53 45  pend(&sql, "INSE
2430: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
2440: 4f 20 74 69 6d 65 6c 69 6e 65 20 22 2c 20 2d 31  O timeline ", -1
2450: 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64  );.  blob_append
2460: 28 26 73 71 6c 2c 20 74 69 6d 65 6c 69 6e 65 5f  (&sql, timeline_
2470: 71 75 65 72 79 5f 66 6f 72 5f 77 77 77 28 29 2c  query_for_www(),
2480: 20 2d 31 29 3b 0a 20 20 69 66 28 20 70 5f 72 69   -1);.  if( p_ri
2490: 64 20 7c 7c 20 64 5f 72 69 64 20 29 7b 0a 20 20  d || d_rid ){.  
24a0: 20 20 2f 2a 20 49 66 20 70 3d 20 6f 72 20 64 3d    /* If p= or d=
24b0: 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69 67 6e   is present, ign
24c0: 6f 72 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 61  ore all other pa
24d0: 72 61 6d 65 74 65 72 73 20 6f 74 68 65 72 20 74  rameters other t
24e0: 68 61 6e 20 6e 3d 20 2a 2f 0a 20 20 20 20 63 68  han n= */.    ch
24f0: 61 72 20 2a 7a 55 75 69 64 3b 0a 20 20 20 20 69  ar *zUuid;.    i
2500: 6e 74 20 6e 70 2c 20 6e 64 3b 0a 0a 20 20 20 20  nt np, nd;..    
2510: 69 66 28 20 70 5f 72 69 64 20 26 26 20 64 5f 72  if( p_rid && d_r
2520: 69 64 20 26 26 20 70 5f 72 69 64 21 3d 64 5f 72  id && p_rid!=d_r
2530: 69 64 20 29 20 70 5f 72 69 64 20 3d 20 64 5f 72  id ) p_rid = d_r
2540: 69 64 3b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69  id;.    db_multi
2550: 5f 65 78 65 63 28 0a 20 20 20 20 20 20 20 22 43  _exec(.       "C
2560: 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45  REATE TEMP TABLE
2570: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 6f   IF NOT EXISTS o
2580: 6b 28 72 69 64 20 49 4e 54 45 47 45 52 20 50 52  k(rid INTEGER PR
2590: 49 4d 41 52 59 20 4b 45 59 29 22 0a 20 20 20 20  IMARY KEY)".    
25a0: 29 3b 0a 20 20 20 20 7a 55 75 69 64 20 3d 20 64  );.    zUuid = d
25b0: 62 5f 74 65 78 74 28 22 22 2c 20 22 53 45 4c 45  b_text("", "SELE
25c0: 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f  CT uuid FROM blo
25d0: 62 20 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c  b WHERE rid=%d",
25e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25f0: 20 20 20 20 20 20 20 20 20 20 70 5f 72 69 64 20            p_rid 
2600: 3f 20 70 5f 72 69 64 20 3a 20 64 5f 72 69 64 29  ? p_rid : d_rid)
2610: 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e  ;.    blob_appen
2620: 64 66 28 26 73 71 6c 2c 20 22 20 41 4e 44 20 65  df(&sql, " AND e
2630: 76 65 6e 74 2e 6f 62 6a 69 64 20 49 4e 20 6f 6b  vent.objid IN ok
2640: 22 29 3b 0a 20 20 20 20 6e 64 20 3d 20 30 3b 0a  ");.    nd = 0;.
2650: 20 20 20 20 69 66 28 20 64 5f 72 69 64 20 29 7b      if( d_rid ){
2660: 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 5f 64  .      compute_d
2670: 65 73 63 65 6e 64 65 6e 74 73 28 64 5f 72 69 64  escendents(d_rid
2680: 2c 20 6e 45 6e 74 72 79 29 3b 0a 20 20 20 20 20  , nEntry);.     
2690: 20 6e 64 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20   nd = db_int(0, 
26a0: 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
26b0: 2d 31 20 46 52 4f 4d 20 6f 6b 22 29 3b 0a 20 20  -1 FROM ok");.  
26c0: 20 20 20 20 69 66 28 20 6e 64 3e 30 20 29 7b 0a      if( nd>0 ){.
26d0: 20 20 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69          db_multi
26e0: 5f 65 78 65 63 28 22 25 73 22 2c 20 62 6c 6f 62  _exec("%s", blob
26f0: 5f 73 74 72 28 26 73 71 6c 29 29 3b 0a 20 20 20  _str(&sql));.   
2700: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
2710: 66 28 26 64 65 73 63 2c 20 22 25 64 20 64 65 73  f(&desc, "%d des
2720: 63 65 6e 64 65 6e 74 73 22 2c 20 6e 64 29 3b 0a  cendents", nd);.
2730: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62        }.      db
2740: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 44 45 4c  _multi_exec("DEL
2750: 45 54 45 20 46 52 4f 4d 20 6f 6b 22 29 3b 0a 20  ETE FROM ok");. 
2760: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 5f 72     }.    if( p_r
2770: 69 64 20 29 7b 0a 20 20 20 20 20 20 63 6f 6d 70  id ){.      comp
2780: 75 74 65 5f 61 6e 63 65 73 74 6f 72 73 28 70 5f  ute_ancestors(p_
2790: 72 69 64 2c 20 6e 45 6e 74 72 79 29 3b 0a 20 20  rid, nEntry);.  
27a0: 20 20 20 20 6e 70 20 3d 20 64 62 5f 69 6e 74 28      np = db_int(
27b0: 30 2c 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  0, "SELECT count
27c0: 28 2a 29 2d 31 20 46 52 4f 4d 20 6f 6b 22 29 3b  (*)-1 FROM ok");
27d0: 0a 20 20 20 20 20 20 69 66 28 20 6e 70 3e 30 20  .      if( np>0 
27e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
27f0: 64 3e 30 20 29 20 62 6c 6f 62 5f 61 70 70 65 6e  d>0 ) blob_appen
2800: 64 66 28 26 64 65 73 63 2c 20 22 20 61 6e 64 20  df(&desc, " and 
2810: 22 29 3b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62  ");.        blob
2820: 5f 61 70 70 65 6e 64 66 28 26 64 65 73 63 2c 20  _appendf(&desc, 
2830: 22 25 64 20 61 6e 63 65 73 74 6f 72 73 22 2c 20  "%d ancestors", 
2840: 6e 70 29 3b 0a 20 20 20 20 20 20 20 20 64 62 5f  np);.        db_
2850: 6d 75 6c 74 69 5f 65 78 65 63 28 22 25 73 22 2c  multi_exec("%s",
2860: 20 62 6c 6f 62 5f 73 74 72 28 26 73 71 6c 29 29   blob_str(&sql))
2870: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2880: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
2890: 28 26 64 65 73 63 2c 20 22 20 6f 66 20 3c 61 20  (&desc, " of <a 
28a0: 68 72 65 66 3d 27 25 73 2f 69 6e 66 6f 2f 25 73  href='%s/info/%s
28b0: 27 3e 5b 25 2e 31 30 73 5d 3c 2f 61 3e 22 2c 0a  '>[%.10s]</a>",.
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 67 2e 7a 42 61 73 65 55 52 4c 2c 20 7a 55 75   g.zBaseURL, zUu
28e0: 69 64 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20  id, zUuid);.    
28f0: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 22  db_prepare(&q, "
2900: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 69  SELECT * FROM ti
2910: 6d 65 6c 69 6e 65 20 4f 52 44 45 52 20 42 59 20  meline ORDER BY 
2920: 74 69 6d 65 73 74 61 6d 70 20 44 45 53 43 22 29  timestamp DESC")
2930: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
2940: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 54 79 70  onst char *zETyp
2950: 65 20 3d 20 22 65 76 65 6e 74 22 3b 0a 20 20 20  e = "event";.   
2960: 20 69 66 28 20 7a 54 79 70 65 20 29 7b 0a 20 20   if( zType ){.  
2970: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
2980: 28 26 73 71 6c 2c 20 22 20 41 4e 44 20 65 76 65  (&sql, " AND eve
2990: 6e 74 2e 74 79 70 65 3d 25 51 22 2c 20 7a 54 79  nt.type=%Q", zTy
29a0: 70 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  pe);.      if( z
29b0: 54 79 70 65 5b 30 5d 3d 3d 27 63 27 20 29 7b 0a  Type[0]=='c' ){.
29c0: 20 20 20 20 20 20 20 20 7a 45 54 79 70 65 20 3d          zEType =
29d0: 20 22 63 68 65 63 6b 69 6e 22 3b 0a 20 20 20 20   "checkin";.    
29e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 79 70    }else if( zTyp
29f0: 65 5b 30 5d 3d 3d 27 77 27 20 29 7b 0a 20 20 20  e[0]=='w' ){.   
2a00: 20 20 20 20 20 7a 45 54 79 70 65 20 3d 20 22 77       zEType = "w
2a10: 69 6b 69 20 65 64 69 74 22 3b 0a 20 20 20 20 20  iki edit";.     
2a20: 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 79 70 65   }else if( zType
2a30: 5b 30 5d 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20  [0]=='t' ){.    
2a40: 20 20 20 20 7a 45 54 79 70 65 20 3d 20 22 74 69      zEType = "ti
2a50: 63 6b 65 74 20 63 68 61 6e 67 65 22 3b 0a 20 20  cket change";.  
2a60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2a70: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 64 65  blob_appendf(&de
2a80: 73 63 2c 20 22 54 69 6d 65 6c 69 6e 65 20 6f 66  sc, "Timeline of
2a90: 20 75 70 20 74 6f 20 25 64 20 25 73 22 2c 20 6e   up to %d %s", n
2aa0: 45 6e 74 72 79 2c 20 7a 45 54 79 70 65 29 3b 0a  Entry, zEType);.
2ab0: 20 20 20 20 69 66 28 20 7a 55 73 65 72 20 29 7b      if( zUser ){
2ac0: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  .      blob_appe
2ad0: 6e 64 66 28 26 73 71 6c 2c 20 22 20 41 4e 44 20  ndf(&sql, " AND 
2ae0: 65 76 65 6e 74 2e 75 73 65 72 3d 25 51 22 2c 20  event.user=%Q", 
2af0: 7a 55 73 65 72 29 3b 0a 20 20 20 20 20 20 62 6c  zUser);.      bl
2b00: 6f 62 5f 61 70 70 65 6e 64 66 28 26 64 65 73 63  ob_appendf(&desc
2b10: 2c 20 22 20 62 79 20 75 73 65 72 20 25 68 22 2c  , " by user %h",
2b20: 20 7a 55 73 65 72 29 3b 0a 20 20 20 20 7d 0a 20   zUser);.    }. 
2b30: 20 20 20 69 66 28 20 7a 41 66 74 65 72 20 29 7b     if( zAfter ){
2b40: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 73  .      while( is
2b50: 73 70 61 63 65 28 7a 41 66 74 65 72 5b 30 5d 29  space(zAfter[0])
2b60: 20 29 7b 20 7a 41 66 74 65 72 2b 2b 3b 20 7d 0a   ){ zAfter++; }.
2b70: 20 20 20 20 20 20 69 66 28 20 7a 41 66 74 65 72        if( zAfter
2b80: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 62  [0] ){.        b
2b90: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 71 6c  lob_appendf(&sql
2ba0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 20  , .           " 
2bb0: 41 4e 44 20 65 76 65 6e 74 2e 6d 74 69 6d 65 3e  AND event.mtime>
2bc0: 3d 28 53 45 4c 45 43 54 20 6a 75 6c 69 61 6e 64  =(SELECT juliand
2bd0: 61 79 28 25 51 2c 20 27 75 74 63 27 29 29 22 0a  ay(%Q, 'utc'))".
2be0: 20 20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44             " ORD
2bf0: 45 52 20 42 59 20 65 76 65 6e 74 2e 6d 74 69 6d  ER BY event.mtim
2c00: 65 20 41 53 43 22 2c 20 7a 41 66 74 65 72 29 3b  e ASC", zAfter);
2c10: 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  .        blob_ap
2c20: 70 65 6e 64 66 28 26 64 65 73 63 2c 20 22 20 6f  pendf(&desc, " o
2c30: 63 63 75 72 72 69 6e 67 20 6f 6e 20 6f 72 20 61  ccurring on or a
2c40: 66 74 65 72 20 25 68 22 2c 20 7a 41 66 74 65 72  fter %h", zAfter
2c50: 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 65 66 6f  );.        zBefo
2c60: 72 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  re = 0;.      }.
2c70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 42      }else if( zB
2c80: 65 66 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 77  efore ){.      w
2c90: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 7a 42  hile( isspace(zB
2ca0: 65 66 6f 72 65 5b 30 5d 29 20 29 7b 20 7a 42 65  efore[0]) ){ zBe
2cb0: 66 6f 72 65 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  fore++; }.      
2cc0: 69 66 28 20 7a 42 65 66 6f 72 65 5b 30 5d 20 29  if( zBefore[0] )
2cd0: 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61  {.        blob_a
2ce0: 70 70 65 6e 64 66 28 26 73 71 6c 2c 20 0a 20 20  ppendf(&sql, .  
2cf0: 20 20 20 20 20 20 20 20 20 22 20 41 4e 44 20 65           " AND e
2d00: 76 65 6e 74 2e 6d 74 69 6d 65 3c 3d 28 53 45 4c  vent.mtime<=(SEL
2d10: 45 43 54 20 6a 75 6c 69 61 6e 64 61 79 28 25 51  ECT julianday(%Q
2d20: 2c 20 27 75 74 63 27 29 29 22 0a 20 20 20 20 20  , 'utc'))".     
2d30: 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59        " ORDER BY
2d40: 20 65 76 65 6e 74 2e 6d 74 69 6d 65 20 44 45 53   event.mtime DES
2d50: 43 22 2c 20 7a 42 65 66 6f 72 65 29 3b 0a 20 20  C", zBefore);.  
2d60: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
2d70: 64 66 28 26 64 65 73 63 2c 20 22 20 6f 63 63 75  df(&desc, " occu
2d80: 72 72 69 6e 67 20 6f 6e 20 6f 72 20 62 65 66 6f  rring on or befo
2d90: 72 65 20 25 68 22 2c 20 7a 42 65 66 6f 72 65 29  re %h", zBefore)
2da0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2db0: 6c 73 65 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f  lse{.      blob_
2dc0: 61 70 70 65 6e 64 66 28 26 73 71 6c 2c 20 22 20  appendf(&sql, " 
2dd0: 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74 2e 6d  ORDER BY event.m
2de0: 74 69 6d 65 20 44 45 53 43 22 29 3b 0a 20 20 20  time DESC");.   
2df0: 20 7d 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65   }.    blob_appe
2e00: 6e 64 66 28 26 73 71 6c 2c 20 22 20 4c 49 4d 49  ndf(&sql, " LIMI
2e10: 54 20 25 64 22 2c 20 6e 45 6e 74 72 79 29 3b 0a  T %d", nEntry);.
2e20: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
2e30: 63 28 22 25 73 22 2c 20 62 6c 6f 62 5f 73 74 72  c("%s", blob_str
2e40: 28 26 73 71 6c 29 29 3b 0a 20 20 7d 0a 20 20 62  (&sql));.  }.  b
2e50: 6c 6f 62 5f 7a 65 72 6f 28 26 73 71 6c 29 3b 0a  lob_zero(&sql);.
2e60: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c    db_prepare(&q,
2e70: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
2e80: 74 69 6d 65 6c 69 6e 65 20 4f 52 44 45 52 20 42  timeline ORDER B
2e90: 59 20 74 69 6d 65 73 74 61 6d 70 20 44 45 53 43  Y timestamp DESC
2ea0: 22 29 3b 0a 20 20 40 20 3c 68 32 3e 25 62 28 26  ");.  @ <h2>%b(&
2eb0: 64 65 73 63 29 3c 2f 68 32 3e 0a 20 20 62 6c 6f  desc)</h2>.  blo
2ec0: 62 5f 72 65 73 65 74 28 26 64 65 73 63 29 3b 0a  b_reset(&desc);.
2ed0: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 73 63 72    blob_zero(&scr
2ee0: 69 70 74 49 6e 69 74 29 3b 0a 20 20 77 77 77 5f  iptInit);.  www_
2ef0: 70 72 69 6e 74 5f 74 69 6d 65 6c 69 6e 65 28 26  print_timeline(&
2f00: 71 2c 20 30 2c 20 30 2c 20 73 61 76 65 5f 70 61  q, 0, 0, save_pa
2f10: 72 65 6e 74 61 67 65 5f 6a 61 76 61 73 63 72 69  rentage_javascri
2f20: 70 74 2c 20 26 73 63 72 69 70 74 49 6e 69 74 29  pt, &scriptInit)
2f30: 3b 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28  ;.  db_finalize(
2f40: 26 71 29 3b 0a 20 20 40 20 3c 73 63 72 69 70 74  &q);.  @ <script
2f50: 3e 0a 20 20 40 20 76 61 72 20 70 61 72 65 6e 74  >.  @ var parent
2f60: 6f 66 20 3d 20 6e 65 77 20 4f 62 6a 65 63 74 28  of = new Object(
2f70: 29 3b 0a 20 20 40 20 76 61 72 20 63 68 69 6c 64  );.  @ var child
2f80: 6f 66 20 3d 20 6e 65 77 20 4f 62 6a 65 63 74 28  of = new Object(
2f90: 29 3b 0a 20 20 63 67 69 5f 61 70 70 65 6e 64 5f  );.  cgi_append_
2fa0: 63 6f 6e 74 65 6e 74 28 62 6c 6f 62 5f 62 75 66  content(blob_buf
2fb0: 66 65 72 28 26 73 63 72 69 70 74 49 6e 69 74 29  fer(&scriptInit)
2fc0: 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 73 63 72  , blob_size(&scr
2fd0: 69 70 74 49 6e 69 74 29 29 3b 0a 20 20 62 6c 6f  iptInit));.  blo
2fe0: 62 5f 72 65 73 65 74 28 26 73 63 72 69 70 74 49  b_reset(&scriptI
2ff0: 6e 69 74 29 3b 0a 20 20 40 20 66 75 6e 63 74 69  nit);.  @ functi
3000: 6f 6e 20 73 65 74 61 6c 6c 28 76 61 6c 75 65 29  on setall(value)
3010: 7b 0a 20 20 40 20 20 20 66 6f 72 28 76 61 72 20  {.  @   for(var 
3020: 78 20 69 6e 20 70 61 72 65 6e 74 6f 66 29 7b 0a  x in parentof){.
3030: 20 20 40 20 20 20 20 20 73 65 74 6f 6e 65 28 78    @     setone(x
3040: 2c 76 61 6c 75 65 29 3b 0a 20 20 40 20 20 20 7d  ,value);.  @   }
3050: 0a 20 20 40 20 7d 0a 20 20 40 20 73 65 74 61 6c  .  @ }.  @ setal
3060: 6c 28 22 23 66 66 66 66 66 66 22 29 3b 0a 20 20  l("#ffffff");.  
3070: 40 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 6f 6e  @ function seton
3080: 65 28 69 64 2c 20 63 6c 72 29 7b 0a 20 20 40 20  e(id, clr){.  @ 
3090: 20 20 69 66 28 20 70 61 72 65 6e 74 6f 66 5b 69    if( parentof[i
30a0: 64 5d 3d 3d 6e 75 6c 6c 20 29 20 72 65 74 75 72  d]==null ) retur
30b0: 6e 20 30 3b 0a 20 20 40 20 20 20 76 61 72 20 77  n 0;.  @   var w
30c0: 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45   = document.getE
30d0: 6c 65 6d 65 6e 74 42 79 49 64 28 69 64 29 3b 0a  lementById(id);.
30e0: 20 20 40 20 20 20 69 66 28 20 77 2e 73 74 79 6c    @   if( w.styl
30f0: 65 2e 63 6f 6c 6f 72 3d 3d 63 6c 72 20 29 7b 0a  e.color==clr ){.
3100: 20 20 40 20 20 20 20 20 72 65 74 75 72 6e 20 30    @     return 0
3110: 0a 20 20 40 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .  @   }else{.  
3120: 40 20 20 20 20 20 77 2e 73 74 79 6c 65 2e 63 6f  @     w.style.co
3130: 6c 6f 72 20 3d 20 63 6c 72 0a 20 20 40 20 20 20  lor = clr.  @   
3140: 20 20 72 65 74 75 72 6e 20 31 0a 20 20 40 20 20    return 1.  @  
3150: 20 7d 0a 20 20 40 20 7d 0a 20 20 40 20 66 75 6e   }.  @ }.  @ fun
3160: 63 74 69 6f 6e 20 78 69 6e 28 69 64 29 20 7b 0a  ction xin(id) {.
3170: 20 20 40 20 20 20 73 65 74 61 6c 6c 28 22 23 66    @   setall("#f
3180: 66 66 66 66 66 22 29 3b 0a 20 20 40 20 20 20 73  fffff");.  @   s
3190: 65 74 6f 6e 65 28 69 64 2c 22 23 66 66 30 30 30  etone(id,"#ff000
31a0: 30 22 29 3b 0a 20 20 40 20 20 20 73 65 74 5f 63  0");.  @   set_c
31b0: 68 69 6c 64 72 65 6e 28 69 64 2c 20 22 23 62 30  hildren(id, "#b0
31c0: 62 30 62 30 22 29 3b 0a 20 20 40 20 20 20 73 65  b0b0");.  @   se
31d0: 74 5f 70 61 72 65 6e 74 73 28 69 64 2c 20 22 23  t_parents(id, "#
31e0: 62 30 62 30 62 30 22 29 3b 0a 20 20 40 20 20 20  b0b0b0");.  @   
31f0: 66 6f 72 28 76 61 72 20 78 20 69 6e 20 70 61 72  for(var x in par
3200: 65 6e 74 6f 66 5b 69 64 5d 29 7b 0a 20 20 40 20  entof[id]){.  @ 
3210: 20 20 20 20 76 61 72 20 70 69 64 20 3d 20 70 61      var pid = pa
3220: 72 65 6e 74 6f 66 5b 69 64 5d 5b 78 5d 0a 20 20  rentof[id][x].  
3230: 40 20 20 20 20 20 76 61 72 20 77 20 3d 20 64 6f  @     var w = do
3240: 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e  cument.getElemen
3250: 74 42 79 49 64 28 70 69 64 29 3b 0a 20 20 40 20  tById(pid);.  @ 
3260: 20 20 20 20 69 66 28 20 77 21 3d 6e 75 6c 6c 20      if( w!=null 
3270: 29 7b 0a 20 20 40 20 20 20 20 20 20 20 77 2e 73  ){.  @       w.s
3280: 74 79 6c 65 2e 63 6f 6c 6f 72 20 3d 20 22 23 30  tyle.color = "#0
3290: 30 30 30 30 30 22 3b 0a 20 20 40 20 20 20 20 20  00000";.  @     
32a0: 7d 0a 20 20 40 20 20 20 7d 0a 20 20 40 20 20 20  }.  @   }.  @   
32b0: 66 6f 72 28 76 61 72 20 78 20 69 6e 20 63 68 69  for(var x in chi
32c0: 6c 64 6f 66 5b 69 64 5d 29 7b 0a 20 20 40 20 20  ldof[id]){.  @  
32d0: 20 20 20 76 61 72 20 63 69 64 20 3d 20 63 68 69     var cid = chi
32e0: 6c 64 6f 66 5b 69 64 5d 5b 78 5d 0a 20 20 40 20  ldof[id][x].  @ 
32f0: 20 20 20 20 76 61 72 20 77 20 3d 20 64 6f 63 75      var w = docu
3300: 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42  ment.getElementB
3310: 79 49 64 28 63 69 64 29 3b 0a 20 20 40 20 20 20  yId(cid);.  @   
3320: 20 20 69 66 28 20 77 21 3d 6e 75 6c 6c 20 29 7b    if( w!=null ){
3330: 0a 20 20 40 20 20 20 20 20 20 20 77 2e 73 74 79  .  @       w.sty
3340: 6c 65 2e 63 6f 6c 6f 72 20 3d 20 22 23 30 30 30  le.color = "#000
3350: 30 30 30 22 3b 0a 20 20 40 20 20 20 20 20 7d 0a  000";.  @     }.
3360: 20 20 40 20 20 20 7d 0a 20 20 40 20 7d 0a 20 20    @   }.  @ }.  
3370: 40 20 66 75 6e 63 74 69 6f 6e 20 78 6f 75 74 28  @ function xout(
3380: 69 64 29 20 7b 0a 20 20 40 20 20 20 2f 2a 20 73  id) {.  @   /* s
3390: 65 74 61 6c 6c 28 22 23 30 30 30 30 30 30 22 29  etall("#000000")
33a0: 3b 20 2a 2f 0a 20 20 40 20 7d 0a 20 20 40 20 66  ; */.  @ }.  @ f
33b0: 75 6e 63 74 69 6f 6e 20 73 65 74 5f 70 61 72 65  unction set_pare
33c0: 6e 74 73 28 69 64 2c 20 63 6c 72 29 7b 0a 20 20  nts(id, clr){.  
33d0: 40 20 20 20 76 61 72 20 70 6c 69 73 74 20 3d 20  @   var plist = 
33e0: 70 61 72 65 6e 74 6f 66 5b 69 64 5d 3b 0a 20 20  parentof[id];.  
33f0: 40 20 20 20 69 66 28 20 70 6c 69 73 74 3d 3d 6e  @   if( plist==n
3400: 75 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ull ) return;.  
3410: 40 20 20 20 66 6f 72 28 76 61 72 20 78 20 69 6e  @   for(var x in
3420: 20 70 6c 69 73 74 29 7b 0a 20 20 40 20 20 20 20   plist){.  @    
3430: 20 76 61 72 20 70 69 64 20 3d 20 70 6c 69 73 74   var pid = plist
3440: 5b 78 5d 3b 0a 20 20 40 20 20 20 20 20 69 66 28  [x];.  @     if(
3450: 20 73 65 74 6f 6e 65 28 70 69 64 2c 63 6c 72 29   setone(pid,clr)
3460: 3d 3d 31 20 29 7b 0a 20 20 40 20 20 20 20 20 20  ==1 ){.  @      
3470: 20 73 65 74 5f 70 61 72 65 6e 74 73 28 70 69 64   set_parents(pid
3480: 2c 63 6c 72 29 3b 0a 20 20 40 20 20 20 20 20 7d  ,clr);.  @     }
3490: 0a 20 20 40 20 20 20 7d 0a 20 20 40 20 7d 0a 20  .  @   }.  @ }. 
34a0: 20 40 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 5f   @ function set_
34b0: 63 68 69 6c 64 72 65 6e 28 69 64 2c 63 6c 72 29  children(id,clr)
34c0: 7b 0a 20 20 40 20 20 20 76 61 72 20 63 6c 69 73  {.  @   var clis
34d0: 74 20 3d 20 63 68 69 6c 64 6f 66 5b 69 64 5d 3b  t = childof[id];
34e0: 0a 20 20 40 20 20 20 69 66 28 20 63 6c 69 73 74  .  @   if( clist
34f0: 3d 3d 6e 75 6c 6c 20 29 20 72 65 74 75 72 6e 3b  ==null ) return;
3500: 0a 20 20 40 20 20 20 66 6f 72 28 76 61 72 20 78  .  @   for(var x
3510: 20 69 6e 20 63 6c 69 73 74 29 7b 0a 20 20 40 20   in clist){.  @ 
3520: 20 20 20 20 76 61 72 20 63 69 64 20 3d 20 63 6c      var cid = cl
3530: 69 73 74 5b 78 5d 3b 0a 20 20 40 20 20 20 20 20  ist[x];.  @     
3540: 69 66 28 20 73 65 74 6f 6e 65 28 63 69 64 2c 63  if( setone(cid,c
3550: 6c 72 29 3d 3d 31 20 29 7b 0a 20 20 40 20 20 20  lr)==1 ){.  @   
3560: 20 20 20 20 73 65 74 5f 63 68 69 6c 64 72 65 6e      set_children
3570: 28 63 69 64 2c 63 6c 72 29 3b 0a 20 20 40 20 20  (cid,clr);.  @  
3580: 20 20 20 7d 0a 20 20 40 20 20 20 7d 0a 20 20 40     }.  @   }.  @
3590: 20 7d 0a 20 20 40 20 3c 2f 73 63 72 69 70 74 3e   }.  @ </script>
35a0: 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28  .  style_footer(
35b0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 45 42  );.}.../*.** WEB
35c0: 50 41 47 45 3a 20 74 69 6d 65 6c 69 6e 65 0a 2a  PAGE: timeline.*
35d0: 2a 0a 2a 2a 20 51 75 65 72 79 20 70 61 72 61 6d  *.** Query param
35e0: 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  eters:.**.**    
35f0: 64 3d 53 54 41 52 54 44 41 54 45 20 20 20 20 64  d=STARTDATE    d
3600: 61 74 65 20 69 6e 20 69 73 6f 38 36 30 31 20 6e  ate in iso8601 n
3610: 6f 74 61 74 69 6f 6e 2e 20 20 20 20 20 20 20 20  otation.        
3620: 20 20 64 66 6c 74 3a 20 6e 65 77 65 73 74 20 65    dflt: newest e
3630: 76 65 6e 74 0a 2a 2a 20 20 20 20 6e 3d 49 4e 54  vent.**    n=INT
3640: 45 47 45 52 20 20 20 20 20 20 6e 75 6d 62 65 72  EGER      number
3650: 20 6f 66 20 65 76 65 6e 74 73 20 74 6f 20 73 68   of events to sh
3660: 6f 77 2e 20 20 20 20 20 20 20 20 20 20 64 66 6c  ow.          dfl
3670: 74 3a 20 32 35 0a 2a 2a 20 20 20 20 65 3d 49 4e  t: 25.**    e=IN
3680: 54 45 47 45 52 20 20 20 20 20 20 73 74 61 72 74  TEGER      start
3690: 69 6e 67 20 65 76 65 6e 74 20 69 64 2e 20 20 20  ing event id.   
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 66                df
36b0: 6c 74 3a 20 6e 69 6c 0a 2a 2a 20 20 20 20 75 3d  lt: nil.**    u=
36c0: 4e 41 4d 45 20 20 20 20 20 20 20 20 20 73 68 6f  NAME         sho
36d0: 77 20 6f 6e 6c 79 20 65 76 65 6e 74 73 20 66 72  w only events fr
36e0: 6f 6d 20 75 73 65 72 2e 20 20 20 20 20 20 20 20  om user.        
36f0: 64 66 6c 74 3a 20 6e 69 6c 0a 2a 2a 20 20 20 20  dflt: nil.**    
3700: 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  a              s
3710: 68 6f 77 20 65 76 65 6e 74 73 20 61 66 74 65 72  how events after
3720: 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 2e 20   and including. 
3730: 20 20 64 66 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a    dflt: false.**
3740: 20 20 20 20 72 20 20 20 20 20 20 20 20 20 20 20      r           
3750: 20 20 20 73 68 6f 77 20 6f 6e 6c 79 20 72 65 6c     show only rel
3760: 61 74 65 64 20 65 76 65 6e 74 73 2e 20 20 20 20  ated events.    
3770: 20 20 20 20 20 20 64 66 6c 74 3a 20 66 61 6c 73        dflt: fals
3780: 65 0a 2a 2a 20 20 20 20 79 3d 54 59 50 45 20 20  e.**    y=TYPE  
3790: 20 20 20 20 20 20 20 73 68 6f 77 20 6f 6e 6c 79         show only
37a0: 20 54 59 50 45 20 28 27 63 69 27 20 6f 72 20 27   TYPE ('ci' or '
37b0: 77 27 29 20 20 20 20 20 20 20 64 66 6c 74 3a 20  w')       dflt: 
37c0: 6e 69 6c 0a 2a 2a 20 20 20 20 73 20 20 20 20 20  nil.**    s     
37d0: 20 20 20 20 20 20 20 20 20 73 68 6f 77 20 74 68           show th
37e0: 65 20 53 51 4c 20 20 20 20 20 20 20 20 20 20 20  e SQL           
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 64 66 6c 74              dflt
3800: 3a 20 6e 69 6c 0a 2a 2f 0a 76 6f 69 64 20 70 61  : nil.*/.void pa
3810: 67 65 5f 74 69 6d 65 6c 69 6e 65 28 76 6f 69 64  ge_timeline(void
3820: 29 7b 0a 20 20 53 74 6d 74 20 71 3b 20 20 20 20  ){.  Stmt q;    
3830: 20 20 20 20 20 20 20 0a 20 20 42 6c 6f 62 20 73         .  Blob s
3840: 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
3850: 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
3860: 66 20 53 51 4c 20 75 73 65 64 20 74 6f 20 67 65  f SQL used to ge
3870: 6e 65 72 61 74 65 20 74 69 6d 65 6c 69 6e 65 20  nerate timeline 
3880: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 51 4c 3b  */.  char *zSQL;
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38a0: 20 20 2f 2a 20 52 65 6e 64 65 72 65 64 20 63 6f    /* Rendered co
38b0: 70 79 20 6f 66 20 73 71 6c 20 2a 2f 0a 20 20 42  py of sql */.  B
38c0: 6c 6f 62 20 73 63 72 69 70 74 49 6e 69 74 3b 0a  lob scriptInit;.
38d0: 20 20 63 68 61 72 20 7a 44 61 74 65 5b 31 30 30    char zDate[100
38e0: 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ];.  const char 
38f0: 2a 7a 53 74 61 72 74 20 3d 20 50 28 22 64 22 29  *zStart = P("d")
3900: 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  ;       /* Start
3910: 69 6e 67 20 64 61 74 65 20 2a 2f 0a 20 20 69 6e  ing date */.  in
3920: 74 20 6e 45 6e 74 72 79 20 3d 20 61 74 6f 69 28  t nEntry = atoi(
3930: 50 44 28 22 6e 22 2c 22 32 30 22 29 29 3b 20 20  PD("n","20"));  
3940: 20 2f 2a 20 4d 61 78 20 6e 75 6d 62 65 72 20 6f   /* Max number o
3950: 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 74 69 6d  f entries on tim
3960: 65 6c 69 6e 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  eline */.  const
3970: 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 50   char *zUser = P
3980: 28 22 75 22 29 3b 20 20 20 20 20 20 20 20 2f 2a  ("u");        /*
3990: 20 41 6c 6c 20 65 6e 74 72 69 65 73 20 62 79 20   All entries by 
39a0: 74 68 69 73 20 75 73 65 72 20 69 66 20 6e 6f 74  this user if not
39b0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 6f   NULL */.  int o
39c0: 62 6a 69 64 20 3d 20 61 74 6f 69 28 50 44 28 22  bjid = atoi(PD("
39d0: 65 22 2c 22 30 22 29 29 3b 20 20 20 20 20 2f 2a  e","0"));     /*
39e0: 20 45 6e 74 72 69 65 73 20 72 65 6c 61 74 65 64   Entries related
39f0: 20 74 6f 20 74 68 69 73 20 65 76 65 6e 74 20 2a   to this event *
3a00: 2f 0a 20 20 69 6e 74 20 72 65 6c 61 74 65 64 45  /.  int relatedE
3a10: 76 65 6e 74 73 20 3d 20 50 28 22 72 22 29 21 3d  vents = P("r")!=
3a20: 30 3b 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62  0;     /* Must b
3a30: 65 20 64 69 72 65 63 74 6c 79 20 72 65 6c 61 74  e directly relat
3a40: 65 64 20 74 6f 20 6f 66 20 6f 62 6a 69 64 20 2a  ed to of objid *
3a50: 2f 0a 20 20 69 6e 74 20 61 66 74 65 72 46 6c 61  /.  int afterFla
3a60: 67 20 3d 20 50 28 22 61 22 29 21 3d 30 3b 20 20  g = P("a")!=0;  
3a70: 20 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20         /* After 
3a80: 6f 62 6a 69 64 20 69 66 20 74 72 75 65 20 2a 2f  objid if true */
3a90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3aa0: 54 79 70 65 20 3d 20 50 28 22 79 22 29 3b 20 20  Type = P("y");  
3ab0: 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
3ac0: 20 65 76 65 6e 74 73 2e 20 20 41 6c 6c 20 69 66   events.  All if
3ad0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 66   NULL */.  int f
3ae0: 69 72 73 74 45 76 65 6e 74 3b 20 20 20 20 20 20  irstEvent;      
3af0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
3b00: 20 65 76 65 6e 74 20 64 69 73 70 6c 61 79 65 64   event displayed
3b10: 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45 76   */.  int lastEv
3b20: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
3b30: 20 20 20 2f 2a 20 4c 61 73 74 20 65 76 65 6e 74     /* Last event
3b40: 20 64 69 73 70 6c 61 79 65 64 20 2a 2f 0a 20 20   displayed */.  
3b50: 42 6c 6f 62 20 64 65 73 63 3b 20 20 20 20 20 20  Blob desc;      
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b70: 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 64  Human readable d
3b80: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
3b90: 65 20 74 69 6d 65 6c 69 6e 65 20 2a 2f 0a 20 20  e timeline */.  
3ba0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 54 79  const char *zETy
3bb0: 70 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pe;          /* 
3bc0: 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65  Human readable e
3bd0: 76 65 6e 74 20 74 79 70 65 20 2a 2f 0a 0a 20 20  vent type */..  
3be0: 2f 2a 20 54 6f 20 76 69 65 77 20 74 68 65 20 74  /* To view the t
3bf0: 69 6d 65 6c 69 6e 65 2c 20 6d 75 73 74 20 68 61  imeline, must ha
3c00: 76 65 20 70 65 72 6d 69 73 73 69 6f 6e 20 74 6f  ve permission to
3c10: 20 72 65 61 64 20 70 72 6f 6a 65 63 74 20 64 61   read project da
3c20: 74 61 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 67 69 6e  ta..  */.  login
3c30: 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61  _check_credentia
3c40: 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f  ls();.  if( !g.o
3c50: 6b 52 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e  kRead ){ login_n
3c60: 65 65 64 65 64 28 29 3b 20 72 65 74 75 72 6e 3b  eeded(); return;
3c70: 20 7d 0a 0a 20 20 73 74 79 6c 65 5f 68 65 61 64   }..  style_head
3c80: 65 72 28 22 54 69 6d 65 6c 69 6e 65 22 29 3b 0a  er("Timeline");.
3c90: 20 20 69 66 28 20 21 67 2e 6f 6b 48 69 73 74 6f    if( !g.okHisto
3ca0: 72 79 20 26 26 0a 20 20 20 20 20 20 64 62 5f 65  ry &&.      db_e
3cb0: 78 69 73 74 73 28 22 53 45 4c 45 43 54 20 31 20  xists("SELECT 1 
3cc0: 46 52 4f 4d 20 75 73 65 72 22 0a 20 20 20 20 20  FROM user".     
3cd0: 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
3ce0: 52 45 20 6c 6f 67 69 6e 3d 27 61 6e 6f 6e 79 6d  RE login='anonym
3cf0: 6f 75 73 27 22 0a 20 20 20 20 20 20 20 20 20 20  ous'".          
3d00: 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 63 61        "   AND ca
3d10: 70 20 4c 49 4b 45 20 27 25 25 68 25 25 27 22 29  p LIKE '%%h%%'")
3d20: 20 29 7b 0a 20 20 20 20 40 20 3c 70 3e 3c 62 3e   ){.    @ <p><b>
3d30: 4e 6f 74 65 3a 3c 2f 62 3e 20 59 6f 75 20 77 69  Note:</b> You wi
3d40: 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 61 63  ll be able to ac
3d50: 63 65 73 73 20 3c 75 3e 6d 75 63 68 3c 2f 75 3e  cess <u>much</u>
3d60: 20 6d 6f 72 65 0a 20 20 20 20 40 20 68 69 73 74   more.    @ hist
3d70: 6f 72 69 63 61 6c 20 69 6e 66 6f 72 6d 61 74 69  orical informati
3d80: 6f 6e 20 69 66 20 79 6f 75 20 3c 61 20 68 72 65  on if you <a hre
3d90: 66 3d 22 25 73 28 67 2e 7a 54 6f 70 29 2f 6c 6f  f="%s(g.zTop)/lo
3da0: 67 69 6e 22 3e 6c 6f 67 69 6e 3c 2f 61 3e 2e 3c  gin">login</a>.<
3db0: 2f 70 3e 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 7a  /p>.  }.  blob_z
3dc0: 65 72 6f 28 26 73 71 6c 29 3b 0a 20 20 62 6c 6f  ero(&sql);.  blo
3dd0: 62 5f 7a 65 72 6f 28 26 64 65 73 63 29 3b 0a 20  b_zero(&desc);. 
3de0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 73 71   blob_append(&sq
3df0: 6c 2c 20 74 69 6d 65 6c 69 6e 65 5f 71 75 65 72  l, timeline_quer
3e00: 79 5f 66 6f 72 5f 77 77 77 28 29 2c 20 2d 31 29  y_for_www(), -1)
3e10: 3b 0a 20 20 7a 45 54 79 70 65 20 3d 20 22 65 76  ;.  zEType = "ev
3e20: 65 6e 74 73 22 3b 0a 20 20 69 66 28 20 7a 54 79  ents";.  if( zTy
3e30: 70 65 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61  pe ){.    blob_a
3e40: 70 70 65 6e 64 66 28 26 73 71 6c 2c 20 22 20 41  ppendf(&sql, " A
3e50: 4e 44 20 65 76 65 6e 74 2e 74 79 70 65 3d 25 51  ND event.type=%Q
3e60: 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20 20 69  ", zType);.    i
3e70: 66 28 20 7a 54 79 70 65 5b 30 5d 3d 3d 27 63 27  f( zType[0]=='c'
3e80: 20 29 7b 0a 20 20 20 20 20 20 7a 45 54 79 70 65   ){.      zEType
3e90: 20 3d 20 22 63 68 65 63 6b 69 6e 73 22 3b 0a 20   = "checkins";. 
3ea0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 79     }else if( zTy
3eb0: 70 65 5b 30 5d 3d 3d 27 77 27 20 29 7b 0a 20 20  pe[0]=='w' ){.  
3ec0: 20 20 20 20 7a 45 54 79 70 65 20 3d 20 22 77 69      zEType = "wi
3ed0: 6b 69 20 65 64 69 74 73 22 3b 0a 20 20 20 20 7d  ki edits";.    }
3ee0: 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 61 70 70 65  .  }.  blob_appe
3ef0: 6e 64 66 28 26 64 65 73 63 2c 20 22 54 69 6d 65  ndf(&desc, "Time
3f00: 6c 69 6e 65 20 6f 66 20 75 70 20 74 6f 20 25 64  line of up to %d
3f10: 20 25 73 22 2c 20 6e 45 6e 74 72 79 2c 20 7a 45   %s", nEntry, zE
3f20: 54 79 70 65 29 3b 0a 20 20 69 66 28 20 7a 55 73  Type);.  if( zUs
3f30: 65 72 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61  er ){.    blob_a
3f40: 70 70 65 6e 64 66 28 26 73 71 6c 2c 20 22 20 41  ppendf(&sql, " A
3f50: 4e 44 20 65 76 65 6e 74 2e 75 73 65 72 3d 25 51  ND event.user=%Q
3f60: 22 2c 20 7a 55 73 65 72 29 3b 0a 20 20 20 20 62  ", zUser);.    b
3f70: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 64 65 73  lob_appendf(&des
3f80: 63 2c 20 22 20 62 79 20 75 73 65 72 20 25 68 22  c, " by user %h"
3f90: 2c 20 7a 55 73 65 72 29 3b 0a 20 20 7d 0a 20 20  , zUser);.  }.  
3fa0: 69 66 28 20 6f 62 6a 69 64 20 29 7b 0a 20 20 20  if( objid ){.   
3fb0: 20 63 68 61 72 20 2a 7a 20 3d 20 64 62 5f 74 65   char *z = db_te
3fc0: 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 64 61  xt(0, "SELECT da
3fd0: 74 65 74 69 6d 65 28 65 76 65 6e 74 2e 6d 74 69  tetime(event.mti
3fe0: 6d 65 2c 20 27 6c 6f 63 61 6c 74 69 6d 65 27 29  me, 'localtime')
3ff0: 20 46 52 4f 4d 20 65 76 65 6e 74 22 0a 20 20 20   FROM event".   
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4010: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 6f 62        " WHERE ob
4020: 6a 69 64 3d 25 64 22 2c 20 6f 62 6a 69 64 29 3b  jid=%d", objid);
4030: 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20  .    if( z ){.  
4040: 20 20 20 20 7a 53 74 61 72 74 20 3d 20 7a 3b 0a      zStart = z;.
4050: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
4060: 7a 53 74 61 72 74 20 29 7b 0a 20 20 20 20 77 68  zStart ){.    wh
4070: 69 6c 65 28 20 69 73 73 70 61 63 65 28 7a 53 74  ile( isspace(zSt
4080: 61 72 74 5b 30 5d 29 20 29 7b 20 7a 53 74 61 72  art[0]) ){ zStar
4090: 74 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a  t++; }.    if( z
40a0: 53 74 61 72 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Start[0] ){.    
40b0: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26    blob_appendf(&
40c0: 73 71 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 22  sql, .         "
40d0: 20 41 4e 44 20 65 76 65 6e 74 2e 6d 74 69 6d 65   AND event.mtime
40e0: 20 25 73 20 28 53 45 4c 45 43 54 20 6a 75 6c 69   %s (SELECT juli
40f0: 61 6e 64 61 79 28 25 51 2c 20 27 75 74 63 27 29  anday(%Q, 'utc')
4100: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
4110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66                af
4120: 74 65 72 46 6c 61 67 20 3f 20 22 3e 3d 22 20 3a  terFlag ? ">=" :
4130: 20 22 3c 3d 22 2c 20 7a 53 74 61 72 74 29 3b 0a   "<=", zStart);.
4140: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
4150: 64 66 28 26 64 65 73 63 2c 20 22 20 6f 63 63 75  df(&desc, " occu
4160: 72 72 69 6e 67 20 6f 6e 20 6f 72 20 25 73 20 25  rring on or %s %
4170: 68 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61 66  h",.          af
4180: 74 65 72 46 6c 61 67 20 3f 20 22 61 66 74 65 72  terFlag ? "after
4190: 22 3a 20 22 62 65 66 6f 72 65 22 2c 0a 20 20 20  ": "before",.   
41a0: 20 20 20 20 20 20 20 7a 53 74 61 72 74 29 3b 0a         zStart);.
41b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
41c0: 72 65 6c 61 74 65 64 45 76 65 6e 74 73 20 26 26  relatedEvents &&
41d0: 20 6f 62 6a 69 64 20 29 7b 0a 20 20 20 20 63 68   objid ){.    ch
41e0: 61 72 20 2a 7a 55 75 69 64 3b 0a 20 20 20 20 64  ar *zUuid;.    d
41f0: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20  b_multi_exec(.  
4200: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 45 4d       "CREATE TEM
4210: 50 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  P TABLE IF NOT E
4220: 58 49 53 54 53 20 6f 6b 28 72 69 64 20 49 4e 54  XISTS ok(rid INT
4230: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
4240: 29 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 55  )".    );.    zU
4250: 75 69 64 20 3d 20 64 62 5f 74 65 78 74 28 22 22  uid = db_text(""
4260: 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 46  , "SELECT uuid F
4270: 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72  ROM blob WHERE r
4280: 69 64 3d 25 64 22 2c 20 6f 62 6a 69 64 29 3b 0a  id=%d", objid);.
4290: 20 20 20 20 69 66 28 20 61 66 74 65 72 46 6c 61      if( afterFla
42a0: 67 20 29 7b 0a 20 20 20 20 20 20 63 6f 6d 70 75  g ){.      compu
42b0: 74 65 5f 64 65 73 63 65 6e 64 65 6e 74 73 28 6f  te_descendents(o
42c0: 62 6a 69 64 2c 20 6e 45 6e 74 72 79 29 3b 0a 20  bjid, nEntry);. 
42d0: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
42e0: 66 28 26 64 65 73 63 2c 0a 20 20 20 20 20 20 20  f(&desc,.       
42f0: 20 20 22 20 61 6e 64 20 64 65 63 65 6e 64 65 64    " and decended
4300: 20 66 72 6f 6d 20 3c 61 20 68 72 65 66 3d 27 25   from <a href='%
4310: 73 2f 76 69 6e 66 6f 2f 25 64 27 3e 5b 25 2e 31  s/vinfo/%d'>[%.1
4320: 30 73 5d 3c 2f 61 3e 22 2c 0a 20 20 20 20 20 20  0s]</a>",.      
4330: 20 20 20 67 2e 7a 42 61 73 65 55 52 4c 2c 20 6f     g.zBaseURL, o
4340: 62 6a 69 64 2c 20 7a 55 75 69 64 29 3b 0a 20 20  bjid, zUuid);.  
4350: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
4360: 6f 6d 70 75 74 65 5f 61 6e 63 65 73 74 6f 72 73  ompute_ancestors
4370: 28 6f 62 6a 69 64 2c 20 6e 45 6e 74 72 79 29 3b  (objid, nEntry);
4380: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  .      blob_appe
4390: 6e 64 66 28 26 64 65 73 63 2c 0a 20 20 20 20 20  ndf(&desc,.     
43a0: 20 20 20 20 22 20 61 6e 64 20 61 20 61 6e 63 65      " and a ance
43b0: 73 74 6f 72 20 6f 66 20 3c 61 20 68 72 65 66 3d  stor of <a href=
43c0: 27 25 73 2f 76 69 6e 66 6f 2f 25 64 27 3e 5b 25  '%s/vinfo/%d'>[%
43d0: 2e 31 30 73 5d 3c 2f 61 3e 22 2c 0a 20 20 20 20  .10s]</a>",.    
43e0: 20 20 20 20 20 67 2e 7a 42 61 73 65 55 52 4c 2c       g.zBaseURL,
43f0: 20 6f 62 6a 69 64 2c 20 7a 55 75 69 64 29 3b 0a   objid, zUuid);.
4400: 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 5f 61      }.    blob_a
4410: 70 70 65 6e 64 28 26 73 71 6c 2c 20 22 20 41 4e  ppend(&sql, " AN
4420: 44 20 65 76 65 6e 74 2e 6f 62 6a 69 64 20 49 4e  D event.objid IN
4430: 20 6f 6b 22 2c 20 2d 31 29 3b 0a 20 20 7d 0a 20   ok", -1);.  }. 
4440: 20 69 66 28 20 61 66 74 65 72 46 6c 61 67 20 29   if( afterFlag )
4450: 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e  {.    blob_appen
4460: 64 66 28 26 73 71 6c 2c 20 22 20 4f 52 44 45 52  df(&sql, " ORDER
4470: 20 42 59 20 65 76 65 6e 74 2e 6d 74 69 6d 65 20   BY event.mtime 
4480: 41 53 43 20 4c 49 4d 49 54 20 25 64 22 2c 0a 20  ASC LIMIT %d",. 
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44a0: 6e 45 6e 74 72 79 29 3b 0a 20 20 7d 65 6c 73 65  nEntry);.  }else
44b0: 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e  {.    blob_appen
44c0: 64 66 28 26 73 71 6c 2c 20 22 20 4f 52 44 45 52  df(&sql, " ORDER
44d0: 20 42 59 20 65 76 65 6e 74 2e 6d 74 69 6d 65 20   BY event.mtime 
44e0: 44 45 53 43 20 4c 49 4d 49 54 20 25 64 22 2c 0a  DESC LIMIT %d",.
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4500: 20 6e 45 6e 74 72 79 29 3b 0a 20 20 7d 0a 20 20   nEntry);.  }.  
4510: 7a 53 51 4c 20 3d 20 62 6c 6f 62 5f 73 74 72 28  zSQL = blob_str(
4520: 26 73 71 6c 29 3b 0a 20 20 69 66 28 20 61 66 74  &sql);.  if( aft
4530: 65 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 7a 53  erFlag ){.    zS
4540: 51 4c 20 3d 20 6d 70 72 69 6e 74 66 28 22 53 45  QL = mprintf("SE
4550: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 25 73 29  LECT * FROM (%s)
4560: 20 4f 52 44 45 52 20 42 59 20 74 69 6d 65 73 74   ORDER BY timest
4570: 61 6d 70 20 44 45 53 43 22 2c 20 7a 53 51 4c 29  amp DESC", zSQL)
4580: 3b 0a 20 20 7d 0a 20 20 64 62 5f 70 72 65 70 61  ;.  }.  db_prepa
4590: 72 65 28 26 71 2c 20 7a 53 51 4c 29 3b 0a 20 20  re(&q, zSQL);.  
45a0: 69 66 28 20 50 28 22 73 22 29 21 3d 30 20 29 7b  if( P("s")!=0 ){
45b0: 0a 20 20 20 20 40 20 3c 68 72 3e 3c 70 3e 25 68  .    @ <hr><p>%h
45c0: 28 7a 53 51 4c 29 3c 2f 70 3e 3c 68 72 3e 0a 20  (zSQL)</p><hr>. 
45d0: 20 7d 0a 20 20 40 20 3c 68 32 3e 25 62 28 26 64   }.  @ <h2>%b(&d
45e0: 65 73 63 29 3c 2f 68 32 3e 0a 20 20 62 6c 6f 62  esc)</h2>.  blob
45f0: 5f 72 65 73 65 74 28 26 64 65 73 63 29 3b 0a 20  _reset(&desc);. 
4600: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 73 71 6c 29   blob_zero(&sql)
4610: 3b 0a 20 20 69 66 28 20 61 66 74 65 72 46 6c 61  ;.  if( afterFla
4620: 67 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 53  g ){.    free(zS
4630: 51 4c 29 3b 0a 20 20 7d 0a 20 20 7a 44 61 74 65  QL);.  }.  zDate
4640: 5b 30 5d 20 3d 20 30 3b 0a 20 20 62 6c 6f 62 5f  [0] = 0;.  blob_
4650: 7a 65 72 6f 28 26 73 63 72 69 70 74 49 6e 69 74  zero(&scriptInit
4660: 29 3b 0a 20 20 7a 44 61 74 65 5b 30 5d 20 3d 20  );.  zDate[0] = 
4670: 30 3b 0a 20 20 77 77 77 5f 70 72 69 6e 74 5f 74  0;.  www_print_t
4680: 69 6d 65 6c 69 6e 65 28 26 71 2c 20 26 66 69 72  imeline(&q, &fir
4690: 73 74 45 76 65 6e 74 2c 20 26 6c 61 73 74 45 76  stEvent, &lastEv
46a0: 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ent,.           
46b0: 20 20 20 20 20 20 20 20 20 20 73 61 76 65 5f 70            save_p
46c0: 61 72 65 6e 74 61 67 65 5f 6a 61 76 61 73 63 72  arentage_javascr
46d0: 69 70 74 2c 20 26 73 63 72 69 70 74 49 6e 69 74  ipt, &scriptInit
46e0: 29 3b 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65  );.  db_finalize
46f0: 28 26 71 29 3b 0a 20 20 2f 2a 20 40 20 3c 70 3e  (&q);.  /* @ <p>
4700: 66 69 72 73 74 45 76 65 6e 74 3d 25 64 28 66 69  firstEvent=%d(fi
4710: 72 73 74 45 76 65 6e 74 29 20 6c 61 73 74 45 76  rstEvent) lastEv
4720: 65 6e 74 3d 25 64 28 6c 61 73 74 45 76 65 6e 74  ent=%d(lastEvent
4730: 29 3c 2f 70 3e 20 2a 2f 0a 20 20 69 66 28 20 7a  )</p> */.  if( z
4740: 53 74 61 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Start==0 ){.    
4750: 7a 53 74 61 72 74 20 3d 20 7a 44 61 74 65 3b 0a  zStart = zDate;.
4760: 20 20 7d 0a 20 20 40 20 3c 73 63 72 69 70 74 3e    }.  @ <script>
4770: 0a 20 20 40 20 76 61 72 20 70 61 72 65 6e 74 6f  .  @ var parento
4780: 66 20 3d 20 6e 65 77 20 4f 62 6a 65 63 74 28 29  f = new Object()
4790: 3b 0a 20 20 40 20 76 61 72 20 63 68 69 6c 64 6f  ;.  @ var childo
47a0: 66 20 3d 20 6e 65 77 20 4f 62 6a 65 63 74 28 29  f = new Object()
47b0: 3b 0a 20 20 63 67 69 5f 61 70 70 65 6e 64 5f 63  ;.  cgi_append_c
47c0: 6f 6e 74 65 6e 74 28 62 6c 6f 62 5f 62 75 66 66  ontent(blob_buff
47d0: 65 72 28 26 73 63 72 69 70 74 49 6e 69 74 29 2c  er(&scriptInit),
47e0: 20 62 6c 6f 62 5f 73 69 7a 65 28 26 73 63 72 69   blob_size(&scri
47f0: 70 74 49 6e 69 74 29 29 3b 0a 20 20 62 6c 6f 62  ptInit));.  blob
4800: 5f 72 65 73 65 74 28 26 73 63 72 69 70 74 49 6e  _reset(&scriptIn
4810: 69 74 29 3b 0a 20 20 40 20 66 75 6e 63 74 69 6f  it);.  @ functio
4820: 6e 20 73 65 74 61 6c 6c 28 76 61 6c 75 65 29 7b  n setall(value){
4830: 0a 20 20 40 20 20 20 66 6f 72 28 76 61 72 20 78  .  @   for(var x
4840: 20 69 6e 20 70 61 72 65 6e 74 6f 66 29 7b 0a 20   in parentof){. 
4850: 20 40 20 20 20 20 20 73 65 74 6f 6e 65 28 78 2c   @     setone(x,
4860: 76 61 6c 75 65 29 3b 0a 20 20 40 20 20 20 7d 0a  value);.  @   }.
4870: 20 20 40 20 7d 0a 20 20 40 20 73 65 74 61 6c 6c    @ }.  @ setall
4880: 28 22 23 66 66 66 66 66 66 22 29 3b 0a 20 20 40  ("#ffffff");.  @
4890: 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 6f 6e 65   function setone
48a0: 28 69 64 2c 20 63 6c 72 29 7b 0a 20 20 40 20 20  (id, clr){.  @  
48b0: 20 69 66 28 20 70 61 72 65 6e 74 6f 66 5b 69 64   if( parentof[id
48c0: 5d 3d 3d 6e 75 6c 6c 20 29 20 72 65 74 75 72 6e  ]==null ) return
48d0: 20 30 3b 0a 20 20 40 20 20 20 76 61 72 20 77 20   0;.  @   var w 
48e0: 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c  = document.getEl
48f0: 65 6d 65 6e 74 42 79 49 64 28 69 64 29 3b 0a 20  ementById(id);. 
4900: 20 40 20 20 20 69 66 28 20 77 2e 73 74 79 6c 65   @   if( w.style
4910: 2e 63 6f 6c 6f 72 3d 3d 63 6c 72 20 29 7b 0a 20  .color==clr ){. 
4920: 20 40 20 20 20 20 20 72 65 74 75 72 6e 20 30 0a   @     return 0.
4930: 20 20 40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 40    @   }else{.  @
4940: 20 20 20 20 20 77 2e 73 74 79 6c 65 2e 63 6f 6c       w.style.col
4950: 6f 72 20 3d 20 63 6c 72 0a 20 20 40 20 20 20 20  or = clr.  @    
4960: 20 72 65 74 75 72 6e 20 31 0a 20 20 40 20 20 20   return 1.  @   
4970: 7d 0a 20 20 40 20 7d 0a 20 20 40 20 66 75 6e 63  }.  @ }.  @ func
4980: 74 69 6f 6e 20 78 69 6e 28 69 64 29 20 7b 0a 20  tion xin(id) {. 
4990: 20 40 20 20 20 73 65 74 61 6c 6c 28 22 23 66 66   @   setall("#ff
49a0: 66 66 66 66 22 29 3b 0a 20 20 40 20 20 20 73 65  ffff");.  @   se
49b0: 74 6f 6e 65 28 69 64 2c 22 23 66 66 30 30 30 30  tone(id,"#ff0000
49c0: 22 29 3b 0a 20 20 40 20 20 20 73 65 74 5f 63 68  ");.  @   set_ch
49d0: 69 6c 64 72 65 6e 28 69 64 2c 20 22 23 62 30 62  ildren(id, "#b0b
49e0: 30 62 30 22 29 3b 0a 20 20 40 20 20 20 73 65 74  0b0");.  @   set
49f0: 5f 70 61 72 65 6e 74 73 28 69 64 2c 20 22 23 62  _parents(id, "#b
4a00: 30 62 30 62 30 22 29 3b 0a 20 20 40 20 20 20 66  0b0b0");.  @   f
4a10: 6f 72 28 76 61 72 20 78 20 69 6e 20 70 61 72 65  or(var x in pare
4a20: 6e 74 6f 66 5b 69 64 5d 29 7b 0a 20 20 40 20 20  ntof[id]){.  @  
4a30: 20 20 20 76 61 72 20 70 69 64 20 3d 20 70 61 72     var pid = par
4a40: 65 6e 74 6f 66 5b 69 64 5d 5b 78 5d 0a 20 20 40  entof[id][x].  @
4a50: 20 20 20 20 20 76 61 72 20 77 20 3d 20 64 6f 63       var w = doc
4a60: 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74  ument.getElement
4a70: 42 79 49 64 28 70 69 64 29 3b 0a 20 20 40 20 20  ById(pid);.  @  
4a80: 20 20 20 69 66 28 20 77 21 3d 6e 75 6c 6c 20 29     if( w!=null )
4a90: 7b 0a 20 20 40 20 20 20 20 20 20 20 77 2e 73 74  {.  @       w.st
4aa0: 79 6c 65 2e 63 6f 6c 6f 72 20 3d 20 22 23 30 30  yle.color = "#00
4ab0: 30 30 30 30 22 3b 0a 20 20 40 20 20 20 20 20 7d  0000";.  @     }
4ac0: 0a 20 20 40 20 20 20 7d 0a 20 20 40 20 20 20 66  .  @   }.  @   f
4ad0: 6f 72 28 76 61 72 20 78 20 69 6e 20 63 68 69 6c  or(var x in chil
4ae0: 64 6f 66 5b 69 64 5d 29 7b 0a 20 20 40 20 20 20  dof[id]){.  @   
4af0: 20 20 76 61 72 20 63 69 64 20 3d 20 63 68 69 6c    var cid = chil
4b00: 64 6f 66 5b 69 64 5d 5b 78 5d 0a 20 20 40 20 20  dof[id][x].  @  
4b10: 20 20 20 76 61 72 20 77 20 3d 20 64 6f 63 75 6d     var w = docum
4b20: 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79  ent.getElementBy
4b30: 49 64 28 63 69 64 29 3b 0a 20 20 40 20 20 20 20  Id(cid);.  @    
4b40: 20 69 66 28 20 77 21 3d 6e 75 6c 6c 20 29 7b 0a   if( w!=null ){.
4b50: 20 20 40 20 20 20 20 20 20 20 77 2e 73 74 79 6c    @       w.styl
4b60: 65 2e 63 6f 6c 6f 72 20 3d 20 22 23 30 30 30 30  e.color = "#0000
4b70: 30 30 22 3b 0a 20 20 40 20 20 20 20 20 7d 0a 20  00";.  @     }. 
4b80: 20 40 20 20 20 7d 0a 20 20 40 20 7d 0a 20 20 40   @   }.  @ }.  @
4b90: 20 66 75 6e 63 74 69 6f 6e 20 78 6f 75 74 28 69   function xout(i
4ba0: 64 29 20 7b 0a 20 20 40 20 20 20 2f 2a 20 73 65  d) {.  @   /* se
4bb0: 74 61 6c 6c 28 22 23 30 30 30 30 30 30 22 29 3b  tall("#000000");
4bc0: 20 2a 2f 0a 20 20 40 20 7d 0a 20 20 40 20 66 75   */.  @ }.  @ fu
4bd0: 6e 63 74 69 6f 6e 20 73 65 74 5f 70 61 72 65 6e  nction set_paren
4be0: 74 73 28 69 64 2c 20 63 6c 72 29 7b 0a 20 20 40  ts(id, clr){.  @
4bf0: 20 20 20 76 61 72 20 70 6c 69 73 74 20 3d 20 70     var plist = p
4c00: 61 72 65 6e 74 6f 66 5b 69 64 5d 3b 0a 20 20 40  arentof[id];.  @
4c10: 20 20 20 69 66 28 20 70 6c 69 73 74 3d 3d 6e 75     if( plist==nu
4c20: 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 40  ll ) return;.  @
4c30: 20 20 20 66 6f 72 28 76 61 72 20 78 20 69 6e 20     for(var x in 
4c40: 70 6c 69 73 74 29 7b 0a 20 20 40 20 20 20 20 20  plist){.  @     
4c50: 76 61 72 20 70 69 64 20 3d 20 70 6c 69 73 74 5b  var pid = plist[
4c60: 78 5d 3b 0a 20 20 40 20 20 20 20 20 69 66 28 20  x];.  @     if( 
4c70: 73 65 74 6f 6e 65 28 70 69 64 2c 63 6c 72 29 3d  setone(pid,clr)=
4c80: 3d 31 20 29 7b 0a 20 20 40 20 20 20 20 20 20 20  =1 ){.  @       
4c90: 73 65 74 5f 70 61 72 65 6e 74 73 28 70 69 64 2c  set_parents(pid,
4ca0: 63 6c 72 29 3b 0a 20 20 40 20 20 20 20 20 7d 0a  clr);.  @     }.
4cb0: 20 20 40 20 20 20 7d 0a 20 20 40 20 7d 0a 20 20    @   }.  @ }.  
4cc0: 40 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 5f 63  @ function set_c
4cd0: 68 69 6c 64 72 65 6e 28 69 64 2c 63 6c 72 29 7b  hildren(id,clr){
4ce0: 0a 20 20 40 20 20 20 76 61 72 20 63 6c 69 73 74  .  @   var clist
4cf0: 20 3d 20 63 68 69 6c 64 6f 66 5b 69 64 5d 3b 0a   = childof[id];.
4d00: 20 20 40 20 20 20 69 66 28 20 63 6c 69 73 74 3d    @   if( clist=
4d10: 3d 6e 75 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a  =null ) return;.
4d20: 20 20 40 20 20 20 66 6f 72 28 76 61 72 20 78 20    @   for(var x 
4d30: 69 6e 20 63 6c 69 73 74 29 7b 0a 20 20 40 20 20  in clist){.  @  
4d40: 20 20 20 76 61 72 20 63 69 64 20 3d 20 63 6c 69     var cid = cli
4d50: 73 74 5b 78 5d 3b 0a 20 20 40 20 20 20 20 20 69  st[x];.  @     i
4d60: 66 28 20 73 65 74 6f 6e 65 28 63 69 64 2c 63 6c  f( setone(cid,cl
4d70: 72 29 3d 3d 31 20 29 7b 0a 20 20 40 20 20 20 20  r)==1 ){.  @    
4d80: 20 20 20 73 65 74 5f 63 68 69 6c 64 72 65 6e 28     set_children(
4d90: 63 69 64 2c 63 6c 72 29 3b 0a 20 20 40 20 20 20  cid,clr);.  @   
4da0: 20 20 7d 0a 20 20 40 20 20 20 7d 0a 20 20 40 20    }.  @   }.  @ 
4db0: 7d 0a 20 20 40 20 3c 2f 73 63 72 69 70 74 3e 0a  }.  @ </script>.
4dc0: 20 20 40 20 3c 68 72 3e 0a 20 20 40 20 3c 66 6f    @ <hr>.  @ <fo
4dd0: 72 6d 20 6d 65 74 68 6f 64 3d 22 47 45 54 22 20  rm method="GET" 
4de0: 61 63 74 69 6f 6e 3d 22 25 73 28 67 2e 7a 42 61  action="%s(g.zBa
4df0: 73 65 55 52 4c 29 2f 74 69 6d 65 6c 69 6e 65 22  seURL)/timeline"
4e00: 3e 0a 20 20 40 20 53 74 61 72 74 20 44 61 74 65  >.  @ Start Date
4e10: 3a 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70  :.  @ <input typ
4e20: 65 3d 22 74 65 78 74 22 20 73 69 7a 65 3d 22 33  e="text" size="3
4e30: 30 22 20 76 61 6c 75 65 3d 22 25 68 28 7a 53 74  0" value="%h(zSt
4e40: 61 72 74 29 22 20 6e 61 6d 65 3d 22 64 22 3e 0a  art)" name="d">.
4e50: 20 20 40 20 4e 75 6d 62 65 72 20 4f 66 20 45 6e    @ Number Of En
4e60: 74 72 69 65 73 3a 20 20 0a 20 20 40 20 3c 69 6e  tries:  .  @ <in
4e70: 70 75 74 20 74 79 70 65 3d 22 74 65 78 74 22 20  put type="text" 
4e80: 73 69 7a 65 3d 22 34 22 20 76 61 6c 75 65 3d 22  size="4" value="
4e90: 25 64 28 6e 45 6e 74 72 79 29 22 20 6e 61 6d 65  %d(nEntry)" name
4ea0: 3d 22 6e 22 3e 0a 20 20 40 20 3c 62 72 3e 3c 69  ="n">.  @ <br><i
4eb0: 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69  nput type="submi
4ec0: 74 22 20 76 61 6c 75 65 3d 22 53 75 62 6d 69 74  t" value="Submit
4ed0: 22 3e 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20  ">.  @ </form>. 
4ee0: 20 40 20 3c 74 61 62 6c 65 3e 3c 74 72 3e 3c 74   @ <table><tr><t
4ef0: 64 3e 0a 20 20 40 20 3c 66 6f 72 6d 20 6d 65 74  d>.  @ <form met
4f00: 68 6f 64 3d 22 47 45 54 22 20 61 63 74 69 6f 6e  hod="GET" action
4f10: 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29  ="%s(g.zBaseURL)
4f20: 2f 74 69 6d 65 6c 69 6e 65 22 3e 0a 20 20 40 20  /timeline">.  @ 
4f30: 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 68 69 64  <input type="hid
4f40: 64 65 6e 22 20 76 61 6c 75 65 3d 22 25 64 28 6c  den" value="%d(l
4f50: 61 73 74 45 76 65 6e 74 29 22 20 6e 61 6d 65 3d  astEvent)" name=
4f60: 22 65 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20  "e">.  @ <input 
4f70: 74 79 70 65 3d 22 68 69 64 64 65 6e 22 20 76 61  type="hidden" va
4f80: 6c 75 65 3d 22 25 64 28 6e 45 6e 74 72 79 29 22  lue="%d(nEntry)"
4f90: 20 6e 61 6d 65 3d 22 6e 22 3e 0a 20 20 40 20 3c   name="n">.  @ <
4fa0: 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d  input type="subm
4fb0: 69 74 22 20 76 61 6c 75 65 3d 22 4e 65 78 74 20  it" value="Next 
4fc0: 25 64 28 6e 45 6e 74 72 79 29 20 52 6f 77 73 22  %d(nEntry) Rows"
4fd0: 3e 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 3c 2f 74  >.  @ </form></t
4fe0: 64 3e 3c 74 64 3e 0a 20 20 40 20 3c 66 6f 72 6d  d><td>.  @ <form
4ff0: 20 6d 65 74 68 6f 64 3d 22 47 45 54 22 20 61 63   method="GET" ac
5000: 74 69 6f 6e 3d 22 25 73 28 67 2e 7a 42 61 73 65  tion="%s(g.zBase
5010: 55 52 4c 29 2f 74 69 6d 65 6c 69 6e 65 22 3e 0a  URL)/timeline">.
5020: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
5030: 22 68 69 64 64 65 6e 22 20 76 61 6c 75 65 3d 22  "hidden" value="
5040: 25 64 28 66 69 72 73 74 45 76 65 6e 74 29 22 20  %d(firstEvent)" 
5050: 6e 61 6d 65 3d 22 65 22 3e 0a 20 20 40 20 3c 69  name="e">.  @ <i
5060: 6e 70 75 74 20 74 79 70 65 3d 22 68 69 64 64 65  nput type="hidde
5070: 6e 22 20 76 61 6c 75 65 3d 22 25 64 28 6e 45 6e  n" value="%d(nEn
5080: 74 72 79 29 22 20 6e 61 6d 65 3d 22 6e 22 3e 0a  try)" name="n">.
5090: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
50a0: 22 68 69 64 64 65 6e 22 20 76 61 6c 75 65 3d 22  "hidden" value="
50b0: 31 22 20 6e 61 6d 65 3d 22 61 22 3e 0a 20 20 40  1" name="a">.  @
50c0: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75   <input type="su
50d0: 62 6d 69 74 22 20 76 61 6c 75 65 3d 22 50 72 65  bmit" value="Pre
50e0: 76 69 6f 75 73 20 25 64 28 6e 45 6e 74 72 79 29  vious %d(nEntry)
50f0: 20 52 6f 77 73 22 3e 0a 20 20 40 20 3c 2f 66 6f   Rows">.  @ </fo
5100: 72 6d 3e 3c 2f 74 64 3e 3c 2f 74 72 3e 3c 2f 74  rm></td></tr></t
5110: 61 62 6c 65 3e 0a 20 20 73 74 79 6c 65 5f 66 6f  able>.  style_fo
5120: 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  oter();.}../*.**
5130: 20 54 68 65 20 69 6e 70 75 74 20 71 75 65 72 79   The input query
5140: 20 71 20 73 65 6c 65 63 74 73 20 76 61 72 69 6f   q selects vario
5150: 75 73 20 72 65 63 6f 72 64 73 2e 20 20 50 72 69  us records.  Pri
5160: 6e 74 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61  nt a human-reada
5170: 62 6c 65 0a 2a 2a 20 73 75 6d 6d 61 72 79 20 6f  ble.** summary o
5180: 66 20 74 68 6f 73 65 20 72 65 63 6f 72 64 73 2e  f those records.
5190: 0a 2a 2a 0a 2a 2a 20 4c 69 6d 69 74 20 74 68 65  .**.** Limit the
51a0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
51b0: 65 73 20 70 72 69 6e 74 65 64 20 74 6f 20 6e 4c  es printed to nL
51c0: 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  ine..** .** The 
51d0: 71 75 65 72 79 20 73 68 6f 75 6c 64 20 72 65 74  query should ret
51e0: 75 72 6e 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e  urn these column
51f0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 30 2e 20 20  s:.**.**    0.  
5200: 72 69 64 0a 2a 2a 20 20 20 20 31 2e 20 20 75 75  rid.**    1.  uu
5210: 69 64 0a 2a 2a 20 20 20 20 32 2e 20 20 44 61 74  id.**    2.  Dat
5220: 65 2f 54 69 6d 65 0a 2a 2a 20 20 20 20 33 2e 20  e/Time.**    3. 
5230: 20 43 6f 6d 6d 65 6e 74 20 73 74 72 69 6e 67 20   Comment string 
5240: 61 6e 64 20 75 73 65 72 0a 2a 2a 20 20 20 20 34  and user.**    4
5250: 2e 20 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e  .  Number of non
5260: 2d 6d 65 72 67 65 20 63 68 69 6c 64 72 65 6e 0a  -merge children.
5270: 2a 2a 20 20 20 20 35 2e 20 20 4e 75 6d 62 65 72  **    5.  Number
5280: 20 6f 66 20 70 61 72 65 6e 74 73 0a 2a 2f 0a 76   of parents.*/.v
5290: 6f 69 64 20 70 72 69 6e 74 5f 74 69 6d 65 6c 69  oid print_timeli
52a0: 6e 65 28 53 74 6d 74 20 2a 71 2c 20 69 6e 74 20  ne(Stmt *q, int 
52b0: 6d 78 4c 69 6e 65 29 7b 0a 20 20 69 6e 74 20 6e  mxLine){.  int n
52c0: 4c 69 6e 65 20 3d 20 30 3b 0a 20 20 63 68 61 72  Line = 0;.  char
52d0: 20 7a 50 72 65 76 44 61 74 65 5b 32 30 5d 3b 0a   zPrevDate[20];.
52e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
52f0: 75 72 72 65 6e 74 55 75 69 64 3d 30 3b 0a 20 20  urrentUuid=0;.  
5300: 53 74 6d 74 20 63 75 72 72 65 6e 74 51 3b 0a 20  Stmt currentQ;. 
5310: 20 69 6e 74 20 72 69 64 20 3d 20 64 62 5f 6c 67   int rid = db_lg
5320: 65 74 5f 69 6e 74 28 22 63 68 65 63 6b 6f 75 74  et_int("checkout
5330: 22 2c 20 30 29 3b 0a 20 20 7a 50 72 65 76 44 61  ", 0);.  zPrevDa
5340: 74 65 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 64 62  te[0] = 0;..  db
5350: 5f 70 72 65 70 61 72 65 28 26 63 75 72 72 65 6e  _prepare(&curren
5360: 74 51 2c 0a 20 20 20 20 22 53 45 4c 45 43 54 20  tQ,.    "SELECT 
5370: 75 75 69 64 22 0a 20 20 20 20 22 20 20 46 52 4f  uuid".    "  FRO
5380: 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64  M blob WHERE rid
5390: 3d 25 64 22 2c 20 72 69 64 0a 20 20 29 3b 0a 20  =%d", rid.  );. 
53a0: 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 63 75   if( db_step(&cu
53b0: 72 72 65 6e 74 51 29 3d 3d 53 51 4c 49 54 45 5f  rrentQ)==SQLITE_
53c0: 52 4f 57 20 29 7b 0a 20 20 20 20 7a 43 75 72 72  ROW ){.    zCurr
53d0: 65 6e 74 55 75 69 64 20 3d 20 64 62 5f 63 6f 6c  entUuid = db_col
53e0: 75 6d 6e 5f 74 65 78 74 28 26 63 75 72 72 65 6e  umn_text(&curren
53f0: 74 51 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 77  tQ, 0);.  }..  w
5400: 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 71 29  hile( db_step(q)
5410: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26 26 20  ==SQLITE_ROW && 
5420: 6e 4c 69 6e 65 3c 3d 6d 78 4c 69 6e 65 20 29 7b  nLine<=mxLine ){
5430: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
5440: 2a 7a 49 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  *zId = db_column
5450: 5f 74 65 78 74 28 71 2c 20 31 29 3b 0a 20 20 20  _text(q, 1);.   
5460: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
5470: 74 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  te = db_column_t
5480: 65 78 74 28 71 2c 20 32 29 3b 0a 20 20 20 20 63  ext(q, 2);.    c
5490: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 20  onst char *zCom 
54a0: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
54b0: 28 71 2c 20 33 29 3b 0a 20 20 20 20 69 6e 74 20  (q, 3);.    int 
54c0: 6e 43 68 69 6c 64 20 3d 20 64 62 5f 63 6f 6c 75  nChild = db_colu
54d0: 6d 6e 5f 69 6e 74 28 71 2c 20 34 29 3b 0a 20 20  mn_int(q, 4);.  
54e0: 20 20 69 6e 74 20 6e 50 61 72 65 6e 74 20 3d 20    int nParent = 
54f0: 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 71 2c  db_column_int(q,
5500: 20 35 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   5);.    char *z
5510: 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Free = 0;.    in
5520: 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  t n = 0;.    cha
5530: 72 20 7a 50 72 65 66 69 78 5b 38 30 5d 3b 0a 20  r zPrefix[80];. 
5540: 20 20 20 63 68 61 72 20 7a 55 75 69 64 5b 55 55     char zUuid[UU
5550: 49 44 5f 53 49 5a 45 2b 31 5d 3b 0a 20 20 20 20  ID_SIZE+1];.    
5560: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 55 75  .    sprintf(zUu
5570: 69 64 2c 20 22 25 2e 31 30 73 22 2c 20 7a 49 64  id, "%.10s", zId
5580: 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  );.    if( memcm
5590: 70 28 7a 44 61 74 65 2c 20 7a 50 72 65 76 44 61  p(zDate, zPrevDa
55a0: 74 65 2c 20 31 30 29 20 29 7b 0a 20 20 20 20 20  te, 10) ){.     
55b0: 20 70 72 69 6e 74 66 28 22 3d 3d 3d 20 25 2e 31   printf("=== %.1
55c0: 30 73 20 3d 3d 3d 5c 6e 22 2c 20 7a 44 61 74 65  0s ===\n", zDate
55d0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
55e0: 7a 50 72 65 76 44 61 74 65 2c 20 7a 44 61 74 65  zPrevDate, zDate
55f0: 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 6e 4c 69  , 10);.      nLi
5600: 6e 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ne++;.    }.    
5610: 69 66 28 20 7a 43 6f 6d 3d 3d 30 20 29 20 7a 43  if( zCom==0 ) zC
5620: 6f 6d 20 3d 20 22 22 3b 0a 20 20 20 20 70 72 69  om = "";.    pri
5630: 6e 74 66 28 22 25 2e 38 73 20 22 2c 20 26 7a 44  ntf("%.8s ", &zD
5640: 61 74 65 5b 31 31 5d 29 3b 0a 20 20 20 20 7a 50  ate[11]);.    zP
5650: 72 65 66 69 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  refix[0] = 0;.  
5660: 20 20 69 66 28 20 6e 50 61 72 65 6e 74 3e 31 20    if( nParent>1 
5670: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5680: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
5690: 28 7a 50 72 65 66 69 78 29 2c 20 7a 50 72 65 66  (zPrefix), zPref
56a0: 69 78 2c 20 22 2a 4d 45 52 47 45 2a 20 22 29 3b  ix, "*MERGE* ");
56b0: 0a 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65  .      n = strle
56c0: 6e 28 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20  n(zPrefix);.    
56d0: 7d 0a 20 20 20 20 69 66 28 20 6e 43 68 69 6c 64  }.    if( nChild
56e0: 3e 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >1 ){.      sqli
56f0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
5700: 65 6f 66 28 7a 50 72 65 66 69 78 29 2d 6e 2c 20  eof(zPrefix)-n, 
5710: 26 7a 50 72 65 66 69 78 5b 6e 5d 2c 20 22 2a 46  &zPrefix[n], "*F
5720: 4f 52 4b 2a 20 22 29 3b 0a 20 20 20 20 20 20 6e  ORK* ");.      n
5730: 20 3d 20 73 74 72 6c 65 6e 28 7a 50 72 65 66 69   = strlen(zPrefi
5740: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  x);.    }.    if
5750: 28 20 73 74 72 63 6d 70 28 7a 43 75 72 72 65 6e  ( strcmp(zCurren
5760: 74 55 75 69 64 2c 7a 49 64 29 3d 3d 30 20 29 7b  tUuid,zId)==0 ){
5770: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
5780: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
5790: 50 72 65 66 69 78 29 2d 6e 2c 20 26 7a 50 72 65  Prefix)-n, &zPre
57a0: 66 69 78 5b 6e 5d 2c 20 22 2a 43 55 52 52 45 4e  fix[n], "*CURREN
57b0: 54 2a 20 22 29 3b 0a 20 20 20 20 20 20 6e 20 2b  T* ");.      n +
57c0: 3d 20 73 74 72 6c 65 6e 28 7a 50 72 65 66 69 78  = strlen(zPrefix
57d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 72  );.    }.    zFr
57e0: 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ee = sqlite3_mpr
57f0: 69 6e 74 66 28 22 5b 25 2e 31 30 73 5d 20 25 73  intf("[%.10s] %s
5800: 25 73 22 2c 20 7a 55 75 69 64 2c 20 7a 50 72 65  %s", zUuid, zPre
5810: 66 69 78 2c 20 7a 43 6f 6d 29 3b 0a 20 20 20 20  fix, zCom);.    
5820: 6e 4c 69 6e 65 20 2b 3d 20 63 6f 6d 6d 65 6e 74  nLine += comment
5830: 5f 70 72 69 6e 74 28 7a 46 72 65 65 2c 20 39 2c  _print(zFree, 9,
5840: 20 37 39 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   79);.    sqlite
5850: 33 5f 66 72 65 65 28 7a 46 72 65 65 29 3b 0a 20  3_free(zFree);. 
5860: 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65   }.  db_finalize
5870: 28 26 63 75 72 72 65 6e 74 51 29 3b 0a 7d 0a 0a  (&currentQ);.}..
5880: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
5890: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74  ointer to a stat
58a0: 69 63 20 73 74 72 69 6e 67 20 74 68 61 74 20 66  ic string that f
58b0: 6f 72 6d 73 20 74 68 65 20 62 61 73 69 73 20 66  orms the basis f
58c0: 6f 72 0a 2a 2a 20 61 20 74 69 6d 65 6c 69 6e 65  or.** a timeline
58d0: 20 71 75 65 72 79 20 66 6f 72 20 64 69 73 70 6c   query for displ
58e0: 61 79 20 6f 6e 20 61 20 54 54 59 2e 0a 2a 2f 0a  ay on a TTY..*/.
58f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 69 6d 65  const char *time
5900: 6c 69 6e 65 5f 71 75 65 72 79 5f 66 6f 72 5f 74  line_query_for_t
5910: 74 79 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  ty(void){.  stat
5920: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 42  ic const char zB
5930: 61 73 65 53 71 6c 5b 5d 20 3d 20 0a 20 20 20 20  aseSql[] = .    
5940: 40 20 53 45 4c 45 43 54 0a 20 20 20 20 40 20 20  @ SELECT.    @  
5950: 20 62 6c 6f 62 2e 72 69 64 2c 0a 20 20 20 20 40   blob.rid,.    @
5960: 20 20 20 75 75 69 64 2c 0a 20 20 20 20 40 20 20     uuid,.    @  
5970: 20 64 61 74 65 74 69 6d 65 28 65 76 65 6e 74 2e   datetime(event.
5980: 6d 74 69 6d 65 2c 27 6c 6f 63 61 6c 74 69 6d 65  mtime,'localtime
5990: 27 29 2c 0a 20 20 20 20 40 20 20 20 63 6f 61 6c  '),.    @   coal
59a0: 65 73 63 65 28 65 63 6f 6d 6d 65 6e 74 2c 63 6f  esce(ecomment,co
59b0: 6d 6d 65 6e 74 29 20 7c 7c 20 27 20 28 62 79 20  mment) || ' (by 
59c0: 27 20 7c 7c 20 63 6f 61 6c 65 73 63 65 28 65 75  ' || coalesce(eu
59d0: 73 65 72 2c 75 73 65 72 2c 27 3f 27 29 20 7c 7c  ser,user,'?') ||
59e0: 27 29 27 2c 0a 20 20 20 20 40 20 20 20 28 53 45  ')',.    @   (SE
59f0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
5a00: 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 70  OM plink WHERE p
5a10: 69 64 3d 62 6c 6f 62 2e 72 69 64 20 41 4e 44 20  id=blob.rid AND 
5a20: 69 73 70 72 69 6d 29 2c 0a 20 20 20 20 40 20 20  isprim),.    @  
5a30: 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   (SELECT count(*
5a40: 29 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45  ) FROM plink WHE
5a50: 52 45 20 63 69 64 3d 62 6c 6f 62 2e 72 69 64 29  RE cid=blob.rid)
5a60: 0a 20 20 20 20 40 20 46 52 4f 4d 20 65 76 65 6e  .    @ FROM even
5a70: 74 2c 20 62 6c 6f 62 0a 20 20 20 20 40 20 57 48  t, blob.    @ WH
5a80: 45 52 45 20 62 6c 6f 62 2e 72 69 64 3d 65 76 65  ERE blob.rid=eve
5a90: 6e 74 2e 6f 62 6a 69 64 0a 20 20 3b 0a 20 20 72  nt.objid.  ;.  r
5aa0: 65 74 75 72 6e 20 7a 42 61 73 65 53 71 6c 3b 0a  eturn zBaseSql;.
5ab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44  }../*.** COMMAND
5ac0: 3a 20 74 69 6d 65 6c 69 6e 65 0a 2a 2a 0a 2a 2a  : timeline.**.**
5ad0: 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20   Usage: %fossil 
5ae0: 74 69 6d 65 6c 69 6e 65 20 3f 57 48 45 4e 3f 20  timeline ?WHEN? 
5af0: 3f 55 55 49 44 7c 44 41 54 45 54 49 4d 45 3f 20  ?UUID|DATETIME? 
5b00: 3f 2d 6e 7c 2d 2d 63 6f 75 6e 74 20 4e 3f 0a 2a  ?-n|--count N?.*
5b10: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 75 6d  *.** Print a sum
5b20: 6d 61 72 79 20 6f 66 20 61 63 74 69 76 69 74 79  mary of activity
5b30: 20 67 6f 69 6e 67 20 62 61 63 6b 77 61 72 64 73   going backwards
5b40: 20 69 6e 20 64 61 74 65 20 61 6e 64 20 74 69 6d   in date and tim
5b50: 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6f  e.** specified o
5b60: 72 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  r from the curre
5b70: 6e 74 20 64 61 74 65 20 61 6e 64 20 74 69 6d 65  nt date and time
5b80: 20 69 66 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73   if no arguments
5b90: 0a 2a 2a 20 61 72 65 20 67 69 76 65 6e 2e 20 20  .** are given.  
5ba0: 53 68 6f 77 20 61 73 20 6d 61 6e 79 20 61 73 20  Show as many as 
5bb0: 4e 20 28 64 65 66 61 75 6c 74 20 32 30 29 20 63  N (default 20) c
5bc0: 68 65 63 6b 2d 69 6e 73 2e 20 20 54 68 65 0a 2a  heck-ins.  The.*
5bd0: 2a 20 57 48 45 4e 20 61 72 67 75 6d 65 6e 74 20  * WHEN argument 
5be0: 63 61 6e 20 62 65 20 61 6e 79 20 75 6e 69 71 75  can be any uniqu
5bf0: 65 20 61 62 62 72 65 76 69 61 74 69 6f 6e 20 6f  e abbreviation o
5c00: 66 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 0a 2a  f one of these.*
5c10: 2a 20 6b 65 79 77 6f 72 64 73 3a 0a 2a 2a 0a 2a  * keywords:.**.*
5c20: 2a 20 20 20 20 20 62 65 66 6f 72 65 0a 2a 2a 20  *     before.** 
5c30: 20 20 20 20 61 66 74 65 72 0a 2a 2a 20 20 20 20      after.**    
5c40: 20 64 65 73 63 65 6e 64 65 6e 74 73 20 7c 20 63   descendents | c
5c50: 68 69 6c 64 72 65 6e 0a 2a 2a 20 20 20 20 20 61  hildren.**     a
5c60: 6e 63 65 73 74 6f 72 73 20 7c 20 70 61 72 65 6e  ncestors | paren
5c70: 74 73 0a 2a 2a 0a 2a 2a 20 54 68 65 20 55 55 49  ts.**.** The UUI
5c80: 44 20 63 61 6e 20 62 65 20 61 6e 79 20 75 6e 69  D can be any uni
5c90: 71 75 65 20 70 72 65 66 69 78 20 6f 66 20 34 20  que prefix of 4 
5ca0: 63 68 61 72 61 63 74 65 72 73 20 6f 72 20 6d 6f  characters or mo
5cb0: 72 65 2e 0a 2a 2a 20 54 68 65 20 44 41 54 45 54  re..** The DATET
5cc0: 49 4d 45 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  IME should be in
5cd0: 20 74 68 65 20 49 53 4f 38 36 30 31 20 66 6f 72   the ISO8601 for
5ce0: 6d 61 74 2e 20 20 46 6f 72 0a 2a 2a 20 65 78 61  mat.  For.** exa
5cf0: 6d 70 6c 65 73 3a 20 22 32 30 30 37 2d 30 38 2d  mples: "2007-08-
5d00: 31 38 20 30 37 3a 32 31 3a 32 31 22 2e 20 20 59  18 07:21:21".  Y
5d10: 6f 75 20 63 61 6e 20 61 6c 73 6f 20 73 61 79 20  ou can also say 
5d20: 22 63 75 72 72 65 6e 74 22 0a 2a 2a 20 66 6f 72  "current".** for
5d30: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 65 72   the current ver
5d40: 73 69 6f 6e 20 6f 72 20 22 6e 6f 77 22 20 66 6f  sion or "now" fo
5d50: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  r the current ti
5d60: 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 74 69 6d 65  me..*/.void time
5d70: 6c 69 6e 65 5f 63 6d 64 28 76 6f 69 64 29 7b 0a  line_cmd(void){.
5d80: 20 20 53 74 6d 74 20 71 3b 0a 20 20 69 6e 74 20    Stmt q;.  int 
5d90: 6e 2c 20 6b 3b 0a 20 20 63 6f 6e 73 74 20 63 68  n, k;.  const ch
5da0: 61 72 20 2a 7a 43 6f 75 6e 74 3b 0a 20 20 63 68  ar *zCount;.  ch
5db0: 61 72 20 2a 7a 4f 72 69 67 69 6e 3b 0a 20 20 63  ar *zOrigin;.  c
5dc0: 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20 20 63 68  har *zDate;.  ch
5dd0: 61 72 20 2a 7a 53 51 4c 3b 0a 20 20 69 6e 74 20  ar *zSQL;.  int 
5de0: 6f 62 6a 69 64 20 3d 20 30 3b 0a 20 20 42 6c 6f  objid = 0;.  Blo
5df0: 62 20 75 75 69 64 3b 0a 20 20 69 6e 74 20 6d 6f  b uuid;.  int mo
5e00: 64 65 20 3d 20 31 20 3b 20 20 20 20 20 20 20 2f  de = 1 ;       /
5e10: 2a 20 31 3a 20 62 65 66 6f 72 65 20 20 32 3a 61  * 1: before  2:a
5e20: 66 74 65 72 20 20 33 3a 63 68 69 6c 64 72 65 6e  fter  3:children
5e30: 20 20 34 3a 70 61 72 65 6e 74 73 20 2a 2f 0a 20    4:parents */. 
5e40: 20 64 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f 70 65   db_find_and_ope
5e50: 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 29 3b 0a  n_repository();.
5e60: 20 20 7a 43 6f 75 6e 74 20 3d 20 66 69 6e 64 5f    zCount = find_
5e70: 6f 70 74 69 6f 6e 28 22 6e 22 2c 22 63 6f 75 6e  option("n","coun
5e80: 74 22 2c 31 29 3b 0a 20 20 69 66 28 20 7a 43 6f  t",1);.  if( zCo
5e90: 75 6e 74 20 29 7b 0a 20 20 20 20 6e 20 3d 20 61  unt ){.    n = a
5ea0: 74 6f 69 28 7a 43 6f 75 6e 74 29 3b 0a 20 20 7d  toi(zCount);.  }
5eb0: 65 6c 73 65 7b 0a 20 20 20 20 6e 20 3d 20 32 30  else{.    n = 20
5ec0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 2e 61 72  ;.  }.  if( g.ar
5ed0: 67 63 3d 3d 34 20 29 7b 0a 20 20 20 20 6b 20 3d  gc==4 ){.    k =
5ee0: 20 73 74 72 6c 65 6e 28 67 2e 61 72 67 76 5b 32   strlen(g.argv[2
5ef0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e  ]);.    if( strn
5f00: 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c 22 62  cmp(g.argv[2],"b
5f10: 65 66 6f 72 65 22 2c 6b 29 3d 3d 30 20 29 7b 0a  efore",k)==0 ){.
5f20: 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 31 3b 0a        mode = 1;.
5f30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
5f40: 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c  rncmp(g.argv[2],
5f50: 22 61 66 74 65 72 22 2c 6b 29 3d 3d 30 20 26 26  "after",k)==0 &&
5f60: 20 6b 3e 31 20 29 7b 0a 20 20 20 20 20 20 6d 6f   k>1 ){.      mo
5f70: 64 65 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73  de = 2;.    }els
5f80: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 67 2e  e if( strncmp(g.
5f90: 61 72 67 76 5b 32 5d 2c 22 64 65 73 63 65 6e 64  argv[2],"descend
5fa0: 65 6e 74 73 22 2c 6b 29 3d 3d 30 20 29 7b 0a 20  ents",k)==0 ){. 
5fb0: 20 20 20 20 20 6d 6f 64 65 20 3d 20 33 3b 0a 20       mode = 3;. 
5fc0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
5fd0: 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c 22  ncmp(g.argv[2],"
5fe0: 63 68 69 6c 64 72 65 6e 22 2c 6b 29 3d 3d 30 20  children",k)==0 
5ff0: 29 7b 0a 20 20 20 20 20 20 6d 6f 64 65 20 3d 20  ){.      mode = 
6000: 33 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  3;.    }else if(
6010: 20 73 74 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b   strncmp(g.argv[
6020: 32 5d 2c 22 61 6e 63 65 73 74 6f 72 73 22 2c 6b  2],"ancestors",k
6030: 29 3d 3d 30 20 26 26 20 6b 3e 31 20 29 7b 0a 20  )==0 && k>1 ){. 
6040: 20 20 20 20 20 6d 6f 64 65 20 3d 20 34 3b 0a 20       mode = 4;. 
6050: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
6060: 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c 22  ncmp(g.argv[2],"
6070: 70 61 72 65 6e 74 73 22 2c 6b 29 3d 3d 30 20 29  parents",k)==0 )
6080: 7b 0a 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 34  {.      mode = 4
6090: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
60a0: 20 20 20 75 73 61 67 65 28 22 3f 57 48 45 4e 3f     usage("?WHEN?
60b0: 20 3f 55 55 49 44 7c 44 41 54 45 54 49 4d 45 3f   ?UUID|DATETIME?
60c0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4f  ");.    }.    zO
60d0: 72 69 67 69 6e 20 3d 20 67 2e 61 72 67 76 5b 33  rigin = g.argv[3
60e0: 5d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67  ];.  }else if( g
60f0: 2e 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20 20 20  .argc==3 ){.    
6100: 7a 4f 72 69 67 69 6e 20 3d 20 67 2e 61 72 67 76  zOrigin = g.argv
6110: 5b 32 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  [2];.  }else{.  
6120: 20 20 7a 4f 72 69 67 69 6e 20 3d 20 22 6e 6f 77    zOrigin = "now
6130: 22 3b 0a 20 20 7d 0a 20 20 6b 20 3d 20 73 74 72  ";.  }.  k = str
6140: 6c 65 6e 28 7a 4f 72 69 67 69 6e 29 3b 0a 20 20  len(zOrigin);.  
6150: 62 6c 6f 62 5f 7a 65 72 6f 28 26 75 75 69 64 29  blob_zero(&uuid)
6160: 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28  ;.  blob_append(
6170: 26 75 75 69 64 2c 20 7a 4f 72 69 67 69 6e 2c 20  &uuid, zOrigin, 
6180: 2d 31 29 3b 0a 20 20 69 66 28 20 73 74 72 63 6d  -1);.  if( strcm
6190: 70 28 7a 4f 72 69 67 69 6e 2c 20 22 6e 6f 77 22  p(zOrigin, "now"
61a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
61b0: 6d 6f 64 65 3d 3d 33 20 7c 7c 20 6d 6f 64 65 3d  mode==3 || mode=
61c0: 3d 34 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73  =4 ){.      foss
61d0: 69 6c 5f 66 61 74 61 6c 28 22 63 61 6e 6e 6f 74  il_fatal("cannot
61e0: 20 63 6f 6d 70 75 74 65 20 64 65 73 63 65 6e 64   compute descend
61f0: 65 6e 74 73 20 6f 72 20 61 6e 63 65 73 74 6f 72  ents or ancestor
6200: 73 20 6f 66 20 61 20 64 61 74 65 22 29 3b 0a 20  s of a date");. 
6210: 20 20 20 7d 0a 20 20 20 20 7a 44 61 74 65 20 3d     }.    zDate =
6220: 20 6d 70 72 69 6e 74 66 28 22 28 53 45 4c 45 43   mprintf("(SELEC
6230: 54 20 64 61 74 65 74 69 6d 65 28 27 6e 6f 77 27  T datetime('now'
6240: 29 29 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ))");.  }else if
6250: 28 20 73 74 72 6e 63 6d 70 28 7a 4f 72 69 67 69  ( strncmp(zOrigi
6260: 6e 2c 20 22 63 75 72 72 65 6e 74 22 2c 20 6b 29  n, "current", k)
6270: 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 62 6a 69 64  ==0 ){.    objid
6280: 20 3d 20 64 62 5f 6c 67 65 74 5f 69 6e 74 28 22   = db_lget_int("
6290: 63 68 65 63 6b 6f 75 74 22 2c 30 29 3b 0a 20 20  checkout",0);.  
62a0: 20 20 7a 44 61 74 65 20 3d 20 6d 70 72 69 6e 74    zDate = mprint
62b0: 66 28 22 28 53 45 4c 45 43 54 20 6d 74 69 6d 65  f("(SELECT mtime
62c0: 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52   FROM plink WHER
62d0: 45 20 63 69 64 3d 25 64 29 22 2c 20 6f 62 6a 69  E cid=%d)", obji
62e0: 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  d);.  }else if( 
62f0: 6e 61 6d 65 5f 74 6f 5f 75 75 69 64 28 26 75 75  name_to_uuid(&uu
6300: 69 64 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20  id, 0)==0 ){.   
6310: 20 6f 62 6a 69 64 20 3d 20 64 62 5f 69 6e 74 28   objid = db_int(
6320: 30 2c 20 22 53 45 4c 45 43 54 20 72 69 64 20 46  0, "SELECT rid F
6330: 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 75  ROM blob WHERE u
6340: 75 69 64 3d 25 42 22 2c 20 26 75 75 69 64 29 3b  uid=%B", &uuid);
6350: 0a 20 20 20 20 7a 44 61 74 65 20 3d 20 6d 70 72  .    zDate = mpr
6360: 69 6e 74 66 28 22 28 53 45 4c 45 43 54 20 6d 74  intf("(SELECT mt
6370: 69 6d 65 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57  ime FROM plink W
6380: 48 45 52 45 20 63 69 64 3d 25 64 29 22 2c 20 6f  HERE cid=%d)", o
6390: 62 6a 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  bjid);.  }else{.
63a0: 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 33 20      if( mode==3 
63b0: 7c 7c 20 6d 6f 64 65 3d 3d 34 20 29 7b 0a 20 20  || mode==4 ){.  
63c0: 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c      fossil_fatal
63d0: 28 22 63 61 6e 6e 6f 74 20 63 6f 6d 70 75 74 65  ("cannot compute
63e0: 20 64 65 73 63 65 6e 64 65 6e 74 73 20 6f 72 20   descendents or 
63f0: 61 6e 63 65 73 74 6f 72 73 20 6f 66 20 61 20 64  ancestors of a d
6400: 61 74 65 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ate");.    }.   
6410: 20 7a 44 61 74 65 20 3d 20 6d 70 72 69 6e 74 66   zDate = mprintf
6420: 28 22 28 53 45 4c 45 43 54 20 6a 75 6c 69 61 6e  ("(SELECT julian
6430: 64 61 79 28 25 51 2c 20 27 75 74 63 27 29 29 22  day(%Q, 'utc'))"
6440: 2c 20 7a 4f 72 69 67 69 6e 29 3b 0a 20 20 7d 0a  , zOrigin);.  }.
6450: 20 20 7a 53 51 4c 20 3d 20 6d 70 72 69 6e 74 66    zSQL = mprintf
6460: 28 22 25 73 20 41 4e 44 20 65 76 65 6e 74 2e 6d  ("%s AND event.m
6470: 74 69 6d 65 20 25 73 20 25 73 22 2c 0a 20 20 20  time %s %s",.   
6480: 20 20 74 69 6d 65 6c 69 6e 65 5f 71 75 65 72 79    timeline_query
6490: 5f 66 6f 72 5f 74 74 79 28 29 2c 0a 20 20 20 20  _for_tty(),.    
64a0: 20 28 6d 6f 64 65 3d 3d 31 20 7c 7c 20 6d 6f 64   (mode==1 || mod
64b0: 65 3d 3d 34 29 20 3f 20 22 3c 3d 22 20 3a 20 22  e==4) ? "<=" : "
64c0: 3e 3d 22 2c 0a 20 20 20 20 20 7a 44 61 74 65 0a  >=",.     zDate.
64d0: 20 20 29 3b 0a 20 20 69 66 28 20 6d 6f 64 65 3d    );.  if( mode=
64e0: 3d 33 20 7c 7c 20 6d 6f 64 65 3d 3d 34 20 29 7b  =3 || mode==4 ){
64f0: 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78  .    db_multi_ex
6500: 65 63 28 22 43 52 45 41 54 45 20 54 45 4d 50 20  ec("CREATE TEMP 
6510: 54 41 42 4c 45 20 6f 6b 28 72 69 64 20 49 4e 54  TABLE ok(rid INT
6520: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
6530: 29 22 29 3b 0a 20 20 20 20 69 66 28 20 6d 6f 64  )");.    if( mod
6540: 65 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 63 6f  e==3 ){.      co
6550: 6d 70 75 74 65 5f 64 65 73 63 65 6e 64 65 6e 74  mpute_descendent
6560: 73 28 6f 62 6a 69 64 2c 20 6e 29 3b 0a 20 20 20  s(objid, n);.   
6570: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
6580: 6d 70 75 74 65 5f 61 6e 63 65 73 74 6f 72 73 28  mpute_ancestors(
6590: 6f 62 6a 69 64 2c 20 6e 29 3b 0a 20 20 20 20 7d  objid, n);.    }
65a0: 0a 20 20 20 20 7a 53 51 4c 20 3d 20 6d 70 72 69  .    zSQL = mpri
65b0: 6e 74 66 28 22 25 7a 20 41 4e 44 20 62 6c 6f 62  ntf("%z AND blob
65c0: 2e 72 69 64 20 49 4e 20 6f 6b 22 2c 20 7a 53 51  .rid IN ok", zSQ
65d0: 4c 29 3b 0a 20 20 7d 0a 20 20 7a 53 51 4c 20 3d  L);.  }.  zSQL =
65e0: 20 6d 70 72 69 6e 74 66 28 22 25 7a 20 4f 52 44   mprintf("%z ORD
65f0: 45 52 20 42 59 20 65 76 65 6e 74 2e 6d 74 69 6d  ER BY event.mtim
6600: 65 20 44 45 53 43 22 2c 20 7a 53 51 4c 29 3b 0a  e DESC", zSQL);.
6610: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c    db_prepare(&q,
6620: 20 7a 53 51 4c 29 3b 0a 20 20 70 72 69 6e 74 5f   zSQL);.  print_
6630: 74 69 6d 65 6c 69 6e 65 28 26 71 2c 20 6e 29 3b  timeline(&q, n);
6640: 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26  .  db_finalize(&
6650: 71 29 3b 0a 7d 0a                                q);.}.