Hex Artifact Content
Not logged in

Artifact cbe381b2d7cb0ede7a372a58951cb3995f0a51ae:

File src/timeline.c part of check-in [bbdd4f9915] - Add some javascript to the timeline to gray out versions that are not part of the line that is moused over. Also include leaf, fork, and merge markers on the timeline. Experimental. by drh on 2007-08-27 04:03: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 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63   "config.h".#inc
03c0: 6c 75 64 65 20 22 74 69 6d 65 6c 69 6e 65 2e 68  lude "timeline.h
03d0: 22 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  "../*.** Generat
03e0: 65 20 61 20 68 79 70 65 72 6c 69 6e 6b 20 74 6f  e a hyperlink to
03f0: 20 61 20 76 65 72 73 69 6f 6e 2e 0a 2a 2f 0a 76   a version..*/.v
0400: 6f 69 64 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f  oid hyperlink_to
0410: 5f 75 75 69 64 28 63 6f 6e 73 74 20 63 68 61 72  _uuid(const char
0420: 20 2a 7a 55 75 69 64 29 7b 0a 20 20 63 68 61 72   *zUuid){.  char
0430: 20 7a 53 68 6f 72 74 55 75 69 64 5b 55 55 49 44   zShortUuid[UUID
0440: 5f 53 49 5a 45 2b 31 5d 3b 0a 20 20 73 70 72 69  _SIZE+1];.  spri
0450: 6e 74 66 28 7a 53 68 6f 72 74 55 75 69 64 2c 20  ntf(zShortUuid, 
0460: 22 25 2e 31 30 73 22 2c 20 7a 55 75 69 64 29 3b  "%.10s", zUuid);
0470: 0a 20 20 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f  .  if( g.okHisto
0480: 72 79 20 29 7b 0a 20 20 20 20 40 20 3c 61 20 68  ry ){.    @ <a h
0490: 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55  ref="%s(g.zBaseU
04a0: 52 4c 29 2f 76 69 6e 66 6f 2f 25 73 28 7a 55 75  RL)/vinfo/%s(zUu
04b0: 69 64 29 22 3e 5b 25 73 28 7a 53 68 6f 72 74 55  id)">[%s(zShortU
04c0: 75 69 64 29 5d 3c 2f 61 3e 0a 20 20 7d 65 6c 73  uid)]</a>.  }els
04d0: 65 7b 0a 20 20 20 20 40 20 3c 62 3e 5b 25 73 28  e{.    @ <b>[%s(
04e0: 7a 53 68 6f 72 74 55 75 69 64 29 5d 3c 2f 62 3e  zShortUuid)]</b>
04f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
0500: 6e 65 72 61 74 65 20 61 20 68 79 70 65 72 6c 69  nerate a hyperli
0510: 6e 6b 20 74 68 61 74 20 69 6e 76 6f 6b 65 73 20  nk that invokes 
0520: 6a 61 76 61 73 63 72 69 70 74 20 74 6f 20 68 69  javascript to hi
0530: 67 68 6c 69 67 68 74 0a 2a 2a 20 61 20 76 65 72  ghlight.** a ver
0540: 73 69 6f 6e 20 6f 6e 20 6d 6f 75 73 65 6f 76 65  sion on mouseove
0550: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 68 79 70 65 72  r..*/.void hyper
0560: 6c 69 6e 6b 5f 74 6f 5f 75 75 69 64 5f 77 69 74  link_to_uuid_wit
0570: 68 5f 68 69 67 68 6c 69 67 68 74 28 63 6f 6e 73  h_highlight(cons
0580: 74 20 63 68 61 72 20 2a 7a 55 75 69 64 2c 20 69  t char *zUuid, i
0590: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 7a  nt id){.  char z
05a0: 53 68 6f 72 74 55 75 69 64 5b 55 55 49 44 5f 53  ShortUuid[UUID_S
05b0: 49 5a 45 2b 31 5d 3b 0a 20 20 73 70 72 69 6e 74  IZE+1];.  sprint
05c0: 66 28 7a 53 68 6f 72 74 55 75 69 64 2c 20 22 25  f(zShortUuid, "%
05d0: 2e 31 30 73 22 2c 20 7a 55 75 69 64 29 3b 0a 20  .10s", zUuid);. 
05e0: 20 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f 72 79   if( g.okHistory
05f0: 20 29 7b 0a 20 20 20 20 40 20 3c 61 20 6f 6e 6d   ){.    @ <a onm
0600: 6f 75 73 65 6f 76 65 72 3d 27 68 69 6c 69 74 65  ouseover='hilite
0610: 28 22 6d 25 64 28 69 64 29 22 29 27 20 6f 6e 6d  ("m%d(id)")' onm
0620: 6f 75 73 65 6f 75 74 3d 27 75 6e 68 69 6c 69 74  ouseout='unhilit
0630: 65 28 22 6d 25 64 28 69 64 29 22 29 27 0a 20 20  e("m%d(id)")'.  
0640: 20 20 40 20 20 20 20 68 72 65 66 3d 22 25 73 28    @    href="%s(
0650: 67 2e 7a 42 61 73 65 55 52 4c 29 2f 76 69 6e 66  g.zBaseURL)/vinf
0660: 6f 2f 25 73 28 7a 55 75 69 64 29 22 3e 5b 25 73  o/%s(zUuid)">[%s
0670: 28 7a 53 68 6f 72 74 55 75 69 64 29 5d 3c 2f 61  (zShortUuid)]</a
0680: 3e 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 40  >.  }else{.    @
0690: 20 3c 62 20 6f 6e 6d 6f 75 73 65 6f 76 65 72 3d   <b onmouseover=
06a0: 27 68 69 6c 69 74 65 28 22 6d 25 64 28 69 64 29  'hilite("m%d(id)
06b0: 22 29 27 20 6f 6e 6d 6f 75 73 65 6f 75 74 3d 27  ")' onmouseout='
06c0: 75 6e 68 69 6c 69 74 65 28 22 6d 25 64 28 69 64  unhilite("m%d(id
06d0: 29 22 29 27 3e 0a 20 20 20 20 40 20 5b 25 73 28  )")'>.    @ [%s(
06e0: 7a 53 68 6f 72 74 55 75 69 64 29 5d 3c 2f 62 3e  zShortUuid)]</b>
06f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
0700: 6e 65 72 61 74 65 20 61 20 68 79 70 65 72 6c 69  nerate a hyperli
0710: 6e 6b 20 74 6f 20 61 20 64 69 66 66 20 62 65 74  nk to a diff bet
0720: 77 65 65 6e 20 74 77 6f 20 76 65 72 73 69 6f 6e  ween two version
0730: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 68 79 70 65 72  s..*/.void hyper
0740: 6c 69 6e 6b 5f 74 6f 5f 64 69 66 66 28 63 6f 6e  link_to_diff(con
0750: 73 74 20 63 68 61 72 20 2a 7a 56 31 2c 20 63 6f  st char *zV1, co
0760: 6e 73 74 20 63 68 61 72 20 2a 7a 56 32 29 7b 0a  nst char *zV2){.
0770: 20 20 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f 72    if( g.okHistor
0780: 79 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 56 32  y ){.    if( zV2
0790: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 40 20 3c  ==0 ){.      @ <
07a0: 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61  a href="%s(g.zBa
07b0: 73 65 55 52 4c 29 2f 64 69 66 66 3f 76 32 3d 25  seURL)/diff?v2=%
07c0: 73 28 7a 56 31 29 22 3e 5b 64 69 66 66 5d 3c 2f  s(zV1)">[diff]</
07d0: 61 3e 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  a>.    }else{.  
07e0: 20 20 20 20 40 20 3c 61 20 68 72 65 66 3d 22 25      @ <a href="%
07f0: 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 64 69  s(g.zBaseURL)/di
0800: 66 66 3f 76 31 3d 25 73 28 7a 56 31 29 26 76 32  ff?v1=%s(zV1)&v2
0810: 3d 25 73 28 7a 56 32 29 22 3e 5b 64 69 66 66 5d  =%s(zV2)">[diff]
0820: 3c 2f 61 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  </a>.    }.  }.}
0830: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61  ../*.** Output a
0840: 20 74 69 6d 65 6c 69 6e 65 20 69 6e 20 74 68 65   timeline in the
0850: 20 77 65 62 20 66 6f 72 6d 61 74 20 67 69 76 65   web format give
0860: 6e 20 61 20 71 75 65 72 79 2e 20 20 54 68 65 20  n a query.  The 
0870: 71 75 65 72 79 0a 2a 2a 20 73 68 6f 75 6c 64 20  query.** should 
0880: 72 65 74 75 72 6e 20 34 20 63 6f 6c 75 6d 6e 73  return 4 columns
0890: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 30 2e 20 20 72  :.**.**    0.  r
08a0: 69 64 0a 2a 2a 20 20 20 20 31 2e 20 20 55 55 49  id.**    1.  UUI
08b0: 44 0a 2a 2a 20 20 20 20 32 2e 20 20 44 61 74 65  D.**    2.  Date
08c0: 2f 54 69 6d 65 0a 2a 2a 20 20 20 20 33 2e 20 20  /Time.**    3.  
08d0: 43 6f 6d 6d 65 6e 74 20 73 74 72 69 6e 67 0a 2a  Comment string.*
08e0: 2a 20 20 20 20 34 2e 20 20 55 73 65 72 0a 2a 2a  *    4.  User.**
08f0: 20 20 20 20 35 2e 20 20 4e 75 6d 62 65 72 20 6f      5.  Number o
0900: 66 20 6e 6f 6e 2d 6d 65 72 67 65 20 63 68 69 6c  f non-merge chil
0910: 64 72 65 6e 0a 2a 2a 20 20 20 20 36 2e 20 20 4e  dren.**    6.  N
0920: 75 6d 62 65 72 20 6f 66 20 70 61 72 65 6e 74 73  umber of parents
0930: 0a 2a 2a 20 20 20 20 37 2e 20 20 54 72 75 65 20  .**    7.  True 
0940: 69 66 20 69 73 20 61 20 6c 65 61 66 0a 2a 2f 0a  if is a leaf.*/.
0950: 76 6f 69 64 20 77 77 77 5f 70 72 69 6e 74 5f 74  void www_print_t
0960: 69 6d 65 6c 69 6e 65 28 0a 20 20 53 74 6d 74 20  imeline(.  Stmt 
0970: 2a 70 51 75 65 72 79 2c 0a 20 20 63 68 61 72 20  *pQuery,.  char 
0980: 2a 7a 4c 61 73 74 44 61 74 65 2c 0a 20 20 69 6e  *zLastDate,.  in
0990: 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 69  t (*xCallback)(i
09a0: 6e 74 2c 20 42 6c 6f 62 2a 29 2c 0a 20 20 42 6c  nt, Blob*),.  Bl
09b0: 6f 62 20 2a 70 41 72 67 0a 20 29 7b 0a 20 20 63  ob *pArg. ){.  c
09c0: 68 61 72 20 7a 50 72 65 76 44 61 74 65 5b 32 30  har zPrevDate[20
09d0: 5d 3b 0a 20 20 7a 50 72 65 76 44 61 74 65 5b 30  ];.  zPrevDate[0
09e0: 5d 20 3d 20 30 3b 0a 20 20 40 20 3c 74 61 62 6c  ] = 0;.  @ <tabl
09f0: 65 20 63 65 6c 6c 73 70 61 63 69 6e 67 3d 30 20  e cellspacing=0 
0a00: 62 6f 72 64 65 72 3d 30 20 63 65 6c 6c 70 61 64  border=0 cellpad
0a10: 64 69 6e 67 3d 30 3e 0a 20 20 77 68 69 6c 65 28  ding=0>.  while(
0a20: 20 64 62 5f 73 74 65 70 28 70 51 75 65 72 79 29   db_step(pQuery)
0a30: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
0a40: 20 20 20 20 69 6e 74 20 72 69 64 20 3d 20 64 62      int rid = db
0a50: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 51 75 65  _column_int(pQue
0a60: 72 79 2c 20 30 29 3b 0a 20 20 20 20 69 6e 74 20  ry, 0);.    int 
0a70: 6e 50 43 68 69 6c 64 20 3d 20 64 62 5f 63 6f 6c  nPChild = db_col
0a80: 75 6d 6e 5f 69 6e 74 28 70 51 75 65 72 79 2c 20  umn_int(pQuery, 
0a90: 35 29 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72  5);.    int nPar
0aa0: 65 6e 74 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ent = db_column_
0ab0: 69 6e 74 28 70 51 75 65 72 79 2c 20 36 29 3b 0a  int(pQuery, 6);.
0ac0: 20 20 20 20 69 6e 74 20 69 73 4c 65 61 66 20 3d      int isLeaf =
0ad0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70   db_column_int(p
0ae0: 51 75 65 72 79 2c 20 37 29 3b 0a 20 20 20 20 63  Query, 7);.    c
0af0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 65  onst char *zDate
0b00: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
0b10: 74 28 70 51 75 65 72 79 2c 20 32 29 3b 0a 20 20  t(pQuery, 2);.  
0b20: 20 20 69 66 28 20 78 43 61 6c 6c 62 61 63 6b 20    if( xCallback 
0b30: 29 7b 0a 20 20 20 20 20 20 78 43 61 6c 6c 62 61  ){.      xCallba
0b40: 63 6b 28 72 69 64 2c 20 70 41 72 67 29 3b 0a 20  ck(rid, pArg);. 
0b50: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d     }.    if( mem
0b60: 63 6d 70 28 7a 44 61 74 65 2c 20 7a 50 72 65 76  cmp(zDate, zPrev
0b70: 44 61 74 65 2c 20 31 30 29 20 29 7b 0a 20 20 20  Date, 10) ){.   
0b80: 20 20 20 73 70 72 69 6e 74 66 28 7a 50 72 65 76     sprintf(zPrev
0b90: 44 61 74 65 2c 20 22 25 2e 31 30 73 22 2c 20 7a  Date, "%.10s", z
0ba0: 44 61 74 65 29 3b 0a 20 20 20 20 20 20 40 20 3c  Date);.      @ <
0bb0: 74 72 3e 3c 74 64 20 63 6f 6c 73 70 61 6e 3d 33  tr><td colspan=3
0bc0: 3e 0a 20 20 20 20 20 20 40 20 3c 74 61 62 6c 65  >.      @ <table
0bd0: 20 63 65 6c 6c 70 61 64 64 69 6e 67 3d 32 20 62   cellpadding=2 b
0be0: 6f 72 64 65 72 3d 30 3e 0a 20 20 20 20 20 20 40  order=0>.      @
0bf0: 20 3c 74 72 3e 3c 74 64 20 62 67 63 6f 6c 6f 72   <tr><td bgcolor
0c00: 3d 22 23 61 30 62 35 66 34 22 20 63 6c 61 73 73  ="#a0b5f4" class
0c10: 3d 22 62 6f 72 64 65 72 31 22 3e 0a 20 20 20 20  ="border1">.    
0c20: 20 20 40 20 3c 74 61 62 6c 65 20 63 65 6c 6c 70    @ <table cellp
0c30: 61 64 64 69 6e 67 3d 32 20 63 65 6c 6c 73 70 61  adding=2 cellspa
0c40: 63 69 6e 67 3d 30 20 62 6f 72 64 65 72 3d 30 3e  cing=0 border=0>
0c50: 3c 74 72 3e 0a 20 20 20 20 20 20 40 20 3c 74 64  <tr>.      @ <td
0c60: 20 62 67 63 6f 6c 6f 72 3d 22 23 64 30 64 39 66   bgcolor="#d0d9f
0c70: 34 22 20 63 6c 61 73 73 3d 22 62 6b 67 6e 64 31  4" class="bkgnd1
0c80: 22 3e 25 73 28 7a 50 72 65 76 44 61 74 65 29 3c  ">%s(zPrevDate)<
0c90: 2f 74 64 3e 0a 20 20 20 20 20 20 40 20 3c 2f 74  /td>.      @ </t
0ca0: 72 3e 3c 2f 74 61 62 6c 65 3e 0a 20 20 20 20 20  r></table>.     
0cb0: 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 3c 2f 74   @ </td></tr></t
0cc0: 61 62 6c 65 3e 0a 20 20 20 20 20 20 40 20 3c 2f  able>.      @ </
0cd0: 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 7d 0a 20  td></tr>.    }. 
0ce0: 20 20 20 40 20 3c 74 72 20 69 64 3d 22 6d 25 64     @ <tr id="m%d
0cf0: 28 72 69 64 29 22 20 6f 6e 6d 6f 75 73 65 6f 76  (rid)" onmouseov
0d00: 65 72 3d 27 78 69 6e 28 22 6d 25 64 28 72 69 64  er='xin("m%d(rid
0d10: 29 22 29 27 0a 20 20 20 20 40 20 20 20 20 20 6f  )")'.    @     o
0d20: 6e 6d 6f 75 73 65 6f 75 74 3d 27 78 6f 75 74 28  nmouseout='xout(
0d30: 22 6d 25 64 28 72 69 64 29 22 29 27 3e 0a 20 20  "m%d(rid)")'>.  
0d40: 20 20 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22    @ <td valign="
0d50: 74 6f 70 22 3e 25 73 28 26 7a 44 61 74 65 5b 31  top">%s(&zDate[1
0d60: 31 5d 29 3c 2f 74 64 3e 0a 20 20 20 20 40 20 3c  1])</td>.    @ <
0d70: 74 64 20 77 69 64 74 68 3d 22 32 30 22 3e 3c 2f  td width="20"></
0d80: 74 64 3e 0a 20 20 20 20 40 20 3c 74 64 20 76 61  td>.    @ <td va
0d90: 6c 69 67 6e 3d 22 74 6f 70 22 20 61 6c 69 67 6e  lign="top" align
0da0: 3d 22 6c 65 66 74 22 3e 0a 20 20 20 20 68 79 70  ="left">.    hyp
0db0: 65 72 6c 69 6e 6b 5f 74 6f 5f 75 75 69 64 28 64  erlink_to_uuid(d
0dc0: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51  b_column_text(pQ
0dd0: 75 65 72 79 2c 31 29 29 3b 0a 20 20 20 20 40 20  uery,1));.    @ 
0de0: 25 68 28 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78  %h(db_column_tex
0df0: 74 28 70 51 75 65 72 79 2c 33 29 29 0a 20 20 20  t(pQuery,3)).   
0e00: 20 69 66 28 20 6e 50 61 72 65 6e 74 3e 31 20 29   if( nParent>1 )
0e10: 7b 0a 20 20 20 20 20 20 53 74 6d 74 20 71 3b 0a  {.      Stmt q;.
0e20: 20 20 20 20 20 20 40 20 3c 62 3e 4d 65 72 67 65        @ <b>Merge
0e30: 3c 2f 62 3e 20 66 72 6f 6d 0a 20 20 20 20 20 20  </b> from.      
0e40: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20  db_prepare(&q,. 
0e50: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 72         "SELECT r
0e60: 69 64 2c 20 75 75 69 64 20 46 52 4f 4d 20 70 6c  id, uuid FROM pl
0e70: 69 6e 6b 2c 20 62 6c 6f 62 22 0a 20 20 20 20 20  ink, blob".     
0e80: 20 20 20 22 20 57 48 45 52 45 20 70 6c 69 6e 6b     " WHERE plink
0e90: 2e 63 69 64 3d 25 64 20 41 4e 44 20 62 6c 6f 62  .cid=%d AND blob
0ea0: 2e 72 69 64 3d 70 6c 69 6e 6b 2e 70 69 64 20 41  .rid=plink.pid A
0eb0: 4e 44 20 70 6c 69 6e 6b 2e 69 73 70 72 69 6d 3d  ND plink.isprim=
0ec0: 30 22 2c 0a 20 20 20 20 20 20 20 20 72 69 64 0a  0",.        rid.
0ed0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 77        );.      w
0ee0: 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71  hile( db_step(&q
0ef0: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
0f00: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d 72 69  .        int mri
0f10: 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e  d = db_column_in
0f20: 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 20 20  t(&q, 0);.      
0f30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
0f40: 75 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  uid = db_column_
0f50: 74 65 78 74 28 26 71 2c 20 31 29 3b 0a 20 20 20  text(&q, 1);.   
0f60: 20 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74       hyperlink_t
0f70: 6f 5f 75 75 69 64 5f 77 69 74 68 5f 68 69 67 68  o_uuid_with_high
0f80: 6c 69 67 68 74 28 7a 55 75 69 64 2c 20 6d 72 69  light(zUuid, mri
0f90: 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
0fa0: 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71    db_finalize(&q
0fb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
0fc0: 20 6e 50 43 68 69 6c 64 3e 31 20 29 7b 0a 20 20   nPChild>1 ){.  
0fd0: 20 20 20 20 53 74 6d 74 20 71 3b 0a 20 20 20 20      Stmt q;.    
0fe0: 20 20 40 20 3c 62 3e 46 6f 72 6b 3c 2f 62 3e 20    @ <b>Fork</b> 
0ff0: 74 6f 0a 20 20 20 20 20 20 64 62 5f 70 72 65 70  to.      db_prep
1000: 61 72 65 28 26 71 2c 0a 20 20 20 20 20 20 20 20  are(&q,.        
1010: 22 53 45 4c 45 43 54 20 72 69 64 2c 20 75 75 69  "SELECT rid, uui
1020: 64 20 46 52 4f 4d 20 70 6c 69 6e 6b 2c 20 62 6c  d FROM plink, bl
1030: 6f 62 22 0a 20 20 20 20 20 20 20 20 22 20 57 48  ob".        " WH
1040: 45 52 45 20 70 6c 69 6e 6b 2e 70 69 64 3d 25 64  ERE plink.pid=%d
1050: 20 41 4e 44 20 62 6c 6f 62 2e 72 69 64 3d 70 6c   AND blob.rid=pl
1060: 69 6e 6b 2e 63 69 64 20 41 4e 44 20 70 6c 69 6e  ink.cid AND plin
1070: 6b 2e 69 73 70 72 69 6d 3e 30 22 2c 0a 20 20 20  k.isprim>0",.   
1080: 20 20 20 20 20 72 69 64 0a 20 20 20 20 20 20 29       rid.      )
1090: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 64  ;.      while( d
10a0: 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49  b_step(&q)==SQLI
10b0: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
10c0: 20 20 69 6e 74 20 66 72 69 64 20 3d 20 64 62 5f    int frid = db_
10d0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 30  column_int(&q, 0
10e0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
10f0: 20 63 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 64   char *zUuid = d
1100: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
1110: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 68 79  , 1);.        hy
1120: 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 75 69 64 5f  perlink_to_uuid_
1130: 77 69 74 68 5f 68 69 67 68 6c 69 67 68 74 28 7a  with_highlight(z
1140: 55 75 69 64 2c 20 66 72 69 64 29 3b 0a 20 20 20  Uuid, frid);.   
1150: 20 20 20 7d 0a 20 20 20 20 20 20 64 62 5f 66 69     }.      db_fi
1160: 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 20 20  nalize(&q);.    
1170: 7d 0a 20 20 20 20 69 66 28 20 69 73 4c 65 61 66  }.    if( isLeaf
1180: 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 62 3e 4c   ){.      @ <b>L
1190: 65 61 66 3c 2f 62 3e 0a 20 20 20 20 7d 0a 20 20  eaf</b>.    }.  
11a0: 20 20 40 20 28 62 79 20 25 68 28 64 62 5f 63 6f    @ (by %h(db_co
11b0: 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79  lumn_text(pQuery
11c0: 2c 34 29 29 29 3c 2f 74 64 3e 3c 2f 74 72 3e 0a  ,4)))</td></tr>.
11d0: 20 20 20 20 69 66 28 20 7a 4c 61 73 74 44 61 74      if( zLastDat
11e0: 65 20 29 7b 0a 20 20 20 20 20 20 73 74 72 63 70  e ){.      strcp
11f0: 79 28 7a 4c 61 73 74 44 61 74 65 2c 20 7a 44 61  y(zLastDate, zDa
1200: 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  te);.    }.  }. 
1210: 20 40 20 3c 2f 74 61 62 6c 65 3e 0a 7d 0a 0a 2f   @ </table>.}../
1220: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 6a 61  *.** Generate ja
1230: 76 61 73 63 72 69 70 74 20 63 6f 64 65 20 74 68  vascript code th
1240: 61 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 70  at records the p
1250: 61 72 65 6e 74 73 20 61 6e 64 20 63 68 69 6c 64  arents and child
1260: 72 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 76 65  ren.** of the ve
1270: 72 73 69 6f 6e 20 72 69 64 2e 0a 2a 2f 0a 73 74  rsion rid..*/.st
1280: 61 74 69 63 20 69 6e 74 20 73 61 76 65 5f 70 61  atic int save_pa
1290: 72 65 6e 74 61 67 65 5f 6a 61 76 61 73 63 72 69  rentage_javascri
12a0: 70 74 28 69 6e 74 20 72 69 64 2c 20 42 6c 6f 62  pt(int rid, Blob
12b0: 20 2a 70 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74   *pOut){.  const
12c0: 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 53   char *zSep;.  S
12d0: 74 6d 74 20 71 3b 0a 0a 20 20 64 62 5f 70 72 65  tmt q;..  db_pre
12e0: 70 61 72 65 28 26 71 2c 20 22 53 45 4c 45 43 54  pare(&q, "SELECT
12f0: 20 70 69 64 20 46 52 4f 4d 20 70 6c 69 6e 6b 20   pid FROM plink 
1300: 57 48 45 52 45 20 63 69 64 3d 25 64 20 41 4e 44  WHERE cid=%d AND
1310: 20 69 73 70 72 69 6d 21 3d 30 22 2c 20 72 69 64   isprim!=0", rid
1320: 29 3b 0a 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a  );.  zSep = "";.
1330: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70    blob_appendf(p
1340: 4f 75 74 2c 20 22 70 61 72 65 6e 74 6f 66 5b 5c  Out, "parentof[\
1350: 22 6d 25 64 5c 22 5d 20 3d 20 5b 22 29 3b 0a 20  "m%d\"] = [");. 
1360: 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28   while( db_step(
1370: 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  &q)==SQLITE_ROW 
1380: 29 7b 0a 20 20 20 20 69 6e 74 20 70 69 64 20 3d  ){.    int pid =
1390: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26   db_column_int(&
13a0: 71 2c 20 30 29 3b 0a 20 20 20 20 62 6c 6f 62 5f  q, 0);.    blob_
13b0: 61 70 70 65 6e 64 66 28 70 4f 75 74 2c 20 22 25  appendf(pOut, "%
13c0: 73 5c 22 6d 25 64 5c 22 22 2c 20 7a 53 65 70 2c  s\"m%d\"", zSep,
13d0: 20 70 69 64 29 3b 0a 20 20 20 20 7a 53 65 70 20   pid);.    zSep 
13e0: 3d 20 22 2c 22 3b 0a 20 20 7d 0a 20 20 64 62 5f  = ",";.  }.  db_
13f0: 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20  finalize(&q);.  
1400: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 4f 75  blob_appendf(pOu
1410: 74 2c 20 22 5d 3b 5c 6e 22 29 3b 0a 20 20 64 62  t, "];\n");.  db
1420: 5f 70 72 65 70 61 72 65 28 26 71 2c 20 22 53 45  _prepare(&q, "SE
1430: 4c 45 43 54 20 63 69 64 20 46 52 4f 4d 20 70 6c  LECT cid FROM pl
1440: 69 6e 6b 20 57 48 45 52 45 20 70 69 64 3d 25 64  ink WHERE pid=%d
1450: 20 41 4e 44 20 69 73 70 72 69 6d 21 3d 30 22 2c   AND isprim!=0",
1460: 20 72 69 64 29 3b 0a 20 20 7a 53 65 70 20 3d 20   rid);.  zSep = 
1470: 22 22 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e  "";.  blob_appen
1480: 64 66 28 70 4f 75 74 2c 20 22 63 68 69 6c 64 6f  df(pOut, "childo
1490: 66 5b 5c 22 6d 25 64 5c 22 5d 20 3d 20 5b 22 29  f[\"m%d\"] = [")
14a0: 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74  ;.  while( db_st
14b0: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(&q)==SQLITE_R
14c0: 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 69  OW ){.    int pi
14d0: 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e  d = db_column_in
14e0: 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 62 6c  t(&q, 0);.    bl
14f0: 6f 62 5f 61 70 70 65 6e 64 66 28 70 4f 75 74 2c  ob_appendf(pOut,
1500: 20 22 25 73 5c 22 6d 25 64 5c 22 22 2c 20 7a 53   "%s\"m%d\"", zS
1510: 65 70 2c 20 70 69 64 29 3b 0a 20 20 20 20 7a 53  ep, pid);.    zS
1520: 65 70 20 3d 20 22 2c 22 3b 0a 20 20 7d 0a 20 20  ep = ",";.  }.  
1530: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b  db_finalize(&q);
1540: 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28  .  blob_appendf(
1550: 70 4f 75 74 2c 20 22 5d 3b 5c 6e 22 29 3b 0a 20  pOut, "];\n");. 
1560: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1570: 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 74 69 6d  .** WEBPAGE: tim
1580: 65 6c 69 6e 65 0a 2a 2f 0a 76 6f 69 64 20 70 61  eline.*/.void pa
1590: 67 65 5f 74 69 6d 65 6c 69 6e 65 28 76 6f 69 64  ge_timeline(void
15a0: 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 63  ){.  Stmt q;.  c
15b0: 68 61 72 20 2a 7a 53 51 4c 3b 0a 20 20 42 6c 6f  har *zSQL;.  Blo
15c0: 62 20 73 63 72 69 70 74 49 6e 69 74 3b 0a 20 20  b scriptInit;.  
15d0: 63 68 61 72 20 7a 44 61 74 65 5b 31 30 30 5d 3b  char zDate[100];
15e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
15f0: 53 74 61 72 74 20 3d 20 50 28 22 64 22 29 3b 0a  Start = P("d");.
1600: 20 20 69 6e 74 20 6e 45 6e 74 72 79 20 3d 20 61    int nEntry = a
1610: 74 6f 69 28 50 44 28 22 6e 22 2c 22 32 35 22 29  toi(PD("n","25")
1620: 29 3b 0a 0a 20 20 2f 2a 20 54 6f 20 76 69 65 77  );..  /* To view
1630: 20 74 68 65 20 74 69 6d 65 6c 69 6e 65 2c 20 6d   the timeline, m
1640: 75 73 74 20 68 61 76 65 20 70 65 72 6d 69 73 73  ust have permiss
1650: 69 6f 6e 20 74 6f 20 72 65 61 64 20 70 72 6f 6a  ion to read proj
1660: 65 63 74 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20  ect data..  */. 
1670: 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65   login_check_cre
1680: 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66  dentials();.  if
1690: 28 20 21 67 2e 6f 6b 52 65 61 64 20 29 7b 20 6c  ( !g.okRead ){ l
16a0: 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72  ogin_needed(); r
16b0: 65 74 75 72 6e 3b 20 7d 0a 0a 20 20 73 74 79 6c  eturn; }..  styl
16c0: 65 5f 68 65 61 64 65 72 28 22 54 69 6d 65 6c 69  e_header("Timeli
16d0: 6e 65 22 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f  ne");.  if( !g.o
16e0: 6b 48 69 73 74 6f 72 79 20 26 26 0a 20 20 20 20  kHistory &&.    
16f0: 20 20 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c    db_exists("SEL
1700: 45 43 54 20 31 20 46 52 4f 4d 20 75 73 65 72 22  ECT 1 FROM user"
1710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1720: 20 22 20 57 48 45 52 45 20 6c 6f 67 69 6e 3d 27   " WHERE login='
1730: 61 6e 6f 6e 79 6d 6f 75 73 27 22 0a 20 20 20 20  anonymous'".    
1740: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20              "   
1750: 41 4e 44 20 63 61 70 20 4c 49 4b 45 20 27 25 25  AND cap LIKE '%%
1760: 68 25 25 27 22 29 20 29 7b 0a 20 20 20 20 40 20  h%%'") ){.    @ 
1770: 3c 70 3e 3c 62 3e 4e 6f 74 65 3a 3c 2f 62 3e 20  <p><b>Note:</b> 
1780: 59 6f 75 20 77 69 6c 6c 20 62 65 20 61 62 6c 65  You will be able
1790: 20 74 6f 20 61 63 63 65 73 73 20 3c 75 3e 6d 75   to access <u>mu
17a0: 63 68 3c 2f 75 3e 20 6d 6f 72 65 0a 20 20 20 20  ch</u> more.    
17b0: 40 20 68 69 73 74 6f 72 69 63 61 6c 20 69 6e 66  @ historical inf
17c0: 6f 72 6d 61 74 69 6f 6e 20 69 66 20 3c 61 20 68  ormation if <a h
17d0: 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55  ref="%s(g.zBaseU
17e0: 52 4c 29 2f 6c 6f 67 69 6e 22 3e 6c 6f 67 69 6e  RL)/login">login
17f0: 3c 2f 61 3e 2e 3c 2f 70 3e 0a 20 20 7d 0a 20 20  </a>.</p>.  }.  
1800: 7a 53 51 4c 20 3d 20 6d 70 72 69 6e 74 66 28 0a  zSQL = mprintf(.
1810: 20 20 20 20 22 53 45 4c 45 43 54 20 62 6c 6f 62      "SELECT blob
1820: 2e 72 69 64 2c 20 75 75 69 64 2c 20 64 61 74 65  .rid, uuid, date
1830: 74 69 6d 65 28 65 76 65 6e 74 2e 6d 74 69 6d 65  time(event.mtime
1840: 2c 27 6c 6f 63 61 6c 74 69 6d 65 27 29 2c 20 63  ,'localtime'), c
1850: 6f 6d 6d 65 6e 74 2c 20 75 73 65 72 2c 22 0a 20  omment, user,". 
1860: 20 20 20 22 20 20 20 20 20 20 20 28 53 45 4c 45     "       (SELE
1870: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1880: 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 70 69 64   plink WHERE pid
1890: 3d 62 6c 6f 62 2e 72 69 64 20 41 4e 44 20 69 73  =blob.rid AND is
18a0: 70 72 69 6d 3d 31 29 2c 22 0a 20 20 20 20 22 20  prim=1),".    " 
18b0: 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 63 6f        (SELECT co
18c0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 6c 69 6e  unt(*) FROM plin
18d0: 6b 20 57 48 45 52 45 20 63 69 64 3d 62 6c 6f 62  k WHERE cid=blob
18e0: 2e 72 69 64 29 2c 22 0a 20 20 20 20 22 20 20 20  .rid),".    "   
18f0: 20 20 20 20 4e 4f 54 20 45 58 49 53 54 53 20 28      NOT EXISTS (
1900: 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 70 6c  SELECT 1 FROM pl
1910: 69 6e 6b 20 57 48 45 52 45 20 70 69 64 3d 62 6c  ink WHERE pid=bl
1920: 6f 62 2e 72 69 64 29 22 0a 20 20 20 20 22 20 20  ob.rid)".    "  
1930: 46 52 4f 4d 20 65 76 65 6e 74 2c 20 62 6c 6f 62  FROM event, blob
1940: 22 0a 20 20 20 20 22 20 57 48 45 52 45 20 65 76  ".    " WHERE ev
1950: 65 6e 74 2e 74 79 70 65 3d 27 63 69 27 20 41 4e  ent.type='ci' AN
1960: 44 20 62 6c 6f 62 2e 72 69 64 3d 65 76 65 6e 74  D blob.rid=event
1970: 2e 6f 62 6a 69 64 22 0a 20 20 29 3b 0a 20 20 69  .objid".  );.  i
1980: 66 28 20 7a 53 74 61 72 74 20 29 7b 0a 20 20 20  f( zStart ){.   
1990: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
19a0: 7a 53 74 61 72 74 5b 30 5d 29 20 29 7b 20 7a 53  zStart[0]) ){ zS
19b0: 74 61 72 74 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  tart++; }.    if
19c0: 28 20 7a 53 74 61 72 74 5b 30 5d 20 29 7b 0a 20  ( zStart[0] ){. 
19d0: 20 20 20 20 20 7a 53 51 4c 20 3d 20 6d 70 72 69       zSQL = mpri
19e0: 6e 74 66 28 22 25 7a 20 41 4e 44 20 65 76 65 6e  ntf("%z AND even
19f0: 74 2e 6d 74 69 6d 65 3c 3d 6a 75 6c 69 61 6e 64  t.mtime<=juliand
1a00: 61 79 28 25 51 2c 20 27 6c 6f 63 61 6c 74 69 6d  ay(%Q, 'localtim
1a10: 65 27 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  e')",.          
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 51 4c              zSQL
1a30: 2c 20 7a 53 74 61 72 74 29 3b 0a 20 20 20 20 7d  , zStart);.    }
1a40: 0a 20 20 7d 0a 20 20 7a 53 51 4c 20 3d 20 6d 70  .  }.  zSQL = mp
1a50: 72 69 6e 74 66 28 22 25 7a 20 4f 52 44 45 52 20  rintf("%z ORDER 
1a60: 42 59 20 65 76 65 6e 74 2e 6d 74 69 6d 65 20 44  BY event.mtime D
1a70: 45 53 43 20 4c 49 4d 49 54 20 25 64 22 2c 20 7a  ESC LIMIT %d", z
1a80: 53 51 4c 2c 20 6e 45 6e 74 72 79 29 3b 0a 20 20  SQL, nEntry);.  
1a90: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 7a  db_prepare(&q, z
1aa0: 53 51 4c 29 3b 0a 20 20 66 72 65 65 28 7a 53 51  SQL);.  free(zSQ
1ab0: 4c 29 3b 0a 20 20 7a 44 61 74 65 5b 30 5d 20 3d  L);.  zDate[0] =
1ac0: 20 30 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28   0;.  blob_zero(
1ad0: 26 73 63 72 69 70 74 49 6e 69 74 29 3b 0a 20 20  &scriptInit);.  
1ae0: 77 77 77 5f 70 72 69 6e 74 5f 74 69 6d 65 6c 69  www_print_timeli
1af0: 6e 65 28 26 71 2c 20 7a 44 61 74 65 2c 20 73 61  ne(&q, zDate, sa
1b00: 76 65 5f 70 61 72 65 6e 74 61 67 65 5f 6a 61 76  ve_parentage_jav
1b10: 61 73 63 72 69 70 74 2c 20 26 73 63 72 69 70 74  ascript, &script
1b20: 49 6e 69 74 29 3b 0a 20 20 64 62 5f 66 69 6e 61  Init);.  db_fina
1b30: 6c 69 7a 65 28 26 71 29 3b 0a 20 20 69 66 28 20  lize(&q);.  if( 
1b40: 7a 53 74 61 72 74 3d 3d 30 20 29 7b 0a 20 20 20  zStart==0 ){.   
1b50: 20 7a 53 74 61 72 74 20 3d 20 7a 44 61 74 65 3b   zStart = zDate;
1b60: 0a 20 20 7d 0a 20 20 40 20 3c 73 63 72 69 70 74  .  }.  @ <script
1b70: 3e 0a 20 20 40 20 76 61 72 20 70 61 72 65 6e 74  >.  @ var parent
1b80: 6f 66 20 3d 20 6e 65 77 20 4f 62 6a 65 63 74 28  of = new Object(
1b90: 29 3b 0a 20 20 40 20 76 61 72 20 63 68 69 6c 64  );.  @ var child
1ba0: 6f 66 20 3d 20 6e 65 77 20 4f 62 6a 65 63 74 28  of = new Object(
1bb0: 29 3b 0a 20 20 63 67 69 5f 61 70 70 65 6e 64 5f  );.  cgi_append_
1bc0: 63 6f 6e 74 65 6e 74 28 62 6c 6f 62 5f 62 75 66  content(blob_buf
1bd0: 66 65 72 28 26 73 63 72 69 70 74 49 6e 69 74 29  fer(&scriptInit)
1be0: 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 73 63 72  , blob_size(&scr
1bf0: 69 70 74 49 6e 69 74 29 29 3b 0a 20 20 62 6c 6f  iptInit));.  blo
1c00: 62 5f 72 65 73 65 74 28 26 73 63 72 69 70 74 49  b_reset(&scriptI
1c10: 6e 69 74 29 3b 0a 20 20 40 20 66 75 6e 63 74 69  nit);.  @ functi
1c20: 6f 6e 20 73 65 74 61 6c 6c 28 76 61 6c 75 65 29  on setall(value)
1c30: 7b 0a 20 20 40 20 20 20 66 6f 72 28 76 61 72 20  {.  @   for(var 
1c40: 78 20 69 6e 20 70 61 72 65 6e 74 6f 66 29 7b 0a  x in parentof){.
1c50: 20 20 40 20 20 20 20 20 73 65 74 6f 6e 65 28 78    @     setone(x
1c60: 2c 76 61 6c 75 65 29 3b 0a 20 20 40 20 20 20 7d  ,value);.  @   }
1c70: 0a 20 20 40 20 7d 0a 20 20 40 20 66 75 6e 63 74  .  @ }.  @ funct
1c80: 69 6f 6e 20 73 65 74 6f 6e 65 28 69 64 2c 20 6f  ion setone(id, o
1c90: 6e 6f 66 66 29 7b 0a 20 20 40 20 20 20 76 61 72  noff){.  @   var
1ca0: 20 77 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65   w = document.ge
1cb0: 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 69 64 29  tElementById(id)
1cc0: 3b 0a 20 20 40 20 20 20 69 66 28 20 6f 6e 6f 66  ;.  @   if( onof
1cd0: 66 3d 3d 31 20 29 7b 0a 20 20 40 20 20 20 20 20  f==1 ){.  @     
1ce0: 77 2e 73 74 79 6c 65 2e 63 6f 6c 6f 72 20 3d 20  w.style.color = 
1cf0: 22 23 30 30 30 30 30 30 22 3b 0a 20 20 40 20 20  "#000000";.  @  
1d00: 20 7d 65 6c 73 65 7b 0a 20 20 40 20 20 20 20 20   }else{.  @     
1d10: 77 2e 73 74 79 6c 65 2e 63 6f 6c 6f 72 20 3d 20  w.style.color = 
1d20: 22 23 61 30 61 30 61 30 22 3b 0a 20 20 40 20 20  "#a0a0a0";.  @  
1d30: 20 7d 0a 20 20 40 20 7d 0a 20 20 40 20 66 75 6e   }.  @ }.  @ fun
1d40: 63 74 69 6f 6e 20 78 69 6e 28 69 64 29 20 7b 0a  ction xin(id) {.
1d50: 20 20 40 20 20 20 73 65 74 61 6c 6c 28 30 29 3b    @   setall(0);
1d60: 0a 20 20 40 20 20 20 73 65 74 6f 6e 65 28 69 64  .  @   setone(id
1d70: 2c 31 29 3b 0a 20 20 40 20 20 20 73 65 74 5f 63  ,1);.  @   set_c
1d80: 68 69 6c 64 72 65 6e 28 69 64 29 3b 0a 20 20 40  hildren(id);.  @
1d90: 20 20 20 73 65 74 5f 70 61 72 65 6e 74 73 28 69     set_parents(i
1da0: 64 29 3b 0a 20 20 40 20 7d 0a 20 20 40 20 66 75  d);.  @ }.  @ fu
1db0: 6e 63 74 69 6f 6e 20 78 6f 75 74 28 69 64 29 20  nction xout(id) 
1dc0: 7b 0a 20 20 40 20 20 20 73 65 74 61 6c 6c 28 31  {.  @   setall(1
1dd0: 29 3b 0a 20 20 40 20 7d 0a 20 20 40 20 66 75 6e  );.  @ }.  @ fun
1de0: 63 74 69 6f 6e 20 73 65 74 5f 70 61 72 65 6e 74  ction set_parent
1df0: 73 28 69 64 29 7b 0a 20 20 40 20 20 20 69 66 28  s(id){.  @   if(
1e00: 20 70 61 72 65 6e 74 6f 66 5b 69 64 5d 3d 3d 6e   parentof[id]==n
1e10: 75 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ull ) return;.  
1e20: 40 20 20 20 66 6f 72 28 76 61 72 20 78 20 69 6e  @   for(var x in
1e30: 20 70 61 72 65 6e 74 6f 66 5b 69 64 5d 29 7b 0a   parentof[id]){.
1e40: 20 20 40 20 20 20 20 20 76 61 72 20 70 69 64 20    @     var pid 
1e50: 3d 20 70 61 72 65 6e 74 6f 66 5b 69 64 5d 5b 78  = parentof[id][x
1e60: 5d 3b 0a 20 20 40 20 20 20 20 20 73 65 74 6f 6e  ];.  @     seton
1e70: 65 28 70 69 64 2c 31 29 3b 0a 20 20 40 20 20 20  e(pid,1);.  @   
1e80: 20 20 73 65 74 5f 70 61 72 65 6e 74 73 28 70 69    set_parents(pi
1e90: 64 29 3b 0a 20 20 40 20 20 20 7d 0a 20 20 40 20  d);.  @   }.  @ 
1ea0: 7d 0a 20 20 40 20 66 75 6e 63 74 69 6f 6e 20 73  }.  @ function s
1eb0: 65 74 5f 63 68 69 6c 64 72 65 6e 28 69 64 29 7b  et_children(id){
1ec0: 0a 20 20 40 20 20 20 69 66 28 20 63 68 69 6c 64  .  @   if( child
1ed0: 6f 66 5b 69 64 5d 3d 3d 6e 75 6c 6c 20 29 20 72  of[id]==null ) r
1ee0: 65 74 75 72 6e 3b 0a 20 20 40 20 20 20 66 6f 72  eturn;.  @   for
1ef0: 28 76 61 72 20 78 20 69 6e 20 63 68 69 6c 64 6f  (var x in childo
1f00: 66 5b 69 64 5d 29 7b 0a 20 20 40 20 20 20 20 20  f[id]){.  @     
1f10: 76 61 72 20 63 69 64 20 3d 20 63 68 69 6c 64 6f  var cid = childo
1f20: 66 5b 69 64 5d 5b 78 5d 3b 0a 20 20 40 20 20 20  f[id][x];.  @   
1f30: 20 20 73 65 74 6f 6e 65 28 63 69 64 2c 31 29 3b    setone(cid,1);
1f40: 0a 20 20 40 20 20 20 20 20 73 65 74 5f 63 68 69  .  @     set_chi
1f50: 6c 64 72 65 6e 28 63 69 64 29 3b 0a 20 20 40 20  ldren(cid);.  @ 
1f60: 20 20 7d 0a 20 20 40 20 7d 0a 20 20 40 20 66 75    }.  @ }.  @ fu
1f70: 6e 63 74 69 6f 6e 20 68 69 6c 69 74 65 28 69 64  nction hilite(id
1f80: 29 20 7b 0a 20 20 40 20 20 20 76 61 72 20 78 20  ) {.  @   var x 
1f90: 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c  = document.getEl
1fa0: 65 6d 65 6e 74 42 79 49 64 28 69 64 29 3b 0a 20  ementById(id);. 
1fb0: 20 40 20 20 20 78 2e 73 74 79 6c 65 2e 62 61 63   @   x.style.bac
1fc0: 6b 67 72 6f 75 6e 64 43 6f 6c 6f 72 20 3d 20 22  kgroundColor = "
1fd0: 23 65 30 65 30 66 66 22 3b 0a 20 20 40 20 7d 0a  #e0e0ff";.  @ }.
1fe0: 20 20 40 20 66 75 6e 63 74 69 6f 6e 20 75 6e 68    @ function unh
1ff0: 69 6c 69 74 65 28 69 64 29 20 7b 0a 20 20 40 20  ilite(id) {.  @ 
2000: 20 20 76 61 72 20 78 20 3d 20 64 6f 63 75 6d 65    var x = docume
2010: 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79 49  nt.getElementByI
2020: 64 28 69 64 29 3b 0a 20 20 40 20 20 20 78 2e 73  d(id);.  @   x.s
2030: 74 79 6c 65 2e 62 61 63 6b 67 72 6f 75 6e 64 43  tyle.backgroundC
2040: 6f 6c 6f 72 20 3d 20 22 23 66 66 66 66 66 66 22  olor = "#ffffff"
2050: 3b 0a 20 20 40 20 7d 0a 20 20 40 20 3c 2f 73 63  ;.  @ }.  @ </sc
2060: 72 69 70 74 3e 0a 20 20 40 20 3c 68 72 3e 0a 20  ript>.  @ <hr>. 
2070: 20 40 20 3c 66 6f 72 6d 20 6d 65 74 68 6f 64 3d   @ <form method=
2080: 22 47 45 54 22 20 61 63 74 69 6f 6e 3d 22 25 73  "GET" action="%s
2090: 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 74 69 6d  (g.zBaseURL)/tim
20a0: 65 6c 69 6e 65 22 3e 0a 20 20 40 20 53 74 61 72  eline">.  @ Star
20b0: 74 20 44 61 74 65 3a 0a 20 20 40 20 3c 69 6e 70  t Date:.  @ <inp
20c0: 75 74 20 74 79 70 65 3d 22 74 65 78 74 22 20 73  ut type="text" s
20d0: 69 7a 65 3d 22 33 30 22 20 76 61 6c 75 65 3d 22  ize="30" value="
20e0: 25 68 28 7a 53 74 61 72 74 29 22 20 6e 61 6d 65  %h(zStart)" name
20f0: 3d 22 64 22 3e 0a 20 20 40 20 4e 75 6d 62 65 72  ="d">.  @ Number
2100: 20 4f 66 20 45 6e 74 72 69 65 73 3a 20 20 0a 20   Of Entries:  . 
2110: 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22   @ <input type="
2120: 74 65 78 74 22 20 73 69 7a 65 3d 22 34 22 20 76  text" size="4" v
2130: 61 6c 75 65 3d 22 25 64 28 6e 45 6e 74 72 79 29  alue="%d(nEntry)
2140: 22 20 6e 61 6d 65 3d 22 6e 22 3e 0a 20 20 40 20  " name="n">.  @ 
2150: 3c 62 72 3e 3c 69 6e 70 75 74 20 74 79 70 65 3d  <br><input type=
2160: 22 73 75 62 6d 69 74 22 20 76 61 6c 75 65 3d 22  "submit" value="
2170: 53 75 62 6d 69 74 22 3e 0a 20 20 40 20 3c 2f 66  Submit">.  @ </f
2180: 6f 72 6d 3e 0a 20 20 40 20 3c 66 6f 72 6d 20 6d  orm>.  @ <form m
2190: 65 74 68 6f 64 3d 22 47 45 54 22 20 61 63 74 69  ethod="GET" acti
21a0: 6f 6e 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52  on="%s(g.zBaseUR
21b0: 4c 29 2f 74 69 6d 65 6c 69 6e 65 22 3e 0a 20 20  L)/timeline">.  
21c0: 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 68  @ <input type="h
21d0: 69 64 64 65 6e 22 20 76 61 6c 75 65 3d 22 25 68  idden" value="%h
21e0: 28 7a 44 61 74 65 29 22 20 6e 61 6d 65 3d 22 64  (zDate)" name="d
21f0: 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79  ">.  @ <input ty
2200: 70 65 3d 22 68 69 64 64 65 6e 22 20 76 61 6c 75  pe="hidden" valu
2210: 65 3d 22 25 64 28 6e 45 6e 74 72 79 29 22 20 6e  e="%d(nEntry)" n
2220: 61 6d 65 3d 22 6e 22 3e 0a 20 20 40 20 3c 69 6e  ame="n">.  @ <in
2230: 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74  put type="submit
2240: 22 20 76 61 6c 75 65 3d 22 4e 65 78 74 20 25 64  " value="Next %d
2250: 28 6e 45 6e 74 72 79 29 20 52 6f 77 73 22 3e 0a  (nEntry) Rows">.
2260: 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20 20 73 74    @ </form>.  st
2270: 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a  yle_footer();.}.
2280: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
2290: 20 71 75 65 72 79 20 71 20 73 65 6c 65 63 74 73   query q selects
22a0: 20 76 61 72 69 6f 75 73 20 72 65 63 6f 72 64 73   various records
22b0: 2e 20 20 50 72 69 6e 74 20 61 20 68 75 6d 61 6e  .  Print a human
22c0: 2d 72 65 61 64 61 62 6c 65 0a 2a 2a 20 73 75 6d  -readable.** sum
22d0: 6d 61 72 79 20 6f 66 20 74 68 6f 73 65 20 72 65  mary of those re
22e0: 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 4c 69 6d  cords..**.** Lim
22f0: 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  it the number of
2300: 20 65 6e 74 72 69 65 73 20 70 72 69 6e 74 65 64   entries printed
2310: 20 74 6f 20 6e 4c 69 6e 65 2e 0a 2a 2f 0a 76 6f   to nLine..*/.vo
2320: 69 64 20 70 72 69 6e 74 5f 74 69 6d 65 6c 69 6e  id print_timelin
2330: 65 28 53 74 6d 74 20 2a 71 2c 20 69 6e 74 20 6d  e(Stmt *q, int m
2340: 78 4c 69 6e 65 29 7b 0a 20 20 69 6e 74 20 6e 4c  xLine){.  int nL
2350: 69 6e 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ine = 0;.  char 
2360: 7a 50 72 65 76 44 61 74 65 5b 32 30 5d 3b 0a 20  zPrevDate[20];. 
2370: 20 7a 50 72 65 76 44 61 74 65 5b 30 5d 20 3d 20   zPrevDate[0] = 
2380: 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 64 62 5f  0;..  while( db_
2390: 73 74 65 70 28 71 29 3d 3d 53 51 4c 49 54 45 5f  step(q)==SQLITE_
23a0: 52 4f 57 20 26 26 20 6e 4c 69 6e 65 3c 3d 6d 78  ROW && nLine<=mx
23b0: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 63 6f 6e 73  Line ){.    cons
23c0: 74 20 63 68 61 72 20 2a 7a 49 64 20 3d 20 64 62  t char *zId = db
23d0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 71 2c 20  _column_text(q, 
23e0: 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  1);.    const ch
23f0: 61 72 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63  ar *zDate = db_c
2400: 6f 6c 75 6d 6e 5f 74 65 78 74 28 71 2c 20 32 29  olumn_text(q, 2)
2410: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
2420: 20 2a 7a 43 6f 6d 20 3d 20 64 62 5f 63 6f 6c 75   *zCom = db_colu
2430: 6d 6e 5f 74 65 78 74 28 71 2c 20 33 29 3b 0a 20  mn_text(q, 3);. 
2440: 20 20 20 69 6e 74 20 6e 43 68 69 6c 64 20 3d 20     int nChild = 
2450: 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 71 2c  db_column_int(q,
2460: 20 34 29 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61   4);.    int nPa
2470: 72 65 6e 74 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  rent = db_column
2480: 5f 69 6e 74 28 71 2c 20 35 29 3b 0a 20 20 20 20  _int(q, 5);.    
2490: 63 68 61 72 20 2a 7a 46 72 65 65 20 3d 20 30 3b  char *zFree = 0;
24a0: 0a 20 20 20 20 63 68 61 72 20 7a 55 75 69 64 5b  .    char zUuid[
24b0: 55 55 49 44 5f 53 49 5a 45 2b 31 5d 3b 0a 0a 20  UUID_SIZE+1];.. 
24c0: 20 20 20 73 70 72 69 6e 74 66 28 7a 55 75 69 64     sprintf(zUuid
24d0: 2c 20 22 25 2e 31 30 73 22 2c 20 7a 49 64 29 3b  , "%.10s", zId);
24e0: 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
24f0: 7a 44 61 74 65 2c 20 7a 50 72 65 76 44 61 74 65  zDate, zPrevDate
2500: 2c 20 31 30 29 20 29 7b 0a 20 20 20 20 20 20 70  , 10) ){.      p
2510: 72 69 6e 74 66 28 22 3d 3d 3d 20 25 2e 31 30 73  rintf("=== %.10s
2520: 20 3d 3d 3d 5c 6e 22 2c 20 7a 44 61 74 65 29 3b   ===\n", zDate);
2530: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 50  .      memcpy(zP
2540: 72 65 76 44 61 74 65 2c 20 7a 44 61 74 65 2c 20  revDate, zDate, 
2550: 31 30 29 3b 0a 20 20 20 20 20 20 6e 4c 69 6e 65  10);.      nLine
2560: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
2570: 28 20 7a 43 6f 6d 3d 3d 30 20 29 20 7a 43 6f 6d  ( zCom==0 ) zCom
2580: 20 3d 20 22 22 3b 0a 20 20 20 20 70 72 69 6e 74   = "";.    print
2590: 66 28 22 25 2e 35 73 20 5b 25 2e 31 30 73 5d 20  f("%.5s [%.10s] 
25a0: 22 2c 20 26 7a 44 61 74 65 5b 31 31 5d 2c 20 7a  ", &zDate[11], z
25b0: 55 75 69 64 29 3b 0a 20 20 20 20 69 66 28 20 6e  Uuid);.    if( n
25c0: 43 68 69 6c 64 3e 31 20 7c 7c 20 6e 50 61 72 65  Child>1 || nPare
25d0: 6e 74 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  nt>1 ){.      in
25e0: 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  t n = 0;.      c
25f0: 68 61 72 20 7a 50 72 65 66 69 78 5b 35 30 5d 3b  har zPrefix[50];
2600: 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 72 65  .      if( nPare
2610: 6e 74 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  nt>1 ){.        
2620: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2630: 28 73 69 7a 65 6f 66 28 7a 50 72 65 66 69 78 29  (sizeof(zPrefix)
2640: 2c 20 7a 50 72 65 66 69 78 2c 20 22 2a 4d 45 52  , zPrefix, "*MER
2650: 47 45 2a 20 22 29 3b 0a 20 20 20 20 20 20 20 20  GE* ");.        
2660: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 50 72 65 66  n = strlen(zPref
2670: 69 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ix);.      }.   
2680: 20 20 20 69 66 28 20 6e 43 68 69 6c 64 3e 31 20     if( nChild>1 
2690: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
26a0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
26b0: 6f 66 28 7a 50 72 65 66 69 78 29 2d 6e 2c 20 26  of(zPrefix)-n, &
26c0: 7a 50 72 65 66 69 78 5b 6e 5d 2c 20 22 2a 46 4f  zPrefix[n], "*FO
26d0: 52 4b 2a 20 22 29 3b 0a 20 20 20 20 20 20 20 20  RK* ");.        
26e0: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 50 72 65 66  n = strlen(zPref
26f0: 69 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ix);.      }.   
2700: 20 20 20 7a 43 6f 6d 20 3d 20 7a 46 72 65 65 20     zCom = zFree 
2710: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2720: 66 28 22 25 73 25 73 22 2c 20 7a 50 72 65 66 69  f("%s%s", zPrefi
2730: 78 2c 20 7a 43 6f 6d 29 3b 0a 20 20 20 20 7d 0a  x, zCom);.    }.
2740: 20 20 20 20 6e 4c 69 6e 65 20 2b 3d 20 63 6f 6d      nLine += com
2750: 6d 65 6e 74 5f 70 72 69 6e 74 28 7a 43 6f 6d 2c  ment_print(zCom,
2760: 20 31 39 2c 20 37 39 29 3b 0a 20 20 20 20 73 71   19, 79);.    sq
2770: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 72 65 65  lite3_free(zFree
2780: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
2790: 20 43 4f 4d 4d 41 4e 44 3a 20 74 69 6d 65 6c 69   COMMAND: timeli
27a0: 6e 65 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  ne.**.** Usage: 
27b0: 25 66 6f 73 73 69 6c 20 74 69 6d 65 6c 69 6e 65  %fossil timeline
27c0: 20 3f 44 41 54 45 54 49 4d 45 3f 20 3f 2d 6e 7c   ?DATETIME? ?-n|
27d0: 2d 2d 63 6f 75 6e 74 20 4e 3f 0a 2a 2a 0a 2a 2a  --count N?.**.**
27e0: 20 50 72 69 6e 74 20 61 20 73 75 6d 6d 61 72 79   Print a summary
27f0: 20 6f 66 20 61 63 74 69 76 69 74 79 20 67 6f 69   of activity goi
2800: 6e 67 20 62 61 63 6b 77 61 72 64 73 20 69 6e 20  ng backwards in 
2810: 64 61 74 65 20 61 6e 64 20 74 69 6d 65 0a 2a 2a  date and time.**
2820: 20 73 70 65 63 69 66 69 65 64 20 6f 72 20 66 72   specified or fr
2830: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  om the current d
2840: 61 74 65 20 61 6e 64 20 74 69 6d 65 20 69 66 20  ate and time if 
2850: 6e 6f 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2a 20  no arguments.** 
2860: 61 72 65 20 67 69 76 65 6e 2e 20 20 53 68 6f 77  are given.  Show
2870: 20 61 73 20 6d 61 6e 79 20 61 73 20 4e 20 28 64   as many as N (d
2880: 65 66 61 75 6c 74 20 32 30 29 20 63 68 65 63 6b  efault 20) check
2890: 2d 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  -ins..**.** The 
28a0: 64 61 74 65 20 61 6e 64 20 74 69 6d 65 20 73 68  date and time sh
28b0: 6f 75 6c 64 20 62 65 20 69 6e 20 74 68 65 20 49  ould be in the I
28c0: 53 4f 38 36 30 31 20 66 6f 72 6d 61 74 2e 20 20  SO8601 format.  
28d0: 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 73 3a  For.** examples:
28e0: 20 22 32 30 30 37 2d 30 38 2d 31 38 20 30 37 3a   "2007-08-18 07:
28f0: 32 31 3a 32 31 22 2e 20 20 54 68 65 20 74 69 6d  21:21".  The tim
2900: 65 20 6d 61 79 20 62 65 20 6f 6d 69 74 74 65 64  e may be omitted
2910: 2e 0a 2a 2a 20 54 69 6d 65 73 20 61 72 65 20 61  ..** Times are a
2920: 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
2930: 6c 6f 63 61 6c 20 74 69 6d 65 7a 6f 6e 65 2e 0a  local timezone..
2940: 2a 2f 0a 76 6f 69 64 20 74 69 6d 65 6c 69 6e 65  */.void timeline
2950: 5f 63 6d 64 28 76 6f 69 64 29 7b 0a 20 20 53 74  _cmd(void){.  St
2960: 6d 74 20 71 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  mt q;.  int n;. 
2970: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
2980: 75 6e 74 3b 0a 20 20 63 68 61 72 20 2a 7a 44 61  unt;.  char *zDa
2990: 74 65 3b 0a 20 20 64 62 5f 66 69 6e 64 5f 61 6e  te;.  db_find_an
29a0: 64 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72  d_open_repositor
29b0: 79 28 29 3b 0a 20 20 7a 43 6f 75 6e 74 20 3d 20  y();.  zCount = 
29c0: 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 6e 22 2c  find_option("n",
29d0: 22 63 6f 75 6e 74 22 2c 31 29 3b 0a 20 20 69 66  "count",1);.  if
29e0: 28 20 7a 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ( zCount ){.    
29f0: 6e 20 3d 20 61 74 6f 69 28 7a 43 6f 75 6e 74 29  n = atoi(zCount)
2a00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
2a10: 20 3d 20 32 30 3b 0a 20 20 7d 0a 20 20 69 66 28   = 20;.  }.  if(
2a20: 20 67 2e 61 72 67 63 21 3d 32 20 26 26 20 67 2e   g.argc!=2 && g.
2a30: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 75  argc!=3 ){.    u
2a40: 73 61 67 65 28 22 59 59 59 59 2d 4d 4d 2d 44 44  sage("YYYY-MM-DD
2a50: 74 48 48 3a 4d 4d 3a 53 53 22 29 3b 0a 20 20 7d  tHH:MM:SS");.  }
2a60: 0a 20 20 69 66 28 20 67 2e 61 72 67 63 3d 3d 33  .  if( g.argc==3
2a70: 20 29 7b 0a 20 20 20 20 7a 44 61 74 65 20 3d 20   ){.    zDate = 
2a80: 67 2e 61 72 67 76 5b 32 5d 3b 0a 20 20 7d 65 6c  g.argv[2];.  }el
2a90: 73 65 7b 0a 20 20 20 20 7a 44 61 74 65 20 3d 20  se{.    zDate = 
2aa0: 22 6e 6f 77 22 3b 0a 20 20 7d 0a 20 20 64 62 5f  "now";.  }.  db_
2ab0: 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20  prepare(&q,.    
2ac0: 22 53 45 4c 45 43 54 20 62 6c 6f 62 2e 72 69 64  "SELECT blob.rid
2ad0: 2c 20 75 75 69 64 2c 20 64 61 74 65 74 69 6d 65  , uuid, datetime
2ae0: 28 65 76 65 6e 74 2e 6d 74 69 6d 65 2c 27 6c 6f  (event.mtime,'lo
2af0: 63 61 6c 74 69 6d 65 27 29 2c 22 0a 20 20 20 20  caltime'),".    
2b00: 22 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e 74 20  "       comment 
2b10: 7c 7c 20 27 20 28 62 79 20 27 20 7c 7c 20 75 73  || ' (by ' || us
2b20: 65 72 20 7c 7c 20 27 29 27 2c 22 0a 20 20 20 20  er || ')',".    
2b30: 22 20 20 20 20 20 20 20 28 53 45 4c 45 43 54 20  "       (SELECT 
2b40: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 6c  count(*) FROM pl
2b50: 69 6e 6b 20 57 48 45 52 45 20 70 69 64 3d 62 6c  ink WHERE pid=bl
2b60: 6f 62 2e 72 69 64 20 41 4e 44 20 69 73 70 72 69  ob.rid AND ispri
2b70: 6d 29 2c 22 0a 20 20 20 20 22 20 20 20 20 20 20  m),".    "      
2b80: 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   (SELECT count(*
2b90: 29 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45  ) FROM plink WHE
2ba0: 52 45 20 63 69 64 3d 62 6c 6f 62 2e 72 69 64 29  RE cid=blob.rid)
2bb0: 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 65 76  ".    "  FROM ev
2bc0: 65 6e 74 2c 20 62 6c 6f 62 22 0a 20 20 20 20 22  ent, blob".    "
2bd0: 20 57 48 45 52 45 20 65 76 65 6e 74 2e 74 79 70   WHERE event.typ
2be0: 65 3d 27 63 69 27 20 41 4e 44 20 62 6c 6f 62 2e  e='ci' AND blob.
2bf0: 72 69 64 3d 65 76 65 6e 74 2e 6f 62 6a 69 64 22  rid=event.objid"
2c00: 0a 20 20 20 20 22 20 20 20 41 4e 44 20 65 76 65  .    "   AND eve
2c10: 6e 74 2e 6d 74 69 6d 65 3c 3d 28 53 45 4c 45 43  nt.mtime<=(SELEC
2c20: 54 20 6a 75 6c 69 61 6e 64 61 79 28 25 51 2c 27  T julianday(%Q,'
2c30: 75 74 63 27 29 29 22 0a 20 20 20 20 22 20 4f 52  utc'))".    " OR
2c40: 44 45 52 20 42 59 20 65 76 65 6e 74 2e 6d 74 69  DER BY event.mti
2c50: 6d 65 20 44 45 53 43 22 2c 20 7a 44 61 74 65 0a  me DESC", zDate.
2c60: 20 20 29 3b 0a 20 20 70 72 69 6e 74 5f 74 69 6d    );.  print_tim
2c70: 65 6c 69 6e 65 28 26 71 2c 20 6e 29 3b 0a 20 20  eline(&q, n);.  
2c80: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b  db_finalize(&q);
2c90: 0a 7d 0a                                         .}.