Hex Artifact Content
Not logged in

Artifact bffeb82d75f565bb19a258268728ce0ff84a708c:

File src/timeline.c part of check-in [6d58613757] - Timeline comments are now rendered as wiki. Wiki changes appear on the timeline. by drh on 2007-10-06 16:37:39.

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 2f 0a 76 6f 69 64  nd color.*/.void
0a50: 20 77 77 77 5f 70 72 69 6e 74 5f 74 69 6d 65 6c   www_print_timel
0a60: 69 6e 65 28 0a 20 20 53 74 6d 74 20 2a 70 51 75  ine(.  Stmt *pQu
0a70: 65 72 79 2c 0a 20 20 69 6e 74 20 2a 70 46 69 72  ery,.  int *pFir
0a80: 73 74 45 76 65 6e 74 2c 0a 20 20 69 6e 74 20 2a  stEvent,.  int *
0a90: 70 4c 61 73 74 45 76 65 6e 74 2c 0a 20 20 69 6e  pLastEvent,.  in
0aa0: 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 69  t (*xCallback)(i
0ab0: 6e 74 2c 20 42 6c 6f 62 2a 29 2c 0a 20 20 42 6c  nt, Blob*),.  Bl
0ac0: 6f 62 20 2a 70 41 72 67 0a 20 29 7b 0a 20 20 63  ob *pArg. ){.  c
0ad0: 68 61 72 20 7a 50 72 65 76 44 61 74 65 5b 32 30  har zPrevDate[20
0ae0: 5d 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  ];.  int cnt = 0
0af0: 3b 0a 20 20 7a 50 72 65 76 44 61 74 65 5b 30 5d  ;.  zPrevDate[0]
0b00: 20 3d 20 30 3b 0a 20 20 42 6c 6f 62 20 63 6f 6d   = 0;.  Blob com
0b10: 6d 65 6e 74 3b 0a 0a 20 20 64 62 5f 6d 75 6c 74  ment;..  db_mult
0b20: 69 5f 65 78 65 63 28 0a 20 20 20 20 20 22 43 52  i_exec(.     "CR
0b30: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
0b40: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 65  IF NOT EXISTS se
0b50: 65 6e 28 72 69 64 20 49 4e 54 45 47 45 52 20 50  en(rid INTEGER P
0b60: 52 49 4d 41 52 59 20 4b 45 59 29 3b 22 0a 20 20  RIMARY KEY);".  
0b70: 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
0b80: 73 65 65 6e 3b 22 0a 20 20 29 3b 0a 20 20 40 20  seen;".  );.  @ 
0b90: 3c 74 61 62 6c 65 20 63 65 6c 6c 73 70 61 63 69  <table cellspaci
0ba0: 6e 67 3d 30 20 62 6f 72 64 65 72 3d 30 20 63 65  ng=0 border=0 ce
0bb0: 6c 6c 70 61 64 64 69 6e 67 3d 30 3e 0a 20 20 62  llpadding=0>.  b
0bc0: 6c 6f 62 5f 7a 65 72 6f 28 26 63 6f 6d 6d 65 6e  lob_zero(&commen
0bd0: 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f  t);.  while( db_
0be0: 73 74 65 70 28 70 51 75 65 72 79 29 3d 3d 53 51  step(pQuery)==SQ
0bf0: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
0c00: 69 6e 74 20 72 69 64 20 3d 20 64 62 5f 63 6f 6c  int rid = db_col
0c10: 75 6d 6e 5f 69 6e 74 28 70 51 75 65 72 79 2c 20  umn_int(pQuery, 
0c20: 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  0);.    const ch
0c30: 61 72 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f 63  ar *zUuid = db_c
0c40: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72  olumn_text(pQuer
0c50: 79 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 6e  y, 1);.    int n
0c60: 50 43 68 69 6c 64 20 3d 20 64 62 5f 63 6f 6c 75  PChild = db_colu
0c70: 6d 6e 5f 69 6e 74 28 70 51 75 65 72 79 2c 20 35  mn_int(pQuery, 5
0c80: 29 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 65  );.    int nPare
0c90: 6e 74 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69  nt = db_column_i
0ca0: 6e 74 28 70 51 75 65 72 79 2c 20 36 29 3b 0a 20  nt(pQuery, 6);. 
0cb0: 20 20 20 69 6e 74 20 69 73 4c 65 61 66 20 3d 20     int isLeaf = 
0cc0: 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 51  db_column_int(pQ
0cd0: 75 65 72 79 2c 20 37 29 3b 0a 20 20 20 20 63 6f  uery, 7);.    co
0ce0: 6e 73 74 20 63 68 61 72 20 2a 7a 42 67 43 6c 72  nst char *zBgClr
0cf0: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
0d00: 74 28 70 51 75 65 72 79 2c 20 38 29 3b 0a 20 20  t(pQuery, 8);.  
0d10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
0d20: 61 74 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ate = db_column_
0d30: 74 65 78 74 28 70 51 75 65 72 79 2c 20 32 29 3b  text(pQuery, 2);
0d40: 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20  .    if( cnt==0 
0d50: 26 26 20 70 46 69 72 73 74 45 76 65 6e 74 20 29  && pFirstEvent )
0d60: 7b 0a 20 20 20 20 20 20 2a 70 46 69 72 73 74 45  {.      *pFirstE
0d70: 76 65 6e 74 20 3d 20 72 69 64 3b 0a 20 20 20 20  vent = rid;.    
0d80: 7d 0a 20 20 20 20 69 66 28 20 70 4c 61 73 74 45  }.    if( pLastE
0d90: 76 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  vent ){.      *p
0da0: 4c 61 73 74 45 76 65 6e 74 20 3d 20 72 69 64 3b  LastEvent = rid;
0db0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 6d 75  .    }.    db_mu
0dc0: 6c 74 69 5f 65 78 65 63 28 22 49 4e 53 45 52 54  lti_exec("INSERT
0dd0: 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20   OR IGNORE INTO 
0de0: 73 65 65 6e 20 56 41 4c 55 45 53 28 25 64 29 22  seen VALUES(%d)"
0df0: 2c 20 72 69 64 29 3b 0a 20 20 20 20 69 66 28 20  , rid);.    if( 
0e00: 78 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  xCallback ){.   
0e10: 20 20 20 78 43 61 6c 6c 62 61 63 6b 28 72 69 64     xCallback(rid
0e20: 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20  , pArg);.    }. 
0e30: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 7a 44     if( memcmp(zD
0e40: 61 74 65 2c 20 7a 50 72 65 76 44 61 74 65 2c 20  ate, zPrevDate, 
0e50: 31 30 29 20 29 7b 0a 20 20 20 20 20 20 73 70 72  10) ){.      spr
0e60: 69 6e 74 66 28 7a 50 72 65 76 44 61 74 65 2c 20  intf(zPrevDate, 
0e70: 22 25 2e 31 30 73 22 2c 20 7a 44 61 74 65 29 3b  "%.10s", zDate);
0e80: 0a 20 20 20 20 20 20 40 20 3c 74 72 3e 3c 74 64  .      @ <tr><td
0e90: 20 63 6f 6c 73 70 61 6e 3d 33 3e 0a 20 20 20 20   colspan=3>.    
0ea0: 20 20 40 20 3c 74 61 62 6c 65 20 63 65 6c 6c 70    @ <table cellp
0eb0: 61 64 64 69 6e 67 3d 32 20 62 6f 72 64 65 72 3d  adding=2 border=
0ec0: 30 3e 0a 20 20 20 20 20 20 40 20 3c 74 72 3e 3c  0>.      @ <tr><
0ed0: 74 64 20 62 67 63 6f 6c 6f 72 3d 22 23 61 30 62  td bgcolor="#a0b
0ee0: 35 66 34 22 20 63 6c 61 73 73 3d 22 62 6f 72 64  5f4" class="bord
0ef0: 65 72 31 22 3e 0a 20 20 20 20 20 20 40 20 3c 74  er1">.      @ <t
0f00: 61 62 6c 65 20 63 65 6c 6c 70 61 64 64 69 6e 67  able cellpadding
0f10: 3d 32 20 63 65 6c 6c 73 70 61 63 69 6e 67 3d 30  =2 cellspacing=0
0f20: 20 62 6f 72 64 65 72 3d 30 3e 3c 74 72 3e 0a 20   border=0><tr>. 
0f30: 20 20 20 20 20 40 20 3c 74 64 20 62 67 63 6f 6c       @ <td bgcol
0f40: 6f 72 3d 22 23 64 30 64 39 66 34 22 20 63 6c 61  or="#d0d9f4" cla
0f50: 73 73 3d 22 62 6b 67 6e 64 31 22 3e 25 73 28 7a  ss="bkgnd1">%s(z
0f60: 50 72 65 76 44 61 74 65 29 3c 2f 74 64 3e 0a 20  PrevDate)</td>. 
0f70: 20 20 20 20 20 40 20 3c 2f 74 72 3e 3c 2f 74 61       @ </tr></ta
0f80: 62 6c 65 3e 0a 20 20 20 20 20 20 40 20 3c 2f 74  ble>.      @ </t
0f90: 64 3e 3c 2f 74 72 3e 3c 2f 74 61 62 6c 65 3e 0a  d></tr></table>.
0fa0: 20 20 20 20 20 20 40 20 3c 2f 74 64 3e 3c 2f 74        @ </td></t
0fb0: 72 3e 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 3c  r>.    }.    @ <
0fc0: 74 72 3e 0a 20 20 20 20 40 20 3c 74 64 20 76 61  tr>.    @ <td va
0fd0: 6c 69 67 6e 3d 22 74 6f 70 22 3e 25 73 28 26 7a  lign="top">%s(&z
0fe0: 44 61 74 65 5b 31 31 5d 29 3c 2f 74 64 3e 0a 20  Date[11])</td>. 
0ff0: 20 20 20 40 20 3c 74 64 20 77 69 64 74 68 3d 22     @ <td width="
1000: 32 30 22 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65  20" align="cente
1010: 72 22 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e  r" valign="top">
1020: 0a 20 20 20 20 40 20 3c 66 6f 6e 74 20 69 64 3d  .    @ <font id=
1030: 22 6d 25 64 28 72 69 64 29 22 20 73 69 7a 65 3d  "m%d(rid)" size=
1040: 22 2b 31 22 20 63 6f 6c 6f 72 3d 22 77 68 69 74  "+1" color="whit
1050: 65 22 3e 2a 3c 2f 66 6f 6e 74 3e 3c 2f 74 64 3e  e">*</font></td>
1060: 0a 20 20 20 20 69 66 28 20 7a 42 67 43 6c 72 20  .    if( zBgClr 
1070: 26 26 20 7a 42 67 43 6c 72 5b 30 5d 20 29 7b 0a  && zBgClr[0] ){.
1080: 20 20 20 20 20 20 40 20 3c 74 64 20 76 61 6c 69        @ <td vali
1090: 67 6e 3d 22 74 6f 70 22 20 61 6c 69 67 6e 3d 22  gn="top" align="
10a0: 6c 65 66 74 22 20 62 67 63 6f 6c 6f 72 3d 22 25  left" bgcolor="%
10b0: 68 28 7a 42 67 43 6c 72 29 22 3e 0a 20 20 20 20  h(zBgClr)">.    
10c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 40 20 3c  }else{.      @ <
10d0: 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 20  td valign="top" 
10e0: 61 6c 69 67 6e 3d 22 6c 65 66 74 22 3e 0a 20 20  align="left">.  
10f0: 20 20 7d 0a 20 20 20 20 68 79 70 65 72 6c 69 6e    }.    hyperlin
1100: 6b 5f 74 6f 5f 75 75 69 64 5f 77 69 74 68 5f 6d  k_to_uuid_with_m
1110: 6f 75 73 65 6f 76 65 72 28 7a 55 75 69 64 2c 20  ouseover(zUuid, 
1120: 22 78 69 6e 22 2c 20 22 78 6f 75 74 22 2c 20 72  "xin", "xout", r
1130: 69 64 29 3b 0a 20 20 20 20 69 66 28 20 6e 50 61  id);.    if( nPa
1140: 72 65 6e 74 3e 31 20 29 7b 0a 20 20 20 20 20 20  rent>1 ){.      
1150: 40 20 3c 62 3e 4d 65 72 67 65 3c 2f 62 3e 20 0a  @ <b>Merge</b> .
1160: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 50      }.    if( nP
1170: 43 68 69 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20  Child>1 ){.     
1180: 20 40 20 3c 62 3e 46 6f 72 6b 3c 2f 62 3e 0a 20   @ <b>Fork</b>. 
1190: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 4c     }.    if( isL
11a0: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 40 20 3c  eaf ){.      @ <
11b0: 62 3e 4c 65 61 66 3c 2f 62 3e 0a 20 20 20 20 7d  b>Leaf</b>.    }
11c0: 0a 20 20 20 20 64 62 5f 63 6f 6c 75 6d 6e 5f 62  .    db_column_b
11d0: 6c 6f 62 28 70 51 75 65 72 79 2c 20 33 2c 20 26  lob(pQuery, 3, &
11e0: 63 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 77 69  comment);.    wi
11f0: 6b 69 5f 63 6f 6e 76 65 72 74 28 26 63 6f 6d 6d  ki_convert(&comm
1200: 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 62 6c 6f  ent, 0);.    blo
1210: 62 5f 72 65 73 65 74 28 26 63 6f 6d 6d 65 6e 74  b_reset(&comment
1220: 29 3b 0a 20 20 20 20 40 20 28 62 79 20 25 68 28  );.    @ (by %h(
1230: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  db_column_text(p
1240: 51 75 65 72 79 2c 34 29 29 29 3c 2f 74 64 3e 3c  Query,4)))</td><
1250: 2f 74 72 3e 0a 20 20 7d 0a 20 20 40 20 3c 2f 74  /tr>.  }.  @ </t
1260: 61 62 6c 65 3e 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  able>.}../*.** G
1270: 65 6e 65 72 61 74 65 20 6a 61 76 61 73 63 72 69  enerate javascri
1280: 70 74 20 63 6f 64 65 20 74 68 61 74 20 72 65 63  pt code that rec
1290: 6f 72 64 73 20 74 68 65 20 70 61 72 65 6e 74 73  ords the parents
12a0: 20 61 6e 64 20 63 68 69 6c 64 72 65 6e 0a 2a 2a   and children.**
12b0: 20 6f 66 20 74 68 65 20 76 65 72 73 69 6f 6e 20   of the version 
12c0: 72 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rid..*/.static i
12d0: 6e 74 20 73 61 76 65 5f 70 61 72 65 6e 74 61 67  nt save_parentag
12e0: 65 5f 6a 61 76 61 73 63 72 69 70 74 28 69 6e 74  e_javascript(int
12f0: 20 72 69 64 2c 20 42 6c 6f 62 20 2a 70 4f 75 74   rid, Blob *pOut
1300: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1310: 2a 7a 53 65 70 3b 0a 20 20 53 74 6d 74 20 71 3b  *zSep;.  Stmt q;
1320: 0a 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26  ..  db_prepare(&
1330: 71 2c 20 22 53 45 4c 45 43 54 20 70 69 64 20 46  q, "SELECT pid F
1340: 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20  ROM plink WHERE 
1350: 63 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20  cid=%d", rid);. 
1360: 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 62 6c   zSep = "";.  bl
1370: 6f 62 5f 61 70 70 65 6e 64 66 28 70 4f 75 74 2c  ob_appendf(pOut,
1380: 20 22 70 61 72 65 6e 74 6f 66 5b 5c 22 6d 25 64   "parentof[\"m%d
1390: 5c 22 5d 20 3d 20 5b 22 2c 20 72 69 64 29 3b 0a  \"] = [", rid);.
13a0: 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70    while( db_step
13b0: 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  (&q)==SQLITE_ROW
13c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 69 64 20   ){.    int pid 
13d0: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  = db_column_int(
13e0: 26 71 2c 20 30 29 3b 0a 20 20 20 20 62 6c 6f 62  &q, 0);.    blob
13f0: 5f 61 70 70 65 6e 64 66 28 70 4f 75 74 2c 20 22  _appendf(pOut, "
1400: 25 73 5c 22 6d 25 64 5c 22 22 2c 20 7a 53 65 70  %s\"m%d\"", zSep
1410: 2c 20 70 69 64 29 3b 0a 20 20 20 20 7a 53 65 70  , pid);.    zSep
1420: 20 3d 20 22 2c 22 3b 0a 20 20 7d 0a 20 20 64 62   = ",";.  }.  db
1430: 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20  _finalize(&q);. 
1440: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 4f   blob_appendf(pO
1450: 75 74 2c 20 22 5d 3b 5c 6e 22 29 3b 0a 20 20 64  ut, "];\n");.  d
1460: 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 22 53  b_prepare(&q, "S
1470: 45 4c 45 43 54 20 63 69 64 20 46 52 4f 4d 20 70  ELECT cid FROM p
1480: 6c 69 6e 6b 20 57 48 45 52 45 20 70 69 64 3d 25  link WHERE pid=%
1490: 64 22 2c 20 72 69 64 29 3b 0a 20 20 7a 53 65 70  d", rid);.  zSep
14a0: 20 3d 20 22 22 3b 0a 20 20 62 6c 6f 62 5f 61 70   = "";.  blob_ap
14b0: 70 65 6e 64 66 28 70 4f 75 74 2c 20 22 63 68 69  pendf(pOut, "chi
14c0: 6c 64 6f 66 5b 5c 22 6d 25 64 5c 22 5d 20 3d 20  ldof[\"m%d\"] = 
14d0: 5b 22 2c 20 72 69 64 29 3b 0a 20 20 77 68 69 6c  [", rid);.  whil
14e0: 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d  e( db_step(&q)==
14f0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1500: 20 20 69 6e 74 20 70 69 64 20 3d 20 64 62 5f 63    int pid = db_c
1510: 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 30 29  olumn_int(&q, 0)
1520: 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e  ;.    blob_appen
1530: 64 66 28 70 4f 75 74 2c 20 22 25 73 5c 22 6d 25  df(pOut, "%s\"m%
1540: 64 5c 22 22 2c 20 7a 53 65 70 2c 20 70 69 64 29  d\"", zSep, pid)
1550: 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 22  ;.    zSep = ","
1560: 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c  ;.  }.  db_final
1570: 69 7a 65 28 26 71 29 3b 0a 20 20 62 6c 6f 62 5f  ize(&q);.  blob_
1580: 61 70 70 65 6e 64 66 28 70 4f 75 74 2c 20 22 5d  appendf(pOut, "]
1590: 3b 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  ;\n");.  return 
15a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
15b0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
15c0: 61 20 63 6f 6e 73 74 61 6e 74 20 73 74 72 69 6e  a constant strin
15d0: 67 20 74 68 61 74 20 66 6f 72 6d 73 20 74 68 65  g that forms the
15e0: 20 62 61 73 69 73 0a 2a 2a 20 66 6f 72 20 61 20   basis.** for a 
15f0: 74 69 6d 65 6c 69 6e 65 20 71 75 65 72 79 20 66  timeline query f
1600: 6f 72 20 74 68 65 20 57 57 57 20 69 6e 74 65 72  or the WWW inter
1610: 66 61 63 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  face..*/.const c
1620: 68 61 72 20 2a 74 69 6d 65 6c 69 6e 65 5f 71 75  har *timeline_qu
1630: 65 72 79 5f 66 6f 72 5f 77 77 77 28 76 6f 69 64  ery_for_www(void
1640: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
1650: 74 20 63 68 61 72 20 7a 42 61 73 65 53 71 6c 5b  t char zBaseSql[
1660: 5d 20 3d 0a 20 20 20 20 40 20 53 45 4c 45 43 54  ] =.    @ SELECT
1670: 0a 20 20 20 20 40 20 20 20 62 6c 6f 62 2e 72 69  .    @   blob.ri
1680: 64 2c 0a 20 20 20 20 40 20 20 20 75 75 69 64 2c  d,.    @   uuid,
1690: 0a 20 20 20 20 40 20 20 20 64 61 74 65 74 69 6d  .    @   datetim
16a0: 65 28 65 76 65 6e 74 2e 6d 74 69 6d 65 2c 27 6c  e(event.mtime,'l
16b0: 6f 63 61 6c 74 69 6d 65 27 29 2c 0a 20 20 20 20  ocaltime'),.    
16c0: 40 20 20 20 63 6f 61 6c 65 73 63 65 28 65 63 6f  @   coalesce(eco
16d0: 6d 6d 65 6e 74 2c 20 63 6f 6d 6d 65 6e 74 29 2c  mment, comment),
16e0: 0a 20 20 20 20 40 20 20 20 63 6f 61 6c 65 73 63  .    @   coalesc
16f0: 65 28 65 75 73 65 72 2c 20 75 73 65 72 29 2c 0a  e(euser, user),.
1700: 20 20 20 20 40 20 20 20 28 53 45 4c 45 43 54 20      @   (SELECT 
1710: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 6c  count(*) FROM pl
1720: 69 6e 6b 20 57 48 45 52 45 20 70 69 64 3d 62 6c  ink WHERE pid=bl
1730: 6f 62 2e 72 69 64 20 41 4e 44 20 69 73 70 72 69  ob.rid AND ispri
1740: 6d 3d 31 29 2c 0a 20 20 20 20 40 20 20 20 28 53  m=1),.    @   (S
1750: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1760: 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20  ROM plink WHERE 
1770: 63 69 64 3d 62 6c 6f 62 2e 72 69 64 29 2c 0a 20  cid=blob.rid),. 
1780: 20 20 20 40 20 20 20 4e 4f 54 20 45 58 49 53 54     @   NOT EXIST
1790: 53 20 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  S (SELECT 1 FROM
17a0: 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 70 69 64   plink WHERE pid
17b0: 3d 62 6c 6f 62 2e 72 69 64 29 2c 0a 20 20 20 20  =blob.rid),.    
17c0: 40 20 20 20 63 6f 61 6c 65 73 63 65 28 62 67 63  @   coalesce(bgc
17d0: 6f 6c 6f 72 2c 20 62 72 62 67 63 6f 6c 6f 72 29  olor, brbgcolor)
17e0: 0a 20 20 20 20 40 20 20 46 52 4f 4d 20 65 76 65  .    @  FROM eve
17f0: 6e 74 20 4a 4f 49 4e 20 62 6c 6f 62 20 0a 20 20  nt JOIN blob .  
1800: 20 20 40 20 57 48 45 52 45 20 62 6c 6f 62 2e 72    @ WHERE blob.r
1810: 69 64 3d 65 76 65 6e 74 2e 6f 62 6a 69 64 0a 20  id=event.objid. 
1820: 20 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42 61 73   ;.  return zBas
1830: 65 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  eSql;.}../*.** W
1840: 45 42 50 41 47 45 3a 20 74 69 6d 65 6c 69 6e 65  EBPAGE: timeline
1850: 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79 20 70 61 72  .**.** Query par
1860: 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20  ameters:.**.**  
1870: 20 20 64 3d 53 54 41 52 54 44 41 54 45 20 20 20    d=STARTDATE   
1880: 20 64 61 74 65 20 69 6e 20 69 73 6f 38 36 30 31   date in iso8601
1890: 20 6e 6f 74 61 74 69 6f 6e 2e 20 20 20 20 20 20   notation.      
18a0: 20 20 20 20 64 66 6c 74 3a 20 6e 65 77 65 73 74      dflt: newest
18b0: 20 65 76 65 6e 74 0a 2a 2a 20 20 20 20 6e 3d 49   event.**    n=I
18c0: 4e 54 45 47 45 52 20 20 20 20 20 20 6e 75 6d 62  NTEGER      numb
18d0: 65 72 20 6f 66 20 65 76 65 6e 74 73 20 74 6f 20  er of events to 
18e0: 73 68 6f 77 2e 20 20 20 20 20 20 20 20 20 20 64  show.          d
18f0: 66 6c 74 3a 20 32 35 0a 2a 2a 20 20 20 20 65 3d  flt: 25.**    e=
1900: 49 4e 54 45 47 45 52 20 20 20 20 20 20 73 74 61  INTEGER      sta
1910: 72 74 69 6e 67 20 65 76 65 6e 74 20 69 64 2e 20  rting event id. 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1930: 64 66 6c 74 3a 20 6e 69 6c 0a 2a 2a 20 20 20 20  dflt: nil.**    
1940: 75 3d 4e 41 4d 45 20 20 20 20 20 20 20 20 20 73  u=NAME         s
1950: 68 6f 77 20 6f 6e 6c 79 20 65 76 65 6e 74 73 20  how only events 
1960: 66 72 6f 6d 20 75 73 65 72 2e 20 20 20 20 20 20  from user.      
1970: 20 20 64 66 6c 74 3a 20 6e 69 6c 0a 2a 2a 20 20    dflt: nil.**  
1980: 20 20 61 20 20 20 20 20 20 20 20 20 20 20 20 20    a             
1990: 20 73 68 6f 77 20 65 76 65 6e 74 73 20 61 66 74   show events aft
19a0: 65 72 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67  er and including
19b0: 2e 20 20 20 64 66 6c 74 3a 20 66 61 6c 73 65 0a  .   dflt: false.
19c0: 2a 2a 20 20 20 20 72 20 20 20 20 20 20 20 20 20  **    r         
19d0: 20 20 20 20 20 73 68 6f 77 20 6f 6e 6c 79 20 72       show only r
19e0: 65 6c 61 74 65 64 20 65 76 65 6e 74 73 2e 20 20  elated events.  
19f0: 20 20 20 20 20 20 20 20 64 66 6c 74 3a 20 66 61          dflt: fa
1a00: 6c 73 65 0a 2a 2f 0a 76 6f 69 64 20 70 61 67 65  lse.*/.void page
1a10: 5f 74 69 6d 65 6c 69 6e 65 28 76 6f 69 64 29 7b  _timeline(void){
1a20: 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 63 68 61  .  Stmt q;.  cha
1a30: 72 20 2a 7a 53 51 4c 3b 0a 20 20 42 6c 6f 62 20  r *zSQL;.  Blob 
1a40: 73 63 72 69 70 74 49 6e 69 74 3b 0a 20 20 63 68  scriptInit;.  ch
1a50: 61 72 20 7a 44 61 74 65 5b 31 30 30 5d 3b 0a 20  ar zDate[100];. 
1a60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
1a70: 61 72 74 20 3d 20 50 28 22 64 22 29 3b 0a 20 20  art = P("d");.  
1a80: 69 6e 74 20 6e 45 6e 74 72 79 20 3d 20 61 74 6f  int nEntry = ato
1a90: 69 28 50 44 28 22 6e 22 2c 22 32 30 22 29 29 3b  i(PD("n","20"));
1aa0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1ab0: 55 73 65 72 20 3d 20 50 28 22 75 22 29 3b 0a 20  User = P("u");. 
1ac0: 20 69 6e 74 20 6f 62 6a 69 64 20 3d 20 61 74 6f   int objid = ato
1ad0: 69 28 50 44 28 22 65 22 2c 22 30 22 29 29 3b 0a  i(PD("e","0"));.
1ae0: 20 20 69 6e 74 20 72 65 6c 61 74 65 64 45 76 65    int relatedEve
1af0: 6e 74 73 20 3d 20 50 28 22 72 22 29 21 3d 30 3b  nts = P("r")!=0;
1b00: 0a 20 20 69 6e 74 20 61 66 74 65 72 46 6c 61 67  .  int afterFlag
1b10: 20 3d 20 50 28 22 61 22 29 21 3d 30 3b 0a 20 20   = P("a")!=0;.  
1b20: 69 6e 74 20 66 69 72 73 74 45 76 65 6e 74 3b 0a  int firstEvent;.
1b30: 20 20 69 6e 74 20 6c 61 73 74 45 76 65 6e 74 3b    int lastEvent;
1b40: 0a 0a 20 20 2f 2a 20 54 6f 20 76 69 65 77 20 74  ..  /* To view t
1b50: 68 65 20 74 69 6d 65 6c 69 6e 65 2c 20 6d 75 73  he timeline, mus
1b60: 74 20 68 61 76 65 20 70 65 72 6d 69 73 73 69 6f  t have permissio
1b70: 6e 20 74 6f 20 72 65 61 64 20 70 72 6f 6a 65 63  n to read projec
1b80: 74 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 6c  t data..  */.  l
1b90: 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65  ogin_check_crede
1ba0: 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20  ntials();.  if( 
1bb0: 21 67 2e 6f 6b 52 65 61 64 20 29 7b 20 6c 6f 67  !g.okRead ){ log
1bc0: 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72 65 74  in_needed(); ret
1bd0: 75 72 6e 3b 20 7d 0a 0a 20 20 73 74 79 6c 65 5f  urn; }..  style_
1be0: 68 65 61 64 65 72 28 22 54 69 6d 65 6c 69 6e 65  header("Timeline
1bf0: 22 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 48  ");.  if( !g.okH
1c00: 69 73 74 6f 72 79 20 26 26 0a 20 20 20 20 20 20  istory &&.      
1c10: 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45 43  db_exists("SELEC
1c20: 54 20 31 20 46 52 4f 4d 20 75 73 65 72 22 0a 20  T 1 FROM user". 
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1c40: 20 57 48 45 52 45 20 6c 6f 67 69 6e 3d 27 61 6e   WHERE login='an
1c50: 6f 6e 79 6d 6f 75 73 27 22 0a 20 20 20 20 20 20  onymous'".      
1c60: 20 20 20 20 20 20 20 20 20 20 22 20 20 20 41 4e            "   AN
1c70: 44 20 63 61 70 20 4c 49 4b 45 20 27 25 25 68 25  D cap LIKE '%%h%
1c80: 25 27 22 29 20 29 7b 0a 20 20 20 20 40 20 3c 70  %'") ){.    @ <p
1c90: 3e 3c 62 3e 4e 6f 74 65 3a 3c 2f 62 3e 20 59 6f  ><b>Note:</b> Yo
1ca0: 75 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74  u will be able t
1cb0: 6f 20 61 63 63 65 73 73 20 3c 75 3e 6d 75 63 68  o access <u>much
1cc0: 3c 2f 75 3e 20 6d 6f 72 65 0a 20 20 20 20 40 20  </u> more.    @ 
1cd0: 68 69 73 74 6f 72 69 63 61 6c 20 69 6e 66 6f 72  historical infor
1ce0: 6d 61 74 69 6f 6e 20 69 66 20 3c 61 20 68 72 65  mation if <a hre
1cf0: 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c  f="%s(g.zBaseURL
1d00: 29 2f 6c 6f 67 69 6e 22 3e 6c 6f 67 69 6e 3c 2f  )/login">login</
1d10: 61 3e 2e 3c 2f 70 3e 0a 20 20 7d 0a 20 20 7a 53  a>.</p>.  }.  zS
1d20: 51 4c 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73  QL = mprintf("%s
1d30: 22 2c 20 74 69 6d 65 6c 69 6e 65 5f 71 75 65 72  ", timeline_quer
1d40: 79 5f 66 6f 72 5f 77 77 77 28 29 29 3b 0a 20 20  y_for_www());.  
1d50: 69 66 28 20 7a 55 73 65 72 20 29 7b 0a 20 20 20  if( zUser ){.   
1d60: 20 7a 53 51 4c 20 3d 20 6d 70 72 69 6e 74 66 28   zSQL = mprintf(
1d70: 22 25 7a 20 41 4e 44 20 65 76 65 6e 74 2e 75 73  "%z AND event.us
1d80: 65 72 3d 25 51 22 2c 20 7a 53 51 4c 2c 20 7a 55  er=%Q", zSQL, zU
1d90: 73 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ser);.  }.  if( 
1da0: 6f 62 6a 69 64 20 29 7b 0a 20 20 20 20 63 68 61  objid ){.    cha
1db0: 72 20 2a 7a 20 3d 20 64 62 5f 74 65 78 74 28 30  r *z = db_text(0
1dc0: 2c 20 22 53 45 4c 45 43 54 20 64 61 74 65 74 69  , "SELECT dateti
1dd0: 6d 65 28 65 76 65 6e 74 2e 6d 74 69 6d 65 29 20  me(event.mtime) 
1de0: 46 52 4f 4d 20 65 76 65 6e 74 22 0a 20 20 20 20  FROM event".    
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 20 20 20 22 20 57 48 45 52 45 20 6f 62 6a       " WHERE obj
1e10: 69 64 3d 25 64 22 2c 20 6f 62 6a 69 64 29 3b 0a  id=%d", objid);.
1e20: 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20      if( z ){.   
1e30: 20 20 20 7a 53 74 61 72 74 20 3d 20 7a 3b 0a 20     zStart = z;. 
1e40: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a     }.  }.  if( z
1e50: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 77 68 69  Start ){.    whi
1e60: 6c 65 28 20 69 73 73 70 61 63 65 28 7a 53 74 61  le( isspace(zSta
1e70: 72 74 5b 30 5d 29 20 29 7b 20 7a 53 74 61 72 74  rt[0]) ){ zStart
1e80: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a 53  ++; }.    if( zS
1e90: 74 61 72 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  tart[0] ){.     
1ea0: 20 7a 53 51 4c 20 3d 20 6d 70 72 69 6e 74 66 28   zSQL = mprintf(
1eb0: 22 25 7a 20 41 4e 44 20 65 76 65 6e 74 2e 6d 74  "%z AND event.mt
1ec0: 69 6d 65 20 25 73 20 6a 75 6c 69 61 6e 64 61 79  ime %s julianday
1ed0: 28 25 51 2c 20 27 6c 6f 63 61 6c 74 69 6d 65 27  (%Q, 'localtime'
1ee0: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
1ef0: 20 20 20 20 20 20 20 20 20 20 7a 53 51 4c 2c 20            zSQL, 
1f00: 61 66 74 65 72 46 6c 61 67 20 3f 20 22 3e 3d 22  afterFlag ? ">="
1f10: 20 3a 20 22 3c 3d 22 2c 20 7a 53 74 61 72 74 29   : "<=", zStart)
1f20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1f30: 28 20 72 65 6c 61 74 65 64 45 76 65 6e 74 73 20  ( relatedEvents 
1f40: 26 26 20 6f 62 6a 69 64 20 29 7b 0a 20 20 20 20  && objid ){.    
1f50: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20  db_multi_exec(. 
1f60: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 45        "CREATE TE
1f70: 4d 50 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  MP TABLE IF NOT 
1f80: 45 58 49 53 54 53 20 6f 6b 28 72 69 64 20 49 4e  EXISTS ok(rid IN
1f90: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
1fa0: 59 29 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  Y)".    );.    i
1fb0: 66 28 20 61 66 74 65 72 46 6c 61 67 20 29 7b 0a  f( afterFlag ){.
1fc0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 5f 64 65        compute_de
1fd0: 73 63 65 6e 64 65 6e 74 73 28 6f 62 6a 69 64 2c  scendents(objid,
1fe0: 20 6e 45 6e 74 72 79 29 3b 0a 20 20 20 20 7d 65   nEntry);.    }e
1ff0: 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6d 70 75  lse{.      compu
2000: 74 65 5f 61 6e 63 65 73 74 6f 72 73 28 6f 62 6a  te_ancestors(obj
2010: 69 64 2c 20 6e 45 6e 74 72 79 29 3b 0a 20 20 20  id, nEntry);.   
2020: 20 7d 0a 20 20 20 20 7a 53 51 4c 20 3d 20 6d 70   }.    zSQL = mp
2030: 72 69 6e 74 66 28 22 25 7a 20 41 4e 44 20 65 76  rintf("%z AND ev
2040: 65 6e 74 2e 6f 62 6a 69 64 20 49 4e 20 6f 6b 22  ent.objid IN ok"
2050: 2c 20 7a 53 51 4c 29 3b 0a 20 20 7d 0a 20 20 7a  , zSQL);.  }.  z
2060: 53 51 4c 20 3d 20 6d 70 72 69 6e 74 66 28 22 25  SQL = mprintf("%
2070: 7a 20 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74  z ORDER BY event
2080: 2e 6d 74 69 6d 65 20 44 45 53 43 20 4c 49 4d 49  .mtime DESC LIMI
2090: 54 20 25 64 22 2c 20 7a 53 51 4c 2c 20 6e 45 6e  T %d", zSQL, nEn
20a0: 74 72 79 29 3b 0a 20 20 64 62 5f 70 72 65 70 61  try);.  db_prepa
20b0: 72 65 28 26 71 2c 20 7a 53 51 4c 29 3b 0a 20 20  re(&q, zSQL);.  
20c0: 66 72 65 65 28 7a 53 51 4c 29 3b 0a 20 20 7a 44  free(zSQL);.  zD
20d0: 61 74 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 62 6c  ate[0] = 0;.  bl
20e0: 6f 62 5f 7a 65 72 6f 28 26 73 63 72 69 70 74 49  ob_zero(&scriptI
20f0: 6e 69 74 29 3b 0a 20 20 7a 44 61 74 65 5b 30 5d  nit);.  zDate[0]
2100: 20 3d 20 30 3b 0a 20 20 77 77 77 5f 70 72 69 6e   = 0;.  www_prin
2110: 74 5f 74 69 6d 65 6c 69 6e 65 28 26 71 2c 20 26  t_timeline(&q, &
2120: 66 69 72 73 74 45 76 65 6e 74 2c 20 26 6c 61 73  firstEvent, &las
2130: 74 45 76 65 6e 74 2c 0a 20 20 20 20 20 20 20 20  tEvent,.        
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 61 76               sav
2150: 65 5f 70 61 72 65 6e 74 61 67 65 5f 6a 61 76 61  e_parentage_java
2160: 73 63 72 69 70 74 2c 20 26 73 63 72 69 70 74 49  script, &scriptI
2170: 6e 69 74 29 3b 0a 20 20 64 62 5f 66 69 6e 61 6c  nit);.  db_final
2180: 69 7a 65 28 26 71 29 3b 0a 20 20 69 66 28 20 7a  ize(&q);.  if( z
2190: 53 74 61 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Start==0 ){.    
21a0: 7a 53 74 61 72 74 20 3d 20 7a 44 61 74 65 3b 0a  zStart = zDate;.
21b0: 20 20 7d 0a 20 20 40 20 3c 73 63 72 69 70 74 3e    }.  @ <script>
21c0: 0a 20 20 40 20 76 61 72 20 70 61 72 65 6e 74 6f  .  @ var parento
21d0: 66 20 3d 20 6e 65 77 20 4f 62 6a 65 63 74 28 29  f = new Object()
21e0: 3b 0a 20 20 40 20 76 61 72 20 63 68 69 6c 64 6f  ;.  @ var childo
21f0: 66 20 3d 20 6e 65 77 20 4f 62 6a 65 63 74 28 29  f = new Object()
2200: 3b 0a 20 20 63 67 69 5f 61 70 70 65 6e 64 5f 63  ;.  cgi_append_c
2210: 6f 6e 74 65 6e 74 28 62 6c 6f 62 5f 62 75 66 66  ontent(blob_buff
2220: 65 72 28 26 73 63 72 69 70 74 49 6e 69 74 29 2c  er(&scriptInit),
2230: 20 62 6c 6f 62 5f 73 69 7a 65 28 26 73 63 72 69   blob_size(&scri
2240: 70 74 49 6e 69 74 29 29 3b 0a 20 20 62 6c 6f 62  ptInit));.  blob
2250: 5f 72 65 73 65 74 28 26 73 63 72 69 70 74 49 6e  _reset(&scriptIn
2260: 69 74 29 3b 0a 20 20 40 20 66 75 6e 63 74 69 6f  it);.  @ functio
2270: 6e 20 73 65 74 61 6c 6c 28 76 61 6c 75 65 29 7b  n setall(value){
2280: 0a 20 20 40 20 20 20 66 6f 72 28 76 61 72 20 78  .  @   for(var x
2290: 20 69 6e 20 70 61 72 65 6e 74 6f 66 29 7b 0a 20   in parentof){. 
22a0: 20 40 20 20 20 20 20 73 65 74 6f 6e 65 28 78 2c   @     setone(x,
22b0: 76 61 6c 75 65 29 3b 0a 20 20 40 20 20 20 7d 0a  value);.  @   }.
22c0: 20 20 40 20 7d 0a 20 20 40 20 73 65 74 61 6c 6c    @ }.  @ setall
22d0: 28 22 23 66 66 66 66 66 66 22 29 3b 0a 20 20 40  ("#ffffff");.  @
22e0: 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 6f 6e 65   function setone
22f0: 28 69 64 2c 20 63 6c 72 29 7b 0a 20 20 40 20 20  (id, clr){.  @  
2300: 20 69 66 28 20 70 61 72 65 6e 74 6f 66 5b 69 64   if( parentof[id
2310: 5d 3d 3d 6e 75 6c 6c 20 29 20 72 65 74 75 72 6e  ]==null ) return
2320: 20 30 3b 0a 20 20 40 20 20 20 76 61 72 20 77 20   0;.  @   var w 
2330: 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c  = document.getEl
2340: 65 6d 65 6e 74 42 79 49 64 28 69 64 29 3b 0a 20  ementById(id);. 
2350: 20 40 20 20 20 69 66 28 20 77 2e 73 74 79 6c 65   @   if( w.style
2360: 2e 63 6f 6c 6f 72 3d 3d 63 6c 72 20 29 7b 0a 20  .color==clr ){. 
2370: 20 40 20 20 20 20 20 72 65 74 75 72 6e 20 30 0a   @     return 0.
2380: 20 20 40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 40    @   }else{.  @
2390: 20 20 20 20 20 77 2e 73 74 79 6c 65 2e 63 6f 6c       w.style.col
23a0: 6f 72 20 3d 20 63 6c 72 0a 20 20 40 20 20 20 20  or = clr.  @    
23b0: 20 72 65 74 75 72 6e 20 31 0a 20 20 40 20 20 20   return 1.  @   
23c0: 7d 0a 20 20 40 20 7d 0a 20 20 40 20 66 75 6e 63  }.  @ }.  @ func
23d0: 74 69 6f 6e 20 78 69 6e 28 69 64 29 20 7b 0a 20  tion xin(id) {. 
23e0: 20 40 20 20 20 73 65 74 61 6c 6c 28 22 23 66 66   @   setall("#ff
23f0: 66 66 66 66 22 29 3b 0a 20 20 40 20 20 20 73 65  ffff");.  @   se
2400: 74 6f 6e 65 28 69 64 2c 22 23 66 66 30 30 30 30  tone(id,"#ff0000
2410: 22 29 3b 0a 20 20 40 20 20 20 73 65 74 5f 63 68  ");.  @   set_ch
2420: 69 6c 64 72 65 6e 28 69 64 2c 20 22 23 62 30 62  ildren(id, "#b0b
2430: 30 62 30 22 29 3b 0a 20 20 40 20 20 20 73 65 74  0b0");.  @   set
2440: 5f 70 61 72 65 6e 74 73 28 69 64 2c 20 22 23 62  _parents(id, "#b
2450: 30 62 30 62 30 22 29 3b 0a 20 20 40 20 20 20 66  0b0b0");.  @   f
2460: 6f 72 28 76 61 72 20 78 20 69 6e 20 70 61 72 65  or(var x in pare
2470: 6e 74 6f 66 5b 69 64 5d 29 7b 0a 20 20 40 20 20  ntof[id]){.  @  
2480: 20 20 20 76 61 72 20 70 69 64 20 3d 20 70 61 72     var pid = par
2490: 65 6e 74 6f 66 5b 69 64 5d 5b 78 5d 0a 20 20 40  entof[id][x].  @
24a0: 20 20 20 20 20 76 61 72 20 77 20 3d 20 64 6f 63       var w = doc
24b0: 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74  ument.getElement
24c0: 42 79 49 64 28 70 69 64 29 3b 0a 20 20 40 20 20  ById(pid);.  @  
24d0: 20 20 20 69 66 28 20 77 21 3d 6e 75 6c 6c 20 29     if( w!=null )
24e0: 7b 0a 20 20 40 20 20 20 20 20 20 20 77 2e 73 74  {.  @       w.st
24f0: 79 6c 65 2e 63 6f 6c 6f 72 20 3d 20 22 23 30 30  yle.color = "#00
2500: 30 30 30 30 22 3b 0a 20 20 40 20 20 20 20 20 7d  0000";.  @     }
2510: 0a 20 20 40 20 20 20 7d 0a 20 20 40 20 20 20 66  .  @   }.  @   f
2520: 6f 72 28 76 61 72 20 78 20 69 6e 20 63 68 69 6c  or(var x in chil
2530: 64 6f 66 5b 69 64 5d 29 7b 0a 20 20 40 20 20 20  dof[id]){.  @   
2540: 20 20 76 61 72 20 63 69 64 20 3d 20 63 68 69 6c    var cid = chil
2550: 64 6f 66 5b 69 64 5d 5b 78 5d 0a 20 20 40 20 20  dof[id][x].  @  
2560: 20 20 20 76 61 72 20 77 20 3d 20 64 6f 63 75 6d     var w = docum
2570: 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79  ent.getElementBy
2580: 49 64 28 63 69 64 29 3b 0a 20 20 40 20 20 20 20  Id(cid);.  @    
2590: 20 69 66 28 20 77 21 3d 6e 75 6c 6c 20 29 7b 0a   if( w!=null ){.
25a0: 20 20 40 20 20 20 20 20 20 20 77 2e 73 74 79 6c    @       w.styl
25b0: 65 2e 63 6f 6c 6f 72 20 3d 20 22 23 30 30 30 30  e.color = "#0000
25c0: 30 30 22 3b 0a 20 20 40 20 20 20 20 20 7d 0a 20  00";.  @     }. 
25d0: 20 40 20 20 20 7d 0a 20 20 40 20 7d 0a 20 20 40   @   }.  @ }.  @
25e0: 20 66 75 6e 63 74 69 6f 6e 20 78 6f 75 74 28 69   function xout(i
25f0: 64 29 20 7b 0a 20 20 40 20 20 20 2f 2a 20 73 65  d) {.  @   /* se
2600: 74 61 6c 6c 28 22 23 30 30 30 30 30 30 22 29 3b  tall("#000000");
2610: 20 2a 2f 0a 20 20 40 20 7d 0a 20 20 40 20 66 75   */.  @ }.  @ fu
2620: 6e 63 74 69 6f 6e 20 73 65 74 5f 70 61 72 65 6e  nction set_paren
2630: 74 73 28 69 64 2c 20 63 6c 72 29 7b 0a 20 20 40  ts(id, clr){.  @
2640: 20 20 20 76 61 72 20 70 6c 69 73 74 20 3d 20 70     var plist = p
2650: 61 72 65 6e 74 6f 66 5b 69 64 5d 3b 0a 20 20 40  arentof[id];.  @
2660: 20 20 20 69 66 28 20 70 6c 69 73 74 3d 3d 6e 75     if( plist==nu
2670: 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 40  ll ) return;.  @
2680: 20 20 20 66 6f 72 28 76 61 72 20 78 20 69 6e 20     for(var x in 
2690: 70 6c 69 73 74 29 7b 0a 20 20 40 20 20 20 20 20  plist){.  @     
26a0: 76 61 72 20 70 69 64 20 3d 20 70 6c 69 73 74 5b  var pid = plist[
26b0: 78 5d 3b 0a 20 20 40 20 20 20 20 20 69 66 28 20  x];.  @     if( 
26c0: 73 65 74 6f 6e 65 28 70 69 64 2c 63 6c 72 29 3d  setone(pid,clr)=
26d0: 3d 31 20 29 7b 0a 20 20 40 20 20 20 20 20 20 20  =1 ){.  @       
26e0: 73 65 74 5f 70 61 72 65 6e 74 73 28 70 69 64 2c  set_parents(pid,
26f0: 63 6c 72 29 3b 0a 20 20 40 20 20 20 20 20 7d 0a  clr);.  @     }.
2700: 20 20 40 20 20 20 7d 0a 20 20 40 20 7d 0a 20 20    @   }.  @ }.  
2710: 40 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 5f 63  @ function set_c
2720: 68 69 6c 64 72 65 6e 28 69 64 2c 63 6c 72 29 7b  hildren(id,clr){
2730: 0a 20 20 40 20 20 20 76 61 72 20 63 6c 69 73 74  .  @   var clist
2740: 20 3d 20 63 68 69 6c 64 6f 66 5b 69 64 5d 3b 0a   = childof[id];.
2750: 20 20 40 20 20 20 69 66 28 20 63 6c 69 73 74 3d    @   if( clist=
2760: 3d 6e 75 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a  =null ) return;.
2770: 20 20 40 20 20 20 66 6f 72 28 76 61 72 20 78 20    @   for(var x 
2780: 69 6e 20 63 6c 69 73 74 29 7b 0a 20 20 40 20 20  in clist){.  @  
2790: 20 20 20 76 61 72 20 63 69 64 20 3d 20 63 6c 69     var cid = cli
27a0: 73 74 5b 78 5d 3b 0a 20 20 40 20 20 20 20 20 69  st[x];.  @     i
27b0: 66 28 20 73 65 74 6f 6e 65 28 63 69 64 2c 63 6c  f( setone(cid,cl
27c0: 72 29 3d 3d 31 20 29 7b 0a 20 20 40 20 20 20 20  r)==1 ){.  @    
27d0: 20 20 20 73 65 74 5f 63 68 69 6c 64 72 65 6e 28     set_children(
27e0: 63 69 64 2c 63 6c 72 29 3b 0a 20 20 40 20 20 20  cid,clr);.  @   
27f0: 20 20 7d 0a 20 20 40 20 20 20 7d 0a 20 20 40 20    }.  @   }.  @ 
2800: 7d 0a 20 20 40 20 3c 2f 73 63 72 69 70 74 3e 0a  }.  @ </script>.
2810: 20 20 40 20 3c 68 72 3e 0a 20 20 40 20 3c 66 6f    @ <hr>.  @ <fo
2820: 72 6d 20 6d 65 74 68 6f 64 3d 22 47 45 54 22 20  rm method="GET" 
2830: 61 63 74 69 6f 6e 3d 22 25 73 28 67 2e 7a 42 61  action="%s(g.zBa
2840: 73 65 55 52 4c 29 2f 74 69 6d 65 6c 69 6e 65 22  seURL)/timeline"
2850: 3e 0a 20 20 40 20 53 74 61 72 74 20 44 61 74 65  >.  @ Start Date
2860: 3a 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70  :.  @ <input typ
2870: 65 3d 22 74 65 78 74 22 20 73 69 7a 65 3d 22 33  e="text" size="3
2880: 30 22 20 76 61 6c 75 65 3d 22 25 68 28 7a 53 74  0" value="%h(zSt
2890: 61 72 74 29 22 20 6e 61 6d 65 3d 22 64 22 3e 0a  art)" name="d">.
28a0: 20 20 40 20 4e 75 6d 62 65 72 20 4f 66 20 45 6e    @ Number Of En
28b0: 74 72 69 65 73 3a 20 20 0a 20 20 40 20 3c 69 6e  tries:  .  @ <in
28c0: 70 75 74 20 74 79 70 65 3d 22 74 65 78 74 22 20  put type="text" 
28d0: 73 69 7a 65 3d 22 34 22 20 76 61 6c 75 65 3d 22  size="4" value="
28e0: 25 64 28 6e 45 6e 74 72 79 29 22 20 6e 61 6d 65  %d(nEntry)" name
28f0: 3d 22 6e 22 3e 0a 20 20 40 20 3c 62 72 3e 3c 69  ="n">.  @ <br><i
2900: 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69  nput type="submi
2910: 74 22 20 76 61 6c 75 65 3d 22 53 75 62 6d 69 74  t" value="Submit
2920: 22 3e 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20  ">.  @ </form>. 
2930: 20 40 20 3c 66 6f 72 6d 20 6d 65 74 68 6f 64 3d   @ <form method=
2940: 22 47 45 54 22 20 61 63 74 69 6f 6e 3d 22 25 73  "GET" action="%s
2950: 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 74 69 6d  (g.zBaseURL)/tim
2960: 65 6c 69 6e 65 22 3e 0a 20 20 40 20 3c 69 6e 70  eline">.  @ <inp
2970: 75 74 20 74 79 70 65 3d 22 68 69 64 64 65 6e 22  ut type="hidden"
2980: 20 76 61 6c 75 65 3d 22 25 64 28 6c 61 73 74 45   value="%d(lastE
2990: 76 65 6e 74 29 22 20 6e 61 6d 65 3d 22 65 22 3e  vent)" name="e">
29a0: 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65  .  @ <input type
29b0: 3d 22 68 69 64 64 65 6e 22 20 76 61 6c 75 65 3d  ="hidden" value=
29c0: 22 25 64 28 6e 45 6e 74 72 79 29 22 20 6e 61 6d  "%d(nEntry)" nam
29d0: 65 3d 22 6e 22 3e 0a 20 20 40 20 3c 69 6e 70 75  e="n">.  @ <inpu
29e0: 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20  t type="submit" 
29f0: 76 61 6c 75 65 3d 22 4e 65 78 74 20 25 64 28 6e  value="Next %d(n
2a00: 45 6e 74 72 79 29 20 52 6f 77 73 22 3e 0a 20 20  Entry) Rows">.  
2a10: 40 20 3c 2f 66 6f 72 6d 3e 0a 20 20 40 20 3c 66  @ </form>.  @ <f
2a20: 6f 72 6d 20 6d 65 74 68 6f 64 3d 22 47 45 54 22  orm method="GET"
2a30: 20 61 63 74 69 6f 6e 3d 22 25 73 28 67 2e 7a 42   action="%s(g.zB
2a40: 61 73 65 55 52 4c 29 2f 74 69 6d 65 6c 69 6e 65  aseURL)/timeline
2a50: 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79  ">.  @ <input ty
2a60: 70 65 3d 22 68 69 64 64 65 6e 22 20 76 61 6c 75  pe="hidden" valu
2a70: 65 3d 22 25 64 28 66 69 72 73 74 45 76 65 6e 74  e="%d(firstEvent
2a80: 29 22 20 6e 61 6d 65 3d 22 65 22 3e 0a 20 20 40  )" name="e">.  @
2a90: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 68 69   <input type="hi
2aa0: 64 64 65 6e 22 20 76 61 6c 75 65 3d 22 31 22 20  dden" value="1" 
2ab0: 6e 61 6d 65 3d 22 61 22 3e 0a 20 20 40 20 3c 69  name="a">.  @ <i
2ac0: 6e 70 75 74 20 74 79 70 65 3d 22 68 69 64 64 65  nput type="hidde
2ad0: 6e 22 20 76 61 6c 75 65 3d 22 25 64 28 6e 45 6e  n" value="%d(nEn
2ae0: 74 72 79 29 22 20 6e 61 6d 65 3d 22 6e 22 3e 0a  try)" name="n">.
2af0: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
2b00: 22 73 75 62 6d 69 74 22 20 76 61 6c 75 65 3d 22  "submit" value="
2b10: 50 72 65 76 69 6f 75 73 20 25 64 28 6e 45 6e 74  Previous %d(nEnt
2b20: 72 79 29 20 52 6f 77 73 22 3e 0a 20 20 40 20 3c  ry) Rows">.  @ <
2b30: 2f 66 6f 72 6d 3e 0a 20 20 73 74 79 6c 65 5f 66  /form>.  style_f
2b40: 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ooter();.}../*.*
2b50: 2a 20 54 68 65 20 69 6e 70 75 74 20 71 75 65 72  * The input quer
2b60: 79 20 71 20 73 65 6c 65 63 74 73 20 76 61 72 69  y q selects vari
2b70: 6f 75 73 20 72 65 63 6f 72 64 73 2e 20 20 50 72  ous records.  Pr
2b80: 69 6e 74 20 61 20 68 75 6d 61 6e 2d 72 65 61 64  int a human-read
2b90: 61 62 6c 65 0a 2a 2a 20 73 75 6d 6d 61 72 79 20  able.** summary 
2ba0: 6f 66 20 74 68 6f 73 65 20 72 65 63 6f 72 64 73  of those records
2bb0: 2e 0a 2a 2a 0a 2a 2a 20 4c 69 6d 69 74 20 74 68  ..**.** Limit th
2bc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
2bd0: 69 65 73 20 70 72 69 6e 74 65 64 20 74 6f 20 6e  ies printed to n
2be0: 4c 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65  Line..** .** The
2bf0: 20 71 75 65 72 79 20 73 68 6f 75 6c 64 20 72 65   query should re
2c00: 74 75 72 6e 20 74 68 65 73 65 20 63 6f 6c 75 6d  turn these colum
2c10: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 30 2e 20  ns:.**.**    0. 
2c20: 20 72 69 64 0a 2a 2a 20 20 20 20 31 2e 20 20 75   rid.**    1.  u
2c30: 75 69 64 0a 2a 2a 20 20 20 20 32 2e 20 20 44 61  uid.**    2.  Da
2c40: 74 65 2f 54 69 6d 65 0a 2a 2a 20 20 20 20 33 2e  te/Time.**    3.
2c50: 20 20 43 6f 6d 6d 65 6e 74 20 73 74 72 69 6e 67    Comment string
2c60: 20 61 6e 64 20 75 73 65 72 0a 2a 2a 20 20 20 20   and user.**    
2c70: 34 2e 20 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f  4.  Number of no
2c80: 6e 2d 6d 65 72 67 65 20 63 68 69 6c 64 72 65 6e  n-merge children
2c90: 0a 2a 2a 20 20 20 20 35 2e 20 20 4e 75 6d 62 65  .**    5.  Numbe
2ca0: 72 20 6f 66 20 70 61 72 65 6e 74 73 0a 2a 2f 0a  r of parents.*/.
2cb0: 76 6f 69 64 20 70 72 69 6e 74 5f 74 69 6d 65 6c  void print_timel
2cc0: 69 6e 65 28 53 74 6d 74 20 2a 71 2c 20 69 6e 74  ine(Stmt *q, int
2cd0: 20 6d 78 4c 69 6e 65 29 7b 0a 20 20 69 6e 74 20   mxLine){.  int 
2ce0: 6e 4c 69 6e 65 20 3d 20 30 3b 0a 20 20 63 68 61  nLine = 0;.  cha
2cf0: 72 20 7a 50 72 65 76 44 61 74 65 5b 32 30 5d 3b  r zPrevDate[20];
2d00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2d10: 43 75 72 72 65 6e 74 55 75 69 64 3d 30 3b 0a 20  CurrentUuid=0;. 
2d20: 20 53 74 6d 74 20 63 75 72 72 65 6e 74 51 3b 0a   Stmt currentQ;.
2d30: 20 20 69 6e 74 20 72 69 64 20 3d 20 64 62 5f 6c    int rid = db_l
2d40: 67 65 74 5f 69 6e 74 28 22 63 68 65 63 6b 6f 75  get_int("checkou
2d50: 74 22 2c 20 30 29 3b 0a 20 20 7a 50 72 65 76 44  t", 0);.  zPrevD
2d60: 61 74 65 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 64  ate[0] = 0;..  d
2d70: 62 5f 70 72 65 70 61 72 65 28 26 63 75 72 72 65  b_prepare(&curre
2d80: 6e 74 51 2c 0a 20 20 20 20 22 53 45 4c 45 43 54  ntQ,.    "SELECT
2d90: 20 75 75 69 64 22 0a 20 20 20 20 22 20 20 46 52   uuid".    "  FR
2da0: 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69  OM blob WHERE ri
2db0: 64 3d 25 64 22 2c 20 72 69 64 0a 20 20 29 3b 0a  d=%d", rid.  );.
2dc0: 20 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 63    if( db_step(&c
2dd0: 75 72 72 65 6e 74 51 29 3d 3d 53 51 4c 49 54 45  urrentQ)==SQLITE
2de0: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a 43 75 72  _ROW ){.    zCur
2df0: 72 65 6e 74 55 75 69 64 20 3d 20 64 62 5f 63 6f  rentUuid = db_co
2e00: 6c 75 6d 6e 5f 74 65 78 74 28 26 63 75 72 72 65  lumn_text(&curre
2e10: 6e 74 51 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  ntQ, 0);.  }..  
2e20: 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 71  while( db_step(q
2e30: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26 26  )==SQLITE_ROW &&
2e40: 20 6e 4c 69 6e 65 3c 3d 6d 78 4c 69 6e 65 20 29   nLine<=mxLine )
2e50: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2e60: 20 2a 7a 49 64 20 3d 20 64 62 5f 63 6f 6c 75 6d   *zId = db_colum
2e70: 6e 5f 74 65 78 74 28 71 2c 20 31 29 3b 0a 20 20  n_text(q, 1);.  
2e80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2e90: 61 74 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ate = db_column_
2ea0: 74 65 78 74 28 71 2c 20 32 29 3b 0a 20 20 20 20  text(q, 2);.    
2eb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d  const char *zCom
2ec0: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
2ed0: 74 28 71 2c 20 33 29 3b 0a 20 20 20 20 69 6e 74  t(q, 3);.    int
2ee0: 20 6e 43 68 69 6c 64 20 3d 20 64 62 5f 63 6f 6c   nChild = db_col
2ef0: 75 6d 6e 5f 69 6e 74 28 71 2c 20 34 29 3b 0a 20  umn_int(q, 4);. 
2f00: 20 20 20 69 6e 74 20 6e 50 61 72 65 6e 74 20 3d     int nParent =
2f10: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 71   db_column_int(q
2f20: 2c 20 35 29 3b 0a 20 20 20 20 63 68 61 72 20 2a  , 5);.    char *
2f30: 7a 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 69  zFree = 0;.    i
2f40: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 63 68  nt n = 0;.    ch
2f50: 61 72 20 7a 50 72 65 66 69 78 5b 38 30 5d 3b 0a  ar zPrefix[80];.
2f60: 20 20 20 20 63 68 61 72 20 7a 55 75 69 64 5b 55      char zUuid[U
2f70: 55 49 44 5f 53 49 5a 45 2b 31 5d 3b 0a 20 20 20  UID_SIZE+1];.   
2f80: 20 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 55   .    sprintf(zU
2f90: 75 69 64 2c 20 22 25 2e 31 30 73 22 2c 20 7a 49  uid, "%.10s", zI
2fa0: 64 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63  d);.    if( memc
2fb0: 6d 70 28 7a 44 61 74 65 2c 20 7a 50 72 65 76 44  mp(zDate, zPrevD
2fc0: 61 74 65 2c 20 31 30 29 20 29 7b 0a 20 20 20 20  ate, 10) ){.    
2fd0: 20 20 70 72 69 6e 74 66 28 22 3d 3d 3d 20 25 2e    printf("=== %.
2fe0: 31 30 73 20 3d 3d 3d 5c 6e 22 2c 20 7a 44 61 74  10s ===\n", zDat
2ff0: 65 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  e);.      memcpy
3000: 28 7a 50 72 65 76 44 61 74 65 2c 20 7a 44 61 74  (zPrevDate, zDat
3010: 65 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 6e 4c  e, 10);.      nL
3020: 69 6e 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ine++;.    }.   
3030: 20 69 66 28 20 7a 43 6f 6d 3d 3d 30 20 29 20 7a   if( zCom==0 ) z
3040: 43 6f 6d 20 3d 20 22 22 3b 0a 20 20 20 20 70 72  Com = "";.    pr
3050: 69 6e 74 66 28 22 25 2e 38 73 20 22 2c 20 26 7a  intf("%.8s ", &z
3060: 44 61 74 65 5b 31 31 5d 29 3b 0a 20 20 20 20 7a  Date[11]);.    z
3070: 50 72 65 66 69 78 5b 30 5d 20 3d 20 30 3b 0a 20  Prefix[0] = 0;. 
3080: 20 20 20 69 66 28 20 6e 50 61 72 65 6e 74 3e 31     if( nParent>1
3090: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
30a0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
30b0: 66 28 7a 50 72 65 66 69 78 29 2c 20 7a 50 72 65  f(zPrefix), zPre
30c0: 66 69 78 2c 20 22 2a 4d 45 52 47 45 2a 20 22 29  fix, "*MERGE* ")
30d0: 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c  ;.      n = strl
30e0: 65 6e 28 7a 50 72 65 66 69 78 29 3b 0a 20 20 20  en(zPrefix);.   
30f0: 20 7d 0a 20 20 20 20 69 66 28 20 6e 43 68 69 6c   }.    if( nChil
3100: 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  d>1 ){.      sql
3110: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
3120: 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2d 6e 2c  zeof(zPrefix)-n,
3130: 20 26 7a 50 72 65 66 69 78 5b 6e 5d 2c 20 22 2a   &zPrefix[n], "*
3140: 46 4f 52 4b 2a 20 22 29 3b 0a 20 20 20 20 20 20  FORK* ");.      
3150: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 50 72 65 66  n = strlen(zPref
3160: 69 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ix);.    }.    i
3170: 66 28 20 73 74 72 63 6d 70 28 7a 43 75 72 72 65  f( strcmp(zCurre
3180: 6e 74 55 75 69 64 2c 7a 49 64 29 3d 3d 30 20 29  ntUuid,zId)==0 )
3190: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
31a0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
31b0: 7a 50 72 65 66 69 78 29 2d 6e 2c 20 26 7a 50 72  zPrefix)-n, &zPr
31c0: 65 66 69 78 5b 6e 5d 2c 20 22 2a 43 55 52 52 45  efix[n], "*CURRE
31d0: 4e 54 2a 20 22 29 3b 0a 20 20 20 20 20 20 6e 20  NT* ");.      n 
31e0: 2b 3d 20 73 74 72 6c 65 6e 28 7a 50 72 65 66 69  += strlen(zPrefi
31f0: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46  x);.    }.    zF
3200: 72 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ree = sqlite3_mp
3210: 72 69 6e 74 66 28 22 5b 25 2e 31 30 73 5d 20 25  rintf("[%.10s] %
3220: 73 25 73 22 2c 20 7a 55 75 69 64 2c 20 7a 50 72  s%s", zUuid, zPr
3230: 65 66 69 78 2c 20 7a 43 6f 6d 29 3b 0a 20 20 20  efix, zCom);.   
3240: 20 6e 4c 69 6e 65 20 2b 3d 20 63 6f 6d 6d 65 6e   nLine += commen
3250: 74 5f 70 72 69 6e 74 28 7a 46 72 65 65 2c 20 39  t_print(zFree, 9
3260: 2c 20 37 39 29 3b 0a 20 20 20 20 73 71 6c 69 74  , 79);.    sqlit
3270: 65 33 5f 66 72 65 65 28 7a 46 72 65 65 29 3b 0a  e3_free(zFree);.
3280: 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a    }.  db_finaliz
3290: 65 28 26 63 75 72 72 65 6e 74 51 29 3b 0a 7d 0a  e(&currentQ);.}.
32a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
32b0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61  pointer to a sta
32c0: 74 69 63 20 73 74 72 69 6e 67 20 74 68 61 74 20  tic string that 
32d0: 66 6f 72 6d 73 20 74 68 65 20 62 61 73 69 73 20  forms the basis 
32e0: 66 6f 72 0a 2a 2a 20 61 20 74 69 6d 65 6c 69 6e  for.** a timelin
32f0: 65 20 71 75 65 72 79 20 66 6f 72 20 64 69 73 70  e query for disp
3300: 6c 61 79 20 6f 6e 20 61 20 54 54 59 2e 0a 2a 2f  lay on a TTY..*/
3310: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 69 6d  .const char *tim
3320: 65 6c 69 6e 65 5f 71 75 65 72 79 5f 66 6f 72 5f  eline_query_for_
3330: 74 74 79 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  tty(void){.  sta
3340: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
3350: 42 61 73 65 53 71 6c 5b 5d 20 3d 20 0a 20 20 20  BaseSql[] = .   
3360: 20 40 20 53 45 4c 45 43 54 0a 20 20 20 20 40 20   @ SELECT.    @ 
3370: 20 20 62 6c 6f 62 2e 72 69 64 2c 0a 20 20 20 20    blob.rid,.    
3380: 40 20 20 20 75 75 69 64 2c 0a 20 20 20 20 40 20  @   uuid,.    @ 
3390: 20 20 64 61 74 65 74 69 6d 65 28 65 76 65 6e 74    datetime(event
33a0: 2e 6d 74 69 6d 65 2c 27 6c 6f 63 61 6c 74 69 6d  .mtime,'localtim
33b0: 65 27 29 2c 0a 20 20 20 20 40 20 20 20 63 6f 61  e'),.    @   coa
33c0: 6c 65 73 63 65 28 65 63 6f 6d 6d 65 6e 74 2c 63  lesce(ecomment,c
33d0: 6f 6d 6d 65 6e 74 29 20 7c 7c 20 27 20 28 62 79  omment) || ' (by
33e0: 20 27 20 7c 7c 20 63 6f 61 6c 65 73 63 65 28 65   ' || coalesce(e
33f0: 75 73 65 72 2c 75 73 65 72 2c 27 3f 27 29 20 7c  user,user,'?') |
3400: 7c 27 29 27 2c 0a 20 20 20 20 40 20 20 20 28 53  |')',.    @   (S
3410: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
3420: 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20  ROM plink WHERE 
3430: 70 69 64 3d 62 6c 6f 62 2e 72 69 64 20 41 4e 44  pid=blob.rid AND
3440: 20 69 73 70 72 69 6d 29 2c 0a 20 20 20 20 40 20   isprim),.    @ 
3450: 20 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    (SELECT count(
3460: 2a 29 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48  *) FROM plink WH
3470: 45 52 45 20 63 69 64 3d 62 6c 6f 62 2e 72 69 64  ERE cid=blob.rid
3480: 29 0a 20 20 20 20 40 20 46 52 4f 4d 20 65 76 65  ).    @ FROM eve
3490: 6e 74 2c 20 62 6c 6f 62 0a 20 20 20 20 40 20 57  nt, blob.    @ W
34a0: 48 45 52 45 20 62 6c 6f 62 2e 72 69 64 3d 65 76  HERE blob.rid=ev
34b0: 65 6e 74 2e 6f 62 6a 69 64 0a 20 20 3b 0a 20 20  ent.objid.  ;.  
34c0: 72 65 74 75 72 6e 20 7a 42 61 73 65 53 71 6c 3b  return zBaseSql;
34d0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41  .}.../*.** COMMA
34e0: 4e 44 3a 20 74 69 6d 65 6c 69 6e 65 0a 2a 2a 0a  ND: timeline.**.
34f0: 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69  ** Usage: %fossi
3500: 6c 20 74 69 6d 65 6c 69 6e 65 20 3f 57 48 45 4e  l timeline ?WHEN
3510: 3f 20 3f 55 55 49 44 7c 44 41 54 45 54 49 4d 45  ? ?UUID|DATETIME
3520: 3f 20 3f 2d 6e 7c 2d 2d 63 6f 75 6e 74 20 4e 3f  ? ?-n|--count N?
3530: 0a 2a 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73  .**.** Print a s
3540: 75 6d 6d 61 72 79 20 6f 66 20 61 63 74 69 76 69  ummary of activi
3550: 74 79 20 67 6f 69 6e 67 20 62 61 63 6b 77 61 72  ty going backwar
3560: 64 73 20 69 6e 20 64 61 74 65 20 61 6e 64 20 74  ds in date and t
3570: 69 6d 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ime.** specified
3580: 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 63 75 72   or from the cur
3590: 72 65 6e 74 20 64 61 74 65 20 61 6e 64 20 74 69  rent date and ti
35a0: 6d 65 20 69 66 20 6e 6f 20 61 72 67 75 6d 65 6e  me if no argumen
35b0: 74 73 0a 2a 2a 20 61 72 65 20 67 69 76 65 6e 2e  ts.** are given.
35c0: 20 20 53 68 6f 77 20 61 73 20 6d 61 6e 79 20 61    Show as many a
35d0: 73 20 4e 20 28 64 65 66 61 75 6c 74 20 32 30 29  s N (default 20)
35e0: 20 63 68 65 63 6b 2d 69 6e 73 2e 20 20 54 68 65   check-ins.  The
35f0: 0a 2a 2a 20 57 48 45 4e 20 61 72 67 75 6d 65 6e  .** WHEN argumen
3600: 74 20 63 61 6e 20 62 65 20 61 6e 79 20 75 6e 69  t can be any uni
3610: 71 75 65 20 61 62 62 72 65 76 69 61 74 69 6f 6e  que abbreviation
3620: 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 73 65   of one of these
3630: 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 3a 0a 2a 2a  .** keywords:.**
3640: 0a 2a 2a 20 20 20 20 20 62 65 66 6f 72 65 0a 2a  .**     before.*
3650: 2a 20 20 20 20 20 61 66 74 65 72 0a 2a 2a 20 20  *     after.**  
3660: 20 20 20 64 65 73 63 65 6e 64 65 6e 74 73 20 7c     descendents |
3670: 20 63 68 69 6c 64 72 65 6e 0a 2a 2a 20 20 20 20   children.**    
3680: 20 61 6e 63 65 73 74 6f 72 73 20 7c 20 70 61 72   ancestors | par
3690: 65 6e 74 73 0a 2a 2a 0a 2a 2a 20 54 68 65 20 55  ents.**.** The U
36a0: 55 49 44 20 63 61 6e 20 62 65 20 61 6e 79 20 75  UID can be any u
36b0: 6e 69 71 75 65 20 70 72 65 66 69 78 20 6f 66 20  nique prefix of 
36c0: 34 20 63 68 61 72 61 63 74 65 72 73 20 6f 72 20  4 characters or 
36d0: 6d 6f 72 65 2e 0a 2a 2a 20 54 68 65 20 44 41 54  more..** The DAT
36e0: 45 54 49 4d 45 20 73 68 6f 75 6c 64 20 62 65 20  ETIME should be 
36f0: 69 6e 20 74 68 65 20 49 53 4f 38 36 30 31 20 66  in the ISO8601 f
3700: 6f 72 6d 61 74 2e 20 20 46 6f 72 0a 2a 2a 20 65  ormat.  For.** e
3710: 78 61 6d 70 6c 65 73 3a 20 22 32 30 30 37 2d 30  xamples: "2007-0
3720: 38 2d 31 38 20 30 37 3a 32 31 3a 32 31 22 2e 20  8-18 07:21:21". 
3730: 20 59 6f 75 20 63 61 6e 20 61 6c 73 6f 20 73 61   You can also sa
3740: 79 20 22 63 75 72 72 65 6e 74 22 0a 2a 2a 20 66  y "current".** f
3750: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  or the current v
3760: 65 72 73 69 6f 6e 20 6f 72 20 22 6e 6f 77 22 20  ersion or "now" 
3770: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
3780: 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 74 69  time..*/.void ti
3790: 6d 65 6c 69 6e 65 5f 63 6d 64 28 76 6f 69 64 29  meline_cmd(void)
37a0: 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 69 6e  {.  Stmt q;.  in
37b0: 74 20 6e 2c 20 6b 3b 0a 20 20 63 6f 6e 73 74 20  t n, k;.  const 
37c0: 63 68 61 72 20 2a 7a 43 6f 75 6e 74 3b 0a 20 20  char *zCount;.  
37d0: 63 68 61 72 20 2a 7a 4f 72 69 67 69 6e 3b 0a 20  char *zOrigin;. 
37e0: 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20 20   char *zDate;.  
37f0: 63 68 61 72 20 2a 7a 53 51 4c 3b 0a 20 20 69 6e  char *zSQL;.  in
3800: 74 20 6f 62 6a 69 64 20 3d 20 30 3b 0a 20 20 42  t objid = 0;.  B
3810: 6c 6f 62 20 75 75 69 64 3b 0a 20 20 69 6e 74 20  lob uuid;.  int 
3820: 6d 6f 64 65 20 3d 20 31 20 3b 20 20 20 20 20 20  mode = 1 ;      
3830: 20 2f 2a 20 31 3a 20 62 65 66 6f 72 65 20 20 32   /* 1: before  2
3840: 3a 61 66 74 65 72 20 20 33 3a 63 68 69 6c 64 72  :after  3:childr
3850: 65 6e 20 20 34 3a 70 61 72 65 6e 74 73 20 2a 2f  en  4:parents */
3860: 0a 20 20 64 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f  .  db_find_and_o
3870: 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 29  pen_repository()
3880: 3b 0a 20 20 7a 43 6f 75 6e 74 20 3d 20 66 69 6e  ;.  zCount = fin
3890: 64 5f 6f 70 74 69 6f 6e 28 22 6e 22 2c 22 63 6f  d_option("n","co
38a0: 75 6e 74 22 2c 31 29 3b 0a 20 20 69 66 28 20 7a  unt",1);.  if( z
38b0: 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 6e 20 3d  Count ){.    n =
38c0: 20 61 74 6f 69 28 7a 43 6f 75 6e 74 29 3b 0a 20   atoi(zCount);. 
38d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 20 3d 20   }else{.    n = 
38e0: 32 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 2e  20;.  }.  if( g.
38f0: 61 72 67 63 3d 3d 34 20 29 7b 0a 20 20 20 20 6b  argc==4 ){.    k
3900: 20 3d 20 73 74 72 6c 65 6e 28 67 2e 61 72 67 76   = strlen(g.argv
3910: 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 73 74  [2]);.    if( st
3920: 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c  rncmp(g.argv[2],
3930: 22 62 65 66 6f 72 65 22 2c 6b 29 3d 3d 30 20 29  "before",k)==0 )
3940: 7b 0a 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 31  {.      mode = 1
3950: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
3960: 73 74 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32  strncmp(g.argv[2
3970: 5d 2c 22 61 66 74 65 72 22 2c 6b 29 3d 3d 30 20  ],"after",k)==0 
3980: 26 26 20 6b 3e 31 20 29 7b 0a 20 20 20 20 20 20  && k>1 ){.      
3990: 6d 6f 64 65 20 3d 20 32 3b 0a 20 20 20 20 7d 65  mode = 2;.    }e
39a0: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
39b0: 67 2e 61 72 67 76 5b 32 5d 2c 22 64 65 73 63 65  g.argv[2],"desce
39c0: 6e 64 65 6e 74 73 22 2c 6b 29 3d 3d 30 20 29 7b  ndents",k)==0 ){
39d0: 0a 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 33 3b  .      mode = 3;
39e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
39f0: 74 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d  trncmp(g.argv[2]
3a00: 2c 22 63 68 69 6c 64 72 65 6e 22 2c 6b 29 3d 3d  ,"children",k)==
3a10: 30 20 29 7b 0a 20 20 20 20 20 20 6d 6f 64 65 20  0 ){.      mode 
3a20: 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 3;.    }else i
3a30: 66 28 20 73 74 72 6e 63 6d 70 28 67 2e 61 72 67  f( strncmp(g.arg
3a40: 76 5b 32 5d 2c 22 61 6e 63 65 73 74 6f 72 73 22  v[2],"ancestors"
3a50: 2c 6b 29 3d 3d 30 20 26 26 20 6b 3e 31 20 29 7b  ,k)==0 && k>1 ){
3a60: 0a 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 34 3b  .      mode = 4;
3a70: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
3a80: 74 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d  trncmp(g.argv[2]
3a90: 2c 22 70 61 72 65 6e 74 73 22 2c 6b 29 3d 3d 30  ,"parents",k)==0
3aa0: 20 29 7b 0a 20 20 20 20 20 20 6d 6f 64 65 20 3d   ){.      mode =
3ab0: 20 34 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   4;.    }else{. 
3ac0: 20 20 20 20 20 75 73 61 67 65 28 22 3f 57 48 45       usage("?WHE
3ad0: 4e 3f 20 3f 55 55 49 44 7c 44 41 54 45 54 49 4d  N? ?UUID|DATETIM
3ae0: 45 3f 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E?");.    }.    
3af0: 7a 4f 72 69 67 69 6e 20 3d 20 67 2e 61 72 67 76  zOrigin = g.argv
3b00: 5b 33 5d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  [3];.  }else if(
3b10: 20 67 2e 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20   g.argc==3 ){.  
3b20: 20 20 7a 4f 72 69 67 69 6e 20 3d 20 67 2e 61 72    zOrigin = g.ar
3b30: 67 76 5b 32 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gv[2];.  }else{.
3b40: 20 20 20 20 7a 4f 72 69 67 69 6e 20 3d 20 22 6e      zOrigin = "n
3b50: 6f 77 22 3b 0a 20 20 7d 0a 20 20 6b 20 3d 20 73  ow";.  }.  k = s
3b60: 74 72 6c 65 6e 28 7a 4f 72 69 67 69 6e 29 3b 0a  trlen(zOrigin);.
3b70: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 75 75 69    blob_zero(&uui
3b80: 64 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e  d);.  blob_appen
3b90: 64 28 26 75 75 69 64 2c 20 7a 4f 72 69 67 69 6e  d(&uuid, zOrigin
3ba0: 2c 20 2d 31 29 3b 0a 20 20 69 66 28 20 73 74 72  , -1);.  if( str
3bb0: 63 6d 70 28 7a 4f 72 69 67 69 6e 2c 20 22 6e 6f  cmp(zOrigin, "no
3bc0: 77 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  w")==0 ){.    if
3bd0: 28 20 6d 6f 64 65 3d 3d 33 20 7c 7c 20 6d 6f 64  ( mode==3 || mod
3be0: 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 66 6f  e==4 ){.      fo
3bf0: 73 73 69 6c 5f 66 61 74 61 6c 28 22 63 61 6e 6e  ssil_fatal("cann
3c00: 6f 74 20 63 6f 6d 70 75 74 65 20 64 65 73 63 65  ot compute desce
3c10: 6e 64 65 6e 74 73 20 6f 72 20 61 6e 63 65 73 74  ndents or ancest
3c20: 6f 72 73 20 6f 66 20 61 20 64 61 74 65 22 29 3b  ors of a date");
3c30: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 44 61 74 65  .    }.    zDate
3c40: 20 3d 20 6d 70 72 69 6e 74 66 28 22 28 53 45 4c   = mprintf("(SEL
3c50: 45 43 54 20 64 61 74 65 74 69 6d 65 28 27 6e 6f  ECT datetime('no
3c60: 77 27 29 29 22 29 3b 0a 20 20 7d 65 6c 73 65 20  w'))");.  }else 
3c70: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4f 72 69  if( strncmp(zOri
3c80: 67 69 6e 2c 20 22 63 75 72 72 65 6e 74 22 2c 20  gin, "current", 
3c90: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 62 6a  k)==0 ){.    obj
3ca0: 69 64 20 3d 20 64 62 5f 6c 67 65 74 5f 69 6e 74  id = db_lget_int
3cb0: 28 22 63 68 65 63 6b 6f 75 74 22 2c 30 29 3b 0a  ("checkout",0);.
3cc0: 20 20 20 20 7a 44 61 74 65 20 3d 20 6d 70 72 69      zDate = mpri
3cd0: 6e 74 66 28 22 28 53 45 4c 45 43 54 20 6d 74 69  ntf("(SELECT mti
3ce0: 6d 65 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48  me FROM plink WH
3cf0: 45 52 45 20 63 69 64 3d 25 64 29 22 2c 20 6f 62  ERE cid=%d)", ob
3d00: 6a 69 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  jid);.  }else if
3d10: 28 20 6e 61 6d 65 5f 74 6f 5f 75 75 69 64 28 26  ( name_to_uuid(&
3d20: 75 75 69 64 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  uuid, 0)==0 ){. 
3d30: 20 20 20 6f 62 6a 69 64 20 3d 20 64 62 5f 69 6e     objid = db_in
3d40: 74 28 30 2c 20 22 53 45 4c 45 43 54 20 72 69 64  t(0, "SELECT rid
3d50: 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45   FROM blob WHERE
3d60: 20 75 75 69 64 3d 25 42 22 2c 20 26 75 75 69 64   uuid=%B", &uuid
3d70: 29 3b 0a 20 20 20 20 7a 44 61 74 65 20 3d 20 6d  );.    zDate = m
3d80: 70 72 69 6e 74 66 28 22 28 53 45 4c 45 43 54 20  printf("(SELECT 
3d90: 6d 74 69 6d 65 20 46 52 4f 4d 20 70 6c 69 6e 6b  mtime FROM plink
3da0: 20 57 48 45 52 45 20 63 69 64 3d 25 64 29 22 2c   WHERE cid=%d)",
3db0: 20 6f 62 6a 69 64 29 3b 0a 20 20 7d 65 6c 73 65   objid);.  }else
3dc0: 7b 0a 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d  {.    if( mode==
3dd0: 33 20 7c 7c 20 6d 6f 64 65 3d 3d 34 20 29 7b 0a  3 || mode==4 ){.
3de0: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74        fossil_fat
3df0: 61 6c 28 22 63 61 6e 6e 6f 74 20 63 6f 6d 70 75  al("cannot compu
3e00: 74 65 20 64 65 73 63 65 6e 64 65 6e 74 73 20 6f  te descendents o
3e10: 72 20 61 6e 63 65 73 74 6f 72 73 20 6f 66 20 61  r ancestors of a
3e20: 20 64 61 74 65 22 29 3b 0a 20 20 20 20 7d 0a 20   date");.    }. 
3e30: 20 20 20 7a 44 61 74 65 20 3d 20 6d 70 72 69 6e     zDate = mprin
3e40: 74 66 28 22 28 53 45 4c 45 43 54 20 6a 75 6c 69  tf("(SELECT juli
3e50: 61 6e 64 61 79 28 25 51 2c 20 27 75 74 63 27 29  anday(%Q, 'utc')
3e60: 29 22 2c 20 7a 4f 72 69 67 69 6e 29 3b 0a 20 20  )", zOrigin);.  
3e70: 7d 0a 20 20 7a 53 51 4c 20 3d 20 6d 70 72 69 6e  }.  zSQL = mprin
3e80: 74 66 28 22 25 73 20 41 4e 44 20 65 76 65 6e 74  tf("%s AND event
3e90: 2e 6d 74 69 6d 65 20 25 73 20 25 73 22 2c 0a 20  .mtime %s %s",. 
3ea0: 20 20 20 20 74 69 6d 65 6c 69 6e 65 5f 71 75 65      timeline_que
3eb0: 72 79 5f 66 6f 72 5f 74 74 79 28 29 2c 0a 20 20  ry_for_tty(),.  
3ec0: 20 20 20 28 6d 6f 64 65 3d 3d 31 20 7c 7c 20 6d     (mode==1 || m
3ed0: 6f 64 65 3d 3d 34 29 20 3f 20 22 3c 3d 22 20 3a  ode==4) ? "<=" :
3ee0: 20 22 3e 3d 22 2c 0a 20 20 20 20 20 7a 44 61 74   ">=",.     zDat
3ef0: 65 0a 20 20 29 3b 0a 20 20 69 66 28 20 6d 6f 64  e.  );.  if( mod
3f00: 65 3d 3d 33 20 7c 7c 20 6d 6f 64 65 3d 3d 34 20  e==3 || mode==4 
3f10: 29 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f  ){.    db_multi_
3f20: 65 78 65 63 28 22 43 52 45 41 54 45 20 54 45 4d  exec("CREATE TEM
3f30: 50 20 54 41 42 4c 45 20 6f 6b 28 72 69 64 20 49  P TABLE ok(rid I
3f40: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
3f50: 45 59 29 22 29 3b 0a 20 20 20 20 69 66 28 20 6d  EY)");.    if( m
3f60: 6f 64 65 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  ode==3 ){.      
3f70: 63 6f 6d 70 75 74 65 5f 64 65 73 63 65 6e 64 65  compute_descende
3f80: 6e 74 73 28 6f 62 6a 69 64 2c 20 6e 29 3b 0a 20  nts(objid, n);. 
3f90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3fa0: 63 6f 6d 70 75 74 65 5f 61 6e 63 65 73 74 6f 72  compute_ancestor
3fb0: 73 28 6f 62 6a 69 64 2c 20 6e 29 3b 0a 20 20 20  s(objid, n);.   
3fc0: 20 7d 0a 20 20 20 20 7a 53 51 4c 20 3d 20 6d 70   }.    zSQL = mp
3fd0: 72 69 6e 74 66 28 22 25 7a 20 41 4e 44 20 62 6c  rintf("%z AND bl
3fe0: 6f 62 2e 72 69 64 20 49 4e 20 6f 6b 22 2c 20 7a  ob.rid IN ok", z
3ff0: 53 51 4c 29 3b 0a 20 20 7d 0a 20 20 7a 53 51 4c  SQL);.  }.  zSQL
4000: 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 7a 20 4f   = mprintf("%z O
4010: 52 44 45 52 20 42 59 20 65 76 65 6e 74 2e 6d 74  RDER BY event.mt
4020: 69 6d 65 20 44 45 53 43 22 2c 20 7a 53 51 4c 29  ime DESC", zSQL)
4030: 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26  ;.  db_prepare(&
4040: 71 2c 20 7a 53 51 4c 29 3b 0a 20 20 70 72 69 6e  q, zSQL);.  prin
4050: 74 5f 74 69 6d 65 6c 69 6e 65 28 26 71 2c 20 6e  t_timeline(&q, n
4060: 29 3b 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65  );.  db_finalize
4070: 28 26 71 29 3b 0a 7d 0a                          (&q);.}.