Hex Artifact Content
Not logged in

Artifact 44b77956607345d6301a2febcaeaf28debad78e7:

File src/timeline.c part of check-in [fcabd4774c] - Improvements to the CLI timeline display. When an update fails due to multiple descendents, show all of the descendents in timeline format. by drh on 2007-09-13 03:52:04. Also file src/timeline.c part of check-in [f76192b245] - Pulled the latest CLI, website, and sqlite changes into the importer branch. by aku on 2007-09-17 01:00:32.

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 76 69 6e 66 6f 2f 25 73  aseURL)/vinfo/%s
04c0: 28 7a 55 75 69 64 29 22 3e 5b 25 73 28 7a 53 68  (zUuid)">[%s(zSh
04d0: 6f 72 74 55 75 69 64 29 5d 3c 2f 61 3e 0a 20 20  ortUuid)]</a>.  
04e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 40 20 3c 62 3e  }else{.    @ <b>
04f0: 5b 25 73 28 7a 53 68 6f 72 74 55 75 69 64 29 5d  [%s(zShortUuid)]
0500: 3c 2f 62 3e 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  </b>.  }.}../*.*
0510: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 79 70  * Generate a hyp
0520: 65 72 6c 69 6e 6b 20 74 68 61 74 20 69 6e 76 6f  erlink that invo
0530: 6b 65 73 20 6a 61 76 61 73 63 72 69 70 74 20 74  kes javascript t
0540: 6f 20 68 69 67 68 6c 69 67 68 74 0a 2a 2a 20 61  o highlight.** a
0550: 20 76 65 72 73 69 6f 6e 20 6f 6e 20 6d 6f 75 73   version on mous
0560: 65 6f 76 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 68  eover..*/.void h
0570: 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 75 69 64  yperlink_to_uuid
0580: 5f 77 69 74 68 5f 6d 6f 75 73 65 6f 76 65 72 28  _with_mouseover(
0590: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
05a0: 55 75 69 64 2c 20 20 20 2f 2a 20 54 68 65 20 55  Uuid,   /* The U
05b0: 55 49 44 20 74 6f 20 64 69 73 70 6c 61 79 20 2a  UID to display *
05c0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
05d0: 7a 49 6e 2c 20 20 20 20 20 2f 2a 20 4a 61 76 61  zIn,     /* Java
05e0: 73 63 72 69 70 74 20 70 72 6f 63 20 66 6f 72 20  script proc for 
05f0: 6d 6f 75 73 65 6f 76 65 72 20 2a 2f 0a 20 20 63  mouseover */.  c
0600: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 75 74 2c  onst char *zOut,
0610: 20 20 20 20 2f 2a 20 4a 61 76 61 73 63 72 69 70      /* Javascrip
0620: 74 20 70 72 6f 63 20 66 6f 72 20 6d 6f 75 73 65  t proc for mouse
0630: 6f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 64 20  out */.  int id 
0640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0650: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 6a 61 76   Argument to jav
0660: 61 73 63 72 69 70 74 20 70 72 6f 63 73 20 2a 2f  ascript procs */
0670: 0a 29 7b 0a 20 20 63 68 61 72 20 7a 53 68 6f 72  .){.  char zShor
0680: 74 55 75 69 64 5b 55 55 49 44 5f 53 49 5a 45 2b  tUuid[UUID_SIZE+
0690: 31 5d 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 53  1];.  sprintf(zS
06a0: 68 6f 72 74 55 75 69 64 2c 20 22 25 2e 31 30 73  hortUuid, "%.10s
06b0: 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20 69 66 28  ", zUuid);.  if(
06c0: 20 67 2e 6f 6b 48 69 73 74 6f 72 79 20 29 7b 0a   g.okHistory ){.
06d0: 20 20 20 20 40 20 3c 61 20 6f 6e 6d 6f 75 73 65      @ <a onmouse
06e0: 6f 76 65 72 3d 27 25 73 28 7a 49 6e 29 28 22 6d  over='%s(zIn)("m
06f0: 25 64 28 69 64 29 22 29 27 20 6f 6e 6d 6f 75 73  %d(id)")' onmous
0700: 65 6f 75 74 3d 27 25 73 28 7a 4f 75 74 29 28 22  eout='%s(zOut)("
0710: 6d 25 64 28 69 64 29 22 29 27 0a 20 20 20 20 40  m%d(id)")'.    @
0720: 20 20 20 20 68 72 65 66 3d 22 25 73 28 67 2e 7a      href="%s(g.z
0730: 42 61 73 65 55 52 4c 29 2f 76 69 6e 66 6f 2f 25  BaseURL)/vinfo/%
0740: 73 28 7a 55 75 69 64 29 22 3e 5b 25 73 28 7a 53  s(zUuid)">[%s(zS
0750: 68 6f 72 74 55 75 69 64 29 5d 3c 2f 61 3e 0a 20  hortUuid)]</a>. 
0760: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 40 20 3c 62   }else{.    @ <b
0770: 20 6f 6e 6d 6f 75 73 65 6f 76 65 72 3d 27 25 73   onmouseover='%s
0780: 28 7a 49 6e 29 28 22 6d 25 64 28 69 64 29 22 29  (zIn)("m%d(id)")
0790: 27 20 6f 6e 6d 6f 75 73 65 6f 75 74 3d 27 25 73  ' onmouseout='%s
07a0: 28 7a 4f 75 74 29 28 22 6d 25 64 28 69 64 29 22  (zOut)("m%d(id)"
07b0: 29 27 3e 0a 20 20 20 20 40 20 5b 25 73 28 7a 53  )'>.    @ [%s(zS
07c0: 68 6f 72 74 55 75 69 64 29 5d 3c 2f 62 3e 0a 20  hortUuid)]</b>. 
07d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
07e0: 72 61 74 65 20 61 20 68 79 70 65 72 6c 69 6e 6b  rate a hyperlink
07f0: 20 74 6f 20 61 20 64 69 66 66 20 62 65 74 77 65   to a diff betwe
0800: 65 6e 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 2e  en two versions.
0810: 0a 2a 2f 0a 76 6f 69 64 20 68 79 70 65 72 6c 69  .*/.void hyperli
0820: 6e 6b 5f 74 6f 5f 64 69 66 66 28 63 6f 6e 73 74  nk_to_diff(const
0830: 20 63 68 61 72 20 2a 7a 56 31 2c 20 63 6f 6e 73   char *zV1, cons
0840: 74 20 63 68 61 72 20 2a 7a 56 32 29 7b 0a 20 20  t char *zV2){.  
0850: 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f 72 79 20  if( g.okHistory 
0860: 29 7b 0a 20 20 20 20 69 66 28 20 7a 56 32 3d 3d  ){.    if( zV2==
0870: 30 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 61 20  0 ){.      @ <a 
0880: 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65  href="%s(g.zBase
0890: 55 52 4c 29 2f 64 69 66 66 3f 76 32 3d 25 73 28  URL)/diff?v2=%s(
08a0: 7a 56 31 29 22 3e 5b 64 69 66 66 5d 3c 2f 61 3e  zV1)">[diff]</a>
08b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
08c0: 20 20 40 20 3c 61 20 68 72 65 66 3d 22 25 73 28    @ <a href="%s(
08d0: 67 2e 7a 42 61 73 65 55 52 4c 29 2f 64 69 66 66  g.zBaseURL)/diff
08e0: 3f 76 31 3d 25 73 28 7a 56 31 29 26 76 32 3d 25  ?v1=%s(zV1)&v2=%
08f0: 73 28 7a 56 32 29 22 3e 5b 64 69 66 66 5d 3c 2f  s(zV2)">[diff]</
0900: 61 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  a>.    }.  }.}..
0910: 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20 74  /*.** Output a t
0920: 69 6d 65 6c 69 6e 65 20 69 6e 20 74 68 65 20 77  imeline in the w
0930: 65 62 20 66 6f 72 6d 61 74 20 67 69 76 65 6e 20  eb format given 
0940: 61 20 71 75 65 72 79 2e 20 20 54 68 65 20 71 75  a query.  The qu
0950: 65 72 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 72 65  ery.** should re
0960: 74 75 72 6e 20 34 20 63 6f 6c 75 6d 6e 73 3a 0a  turn 4 columns:.
0970: 2a 2a 0a 2a 2a 20 20 20 20 30 2e 20 20 72 69 64  **.**    0.  rid
0980: 0a 2a 2a 20 20 20 20 31 2e 20 20 55 55 49 44 0a  .**    1.  UUID.
0990: 2a 2a 20 20 20 20 32 2e 20 20 44 61 74 65 2f 54  **    2.  Date/T
09a0: 69 6d 65 0a 2a 2a 20 20 20 20 33 2e 20 20 43 6f  ime.**    3.  Co
09b0: 6d 6d 65 6e 74 20 73 74 72 69 6e 67 0a 2a 2a 20  mment string.** 
09c0: 20 20 20 34 2e 20 20 55 73 65 72 0a 2a 2a 20 20     4.  User.**  
09d0: 20 20 35 2e 20 20 4e 75 6d 62 65 72 20 6f 66 20    5.  Number of 
09e0: 6e 6f 6e 2d 6d 65 72 67 65 20 63 68 69 6c 64 72  non-merge childr
09f0: 65 6e 0a 2a 2a 20 20 20 20 36 2e 20 20 4e 75 6d  en.**    6.  Num
0a00: 62 65 72 20 6f 66 20 70 61 72 65 6e 74 73 0a 2a  ber of parents.*
0a10: 2a 20 20 20 20 37 2e 20 20 54 72 75 65 20 69 66  *    7.  True if
0a20: 20 69 73 20 61 20 6c 65 61 66 0a 2a 2f 0a 76 6f   is a leaf.*/.vo
0a30: 69 64 20 77 77 77 5f 70 72 69 6e 74 5f 74 69 6d  id www_print_tim
0a40: 65 6c 69 6e 65 28 0a 20 20 53 74 6d 74 20 2a 70  eline(.  Stmt *p
0a50: 51 75 65 72 79 2c 0a 20 20 69 6e 74 20 2a 70 46  Query,.  int *pF
0a60: 69 72 73 74 45 76 65 6e 74 2c 0a 20 20 69 6e 74  irstEvent,.  int
0a70: 20 2a 70 4c 61 73 74 45 76 65 6e 74 2c 0a 20 20   *pLastEvent,.  
0a80: 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  int (*xCallback)
0a90: 28 69 6e 74 2c 20 42 6c 6f 62 2a 29 2c 0a 20 20  (int, Blob*),.  
0aa0: 42 6c 6f 62 20 2a 70 41 72 67 0a 20 29 7b 0a 20  Blob *pArg. ){. 
0ab0: 20 63 68 61 72 20 7a 50 72 65 76 44 61 74 65 5b   char zPrevDate[
0ac0: 32 30 5d 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  20];.  int cnt =
0ad0: 20 30 3b 0a 20 20 7a 50 72 65 76 44 61 74 65 5b   0;.  zPrevDate[
0ae0: 30 5d 20 3d 20 30 3b 0a 20 20 64 62 5f 6d 75 6c  0] = 0;.  db_mul
0af0: 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20 22 43  ti_exec(.     "C
0b00: 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45  REATE TEMP TABLE
0b10: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73   IF NOT EXISTS s
0b20: 65 65 6e 28 72 69 64 20 49 4e 54 45 47 45 52 20  een(rid INTEGER 
0b30: 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 22 0a 20  PRIMARY KEY);". 
0b40: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
0b50: 20 73 65 65 6e 3b 22 0a 20 20 29 3b 0a 20 20 40   seen;".  );.  @
0b60: 20 3c 74 61 62 6c 65 20 63 65 6c 6c 73 70 61 63   <table cellspac
0b70: 69 6e 67 3d 30 20 62 6f 72 64 65 72 3d 30 20 63  ing=0 border=0 c
0b80: 65 6c 6c 70 61 64 64 69 6e 67 3d 30 3e 0a 20 20  ellpadding=0>.  
0b90: 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 70  while( db_step(p
0ba0: 51 75 65 72 79 29 3d 3d 53 51 4c 49 54 45 5f 52  Query)==SQLITE_R
0bb0: 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 69  OW ){.    int ri
0bc0: 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e  d = db_column_in
0bd0: 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20  t(pQuery, 0);.  
0be0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
0bf0: 75 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  uid = db_column_
0c00: 74 65 78 74 28 70 51 75 65 72 79 2c 20 31 29 3b  text(pQuery, 1);
0c10: 0a 20 20 20 20 69 6e 74 20 6e 50 43 68 69 6c 64  .    int nPChild
0c20: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   = db_column_int
0c30: 28 70 51 75 65 72 79 2c 20 35 29 3b 0a 20 20 20  (pQuery, 5);.   
0c40: 20 69 6e 74 20 6e 50 61 72 65 6e 74 20 3d 20 64   int nParent = d
0c50: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 51 75  b_column_int(pQu
0c60: 65 72 79 2c 20 36 29 3b 0a 20 20 20 20 69 6e 74  ery, 6);.    int
0c70: 20 69 73 4c 65 61 66 20 3d 20 64 62 5f 63 6f 6c   isLeaf = db_col
0c80: 75 6d 6e 5f 69 6e 74 28 70 51 75 65 72 79 2c 20  umn_int(pQuery, 
0c90: 37 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  7);.    const ch
0ca0: 61 72 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63  ar *zDate = db_c
0cb0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72  olumn_text(pQuer
0cc0: 79 2c 20 32 29 3b 0a 20 20 20 20 69 66 28 20 63  y, 2);.    if( c
0cd0: 6e 74 3d 3d 30 20 26 26 20 70 46 69 72 73 74 45  nt==0 && pFirstE
0ce0: 76 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  vent ){.      *p
0cf0: 46 69 72 73 74 45 76 65 6e 74 20 3d 20 72 69 64  FirstEvent = rid
0d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
0d10: 70 4c 61 73 74 45 76 65 6e 74 20 29 7b 0a 20 20  pLastEvent ){.  
0d20: 20 20 20 20 2a 70 4c 61 73 74 45 76 65 6e 74 20      *pLastEvent 
0d30: 3d 20 72 69 64 3b 0a 20 20 20 20 7d 0a 20 20 20  = rid;.    }.   
0d40: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22   db_multi_exec("
0d50: 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45  INSERT OR IGNORE
0d60: 20 49 4e 54 4f 20 73 65 65 6e 20 56 41 4c 55 45   INTO seen VALUE
0d70: 53 28 25 64 29 22 2c 20 72 69 64 29 3b 0a 20 20  S(%d)", rid);.  
0d80: 20 20 69 66 28 20 78 43 61 6c 6c 62 61 63 6b 20    if( xCallback 
0d90: 29 7b 0a 20 20 20 20 20 20 78 43 61 6c 6c 62 61  ){.      xCallba
0da0: 63 6b 28 72 69 64 2c 20 70 41 72 67 29 3b 0a 20  ck(rid, pArg);. 
0db0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d     }.    if( mem
0dc0: 63 6d 70 28 7a 44 61 74 65 2c 20 7a 50 72 65 76  cmp(zDate, zPrev
0dd0: 44 61 74 65 2c 20 31 30 29 20 29 7b 0a 20 20 20  Date, 10) ){.   
0de0: 20 20 20 73 70 72 69 6e 74 66 28 7a 50 72 65 76     sprintf(zPrev
0df0: 44 61 74 65 2c 20 22 25 2e 31 30 73 22 2c 20 7a  Date, "%.10s", z
0e00: 44 61 74 65 29 3b 0a 20 20 20 20 20 20 40 20 3c  Date);.      @ <
0e10: 74 72 3e 3c 74 64 20 63 6f 6c 73 70 61 6e 3d 33  tr><td colspan=3
0e20: 3e 0a 20 20 20 20 20 20 40 20 3c 74 61 62 6c 65  >.      @ <table
0e30: 20 63 65 6c 6c 70 61 64 64 69 6e 67 3d 32 20 62   cellpadding=2 b
0e40: 6f 72 64 65 72 3d 30 3e 0a 20 20 20 20 20 20 40  order=0>.      @
0e50: 20 3c 74 72 3e 3c 74 64 20 62 67 63 6f 6c 6f 72   <tr><td bgcolor
0e60: 3d 22 23 61 30 62 35 66 34 22 20 63 6c 61 73 73  ="#a0b5f4" class
0e70: 3d 22 62 6f 72 64 65 72 31 22 3e 0a 20 20 20 20  ="border1">.    
0e80: 20 20 40 20 3c 74 61 62 6c 65 20 63 65 6c 6c 70    @ <table cellp
0e90: 61 64 64 69 6e 67 3d 32 20 63 65 6c 6c 73 70 61  adding=2 cellspa
0ea0: 63 69 6e 67 3d 30 20 62 6f 72 64 65 72 3d 30 3e  cing=0 border=0>
0eb0: 3c 74 72 3e 0a 20 20 20 20 20 20 40 20 3c 74 64  <tr>.      @ <td
0ec0: 20 62 67 63 6f 6c 6f 72 3d 22 23 64 30 64 39 66   bgcolor="#d0d9f
0ed0: 34 22 20 63 6c 61 73 73 3d 22 62 6b 67 6e 64 31  4" class="bkgnd1
0ee0: 22 3e 25 73 28 7a 50 72 65 76 44 61 74 65 29 3c  ">%s(zPrevDate)<
0ef0: 2f 74 64 3e 0a 20 20 20 20 20 20 40 20 3c 2f 74  /td>.      @ </t
0f00: 72 3e 3c 2f 74 61 62 6c 65 3e 0a 20 20 20 20 20  r></table>.     
0f10: 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 3c 2f 74   @ </td></tr></t
0f20: 61 62 6c 65 3e 0a 20 20 20 20 20 20 40 20 3c 2f  able>.      @ </
0f30: 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 7d 0a 20  td></tr>.    }. 
0f40: 20 20 20 40 20 3c 74 72 3e 0a 20 20 20 20 40 20     @ <tr>.    @ 
0f50: 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22  <td valign="top"
0f60: 3e 25 73 28 26 7a 44 61 74 65 5b 31 31 5d 29 3c  >%s(&zDate[11])<
0f70: 2f 74 64 3e 0a 20 20 20 20 40 20 3c 74 64 20 77  /td>.    @ <td w
0f80: 69 64 74 68 3d 22 32 30 22 20 61 6c 69 67 6e 3d  idth="20" align=
0f90: 22 63 65 6e 74 65 72 22 20 76 61 6c 69 67 6e 3d  "center" valign=
0fa0: 22 74 6f 70 22 3e 0a 20 20 20 20 40 20 3c 66 6f  "top">.    @ <fo
0fb0: 6e 74 20 69 64 3d 22 6d 25 64 28 72 69 64 29 22  nt id="m%d(rid)"
0fc0: 20 73 69 7a 65 3d 22 2b 31 22 20 63 6f 6c 6f 72   size="+1" color
0fd0: 3d 22 77 68 69 74 65 22 3e 2a 3c 2f 66 6f 6e 74  ="white">*</font
0fe0: 3e 3c 2f 74 64 3e 0a 20 20 20 20 40 20 3c 74 64  ></td>.    @ <td
0ff0: 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 20 61 6c   valign="top" al
1000: 69 67 6e 3d 22 6c 65 66 74 22 3e 0a 20 20 20 20  ign="left">.    
1010: 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 75 69  hyperlink_to_uui
1020: 64 5f 77 69 74 68 5f 6d 6f 75 73 65 6f 76 65 72  d_with_mouseover
1030: 28 7a 55 75 69 64 2c 20 22 78 69 6e 22 2c 20 22  (zUuid, "xin", "
1040: 78 6f 75 74 22 2c 20 72 69 64 29 3b 0a 20 20 20  xout", rid);.   
1050: 20 69 66 28 20 6e 50 61 72 65 6e 74 3e 31 20 29   if( nParent>1 )
1060: 7b 0a 20 20 20 20 20 20 40 20 3c 62 3e 4d 65 72  {.      @ <b>Mer
1070: 67 65 3c 2f 62 3e 20 0a 20 20 20 20 7d 0a 20 20  ge</b> .    }.  
1080: 20 20 69 66 28 20 6e 50 43 68 69 6c 64 3e 31 20    if( nPChild>1 
1090: 29 7b 0a 20 20 20 20 20 20 40 20 3c 62 3e 46 6f  ){.      @ <b>Fo
10a0: 72 6b 3c 2f 62 3e 0a 20 20 20 20 7d 0a 20 20 20  rk</b>.    }.   
10b0: 20 69 66 28 20 69 73 4c 65 61 66 20 29 7b 0a 20   if( isLeaf ){. 
10c0: 20 20 20 20 20 40 20 3c 62 3e 4c 65 61 66 3c 2f       @ <b>Leaf</
10d0: 62 3e 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 25  b>.    }.    @ %
10e0: 68 28 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  h(db_column_text
10f0: 28 70 51 75 65 72 79 2c 33 29 29 0a 20 20 20 20  (pQuery,3)).    
1100: 40 20 28 62 79 20 25 68 28 64 62 5f 63 6f 6c 75  @ (by %h(db_colu
1110: 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 34  mn_text(pQuery,4
1120: 29 29 29 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20  )))</td></tr>.  
1130: 7d 0a 20 20 40 20 3c 2f 74 61 62 6c 65 3e 0a 7d  }.  @ </table>.}
1140: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1150: 20 6a 61 76 61 73 63 72 69 70 74 20 63 6f 64 65   javascript code
1160: 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 74 68   that records th
1170: 65 20 70 61 72 65 6e 74 73 20 61 6e 64 20 63 68  e parents and ch
1180: 69 6c 64 72 65 6e 0a 2a 2a 20 6f 66 20 74 68 65  ildren.** of the
1190: 20 76 65 72 73 69 6f 6e 20 72 69 64 2e 0a 2a 2f   version rid..*/
11a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
11b0: 5f 70 61 72 65 6e 74 61 67 65 5f 6a 61 76 61 73  _parentage_javas
11c0: 63 72 69 70 74 28 69 6e 74 20 72 69 64 2c 20 42  cript(int rid, B
11d0: 6c 6f 62 20 2a 70 4f 75 74 29 7b 0a 20 20 63 6f  lob *pOut){.  co
11e0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a  nst char *zSep;.
11f0: 20 20 53 74 6d 74 20 71 3b 0a 0a 20 20 64 62 5f    Stmt q;..  db_
1200: 70 72 65 70 61 72 65 28 26 71 2c 20 22 53 45 4c  prepare(&q, "SEL
1210: 45 43 54 20 70 69 64 20 46 52 4f 4d 20 70 6c 69  ECT pid FROM pli
1220: 6e 6b 20 57 48 45 52 45 20 63 69 64 3d 25 64 22  nk WHERE cid=%d"
1230: 2c 20 72 69 64 29 3b 0a 20 20 7a 53 65 70 20 3d  , rid);.  zSep =
1240: 20 22 22 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65   "";.  blob_appe
1250: 6e 64 66 28 70 4f 75 74 2c 20 22 70 61 72 65 6e  ndf(pOut, "paren
1260: 74 6f 66 5b 5c 22 6d 25 64 5c 22 5d 20 3d 20 5b  tof[\"m%d\"] = [
1270: 22 2c 20 72 69 64 29 3b 0a 20 20 77 68 69 6c 65  ", rid);.  while
1280: 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53  ( db_step(&q)==S
1290: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
12a0: 20 69 6e 74 20 70 69 64 20 3d 20 64 62 5f 63 6f   int pid = db_co
12b0: 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 30 29 3b  lumn_int(&q, 0);
12c0: 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64  .    blob_append
12d0: 66 28 70 4f 75 74 2c 20 22 25 73 5c 22 6d 25 64  f(pOut, "%s\"m%d
12e0: 5c 22 22 2c 20 7a 53 65 70 2c 20 70 69 64 29 3b  \"", zSep, pid);
12f0: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 22 3b  .    zSep = ",";
1300: 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69  .  }.  db_finali
1310: 7a 65 28 26 71 29 3b 0a 20 20 62 6c 6f 62 5f 61  ze(&q);.  blob_a
1320: 70 70 65 6e 64 66 28 70 4f 75 74 2c 20 22 5d 3b  ppendf(pOut, "];
1330: 5c 6e 22 29 3b 0a 20 20 64 62 5f 70 72 65 70 61  \n");.  db_prepa
1340: 72 65 28 26 71 2c 20 22 53 45 4c 45 43 54 20 63  re(&q, "SELECT c
1350: 69 64 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48  id FROM plink WH
1360: 45 52 45 20 70 69 64 3d 25 64 22 2c 20 72 69 64  ERE pid=%d", rid
1370: 29 3b 0a 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a  );.  zSep = "";.
1380: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70    blob_appendf(p
1390: 4f 75 74 2c 20 22 63 68 69 6c 64 6f 66 5b 5c 22  Out, "childof[\"
13a0: 6d 25 64 5c 22 5d 20 3d 20 5b 22 2c 20 72 69 64  m%d\"] = [", rid
13b0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73  );.  while( db_s
13c0: 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f  tep(&q)==SQLITE_
13d0: 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 70  ROW ){.    int p
13e0: 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69  id = db_column_i
13f0: 6e 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 62  nt(&q, 0);.    b
1400: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 4f 75 74  lob_appendf(pOut
1410: 2c 20 22 25 73 5c 22 6d 25 64 5c 22 22 2c 20 7a  , "%s\"m%d\"", z
1420: 53 65 70 2c 20 70 69 64 29 3b 0a 20 20 20 20 7a  Sep, pid);.    z
1430: 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20 7d 0a 20  Sep = ",";.  }. 
1440: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29   db_finalize(&q)
1450: 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66  ;.  blob_appendf
1460: 28 70 4f 75 74 2c 20 22 5d 3b 5c 6e 22 29 3b 0a  (pOut, "];\n");.
1470: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1480: 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 74 69  *.** WEBPAGE: ti
1490: 6d 65 6c 69 6e 65 0a 2a 2a 0a 2a 2a 20 51 75 65  meline.**.** Que
14a0: 72 79 20 70 61 72 61 6d 65 74 65 72 73 3a 0a 2a  ry parameters:.*
14b0: 2a 0a 2a 2a 20 20 20 20 64 3d 53 54 41 52 54 44  *.**    d=STARTD
14c0: 41 54 45 20 20 20 20 64 61 74 65 20 69 6e 20 69  ATE    date in i
14d0: 73 6f 38 36 30 31 20 6e 6f 74 61 74 69 6f 6e 2e  so8601 notation.
14e0: 20 20 20 20 20 20 20 20 20 20 64 66 6c 74 3a 20            dflt: 
14f0: 6e 65 77 65 73 74 20 65 76 65 6e 74 0a 2a 2a 20  newest event.** 
1500: 20 20 20 6e 3d 49 4e 54 45 47 45 52 20 20 20 20     n=INTEGER    
1510: 20 20 6e 75 6d 62 65 72 20 6f 66 20 65 76 65 6e    number of even
1520: 74 73 20 74 6f 20 73 68 6f 77 2e 20 20 20 20 20  ts to show.     
1530: 20 20 20 20 20 64 66 6c 74 3a 20 32 35 0a 2a 2a       dflt: 25.**
1540: 20 20 20 20 65 3d 49 4e 54 45 47 45 52 20 20 20      e=INTEGER   
1550: 20 20 20 73 74 61 72 74 69 6e 67 20 65 76 65 6e     starting even
1560: 74 20 69 64 2e 20 20 20 20 20 20 20 20 20 20 20  t id.           
1570: 20 20 20 20 20 20 64 66 6c 74 3a 20 6e 69 6c 0a        dflt: nil.
1580: 2a 2a 20 20 20 20 75 3d 4e 41 4d 45 20 20 20 20  **    u=NAME    
1590: 20 20 20 20 20 73 68 6f 77 20 6f 6e 6c 79 20 65       show only e
15a0: 76 65 6e 74 73 20 66 72 6f 6d 20 75 73 65 72 2e  vents from user.
15b0: 20 20 20 20 20 20 20 20 64 66 6c 74 3a 20 6e 69          dflt: ni
15c0: 6c 0a 2a 2a 20 20 20 20 61 20 20 20 20 20 20 20  l.**    a       
15d0: 20 20 20 20 20 20 20 73 68 6f 77 20 65 76 65 6e         show even
15e0: 74 73 20 61 66 74 65 72 20 61 6e 64 20 69 6e 63  ts after and inc
15f0: 6c 75 64 69 6e 67 2e 20 20 20 64 66 6c 74 3a 20  luding.   dflt: 
1600: 66 61 6c 73 65 0a 2a 2a 20 20 20 20 72 20 20 20  false.**    r   
1610: 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 20             show 
1620: 6f 6e 6c 79 20 72 65 6c 61 74 65 64 20 65 76 65  only related eve
1630: 6e 74 73 2e 20 20 20 20 20 20 20 20 20 20 64 66  nts.          df
1640: 6c 74 3a 20 66 61 6c 73 65 0a 2a 2f 0a 76 6f 69  lt: false.*/.voi
1650: 64 20 70 61 67 65 5f 74 69 6d 65 6c 69 6e 65 28  d page_timeline(
1660: 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74 20 71 3b  void){.  Stmt q;
1670: 0a 20 20 63 68 61 72 20 2a 7a 53 51 4c 3b 0a 20  .  char *zSQL;. 
1680: 20 42 6c 6f 62 20 73 63 72 69 70 74 49 6e 69 74   Blob scriptInit
1690: 3b 0a 20 20 63 68 61 72 20 7a 44 61 74 65 5b 31  ;.  char zDate[1
16a0: 30 30 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  00];.  const cha
16b0: 72 20 2a 7a 53 74 61 72 74 20 3d 20 50 28 22 64  r *zStart = P("d
16c0: 22 29 3b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79  ");.  int nEntry
16d0: 20 3d 20 61 74 6f 69 28 50 44 28 22 6e 22 2c 22   = atoi(PD("n","
16e0: 32 30 22 29 29 3b 0a 20 20 63 6f 6e 73 74 20 63  20"));.  const c
16f0: 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 50 28 22  har *zUser = P("
1700: 75 22 29 3b 0a 20 20 69 6e 74 20 6f 62 6a 69 64  u");.  int objid
1710: 20 3d 20 61 74 6f 69 28 50 44 28 22 65 22 2c 22   = atoi(PD("e","
1720: 30 22 29 29 3b 0a 20 20 69 6e 74 20 72 65 6c 61  0"));.  int rela
1730: 74 65 64 45 76 65 6e 74 73 20 3d 20 50 28 22 72  tedEvents = P("r
1740: 22 29 21 3d 30 3b 0a 20 20 69 6e 74 20 61 66 74  ")!=0;.  int aft
1750: 65 72 46 6c 61 67 20 3d 20 50 28 22 61 22 29 21  erFlag = P("a")!
1760: 3d 30 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 45  =0;.  int firstE
1770: 76 65 6e 74 3b 0a 20 20 69 6e 74 20 6c 61 73 74  vent;.  int last
1780: 45 76 65 6e 74 3b 0a 0a 20 20 2f 2a 20 54 6f 20  Event;..  /* To 
1790: 76 69 65 77 20 74 68 65 20 74 69 6d 65 6c 69 6e  view the timelin
17a0: 65 2c 20 6d 75 73 74 20 68 61 76 65 20 70 65 72  e, must have per
17b0: 6d 69 73 73 69 6f 6e 20 74 6f 20 72 65 61 64 20  mission to read 
17c0: 70 72 6f 6a 65 63 74 20 64 61 74 61 2e 0a 20 20  project data..  
17d0: 2a 2f 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b  */.  login_check
17e0: 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a  _credentials();.
17f0: 20 20 69 66 28 20 21 67 2e 6f 6b 52 65 61 64 20    if( !g.okRead 
1800: 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28  ){ login_needed(
1810: 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 0a 20 20  ); return; }..  
1820: 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 54 69  style_header("Ti
1830: 6d 65 6c 69 6e 65 22 29 3b 0a 20 20 69 66 28 20  meline");.  if( 
1840: 21 67 2e 6f 6b 48 69 73 74 6f 72 79 20 26 26 0a  !g.okHistory &&.
1850: 20 20 20 20 20 20 64 62 5f 65 78 69 73 74 73 28        db_exists(
1860: 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 75  "SELECT 1 FROM u
1870: 73 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20  ser".           
1880: 20 20 20 20 20 22 20 57 48 45 52 45 20 6c 6f 67       " WHERE log
1890: 69 6e 3d 27 61 6e 6f 6e 79 6d 6f 75 73 27 22 0a  in='anonymous'".
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 22 20 20 20 41 4e 44 20 63 61 70 20 4c 49 4b 45  "   AND cap LIKE
18c0: 20 27 25 25 68 25 25 27 22 29 20 29 7b 0a 20 20   '%%h%%'") ){.  
18d0: 20 20 40 20 3c 70 3e 3c 62 3e 4e 6f 74 65 3a 3c    @ <p><b>Note:<
18e0: 2f 62 3e 20 59 6f 75 20 77 69 6c 6c 20 62 65 20  /b> You will be 
18f0: 61 62 6c 65 20 74 6f 20 61 63 63 65 73 73 20 3c  able to access <
1900: 75 3e 6d 75 63 68 3c 2f 75 3e 20 6d 6f 72 65 0a  u>much</u> more.
1910: 20 20 20 20 40 20 68 69 73 74 6f 72 69 63 61 6c      @ historical
1920: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20   information if 
1930: 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42  <a href="%s(g.zB
1940: 61 73 65 55 52 4c 29 2f 6c 6f 67 69 6e 22 3e 6c  aseURL)/login">l
1950: 6f 67 69 6e 3c 2f 61 3e 2e 3c 2f 70 3e 0a 20 20  ogin</a>.</p>.  
1960: 7d 0a 20 20 7a 53 51 4c 20 3d 20 6d 70 72 69 6e  }.  zSQL = mprin
1970: 74 66 28 0a 20 20 20 20 22 53 45 4c 45 43 54 20  tf(.    "SELECT 
1980: 62 6c 6f 62 2e 72 69 64 2c 20 75 75 69 64 2c 20  blob.rid, uuid, 
1990: 64 61 74 65 74 69 6d 65 28 65 76 65 6e 74 2e 6d  datetime(event.m
19a0: 74 69 6d 65 2c 27 6c 6f 63 61 6c 74 69 6d 65 27  time,'localtime'
19b0: 29 2c 20 63 6f 6d 6d 65 6e 74 2c 20 75 73 65 72  ), comment, user
19c0: 2c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 28  ,".    "       (
19d0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
19e0: 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45  FROM plink WHERE
19f0: 20 70 69 64 3d 62 6c 6f 62 2e 72 69 64 20 41 4e   pid=blob.rid AN
1a00: 44 20 69 73 70 72 69 6d 3d 31 29 2c 22 0a 20 20  D isprim=1),".  
1a10: 20 20 22 20 20 20 20 20 20 20 28 53 45 4c 45 43    "       (SELEC
1a20: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1a30: 70 6c 69 6e 6b 20 57 48 45 52 45 20 63 69 64 3d  plink WHERE cid=
1a40: 62 6c 6f 62 2e 72 69 64 29 2c 22 0a 20 20 20 20  blob.rid),".    
1a50: 22 20 20 20 20 20 20 20 4e 4f 54 20 45 58 49 53  "       NOT EXIS
1a60: 54 53 20 28 53 45 4c 45 43 54 20 31 20 46 52 4f  TS (SELECT 1 FRO
1a70: 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 70 69  M plink WHERE pi
1a80: 64 3d 62 6c 6f 62 2e 72 69 64 29 22 0a 20 20 20  d=blob.rid)".   
1a90: 20 22 20 20 46 52 4f 4d 20 65 76 65 6e 74 2c 20   "  FROM event, 
1aa0: 62 6c 6f 62 22 0a 20 20 20 20 22 20 57 48 45 52  blob".    " WHER
1ab0: 45 20 65 76 65 6e 74 2e 74 79 70 65 3d 27 63 69  E event.type='ci
1ac0: 27 20 41 4e 44 20 62 6c 6f 62 2e 72 69 64 3d 65  ' AND blob.rid=e
1ad0: 76 65 6e 74 2e 6f 62 6a 69 64 22 0a 20 20 29 3b  vent.objid".  );
1ae0: 0a 20 20 69 66 28 20 7a 55 73 65 72 20 29 7b 0a  .  if( zUser ){.
1af0: 20 20 20 20 7a 53 51 4c 20 3d 20 6d 70 72 69 6e      zSQL = mprin
1b00: 74 66 28 22 25 7a 20 41 4e 44 20 65 76 65 6e 74  tf("%z AND event
1b10: 2e 75 73 65 72 3d 25 51 22 2c 20 7a 53 51 4c 2c  .user=%Q", zSQL,
1b20: 20 7a 55 73 65 72 29 3b 0a 20 20 7d 0a 20 20 69   zUser);.  }.  i
1b30: 66 28 20 6f 62 6a 69 64 20 29 7b 0a 20 20 20 20  f( objid ){.    
1b40: 63 68 61 72 20 2a 7a 20 3d 20 64 62 5f 74 65 78  char *z = db_tex
1b50: 74 28 30 2c 20 22 53 45 4c 45 43 54 20 64 61 74  t(0, "SELECT dat
1b60: 65 74 69 6d 65 28 65 76 65 6e 74 2e 6d 74 69 6d  etime(event.mtim
1b70: 65 29 20 46 52 4f 4d 20 65 76 65 6e 74 22 0a 20  e) FROM event". 
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
1ba0: 6f 62 6a 69 64 3d 25 64 22 2c 20 6f 62 6a 69 64  objid=%d", objid
1bb0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a  );.    if( z ){.
1bc0: 20 20 20 20 20 20 7a 53 74 61 72 74 20 3d 20 7a        zStart = z
1bd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1be0: 28 20 7a 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( zStart ){.    
1bf0: 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 7a  while( isspace(z
1c00: 53 74 61 72 74 5b 30 5d 29 20 29 7b 20 7a 53 74  Start[0]) ){ zSt
1c10: 61 72 74 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  art++; }.    if(
1c20: 20 7a 53 74 61 72 74 5b 30 5d 20 29 7b 0a 20 20   zStart[0] ){.  
1c30: 20 20 20 20 7a 53 51 4c 20 3d 20 6d 70 72 69 6e      zSQL = mprin
1c40: 74 66 28 22 25 7a 20 41 4e 44 20 65 76 65 6e 74  tf("%z AND event
1c50: 2e 6d 74 69 6d 65 20 25 73 20 6a 75 6c 69 61 6e  .mtime %s julian
1c60: 64 61 79 28 25 51 2c 20 27 6c 6f 63 61 6c 74 69  day(%Q, 'localti
1c70: 6d 65 27 29 22 2c 0a 20 20 20 20 20 20 20 20 20  me')",.         
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 51               zSQ
1c90: 4c 2c 20 61 66 74 65 72 46 6c 61 67 20 3f 20 22  L, afterFlag ? "
1ca0: 3e 3d 22 20 3a 20 22 3c 3d 22 2c 20 7a 53 74 61  >=" : "<=", zSta
1cb0: 72 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rt);.    }.  }. 
1cc0: 20 69 66 28 20 72 65 6c 61 74 65 64 45 76 65 6e   if( relatedEven
1cd0: 74 73 20 26 26 20 6f 62 6a 69 64 20 29 7b 0a 20  ts && objid ){. 
1ce0: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63     db_multi_exec
1cf0: 28 0a 20 20 20 20 20 20 20 22 43 52 45 41 54 45  (.       "CREATE
1d00: 20 54 45 4d 50 20 54 41 42 4c 45 20 49 46 20 4e   TEMP TABLE IF N
1d10: 4f 54 20 45 58 49 53 54 53 20 6f 6b 28 72 69 64  OT EXISTS ok(rid
1d20: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
1d30: 20 4b 45 59 29 22 0a 20 20 20 20 29 3b 0a 20 20   KEY)".    );.  
1d40: 20 20 69 66 28 20 61 66 74 65 72 46 6c 61 67 20    if( afterFlag 
1d50: 29 7b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65  ){.      compute
1d60: 5f 64 65 73 63 65 6e 64 65 6e 74 73 28 6f 62 6a  _descendents(obj
1d70: 69 64 2c 20 6e 45 6e 74 72 79 29 3b 0a 20 20 20  id, nEntry);.   
1d80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
1d90: 6d 70 75 74 65 5f 61 6e 63 65 73 74 6f 72 73 28  mpute_ancestors(
1da0: 6f 62 6a 69 64 2c 20 6e 45 6e 74 72 79 29 3b 0a  objid, nEntry);.
1db0: 20 20 20 20 7d 0a 20 20 20 20 7a 53 51 4c 20 3d      }.    zSQL =
1dc0: 20 6d 70 72 69 6e 74 66 28 22 25 7a 20 41 4e 44   mprintf("%z AND
1dd0: 20 65 76 65 6e 74 2e 6f 62 6a 69 64 20 49 4e 20   event.objid IN 
1de0: 6f 6b 22 2c 20 7a 53 51 4c 29 3b 0a 20 20 7d 0a  ok", zSQL);.  }.
1df0: 20 20 7a 53 51 4c 20 3d 20 6d 70 72 69 6e 74 66    zSQL = mprintf
1e00: 28 22 25 7a 20 4f 52 44 45 52 20 42 59 20 65 76  ("%z ORDER BY ev
1e10: 65 6e 74 2e 6d 74 69 6d 65 20 44 45 53 43 20 4c  ent.mtime DESC L
1e20: 49 4d 49 54 20 25 64 22 2c 20 7a 53 51 4c 2c 20  IMIT %d", zSQL, 
1e30: 6e 45 6e 74 72 79 29 3b 0a 20 20 64 62 5f 70 72  nEntry);.  db_pr
1e40: 65 70 61 72 65 28 26 71 2c 20 7a 53 51 4c 29 3b  epare(&q, zSQL);
1e50: 0a 20 20 66 72 65 65 28 7a 53 51 4c 29 3b 0a 20  .  free(zSQL);. 
1e60: 20 7a 44 61 74 65 5b 30 5d 20 3d 20 30 3b 0a 20   zDate[0] = 0;. 
1e70: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 73 63 72 69   blob_zero(&scri
1e80: 70 74 49 6e 69 74 29 3b 0a 20 20 7a 44 61 74 65  ptInit);.  zDate
1e90: 5b 30 5d 20 3d 20 30 3b 0a 20 20 77 77 77 5f 70  [0] = 0;.  www_p
1ea0: 72 69 6e 74 5f 74 69 6d 65 6c 69 6e 65 28 26 71  rint_timeline(&q
1eb0: 2c 20 26 66 69 72 73 74 45 76 65 6e 74 2c 20 26  , &firstEvent, &
1ec0: 6c 61 73 74 45 76 65 6e 74 2c 0a 20 20 20 20 20  lastEvent,.     
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee0: 73 61 76 65 5f 70 61 72 65 6e 74 61 67 65 5f 6a  save_parentage_j
1ef0: 61 76 61 73 63 72 69 70 74 2c 20 26 73 63 72 69  avascript, &scri
1f00: 70 74 49 6e 69 74 29 3b 0a 20 20 64 62 5f 66 69  ptInit);.  db_fi
1f10: 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 69 66  nalize(&q);.  if
1f20: 28 20 7a 53 74 61 72 74 3d 3d 30 20 29 7b 0a 20  ( zStart==0 ){. 
1f30: 20 20 20 7a 53 74 61 72 74 20 3d 20 7a 44 61 74     zStart = zDat
1f40: 65 3b 0a 20 20 7d 0a 20 20 40 20 3c 73 63 72 69  e;.  }.  @ <scri
1f50: 70 74 3e 0a 20 20 40 20 76 61 72 20 70 61 72 65  pt>.  @ var pare
1f60: 6e 74 6f 66 20 3d 20 6e 65 77 20 4f 62 6a 65 63  ntof = new Objec
1f70: 74 28 29 3b 0a 20 20 40 20 76 61 72 20 63 68 69  t();.  @ var chi
1f80: 6c 64 6f 66 20 3d 20 6e 65 77 20 4f 62 6a 65 63  ldof = new Objec
1f90: 74 28 29 3b 0a 20 20 63 67 69 5f 61 70 70 65 6e  t();.  cgi_appen
1fa0: 64 5f 63 6f 6e 74 65 6e 74 28 62 6c 6f 62 5f 62  d_content(blob_b
1fb0: 75 66 66 65 72 28 26 73 63 72 69 70 74 49 6e 69  uffer(&scriptIni
1fc0: 74 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 73  t), blob_size(&s
1fd0: 63 72 69 70 74 49 6e 69 74 29 29 3b 0a 20 20 62  criptInit));.  b
1fe0: 6c 6f 62 5f 72 65 73 65 74 28 26 73 63 72 69 70  lob_reset(&scrip
1ff0: 74 49 6e 69 74 29 3b 0a 20 20 40 20 66 75 6e 63  tInit);.  @ func
2000: 74 69 6f 6e 20 73 65 74 61 6c 6c 28 76 61 6c 75  tion setall(valu
2010: 65 29 7b 0a 20 20 40 20 20 20 66 6f 72 28 76 61  e){.  @   for(va
2020: 72 20 78 20 69 6e 20 70 61 72 65 6e 74 6f 66 29  r x in parentof)
2030: 7b 0a 20 20 40 20 20 20 20 20 73 65 74 6f 6e 65  {.  @     setone
2040: 28 78 2c 76 61 6c 75 65 29 3b 0a 20 20 40 20 20  (x,value);.  @  
2050: 20 7d 0a 20 20 40 20 7d 0a 20 20 40 20 73 65 74   }.  @ }.  @ set
2060: 61 6c 6c 28 22 23 66 66 66 66 66 66 22 29 3b 0a  all("#ffffff");.
2070: 20 20 40 20 66 75 6e 63 74 69 6f 6e 20 73 65 74    @ function set
2080: 6f 6e 65 28 69 64 2c 20 63 6c 72 29 7b 0a 20 20  one(id, clr){.  
2090: 40 20 20 20 69 66 28 20 70 61 72 65 6e 74 6f 66  @   if( parentof
20a0: 5b 69 64 5d 3d 3d 6e 75 6c 6c 20 29 20 72 65 74  [id]==null ) ret
20b0: 75 72 6e 20 30 3b 0a 20 20 40 20 20 20 76 61 72  urn 0;.  @   var
20c0: 20 77 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65   w = document.ge
20d0: 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 69 64 29  tElementById(id)
20e0: 3b 0a 20 20 40 20 20 20 69 66 28 20 77 2e 73 74  ;.  @   if( w.st
20f0: 79 6c 65 2e 63 6f 6c 6f 72 3d 3d 63 6c 72 20 29  yle.color==clr )
2100: 7b 0a 20 20 40 20 20 20 20 20 72 65 74 75 72 6e  {.  @     return
2110: 20 30 0a 20 20 40 20 20 20 7d 65 6c 73 65 7b 0a   0.  @   }else{.
2120: 20 20 40 20 20 20 20 20 77 2e 73 74 79 6c 65 2e    @     w.style.
2130: 63 6f 6c 6f 72 20 3d 20 63 6c 72 0a 20 20 40 20  color = clr.  @ 
2140: 20 20 20 20 72 65 74 75 72 6e 20 31 0a 20 20 40      return 1.  @
2150: 20 20 20 7d 0a 20 20 40 20 7d 0a 20 20 40 20 66     }.  @ }.  @ f
2160: 75 6e 63 74 69 6f 6e 20 78 69 6e 28 69 64 29 20  unction xin(id) 
2170: 7b 0a 20 20 40 20 20 20 73 65 74 61 6c 6c 28 22  {.  @   setall("
2180: 23 66 66 66 66 66 66 22 29 3b 0a 20 20 40 20 20  #ffffff");.  @  
2190: 20 73 65 74 6f 6e 65 28 69 64 2c 22 23 66 66 30   setone(id,"#ff0
21a0: 30 30 30 22 29 3b 0a 20 20 40 20 20 20 73 65 74  000");.  @   set
21b0: 5f 63 68 69 6c 64 72 65 6e 28 69 64 2c 20 22 23  _children(id, "#
21c0: 62 30 62 30 62 30 22 29 3b 0a 20 20 40 20 20 20  b0b0b0");.  @   
21d0: 73 65 74 5f 70 61 72 65 6e 74 73 28 69 64 2c 20  set_parents(id, 
21e0: 22 23 62 30 62 30 62 30 22 29 3b 0a 20 20 40 20  "#b0b0b0");.  @ 
21f0: 20 20 66 6f 72 28 76 61 72 20 78 20 69 6e 20 70    for(var x in p
2200: 61 72 65 6e 74 6f 66 5b 69 64 5d 29 7b 0a 20 20  arentof[id]){.  
2210: 40 20 20 20 20 20 76 61 72 20 70 69 64 20 3d 20  @     var pid = 
2220: 70 61 72 65 6e 74 6f 66 5b 69 64 5d 5b 78 5d 0a  parentof[id][x].
2230: 20 20 40 20 20 20 20 20 76 61 72 20 77 20 3d 20    @     var w = 
2240: 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d  document.getElem
2250: 65 6e 74 42 79 49 64 28 70 69 64 29 3b 0a 20 20  entById(pid);.  
2260: 40 20 20 20 20 20 69 66 28 20 77 21 3d 6e 75 6c  @     if( w!=nul
2270: 6c 20 29 7b 0a 20 20 40 20 20 20 20 20 20 20 77  l ){.  @       w
2280: 2e 73 74 79 6c 65 2e 63 6f 6c 6f 72 20 3d 20 22  .style.color = "
2290: 23 30 30 30 30 30 30 22 3b 0a 20 20 40 20 20 20  #000000";.  @   
22a0: 20 20 7d 0a 20 20 40 20 20 20 7d 0a 20 20 40 20    }.  @   }.  @ 
22b0: 20 20 66 6f 72 28 76 61 72 20 78 20 69 6e 20 63    for(var x in c
22c0: 68 69 6c 64 6f 66 5b 69 64 5d 29 7b 0a 20 20 40  hildof[id]){.  @
22d0: 20 20 20 20 20 76 61 72 20 63 69 64 20 3d 20 63       var cid = c
22e0: 68 69 6c 64 6f 66 5b 69 64 5d 5b 78 5d 0a 20 20  hildof[id][x].  
22f0: 40 20 20 20 20 20 76 61 72 20 77 20 3d 20 64 6f  @     var w = do
2300: 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e  cument.getElemen
2310: 74 42 79 49 64 28 63 69 64 29 3b 0a 20 20 40 20  tById(cid);.  @ 
2320: 20 20 20 20 69 66 28 20 77 21 3d 6e 75 6c 6c 20      if( w!=null 
2330: 29 7b 0a 20 20 40 20 20 20 20 20 20 20 77 2e 73  ){.  @       w.s
2340: 74 79 6c 65 2e 63 6f 6c 6f 72 20 3d 20 22 23 30  tyle.color = "#0
2350: 30 30 30 30 30 22 3b 0a 20 20 40 20 20 20 20 20  00000";.  @     
2360: 7d 0a 20 20 40 20 20 20 7d 0a 20 20 40 20 7d 0a  }.  @   }.  @ }.
2370: 20 20 40 20 66 75 6e 63 74 69 6f 6e 20 78 6f 75    @ function xou
2380: 74 28 69 64 29 20 7b 0a 20 20 40 20 20 20 2f 2a  t(id) {.  @   /*
2390: 20 73 65 74 61 6c 6c 28 22 23 30 30 30 30 30 30   setall("#000000
23a0: 22 29 3b 20 2a 2f 0a 20 20 40 20 7d 0a 20 20 40  "); */.  @ }.  @
23b0: 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 5f 70 61   function set_pa
23c0: 72 65 6e 74 73 28 69 64 2c 20 63 6c 72 29 7b 0a  rents(id, clr){.
23d0: 20 20 40 20 20 20 76 61 72 20 70 6c 69 73 74 20    @   var plist 
23e0: 3d 20 70 61 72 65 6e 74 6f 66 5b 69 64 5d 3b 0a  = parentof[id];.
23f0: 20 20 40 20 20 20 69 66 28 20 70 6c 69 73 74 3d    @   if( plist=
2400: 3d 6e 75 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a  =null ) return;.
2410: 20 20 40 20 20 20 66 6f 72 28 76 61 72 20 78 20    @   for(var x 
2420: 69 6e 20 70 6c 69 73 74 29 7b 0a 20 20 40 20 20  in plist){.  @  
2430: 20 20 20 76 61 72 20 70 69 64 20 3d 20 70 6c 69     var pid = pli
2440: 73 74 5b 78 5d 3b 0a 20 20 40 20 20 20 20 20 69  st[x];.  @     i
2450: 66 28 20 73 65 74 6f 6e 65 28 70 69 64 2c 63 6c  f( setone(pid,cl
2460: 72 29 3d 3d 31 20 29 7b 0a 20 20 40 20 20 20 20  r)==1 ){.  @    
2470: 20 20 20 73 65 74 5f 70 61 72 65 6e 74 73 28 70     set_parents(p
2480: 69 64 2c 63 6c 72 29 3b 0a 20 20 40 20 20 20 20  id,clr);.  @    
2490: 20 7d 0a 20 20 40 20 20 20 7d 0a 20 20 40 20 7d   }.  @   }.  @ }
24a0: 0a 20 20 40 20 66 75 6e 63 74 69 6f 6e 20 73 65  .  @ function se
24b0: 74 5f 63 68 69 6c 64 72 65 6e 28 69 64 2c 63 6c  t_children(id,cl
24c0: 72 29 7b 0a 20 20 40 20 20 20 76 61 72 20 63 6c  r){.  @   var cl
24d0: 69 73 74 20 3d 20 63 68 69 6c 64 6f 66 5b 69 64  ist = childof[id
24e0: 5d 3b 0a 20 20 40 20 20 20 69 66 28 20 63 6c 69  ];.  @   if( cli
24f0: 73 74 3d 3d 6e 75 6c 6c 20 29 20 72 65 74 75 72  st==null ) retur
2500: 6e 3b 0a 20 20 40 20 20 20 66 6f 72 28 76 61 72  n;.  @   for(var
2510: 20 78 20 69 6e 20 63 6c 69 73 74 29 7b 0a 20 20   x in clist){.  
2520: 40 20 20 20 20 20 76 61 72 20 63 69 64 20 3d 20  @     var cid = 
2530: 63 6c 69 73 74 5b 78 5d 3b 0a 20 20 40 20 20 20  clist[x];.  @   
2540: 20 20 69 66 28 20 73 65 74 6f 6e 65 28 63 69 64    if( setone(cid
2550: 2c 63 6c 72 29 3d 3d 31 20 29 7b 0a 20 20 40 20  ,clr)==1 ){.  @ 
2560: 20 20 20 20 20 20 73 65 74 5f 63 68 69 6c 64 72        set_childr
2570: 65 6e 28 63 69 64 2c 63 6c 72 29 3b 0a 20 20 40  en(cid,clr);.  @
2580: 20 20 20 20 20 7d 0a 20 20 40 20 20 20 7d 0a 20       }.  @   }. 
2590: 20 40 20 7d 0a 20 20 40 20 3c 2f 73 63 72 69 70   @ }.  @ </scrip
25a0: 74 3e 0a 20 20 40 20 3c 68 72 3e 0a 20 20 40 20  t>.  @ <hr>.  @ 
25b0: 3c 66 6f 72 6d 20 6d 65 74 68 6f 64 3d 22 47 45  <form method="GE
25c0: 54 22 20 61 63 74 69 6f 6e 3d 22 25 73 28 67 2e  T" action="%s(g.
25d0: 7a 42 61 73 65 55 52 4c 29 2f 74 69 6d 65 6c 69  zBaseURL)/timeli
25e0: 6e 65 22 3e 0a 20 20 40 20 53 74 61 72 74 20 44  ne">.  @ Start D
25f0: 61 74 65 3a 0a 20 20 40 20 3c 69 6e 70 75 74 20  ate:.  @ <input 
2600: 74 79 70 65 3d 22 74 65 78 74 22 20 73 69 7a 65  type="text" size
2610: 3d 22 33 30 22 20 76 61 6c 75 65 3d 22 25 68 28  ="30" value="%h(
2620: 7a 53 74 61 72 74 29 22 20 6e 61 6d 65 3d 22 64  zStart)" name="d
2630: 22 3e 0a 20 20 40 20 4e 75 6d 62 65 72 20 4f 66  ">.  @ Number Of
2640: 20 45 6e 74 72 69 65 73 3a 20 20 0a 20 20 40 20   Entries:  .  @ 
2650: 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 74 65 78  <input type="tex
2660: 74 22 20 73 69 7a 65 3d 22 34 22 20 76 61 6c 75  t" size="4" valu
2670: 65 3d 22 25 64 28 6e 45 6e 74 72 79 29 22 20 6e  e="%d(nEntry)" n
2680: 61 6d 65 3d 22 6e 22 3e 0a 20 20 40 20 3c 62 72  ame="n">.  @ <br
2690: 3e 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75  ><input type="su
26a0: 62 6d 69 74 22 20 76 61 6c 75 65 3d 22 53 75 62  bmit" value="Sub
26b0: 6d 69 74 22 3e 0a 20 20 40 20 3c 2f 66 6f 72 6d  mit">.  @ </form
26c0: 3e 0a 20 20 40 20 3c 66 6f 72 6d 20 6d 65 74 68  >.  @ <form meth
26d0: 6f 64 3d 22 47 45 54 22 20 61 63 74 69 6f 6e 3d  od="GET" action=
26e0: 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f  "%s(g.zBaseURL)/
26f0: 74 69 6d 65 6c 69 6e 65 22 3e 0a 20 20 40 20 3c  timeline">.  @ <
2700: 69 6e 70 75 74 20 74 79 70 65 3d 22 68 69 64 64  input type="hidd
2710: 65 6e 22 20 76 61 6c 75 65 3d 22 25 68 28 7a 44  en" value="%h(zD
2720: 61 74 65 29 22 20 6e 61 6d 65 3d 22 64 22 3e 0a  ate)" name="d">.
2730: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
2740: 22 68 69 64 64 65 6e 22 20 76 61 6c 75 65 3d 22  "hidden" value="
2750: 25 64 28 6e 45 6e 74 72 79 29 22 20 6e 61 6d 65  %d(nEntry)" name
2760: 3d 22 6e 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74  ="n">.  @ <input
2770: 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20 76   type="submit" v
2780: 61 6c 75 65 3d 22 4e 65 78 74 20 25 64 28 6e 45  alue="Next %d(nE
2790: 6e 74 72 79 29 20 52 6f 77 73 22 3e 0a 20 20 40  ntry) Rows">.  @
27a0: 20 3c 2f 66 6f 72 6d 3e 0a 20 20 73 74 79 6c 65   </form>.  style
27b0: 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a  _footer();.}../*
27c0: 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 71 75  .** The input qu
27d0: 65 72 79 20 71 20 73 65 6c 65 63 74 73 20 76 61  ery q selects va
27e0: 72 69 6f 75 73 20 72 65 63 6f 72 64 73 2e 20 20  rious records.  
27f0: 50 72 69 6e 74 20 61 20 68 75 6d 61 6e 2d 72 65  Print a human-re
2800: 61 64 61 62 6c 65 0a 2a 2a 20 73 75 6d 6d 61 72  adable.** summar
2810: 79 20 6f 66 20 74 68 6f 73 65 20 72 65 63 6f 72  y of those recor
2820: 64 73 2e 0a 2a 2a 0a 2a 2a 20 4c 69 6d 69 74 20  ds..**.** Limit 
2830: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
2840: 74 72 69 65 73 20 70 72 69 6e 74 65 64 20 74 6f  tries printed to
2850: 20 6e 4c 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20   nLine..*/.void 
2860: 70 72 69 6e 74 5f 74 69 6d 65 6c 69 6e 65 28 53  print_timeline(S
2870: 74 6d 74 20 2a 71 2c 20 69 6e 74 20 6d 78 4c 69  tmt *q, int mxLi
2880: 6e 65 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65  ne){.  int nLine
2890: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 50 72   = 0;.  char zPr
28a0: 65 76 44 61 74 65 5b 32 30 5d 3b 0a 20 20 7a 50  evDate[20];.  zP
28b0: 72 65 76 44 61 74 65 5b 30 5d 20 3d 20 30 3b 0a  revDate[0] = 0;.
28c0: 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65  .  while( db_ste
28d0: 70 28 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  p(q)==SQLITE_ROW
28e0: 20 26 26 20 6e 4c 69 6e 65 3c 3d 6d 78 4c 69 6e   && nLine<=mxLin
28f0: 65 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  e ){.    const c
2900: 68 61 72 20 2a 7a 49 64 20 3d 20 64 62 5f 63 6f  har *zId = db_co
2910: 6c 75 6d 6e 5f 74 65 78 74 28 71 2c 20 31 29 3b  lumn_text(q, 1);
2920: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2930: 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63 6f 6c 75  *zDate = db_colu
2940: 6d 6e 5f 74 65 78 74 28 71 2c 20 32 29 3b 0a 20  mn_text(q, 2);. 
2950: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2960: 43 6f 6d 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  Com = db_column_
2970: 74 65 78 74 28 71 2c 20 33 29 3b 0a 20 20 20 20  text(q, 3);.    
2980: 69 6e 74 20 6e 43 68 69 6c 64 20 3d 20 64 62 5f  int nChild = db_
2990: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 71 2c 20 34 29  column_int(q, 4)
29a0: 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 65 6e  ;.    int nParen
29b0: 74 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e  t = db_column_in
29c0: 74 28 71 2c 20 35 29 3b 0a 20 20 20 20 63 68 61  t(q, 5);.    cha
29d0: 72 20 2a 7a 46 72 65 65 20 3d 20 30 3b 0a 20 20  r *zFree = 0;.  
29e0: 20 20 63 68 61 72 20 7a 55 75 69 64 5b 55 55 49    char zUuid[UUI
29f0: 44 5f 53 49 5a 45 2b 31 5d 3b 0a 0a 20 20 20 20  D_SIZE+1];..    
2a00: 73 70 72 69 6e 74 66 28 7a 55 75 69 64 2c 20 22  sprintf(zUuid, "
2a10: 25 2e 31 30 73 22 2c 20 7a 49 64 29 3b 0a 20 20  %.10s", zId);.  
2a20: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 7a 44 61    if( memcmp(zDa
2a30: 74 65 2c 20 7a 50 72 65 76 44 61 74 65 2c 20 31  te, zPrevDate, 1
2a40: 30 29 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e  0) ){.      prin
2a50: 74 66 28 22 3d 3d 3d 20 25 2e 31 30 73 20 3d 3d  tf("=== %.10s ==
2a60: 3d 5c 6e 22 2c 20 7a 44 61 74 65 29 3b 0a 20 20  =\n", zDate);.  
2a70: 20 20 20 20 6d 65 6d 63 70 79 28 7a 50 72 65 76      memcpy(zPrev
2a80: 44 61 74 65 2c 20 7a 44 61 74 65 2c 20 31 30 29  Date, zDate, 10)
2a90: 3b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 2b 2b 3b  ;.      nLine++;
2aa0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
2ab0: 43 6f 6d 3d 3d 30 20 29 20 7a 43 6f 6d 20 3d 20  Com==0 ) zCom = 
2ac0: 22 22 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  "";.    printf("
2ad0: 25 2e 38 73 20 22 2c 20 26 7a 44 61 74 65 5b 31  %.8s ", &zDate[1
2ae0: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 68  1]);.    if( nCh
2af0: 69 6c 64 3e 31 20 7c 7c 20 6e 50 61 72 65 6e 74  ild>1 || nParent
2b00: 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
2b10: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61  n = 0;.      cha
2b20: 72 20 7a 50 72 65 66 69 78 5b 35 30 5d 3b 0a 20  r zPrefix[50];. 
2b30: 20 20 20 20 20 69 66 28 20 6e 50 61 72 65 6e 74       if( nParent
2b40: 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >1 ){.        sq
2b50: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2b60: 69 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2c 20  izeof(zPrefix), 
2b70: 7a 50 72 65 66 69 78 2c 20 22 2a 4d 45 52 47 45  zPrefix, "*MERGE
2b80: 2a 20 22 29 3b 0a 20 20 20 20 20 20 20 20 6e 20  * ");.        n 
2b90: 3d 20 73 74 72 6c 65 6e 28 7a 50 72 65 66 69 78  = strlen(zPrefix
2ba0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2bb0: 20 69 66 28 20 6e 43 68 69 6c 64 3e 31 20 29 7b   if( nChild>1 ){
2bc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2bd0: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2be0: 28 7a 50 72 65 66 69 78 29 2d 6e 2c 20 26 7a 50  (zPrefix)-n, &zP
2bf0: 72 65 66 69 78 5b 6e 5d 2c 20 22 2a 46 4f 52 4b  refix[n], "*FORK
2c00: 2a 20 22 29 3b 0a 20 20 20 20 20 20 20 20 6e 20  * ");.        n 
2c10: 3d 20 73 74 72 6c 65 6e 28 7a 50 72 65 66 69 78  = strlen(zPrefix
2c20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2c30: 20 7a 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33   zFree = sqlite3
2c40: 5f 6d 70 72 69 6e 74 66 28 22 5b 25 2e 31 30 73  _mprintf("[%.10s
2c50: 5d 20 25 73 25 73 22 2c 20 7a 55 75 69 64 2c 20  ] %s%s", zUuid, 
2c60: 7a 50 72 65 66 69 78 2c 20 7a 43 6f 6d 29 3b 0a  zPrefix, zCom);.
2c70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c80: 20 7a 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33   zFree = sqlite3
2c90: 5f 6d 70 72 69 6e 74 66 28 22 5b 25 2e 31 30 73  _mprintf("[%.10s
2ca0: 5d 20 25 73 22 2c 20 7a 55 75 69 64 2c 20 7a 43  ] %s", zUuid, zC
2cb0: 6f 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  om);.    }.    n
2cc0: 4c 69 6e 65 20 2b 3d 20 63 6f 6d 6d 65 6e 74 5f  Line += comment_
2cd0: 70 72 69 6e 74 28 7a 46 72 65 65 2c 20 39 2c 20  print(zFree, 9, 
2ce0: 37 39 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  79);.    sqlite3
2cf0: 5f 66 72 65 65 28 7a 46 72 65 65 29 3b 0a 20 20  _free(zFree);.  
2d00: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d  }.}.../*.** COMM
2d10: 41 4e 44 3a 20 74 69 6d 65 6c 69 6e 65 0a 2a 2a  AND: timeline.**
2d20: 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 73  .** Usage: %foss
2d30: 69 6c 20 74 69 6d 65 6c 69 6e 65 20 3f 57 48 45  il timeline ?WHE
2d40: 4e 3f 20 3f 55 55 49 44 7c 44 41 54 45 54 49 4d  N? ?UUID|DATETIM
2d50: 45 3f 20 3f 2d 6e 7c 2d 2d 63 6f 75 6e 74 20 4e  E? ?-n|--count N
2d60: 3f 0a 2a 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  ?.**.** Print a 
2d70: 73 75 6d 6d 61 72 79 20 6f 66 20 61 63 74 69 76  summary of activ
2d80: 69 74 79 20 67 6f 69 6e 67 20 62 61 63 6b 77 61  ity going backwa
2d90: 72 64 73 20 69 6e 20 64 61 74 65 20 61 6e 64 20  rds in date and 
2da0: 74 69 6d 65 0a 2a 2a 20 73 70 65 63 69 66 69 65  time.** specifie
2db0: 64 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 63 75  d or from the cu
2dc0: 72 72 65 6e 74 20 64 61 74 65 20 61 6e 64 20 74  rrent date and t
2dd0: 69 6d 65 20 69 66 20 6e 6f 20 61 72 67 75 6d 65  ime if no argume
2de0: 6e 74 73 0a 2a 2a 20 61 72 65 20 67 69 76 65 6e  nts.** are given
2df0: 2e 20 20 53 68 6f 77 20 61 73 20 6d 61 6e 79 20  .  Show as many 
2e00: 61 73 20 4e 20 28 64 65 66 61 75 6c 74 20 32 30  as N (default 20
2e10: 29 20 63 68 65 63 6b 2d 69 6e 73 2e 20 20 54 68  ) check-ins.  Th
2e20: 65 0a 2a 2a 20 57 48 45 4e 20 61 72 67 75 6d 65  e.** WHEN argume
2e30: 6e 74 20 63 61 6e 20 62 65 20 61 6e 79 20 75 6e  nt can be any un
2e40: 69 71 75 65 20 61 62 62 72 65 76 69 61 74 69 6f  ique abbreviatio
2e50: 6e 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 73  n of one of thes
2e60: 65 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 3a 0a 2a  e.** keywords:.*
2e70: 2a 0a 2a 2a 20 20 20 20 20 62 65 66 6f 72 65 0a  *.**     before.
2e80: 2a 2a 20 20 20 20 20 61 66 74 65 72 0a 2a 2a 20  **     after.** 
2e90: 20 20 20 20 64 65 73 63 65 6e 64 65 6e 74 73 20      descendents 
2ea0: 7c 20 63 68 69 6c 64 72 65 6e 0a 2a 2a 20 20 20  | children.**   
2eb0: 20 20 61 6e 63 65 73 74 6f 72 73 20 7c 20 70 61    ancestors | pa
2ec0: 72 65 6e 74 73 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rents.**.** The 
2ed0: 55 55 49 44 20 63 61 6e 20 62 65 20 61 6e 79 20  UUID can be any 
2ee0: 75 6e 69 71 75 65 20 70 72 65 66 69 78 20 6f 66  unique prefix of
2ef0: 20 34 20 63 68 61 72 61 63 74 65 72 73 20 6f 72   4 characters or
2f00: 20 6d 6f 72 65 2e 0a 2a 2a 20 54 68 65 20 44 41   more..** The DA
2f10: 54 45 54 49 4d 45 20 73 68 6f 75 6c 64 20 62 65  TETIME should be
2f20: 20 69 6e 20 74 68 65 20 49 53 4f 38 36 30 31 20   in the ISO8601 
2f30: 66 6f 72 6d 61 74 2e 20 20 46 6f 72 0a 2a 2a 20  format.  For.** 
2f40: 65 78 61 6d 70 6c 65 73 3a 20 22 32 30 30 37 2d  examples: "2007-
2f50: 30 38 2d 31 38 20 30 37 3a 32 31 3a 32 31 22 2e  08-18 07:21:21".
2f60: 20 20 59 6f 75 20 63 61 6e 20 61 6c 73 6f 20 73    You can also s
2f70: 61 79 20 22 63 75 72 72 65 6e 74 22 0a 2a 2a 20  ay "current".** 
2f80: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
2f90: 76 65 72 73 69 6f 6e 20 6f 72 20 22 6e 6f 77 22  version or "now"
2fa0: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
2fb0: 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 74   time..*/.void t
2fc0: 69 6d 65 6c 69 6e 65 5f 63 6d 64 28 76 6f 69 64  imeline_cmd(void
2fd0: 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 69  ){.  Stmt q;.  i
2fe0: 6e 74 20 6e 2c 20 6b 3b 0a 20 20 63 6f 6e 73 74  nt n, k;.  const
2ff0: 20 63 68 61 72 20 2a 7a 43 6f 75 6e 74 3b 0a 20   char *zCount;. 
3000: 20 63 68 61 72 20 2a 7a 4f 72 69 67 69 6e 3b 0a   char *zOrigin;.
3010: 20 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20    char *zDate;. 
3020: 20 63 68 61 72 20 2a 7a 53 51 4c 3b 0a 20 20 69   char *zSQL;.  i
3030: 6e 74 20 6f 62 6a 69 64 20 3d 20 30 3b 0a 20 20  nt objid = 0;.  
3040: 42 6c 6f 62 20 75 75 69 64 3b 0a 20 20 69 6e 74  Blob uuid;.  int
3050: 20 6d 6f 64 65 20 3d 20 31 20 3b 20 20 20 20 20   mode = 1 ;     
3060: 20 20 2f 2a 20 31 3a 20 62 65 66 6f 72 65 20 20    /* 1: before  
3070: 32 3a 61 66 74 65 72 20 20 33 3a 63 68 69 6c 64  2:after  3:child
3080: 72 65 6e 20 20 34 3a 70 61 72 65 6e 74 73 20 2a  ren  4:parents *
3090: 2f 0a 20 20 64 62 5f 66 69 6e 64 5f 61 6e 64 5f  /.  db_find_and_
30a0: 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28  open_repository(
30b0: 29 3b 0a 20 20 7a 43 6f 75 6e 74 20 3d 20 66 69  );.  zCount = fi
30c0: 6e 64 5f 6f 70 74 69 6f 6e 28 22 6e 22 2c 22 63  nd_option("n","c
30d0: 6f 75 6e 74 22 2c 31 29 3b 0a 20 20 69 66 28 20  ount",1);.  if( 
30e0: 7a 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 6e 20  zCount ){.    n 
30f0: 3d 20 61 74 6f 69 28 7a 43 6f 75 6e 74 29 3b 0a  = atoi(zCount);.
3100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 20 3d    }else{.    n =
3110: 20 32 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67   20;.  }.  if( g
3120: 2e 61 72 67 63 3d 3d 34 20 29 7b 0a 20 20 20 20  .argc==4 ){.    
3130: 6b 20 3d 20 73 74 72 6c 65 6e 28 67 2e 61 72 67  k = strlen(g.arg
3140: 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 73  v[2]);.    if( s
3150: 74 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d  trncmp(g.argv[2]
3160: 2c 22 62 65 66 6f 72 65 22 2c 6b 29 3d 3d 30 20  ,"before",k)==0 
3170: 29 7b 0a 20 20 20 20 20 20 6d 6f 64 65 20 3d 20  ){.      mode = 
3180: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
3190: 20 73 74 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b   strncmp(g.argv[
31a0: 32 5d 2c 22 61 66 74 65 72 22 2c 6b 29 3d 3d 30  2],"after",k)==0
31b0: 20 26 26 20 6b 3e 31 20 29 7b 0a 20 20 20 20 20   && k>1 ){.     
31c0: 20 6d 6f 64 65 20 3d 20 32 3b 0a 20 20 20 20 7d   mode = 2;.    }
31d0: 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70  else if( strncmp
31e0: 28 67 2e 61 72 67 76 5b 32 5d 2c 22 64 65 73 63  (g.argv[2],"desc
31f0: 65 6e 64 65 6e 74 73 22 2c 6b 29 3d 3d 30 20 29  endents",k)==0 )
3200: 7b 0a 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 33  {.      mode = 3
3210: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
3220: 73 74 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32  strncmp(g.argv[2
3230: 5d 2c 22 63 68 69 6c 64 72 65 6e 22 2c 6b 29 3d  ],"children",k)=
3240: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 6f 64 65  =0 ){.      mode
3250: 20 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 3;.    }else 
3260: 69 66 28 20 73 74 72 6e 63 6d 70 28 67 2e 61 72  if( strncmp(g.ar
3270: 67 76 5b 32 5d 2c 22 61 6e 63 65 73 74 6f 72 73  gv[2],"ancestors
3280: 22 2c 6b 29 3d 3d 30 20 26 26 20 6b 3e 31 20 29  ",k)==0 && k>1 )
3290: 7b 0a 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 34  {.      mode = 4
32a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
32b0: 73 74 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32  strncmp(g.argv[2
32c0: 5d 2c 22 70 61 72 65 6e 74 73 22 2c 6b 29 3d 3d  ],"parents",k)==
32d0: 30 20 29 7b 0a 20 20 20 20 20 20 6d 6f 64 65 20  0 ){.      mode 
32e0: 3d 20 34 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 4;.    }else{.
32f0: 20 20 20 20 20 20 75 73 61 67 65 28 22 3f 57 48        usage("?WH
3300: 45 4e 3f 20 3f 55 55 49 44 7c 44 41 54 45 54 49  EN? ?UUID|DATETI
3310: 4d 45 3f 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ME?");.    }.   
3320: 20 7a 4f 72 69 67 69 6e 20 3d 20 67 2e 61 72 67   zOrigin = g.arg
3330: 76 5b 33 5d 3b 0a 20 20 7d 65 6c 73 65 20 69 66  v[3];.  }else if
3340: 28 20 67 2e 61 72 67 63 3d 3d 33 20 29 7b 0a 20  ( g.argc==3 ){. 
3350: 20 20 20 7a 4f 72 69 67 69 6e 20 3d 20 67 2e 61     zOrigin = g.a
3360: 72 67 76 5b 32 5d 3b 0a 20 20 7d 65 6c 73 65 7b  rgv[2];.  }else{
3370: 0a 20 20 20 20 7a 4f 72 69 67 69 6e 20 3d 20 22  .    zOrigin = "
3380: 6e 6f 77 22 3b 0a 20 20 7d 0a 20 20 6b 20 3d 20  now";.  }.  k = 
3390: 73 74 72 6c 65 6e 28 7a 4f 72 69 67 69 6e 29 3b  strlen(zOrigin);
33a0: 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 75 75  .  blob_zero(&uu
33b0: 69 64 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65  id);.  blob_appe
33c0: 6e 64 28 26 75 75 69 64 2c 20 7a 4f 72 69 67 69  nd(&uuid, zOrigi
33d0: 6e 2c 20 2d 31 29 3b 0a 20 20 69 66 28 20 73 74  n, -1);.  if( st
33e0: 72 63 6d 70 28 7a 4f 72 69 67 69 6e 2c 20 22 6e  rcmp(zOrigin, "n
33f0: 6f 77 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ow")==0 ){.    i
3400: 66 28 20 6d 6f 64 65 3d 3d 33 20 7c 7c 20 6d 6f  f( mode==3 || mo
3410: 64 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 66  de==4 ){.      f
3420: 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 63 61 6e  ossil_fatal("can
3430: 6e 6f 74 20 63 6f 6d 70 75 74 65 20 64 65 73 63  not compute desc
3440: 65 6e 64 65 6e 74 73 20 6f 72 20 61 6e 63 65 73  endents or ances
3450: 74 6f 72 73 20 6f 66 20 61 20 64 61 74 65 22 29  tors of a date")
3460: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 44 61 74  ;.    }.    zDat
3470: 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 28 53 45  e = mprintf("(SE
3480: 4c 45 43 54 20 6a 75 6c 69 61 6e 64 61 79 28 27  LECT julianday('
3490: 6e 6f 77 27 2c 27 75 74 63 27 29 29 22 29 3b 0a  now','utc'))");.
34a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
34b0: 63 6d 70 28 7a 4f 72 69 67 69 6e 2c 20 22 63 75  cmp(zOrigin, "cu
34c0: 72 72 65 6e 74 22 2c 20 6b 29 3d 3d 30 20 29 7b  rrent", k)==0 ){
34d0: 0a 20 20 20 20 6f 62 6a 69 64 20 3d 20 64 62 5f  .    objid = db_
34e0: 6c 67 65 74 5f 69 6e 74 28 22 63 68 65 63 6b 6f  lget_int("checko
34f0: 75 74 22 2c 30 29 3b 0a 20 20 20 20 7a 44 61 74  ut",0);.    zDat
3500: 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 28 53 45  e = mprintf("(SE
3510: 4c 45 43 54 20 6d 74 69 6d 65 20 46 52 4f 4d 20  LECT mtime FROM 
3520: 70 6c 69 6e 6b 20 57 48 45 52 45 20 63 69 64 3d  plink WHERE cid=
3530: 25 64 29 22 2c 20 6f 62 6a 69 64 29 3b 0a 20 20  %d)", objid);.  
3540: 7d 65 6c 73 65 20 69 66 28 20 6e 61 6d 65 5f 74  }else if( name_t
3550: 6f 5f 75 75 69 64 28 26 75 75 69 64 2c 20 30 29  o_uuid(&uuid, 0)
3560: 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 62 6a 69 64  ==0 ){.    objid
3570: 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45   = db_int(0, "SE
3580: 4c 45 43 54 20 72 69 64 20 46 52 4f 4d 20 62 6c  LECT rid FROM bl
3590: 6f 62 20 57 48 45 52 45 20 75 75 69 64 3d 25 42  ob WHERE uuid=%B
35a0: 22 2c 20 26 75 75 69 64 29 3b 0a 20 20 20 20 7a  ", &uuid);.    z
35b0: 44 61 74 65 20 3d 20 6d 70 72 69 6e 74 66 28 22  Date = mprintf("
35c0: 28 53 45 4c 45 43 54 20 6d 74 69 6d 65 20 46 52  (SELECT mtime FR
35d0: 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 63  OM plink WHERE c
35e0: 69 64 3d 25 64 29 22 2c 20 6f 62 6a 69 64 29 3b  id=%d)", objid);
35f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
3600: 28 20 6d 6f 64 65 3d 3d 33 20 7c 7c 20 6d 6f 64  ( mode==3 || mod
3610: 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 66 6f  e==4 ){.      fo
3620: 73 73 69 6c 5f 66 61 74 61 6c 28 22 63 61 6e 6e  ssil_fatal("cann
3630: 6f 74 20 63 6f 6d 70 75 74 65 20 64 65 73 63 65  ot compute desce
3640: 6e 64 65 6e 74 73 20 6f 72 20 61 6e 63 65 73 74  ndents or ancest
3650: 6f 72 73 20 6f 66 20 61 20 64 61 74 65 22 29 3b  ors of a date");
3660: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 44 61 74 65  .    }.    zDate
3670: 20 3d 20 6d 70 72 69 6e 74 66 28 22 28 53 45 4c   = mprintf("(SEL
3680: 45 43 54 20 6a 75 6c 69 61 6e 64 61 79 28 25 51  ECT julianday(%Q
3690: 2c 20 27 75 74 63 27 29 29 22 2c 20 7a 4f 72 69  , 'utc'))", zOri
36a0: 67 69 6e 29 3b 0a 20 20 7d 0a 20 20 7a 53 51 4c  gin);.  }.  zSQL
36b0: 20 3d 20 6d 70 72 69 6e 74 66 28 0a 20 20 20 20   = mprintf(.    
36c0: 22 53 45 4c 45 43 54 20 62 6c 6f 62 2e 72 69 64  "SELECT blob.rid
36d0: 2c 20 75 75 69 64 2c 20 64 61 74 65 74 69 6d 65  , uuid, datetime
36e0: 28 65 76 65 6e 74 2e 6d 74 69 6d 65 2c 27 6c 6f  (event.mtime,'lo
36f0: 63 61 6c 74 69 6d 65 27 29 2c 22 0a 20 20 20 20  caltime'),".    
3700: 22 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e 74 20  "       comment 
3710: 7c 7c 20 27 20 28 62 79 20 27 20 7c 7c 20 75 73  || ' (by ' || us
3720: 65 72 20 7c 7c 20 27 29 27 2c 22 0a 20 20 20 20  er || ')',".    
3730: 22 20 20 20 20 20 20 20 28 53 45 4c 45 43 54 20  "       (SELECT 
3740: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 6c  count(*) FROM pl
3750: 69 6e 6b 20 57 48 45 52 45 20 70 69 64 3d 62 6c  ink WHERE pid=bl
3760: 6f 62 2e 72 69 64 20 41 4e 44 20 69 73 70 72 69  ob.rid AND ispri
3770: 6d 29 2c 22 0a 20 20 20 20 22 20 20 20 20 20 20  m),".    "      
3780: 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   (SELECT count(*
3790: 29 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45  ) FROM plink WHE
37a0: 52 45 20 63 69 64 3d 62 6c 6f 62 2e 72 69 64 29  RE cid=blob.rid)
37b0: 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 65 76  ".    "  FROM ev
37c0: 65 6e 74 2c 20 62 6c 6f 62 22 0a 20 20 20 20 22  ent, blob".    "
37d0: 20 57 48 45 52 45 20 65 76 65 6e 74 2e 74 79 70   WHERE event.typ
37e0: 65 3d 27 63 69 27 20 41 4e 44 20 62 6c 6f 62 2e  e='ci' AND blob.
37f0: 72 69 64 3d 65 76 65 6e 74 2e 6f 62 6a 69 64 22  rid=event.objid"
3800: 0a 20 20 20 20 22 20 20 20 41 4e 44 20 65 76 65  .    "   AND eve
3810: 6e 74 2e 6d 74 69 6d 65 20 25 73 20 25 73 22 2c  nt.mtime %s %s",
3820: 0a 20 20 20 20 28 6d 6f 64 65 3d 3d 31 20 7c 7c  .    (mode==1 ||
3830: 20 6d 6f 64 65 3d 3d 34 29 20 3f 20 22 3c 3d 22   mode==4) ? "<="
3840: 20 3a 20 22 3e 3d 22 2c 20 7a 44 61 74 65 0a 20   : ">=", zDate. 
3850: 20 29 3b 0a 20 20 69 66 28 20 6d 6f 64 65 3d 3d   );.  if( mode==
3860: 33 20 7c 7c 20 6d 6f 64 65 3d 3d 34 20 29 7b 0a  3 || mode==4 ){.
3870: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
3880: 63 28 22 43 52 45 41 54 45 20 54 45 4d 50 20 54  c("CREATE TEMP T
3890: 41 42 4c 45 20 6f 6b 28 72 69 64 20 49 4e 54 45  ABLE ok(rid INTE
38a0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 29  GER PRIMARY KEY)
38b0: 22 29 3b 0a 20 20 20 20 69 66 28 20 6d 6f 64 65  ");.    if( mode
38c0: 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 63 6f 6d  ==3 ){.      com
38d0: 70 75 74 65 5f 64 65 73 63 65 6e 64 65 6e 74 73  pute_descendents
38e0: 28 6f 62 6a 69 64 2c 20 6e 29 3b 0a 20 20 20 20  (objid, n);.    
38f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6d  }else{.      com
3900: 70 75 74 65 5f 61 6e 63 65 73 74 6f 72 73 28 6f  pute_ancestors(o
3910: 62 6a 69 64 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  bjid, n);.    }.
3920: 20 20 20 20 7a 53 51 4c 20 3d 20 6d 70 72 69 6e      zSQL = mprin
3930: 74 66 28 22 25 7a 20 41 4e 44 20 62 6c 6f 62 2e  tf("%z AND blob.
3940: 72 69 64 20 49 4e 20 6f 6b 22 2c 20 7a 53 51 4c  rid IN ok", zSQL
3950: 29 3b 0a 20 20 7d 0a 20 20 7a 53 51 4c 20 3d 20  );.  }.  zSQL = 
3960: 6d 70 72 69 6e 74 66 28 22 25 7a 20 4f 52 44 45  mprintf("%z ORDE
3970: 52 20 42 59 20 65 76 65 6e 74 2e 6d 74 69 6d 65  R BY event.mtime
3980: 20 44 45 53 43 22 2c 20 7a 53 51 4c 29 3b 0a 20   DESC", zSQL);. 
3990: 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20   db_prepare(&q, 
39a0: 7a 53 51 4c 29 3b 0a 20 20 70 72 69 6e 74 5f 74  zSQL);.  print_t
39b0: 69 6d 65 6c 69 6e 65 28 26 71 2c 20 6e 29 3b 0a  imeline(&q, n);.
39c0: 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71    db_finalize(&q
39d0: 29 3b 0a 7d 0a                                   );.}.