Hex Artifact Content
Not logged in

Artifact 6f6c62303afeab9c319cc63de0ae84cd1618f18c:

File src/timeline.c part of check-in [ebb2765954] - Add the timeline display preferences page with the ability to turn on and off block markup in timeline comments and to limit the length of timeline comments. by drh on 2007-12-04 02:47:49. Also file src/timeline.c part of check-in [d0305b305a] - Merged mainline into my branch to get the newest application. by aku on 2007-12-05 08:07:46.

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 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
17e0: 74 65 72 20 74 6f 20 61 20 63 6f 6e 73 74 61 6e  ter to a constan
17f0: 74 20 73 74 72 69 6e 67 20 74 68 61 74 20 66 6f  t string that fo
1800: 72 6d 73 20 74 68 65 20 62 61 73 69 73 0a 2a 2a  rms the basis.**
1810: 20 66 6f 72 20 61 20 74 69 6d 65 6c 69 6e 65 20   for a timeline 
1820: 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 57 57  query for the WW
1830: 57 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  W interface..*/.
1840: 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 69 6d 65  const char *time
1850: 6c 69 6e 65 5f 71 75 65 72 79 5f 66 6f 72 5f 77  line_query_for_w
1860: 77 77 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  ww(void){.  stat
1870: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 42  ic const char zB
1880: 61 73 65 53 71 6c 5b 5d 20 3d 0a 20 20 20 20 40  aseSql[] =.    @
1890: 20 53 45 4c 45 43 54 0a 20 20 20 20 40 20 20 20   SELECT.    @   
18a0: 62 6c 6f 62 2e 72 69 64 2c 0a 20 20 20 20 40 20  blob.rid,.    @ 
18b0: 20 20 75 75 69 64 2c 0a 20 20 20 20 40 20 20 20    uuid,.    @   
18c0: 64 61 74 65 74 69 6d 65 28 65 76 65 6e 74 2e 6d  datetime(event.m
18d0: 74 69 6d 65 2c 27 6c 6f 63 61 6c 74 69 6d 65 27  time,'localtime'
18e0: 29 20 41 53 20 74 69 6d 65 73 74 61 6d 70 2c 0a  ) AS timestamp,.
18f0: 20 20 20 20 40 20 20 20 63 6f 61 6c 65 73 63 65      @   coalesce
1900: 28 65 63 6f 6d 6d 65 6e 74 2c 20 63 6f 6d 6d 65  (ecomment, comme
1910: 6e 74 29 2c 0a 20 20 20 20 40 20 20 20 63 6f 61  nt),.    @   coa
1920: 6c 65 73 63 65 28 65 75 73 65 72 2c 20 75 73 65  lesce(euser, use
1930: 72 29 2c 0a 20 20 20 20 40 20 20 20 28 53 45 4c  r),.    @   (SEL
1940: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
1950: 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 70 69  M plink WHERE pi
1960: 64 3d 62 6c 6f 62 2e 72 69 64 20 41 4e 44 20 69  d=blob.rid AND i
1970: 73 70 72 69 6d 3d 31 29 2c 0a 20 20 20 20 40 20  sprim=1),.    @ 
1980: 20 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    (SELECT count(
1990: 2a 29 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48  *) FROM plink WH
19a0: 45 52 45 20 63 69 64 3d 62 6c 6f 62 2e 72 69 64  ERE cid=blob.rid
19b0: 29 2c 0a 20 20 20 20 40 20 20 20 4e 4f 54 20 45  ),.    @   NOT E
19c0: 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 31 20  XISTS (SELECT 1 
19d0: 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45  FROM plink WHERE
19e0: 20 70 69 64 3d 62 6c 6f 62 2e 72 69 64 29 2c 0a   pid=blob.rid),.
19f0: 20 20 20 20 40 20 20 20 63 6f 61 6c 65 73 63 65      @   coalesce
1a00: 28 62 67 63 6f 6c 6f 72 2c 20 62 72 62 67 63 6f  (bgcolor, brbgco
1a10: 6c 6f 72 29 2c 0a 20 20 20 20 40 20 20 20 65 76  lor),.    @   ev
1a20: 65 6e 74 2e 74 79 70 65 0a 20 20 20 20 40 20 20  ent.type.    @  
1a30: 46 52 4f 4d 20 65 76 65 6e 74 20 4a 4f 49 4e 20  FROM event JOIN 
1a40: 62 6c 6f 62 20 0a 20 20 20 20 40 20 57 48 45 52  blob .    @ WHER
1a50: 45 20 62 6c 6f 62 2e 72 69 64 3d 65 76 65 6e 74  E blob.rid=event
1a60: 2e 6f 62 6a 69 64 0a 20 20 3b 0a 20 20 72 65 74  .objid.  ;.  ret
1a70: 75 72 6e 20 7a 42 61 73 65 53 71 6c 3b 0a 7d 0a  urn zBaseSql;.}.
1a80: 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20  ./*.** WEBPAGE: 
1a90: 74 69 6d 65 6c 69 6e 65 0a 2a 2a 0a 2a 2a 20 51  timeline.**.** Q
1aa0: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 3a  uery parameters:
1ab0: 0a 2a 2a 0a 2a 2a 20 20 20 20 64 3d 53 54 41 52  .**.**    d=STAR
1ac0: 54 44 41 54 45 20 20 20 20 64 61 74 65 20 69 6e  TDATE    date in
1ad0: 20 69 73 6f 38 36 30 31 20 6e 6f 74 61 74 69 6f   iso8601 notatio
1ae0: 6e 2e 20 20 20 20 20 20 20 20 20 20 64 66 6c 74  n.          dflt
1af0: 3a 20 6e 65 77 65 73 74 20 65 76 65 6e 74 0a 2a  : newest event.*
1b00: 2a 20 20 20 20 6e 3d 49 4e 54 45 47 45 52 20 20  *    n=INTEGER  
1b10: 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 65 76      number of ev
1b20: 65 6e 74 73 20 74 6f 20 73 68 6f 77 2e 20 20 20  ents to show.   
1b30: 20 20 20 20 20 20 20 64 66 6c 74 3a 20 32 35 0a         dflt: 25.
1b40: 2a 2a 20 20 20 20 65 3d 49 4e 54 45 47 45 52 20  **    e=INTEGER 
1b50: 20 20 20 20 20 73 74 61 72 74 69 6e 67 20 65 76       starting ev
1b60: 65 6e 74 20 69 64 2e 20 20 20 20 20 20 20 20 20  ent id.         
1b70: 20 20 20 20 20 20 20 20 64 66 6c 74 3a 20 6e 69          dflt: ni
1b80: 6c 0a 2a 2a 20 20 20 20 75 3d 4e 41 4d 45 20 20  l.**    u=NAME  
1b90: 20 20 20 20 20 20 20 73 68 6f 77 20 6f 6e 6c 79         show only
1ba0: 20 65 76 65 6e 74 73 20 66 72 6f 6d 20 75 73 65   events from use
1bb0: 72 2e 20 20 20 20 20 20 20 20 64 66 6c 74 3a 20  r.        dflt: 
1bc0: 6e 69 6c 0a 2a 2a 20 20 20 20 61 20 20 20 20 20  nil.**    a     
1bd0: 20 20 20 20 20 20 20 20 20 73 68 6f 77 20 65 76           show ev
1be0: 65 6e 74 73 20 61 66 74 65 72 20 61 6e 64 20 69  ents after and i
1bf0: 6e 63 6c 75 64 69 6e 67 2e 20 20 20 64 66 6c 74  ncluding.   dflt
1c00: 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 72 20  : false.**    r 
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f               sho
1c20: 77 20 6f 6e 6c 79 20 72 65 6c 61 74 65 64 20 65  w only related e
1c30: 76 65 6e 74 73 2e 20 20 20 20 20 20 20 20 20 20  vents.          
1c40: 64 66 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20  dflt: false.**  
1c50: 20 20 79 3d 54 59 50 45 20 20 20 20 20 20 20 20    y=TYPE        
1c60: 20 73 68 6f 77 20 6f 6e 6c 79 20 54 59 50 45 20   show only TYPE 
1c70: 28 27 63 69 27 20 6f 72 20 27 77 27 29 20 20 20  ('ci' or 'w')   
1c80: 20 20 20 20 64 66 6c 74 3a 20 6e 69 6c 0a 2a 2a      dflt: nil.**
1c90: 20 20 20 20 73 20 20 20 20 20 20 20 20 20 20 20      s           
1ca0: 20 20 20 73 68 6f 77 20 74 68 65 20 53 51 4c 20     show the SQL 
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 20 20 20 20 64 66 6c 74 3a 20 6e 69 6c 0a        dflt: nil.
1cd0: 2a 2f 0a 76 6f 69 64 20 70 61 67 65 5f 74 69 6d  */.void page_tim
1ce0: 65 6c 69 6e 65 28 76 6f 69 64 29 7b 0a 20 20 53  eline(void){.  S
1cf0: 74 6d 74 20 71 3b 0a 20 20 42 6c 6f 62 20 73 71  tmt q;.  Blob sq
1d00: 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 53 51 4c 3b  l;.  char *zSQL;
1d10: 0a 20 20 42 6c 6f 62 20 73 63 72 69 70 74 49 6e  .  Blob scriptIn
1d20: 69 74 3b 0a 20 20 63 68 61 72 20 7a 44 61 74 65  it;.  char zDate
1d30: 5b 31 30 30 5d 3b 0a 20 20 63 6f 6e 73 74 20 63  [100];.  const c
1d40: 68 61 72 20 2a 7a 53 74 61 72 74 20 3d 20 50 28  har *zStart = P(
1d50: 22 64 22 29 3b 0a 20 20 69 6e 74 20 6e 45 6e 74  "d");.  int nEnt
1d60: 72 79 20 3d 20 61 74 6f 69 28 50 44 28 22 6e 22  ry = atoi(PD("n"
1d70: 2c 22 32 30 22 29 29 3b 0a 20 20 63 6f 6e 73 74  ,"20"));.  const
1d80: 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 50   char *zUser = P
1d90: 28 22 75 22 29 3b 0a 20 20 69 6e 74 20 6f 62 6a  ("u");.  int obj
1da0: 69 64 20 3d 20 61 74 6f 69 28 50 44 28 22 65 22  id = atoi(PD("e"
1db0: 2c 22 30 22 29 29 3b 0a 20 20 69 6e 74 20 72 65  ,"0"));.  int re
1dc0: 6c 61 74 65 64 45 76 65 6e 74 73 20 3d 20 50 28  latedEvents = P(
1dd0: 22 72 22 29 21 3d 30 3b 0a 20 20 69 6e 74 20 61  "r")!=0;.  int a
1de0: 66 74 65 72 46 6c 61 67 20 3d 20 50 28 22 61 22  fterFlag = P("a"
1df0: 29 21 3d 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68  )!=0;.  const ch
1e00: 61 72 20 2a 7a 54 79 70 65 20 3d 20 50 28 22 79  ar *zType = P("y
1e10: 22 29 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 45  ");.  int firstE
1e20: 76 65 6e 74 3b 0a 20 20 69 6e 74 20 6c 61 73 74  vent;.  int last
1e30: 45 76 65 6e 74 3b 0a 0a 20 20 2f 2a 20 54 6f 20  Event;..  /* To 
1e40: 76 69 65 77 20 74 68 65 20 74 69 6d 65 6c 69 6e  view the timelin
1e50: 65 2c 20 6d 75 73 74 20 68 61 76 65 20 70 65 72  e, must have per
1e60: 6d 69 73 73 69 6f 6e 20 74 6f 20 72 65 61 64 20  mission to read 
1e70: 70 72 6f 6a 65 63 74 20 64 61 74 61 2e 0a 20 20  project data..  
1e80: 2a 2f 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b  */.  login_check
1e90: 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a  _credentials();.
1ea0: 20 20 69 66 28 20 21 67 2e 6f 6b 52 65 61 64 20    if( !g.okRead 
1eb0: 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28  ){ login_needed(
1ec0: 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 0a 20 20  ); return; }..  
1ed0: 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 54 69  style_header("Ti
1ee0: 6d 65 6c 69 6e 65 22 29 3b 0a 20 20 69 66 28 20  meline");.  if( 
1ef0: 21 67 2e 6f 6b 48 69 73 74 6f 72 79 20 26 26 0a  !g.okHistory &&.
1f00: 20 20 20 20 20 20 64 62 5f 65 78 69 73 74 73 28        db_exists(
1f10: 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 75  "SELECT 1 FROM u
1f20: 73 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20  ser".           
1f30: 20 20 20 20 20 22 20 57 48 45 52 45 20 6c 6f 67       " WHERE log
1f40: 69 6e 3d 27 61 6e 6f 6e 79 6d 6f 75 73 27 22 0a  in='anonymous'".
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 22 20 20 20 41 4e 44 20 63 61 70 20 4c 49 4b 45  "   AND cap LIKE
1f70: 20 27 25 25 68 25 25 27 22 29 20 29 7b 0a 20 20   '%%h%%'") ){.  
1f80: 20 20 40 20 3c 70 3e 3c 62 3e 4e 6f 74 65 3a 3c    @ <p><b>Note:<
1f90: 2f 62 3e 20 59 6f 75 20 77 69 6c 6c 20 62 65 20  /b> You will be 
1fa0: 61 62 6c 65 20 74 6f 20 61 63 63 65 73 73 20 3c  able to access <
1fb0: 75 3e 6d 75 63 68 3c 2f 75 3e 20 6d 6f 72 65 0a  u>much</u> more.
1fc0: 20 20 20 20 40 20 68 69 73 74 6f 72 69 63 61 6c      @ historical
1fd0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20   information if 
1fe0: 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 54  <a href="%s(g.zT
1ff0: 6f 70 29 2f 6c 6f 67 69 6e 22 3e 6c 6f 67 69 6e  op)/login">login
2000: 3c 2f 61 3e 2e 3c 2f 70 3e 0a 20 20 7d 0a 20 20  </a>.</p>.  }.  
2010: 62 6c 6f 62 5f 7a 65 72 6f 28 26 73 71 6c 29 3b  blob_zero(&sql);
2020: 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26  .  blob_append(&
2030: 73 71 6c 2c 20 74 69 6d 65 6c 69 6e 65 5f 71 75  sql, timeline_qu
2040: 65 72 79 5f 66 6f 72 5f 77 77 77 28 29 2c 20 2d  ery_for_www(), -
2050: 31 29 3b 0a 20 20 69 66 28 20 7a 54 79 70 65 20  1);.  if( zType 
2060: 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  ){.    blob_appe
2070: 6e 64 66 28 26 73 71 6c 2c 20 22 20 41 4e 44 20  ndf(&sql, " AND 
2080: 65 76 65 6e 74 2e 74 79 70 65 3d 25 51 22 2c 20  event.type=%Q", 
2090: 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 69 66  zType);.  }.  if
20a0: 28 20 7a 55 73 65 72 20 29 7b 0a 20 20 20 20 62  ( zUser ){.    b
20b0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 71 6c  lob_appendf(&sql
20c0: 2c 20 22 20 41 4e 44 20 65 76 65 6e 74 2e 75 73  , " AND event.us
20d0: 65 72 3d 25 51 22 2c 20 7a 55 73 65 72 29 3b 0a  er=%Q", zUser);.
20e0: 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 69 64 20    }.  if( objid 
20f0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
2100: 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c   db_text(0, "SEL
2110: 45 43 54 20 64 61 74 65 74 69 6d 65 28 65 76 65  ECT datetime(eve
2120: 6e 74 2e 6d 74 69 6d 65 2c 20 27 6c 6f 63 61 6c  nt.mtime, 'local
2130: 74 69 6d 65 27 29 20 46 52 4f 4d 20 65 76 65 6e  time') FROM even
2140: 74 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t".             
2150: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
2160: 45 52 45 20 6f 62 6a 69 64 3d 25 64 22 2c 20 6f  ERE objid=%d", o
2170: 62 6a 69 64 29 3b 0a 20 20 20 20 69 66 28 20 7a  bjid);.    if( z
2180: 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 61 72 74   ){.      zStart
2190: 20 3d 20 7a 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = z;.    }.  }.
21a0: 20 20 69 66 28 20 7a 53 74 61 72 74 20 29 7b 0a    if( zStart ){.
21b0: 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61      while( isspa
21c0: 63 65 28 7a 53 74 61 72 74 5b 30 5d 29 20 29 7b  ce(zStart[0]) ){
21d0: 20 7a 53 74 61 72 74 2b 2b 3b 20 7d 0a 20 20 20   zStart++; }.   
21e0: 20 69 66 28 20 7a 53 74 61 72 74 5b 30 5d 20 29   if( zStart[0] )
21f0: 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70  {.      blob_app
2200: 65 6e 64 66 28 26 73 71 6c 2c 20 0a 20 20 20 20  endf(&sql, .    
2210: 20 20 20 20 20 22 20 41 4e 44 20 65 76 65 6e 74       " AND event
2220: 2e 6d 74 69 6d 65 20 25 73 20 28 53 45 4c 45 43  .mtime %s (SELEC
2230: 54 20 6a 75 6c 69 61 6e 64 61 79 28 25 51 2c 20  T julianday(%Q, 
2240: 27 75 74 63 27 29 29 22 2c 0a 20 20 20 20 20 20  'utc'))",.      
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 20 20 61 66 74 65 72 46 6c 61 67 20 3f 20      afterFlag ? 
2270: 22 3e 3d 22 20 3a 20 22 3c 3d 22 2c 20 7a 53 74  ">=" : "<=", zSt
2280: 61 72 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  art);.    }.  }.
2290: 20 20 69 66 28 20 72 65 6c 61 74 65 64 45 76 65    if( relatedEve
22a0: 6e 74 73 20 26 26 20 6f 62 6a 69 64 20 29 7b 0a  nts && objid ){.
22b0: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
22c0: 63 28 0a 20 20 20 20 20 20 20 22 43 52 45 41 54  c(.       "CREAT
22d0: 45 20 54 45 4d 50 20 54 41 42 4c 45 20 49 46 20  E TEMP TABLE IF 
22e0: 4e 4f 54 20 45 58 49 53 54 53 20 6f 6b 28 72 69  NOT EXISTS ok(ri
22f0: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
2300: 59 20 4b 45 59 29 22 0a 20 20 20 20 29 3b 0a 20  Y KEY)".    );. 
2310: 20 20 20 69 66 28 20 61 66 74 65 72 46 6c 61 67     if( afterFlag
2320: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74   ){.      comput
2330: 65 5f 64 65 73 63 65 6e 64 65 6e 74 73 28 6f 62  e_descendents(ob
2340: 6a 69 64 2c 20 6e 45 6e 74 72 79 29 3b 0a 20 20  jid, nEntry);.  
2350: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
2360: 6f 6d 70 75 74 65 5f 61 6e 63 65 73 74 6f 72 73  ompute_ancestors
2370: 28 6f 62 6a 69 64 2c 20 6e 45 6e 74 72 79 29 3b  (objid, nEntry);
2380: 0a 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 5f  .    }.    blob_
2390: 61 70 70 65 6e 64 28 26 73 71 6c 2c 20 22 20 41  append(&sql, " A
23a0: 4e 44 20 65 76 65 6e 74 2e 6f 62 6a 69 64 20 49  ND event.objid I
23b0: 4e 20 6f 6b 22 2c 20 2d 31 29 3b 0a 20 20 7d 0a  N ok", -1);.  }.
23c0: 20 20 69 66 28 20 61 66 74 65 72 46 6c 61 67 20    if( afterFlag 
23d0: 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  ){.    blob_appe
23e0: 6e 64 66 28 26 73 71 6c 2c 20 22 20 4f 52 44 45  ndf(&sql, " ORDE
23f0: 52 20 42 59 20 65 76 65 6e 74 2e 6d 74 69 6d 65  R BY event.mtime
2400: 20 41 53 43 20 4c 49 4d 49 54 20 25 64 22 2c 0a   ASC LIMIT %d",.
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 20 6e 45 6e 74 72 79 29 3b 0a 20 20 7d 65 6c 73   nEntry);.  }els
2430: 65 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  e{.    blob_appe
2440: 6e 64 66 28 26 73 71 6c 2c 20 22 20 4f 52 44 45  ndf(&sql, " ORDE
2450: 52 20 42 59 20 65 76 65 6e 74 2e 6d 74 69 6d 65  R BY event.mtime
2460: 20 44 45 53 43 20 4c 49 4d 49 54 20 25 64 22 2c   DESC LIMIT %d",
2470: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2480: 20 20 6e 45 6e 74 72 79 29 3b 0a 20 20 7d 0a 20    nEntry);.  }. 
2490: 20 7a 53 51 4c 20 3d 20 62 6c 6f 62 5f 73 74 72   zSQL = blob_str
24a0: 28 26 73 71 6c 29 3b 0a 20 20 69 66 28 20 61 66  (&sql);.  if( af
24b0: 74 65 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 7a  terFlag ){.    z
24c0: 53 51 4c 20 3d 20 6d 70 72 69 6e 74 66 28 22 53  SQL = mprintf("S
24d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 25 73  ELECT * FROM (%s
24e0: 29 20 4f 52 44 45 52 20 42 59 20 74 69 6d 65 73  ) ORDER BY times
24f0: 74 61 6d 70 20 44 45 53 43 22 2c 20 7a 53 51 4c  tamp DESC", zSQL
2500: 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 70 72 65 70  );.  }.  db_prep
2510: 61 72 65 28 26 71 2c 20 7a 53 51 4c 29 3b 0a 20  are(&q, zSQL);. 
2520: 20 69 66 28 20 50 28 22 73 22 29 21 3d 30 20 29   if( P("s")!=0 )
2530: 7b 0a 20 20 20 20 40 20 3c 68 72 3e 3c 70 3e 25  {.    @ <hr><p>%
2540: 68 28 7a 53 51 4c 29 3c 2f 70 3e 3c 68 72 3e 0a  h(zSQL)</p><hr>.
2550: 20 20 7d 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28    }.  blob_zero(
2560: 26 73 71 6c 29 3b 0a 20 20 69 66 28 20 61 66 74  &sql);.  if( aft
2570: 65 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 66 72  erFlag ){.    fr
2580: 65 65 28 7a 53 51 4c 29 3b 0a 20 20 7d 0a 20 20  ee(zSQL);.  }.  
2590: 7a 44 61 74 65 5b 30 5d 20 3d 20 30 3b 0a 20 20  zDate[0] = 0;.  
25a0: 62 6c 6f 62 5f 7a 65 72 6f 28 26 73 63 72 69 70  blob_zero(&scrip
25b0: 74 49 6e 69 74 29 3b 0a 20 20 7a 44 61 74 65 5b  tInit);.  zDate[
25c0: 30 5d 20 3d 20 30 3b 0a 20 20 77 77 77 5f 70 72  0] = 0;.  www_pr
25d0: 69 6e 74 5f 74 69 6d 65 6c 69 6e 65 28 26 71 2c  int_timeline(&q,
25e0: 20 26 66 69 72 73 74 45 76 65 6e 74 2c 20 26 6c   &firstEvent, &l
25f0: 61 73 74 45 76 65 6e 74 2c 0a 20 20 20 20 20 20  astEvent,.      
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2610: 61 76 65 5f 70 61 72 65 6e 74 61 67 65 5f 6a 61  ave_parentage_ja
2620: 76 61 73 63 72 69 70 74 2c 20 26 73 63 72 69 70  vascript, &scrip
2630: 74 49 6e 69 74 29 3b 0a 20 20 64 62 5f 66 69 6e  tInit);.  db_fin
2640: 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 40 20 3c  alize(&q);.  @ <
2650: 70 3e 66 69 72 73 74 45 76 65 6e 74 3d 25 64 28  p>firstEvent=%d(
2660: 66 69 72 73 74 45 76 65 6e 74 29 20 6c 61 73 74  firstEvent) last
2670: 45 76 65 6e 74 3d 25 64 28 6c 61 73 74 45 76 65  Event=%d(lastEve
2680: 6e 74 29 3c 2f 70 3e 0a 20 20 69 66 28 20 7a 53  nt)</p>.  if( zS
2690: 74 61 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  tart==0 ){.    z
26a0: 53 74 61 72 74 20 3d 20 7a 44 61 74 65 3b 0a 20  Start = zDate;. 
26b0: 20 7d 0a 20 20 40 20 3c 73 63 72 69 70 74 3e 0a   }.  @ <script>.
26c0: 20 20 40 20 76 61 72 20 70 61 72 65 6e 74 6f 66    @ var parentof
26d0: 20 3d 20 6e 65 77 20 4f 62 6a 65 63 74 28 29 3b   = new Object();
26e0: 0a 20 20 40 20 76 61 72 20 63 68 69 6c 64 6f 66  .  @ var childof
26f0: 20 3d 20 6e 65 77 20 4f 62 6a 65 63 74 28 29 3b   = new Object();
2700: 0a 20 20 63 67 69 5f 61 70 70 65 6e 64 5f 63 6f  .  cgi_append_co
2710: 6e 74 65 6e 74 28 62 6c 6f 62 5f 62 75 66 66 65  ntent(blob_buffe
2720: 72 28 26 73 63 72 69 70 74 49 6e 69 74 29 2c 20  r(&scriptInit), 
2730: 62 6c 6f 62 5f 73 69 7a 65 28 26 73 63 72 69 70  blob_size(&scrip
2740: 74 49 6e 69 74 29 29 3b 0a 20 20 62 6c 6f 62 5f  tInit));.  blob_
2750: 72 65 73 65 74 28 26 73 63 72 69 70 74 49 6e 69  reset(&scriptIni
2760: 74 29 3b 0a 20 20 40 20 66 75 6e 63 74 69 6f 6e  t);.  @ function
2770: 20 73 65 74 61 6c 6c 28 76 61 6c 75 65 29 7b 0a   setall(value){.
2780: 20 20 40 20 20 20 66 6f 72 28 76 61 72 20 78 20    @   for(var x 
2790: 69 6e 20 70 61 72 65 6e 74 6f 66 29 7b 0a 20 20  in parentof){.  
27a0: 40 20 20 20 20 20 73 65 74 6f 6e 65 28 78 2c 76  @     setone(x,v
27b0: 61 6c 75 65 29 3b 0a 20 20 40 20 20 20 7d 0a 20  alue);.  @   }. 
27c0: 20 40 20 7d 0a 20 20 40 20 73 65 74 61 6c 6c 28   @ }.  @ setall(
27d0: 22 23 66 66 66 66 66 66 22 29 3b 0a 20 20 40 20  "#ffffff");.  @ 
27e0: 66 75 6e 63 74 69 6f 6e 20 73 65 74 6f 6e 65 28  function setone(
27f0: 69 64 2c 20 63 6c 72 29 7b 0a 20 20 40 20 20 20  id, clr){.  @   
2800: 69 66 28 20 70 61 72 65 6e 74 6f 66 5b 69 64 5d  if( parentof[id]
2810: 3d 3d 6e 75 6c 6c 20 29 20 72 65 74 75 72 6e 20  ==null ) return 
2820: 30 3b 0a 20 20 40 20 20 20 76 61 72 20 77 20 3d  0;.  @   var w =
2830: 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65   document.getEle
2840: 6d 65 6e 74 42 79 49 64 28 69 64 29 3b 0a 20 20  mentById(id);.  
2850: 40 20 20 20 69 66 28 20 77 2e 73 74 79 6c 65 2e  @   if( w.style.
2860: 63 6f 6c 6f 72 3d 3d 63 6c 72 20 29 7b 0a 20 20  color==clr ){.  
2870: 40 20 20 20 20 20 72 65 74 75 72 6e 20 30 0a 20  @     return 0. 
2880: 20 40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 40 20   @   }else{.  @ 
2890: 20 20 20 20 77 2e 73 74 79 6c 65 2e 63 6f 6c 6f      w.style.colo
28a0: 72 20 3d 20 63 6c 72 0a 20 20 40 20 20 20 20 20  r = clr.  @     
28b0: 72 65 74 75 72 6e 20 31 0a 20 20 40 20 20 20 7d  return 1.  @   }
28c0: 0a 20 20 40 20 7d 0a 20 20 40 20 66 75 6e 63 74  .  @ }.  @ funct
28d0: 69 6f 6e 20 78 69 6e 28 69 64 29 20 7b 0a 20 20  ion xin(id) {.  
28e0: 40 20 20 20 73 65 74 61 6c 6c 28 22 23 66 66 66  @   setall("#fff
28f0: 66 66 66 22 29 3b 0a 20 20 40 20 20 20 73 65 74  fff");.  @   set
2900: 6f 6e 65 28 69 64 2c 22 23 66 66 30 30 30 30 22  one(id,"#ff0000"
2910: 29 3b 0a 20 20 40 20 20 20 73 65 74 5f 63 68 69  );.  @   set_chi
2920: 6c 64 72 65 6e 28 69 64 2c 20 22 23 62 30 62 30  ldren(id, "#b0b0
2930: 62 30 22 29 3b 0a 20 20 40 20 20 20 73 65 74 5f  b0");.  @   set_
2940: 70 61 72 65 6e 74 73 28 69 64 2c 20 22 23 62 30  parents(id, "#b0
2950: 62 30 62 30 22 29 3b 0a 20 20 40 20 20 20 66 6f  b0b0");.  @   fo
2960: 72 28 76 61 72 20 78 20 69 6e 20 70 61 72 65 6e  r(var x in paren
2970: 74 6f 66 5b 69 64 5d 29 7b 0a 20 20 40 20 20 20  tof[id]){.  @   
2980: 20 20 76 61 72 20 70 69 64 20 3d 20 70 61 72 65    var pid = pare
2990: 6e 74 6f 66 5b 69 64 5d 5b 78 5d 0a 20 20 40 20  ntof[id][x].  @ 
29a0: 20 20 20 20 76 61 72 20 77 20 3d 20 64 6f 63 75      var w = docu
29b0: 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42  ment.getElementB
29c0: 79 49 64 28 70 69 64 29 3b 0a 20 20 40 20 20 20  yId(pid);.  @   
29d0: 20 20 69 66 28 20 77 21 3d 6e 75 6c 6c 20 29 7b    if( w!=null ){
29e0: 0a 20 20 40 20 20 20 20 20 20 20 77 2e 73 74 79  .  @       w.sty
29f0: 6c 65 2e 63 6f 6c 6f 72 20 3d 20 22 23 30 30 30  le.color = "#000
2a00: 30 30 30 22 3b 0a 20 20 40 20 20 20 20 20 7d 0a  000";.  @     }.
2a10: 20 20 40 20 20 20 7d 0a 20 20 40 20 20 20 66 6f    @   }.  @   fo
2a20: 72 28 76 61 72 20 78 20 69 6e 20 63 68 69 6c 64  r(var x in child
2a30: 6f 66 5b 69 64 5d 29 7b 0a 20 20 40 20 20 20 20  of[id]){.  @    
2a40: 20 76 61 72 20 63 69 64 20 3d 20 63 68 69 6c 64   var cid = child
2a50: 6f 66 5b 69 64 5d 5b 78 5d 0a 20 20 40 20 20 20  of[id][x].  @   
2a60: 20 20 76 61 72 20 77 20 3d 20 64 6f 63 75 6d 65    var w = docume
2a70: 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79 49  nt.getElementByI
2a80: 64 28 63 69 64 29 3b 0a 20 20 40 20 20 20 20 20  d(cid);.  @     
2a90: 69 66 28 20 77 21 3d 6e 75 6c 6c 20 29 7b 0a 20  if( w!=null ){. 
2aa0: 20 40 20 20 20 20 20 20 20 77 2e 73 74 79 6c 65   @       w.style
2ab0: 2e 63 6f 6c 6f 72 20 3d 20 22 23 30 30 30 30 30  .color = "#00000
2ac0: 30 22 3b 0a 20 20 40 20 20 20 20 20 7d 0a 20 20  0";.  @     }.  
2ad0: 40 20 20 20 7d 0a 20 20 40 20 7d 0a 20 20 40 20  @   }.  @ }.  @ 
2ae0: 66 75 6e 63 74 69 6f 6e 20 78 6f 75 74 28 69 64  function xout(id
2af0: 29 20 7b 0a 20 20 40 20 20 20 2f 2a 20 73 65 74  ) {.  @   /* set
2b00: 61 6c 6c 28 22 23 30 30 30 30 30 30 22 29 3b 20  all("#000000"); 
2b10: 2a 2f 0a 20 20 40 20 7d 0a 20 20 40 20 66 75 6e  */.  @ }.  @ fun
2b20: 63 74 69 6f 6e 20 73 65 74 5f 70 61 72 65 6e 74  ction set_parent
2b30: 73 28 69 64 2c 20 63 6c 72 29 7b 0a 20 20 40 20  s(id, clr){.  @ 
2b40: 20 20 76 61 72 20 70 6c 69 73 74 20 3d 20 70 61    var plist = pa
2b50: 72 65 6e 74 6f 66 5b 69 64 5d 3b 0a 20 20 40 20  rentof[id];.  @ 
2b60: 20 20 69 66 28 20 70 6c 69 73 74 3d 3d 6e 75 6c    if( plist==nul
2b70: 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 40 20  l ) return;.  @ 
2b80: 20 20 66 6f 72 28 76 61 72 20 78 20 69 6e 20 70    for(var x in p
2b90: 6c 69 73 74 29 7b 0a 20 20 40 20 20 20 20 20 76  list){.  @     v
2ba0: 61 72 20 70 69 64 20 3d 20 70 6c 69 73 74 5b 78  ar pid = plist[x
2bb0: 5d 3b 0a 20 20 40 20 20 20 20 20 69 66 28 20 73  ];.  @     if( s
2bc0: 65 74 6f 6e 65 28 70 69 64 2c 63 6c 72 29 3d 3d  etone(pid,clr)==
2bd0: 31 20 29 7b 0a 20 20 40 20 20 20 20 20 20 20 73  1 ){.  @       s
2be0: 65 74 5f 70 61 72 65 6e 74 73 28 70 69 64 2c 63  et_parents(pid,c
2bf0: 6c 72 29 3b 0a 20 20 40 20 20 20 20 20 7d 0a 20  lr);.  @     }. 
2c00: 20 40 20 20 20 7d 0a 20 20 40 20 7d 0a 20 20 40   @   }.  @ }.  @
2c10: 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 5f 63 68   function set_ch
2c20: 69 6c 64 72 65 6e 28 69 64 2c 63 6c 72 29 7b 0a  ildren(id,clr){.
2c30: 20 20 40 20 20 20 76 61 72 20 63 6c 69 73 74 20    @   var clist 
2c40: 3d 20 63 68 69 6c 64 6f 66 5b 69 64 5d 3b 0a 20  = childof[id];. 
2c50: 20 40 20 20 20 69 66 28 20 63 6c 69 73 74 3d 3d   @   if( clist==
2c60: 6e 75 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20  null ) return;. 
2c70: 20 40 20 20 20 66 6f 72 28 76 61 72 20 78 20 69   @   for(var x i
2c80: 6e 20 63 6c 69 73 74 29 7b 0a 20 20 40 20 20 20  n clist){.  @   
2c90: 20 20 76 61 72 20 63 69 64 20 3d 20 63 6c 69 73    var cid = clis
2ca0: 74 5b 78 5d 3b 0a 20 20 40 20 20 20 20 20 69 66  t[x];.  @     if
2cb0: 28 20 73 65 74 6f 6e 65 28 63 69 64 2c 63 6c 72  ( setone(cid,clr
2cc0: 29 3d 3d 31 20 29 7b 0a 20 20 40 20 20 20 20 20  )==1 ){.  @     
2cd0: 20 20 73 65 74 5f 63 68 69 6c 64 72 65 6e 28 63    set_children(c
2ce0: 69 64 2c 63 6c 72 29 3b 0a 20 20 40 20 20 20 20  id,clr);.  @    
2cf0: 20 7d 0a 20 20 40 20 20 20 7d 0a 20 20 40 20 7d   }.  @   }.  @ }
2d00: 0a 20 20 40 20 3c 2f 73 63 72 69 70 74 3e 0a 20  .  @ </script>. 
2d10: 20 40 20 3c 68 72 3e 0a 20 20 40 20 3c 66 6f 72   @ <hr>.  @ <for
2d20: 6d 20 6d 65 74 68 6f 64 3d 22 47 45 54 22 20 61  m method="GET" a
2d30: 63 74 69 6f 6e 3d 22 25 73 28 67 2e 7a 42 61 73  ction="%s(g.zBas
2d40: 65 55 52 4c 29 2f 74 69 6d 65 6c 69 6e 65 22 3e  eURL)/timeline">
2d50: 0a 20 20 40 20 53 74 61 72 74 20 44 61 74 65 3a  .  @ Start Date:
2d60: 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65  .  @ <input type
2d70: 3d 22 74 65 78 74 22 20 73 69 7a 65 3d 22 33 30  ="text" size="30
2d80: 22 20 76 61 6c 75 65 3d 22 25 68 28 7a 53 74 61  " value="%h(zSta
2d90: 72 74 29 22 20 6e 61 6d 65 3d 22 64 22 3e 0a 20  rt)" name="d">. 
2da0: 20 40 20 4e 75 6d 62 65 72 20 4f 66 20 45 6e 74   @ Number Of Ent
2db0: 72 69 65 73 3a 20 20 0a 20 20 40 20 3c 69 6e 70  ries:  .  @ <inp
2dc0: 75 74 20 74 79 70 65 3d 22 74 65 78 74 22 20 73  ut type="text" s
2dd0: 69 7a 65 3d 22 34 22 20 76 61 6c 75 65 3d 22 25  ize="4" value="%
2de0: 64 28 6e 45 6e 74 72 79 29 22 20 6e 61 6d 65 3d  d(nEntry)" name=
2df0: 22 6e 22 3e 0a 20 20 40 20 3c 62 72 3e 3c 69 6e  "n">.  @ <br><in
2e00: 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74  put type="submit
2e10: 22 20 76 61 6c 75 65 3d 22 53 75 62 6d 69 74 22  " value="Submit"
2e20: 3e 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20 20  >.  @ </form>.  
2e30: 40 20 3c 74 61 62 6c 65 3e 3c 74 72 3e 3c 74 64  @ <table><tr><td
2e40: 3e 0a 20 20 40 20 3c 66 6f 72 6d 20 6d 65 74 68  >.  @ <form meth
2e50: 6f 64 3d 22 47 45 54 22 20 61 63 74 69 6f 6e 3d  od="GET" action=
2e60: 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f  "%s(g.zBaseURL)/
2e70: 74 69 6d 65 6c 69 6e 65 22 3e 0a 20 20 40 20 3c  timeline">.  @ <
2e80: 69 6e 70 75 74 20 74 79 70 65 3d 22 68 69 64 64  input type="hidd
2e90: 65 6e 22 20 76 61 6c 75 65 3d 22 25 64 28 6c 61  en" value="%d(la
2ea0: 73 74 45 76 65 6e 74 29 22 20 6e 61 6d 65 3d 22  stEvent)" name="
2eb0: 65 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20 74  e">.  @ <input t
2ec0: 79 70 65 3d 22 68 69 64 64 65 6e 22 20 76 61 6c  ype="hidden" val
2ed0: 75 65 3d 22 25 64 28 6e 45 6e 74 72 79 29 22 20  ue="%d(nEntry)" 
2ee0: 6e 61 6d 65 3d 22 6e 22 3e 0a 20 20 40 20 3c 69  name="n">.  @ <i
2ef0: 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69  nput type="submi
2f00: 74 22 20 76 61 6c 75 65 3d 22 4e 65 78 74 20 25  t" value="Next %
2f10: 64 28 6e 45 6e 74 72 79 29 20 52 6f 77 73 22 3e  d(nEntry) Rows">
2f20: 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 3c 2f 74 64  .  @ </form></td
2f30: 3e 3c 74 64 3e 0a 20 20 40 20 3c 66 6f 72 6d 20  ><td>.  @ <form 
2f40: 6d 65 74 68 6f 64 3d 22 47 45 54 22 20 61 63 74  method="GET" act
2f50: 69 6f 6e 3d 22 25 73 28 67 2e 7a 42 61 73 65 55  ion="%s(g.zBaseU
2f60: 52 4c 29 2f 74 69 6d 65 6c 69 6e 65 22 3e 0a 20  RL)/timeline">. 
2f70: 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22   @ <input type="
2f80: 68 69 64 64 65 6e 22 20 76 61 6c 75 65 3d 22 25  hidden" value="%
2f90: 64 28 66 69 72 73 74 45 76 65 6e 74 29 22 20 6e  d(firstEvent)" n
2fa0: 61 6d 65 3d 22 65 22 3e 0a 20 20 40 20 3c 69 6e  ame="e">.  @ <in
2fb0: 70 75 74 20 74 79 70 65 3d 22 68 69 64 64 65 6e  put type="hidden
2fc0: 22 20 76 61 6c 75 65 3d 22 25 64 28 6e 45 6e 74  " value="%d(nEnt
2fd0: 72 79 29 22 20 6e 61 6d 65 3d 22 6e 22 3e 0a 20  ry)" name="n">. 
2fe0: 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22   @ <input type="
2ff0: 68 69 64 64 65 6e 22 20 76 61 6c 75 65 3d 22 31  hidden" value="1
3000: 22 20 6e 61 6d 65 3d 22 61 22 3e 0a 20 20 40 20  " name="a">.  @ 
3010: 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62  <input type="sub
3020: 6d 69 74 22 20 76 61 6c 75 65 3d 22 50 72 65 76  mit" value="Prev
3030: 69 6f 75 73 20 25 64 28 6e 45 6e 74 72 79 29 20  ious %d(nEntry) 
3040: 52 6f 77 73 22 3e 0a 20 20 40 20 3c 2f 66 6f 72  Rows">.  @ </for
3050: 6d 3e 3c 2f 74 64 3e 3c 2f 74 72 3e 3c 2f 74 61  m></td></tr></ta
3060: 62 6c 65 3e 0a 20 20 73 74 79 6c 65 5f 66 6f 6f  ble>.  style_foo
3070: 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ter();.}../*.** 
3080: 54 68 65 20 69 6e 70 75 74 20 71 75 65 72 79 20  The input query 
3090: 71 20 73 65 6c 65 63 74 73 20 76 61 72 69 6f 75  q selects variou
30a0: 73 20 72 65 63 6f 72 64 73 2e 20 20 50 72 69 6e  s records.  Prin
30b0: 74 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  t a human-readab
30c0: 6c 65 0a 2a 2a 20 73 75 6d 6d 61 72 79 20 6f 66  le.** summary of
30d0: 20 74 68 6f 73 65 20 72 65 63 6f 72 64 73 2e 0a   those records..
30e0: 2a 2a 0a 2a 2a 20 4c 69 6d 69 74 20 74 68 65 20  **.** Limit the 
30f0: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
3100: 73 20 70 72 69 6e 74 65 64 20 74 6f 20 6e 4c 69  s printed to nLi
3110: 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 71  ne..** .** The q
3120: 75 65 72 79 20 73 68 6f 75 6c 64 20 72 65 74 75  uery should retu
3130: 72 6e 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73  rn these columns
3140: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 30 2e 20 20 72  :.**.**    0.  r
3150: 69 64 0a 2a 2a 20 20 20 20 31 2e 20 20 75 75 69  id.**    1.  uui
3160: 64 0a 2a 2a 20 20 20 20 32 2e 20 20 44 61 74 65  d.**    2.  Date
3170: 2f 54 69 6d 65 0a 2a 2a 20 20 20 20 33 2e 20 20  /Time.**    3.  
3180: 43 6f 6d 6d 65 6e 74 20 73 74 72 69 6e 67 20 61  Comment string a
3190: 6e 64 20 75 73 65 72 0a 2a 2a 20 20 20 20 34 2e  nd user.**    4.
31a0: 20 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d    Number of non-
31b0: 6d 65 72 67 65 20 63 68 69 6c 64 72 65 6e 0a 2a  merge children.*
31c0: 2a 20 20 20 20 35 2e 20 20 4e 75 6d 62 65 72 20  *    5.  Number 
31d0: 6f 66 20 70 61 72 65 6e 74 73 0a 2a 2f 0a 76 6f  of parents.*/.vo
31e0: 69 64 20 70 72 69 6e 74 5f 74 69 6d 65 6c 69 6e  id print_timelin
31f0: 65 28 53 74 6d 74 20 2a 71 2c 20 69 6e 74 20 6d  e(Stmt *q, int m
3200: 78 4c 69 6e 65 29 7b 0a 20 20 69 6e 74 20 6e 4c  xLine){.  int nL
3210: 69 6e 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ine = 0;.  char 
3220: 7a 50 72 65 76 44 61 74 65 5b 32 30 5d 3b 0a 20  zPrevDate[20];. 
3230: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 75   const char *zCu
3240: 72 72 65 6e 74 55 75 69 64 3d 30 3b 0a 20 20 53  rrentUuid=0;.  S
3250: 74 6d 74 20 63 75 72 72 65 6e 74 51 3b 0a 20 20  tmt currentQ;.  
3260: 69 6e 74 20 72 69 64 20 3d 20 64 62 5f 6c 67 65  int rid = db_lge
3270: 74 5f 69 6e 74 28 22 63 68 65 63 6b 6f 75 74 22  t_int("checkout"
3280: 2c 20 30 29 3b 0a 20 20 7a 50 72 65 76 44 61 74  , 0);.  zPrevDat
3290: 65 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 64 62 5f  e[0] = 0;..  db_
32a0: 70 72 65 70 61 72 65 28 26 63 75 72 72 65 6e 74  prepare(&current
32b0: 51 2c 0a 20 20 20 20 22 53 45 4c 45 43 54 20 75  Q,.    "SELECT u
32c0: 75 69 64 22 0a 20 20 20 20 22 20 20 46 52 4f 4d  uid".    "  FROM
32d0: 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d   blob WHERE rid=
32e0: 25 64 22 2c 20 72 69 64 0a 20 20 29 3b 0a 20 20  %d", rid.  );.  
32f0: 69 66 28 20 64 62 5f 73 74 65 70 28 26 63 75 72  if( db_step(&cur
3300: 72 65 6e 74 51 29 3d 3d 53 51 4c 49 54 45 5f 52  rentQ)==SQLITE_R
3310: 4f 57 20 29 7b 0a 20 20 20 20 7a 43 75 72 72 65  OW ){.    zCurre
3320: 6e 74 55 75 69 64 20 3d 20 64 62 5f 63 6f 6c 75  ntUuid = db_colu
3330: 6d 6e 5f 74 65 78 74 28 26 63 75 72 72 65 6e 74  mn_text(&current
3340: 51 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 77 68  Q, 0);.  }..  wh
3350: 69 6c 65 28 20 64 62 5f 73 74 65 70 28 71 29 3d  ile( db_step(q)=
3360: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26 26 20 6e  =SQLITE_ROW && n
3370: 4c 69 6e 65 3c 3d 6d 78 4c 69 6e 65 20 29 7b 0a  Line<=mxLine ){.
3380: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
3390: 7a 49 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  zId = db_column_
33a0: 74 65 78 74 28 71 2c 20 31 29 3b 0a 20 20 20 20  text(q, 1);.    
33b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
33c0: 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  e = db_column_te
33d0: 78 74 28 71 2c 20 32 29 3b 0a 20 20 20 20 63 6f  xt(q, 2);.    co
33e0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 20 3d  nst char *zCom =
33f0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
3400: 71 2c 20 33 29 3b 0a 20 20 20 20 69 6e 74 20 6e  q, 3);.    int n
3410: 43 68 69 6c 64 20 3d 20 64 62 5f 63 6f 6c 75 6d  Child = db_colum
3420: 6e 5f 69 6e 74 28 71 2c 20 34 29 3b 0a 20 20 20  n_int(q, 4);.   
3430: 20 69 6e 74 20 6e 50 61 72 65 6e 74 20 3d 20 64   int nParent = d
3440: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 71 2c 20  b_column_int(q, 
3450: 35 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46  5);.    char *zF
3460: 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ree = 0;.    int
3470: 20 6e 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72   n = 0;.    char
3480: 20 7a 50 72 65 66 69 78 5b 38 30 5d 3b 0a 20 20   zPrefix[80];.  
3490: 20 20 63 68 61 72 20 7a 55 75 69 64 5b 55 55 49    char zUuid[UUI
34a0: 44 5f 53 49 5a 45 2b 31 5d 3b 0a 20 20 20 20 0a  D_SIZE+1];.    .
34b0: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 55 75 69      sprintf(zUui
34c0: 64 2c 20 22 25 2e 31 30 73 22 2c 20 7a 49 64 29  d, "%.10s", zId)
34d0: 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  ;.    if( memcmp
34e0: 28 7a 44 61 74 65 2c 20 7a 50 72 65 76 44 61 74  (zDate, zPrevDat
34f0: 65 2c 20 31 30 29 20 29 7b 0a 20 20 20 20 20 20  e, 10) ){.      
3500: 70 72 69 6e 74 66 28 22 3d 3d 3d 20 25 2e 31 30  printf("=== %.10
3510: 73 20 3d 3d 3d 5c 6e 22 2c 20 7a 44 61 74 65 29  s ===\n", zDate)
3520: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
3530: 50 72 65 76 44 61 74 65 2c 20 7a 44 61 74 65 2c  PrevDate, zDate,
3540: 20 31 30 29 3b 0a 20 20 20 20 20 20 6e 4c 69 6e   10);.      nLin
3550: 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  e++;.    }.    i
3560: 66 28 20 7a 43 6f 6d 3d 3d 30 20 29 20 7a 43 6f  f( zCom==0 ) zCo
3570: 6d 20 3d 20 22 22 3b 0a 20 20 20 20 70 72 69 6e  m = "";.    prin
3580: 74 66 28 22 25 2e 38 73 20 22 2c 20 26 7a 44 61  tf("%.8s ", &zDa
3590: 74 65 5b 31 31 5d 29 3b 0a 20 20 20 20 7a 50 72  te[11]);.    zPr
35a0: 65 66 69 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  efix[0] = 0;.   
35b0: 20 69 66 28 20 6e 50 61 72 65 6e 74 3e 31 20 29   if( nParent>1 )
35c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
35d0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
35e0: 7a 50 72 65 66 69 78 29 2c 20 7a 50 72 65 66 69  zPrefix), zPrefi
35f0: 78 2c 20 22 2a 4d 45 52 47 45 2a 20 22 29 3b 0a  x, "*MERGE* ");.
3600: 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e        n = strlen
3610: 28 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20 7d  (zPrefix);.    }
3620: 0a 20 20 20 20 69 66 28 20 6e 43 68 69 6c 64 3e  .    if( nChild>
3630: 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
3640: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
3650: 6f 66 28 7a 50 72 65 66 69 78 29 2d 6e 2c 20 26  of(zPrefix)-n, &
3660: 7a 50 72 65 66 69 78 5b 6e 5d 2c 20 22 2a 46 4f  zPrefix[n], "*FO
3670: 52 4b 2a 20 22 29 3b 0a 20 20 20 20 20 20 6e 20  RK* ");.      n 
3680: 3d 20 73 74 72 6c 65 6e 28 7a 50 72 65 66 69 78  = strlen(zPrefix
3690: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
36a0: 20 73 74 72 63 6d 70 28 7a 43 75 72 72 65 6e 74   strcmp(zCurrent
36b0: 55 75 69 64 2c 7a 49 64 29 3d 3d 30 20 29 7b 0a  Uuid,zId)==0 ){.
36c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
36d0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 50  printf(sizeof(zP
36e0: 72 65 66 69 78 29 2d 6e 2c 20 26 7a 50 72 65 66  refix)-n, &zPref
36f0: 69 78 5b 6e 5d 2c 20 22 2a 43 55 52 52 45 4e 54  ix[n], "*CURRENT
3700: 2a 20 22 29 3b 0a 20 20 20 20 20 20 6e 20 2b 3d  * ");.      n +=
3710: 20 73 74 72 6c 65 6e 28 7a 50 72 65 66 69 78 29   strlen(zPrefix)
3720: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 72 65  ;.    }.    zFre
3730: 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
3740: 6e 74 66 28 22 5b 25 2e 31 30 73 5d 20 25 73 25  ntf("[%.10s] %s%
3750: 73 22 2c 20 7a 55 75 69 64 2c 20 7a 50 72 65 66  s", zUuid, zPref
3760: 69 78 2c 20 7a 43 6f 6d 29 3b 0a 20 20 20 20 6e  ix, zCom);.    n
3770: 4c 69 6e 65 20 2b 3d 20 63 6f 6d 6d 65 6e 74 5f  Line += comment_
3780: 70 72 69 6e 74 28 7a 46 72 65 65 2c 20 39 2c 20  print(zFree, 9, 
3790: 37 39 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  79);.    sqlite3
37a0: 5f 66 72 65 65 28 7a 46 72 65 65 29 3b 0a 20 20  _free(zFree);.  
37b0: 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28  }.  db_finalize(
37c0: 26 63 75 72 72 65 6e 74 51 29 3b 0a 7d 0a 0a 2f  &currentQ);.}../
37d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
37e0: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 69  inter to a stati
37f0: 63 20 73 74 72 69 6e 67 20 74 68 61 74 20 66 6f  c string that fo
3800: 72 6d 73 20 74 68 65 20 62 61 73 69 73 20 66 6f  rms the basis fo
3810: 72 0a 2a 2a 20 61 20 74 69 6d 65 6c 69 6e 65 20  r.** a timeline 
3820: 71 75 65 72 79 20 66 6f 72 20 64 69 73 70 6c 61  query for displa
3830: 79 20 6f 6e 20 61 20 54 54 59 2e 0a 2a 2f 0a 63  y on a TTY..*/.c
3840: 6f 6e 73 74 20 63 68 61 72 20 2a 74 69 6d 65 6c  onst char *timel
3850: 69 6e 65 5f 71 75 65 72 79 5f 66 6f 72 5f 74 74  ine_query_for_tt
3860: 79 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  y(void){.  stati
3870: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 42 61  c const char zBa
3880: 73 65 53 71 6c 5b 5d 20 3d 20 0a 20 20 20 20 40  seSql[] = .    @
3890: 20 53 45 4c 45 43 54 0a 20 20 20 20 40 20 20 20   SELECT.    @   
38a0: 62 6c 6f 62 2e 72 69 64 2c 0a 20 20 20 20 40 20  blob.rid,.    @ 
38b0: 20 20 75 75 69 64 2c 0a 20 20 20 20 40 20 20 20    uuid,.    @   
38c0: 64 61 74 65 74 69 6d 65 28 65 76 65 6e 74 2e 6d  datetime(event.m
38d0: 74 69 6d 65 2c 27 6c 6f 63 61 6c 74 69 6d 65 27  time,'localtime'
38e0: 29 2c 0a 20 20 20 20 40 20 20 20 63 6f 61 6c 65  ),.    @   coale
38f0: 73 63 65 28 65 63 6f 6d 6d 65 6e 74 2c 63 6f 6d  sce(ecomment,com
3900: 6d 65 6e 74 29 20 7c 7c 20 27 20 28 62 79 20 27  ment) || ' (by '
3910: 20 7c 7c 20 63 6f 61 6c 65 73 63 65 28 65 75 73   || coalesce(eus
3920: 65 72 2c 75 73 65 72 2c 27 3f 27 29 20 7c 7c 27  er,user,'?') ||'
3930: 29 27 2c 0a 20 20 20 20 40 20 20 20 28 53 45 4c  )',.    @   (SEL
3940: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
3950: 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 70 69  M plink WHERE pi
3960: 64 3d 62 6c 6f 62 2e 72 69 64 20 41 4e 44 20 69  d=blob.rid AND i
3970: 73 70 72 69 6d 29 2c 0a 20 20 20 20 40 20 20 20  sprim),.    @   
3980: 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  (SELECT count(*)
3990: 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52   FROM plink WHER
39a0: 45 20 63 69 64 3d 62 6c 6f 62 2e 72 69 64 29 0a  E cid=blob.rid).
39b0: 20 20 20 20 40 20 46 52 4f 4d 20 65 76 65 6e 74      @ FROM event
39c0: 2c 20 62 6c 6f 62 0a 20 20 20 20 40 20 57 48 45  , blob.    @ WHE
39d0: 52 45 20 62 6c 6f 62 2e 72 69 64 3d 65 76 65 6e  RE blob.rid=even
39e0: 74 2e 6f 62 6a 69 64 0a 20 20 3b 0a 20 20 72 65  t.objid.  ;.  re
39f0: 74 75 72 6e 20 7a 42 61 73 65 53 71 6c 3b 0a 7d  turn zBaseSql;.}
3a00: 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a  ../*.** COMMAND:
3a10: 20 74 69 6d 65 6c 69 6e 65 0a 2a 2a 0a 2a 2a 20   timeline.**.** 
3a20: 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20 74  Usage: %fossil t
3a30: 69 6d 65 6c 69 6e 65 20 3f 57 48 45 4e 3f 20 3f  imeline ?WHEN? ?
3a40: 55 55 49 44 7c 44 41 54 45 54 49 4d 45 3f 20 3f  UUID|DATETIME? ?
3a50: 2d 6e 7c 2d 2d 63 6f 75 6e 74 20 4e 3f 0a 2a 2a  -n|--count N?.**
3a60: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 75 6d 6d  .** Print a summ
3a70: 61 72 79 20 6f 66 20 61 63 74 69 76 69 74 79 20  ary of activity 
3a80: 67 6f 69 6e 67 20 62 61 63 6b 77 61 72 64 73 20  going backwards 
3a90: 69 6e 20 64 61 74 65 20 61 6e 64 20 74 69 6d 65  in date and time
3aa0: 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6f 72  .** specified or
3ab0: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
3ac0: 74 20 64 61 74 65 20 61 6e 64 20 74 69 6d 65 20  t date and time 
3ad0: 69 66 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 0a  if no arguments.
3ae0: 2a 2a 20 61 72 65 20 67 69 76 65 6e 2e 20 20 53  ** are given.  S
3af0: 68 6f 77 20 61 73 20 6d 61 6e 79 20 61 73 20 4e  how as many as N
3b00: 20 28 64 65 66 61 75 6c 74 20 32 30 29 20 63 68   (default 20) ch
3b10: 65 63 6b 2d 69 6e 73 2e 20 20 54 68 65 0a 2a 2a  eck-ins.  The.**
3b20: 20 57 48 45 4e 20 61 72 67 75 6d 65 6e 74 20 63   WHEN argument c
3b30: 61 6e 20 62 65 20 61 6e 79 20 75 6e 69 71 75 65  an be any unique
3b40: 20 61 62 62 72 65 76 69 61 74 69 6f 6e 20 6f 66   abbreviation of
3b50: 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 0a 2a 2a   one of these.**
3b60: 20 6b 65 79 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a   keywords:.**.**
3b70: 20 20 20 20 20 62 65 66 6f 72 65 0a 2a 2a 20 20       before.**  
3b80: 20 20 20 61 66 74 65 72 0a 2a 2a 20 20 20 20 20     after.**     
3b90: 64 65 73 63 65 6e 64 65 6e 74 73 20 7c 20 63 68  descendents | ch
3ba0: 69 6c 64 72 65 6e 0a 2a 2a 20 20 20 20 20 61 6e  ildren.**     an
3bb0: 63 65 73 74 6f 72 73 20 7c 20 70 61 72 65 6e 74  cestors | parent
3bc0: 73 0a 2a 2a 0a 2a 2a 20 54 68 65 20 55 55 49 44  s.**.** The UUID
3bd0: 20 63 61 6e 20 62 65 20 61 6e 79 20 75 6e 69 71   can be any uniq
3be0: 75 65 20 70 72 65 66 69 78 20 6f 66 20 34 20 63  ue prefix of 4 c
3bf0: 68 61 72 61 63 74 65 72 73 20 6f 72 20 6d 6f 72  haracters or mor
3c00: 65 2e 0a 2a 2a 20 54 68 65 20 44 41 54 45 54 49  e..** The DATETI
3c10: 4d 45 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 20  ME should be in 
3c20: 74 68 65 20 49 53 4f 38 36 30 31 20 66 6f 72 6d  the ISO8601 form
3c30: 61 74 2e 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  at.  For.** exam
3c40: 70 6c 65 73 3a 20 22 32 30 30 37 2d 30 38 2d 31  ples: "2007-08-1
3c50: 38 20 30 37 3a 32 31 3a 32 31 22 2e 20 20 59 6f  8 07:21:21".  Yo
3c60: 75 20 63 61 6e 20 61 6c 73 6f 20 73 61 79 20 22  u can also say "
3c70: 63 75 72 72 65 6e 74 22 0a 2a 2a 20 66 6f 72 20  current".** for 
3c80: 74 68 65 20 63 75 72 72 65 6e 74 20 76 65 72 73  the current vers
3c90: 69 6f 6e 20 6f 72 20 22 6e 6f 77 22 20 66 6f 72  ion or "now" for
3ca0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
3cb0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 74 69 6d 65 6c  e..*/.void timel
3cc0: 69 6e 65 5f 63 6d 64 28 76 6f 69 64 29 7b 0a 20  ine_cmd(void){. 
3cd0: 20 53 74 6d 74 20 71 3b 0a 20 20 69 6e 74 20 6e   Stmt q;.  int n
3ce0: 2c 20 6b 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  , k;.  const cha
3cf0: 72 20 2a 7a 43 6f 75 6e 74 3b 0a 20 20 63 68 61  r *zCount;.  cha
3d00: 72 20 2a 7a 4f 72 69 67 69 6e 3b 0a 20 20 63 68  r *zOrigin;.  ch
3d10: 61 72 20 2a 7a 44 61 74 65 3b 0a 20 20 63 68 61  ar *zDate;.  cha
3d20: 72 20 2a 7a 53 51 4c 3b 0a 20 20 69 6e 74 20 6f  r *zSQL;.  int o
3d30: 62 6a 69 64 20 3d 20 30 3b 0a 20 20 42 6c 6f 62  bjid = 0;.  Blob
3d40: 20 75 75 69 64 3b 0a 20 20 69 6e 74 20 6d 6f 64   uuid;.  int mod
3d50: 65 20 3d 20 31 20 3b 20 20 20 20 20 20 20 2f 2a  e = 1 ;       /*
3d60: 20 31 3a 20 62 65 66 6f 72 65 20 20 32 3a 61 66   1: before  2:af
3d70: 74 65 72 20 20 33 3a 63 68 69 6c 64 72 65 6e 20  ter  3:children 
3d80: 20 34 3a 70 61 72 65 6e 74 73 20 2a 2f 0a 20 20   4:parents */.  
3d90: 64 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f 70 65 6e  db_find_and_open
3da0: 5f 72 65 70 6f 73 69 74 6f 72 79 28 29 3b 0a 20  _repository();. 
3db0: 20 7a 43 6f 75 6e 74 20 3d 20 66 69 6e 64 5f 6f   zCount = find_o
3dc0: 70 74 69 6f 6e 28 22 6e 22 2c 22 63 6f 75 6e 74  ption("n","count
3dd0: 22 2c 31 29 3b 0a 20 20 69 66 28 20 7a 43 6f 75  ",1);.  if( zCou
3de0: 6e 74 20 29 7b 0a 20 20 20 20 6e 20 3d 20 61 74  nt ){.    n = at
3df0: 6f 69 28 7a 43 6f 75 6e 74 29 3b 0a 20 20 7d 65  oi(zCount);.  }e
3e00: 6c 73 65 7b 0a 20 20 20 20 6e 20 3d 20 32 30 3b  lse{.    n = 20;
3e10: 0a 20 20 7d 0a 20 20 69 66 28 20 67 2e 61 72 67  .  }.  if( g.arg
3e20: 63 3d 3d 34 20 29 7b 0a 20 20 20 20 6b 20 3d 20  c==4 ){.    k = 
3e30: 73 74 72 6c 65 6e 28 67 2e 61 72 67 76 5b 32 5d  strlen(g.argv[2]
3e40: 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63  );.    if( strnc
3e50: 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c 22 62 65  mp(g.argv[2],"be
3e60: 66 6f 72 65 22 2c 6b 29 3d 3d 30 20 29 7b 0a 20  fore",k)==0 ){. 
3e70: 20 20 20 20 20 6d 6f 64 65 20 3d 20 31 3b 0a 20       mode = 1;. 
3e80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
3e90: 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c 22  ncmp(g.argv[2],"
3ea0: 61 66 74 65 72 22 2c 6b 29 3d 3d 30 20 26 26 20  after",k)==0 && 
3eb0: 6b 3e 31 20 29 7b 0a 20 20 20 20 20 20 6d 6f 64  k>1 ){.      mod
3ec0: 65 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 2;.    }else
3ed0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 67 2e 61   if( strncmp(g.a
3ee0: 72 67 76 5b 32 5d 2c 22 64 65 73 63 65 6e 64 65  rgv[2],"descende
3ef0: 6e 74 73 22 2c 6b 29 3d 3d 30 20 29 7b 0a 20 20  nts",k)==0 ){.  
3f00: 20 20 20 20 6d 6f 64 65 20 3d 20 33 3b 0a 20 20      mode = 3;.  
3f10: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
3f20: 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c 22 63  cmp(g.argv[2],"c
3f30: 68 69 6c 64 72 65 6e 22 2c 6b 29 3d 3d 30 20 29  hildren",k)==0 )
3f40: 7b 0a 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 33  {.      mode = 3
3f50: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
3f60: 73 74 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32  strncmp(g.argv[2
3f70: 5d 2c 22 61 6e 63 65 73 74 6f 72 73 22 2c 6b 29  ],"ancestors",k)
3f80: 3d 3d 30 20 26 26 20 6b 3e 31 20 29 7b 0a 20 20  ==0 && k>1 ){.  
3f90: 20 20 20 20 6d 6f 64 65 20 3d 20 34 3b 0a 20 20      mode = 4;.  
3fa0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
3fb0: 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c 22 70  cmp(g.argv[2],"p
3fc0: 61 72 65 6e 74 73 22 2c 6b 29 3d 3d 30 20 29 7b  arents",k)==0 ){
3fd0: 0a 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 34 3b  .      mode = 4;
3fe0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3ff0: 20 20 75 73 61 67 65 28 22 3f 57 48 45 4e 3f 20    usage("?WHEN? 
4000: 3f 55 55 49 44 7c 44 41 54 45 54 49 4d 45 3f 22  ?UUID|DATETIME?"
4010: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4f 72  );.    }.    zOr
4020: 69 67 69 6e 20 3d 20 67 2e 61 72 67 76 5b 33 5d  igin = g.argv[3]
4030: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 2e  ;.  }else if( g.
4040: 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a  argc==3 ){.    z
4050: 4f 72 69 67 69 6e 20 3d 20 67 2e 61 72 67 76 5b  Origin = g.argv[
4060: 32 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  2];.  }else{.   
4070: 20 7a 4f 72 69 67 69 6e 20 3d 20 22 6e 6f 77 22   zOrigin = "now"
4080: 3b 0a 20 20 7d 0a 20 20 6b 20 3d 20 73 74 72 6c  ;.  }.  k = strl
4090: 65 6e 28 7a 4f 72 69 67 69 6e 29 3b 0a 20 20 62  en(zOrigin);.  b
40a0: 6c 6f 62 5f 7a 65 72 6f 28 26 75 75 69 64 29 3b  lob_zero(&uuid);
40b0: 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26  .  blob_append(&
40c0: 75 75 69 64 2c 20 7a 4f 72 69 67 69 6e 2c 20 2d  uuid, zOrigin, -
40d0: 31 29 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  1);.  if( strcmp
40e0: 28 7a 4f 72 69 67 69 6e 2c 20 22 6e 6f 77 22 29  (zOrigin, "now")
40f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d  ==0 ){.    if( m
4100: 6f 64 65 3d 3d 33 20 7c 7c 20 6d 6f 64 65 3d 3d  ode==3 || mode==
4110: 34 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69  4 ){.      fossi
4120: 6c 5f 66 61 74 61 6c 28 22 63 61 6e 6e 6f 74 20  l_fatal("cannot 
4130: 63 6f 6d 70 75 74 65 20 64 65 73 63 65 6e 64 65  compute descende
4140: 6e 74 73 20 6f 72 20 61 6e 63 65 73 74 6f 72 73  nts or ancestors
4150: 20 6f 66 20 61 20 64 61 74 65 22 29 3b 0a 20 20   of a date");.  
4160: 20 20 7d 0a 20 20 20 20 7a 44 61 74 65 20 3d 20    }.    zDate = 
4170: 6d 70 72 69 6e 74 66 28 22 28 53 45 4c 45 43 54  mprintf("(SELECT
4180: 20 64 61 74 65 74 69 6d 65 28 27 6e 6f 77 27 29   datetime('now')
4190: 29 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  )");.  }else if(
41a0: 20 73 74 72 6e 63 6d 70 28 7a 4f 72 69 67 69 6e   strncmp(zOrigin
41b0: 2c 20 22 63 75 72 72 65 6e 74 22 2c 20 6b 29 3d  , "current", k)=
41c0: 3d 30 20 29 7b 0a 20 20 20 20 6f 62 6a 69 64 20  =0 ){.    objid 
41d0: 3d 20 64 62 5f 6c 67 65 74 5f 69 6e 74 28 22 63  = db_lget_int("c
41e0: 68 65 63 6b 6f 75 74 22 2c 30 29 3b 0a 20 20 20  heckout",0);.   
41f0: 20 7a 44 61 74 65 20 3d 20 6d 70 72 69 6e 74 66   zDate = mprintf
4200: 28 22 28 53 45 4c 45 43 54 20 6d 74 69 6d 65 20  ("(SELECT mtime 
4210: 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45  FROM plink WHERE
4220: 20 63 69 64 3d 25 64 29 22 2c 20 6f 62 6a 69 64   cid=%d)", objid
4230: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  );.  }else if( n
4240: 61 6d 65 5f 74 6f 5f 75 75 69 64 28 26 75 75 69  ame_to_uuid(&uui
4250: 64 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  d, 0)==0 ){.    
4260: 6f 62 6a 69 64 20 3d 20 64 62 5f 69 6e 74 28 30  objid = db_int(0
4270: 2c 20 22 53 45 4c 45 43 54 20 72 69 64 20 46 52  , "SELECT rid FR
4280: 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 75 75  OM blob WHERE uu
4290: 69 64 3d 25 42 22 2c 20 26 75 75 69 64 29 3b 0a  id=%B", &uuid);.
42a0: 20 20 20 20 7a 44 61 74 65 20 3d 20 6d 70 72 69      zDate = mpri
42b0: 6e 74 66 28 22 28 53 45 4c 45 43 54 20 6d 74 69  ntf("(SELECT mti
42c0: 6d 65 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48  me FROM plink WH
42d0: 45 52 45 20 63 69 64 3d 25 64 29 22 2c 20 6f 62  ERE cid=%d)", ob
42e0: 6a 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  jid);.  }else{. 
42f0: 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 33 20 7c     if( mode==3 |
4300: 7c 20 6d 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20  | mode==4 ){.   
4310: 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28     fossil_fatal(
4320: 22 63 61 6e 6e 6f 74 20 63 6f 6d 70 75 74 65 20  "cannot compute 
4330: 64 65 73 63 65 6e 64 65 6e 74 73 20 6f 72 20 61  descendents or a
4340: 6e 63 65 73 74 6f 72 73 20 6f 66 20 61 20 64 61  ncestors of a da
4350: 74 65 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  te");.    }.    
4360: 7a 44 61 74 65 20 3d 20 6d 70 72 69 6e 74 66 28  zDate = mprintf(
4370: 22 28 53 45 4c 45 43 54 20 6a 75 6c 69 61 6e 64  "(SELECT juliand
4380: 61 79 28 25 51 2c 20 27 75 74 63 27 29 29 22 2c  ay(%Q, 'utc'))",
4390: 20 7a 4f 72 69 67 69 6e 29 3b 0a 20 20 7d 0a 20   zOrigin);.  }. 
43a0: 20 7a 53 51 4c 20 3d 20 6d 70 72 69 6e 74 66 28   zSQL = mprintf(
43b0: 22 25 73 20 41 4e 44 20 65 76 65 6e 74 2e 6d 74  "%s AND event.mt
43c0: 69 6d 65 20 25 73 20 25 73 22 2c 0a 20 20 20 20  ime %s %s",.    
43d0: 20 74 69 6d 65 6c 69 6e 65 5f 71 75 65 72 79 5f   timeline_query_
43e0: 66 6f 72 5f 74 74 79 28 29 2c 0a 20 20 20 20 20  for_tty(),.     
43f0: 28 6d 6f 64 65 3d 3d 31 20 7c 7c 20 6d 6f 64 65  (mode==1 || mode
4400: 3d 3d 34 29 20 3f 20 22 3c 3d 22 20 3a 20 22 3e  ==4) ? "<=" : ">
4410: 3d 22 2c 0a 20 20 20 20 20 7a 44 61 74 65 0a 20  =",.     zDate. 
4420: 20 29 3b 0a 20 20 69 66 28 20 6d 6f 64 65 3d 3d   );.  if( mode==
4430: 33 20 7c 7c 20 6d 6f 64 65 3d 3d 34 20 29 7b 0a  3 || mode==4 ){.
4440: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
4450: 63 28 22 43 52 45 41 54 45 20 54 45 4d 50 20 54  c("CREATE TEMP T
4460: 41 42 4c 45 20 6f 6b 28 72 69 64 20 49 4e 54 45  ABLE ok(rid INTE
4470: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 29  GER PRIMARY KEY)
4480: 22 29 3b 0a 20 20 20 20 69 66 28 20 6d 6f 64 65  ");.    if( mode
4490: 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 63 6f 6d  ==3 ){.      com
44a0: 70 75 74 65 5f 64 65 73 63 65 6e 64 65 6e 74 73  pute_descendents
44b0: 28 6f 62 6a 69 64 2c 20 6e 29 3b 0a 20 20 20 20  (objid, n);.    
44c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6d  }else{.      com
44d0: 70 75 74 65 5f 61 6e 63 65 73 74 6f 72 73 28 6f  pute_ancestors(o
44e0: 62 6a 69 64 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  bjid, n);.    }.
44f0: 20 20 20 20 7a 53 51 4c 20 3d 20 6d 70 72 69 6e      zSQL = mprin
4500: 74 66 28 22 25 7a 20 41 4e 44 20 62 6c 6f 62 2e  tf("%z AND blob.
4510: 72 69 64 20 49 4e 20 6f 6b 22 2c 20 7a 53 51 4c  rid IN ok", zSQL
4520: 29 3b 0a 20 20 7d 0a 20 20 7a 53 51 4c 20 3d 20  );.  }.  zSQL = 
4530: 6d 70 72 69 6e 74 66 28 22 25 7a 20 4f 52 44 45  mprintf("%z ORDE
4540: 52 20 42 59 20 65 76 65 6e 74 2e 6d 74 69 6d 65  R BY event.mtime
4550: 20 44 45 53 43 22 2c 20 7a 53 51 4c 29 3b 0a 20   DESC", zSQL);. 
4560: 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20   db_prepare(&q, 
4570: 7a 53 51 4c 29 3b 0a 20 20 70 72 69 6e 74 5f 74  zSQL);.  print_t
4580: 69 6d 65 6c 69 6e 65 28 26 71 2c 20 6e 29 3b 0a  imeline(&q, n);.
4590: 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71    db_finalize(&q
45a0: 29 3b 0a 7d 0a                                   );.}.