Hex Artifact Content
Not logged in

Artifact 98e360ef8dcc9eff0b5d98c7ea562241a183eca7:

File src/timeline.c part of check-in [7915bd0665] - Improvements to the text description on the "ntimeline" page. by drh on 2008-02-26 17:32:52.

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 69  ;.  }else{.    i
2940: 6e 74 20 6e 3b 0a 20 20 20 20 42 6c 6f 62 20 75  nt n;.    Blob u
2950: 72 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  rl;.    const ch
2960: 61 72 20 2a 7a 45 54 79 70 65 20 3d 20 22 65 76  ar *zEType = "ev
2970: 65 6e 74 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20  ent";.    const 
2980: 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20 20 20  char *zDate;.   
2990: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 75 72 6c 29   blob_zero(&url)
29a0: 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e  ;.    blob_appen
29b0: 64 66 28 26 75 72 6c 2c 20 22 25 73 2f 6e 74 69  df(&url, "%s/nti
29c0: 6d 65 6c 69 6e 65 3f 6e 3d 25 64 22 2c 20 67 2e  meline?n=%d", g.
29d0: 7a 42 61 73 65 55 52 4c 2c 20 6e 45 6e 74 72 79  zBaseURL, nEntry
29e0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65  );.    if( zType
29f0: 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61   ){.      blob_a
2a00: 70 70 65 6e 64 66 28 26 73 71 6c 2c 20 22 20 41  ppendf(&sql, " A
2a10: 4e 44 20 65 76 65 6e 74 2e 74 79 70 65 3d 25 51  ND event.type=%Q
2a20: 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20 20 20  ", zType);.     
2a30: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 75   blob_appendf(&u
2a40: 72 6c 2c 20 22 26 79 3d 25 54 22 2c 20 7a 54 79  rl, "&y=%T", zTy
2a50: 70 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  pe);.      if( z
2a60: 54 79 70 65 5b 30 5d 3d 3d 27 63 27 20 29 7b 0a  Type[0]=='c' ){.
2a70: 20 20 20 20 20 20 20 20 7a 45 54 79 70 65 20 3d          zEType =
2a80: 20 22 63 68 65 63 6b 69 6e 22 3b 0a 20 20 20 20   "checkin";.    
2a90: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 79 70    }else if( zTyp
2aa0: 65 5b 30 5d 3d 3d 27 77 27 20 29 7b 0a 20 20 20  e[0]=='w' ){.   
2ab0: 20 20 20 20 20 7a 45 54 79 70 65 20 3d 20 22 77       zEType = "w
2ac0: 69 6b 69 20 65 64 69 74 22 3b 0a 20 20 20 20 20  iki edit";.     
2ad0: 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 79 70 65   }else if( zType
2ae0: 5b 30 5d 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20  [0]=='t' ){.    
2af0: 20 20 20 20 7a 45 54 79 70 65 20 3d 20 22 74 69      zEType = "ti
2b00: 63 6b 65 74 20 63 68 61 6e 67 65 22 3b 0a 20 20  cket change";.  
2b10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2b20: 69 66 28 20 7a 55 73 65 72 20 29 7b 0a 20 20 20  if( zUser ){.   
2b30: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
2b40: 26 73 71 6c 2c 20 22 20 41 4e 44 20 65 76 65 6e  &sql, " AND even
2b50: 74 2e 75 73 65 72 3d 25 51 22 2c 20 7a 55 73 65  t.user=%Q", zUse
2b60: 72 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61  r);.      blob_a
2b70: 70 70 65 6e 64 66 28 26 75 72 6c 2c 20 22 26 75  ppendf(&url, "&u
2b80: 3d 25 54 22 2c 20 7a 55 73 65 72 29 3b 0a 20 20  =%T", zUser);.  
2b90: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 41 66 74    }.    if( zAft
2ba0: 65 72 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c  er ){.      whil
2bb0: 65 28 20 69 73 73 70 61 63 65 28 7a 41 66 74 65  e( isspace(zAfte
2bc0: 72 5b 30 5d 29 20 29 7b 20 7a 41 66 74 65 72 2b  r[0]) ){ zAfter+
2bd0: 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a  +; }.      if( z
2be0: 41 66 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  After[0] ){.    
2bf0: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
2c00: 28 26 73 71 6c 2c 20 0a 20 20 20 20 20 20 20 20  (&sql, .        
2c10: 20 20 20 22 20 41 4e 44 20 65 76 65 6e 74 2e 6d     " AND event.m
2c20: 74 69 6d 65 3e 3d 28 53 45 4c 45 43 54 20 6a 75  time>=(SELECT ju
2c30: 6c 69 61 6e 64 61 79 28 25 51 2c 20 27 75 74 63  lianday(%Q, 'utc
2c40: 27 29 29 22 0a 20 20 20 20 20 20 20 20 20 20 20  '))".           
2c50: 22 20 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74  " ORDER BY event
2c60: 2e 6d 74 69 6d 65 20 41 53 43 22 2c 20 7a 41 66  .mtime ASC", zAf
2c70: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7a 42  ter);.        zB
2c80: 65 66 6f 72 65 20 3d 20 30 3b 0a 20 20 20 20 20  efore = 0;.     
2c90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2ca0: 7a 41 66 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  zAfter = 0;.    
2cb0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
2cc0: 28 20 7a 42 65 66 6f 72 65 20 29 7b 0a 20 20 20  ( zBefore ){.   
2cd0: 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
2ce0: 65 28 7a 42 65 66 6f 72 65 5b 30 5d 29 20 29 7b  e(zBefore[0]) ){
2cf0: 20 7a 42 65 66 6f 72 65 2b 2b 3b 20 7d 0a 20 20   zBefore++; }.  
2d00: 20 20 20 20 69 66 28 20 7a 42 65 66 6f 72 65 5b      if( zBefore[
2d10: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c  0] ){.        bl
2d20: 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 71 6c 2c  ob_appendf(&sql,
2d30: 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 20 41   .           " A
2d40: 4e 44 20 65 76 65 6e 74 2e 6d 74 69 6d 65 3c 3d  ND event.mtime<=
2d50: 28 53 45 4c 45 43 54 20 6a 75 6c 69 61 6e 64 61  (SELECT julianda
2d60: 79 28 25 51 2c 20 27 75 74 63 27 29 29 22 0a 20  y(%Q, 'utc'))". 
2d70: 20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45            " ORDE
2d80: 52 20 42 59 20 65 76 65 6e 74 2e 6d 74 69 6d 65  R BY event.mtime
2d90: 20 44 45 53 43 22 2c 20 7a 42 65 66 6f 72 65 29   DESC", zBefore)
2da0: 3b 0a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ;.       }else{.
2db0: 20 20 20 20 20 20 20 20 7a 42 65 66 6f 72 65 20          zBefore 
2dc0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
2dd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 6c   }else{.      bl
2de0: 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 71 6c 2c  ob_appendf(&sql,
2df0: 20 22 20 4f 52 44 45 52 20 42 59 20 65 76 65 6e   " ORDER BY even
2e00: 74 2e 6d 74 69 6d 65 20 44 45 53 43 22 29 3b 0a  t.mtime DESC");.
2e10: 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 5f 61      }.    blob_a
2e20: 70 70 65 6e 64 66 28 26 73 71 6c 2c 20 22 20 4c  ppendf(&sql, " L
2e30: 49 4d 49 54 20 25 64 22 2c 20 6e 45 6e 74 72 79  IMIT %d", nEntry
2e40: 29 3b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f  );.    db_multi_
2e50: 65 78 65 63 28 22 25 73 22 2c 20 62 6c 6f 62 5f  exec("%s", blob_
2e60: 73 74 72 28 26 73 71 6c 29 29 3b 0a 0a 20 20 20  str(&sql));..   
2e70: 20 6e 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22   n = db_int(0, "
2e80: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
2e90: 46 52 4f 4d 20 74 69 6d 65 6c 69 6e 65 22 29 3b  FROM timeline");
2ea0: 0a 20 20 20 20 69 66 28 20 7a 41 66 74 65 72 3d  .    if( zAfter=
2eb0: 3d 30 20 26 26 20 7a 42 65 66 6f 72 65 3d 3d 30  =0 && zBefore==0
2ec0: 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61   ){.      blob_a
2ed0: 70 70 65 6e 64 66 28 26 64 65 73 63 2c 20 22 25  ppendf(&desc, "%
2ee0: 64 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 25 73  d most recent %s
2ef0: 73 22 2c 20 6e 2c 20 7a 45 54 79 70 65 29 3b 0a  s", n, zEType);.
2f00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f10: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 64   blob_appendf(&d
2f20: 65 73 63 2c 20 22 25 64 20 25 73 73 22 2c 20 6e  esc, "%d %ss", n
2f30: 2c 20 7a 45 54 79 70 65 29 3b 0a 20 20 20 20 7d  , zEType);.    }
2f40: 0a 20 20 20 20 69 66 28 20 7a 55 73 65 72 20 29  .    if( zUser )
2f50: 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70  {.      blob_app
2f60: 65 6e 64 66 28 26 64 65 73 63 2c 20 22 20 62 79  endf(&desc, " by
2f70: 20 75 73 65 72 20 25 68 22 2c 20 7a 55 73 65 72   user %h", zUser
2f80: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2f90: 20 7a 41 66 74 65 72 20 29 7b 0a 20 20 20 20 20   zAfter ){.     
2fa0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 64   blob_appendf(&d
2fb0: 65 73 63 2c 20 22 20 6f 63 63 75 72 72 69 6e 67  esc, " occurring
2fc0: 20 6f 6e 20 6f 72 20 61 66 74 65 72 20 25 68 2e   on or after %h.
2fd0: 3c 62 72 3e 22 2c 20 7a 41 66 74 65 72 29 3b 0a  <br>", zAfter);.
2fe0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 42      }else if( zB
2ff0: 65 66 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 62  efore ){.      b
3000: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 64 65 73  lob_appendf(&des
3010: 63 2c 20 22 20 6f 63 63 75 72 72 69 6e 67 20 6f  c, " occurring o
3020: 6e 20 6f 72 20 62 65 66 6f 72 65 20 25 68 2e 3c  n or before %h.<
3030: 62 72 3e 22 2c 20 7a 42 65 66 6f 72 65 29 3b 0a  br>", zBefore);.
3040: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 41      }.    if( zA
3050: 66 74 65 72 20 7c 7c 20 6e 3d 3d 6e 45 6e 74 72  fter || n==nEntr
3060: 79 20 29 7b 0a 20 20 20 20 20 20 7a 44 61 74 65  y ){.      zDate
3070: 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53   = db_text(0, "S
3080: 45 4c 45 43 54 20 6d 69 6e 28 74 69 6d 65 73 74  ELECT min(timest
3090: 61 6d 70 29 20 46 52 4f 4d 20 74 69 6d 65 6c 69  amp) FROM timeli
30a0: 6e 65 22 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62  ne");.      blob
30b0: 5f 61 70 70 65 6e 64 66 28 26 64 65 73 63 2c 20  _appendf(&desc, 
30c0: 22 20 3c 61 20 68 72 65 66 3d 27 25 62 26 62 3d  " <a href='%b&b=
30d0: 25 73 27 3e 5b 6f 6c 64 65 72 5d 3c 2f 61 3e 22  %s'>[older]</a>"
30e0: 2c 20 26 75 72 6c 2c 20 7a 44 61 74 65 29 3b 0a  , &url, zDate);.
30f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 42      }.    if( zB
3100: 65 66 6f 72 65 20 7c 7c 20 28 7a 41 66 74 65 72  efore || (zAfter
3110: 20 26 26 20 6e 3d 3d 6e 45 6e 74 72 79 29 20 29   && n==nEntry) )
3120: 7b 0a 20 20 20 20 20 20 7a 44 61 74 65 20 3d 20  {.      zDate = 
3130: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45  db_text(0, "SELE
3140: 43 54 20 6d 61 78 28 74 69 6d 65 73 74 61 6d 70  CT max(timestamp
3150: 29 20 46 52 4f 4d 20 74 69 6d 65 6c 69 6e 65 22  ) FROM timeline"
3160: 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  );.      blob_ap
3170: 70 65 6e 64 66 28 26 64 65 73 63 2c 20 22 20 3c  pendf(&desc, " <
3180: 61 20 68 72 65 66 3d 27 25 62 26 61 3d 25 73 27  a href='%b&a=%s'
3190: 3e 5b 6d 6f 72 65 20 72 65 63 65 6e 74 5d 3c 2f  >[more recent]</
31a0: 61 3e 22 2c 20 26 75 72 6c 2c 20 7a 44 61 74 65  a>", &url, zDate
31b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62  );.    }.  }.  b
31c0: 6c 6f 62 5f 7a 65 72 6f 28 26 73 71 6c 29 3b 0a  lob_zero(&sql);.
31d0: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c    db_prepare(&q,
31e0: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
31f0: 74 69 6d 65 6c 69 6e 65 20 4f 52 44 45 52 20 42  timeline ORDER B
3200: 59 20 74 69 6d 65 73 74 61 6d 70 20 44 45 53 43  Y timestamp DESC
3210: 22 29 3b 0a 20 20 40 20 3c 68 32 3e 25 62 28 26  ");.  @ <h2>%b(&
3220: 64 65 73 63 29 3c 2f 68 32 3e 0a 20 20 62 6c 6f  desc)</h2>.  blo
3230: 62 5f 72 65 73 65 74 28 26 64 65 73 63 29 3b 0a  b_reset(&desc);.
3240: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 73 63 72    blob_zero(&scr
3250: 69 70 74 49 6e 69 74 29 3b 0a 20 20 77 77 77 5f  iptInit);.  www_
3260: 70 72 69 6e 74 5f 74 69 6d 65 6c 69 6e 65 28 26  print_timeline(&
3270: 71 2c 20 30 2c 20 30 2c 20 73 61 76 65 5f 70 61  q, 0, 0, save_pa
3280: 72 65 6e 74 61 67 65 5f 6a 61 76 61 73 63 72 69  rentage_javascri
3290: 70 74 2c 20 26 73 63 72 69 70 74 49 6e 69 74 29  pt, &scriptInit)
32a0: 3b 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28  ;.  db_finalize(
32b0: 26 71 29 3b 0a 20 20 40 20 3c 73 63 72 69 70 74  &q);.  @ <script
32c0: 3e 0a 20 20 40 20 76 61 72 20 70 61 72 65 6e 74  >.  @ var parent
32d0: 6f 66 20 3d 20 6e 65 77 20 4f 62 6a 65 63 74 28  of = new Object(
32e0: 29 3b 0a 20 20 40 20 76 61 72 20 63 68 69 6c 64  );.  @ var child
32f0: 6f 66 20 3d 20 6e 65 77 20 4f 62 6a 65 63 74 28  of = new Object(
3300: 29 3b 0a 20 20 63 67 69 5f 61 70 70 65 6e 64 5f  );.  cgi_append_
3310: 63 6f 6e 74 65 6e 74 28 62 6c 6f 62 5f 62 75 66  content(blob_buf
3320: 66 65 72 28 26 73 63 72 69 70 74 49 6e 69 74 29  fer(&scriptInit)
3330: 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 73 63 72  , blob_size(&scr
3340: 69 70 74 49 6e 69 74 29 29 3b 0a 20 20 62 6c 6f  iptInit));.  blo
3350: 62 5f 72 65 73 65 74 28 26 73 63 72 69 70 74 49  b_reset(&scriptI
3360: 6e 69 74 29 3b 0a 20 20 40 20 66 75 6e 63 74 69  nit);.  @ functi
3370: 6f 6e 20 73 65 74 61 6c 6c 28 76 61 6c 75 65 29  on setall(value)
3380: 7b 0a 20 20 40 20 20 20 66 6f 72 28 76 61 72 20  {.  @   for(var 
3390: 78 20 69 6e 20 70 61 72 65 6e 74 6f 66 29 7b 0a  x in parentof){.
33a0: 20 20 40 20 20 20 20 20 73 65 74 6f 6e 65 28 78    @     setone(x
33b0: 2c 76 61 6c 75 65 29 3b 0a 20 20 40 20 20 20 7d  ,value);.  @   }
33c0: 0a 20 20 40 20 7d 0a 20 20 40 20 73 65 74 61 6c  .  @ }.  @ setal
33d0: 6c 28 22 23 66 66 66 66 66 66 22 29 3b 0a 20 20  l("#ffffff");.  
33e0: 40 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 6f 6e  @ function seton
33f0: 65 28 69 64 2c 20 63 6c 72 29 7b 0a 20 20 40 20  e(id, clr){.  @ 
3400: 20 20 69 66 28 20 70 61 72 65 6e 74 6f 66 5b 69    if( parentof[i
3410: 64 5d 3d 3d 6e 75 6c 6c 20 29 20 72 65 74 75 72  d]==null ) retur
3420: 6e 20 30 3b 0a 20 20 40 20 20 20 76 61 72 20 77  n 0;.  @   var w
3430: 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45   = document.getE
3440: 6c 65 6d 65 6e 74 42 79 49 64 28 69 64 29 3b 0a  lementById(id);.
3450: 20 20 40 20 20 20 69 66 28 20 77 2e 73 74 79 6c    @   if( w.styl
3460: 65 2e 63 6f 6c 6f 72 3d 3d 63 6c 72 20 29 7b 0a  e.color==clr ){.
3470: 20 20 40 20 20 20 20 20 72 65 74 75 72 6e 20 30    @     return 0
3480: 0a 20 20 40 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .  @   }else{.  
3490: 40 20 20 20 20 20 77 2e 73 74 79 6c 65 2e 63 6f  @     w.style.co
34a0: 6c 6f 72 20 3d 20 63 6c 72 0a 20 20 40 20 20 20  lor = clr.  @   
34b0: 20 20 72 65 74 75 72 6e 20 31 0a 20 20 40 20 20    return 1.  @  
34c0: 20 7d 0a 20 20 40 20 7d 0a 20 20 40 20 66 75 6e   }.  @ }.  @ fun
34d0: 63 74 69 6f 6e 20 78 69 6e 28 69 64 29 20 7b 0a  ction xin(id) {.
34e0: 20 20 40 20 20 20 73 65 74 61 6c 6c 28 22 23 66    @   setall("#f
34f0: 66 66 66 66 66 22 29 3b 0a 20 20 40 20 20 20 73  fffff");.  @   s
3500: 65 74 6f 6e 65 28 69 64 2c 22 23 66 66 30 30 30  etone(id,"#ff000
3510: 30 22 29 3b 0a 20 20 40 20 20 20 73 65 74 5f 63  0");.  @   set_c
3520: 68 69 6c 64 72 65 6e 28 69 64 2c 20 22 23 62 30  hildren(id, "#b0
3530: 62 30 62 30 22 29 3b 0a 20 20 40 20 20 20 73 65  b0b0");.  @   se
3540: 74 5f 70 61 72 65 6e 74 73 28 69 64 2c 20 22 23  t_parents(id, "#
3550: 62 30 62 30 62 30 22 29 3b 0a 20 20 40 20 20 20  b0b0b0");.  @   
3560: 66 6f 72 28 76 61 72 20 78 20 69 6e 20 70 61 72  for(var x in par
3570: 65 6e 74 6f 66 5b 69 64 5d 29 7b 0a 20 20 40 20  entof[id]){.  @ 
3580: 20 20 20 20 76 61 72 20 70 69 64 20 3d 20 70 61      var pid = pa
3590: 72 65 6e 74 6f 66 5b 69 64 5d 5b 78 5d 0a 20 20  rentof[id][x].  
35a0: 40 20 20 20 20 20 76 61 72 20 77 20 3d 20 64 6f  @     var w = do
35b0: 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e  cument.getElemen
35c0: 74 42 79 49 64 28 70 69 64 29 3b 0a 20 20 40 20  tById(pid);.  @ 
35d0: 20 20 20 20 69 66 28 20 77 21 3d 6e 75 6c 6c 20      if( w!=null 
35e0: 29 7b 0a 20 20 40 20 20 20 20 20 20 20 77 2e 73  ){.  @       w.s
35f0: 74 79 6c 65 2e 63 6f 6c 6f 72 20 3d 20 22 23 30  tyle.color = "#0
3600: 30 30 30 30 30 22 3b 0a 20 20 40 20 20 20 20 20  00000";.  @     
3610: 7d 0a 20 20 40 20 20 20 7d 0a 20 20 40 20 20 20  }.  @   }.  @   
3620: 66 6f 72 28 76 61 72 20 78 20 69 6e 20 63 68 69  for(var x in chi
3630: 6c 64 6f 66 5b 69 64 5d 29 7b 0a 20 20 40 20 20  ldof[id]){.  @  
3640: 20 20 20 76 61 72 20 63 69 64 20 3d 20 63 68 69     var cid = chi
3650: 6c 64 6f 66 5b 69 64 5d 5b 78 5d 0a 20 20 40 20  ldof[id][x].  @ 
3660: 20 20 20 20 76 61 72 20 77 20 3d 20 64 6f 63 75      var w = docu
3670: 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42  ment.getElementB
3680: 79 49 64 28 63 69 64 29 3b 0a 20 20 40 20 20 20  yId(cid);.  @   
3690: 20 20 69 66 28 20 77 21 3d 6e 75 6c 6c 20 29 7b    if( w!=null ){
36a0: 0a 20 20 40 20 20 20 20 20 20 20 77 2e 73 74 79  .  @       w.sty
36b0: 6c 65 2e 63 6f 6c 6f 72 20 3d 20 22 23 30 30 30  le.color = "#000
36c0: 30 30 30 22 3b 0a 20 20 40 20 20 20 20 20 7d 0a  000";.  @     }.
36d0: 20 20 40 20 20 20 7d 0a 20 20 40 20 7d 0a 20 20    @   }.  @ }.  
36e0: 40 20 66 75 6e 63 74 69 6f 6e 20 78 6f 75 74 28  @ function xout(
36f0: 69 64 29 20 7b 0a 20 20 40 20 20 20 2f 2a 20 73  id) {.  @   /* s
3700: 65 74 61 6c 6c 28 22 23 30 30 30 30 30 30 22 29  etall("#000000")
3710: 3b 20 2a 2f 0a 20 20 40 20 7d 0a 20 20 40 20 66  ; */.  @ }.  @ f
3720: 75 6e 63 74 69 6f 6e 20 73 65 74 5f 70 61 72 65  unction set_pare
3730: 6e 74 73 28 69 64 2c 20 63 6c 72 29 7b 0a 20 20  nts(id, clr){.  
3740: 40 20 20 20 76 61 72 20 70 6c 69 73 74 20 3d 20  @   var plist = 
3750: 70 61 72 65 6e 74 6f 66 5b 69 64 5d 3b 0a 20 20  parentof[id];.  
3760: 40 20 20 20 69 66 28 20 70 6c 69 73 74 3d 3d 6e  @   if( plist==n
3770: 75 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ull ) return;.  
3780: 40 20 20 20 66 6f 72 28 76 61 72 20 78 20 69 6e  @   for(var x in
3790: 20 70 6c 69 73 74 29 7b 0a 20 20 40 20 20 20 20   plist){.  @    
37a0: 20 76 61 72 20 70 69 64 20 3d 20 70 6c 69 73 74   var pid = plist
37b0: 5b 78 5d 3b 0a 20 20 40 20 20 20 20 20 69 66 28  [x];.  @     if(
37c0: 20 73 65 74 6f 6e 65 28 70 69 64 2c 63 6c 72 29   setone(pid,clr)
37d0: 3d 3d 31 20 29 7b 0a 20 20 40 20 20 20 20 20 20  ==1 ){.  @      
37e0: 20 73 65 74 5f 70 61 72 65 6e 74 73 28 70 69 64   set_parents(pid
37f0: 2c 63 6c 72 29 3b 0a 20 20 40 20 20 20 20 20 7d  ,clr);.  @     }
3800: 0a 20 20 40 20 20 20 7d 0a 20 20 40 20 7d 0a 20  .  @   }.  @ }. 
3810: 20 40 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 5f   @ function set_
3820: 63 68 69 6c 64 72 65 6e 28 69 64 2c 63 6c 72 29  children(id,clr)
3830: 7b 0a 20 20 40 20 20 20 76 61 72 20 63 6c 69 73  {.  @   var clis
3840: 74 20 3d 20 63 68 69 6c 64 6f 66 5b 69 64 5d 3b  t = childof[id];
3850: 0a 20 20 40 20 20 20 69 66 28 20 63 6c 69 73 74  .  @   if( clist
3860: 3d 3d 6e 75 6c 6c 20 29 20 72 65 74 75 72 6e 3b  ==null ) return;
3870: 0a 20 20 40 20 20 20 66 6f 72 28 76 61 72 20 78  .  @   for(var x
3880: 20 69 6e 20 63 6c 69 73 74 29 7b 0a 20 20 40 20   in clist){.  @ 
3890: 20 20 20 20 76 61 72 20 63 69 64 20 3d 20 63 6c      var cid = cl
38a0: 69 73 74 5b 78 5d 3b 0a 20 20 40 20 20 20 20 20  ist[x];.  @     
38b0: 69 66 28 20 73 65 74 6f 6e 65 28 63 69 64 2c 63  if( setone(cid,c
38c0: 6c 72 29 3d 3d 31 20 29 7b 0a 20 20 40 20 20 20  lr)==1 ){.  @   
38d0: 20 20 20 20 73 65 74 5f 63 68 69 6c 64 72 65 6e      set_children
38e0: 28 63 69 64 2c 63 6c 72 29 3b 0a 20 20 40 20 20  (cid,clr);.  @  
38f0: 20 20 20 7d 0a 20 20 40 20 20 20 7d 0a 20 20 40     }.  @   }.  @
3900: 20 7d 0a 20 20 40 20 3c 2f 73 63 72 69 70 74 3e   }.  @ </script>
3910: 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28  .  style_footer(
3920: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 45 42  );.}.../*.** WEB
3930: 50 41 47 45 3a 20 74 69 6d 65 6c 69 6e 65 0a 2a  PAGE: timeline.*
3940: 2a 0a 2a 2a 20 51 75 65 72 79 20 70 61 72 61 6d  *.** Query param
3950: 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  eters:.**.**    
3960: 64 3d 53 54 41 52 54 44 41 54 45 20 20 20 20 64  d=STARTDATE    d
3970: 61 74 65 20 69 6e 20 69 73 6f 38 36 30 31 20 6e  ate in iso8601 n
3980: 6f 74 61 74 69 6f 6e 2e 20 20 20 20 20 20 20 20  otation.        
3990: 20 20 64 66 6c 74 3a 20 6e 65 77 65 73 74 20 65    dflt: newest e
39a0: 76 65 6e 74 0a 2a 2a 20 20 20 20 6e 3d 49 4e 54  vent.**    n=INT
39b0: 45 47 45 52 20 20 20 20 20 20 6e 75 6d 62 65 72  EGER      number
39c0: 20 6f 66 20 65 76 65 6e 74 73 20 74 6f 20 73 68   of events to sh
39d0: 6f 77 2e 20 20 20 20 20 20 20 20 20 20 64 66 6c  ow.          dfl
39e0: 74 3a 20 32 35 0a 2a 2a 20 20 20 20 65 3d 49 4e  t: 25.**    e=IN
39f0: 54 45 47 45 52 20 20 20 20 20 20 73 74 61 72 74  TEGER      start
3a00: 69 6e 67 20 65 76 65 6e 74 20 69 64 2e 20 20 20  ing event id.   
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 66                df
3a20: 6c 74 3a 20 6e 69 6c 0a 2a 2a 20 20 20 20 75 3d  lt: nil.**    u=
3a30: 4e 41 4d 45 20 20 20 20 20 20 20 20 20 73 68 6f  NAME         sho
3a40: 77 20 6f 6e 6c 79 20 65 76 65 6e 74 73 20 66 72  w only events fr
3a50: 6f 6d 20 75 73 65 72 2e 20 20 20 20 20 20 20 20  om user.        
3a60: 64 66 6c 74 3a 20 6e 69 6c 0a 2a 2a 20 20 20 20  dflt: nil.**    
3a70: 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  a              s
3a80: 68 6f 77 20 65 76 65 6e 74 73 20 61 66 74 65 72  how events after
3a90: 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 2e 20   and including. 
3aa0: 20 20 64 66 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a    dflt: false.**
3ab0: 20 20 20 20 72 20 20 20 20 20 20 20 20 20 20 20      r           
3ac0: 20 20 20 73 68 6f 77 20 6f 6e 6c 79 20 72 65 6c     show only rel
3ad0: 61 74 65 64 20 65 76 65 6e 74 73 2e 20 20 20 20  ated events.    
3ae0: 20 20 20 20 20 20 64 66 6c 74 3a 20 66 61 6c 73        dflt: fals
3af0: 65 0a 2a 2a 20 20 20 20 79 3d 54 59 50 45 20 20  e.**    y=TYPE  
3b00: 20 20 20 20 20 20 20 73 68 6f 77 20 6f 6e 6c 79         show only
3b10: 20 54 59 50 45 20 28 27 63 69 27 20 6f 72 20 27   TYPE ('ci' or '
3b20: 77 27 29 20 20 20 20 20 20 20 64 66 6c 74 3a 20  w')       dflt: 
3b30: 6e 69 6c 0a 2a 2a 20 20 20 20 73 20 20 20 20 20  nil.**    s     
3b40: 20 20 20 20 20 20 20 20 20 73 68 6f 77 20 74 68           show th
3b50: 65 20 53 51 4c 20 20 20 20 20 20 20 20 20 20 20  e SQL           
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 64 66 6c 74              dflt
3b70: 3a 20 6e 69 6c 0a 2a 2f 0a 76 6f 69 64 20 70 61  : nil.*/.void pa
3b80: 67 65 5f 74 69 6d 65 6c 69 6e 65 28 76 6f 69 64  ge_timeline(void
3b90: 29 7b 0a 20 20 53 74 6d 74 20 71 3b 20 20 20 20  ){.  Stmt q;    
3ba0: 20 20 20 20 20 20 20 0a 20 20 42 6c 6f 62 20 73         .  Blob s
3bb0: 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
3bc0: 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
3bd0: 66 20 53 51 4c 20 75 73 65 64 20 74 6f 20 67 65  f SQL used to ge
3be0: 6e 65 72 61 74 65 20 74 69 6d 65 6c 69 6e 65 20  nerate timeline 
3bf0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 51 4c 3b  */.  char *zSQL;
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c10: 20 20 2f 2a 20 52 65 6e 64 65 72 65 64 20 63 6f    /* Rendered co
3c20: 70 79 20 6f 66 20 73 71 6c 20 2a 2f 0a 20 20 42  py of sql */.  B
3c30: 6c 6f 62 20 73 63 72 69 70 74 49 6e 69 74 3b 0a  lob scriptInit;.
3c40: 20 20 63 68 61 72 20 7a 44 61 74 65 5b 31 30 30    char zDate[100
3c50: 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ];.  const char 
3c60: 2a 7a 53 74 61 72 74 20 3d 20 50 28 22 64 22 29  *zStart = P("d")
3c70: 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  ;       /* Start
3c80: 69 6e 67 20 64 61 74 65 20 2a 2f 0a 20 20 69 6e  ing date */.  in
3c90: 74 20 6e 45 6e 74 72 79 20 3d 20 61 74 6f 69 28  t nEntry = atoi(
3ca0: 50 44 28 22 6e 22 2c 22 32 30 22 29 29 3b 20 20  PD("n","20"));  
3cb0: 20 2f 2a 20 4d 61 78 20 6e 75 6d 62 65 72 20 6f   /* Max number o
3cc0: 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 74 69 6d  f entries on tim
3cd0: 65 6c 69 6e 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  eline */.  const
3ce0: 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 50   char *zUser = P
3cf0: 28 22 75 22 29 3b 20 20 20 20 20 20 20 20 2f 2a  ("u");        /*
3d00: 20 41 6c 6c 20 65 6e 74 72 69 65 73 20 62 79 20   All entries by 
3d10: 74 68 69 73 20 75 73 65 72 20 69 66 20 6e 6f 74  this user if not
3d20: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 6f   NULL */.  int o
3d30: 62 6a 69 64 20 3d 20 61 74 6f 69 28 50 44 28 22  bjid = atoi(PD("
3d40: 65 22 2c 22 30 22 29 29 3b 20 20 20 20 20 2f 2a  e","0"));     /*
3d50: 20 45 6e 74 72 69 65 73 20 72 65 6c 61 74 65 64   Entries related
3d60: 20 74 6f 20 74 68 69 73 20 65 76 65 6e 74 20 2a   to this event *
3d70: 2f 0a 20 20 69 6e 74 20 72 65 6c 61 74 65 64 45  /.  int relatedE
3d80: 76 65 6e 74 73 20 3d 20 50 28 22 72 22 29 21 3d  vents = P("r")!=
3d90: 30 3b 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62  0;     /* Must b
3da0: 65 20 64 69 72 65 63 74 6c 79 20 72 65 6c 61 74  e directly relat
3db0: 65 64 20 74 6f 20 6f 66 20 6f 62 6a 69 64 20 2a  ed to of objid *
3dc0: 2f 0a 20 20 69 6e 74 20 61 66 74 65 72 46 6c 61  /.  int afterFla
3dd0: 67 20 3d 20 50 28 22 61 22 29 21 3d 30 3b 20 20  g = P("a")!=0;  
3de0: 20 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20         /* After 
3df0: 6f 62 6a 69 64 20 69 66 20 74 72 75 65 20 2a 2f  objid if true */
3e00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3e10: 54 79 70 65 20 3d 20 50 28 22 79 22 29 3b 20 20  Type = P("y");  
3e20: 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
3e30: 20 65 76 65 6e 74 73 2e 20 20 41 6c 6c 20 69 66   events.  All if
3e40: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 66   NULL */.  int f
3e50: 69 72 73 74 45 76 65 6e 74 3b 20 20 20 20 20 20  irstEvent;      
3e60: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
3e70: 20 65 76 65 6e 74 20 64 69 73 70 6c 61 79 65 64   event displayed
3e80: 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45 76   */.  int lastEv
3e90: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
3ea0: 20 20 20 2f 2a 20 4c 61 73 74 20 65 76 65 6e 74     /* Last event
3eb0: 20 64 69 73 70 6c 61 79 65 64 20 2a 2f 0a 20 20   displayed */.  
3ec0: 42 6c 6f 62 20 64 65 73 63 3b 20 20 20 20 20 20  Blob desc;      
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3ee0: 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 64  Human readable d
3ef0: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
3f00: 65 20 74 69 6d 65 6c 69 6e 65 20 2a 2f 0a 20 20  e timeline */.  
3f10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 54 79  const char *zETy
3f20: 70 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pe;          /* 
3f30: 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65  Human readable e
3f40: 76 65 6e 74 20 74 79 70 65 20 2a 2f 0a 0a 20 20  vent type */..  
3f50: 2f 2a 20 54 6f 20 76 69 65 77 20 74 68 65 20 74  /* To view the t
3f60: 69 6d 65 6c 69 6e 65 2c 20 6d 75 73 74 20 68 61  imeline, must ha
3f70: 76 65 20 70 65 72 6d 69 73 73 69 6f 6e 20 74 6f  ve permission to
3f80: 20 72 65 61 64 20 70 72 6f 6a 65 63 74 20 64 61   read project da
3f90: 74 61 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 67 69 6e  ta..  */.  login
3fa0: 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61  _check_credentia
3fb0: 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f  ls();.  if( !g.o
3fc0: 6b 52 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e  kRead ){ login_n
3fd0: 65 65 64 65 64 28 29 3b 20 72 65 74 75 72 6e 3b  eeded(); return;
3fe0: 20 7d 0a 0a 20 20 73 74 79 6c 65 5f 68 65 61 64   }..  style_head
3ff0: 65 72 28 22 54 69 6d 65 6c 69 6e 65 22 29 3b 0a  er("Timeline");.
4000: 20 20 69 66 28 20 21 67 2e 6f 6b 48 69 73 74 6f    if( !g.okHisto
4010: 72 79 20 26 26 0a 20 20 20 20 20 20 64 62 5f 65  ry &&.      db_e
4020: 78 69 73 74 73 28 22 53 45 4c 45 43 54 20 31 20  xists("SELECT 1 
4030: 46 52 4f 4d 20 75 73 65 72 22 0a 20 20 20 20 20  FROM user".     
4040: 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
4050: 52 45 20 6c 6f 67 69 6e 3d 27 61 6e 6f 6e 79 6d  RE login='anonym
4060: 6f 75 73 27 22 0a 20 20 20 20 20 20 20 20 20 20  ous'".          
4070: 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 63 61        "   AND ca
4080: 70 20 4c 49 4b 45 20 27 25 25 68 25 25 27 22 29  p LIKE '%%h%%'")
4090: 20 29 7b 0a 20 20 20 20 40 20 3c 70 3e 3c 62 3e   ){.    @ <p><b>
40a0: 4e 6f 74 65 3a 3c 2f 62 3e 20 59 6f 75 20 77 69  Note:</b> You wi
40b0: 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 61 63  ll be able to ac
40c0: 63 65 73 73 20 3c 75 3e 6d 75 63 68 3c 2f 75 3e  cess <u>much</u>
40d0: 20 6d 6f 72 65 0a 20 20 20 20 40 20 68 69 73 74   more.    @ hist
40e0: 6f 72 69 63 61 6c 20 69 6e 66 6f 72 6d 61 74 69  orical informati
40f0: 6f 6e 20 69 66 20 79 6f 75 20 3c 61 20 68 72 65  on if you <a hre
4100: 66 3d 22 25 73 28 67 2e 7a 54 6f 70 29 2f 6c 6f  f="%s(g.zTop)/lo
4110: 67 69 6e 22 3e 6c 6f 67 69 6e 3c 2f 61 3e 2e 3c  gin">login</a>.<
4120: 2f 70 3e 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 7a  /p>.  }.  blob_z
4130: 65 72 6f 28 26 73 71 6c 29 3b 0a 20 20 62 6c 6f  ero(&sql);.  blo
4140: 62 5f 7a 65 72 6f 28 26 64 65 73 63 29 3b 0a 20  b_zero(&desc);. 
4150: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 73 71   blob_append(&sq
4160: 6c 2c 20 74 69 6d 65 6c 69 6e 65 5f 71 75 65 72  l, timeline_quer
4170: 79 5f 66 6f 72 5f 77 77 77 28 29 2c 20 2d 31 29  y_for_www(), -1)
4180: 3b 0a 20 20 7a 45 54 79 70 65 20 3d 20 22 65 76  ;.  zEType = "ev
4190: 65 6e 74 73 22 3b 0a 20 20 69 66 28 20 7a 54 79  ents";.  if( zTy
41a0: 70 65 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61  pe ){.    blob_a
41b0: 70 70 65 6e 64 66 28 26 73 71 6c 2c 20 22 20 41  ppendf(&sql, " A
41c0: 4e 44 20 65 76 65 6e 74 2e 74 79 70 65 3d 25 51  ND event.type=%Q
41d0: 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20 20 69  ", zType);.    i
41e0: 66 28 20 7a 54 79 70 65 5b 30 5d 3d 3d 27 63 27  f( zType[0]=='c'
41f0: 20 29 7b 0a 20 20 20 20 20 20 7a 45 54 79 70 65   ){.      zEType
4200: 20 3d 20 22 63 68 65 63 6b 69 6e 73 22 3b 0a 20   = "checkins";. 
4210: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 79     }else if( zTy
4220: 70 65 5b 30 5d 3d 3d 27 77 27 20 29 7b 0a 20 20  pe[0]=='w' ){.  
4230: 20 20 20 20 7a 45 54 79 70 65 20 3d 20 22 77 69      zEType = "wi
4240: 6b 69 20 65 64 69 74 73 22 3b 0a 20 20 20 20 7d  ki edits";.    }
4250: 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 61 70 70 65  .  }.  blob_appe
4260: 6e 64 66 28 26 64 65 73 63 2c 20 22 54 69 6d 65  ndf(&desc, "Time
4270: 6c 69 6e 65 20 6f 66 20 75 70 20 74 6f 20 25 64  line of up to %d
4280: 20 25 73 22 2c 20 6e 45 6e 74 72 79 2c 20 7a 45   %s", nEntry, zE
4290: 54 79 70 65 29 3b 0a 20 20 69 66 28 20 7a 55 73  Type);.  if( zUs
42a0: 65 72 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61  er ){.    blob_a
42b0: 70 70 65 6e 64 66 28 26 73 71 6c 2c 20 22 20 41  ppendf(&sql, " A
42c0: 4e 44 20 65 76 65 6e 74 2e 75 73 65 72 3d 25 51  ND event.user=%Q
42d0: 22 2c 20 7a 55 73 65 72 29 3b 0a 20 20 20 20 62  ", zUser);.    b
42e0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 64 65 73  lob_appendf(&des
42f0: 63 2c 20 22 20 62 79 20 75 73 65 72 20 25 68 22  c, " by user %h"
4300: 2c 20 7a 55 73 65 72 29 3b 0a 20 20 7d 0a 20 20  , zUser);.  }.  
4310: 69 66 28 20 6f 62 6a 69 64 20 29 7b 0a 20 20 20  if( objid ){.   
4320: 20 63 68 61 72 20 2a 7a 20 3d 20 64 62 5f 74 65   char *z = db_te
4330: 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 64 61  xt(0, "SELECT da
4340: 74 65 74 69 6d 65 28 65 76 65 6e 74 2e 6d 74 69  tetime(event.mti
4350: 6d 65 2c 20 27 6c 6f 63 61 6c 74 69 6d 65 27 29  me, 'localtime')
4360: 20 46 52 4f 4d 20 65 76 65 6e 74 22 0a 20 20 20   FROM event".   
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4380: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 6f 62        " WHERE ob
4390: 6a 69 64 3d 25 64 22 2c 20 6f 62 6a 69 64 29 3b  jid=%d", objid);
43a0: 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20  .    if( z ){.  
43b0: 20 20 20 20 7a 53 74 61 72 74 20 3d 20 7a 3b 0a      zStart = z;.
43c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
43d0: 7a 53 74 61 72 74 20 29 7b 0a 20 20 20 20 77 68  zStart ){.    wh
43e0: 69 6c 65 28 20 69 73 73 70 61 63 65 28 7a 53 74  ile( isspace(zSt
43f0: 61 72 74 5b 30 5d 29 20 29 7b 20 7a 53 74 61 72  art[0]) ){ zStar
4400: 74 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a  t++; }.    if( z
4410: 53 74 61 72 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Start[0] ){.    
4420: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26    blob_appendf(&
4430: 73 71 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 22  sql, .         "
4440: 20 41 4e 44 20 65 76 65 6e 74 2e 6d 74 69 6d 65   AND event.mtime
4450: 20 25 73 20 28 53 45 4c 45 43 54 20 6a 75 6c 69   %s (SELECT juli
4460: 61 6e 64 61 79 28 25 51 2c 20 27 75 74 63 27 29  anday(%Q, 'utc')
4470: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66                af
4490: 74 65 72 46 6c 61 67 20 3f 20 22 3e 3d 22 20 3a  terFlag ? ">=" :
44a0: 20 22 3c 3d 22 2c 20 7a 53 74 61 72 74 29 3b 0a   "<=", zStart);.
44b0: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
44c0: 64 66 28 26 64 65 73 63 2c 20 22 20 6f 63 63 75  df(&desc, " occu
44d0: 72 72 69 6e 67 20 6f 6e 20 6f 72 20 25 73 20 25  rring on or %s %
44e0: 68 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61 66  h",.          af
44f0: 74 65 72 46 6c 61 67 20 3f 20 22 61 66 74 65 72  terFlag ? "after
4500: 22 3a 20 22 62 65 66 6f 72 65 22 2c 0a 20 20 20  ": "before",.   
4510: 20 20 20 20 20 20 20 7a 53 74 61 72 74 29 3b 0a         zStart);.
4520: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
4530: 72 65 6c 61 74 65 64 45 76 65 6e 74 73 20 26 26  relatedEvents &&
4540: 20 6f 62 6a 69 64 20 29 7b 0a 20 20 20 20 63 68   objid ){.    ch
4550: 61 72 20 2a 7a 55 75 69 64 3b 0a 20 20 20 20 64  ar *zUuid;.    d
4560: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20  b_multi_exec(.  
4570: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 45 4d       "CREATE TEM
4580: 50 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  P TABLE IF NOT E
4590: 58 49 53 54 53 20 6f 6b 28 72 69 64 20 49 4e 54  XISTS ok(rid INT
45a0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
45b0: 29 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 55  )".    );.    zU
45c0: 75 69 64 20 3d 20 64 62 5f 74 65 78 74 28 22 22  uid = db_text(""
45d0: 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 46  , "SELECT uuid F
45e0: 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72  ROM blob WHERE r
45f0: 69 64 3d 25 64 22 2c 20 6f 62 6a 69 64 29 3b 0a  id=%d", objid);.
4600: 20 20 20 20 69 66 28 20 61 66 74 65 72 46 6c 61      if( afterFla
4610: 67 20 29 7b 0a 20 20 20 20 20 20 63 6f 6d 70 75  g ){.      compu
4620: 74 65 5f 64 65 73 63 65 6e 64 65 6e 74 73 28 6f  te_descendents(o
4630: 62 6a 69 64 2c 20 6e 45 6e 74 72 79 29 3b 0a 20  bjid, nEntry);. 
4640: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
4650: 66 28 26 64 65 73 63 2c 0a 20 20 20 20 20 20 20  f(&desc,.       
4660: 20 20 22 20 61 6e 64 20 64 65 63 65 6e 64 65 64    " and decended
4670: 20 66 72 6f 6d 20 3c 61 20 68 72 65 66 3d 27 25   from <a href='%
4680: 73 2f 76 69 6e 66 6f 2f 25 64 27 3e 5b 25 2e 31  s/vinfo/%d'>[%.1
4690: 30 73 5d 3c 2f 61 3e 22 2c 0a 20 20 20 20 20 20  0s]</a>",.      
46a0: 20 20 20 67 2e 7a 42 61 73 65 55 52 4c 2c 20 6f     g.zBaseURL, o
46b0: 62 6a 69 64 2c 20 7a 55 75 69 64 29 3b 0a 20 20  bjid, zUuid);.  
46c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
46d0: 6f 6d 70 75 74 65 5f 61 6e 63 65 73 74 6f 72 73  ompute_ancestors
46e0: 28 6f 62 6a 69 64 2c 20 6e 45 6e 74 72 79 29 3b  (objid, nEntry);
46f0: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  .      blob_appe
4700: 6e 64 66 28 26 64 65 73 63 2c 0a 20 20 20 20 20  ndf(&desc,.     
4710: 20 20 20 20 22 20 61 6e 64 20 61 20 61 6e 63 65      " and a ance
4720: 73 74 6f 72 20 6f 66 20 3c 61 20 68 72 65 66 3d  stor of <a href=
4730: 27 25 73 2f 76 69 6e 66 6f 2f 25 64 27 3e 5b 25  '%s/vinfo/%d'>[%
4740: 2e 31 30 73 5d 3c 2f 61 3e 22 2c 0a 20 20 20 20  .10s]</a>",.    
4750: 20 20 20 20 20 67 2e 7a 42 61 73 65 55 52 4c 2c       g.zBaseURL,
4760: 20 6f 62 6a 69 64 2c 20 7a 55 75 69 64 29 3b 0a   objid, zUuid);.
4770: 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 5f 61      }.    blob_a
4780: 70 70 65 6e 64 28 26 73 71 6c 2c 20 22 20 41 4e  ppend(&sql, " AN
4790: 44 20 65 76 65 6e 74 2e 6f 62 6a 69 64 20 49 4e  D event.objid IN
47a0: 20 6f 6b 22 2c 20 2d 31 29 3b 0a 20 20 7d 0a 20   ok", -1);.  }. 
47b0: 20 69 66 28 20 61 66 74 65 72 46 6c 61 67 20 29   if( afterFlag )
47c0: 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e  {.    blob_appen
47d0: 64 66 28 26 73 71 6c 2c 20 22 20 4f 52 44 45 52  df(&sql, " ORDER
47e0: 20 42 59 20 65 76 65 6e 74 2e 6d 74 69 6d 65 20   BY event.mtime 
47f0: 41 53 43 20 4c 49 4d 49 54 20 25 64 22 2c 0a 20  ASC LIMIT %d",. 
4800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4810: 6e 45 6e 74 72 79 29 3b 0a 20 20 7d 65 6c 73 65  nEntry);.  }else
4820: 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e  {.    blob_appen
4830: 64 66 28 26 73 71 6c 2c 20 22 20 4f 52 44 45 52  df(&sql, " ORDER
4840: 20 42 59 20 65 76 65 6e 74 2e 6d 74 69 6d 65 20   BY event.mtime 
4850: 44 45 53 43 20 4c 49 4d 49 54 20 25 64 22 2c 0a  DESC LIMIT %d",.
4860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4870: 20 6e 45 6e 74 72 79 29 3b 0a 20 20 7d 0a 20 20   nEntry);.  }.  
4880: 7a 53 51 4c 20 3d 20 62 6c 6f 62 5f 73 74 72 28  zSQL = blob_str(
4890: 26 73 71 6c 29 3b 0a 20 20 69 66 28 20 61 66 74  &sql);.  if( aft
48a0: 65 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 7a 53  erFlag ){.    zS
48b0: 51 4c 20 3d 20 6d 70 72 69 6e 74 66 28 22 53 45  QL = mprintf("SE
48c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 25 73 29  LECT * FROM (%s)
48d0: 20 4f 52 44 45 52 20 42 59 20 74 69 6d 65 73 74   ORDER BY timest
48e0: 61 6d 70 20 44 45 53 43 22 2c 20 7a 53 51 4c 29  amp DESC", zSQL)
48f0: 3b 0a 20 20 7d 0a 20 20 64 62 5f 70 72 65 70 61  ;.  }.  db_prepa
4900: 72 65 28 26 71 2c 20 7a 53 51 4c 29 3b 0a 20 20  re(&q, zSQL);.  
4910: 69 66 28 20 50 28 22 73 22 29 21 3d 30 20 29 7b  if( P("s")!=0 ){
4920: 0a 20 20 20 20 40 20 3c 68 72 3e 3c 70 3e 25 68  .    @ <hr><p>%h
4930: 28 7a 53 51 4c 29 3c 2f 70 3e 3c 68 72 3e 0a 20  (zSQL)</p><hr>. 
4940: 20 7d 0a 20 20 40 20 3c 68 32 3e 25 62 28 26 64   }.  @ <h2>%b(&d
4950: 65 73 63 29 3c 2f 68 32 3e 0a 20 20 62 6c 6f 62  esc)</h2>.  blob
4960: 5f 72 65 73 65 74 28 26 64 65 73 63 29 3b 0a 20  _reset(&desc);. 
4970: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 73 71 6c 29   blob_zero(&sql)
4980: 3b 0a 20 20 69 66 28 20 61 66 74 65 72 46 6c 61  ;.  if( afterFla
4990: 67 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 53  g ){.    free(zS
49a0: 51 4c 29 3b 0a 20 20 7d 0a 20 20 7a 44 61 74 65  QL);.  }.  zDate
49b0: 5b 30 5d 20 3d 20 30 3b 0a 20 20 62 6c 6f 62 5f  [0] = 0;.  blob_
49c0: 7a 65 72 6f 28 26 73 63 72 69 70 74 49 6e 69 74  zero(&scriptInit
49d0: 29 3b 0a 20 20 7a 44 61 74 65 5b 30 5d 20 3d 20  );.  zDate[0] = 
49e0: 30 3b 0a 20 20 77 77 77 5f 70 72 69 6e 74 5f 74  0;.  www_print_t
49f0: 69 6d 65 6c 69 6e 65 28 26 71 2c 20 26 66 69 72  imeline(&q, &fir
4a00: 73 74 45 76 65 6e 74 2c 20 26 6c 61 73 74 45 76  stEvent, &lastEv
4a10: 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ent,.           
4a20: 20 20 20 20 20 20 20 20 20 20 73 61 76 65 5f 70            save_p
4a30: 61 72 65 6e 74 61 67 65 5f 6a 61 76 61 73 63 72  arentage_javascr
4a40: 69 70 74 2c 20 26 73 63 72 69 70 74 49 6e 69 74  ipt, &scriptInit
4a50: 29 3b 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65  );.  db_finalize
4a60: 28 26 71 29 3b 0a 20 20 2f 2a 20 40 20 3c 70 3e  (&q);.  /* @ <p>
4a70: 66 69 72 73 74 45 76 65 6e 74 3d 25 64 28 66 69  firstEvent=%d(fi
4a80: 72 73 74 45 76 65 6e 74 29 20 6c 61 73 74 45 76  rstEvent) lastEv
4a90: 65 6e 74 3d 25 64 28 6c 61 73 74 45 76 65 6e 74  ent=%d(lastEvent
4aa0: 29 3c 2f 70 3e 20 2a 2f 0a 20 20 69 66 28 20 7a  )</p> */.  if( z
4ab0: 53 74 61 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Start==0 ){.    
4ac0: 7a 53 74 61 72 74 20 3d 20 7a 44 61 74 65 3b 0a  zStart = zDate;.
4ad0: 20 20 7d 0a 20 20 40 20 3c 73 63 72 69 70 74 3e    }.  @ <script>
4ae0: 0a 20 20 40 20 76 61 72 20 70 61 72 65 6e 74 6f  .  @ var parento
4af0: 66 20 3d 20 6e 65 77 20 4f 62 6a 65 63 74 28 29  f = new Object()
4b00: 3b 0a 20 20 40 20 76 61 72 20 63 68 69 6c 64 6f  ;.  @ var childo
4b10: 66 20 3d 20 6e 65 77 20 4f 62 6a 65 63 74 28 29  f = new Object()
4b20: 3b 0a 20 20 63 67 69 5f 61 70 70 65 6e 64 5f 63  ;.  cgi_append_c
4b30: 6f 6e 74 65 6e 74 28 62 6c 6f 62 5f 62 75 66 66  ontent(blob_buff
4b40: 65 72 28 26 73 63 72 69 70 74 49 6e 69 74 29 2c  er(&scriptInit),
4b50: 20 62 6c 6f 62 5f 73 69 7a 65 28 26 73 63 72 69   blob_size(&scri
4b60: 70 74 49 6e 69 74 29 29 3b 0a 20 20 62 6c 6f 62  ptInit));.  blob
4b70: 5f 72 65 73 65 74 28 26 73 63 72 69 70 74 49 6e  _reset(&scriptIn
4b80: 69 74 29 3b 0a 20 20 40 20 66 75 6e 63 74 69 6f  it);.  @ functio
4b90: 6e 20 73 65 74 61 6c 6c 28 76 61 6c 75 65 29 7b  n setall(value){
4ba0: 0a 20 20 40 20 20 20 66 6f 72 28 76 61 72 20 78  .  @   for(var x
4bb0: 20 69 6e 20 70 61 72 65 6e 74 6f 66 29 7b 0a 20   in parentof){. 
4bc0: 20 40 20 20 20 20 20 73 65 74 6f 6e 65 28 78 2c   @     setone(x,
4bd0: 76 61 6c 75 65 29 3b 0a 20 20 40 20 20 20 7d 0a  value);.  @   }.
4be0: 20 20 40 20 7d 0a 20 20 40 20 73 65 74 61 6c 6c    @ }.  @ setall
4bf0: 28 22 23 66 66 66 66 66 66 22 29 3b 0a 20 20 40  ("#ffffff");.  @
4c00: 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 6f 6e 65   function setone
4c10: 28 69 64 2c 20 63 6c 72 29 7b 0a 20 20 40 20 20  (id, clr){.  @  
4c20: 20 69 66 28 20 70 61 72 65 6e 74 6f 66 5b 69 64   if( parentof[id
4c30: 5d 3d 3d 6e 75 6c 6c 20 29 20 72 65 74 75 72 6e  ]==null ) return
4c40: 20 30 3b 0a 20 20 40 20 20 20 76 61 72 20 77 20   0;.  @   var w 
4c50: 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c  = document.getEl
4c60: 65 6d 65 6e 74 42 79 49 64 28 69 64 29 3b 0a 20  ementById(id);. 
4c70: 20 40 20 20 20 69 66 28 20 77 2e 73 74 79 6c 65   @   if( w.style
4c80: 2e 63 6f 6c 6f 72 3d 3d 63 6c 72 20 29 7b 0a 20  .color==clr ){. 
4c90: 20 40 20 20 20 20 20 72 65 74 75 72 6e 20 30 0a   @     return 0.
4ca0: 20 20 40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 40    @   }else{.  @
4cb0: 20 20 20 20 20 77 2e 73 74 79 6c 65 2e 63 6f 6c       w.style.col
4cc0: 6f 72 20 3d 20 63 6c 72 0a 20 20 40 20 20 20 20  or = clr.  @    
4cd0: 20 72 65 74 75 72 6e 20 31 0a 20 20 40 20 20 20   return 1.  @   
4ce0: 7d 0a 20 20 40 20 7d 0a 20 20 40 20 66 75 6e 63  }.  @ }.  @ func
4cf0: 74 69 6f 6e 20 78 69 6e 28 69 64 29 20 7b 0a 20  tion xin(id) {. 
4d00: 20 40 20 20 20 73 65 74 61 6c 6c 28 22 23 66 66   @   setall("#ff
4d10: 66 66 66 66 22 29 3b 0a 20 20 40 20 20 20 73 65  ffff");.  @   se
4d20: 74 6f 6e 65 28 69 64 2c 22 23 66 66 30 30 30 30  tone(id,"#ff0000
4d30: 22 29 3b 0a 20 20 40 20 20 20 73 65 74 5f 63 68  ");.  @   set_ch
4d40: 69 6c 64 72 65 6e 28 69 64 2c 20 22 23 62 30 62  ildren(id, "#b0b
4d50: 30 62 30 22 29 3b 0a 20 20 40 20 20 20 73 65 74  0b0");.  @   set
4d60: 5f 70 61 72 65 6e 74 73 28 69 64 2c 20 22 23 62  _parents(id, "#b
4d70: 30 62 30 62 30 22 29 3b 0a 20 20 40 20 20 20 66  0b0b0");.  @   f
4d80: 6f 72 28 76 61 72 20 78 20 69 6e 20 70 61 72 65  or(var x in pare
4d90: 6e 74 6f 66 5b 69 64 5d 29 7b 0a 20 20 40 20 20  ntof[id]){.  @  
4da0: 20 20 20 76 61 72 20 70 69 64 20 3d 20 70 61 72     var pid = par
4db0: 65 6e 74 6f 66 5b 69 64 5d 5b 78 5d 0a 20 20 40  entof[id][x].  @
4dc0: 20 20 20 20 20 76 61 72 20 77 20 3d 20 64 6f 63       var w = doc
4dd0: 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74  ument.getElement
4de0: 42 79 49 64 28 70 69 64 29 3b 0a 20 20 40 20 20  ById(pid);.  @  
4df0: 20 20 20 69 66 28 20 77 21 3d 6e 75 6c 6c 20 29     if( w!=null )
4e00: 7b 0a 20 20 40 20 20 20 20 20 20 20 77 2e 73 74  {.  @       w.st
4e10: 79 6c 65 2e 63 6f 6c 6f 72 20 3d 20 22 23 30 30  yle.color = "#00
4e20: 30 30 30 30 22 3b 0a 20 20 40 20 20 20 20 20 7d  0000";.  @     }
4e30: 0a 20 20 40 20 20 20 7d 0a 20 20 40 20 20 20 66  .  @   }.  @   f
4e40: 6f 72 28 76 61 72 20 78 20 69 6e 20 63 68 69 6c  or(var x in chil
4e50: 64 6f 66 5b 69 64 5d 29 7b 0a 20 20 40 20 20 20  dof[id]){.  @   
4e60: 20 20 76 61 72 20 63 69 64 20 3d 20 63 68 69 6c    var cid = chil
4e70: 64 6f 66 5b 69 64 5d 5b 78 5d 0a 20 20 40 20 20  dof[id][x].  @  
4e80: 20 20 20 76 61 72 20 77 20 3d 20 64 6f 63 75 6d     var w = docum
4e90: 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79  ent.getElementBy
4ea0: 49 64 28 63 69 64 29 3b 0a 20 20 40 20 20 20 20  Id(cid);.  @    
4eb0: 20 69 66 28 20 77 21 3d 6e 75 6c 6c 20 29 7b 0a   if( w!=null ){.
4ec0: 20 20 40 20 20 20 20 20 20 20 77 2e 73 74 79 6c    @       w.styl
4ed0: 65 2e 63 6f 6c 6f 72 20 3d 20 22 23 30 30 30 30  e.color = "#0000
4ee0: 30 30 22 3b 0a 20 20 40 20 20 20 20 20 7d 0a 20  00";.  @     }. 
4ef0: 20 40 20 20 20 7d 0a 20 20 40 20 7d 0a 20 20 40   @   }.  @ }.  @
4f00: 20 66 75 6e 63 74 69 6f 6e 20 78 6f 75 74 28 69   function xout(i
4f10: 64 29 20 7b 0a 20 20 40 20 20 20 2f 2a 20 73 65  d) {.  @   /* se
4f20: 74 61 6c 6c 28 22 23 30 30 30 30 30 30 22 29 3b  tall("#000000");
4f30: 20 2a 2f 0a 20 20 40 20 7d 0a 20 20 40 20 66 75   */.  @ }.  @ fu
4f40: 6e 63 74 69 6f 6e 20 73 65 74 5f 70 61 72 65 6e  nction set_paren
4f50: 74 73 28 69 64 2c 20 63 6c 72 29 7b 0a 20 20 40  ts(id, clr){.  @
4f60: 20 20 20 76 61 72 20 70 6c 69 73 74 20 3d 20 70     var plist = p
4f70: 61 72 65 6e 74 6f 66 5b 69 64 5d 3b 0a 20 20 40  arentof[id];.  @
4f80: 20 20 20 69 66 28 20 70 6c 69 73 74 3d 3d 6e 75     if( plist==nu
4f90: 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 40  ll ) return;.  @
4fa0: 20 20 20 66 6f 72 28 76 61 72 20 78 20 69 6e 20     for(var x in 
4fb0: 70 6c 69 73 74 29 7b 0a 20 20 40 20 20 20 20 20  plist){.  @     
4fc0: 76 61 72 20 70 69 64 20 3d 20 70 6c 69 73 74 5b  var pid = plist[
4fd0: 78 5d 3b 0a 20 20 40 20 20 20 20 20 69 66 28 20  x];.  @     if( 
4fe0: 73 65 74 6f 6e 65 28 70 69 64 2c 63 6c 72 29 3d  setone(pid,clr)=
4ff0: 3d 31 20 29 7b 0a 20 20 40 20 20 20 20 20 20 20  =1 ){.  @       
5000: 73 65 74 5f 70 61 72 65 6e 74 73 28 70 69 64 2c  set_parents(pid,
5010: 63 6c 72 29 3b 0a 20 20 40 20 20 20 20 20 7d 0a  clr);.  @     }.
5020: 20 20 40 20 20 20 7d 0a 20 20 40 20 7d 0a 20 20    @   }.  @ }.  
5030: 40 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 5f 63  @ function set_c
5040: 68 69 6c 64 72 65 6e 28 69 64 2c 63 6c 72 29 7b  hildren(id,clr){
5050: 0a 20 20 40 20 20 20 76 61 72 20 63 6c 69 73 74  .  @   var clist
5060: 20 3d 20 63 68 69 6c 64 6f 66 5b 69 64 5d 3b 0a   = childof[id];.
5070: 20 20 40 20 20 20 69 66 28 20 63 6c 69 73 74 3d    @   if( clist=
5080: 3d 6e 75 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a  =null ) return;.
5090: 20 20 40 20 20 20 66 6f 72 28 76 61 72 20 78 20    @   for(var x 
50a0: 69 6e 20 63 6c 69 73 74 29 7b 0a 20 20 40 20 20  in clist){.  @  
50b0: 20 20 20 76 61 72 20 63 69 64 20 3d 20 63 6c 69     var cid = cli
50c0: 73 74 5b 78 5d 3b 0a 20 20 40 20 20 20 20 20 69  st[x];.  @     i
50d0: 66 28 20 73 65 74 6f 6e 65 28 63 69 64 2c 63 6c  f( setone(cid,cl
50e0: 72 29 3d 3d 31 20 29 7b 0a 20 20 40 20 20 20 20  r)==1 ){.  @    
50f0: 20 20 20 73 65 74 5f 63 68 69 6c 64 72 65 6e 28     set_children(
5100: 63 69 64 2c 63 6c 72 29 3b 0a 20 20 40 20 20 20  cid,clr);.  @   
5110: 20 20 7d 0a 20 20 40 20 20 20 7d 0a 20 20 40 20    }.  @   }.  @ 
5120: 7d 0a 20 20 40 20 3c 2f 73 63 72 69 70 74 3e 0a  }.  @ </script>.
5130: 20 20 40 20 3c 68 72 3e 0a 20 20 40 20 3c 66 6f    @ <hr>.  @ <fo
5140: 72 6d 20 6d 65 74 68 6f 64 3d 22 47 45 54 22 20  rm method="GET" 
5150: 61 63 74 69 6f 6e 3d 22 25 73 28 67 2e 7a 42 61  action="%s(g.zBa
5160: 73 65 55 52 4c 29 2f 74 69 6d 65 6c 69 6e 65 22  seURL)/timeline"
5170: 3e 0a 20 20 40 20 53 74 61 72 74 20 44 61 74 65  >.  @ Start Date
5180: 3a 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70  :.  @ <input typ
5190: 65 3d 22 74 65 78 74 22 20 73 69 7a 65 3d 22 33  e="text" size="3
51a0: 30 22 20 76 61 6c 75 65 3d 22 25 68 28 7a 53 74  0" value="%h(zSt
51b0: 61 72 74 29 22 20 6e 61 6d 65 3d 22 64 22 3e 0a  art)" name="d">.
51c0: 20 20 40 20 4e 75 6d 62 65 72 20 4f 66 20 45 6e    @ Number Of En
51d0: 74 72 69 65 73 3a 20 20 0a 20 20 40 20 3c 69 6e  tries:  .  @ <in
51e0: 70 75 74 20 74 79 70 65 3d 22 74 65 78 74 22 20  put type="text" 
51f0: 73 69 7a 65 3d 22 34 22 20 76 61 6c 75 65 3d 22  size="4" value="
5200: 25 64 28 6e 45 6e 74 72 79 29 22 20 6e 61 6d 65  %d(nEntry)" name
5210: 3d 22 6e 22 3e 0a 20 20 40 20 3c 62 72 3e 3c 69  ="n">.  @ <br><i
5220: 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69  nput type="submi
5230: 74 22 20 76 61 6c 75 65 3d 22 53 75 62 6d 69 74  t" value="Submit
5240: 22 3e 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20  ">.  @ </form>. 
5250: 20 40 20 3c 74 61 62 6c 65 3e 3c 74 72 3e 3c 74   @ <table><tr><t
5260: 64 3e 0a 20 20 40 20 3c 66 6f 72 6d 20 6d 65 74  d>.  @ <form met
5270: 68 6f 64 3d 22 47 45 54 22 20 61 63 74 69 6f 6e  hod="GET" action
5280: 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29  ="%s(g.zBaseURL)
5290: 2f 74 69 6d 65 6c 69 6e 65 22 3e 0a 20 20 40 20  /timeline">.  @ 
52a0: 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 68 69 64  <input type="hid
52b0: 64 65 6e 22 20 76 61 6c 75 65 3d 22 25 64 28 6c  den" value="%d(l
52c0: 61 73 74 45 76 65 6e 74 29 22 20 6e 61 6d 65 3d  astEvent)" name=
52d0: 22 65 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20  "e">.  @ <input 
52e0: 74 79 70 65 3d 22 68 69 64 64 65 6e 22 20 76 61  type="hidden" va
52f0: 6c 75 65 3d 22 25 64 28 6e 45 6e 74 72 79 29 22  lue="%d(nEntry)"
5300: 20 6e 61 6d 65 3d 22 6e 22 3e 0a 20 20 40 20 3c   name="n">.  @ <
5310: 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d  input type="subm
5320: 69 74 22 20 76 61 6c 75 65 3d 22 4e 65 78 74 20  it" value="Next 
5330: 25 64 28 6e 45 6e 74 72 79 29 20 52 6f 77 73 22  %d(nEntry) Rows"
5340: 3e 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 3c 2f 74  >.  @ </form></t
5350: 64 3e 3c 74 64 3e 0a 20 20 40 20 3c 66 6f 72 6d  d><td>.  @ <form
5360: 20 6d 65 74 68 6f 64 3d 22 47 45 54 22 20 61 63   method="GET" ac
5370: 74 69 6f 6e 3d 22 25 73 28 67 2e 7a 42 61 73 65  tion="%s(g.zBase
5380: 55 52 4c 29 2f 74 69 6d 65 6c 69 6e 65 22 3e 0a  URL)/timeline">.
5390: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
53a0: 22 68 69 64 64 65 6e 22 20 76 61 6c 75 65 3d 22  "hidden" value="
53b0: 25 64 28 66 69 72 73 74 45 76 65 6e 74 29 22 20  %d(firstEvent)" 
53c0: 6e 61 6d 65 3d 22 65 22 3e 0a 20 20 40 20 3c 69  name="e">.  @ <i
53d0: 6e 70 75 74 20 74 79 70 65 3d 22 68 69 64 64 65  nput type="hidde
53e0: 6e 22 20 76 61 6c 75 65 3d 22 25 64 28 6e 45 6e  n" value="%d(nEn
53f0: 74 72 79 29 22 20 6e 61 6d 65 3d 22 6e 22 3e 0a  try)" name="n">.
5400: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
5410: 22 68 69 64 64 65 6e 22 20 76 61 6c 75 65 3d 22  "hidden" value="
5420: 31 22 20 6e 61 6d 65 3d 22 61 22 3e 0a 20 20 40  1" name="a">.  @
5430: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75   <input type="su
5440: 62 6d 69 74 22 20 76 61 6c 75 65 3d 22 50 72 65  bmit" value="Pre
5450: 76 69 6f 75 73 20 25 64 28 6e 45 6e 74 72 79 29  vious %d(nEntry)
5460: 20 52 6f 77 73 22 3e 0a 20 20 40 20 3c 2f 66 6f   Rows">.  @ </fo
5470: 72 6d 3e 3c 2f 74 64 3e 3c 2f 74 72 3e 3c 2f 74  rm></td></tr></t
5480: 61 62 6c 65 3e 0a 20 20 73 74 79 6c 65 5f 66 6f  able>.  style_fo
5490: 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  oter();.}../*.**
54a0: 20 54 68 65 20 69 6e 70 75 74 20 71 75 65 72 79   The input query
54b0: 20 71 20 73 65 6c 65 63 74 73 20 76 61 72 69 6f   q selects vario
54c0: 75 73 20 72 65 63 6f 72 64 73 2e 20 20 50 72 69  us records.  Pri
54d0: 6e 74 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61  nt a human-reada
54e0: 62 6c 65 0a 2a 2a 20 73 75 6d 6d 61 72 79 20 6f  ble.** summary o
54f0: 66 20 74 68 6f 73 65 20 72 65 63 6f 72 64 73 2e  f those records.
5500: 0a 2a 2a 0a 2a 2a 20 4c 69 6d 69 74 20 74 68 65  .**.** Limit the
5510: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
5520: 65 73 20 70 72 69 6e 74 65 64 20 74 6f 20 6e 4c  es printed to nL
5530: 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  ine..** .** The 
5540: 71 75 65 72 79 20 73 68 6f 75 6c 64 20 72 65 74  query should ret
5550: 75 72 6e 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e  urn these column
5560: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 30 2e 20 20  s:.**.**    0.  
5570: 72 69 64 0a 2a 2a 20 20 20 20 31 2e 20 20 75 75  rid.**    1.  uu
5580: 69 64 0a 2a 2a 20 20 20 20 32 2e 20 20 44 61 74  id.**    2.  Dat
5590: 65 2f 54 69 6d 65 0a 2a 2a 20 20 20 20 33 2e 20  e/Time.**    3. 
55a0: 20 43 6f 6d 6d 65 6e 74 20 73 74 72 69 6e 67 20   Comment string 
55b0: 61 6e 64 20 75 73 65 72 0a 2a 2a 20 20 20 20 34  and user.**    4
55c0: 2e 20 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e  .  Number of non
55d0: 2d 6d 65 72 67 65 20 63 68 69 6c 64 72 65 6e 0a  -merge children.
55e0: 2a 2a 20 20 20 20 35 2e 20 20 4e 75 6d 62 65 72  **    5.  Number
55f0: 20 6f 66 20 70 61 72 65 6e 74 73 0a 2a 2f 0a 76   of parents.*/.v
5600: 6f 69 64 20 70 72 69 6e 74 5f 74 69 6d 65 6c 69  oid print_timeli
5610: 6e 65 28 53 74 6d 74 20 2a 71 2c 20 69 6e 74 20  ne(Stmt *q, int 
5620: 6d 78 4c 69 6e 65 29 7b 0a 20 20 69 6e 74 20 6e  mxLine){.  int n
5630: 4c 69 6e 65 20 3d 20 30 3b 0a 20 20 63 68 61 72  Line = 0;.  char
5640: 20 7a 50 72 65 76 44 61 74 65 5b 32 30 5d 3b 0a   zPrevDate[20];.
5650: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
5660: 75 72 72 65 6e 74 55 75 69 64 3d 30 3b 0a 20 20  urrentUuid=0;.  
5670: 53 74 6d 74 20 63 75 72 72 65 6e 74 51 3b 0a 20  Stmt currentQ;. 
5680: 20 69 6e 74 20 72 69 64 20 3d 20 64 62 5f 6c 67   int rid = db_lg
5690: 65 74 5f 69 6e 74 28 22 63 68 65 63 6b 6f 75 74  et_int("checkout
56a0: 22 2c 20 30 29 3b 0a 20 20 7a 50 72 65 76 44 61  ", 0);.  zPrevDa
56b0: 74 65 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 64 62  te[0] = 0;..  db
56c0: 5f 70 72 65 70 61 72 65 28 26 63 75 72 72 65 6e  _prepare(&curren
56d0: 74 51 2c 0a 20 20 20 20 22 53 45 4c 45 43 54 20  tQ,.    "SELECT 
56e0: 75 75 69 64 22 0a 20 20 20 20 22 20 20 46 52 4f  uuid".    "  FRO
56f0: 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64  M blob WHERE rid
5700: 3d 25 64 22 2c 20 72 69 64 0a 20 20 29 3b 0a 20  =%d", rid.  );. 
5710: 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 63 75   if( db_step(&cu
5720: 72 72 65 6e 74 51 29 3d 3d 53 51 4c 49 54 45 5f  rrentQ)==SQLITE_
5730: 52 4f 57 20 29 7b 0a 20 20 20 20 7a 43 75 72 72  ROW ){.    zCurr
5740: 65 6e 74 55 75 69 64 20 3d 20 64 62 5f 63 6f 6c  entUuid = db_col
5750: 75 6d 6e 5f 74 65 78 74 28 26 63 75 72 72 65 6e  umn_text(&curren
5760: 74 51 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 77  tQ, 0);.  }..  w
5770: 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 71 29  hile( db_step(q)
5780: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26 26 20  ==SQLITE_ROW && 
5790: 6e 4c 69 6e 65 3c 3d 6d 78 4c 69 6e 65 20 29 7b  nLine<=mxLine ){
57a0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
57b0: 2a 7a 49 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  *zId = db_column
57c0: 5f 74 65 78 74 28 71 2c 20 31 29 3b 0a 20 20 20  _text(q, 1);.   
57d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
57e0: 74 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  te = db_column_t
57f0: 65 78 74 28 71 2c 20 32 29 3b 0a 20 20 20 20 63  ext(q, 2);.    c
5800: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 20  onst char *zCom 
5810: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
5820: 28 71 2c 20 33 29 3b 0a 20 20 20 20 69 6e 74 20  (q, 3);.    int 
5830: 6e 43 68 69 6c 64 20 3d 20 64 62 5f 63 6f 6c 75  nChild = db_colu
5840: 6d 6e 5f 69 6e 74 28 71 2c 20 34 29 3b 0a 20 20  mn_int(q, 4);.  
5850: 20 20 69 6e 74 20 6e 50 61 72 65 6e 74 20 3d 20    int nParent = 
5860: 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 71 2c  db_column_int(q,
5870: 20 35 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   5);.    char *z
5880: 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Free = 0;.    in
5890: 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  t n = 0;.    cha
58a0: 72 20 7a 50 72 65 66 69 78 5b 38 30 5d 3b 0a 20  r zPrefix[80];. 
58b0: 20 20 20 63 68 61 72 20 7a 55 75 69 64 5b 55 55     char zUuid[UU
58c0: 49 44 5f 53 49 5a 45 2b 31 5d 3b 0a 20 20 20 20  ID_SIZE+1];.    
58d0: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 55 75  .    sprintf(zUu
58e0: 69 64 2c 20 22 25 2e 31 30 73 22 2c 20 7a 49 64  id, "%.10s", zId
58f0: 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  );.    if( memcm
5900: 70 28 7a 44 61 74 65 2c 20 7a 50 72 65 76 44 61  p(zDate, zPrevDa
5910: 74 65 2c 20 31 30 29 20 29 7b 0a 20 20 20 20 20  te, 10) ){.     
5920: 20 70 72 69 6e 74 66 28 22 3d 3d 3d 20 25 2e 31   printf("=== %.1
5930: 30 73 20 3d 3d 3d 5c 6e 22 2c 20 7a 44 61 74 65  0s ===\n", zDate
5940: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
5950: 7a 50 72 65 76 44 61 74 65 2c 20 7a 44 61 74 65  zPrevDate, zDate
5960: 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 6e 4c 69  , 10);.      nLi
5970: 6e 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ne++;.    }.    
5980: 69 66 28 20 7a 43 6f 6d 3d 3d 30 20 29 20 7a 43  if( zCom==0 ) zC
5990: 6f 6d 20 3d 20 22 22 3b 0a 20 20 20 20 70 72 69  om = "";.    pri
59a0: 6e 74 66 28 22 25 2e 38 73 20 22 2c 20 26 7a 44  ntf("%.8s ", &zD
59b0: 61 74 65 5b 31 31 5d 29 3b 0a 20 20 20 20 7a 50  ate[11]);.    zP
59c0: 72 65 66 69 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  refix[0] = 0;.  
59d0: 20 20 69 66 28 20 6e 50 61 72 65 6e 74 3e 31 20    if( nParent>1 
59e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
59f0: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
5a00: 28 7a 50 72 65 66 69 78 29 2c 20 7a 50 72 65 66  (zPrefix), zPref
5a10: 69 78 2c 20 22 2a 4d 45 52 47 45 2a 20 22 29 3b  ix, "*MERGE* ");
5a20: 0a 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65  .      n = strle
5a30: 6e 28 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20  n(zPrefix);.    
5a40: 7d 0a 20 20 20 20 69 66 28 20 6e 43 68 69 6c 64  }.    if( nChild
5a50: 3e 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >1 ){.      sqli
5a60: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
5a70: 65 6f 66 28 7a 50 72 65 66 69 78 29 2d 6e 2c 20  eof(zPrefix)-n, 
5a80: 26 7a 50 72 65 66 69 78 5b 6e 5d 2c 20 22 2a 46  &zPrefix[n], "*F
5a90: 4f 52 4b 2a 20 22 29 3b 0a 20 20 20 20 20 20 6e  ORK* ");.      n
5aa0: 20 3d 20 73 74 72 6c 65 6e 28 7a 50 72 65 66 69   = strlen(zPrefi
5ab0: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  x);.    }.    if
5ac0: 28 20 73 74 72 63 6d 70 28 7a 43 75 72 72 65 6e  ( strcmp(zCurren
5ad0: 74 55 75 69 64 2c 7a 49 64 29 3d 3d 30 20 29 7b  tUuid,zId)==0 ){
5ae0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
5af0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
5b00: 50 72 65 66 69 78 29 2d 6e 2c 20 26 7a 50 72 65  Prefix)-n, &zPre
5b10: 66 69 78 5b 6e 5d 2c 20 22 2a 43 55 52 52 45 4e  fix[n], "*CURREN
5b20: 54 2a 20 22 29 3b 0a 20 20 20 20 20 20 6e 20 2b  T* ");.      n +
5b30: 3d 20 73 74 72 6c 65 6e 28 7a 50 72 65 66 69 78  = strlen(zPrefix
5b40: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 72  );.    }.    zFr
5b50: 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ee = sqlite3_mpr
5b60: 69 6e 74 66 28 22 5b 25 2e 31 30 73 5d 20 25 73  intf("[%.10s] %s
5b70: 25 73 22 2c 20 7a 55 75 69 64 2c 20 7a 50 72 65  %s", zUuid, zPre
5b80: 66 69 78 2c 20 7a 43 6f 6d 29 3b 0a 20 20 20 20  fix, zCom);.    
5b90: 6e 4c 69 6e 65 20 2b 3d 20 63 6f 6d 6d 65 6e 74  nLine += comment
5ba0: 5f 70 72 69 6e 74 28 7a 46 72 65 65 2c 20 39 2c  _print(zFree, 9,
5bb0: 20 37 39 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   79);.    sqlite
5bc0: 33 5f 66 72 65 65 28 7a 46 72 65 65 29 3b 0a 20  3_free(zFree);. 
5bd0: 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65   }.  db_finalize
5be0: 28 26 63 75 72 72 65 6e 74 51 29 3b 0a 7d 0a 0a  (&currentQ);.}..
5bf0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
5c00: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74  ointer to a stat
5c10: 69 63 20 73 74 72 69 6e 67 20 74 68 61 74 20 66  ic string that f
5c20: 6f 72 6d 73 20 74 68 65 20 62 61 73 69 73 20 66  orms the basis f
5c30: 6f 72 0a 2a 2a 20 61 20 74 69 6d 65 6c 69 6e 65  or.** a timeline
5c40: 20 71 75 65 72 79 20 66 6f 72 20 64 69 73 70 6c   query for displ
5c50: 61 79 20 6f 6e 20 61 20 54 54 59 2e 0a 2a 2f 0a  ay on a TTY..*/.
5c60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 69 6d 65  const char *time
5c70: 6c 69 6e 65 5f 71 75 65 72 79 5f 66 6f 72 5f 74  line_query_for_t
5c80: 74 79 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  ty(void){.  stat
5c90: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 42  ic const char zB
5ca0: 61 73 65 53 71 6c 5b 5d 20 3d 20 0a 20 20 20 20  aseSql[] = .    
5cb0: 40 20 53 45 4c 45 43 54 0a 20 20 20 20 40 20 20  @ SELECT.    @  
5cc0: 20 62 6c 6f 62 2e 72 69 64 2c 0a 20 20 20 20 40   blob.rid,.    @
5cd0: 20 20 20 75 75 69 64 2c 0a 20 20 20 20 40 20 20     uuid,.    @  
5ce0: 20 64 61 74 65 74 69 6d 65 28 65 76 65 6e 74 2e   datetime(event.
5cf0: 6d 74 69 6d 65 2c 27 6c 6f 63 61 6c 74 69 6d 65  mtime,'localtime
5d00: 27 29 2c 0a 20 20 20 20 40 20 20 20 63 6f 61 6c  '),.    @   coal
5d10: 65 73 63 65 28 65 63 6f 6d 6d 65 6e 74 2c 63 6f  esce(ecomment,co
5d20: 6d 6d 65 6e 74 29 20 7c 7c 20 27 20 28 62 79 20  mment) || ' (by 
5d30: 27 20 7c 7c 20 63 6f 61 6c 65 73 63 65 28 65 75  ' || coalesce(eu
5d40: 73 65 72 2c 75 73 65 72 2c 27 3f 27 29 20 7c 7c  ser,user,'?') ||
5d50: 27 29 27 2c 0a 20 20 20 20 40 20 20 20 28 53 45  ')',.    @   (SE
5d60: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
5d70: 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 70  OM plink WHERE p
5d80: 69 64 3d 62 6c 6f 62 2e 72 69 64 20 41 4e 44 20  id=blob.rid AND 
5d90: 69 73 70 72 69 6d 29 2c 0a 20 20 20 20 40 20 20  isprim),.    @  
5da0: 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   (SELECT count(*
5db0: 29 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45  ) FROM plink WHE
5dc0: 52 45 20 63 69 64 3d 62 6c 6f 62 2e 72 69 64 29  RE cid=blob.rid)
5dd0: 0a 20 20 20 20 40 20 46 52 4f 4d 20 65 76 65 6e  .    @ FROM even
5de0: 74 2c 20 62 6c 6f 62 0a 20 20 20 20 40 20 57 48  t, blob.    @ WH
5df0: 45 52 45 20 62 6c 6f 62 2e 72 69 64 3d 65 76 65  ERE blob.rid=eve
5e00: 6e 74 2e 6f 62 6a 69 64 0a 20 20 3b 0a 20 20 72  nt.objid.  ;.  r
5e10: 65 74 75 72 6e 20 7a 42 61 73 65 53 71 6c 3b 0a  eturn zBaseSql;.
5e20: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44  }../*.** COMMAND
5e30: 3a 20 74 69 6d 65 6c 69 6e 65 0a 2a 2a 0a 2a 2a  : timeline.**.**
5e40: 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20   Usage: %fossil 
5e50: 74 69 6d 65 6c 69 6e 65 20 3f 57 48 45 4e 3f 20  timeline ?WHEN? 
5e60: 3f 55 55 49 44 7c 44 41 54 45 54 49 4d 45 3f 20  ?UUID|DATETIME? 
5e70: 3f 2d 6e 7c 2d 2d 63 6f 75 6e 74 20 4e 3f 0a 2a  ?-n|--count N?.*
5e80: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 75 6d  *.** Print a sum
5e90: 6d 61 72 79 20 6f 66 20 61 63 74 69 76 69 74 79  mary of activity
5ea0: 20 67 6f 69 6e 67 20 62 61 63 6b 77 61 72 64 73   going backwards
5eb0: 20 69 6e 20 64 61 74 65 20 61 6e 64 20 74 69 6d   in date and tim
5ec0: 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6f  e.** specified o
5ed0: 72 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  r from the curre
5ee0: 6e 74 20 64 61 74 65 20 61 6e 64 20 74 69 6d 65  nt date and time
5ef0: 20 69 66 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73   if no arguments
5f00: 0a 2a 2a 20 61 72 65 20 67 69 76 65 6e 2e 20 20  .** are given.  
5f10: 53 68 6f 77 20 61 73 20 6d 61 6e 79 20 61 73 20  Show as many as 
5f20: 4e 20 28 64 65 66 61 75 6c 74 20 32 30 29 20 63  N (default 20) c
5f30: 68 65 63 6b 2d 69 6e 73 2e 20 20 54 68 65 0a 2a  heck-ins.  The.*
5f40: 2a 20 57 48 45 4e 20 61 72 67 75 6d 65 6e 74 20  * WHEN argument 
5f50: 63 61 6e 20 62 65 20 61 6e 79 20 75 6e 69 71 75  can be any uniqu
5f60: 65 20 61 62 62 72 65 76 69 61 74 69 6f 6e 20 6f  e abbreviation o
5f70: 66 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 0a 2a  f one of these.*
5f80: 2a 20 6b 65 79 77 6f 72 64 73 3a 0a 2a 2a 0a 2a  * keywords:.**.*
5f90: 2a 20 20 20 20 20 62 65 66 6f 72 65 0a 2a 2a 20  *     before.** 
5fa0: 20 20 20 20 61 66 74 65 72 0a 2a 2a 20 20 20 20      after.**    
5fb0: 20 64 65 73 63 65 6e 64 65 6e 74 73 20 7c 20 63   descendents | c
5fc0: 68 69 6c 64 72 65 6e 0a 2a 2a 20 20 20 20 20 61  hildren.**     a
5fd0: 6e 63 65 73 74 6f 72 73 20 7c 20 70 61 72 65 6e  ncestors | paren
5fe0: 74 73 0a 2a 2a 0a 2a 2a 20 54 68 65 20 55 55 49  ts.**.** The UUI
5ff0: 44 20 63 61 6e 20 62 65 20 61 6e 79 20 75 6e 69  D can be any uni
6000: 71 75 65 20 70 72 65 66 69 78 20 6f 66 20 34 20  que prefix of 4 
6010: 63 68 61 72 61 63 74 65 72 73 20 6f 72 20 6d 6f  characters or mo
6020: 72 65 2e 0a 2a 2a 20 54 68 65 20 44 41 54 45 54  re..** The DATET
6030: 49 4d 45 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  IME should be in
6040: 20 74 68 65 20 49 53 4f 38 36 30 31 20 66 6f 72   the ISO8601 for
6050: 6d 61 74 2e 20 20 46 6f 72 0a 2a 2a 20 65 78 61  mat.  For.** exa
6060: 6d 70 6c 65 73 3a 20 22 32 30 30 37 2d 30 38 2d  mples: "2007-08-
6070: 31 38 20 30 37 3a 32 31 3a 32 31 22 2e 20 20 59  18 07:21:21".  Y
6080: 6f 75 20 63 61 6e 20 61 6c 73 6f 20 73 61 79 20  ou can also say 
6090: 22 63 75 72 72 65 6e 74 22 0a 2a 2a 20 66 6f 72  "current".** for
60a0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 65 72   the current ver
60b0: 73 69 6f 6e 20 6f 72 20 22 6e 6f 77 22 20 66 6f  sion or "now" fo
60c0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  r the current ti
60d0: 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 74 69 6d 65  me..*/.void time
60e0: 6c 69 6e 65 5f 63 6d 64 28 76 6f 69 64 29 7b 0a  line_cmd(void){.
60f0: 20 20 53 74 6d 74 20 71 3b 0a 20 20 69 6e 74 20    Stmt q;.  int 
6100: 6e 2c 20 6b 3b 0a 20 20 63 6f 6e 73 74 20 63 68  n, k;.  const ch
6110: 61 72 20 2a 7a 43 6f 75 6e 74 3b 0a 20 20 63 68  ar *zCount;.  ch
6120: 61 72 20 2a 7a 4f 72 69 67 69 6e 3b 0a 20 20 63  ar *zOrigin;.  c
6130: 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20 20 63 68  har *zDate;.  ch
6140: 61 72 20 2a 7a 53 51 4c 3b 0a 20 20 69 6e 74 20  ar *zSQL;.  int 
6150: 6f 62 6a 69 64 20 3d 20 30 3b 0a 20 20 42 6c 6f  objid = 0;.  Blo
6160: 62 20 75 75 69 64 3b 0a 20 20 69 6e 74 20 6d 6f  b uuid;.  int mo
6170: 64 65 20 3d 20 31 20 3b 20 20 20 20 20 20 20 2f  de = 1 ;       /
6180: 2a 20 31 3a 20 62 65 66 6f 72 65 20 20 32 3a 61  * 1: before  2:a
6190: 66 74 65 72 20 20 33 3a 63 68 69 6c 64 72 65 6e  fter  3:children
61a0: 20 20 34 3a 70 61 72 65 6e 74 73 20 2a 2f 0a 20    4:parents */. 
61b0: 20 64 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f 70 65   db_find_and_ope
61c0: 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 29 3b 0a  n_repository();.
61d0: 20 20 7a 43 6f 75 6e 74 20 3d 20 66 69 6e 64 5f    zCount = find_
61e0: 6f 70 74 69 6f 6e 28 22 6e 22 2c 22 63 6f 75 6e  option("n","coun
61f0: 74 22 2c 31 29 3b 0a 20 20 69 66 28 20 7a 43 6f  t",1);.  if( zCo
6200: 75 6e 74 20 29 7b 0a 20 20 20 20 6e 20 3d 20 61  unt ){.    n = a
6210: 74 6f 69 28 7a 43 6f 75 6e 74 29 3b 0a 20 20 7d  toi(zCount);.  }
6220: 65 6c 73 65 7b 0a 20 20 20 20 6e 20 3d 20 32 30  else{.    n = 20
6230: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 2e 61 72  ;.  }.  if( g.ar
6240: 67 63 3d 3d 34 20 29 7b 0a 20 20 20 20 6b 20 3d  gc==4 ){.    k =
6250: 20 73 74 72 6c 65 6e 28 67 2e 61 72 67 76 5b 32   strlen(g.argv[2
6260: 5d 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e  ]);.    if( strn
6270: 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c 22 62  cmp(g.argv[2],"b
6280: 65 66 6f 72 65 22 2c 6b 29 3d 3d 30 20 29 7b 0a  efore",k)==0 ){.
6290: 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 31 3b 0a        mode = 1;.
62a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
62b0: 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c  rncmp(g.argv[2],
62c0: 22 61 66 74 65 72 22 2c 6b 29 3d 3d 30 20 26 26  "after",k)==0 &&
62d0: 20 6b 3e 31 20 29 7b 0a 20 20 20 20 20 20 6d 6f   k>1 ){.      mo
62e0: 64 65 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73  de = 2;.    }els
62f0: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 67 2e  e if( strncmp(g.
6300: 61 72 67 76 5b 32 5d 2c 22 64 65 73 63 65 6e 64  argv[2],"descend
6310: 65 6e 74 73 22 2c 6b 29 3d 3d 30 20 29 7b 0a 20  ents",k)==0 ){. 
6320: 20 20 20 20 20 6d 6f 64 65 20 3d 20 33 3b 0a 20       mode = 3;. 
6330: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
6340: 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c 22  ncmp(g.argv[2],"
6350: 63 68 69 6c 64 72 65 6e 22 2c 6b 29 3d 3d 30 20  children",k)==0 
6360: 29 7b 0a 20 20 20 20 20 20 6d 6f 64 65 20 3d 20  ){.      mode = 
6370: 33 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  3;.    }else if(
6380: 20 73 74 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b   strncmp(g.argv[
6390: 32 5d 2c 22 61 6e 63 65 73 74 6f 72 73 22 2c 6b  2],"ancestors",k
63a0: 29 3d 3d 30 20 26 26 20 6b 3e 31 20 29 7b 0a 20  )==0 && k>1 ){. 
63b0: 20 20 20 20 20 6d 6f 64 65 20 3d 20 34 3b 0a 20       mode = 4;. 
63c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
63d0: 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c 22  ncmp(g.argv[2],"
63e0: 70 61 72 65 6e 74 73 22 2c 6b 29 3d 3d 30 20 29  parents",k)==0 )
63f0: 7b 0a 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 34  {.      mode = 4
6400: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6410: 20 20 20 75 73 61 67 65 28 22 3f 57 48 45 4e 3f     usage("?WHEN?
6420: 20 3f 55 55 49 44 7c 44 41 54 45 54 49 4d 45 3f   ?UUID|DATETIME?
6430: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4f  ");.    }.    zO
6440: 72 69 67 69 6e 20 3d 20 67 2e 61 72 67 76 5b 33  rigin = g.argv[3
6450: 5d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67  ];.  }else if( g
6460: 2e 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20 20 20  .argc==3 ){.    
6470: 7a 4f 72 69 67 69 6e 20 3d 20 67 2e 61 72 67 76  zOrigin = g.argv
6480: 5b 32 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  [2];.  }else{.  
6490: 20 20 7a 4f 72 69 67 69 6e 20 3d 20 22 6e 6f 77    zOrigin = "now
64a0: 22 3b 0a 20 20 7d 0a 20 20 6b 20 3d 20 73 74 72  ";.  }.  k = str
64b0: 6c 65 6e 28 7a 4f 72 69 67 69 6e 29 3b 0a 20 20  len(zOrigin);.  
64c0: 62 6c 6f 62 5f 7a 65 72 6f 28 26 75 75 69 64 29  blob_zero(&uuid)
64d0: 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28  ;.  blob_append(
64e0: 26 75 75 69 64 2c 20 7a 4f 72 69 67 69 6e 2c 20  &uuid, zOrigin, 
64f0: 2d 31 29 3b 0a 20 20 69 66 28 20 73 74 72 63 6d  -1);.  if( strcm
6500: 70 28 7a 4f 72 69 67 69 6e 2c 20 22 6e 6f 77 22  p(zOrigin, "now"
6510: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
6520: 6d 6f 64 65 3d 3d 33 20 7c 7c 20 6d 6f 64 65 3d  mode==3 || mode=
6530: 3d 34 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73  =4 ){.      foss
6540: 69 6c 5f 66 61 74 61 6c 28 22 63 61 6e 6e 6f 74  il_fatal("cannot
6550: 20 63 6f 6d 70 75 74 65 20 64 65 73 63 65 6e 64   compute descend
6560: 65 6e 74 73 20 6f 72 20 61 6e 63 65 73 74 6f 72  ents or ancestor
6570: 73 20 6f 66 20 61 20 64 61 74 65 22 29 3b 0a 20  s of a date");. 
6580: 20 20 20 7d 0a 20 20 20 20 7a 44 61 74 65 20 3d     }.    zDate =
6590: 20 6d 70 72 69 6e 74 66 28 22 28 53 45 4c 45 43   mprintf("(SELEC
65a0: 54 20 64 61 74 65 74 69 6d 65 28 27 6e 6f 77 27  T datetime('now'
65b0: 29 29 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ))");.  }else if
65c0: 28 20 73 74 72 6e 63 6d 70 28 7a 4f 72 69 67 69  ( strncmp(zOrigi
65d0: 6e 2c 20 22 63 75 72 72 65 6e 74 22 2c 20 6b 29  n, "current", k)
65e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 62 6a 69 64  ==0 ){.    objid
65f0: 20 3d 20 64 62 5f 6c 67 65 74 5f 69 6e 74 28 22   = db_lget_int("
6600: 63 68 65 63 6b 6f 75 74 22 2c 30 29 3b 0a 20 20  checkout",0);.  
6610: 20 20 7a 44 61 74 65 20 3d 20 6d 70 72 69 6e 74    zDate = mprint
6620: 66 28 22 28 53 45 4c 45 43 54 20 6d 74 69 6d 65  f("(SELECT mtime
6630: 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52   FROM plink WHER
6640: 45 20 63 69 64 3d 25 64 29 22 2c 20 6f 62 6a 69  E cid=%d)", obji
6650: 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  d);.  }else if( 
6660: 6e 61 6d 65 5f 74 6f 5f 75 75 69 64 28 26 75 75  name_to_uuid(&uu
6670: 69 64 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20  id, 0)==0 ){.   
6680: 20 6f 62 6a 69 64 20 3d 20 64 62 5f 69 6e 74 28   objid = db_int(
6690: 30 2c 20 22 53 45 4c 45 43 54 20 72 69 64 20 46  0, "SELECT rid F
66a0: 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 75  ROM blob WHERE u
66b0: 75 69 64 3d 25 42 22 2c 20 26 75 75 69 64 29 3b  uid=%B", &uuid);
66c0: 0a 20 20 20 20 7a 44 61 74 65 20 3d 20 6d 70 72  .    zDate = mpr
66d0: 69 6e 74 66 28 22 28 53 45 4c 45 43 54 20 6d 74  intf("(SELECT mt
66e0: 69 6d 65 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57  ime FROM plink W
66f0: 48 45 52 45 20 63 69 64 3d 25 64 29 22 2c 20 6f  HERE cid=%d)", o
6700: 62 6a 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  bjid);.  }else{.
6710: 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 33 20      if( mode==3 
6720: 7c 7c 20 6d 6f 64 65 3d 3d 34 20 29 7b 0a 20 20  || mode==4 ){.  
6730: 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c      fossil_fatal
6740: 28 22 63 61 6e 6e 6f 74 20 63 6f 6d 70 75 74 65  ("cannot compute
6750: 20 64 65 73 63 65 6e 64 65 6e 74 73 20 6f 72 20   descendents or 
6760: 61 6e 63 65 73 74 6f 72 73 20 6f 66 20 61 20 64  ancestors of a d
6770: 61 74 65 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ate");.    }.   
6780: 20 7a 44 61 74 65 20 3d 20 6d 70 72 69 6e 74 66   zDate = mprintf
6790: 28 22 28 53 45 4c 45 43 54 20 6a 75 6c 69 61 6e  ("(SELECT julian
67a0: 64 61 79 28 25 51 2c 20 27 75 74 63 27 29 29 22  day(%Q, 'utc'))"
67b0: 2c 20 7a 4f 72 69 67 69 6e 29 3b 0a 20 20 7d 0a  , zOrigin);.  }.
67c0: 20 20 7a 53 51 4c 20 3d 20 6d 70 72 69 6e 74 66    zSQL = mprintf
67d0: 28 22 25 73 20 41 4e 44 20 65 76 65 6e 74 2e 6d  ("%s AND event.m
67e0: 74 69 6d 65 20 25 73 20 25 73 22 2c 0a 20 20 20  time %s %s",.   
67f0: 20 20 74 69 6d 65 6c 69 6e 65 5f 71 75 65 72 79    timeline_query
6800: 5f 66 6f 72 5f 74 74 79 28 29 2c 0a 20 20 20 20  _for_tty(),.    
6810: 20 28 6d 6f 64 65 3d 3d 31 20 7c 7c 20 6d 6f 64   (mode==1 || mod
6820: 65 3d 3d 34 29 20 3f 20 22 3c 3d 22 20 3a 20 22  e==4) ? "<=" : "
6830: 3e 3d 22 2c 0a 20 20 20 20 20 7a 44 61 74 65 0a  >=",.     zDate.
6840: 20 20 29 3b 0a 20 20 69 66 28 20 6d 6f 64 65 3d    );.  if( mode=
6850: 3d 33 20 7c 7c 20 6d 6f 64 65 3d 3d 34 20 29 7b  =3 || mode==4 ){
6860: 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78  .    db_multi_ex
6870: 65 63 28 22 43 52 45 41 54 45 20 54 45 4d 50 20  ec("CREATE TEMP 
6880: 54 41 42 4c 45 20 6f 6b 28 72 69 64 20 49 4e 54  TABLE ok(rid INT
6890: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
68a0: 29 22 29 3b 0a 20 20 20 20 69 66 28 20 6d 6f 64  )");.    if( mod
68b0: 65 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 63 6f  e==3 ){.      co
68c0: 6d 70 75 74 65 5f 64 65 73 63 65 6e 64 65 6e 74  mpute_descendent
68d0: 73 28 6f 62 6a 69 64 2c 20 6e 29 3b 0a 20 20 20  s(objid, n);.   
68e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
68f0: 6d 70 75 74 65 5f 61 6e 63 65 73 74 6f 72 73 28  mpute_ancestors(
6900: 6f 62 6a 69 64 2c 20 6e 29 3b 0a 20 20 20 20 7d  objid, n);.    }
6910: 0a 20 20 20 20 7a 53 51 4c 20 3d 20 6d 70 72 69  .    zSQL = mpri
6920: 6e 74 66 28 22 25 7a 20 41 4e 44 20 62 6c 6f 62  ntf("%z AND blob
6930: 2e 72 69 64 20 49 4e 20 6f 6b 22 2c 20 7a 53 51  .rid IN ok", zSQ
6940: 4c 29 3b 0a 20 20 7d 0a 20 20 7a 53 51 4c 20 3d  L);.  }.  zSQL =
6950: 20 6d 70 72 69 6e 74 66 28 22 25 7a 20 4f 52 44   mprintf("%z ORD
6960: 45 52 20 42 59 20 65 76 65 6e 74 2e 6d 74 69 6d  ER BY event.mtim
6970: 65 20 44 45 53 43 22 2c 20 7a 53 51 4c 29 3b 0a  e DESC", zSQL);.
6980: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c    db_prepare(&q,
6990: 20 7a 53 51 4c 29 3b 0a 20 20 70 72 69 6e 74 5f   zSQL);.  print_
69a0: 74 69 6d 65 6c 69 6e 65 28 26 71 2c 20 6e 29 3b  timeline(&q, n);
69b0: 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26  .  db_finalize(&
69c0: 71 29 3b 0a 7d 0a                                q);.}.