Hex Artifact Content
Not logged in

Artifact 7640f70a07b0b57015a73e4a4ba0581c2d37d833:

File src/timeline.c part of check-in [b846db063c] - Changes to the CLI version of the timeline command to show places where forks occur in the tree and where content is merged. Lots more work is needed to show the structure of a tree well. This is definitely a work in progress. by drh on 2007-08-25 18:51:54. Also file src/timeline.c part of check-in [b0ad3f90bc] - Merging aku's changes into the head. by drh on 2007-08-25 19:00:33.

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 6f 20 61 20 64 69 66 66 20 62 65 74  nk to a diff bet
0520: 77 65 65 6e 20 74 77 6f 20 76 65 72 73 69 6f 6e  ween two version
0530: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 68 79 70 65 72  s..*/.void hyper
0540: 6c 69 6e 6b 5f 74 6f 5f 64 69 66 66 28 63 6f 6e  link_to_diff(con
0550: 73 74 20 63 68 61 72 20 2a 7a 56 31 2c 20 63 6f  st char *zV1, co
0560: 6e 73 74 20 63 68 61 72 20 2a 7a 56 32 29 7b 0a  nst char *zV2){.
0570: 20 20 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f 72    if( g.okHistor
0580: 79 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 56 32  y ){.    if( zV2
0590: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 40 20 3c  ==0 ){.      @ <
05a0: 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61  a href="%s(g.zBa
05b0: 73 65 55 52 4c 29 2f 64 69 66 66 3f 76 32 3d 25  seURL)/diff?v2=%
05c0: 73 28 7a 56 31 29 22 3e 5b 64 69 66 66 5d 3c 2f  s(zV1)">[diff]</
05d0: 61 3e 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  a>.    }else{.  
05e0: 20 20 20 20 40 20 3c 61 20 68 72 65 66 3d 22 25      @ <a href="%
05f0: 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 64 69  s(g.zBaseURL)/di
0600: 66 66 3f 76 31 3d 25 73 28 7a 56 31 29 26 76 32  ff?v1=%s(zV1)&v2
0610: 3d 25 73 28 7a 56 32 29 22 3e 5b 64 69 66 66 5d  =%s(zV2)">[diff]
0620: 3c 2f 61 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  </a>.    }.  }.}
0630: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61  ../*.** Output a
0640: 20 74 69 6d 65 6c 69 6e 65 20 69 6e 20 74 68 65   timeline in the
0650: 20 77 65 62 20 66 6f 72 6d 61 74 20 67 69 76 65   web format give
0660: 6e 20 61 20 71 75 65 72 79 2e 20 20 54 68 65 20  n a query.  The 
0670: 71 75 65 72 79 0a 2a 2a 20 73 68 6f 75 6c 64 20  query.** should 
0680: 72 65 74 75 72 6e 20 34 20 63 6f 6c 75 6d 6e 73  return 4 columns
0690: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 30 2e 20 20 55  :.**.**    0.  U
06a0: 55 49 44 0a 2a 2a 20 20 20 20 31 2e 20 20 44 61  UID.**    1.  Da
06b0: 74 65 2f 54 69 6d 65 0a 2a 2a 20 20 20 20 32 2e  te/Time.**    2.
06c0: 20 20 43 6f 6d 6d 65 6e 74 20 73 74 72 69 6e 67    Comment string
06d0: 0a 2a 2a 20 20 20 20 33 2e 20 20 55 73 65 72 0a  .**    3.  User.
06e0: 2a 2f 0a 76 6f 69 64 20 77 77 77 5f 70 72 69 6e  */.void www_prin
06f0: 74 5f 74 69 6d 65 6c 69 6e 65 28 53 74 6d 74 20  t_timeline(Stmt 
0700: 2a 70 51 75 65 72 79 2c 20 63 68 61 72 20 2a 7a  *pQuery, char *z
0710: 4c 61 73 74 44 61 74 65 29 7b 0a 20 20 63 68 61  LastDate){.  cha
0720: 72 20 7a 50 72 65 76 44 61 74 65 5b 32 30 5d 3b  r zPrevDate[20];
0730: 0a 20 20 7a 50 72 65 76 44 61 74 65 5b 30 5d 20  .  zPrevDate[0] 
0740: 3d 20 30 3b 0a 20 20 40 20 3c 74 61 62 6c 65 20  = 0;.  @ <table 
0750: 63 65 6c 6c 73 70 61 63 69 6e 67 3d 30 20 62 6f  cellspacing=0 bo
0760: 72 64 65 72 3d 30 20 63 65 6c 6c 70 61 64 64 69  rder=0 cellpaddi
0770: 6e 67 3d 30 3e 0a 20 20 77 68 69 6c 65 28 20 64  ng=0>.  while( d
0780: 62 5f 73 74 65 70 28 70 51 75 65 72 79 29 3d 3d  b_step(pQuery)==
0790: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
07a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
07b0: 61 74 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ate = db_column_
07c0: 74 65 78 74 28 70 51 75 65 72 79 2c 20 31 29 3b  text(pQuery, 1);
07d0: 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
07e0: 7a 44 61 74 65 2c 20 7a 50 72 65 76 44 61 74 65  zDate, zPrevDate
07f0: 2c 20 31 30 29 20 29 7b 0a 20 20 20 20 20 20 73  , 10) ){.      s
0800: 70 72 69 6e 74 66 28 7a 50 72 65 76 44 61 74 65  printf(zPrevDate
0810: 2c 20 22 25 2e 31 30 73 22 2c 20 7a 44 61 74 65  , "%.10s", zDate
0820: 29 3b 0a 20 20 20 20 20 20 40 20 3c 74 72 3e 3c  );.      @ <tr><
0830: 74 64 20 63 6f 6c 73 70 61 6e 3d 33 3e 0a 20 20  td colspan=3>.  
0840: 20 20 20 20 40 20 3c 74 61 62 6c 65 20 63 65 6c      @ <table cel
0850: 6c 70 61 64 64 69 6e 67 3d 32 20 62 6f 72 64 65  lpadding=2 borde
0860: 72 3d 30 3e 0a 20 20 20 20 20 20 40 20 3c 74 72  r=0>.      @ <tr
0870: 3e 3c 74 64 20 62 67 63 6f 6c 6f 72 3d 22 23 61  ><td bgcolor="#a
0880: 30 62 35 66 34 22 20 63 6c 61 73 73 3d 22 62 6f  0b5f4" class="bo
0890: 72 64 65 72 31 22 3e 0a 20 20 20 20 20 20 40 20  rder1">.      @ 
08a0: 3c 74 61 62 6c 65 20 63 65 6c 6c 70 61 64 64 69  <table cellpaddi
08b0: 6e 67 3d 32 20 63 65 6c 6c 73 70 61 63 69 6e 67  ng=2 cellspacing
08c0: 3d 30 20 62 6f 72 64 65 72 3d 30 3e 3c 74 72 3e  =0 border=0><tr>
08d0: 0a 20 20 20 20 20 20 40 20 3c 74 64 20 62 67 63  .      @ <td bgc
08e0: 6f 6c 6f 72 3d 22 23 64 30 64 39 66 34 22 20 63  olor="#d0d9f4" c
08f0: 6c 61 73 73 3d 22 62 6b 67 6e 64 31 22 3e 25 73  lass="bkgnd1">%s
0900: 28 7a 50 72 65 76 44 61 74 65 29 3c 2f 74 64 3e  (zPrevDate)</td>
0910: 0a 20 20 20 20 20 20 40 20 3c 2f 74 72 3e 3c 2f  .      @ </tr></
0920: 74 61 62 6c 65 3e 0a 20 20 20 20 20 20 40 20 3c  table>.      @ <
0930: 2f 74 64 3e 3c 2f 74 72 3e 3c 2f 74 61 62 6c 65  /td></tr></table
0940: 3e 0a 20 20 20 20 20 20 40 20 3c 2f 74 64 3e 3c  >.      @ </td><
0950: 2f 74 72 3e 0a 20 20 20 20 7d 0a 20 20 20 20 40  /tr>.    }.    @
0960: 20 3c 74 72 3e 3c 74 64 20 76 61 6c 69 67 6e 3d   <tr><td valign=
0970: 22 74 6f 70 22 3e 25 73 28 26 7a 44 61 74 65 5b  "top">%s(&zDate[
0980: 31 31 5d 29 3c 2f 74 64 3e 0a 20 20 20 20 40 20  11])</td>.    @ 
0990: 3c 74 64 20 77 69 64 74 68 3d 22 32 30 22 3e 3c  <td width="20"><
09a0: 2f 74 64 3e 0a 20 20 20 20 40 20 3c 74 64 20 76  /td>.    @ <td v
09b0: 61 6c 69 67 6e 3d 22 74 6f 70 22 20 61 6c 69 67  align="top" alig
09c0: 6e 3d 22 6c 65 66 74 22 3e 0a 20 20 20 20 68 79  n="left">.    hy
09d0: 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 75 69 64 28  perlink_to_uuid(
09e0: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  db_column_text(p
09f0: 51 75 65 72 79 2c 30 29 29 3b 0a 20 20 20 20 40  Query,0));.    @
0a00: 20 25 68 28 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65   %h(db_column_te
0a10: 78 74 28 70 51 75 65 72 79 2c 32 29 29 20 28 62  xt(pQuery,2)) (b
0a20: 79 20 25 68 28 64 62 5f 63 6f 6c 75 6d 6e 5f 74  y %h(db_column_t
0a30: 65 78 74 28 70 51 75 65 72 79 2c 33 29 29 29 3c  ext(pQuery,3)))<
0a40: 2f 74 64 3e 0a 20 20 20 20 69 66 28 20 7a 4c 61  /td>.    if( zLa
0a50: 73 74 44 61 74 65 20 29 7b 0a 20 20 20 20 20 20  stDate ){.      
0a60: 73 74 72 63 70 79 28 7a 4c 61 73 74 44 61 74 65  strcpy(zLastDate
0a70: 2c 20 7a 44 61 74 65 29 3b 0a 20 20 20 20 7d 0a  , zDate);.    }.
0a80: 20 20 7d 0a 20 20 40 20 3c 2f 74 61 62 6c 65 3e    }.  @ </table>
0a90: 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50  .}..../*.** WEBP
0aa0: 41 47 45 3a 20 74 69 6d 65 6c 69 6e 65 0a 2a 2f  AGE: timeline.*/
0ab0: 0a 76 6f 69 64 20 70 61 67 65 5f 74 69 6d 65 6c  .void page_timel
0ac0: 69 6e 65 28 76 6f 69 64 29 7b 0a 20 20 53 74 6d  ine(void){.  Stm
0ad0: 74 20 71 3b 0a 20 20 63 68 61 72 20 2a 7a 53 51  t q;.  char *zSQ
0ae0: 4c 3b 0a 20 20 63 68 61 72 20 7a 44 61 74 65 5b  L;.  char zDate[
0af0: 31 30 30 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  100];.  const ch
0b00: 61 72 20 2a 7a 53 74 61 72 74 20 3d 20 50 28 22  ar *zStart = P("
0b10: 64 22 29 3b 0a 20 20 69 6e 74 20 6e 45 6e 74 72  d");.  int nEntr
0b20: 79 20 3d 20 61 74 6f 69 28 50 44 28 22 6e 22 2c  y = atoi(PD("n",
0b30: 22 32 35 22 29 29 3b 0a 0a 20 20 2f 2a 20 54 6f  "25"));..  /* To
0b40: 20 76 69 65 77 20 74 68 65 20 74 69 6d 65 6c 69   view the timeli
0b50: 6e 65 2c 20 6d 75 73 74 20 68 61 76 65 20 70 65  ne, must have pe
0b60: 72 6d 69 73 73 69 6f 6e 20 74 6f 20 72 65 61 64  rmission to read
0b70: 20 70 72 6f 6a 65 63 74 20 64 61 74 61 2e 0a 20   project data.. 
0b80: 20 2a 2f 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63   */.  login_chec
0b90: 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b  k_credentials();
0ba0: 0a 20 20 69 66 28 20 21 67 2e 6f 6b 52 65 61 64  .  if( !g.okRead
0bb0: 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64   ){ login_needed
0bc0: 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 0a 20  (); return; }.. 
0bd0: 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 54   style_header("T
0be0: 69 6d 65 6c 69 6e 65 22 29 3b 0a 20 20 69 66 28  imeline");.  if(
0bf0: 20 21 67 2e 6f 6b 48 69 73 74 6f 72 79 20 26 26   !g.okHistory &&
0c00: 0a 20 20 20 20 20 20 64 62 5f 65 78 69 73 74 73  .      db_exists
0c10: 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20  ("SELECT 1 FROM 
0c20: 75 73 65 72 22 0a 20 20 20 20 20 20 20 20 20 20  user".          
0c30: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 6c 6f        " WHERE lo
0c40: 67 69 6e 3d 27 61 6e 6f 6e 79 6d 6f 75 73 27 22  gin='anonymous'"
0c50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0c60: 20 22 20 20 20 41 4e 44 20 63 61 70 20 4c 49 4b   "   AND cap LIK
0c70: 45 20 27 25 25 68 25 25 27 22 29 20 29 7b 0a 20  E '%%h%%'") ){. 
0c80: 20 20 20 40 20 3c 70 3e 3c 62 3e 4e 6f 74 65 3a     @ <p><b>Note:
0c90: 3c 2f 62 3e 20 59 6f 75 20 77 69 6c 6c 20 62 65  </b> You will be
0ca0: 20 61 62 6c 65 20 74 6f 20 61 63 63 65 73 73 20   able to access 
0cb0: 3c 75 3e 6d 75 63 68 3c 2f 75 3e 20 6d 6f 72 65  <u>much</u> more
0cc0: 0a 20 20 20 20 40 20 68 69 73 74 6f 72 69 63 61  .    @ historica
0cd0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66  l information if
0ce0: 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a   <a href="%s(g.z
0cf0: 42 61 73 65 55 52 4c 29 2f 6c 6f 67 69 6e 22 3e  BaseURL)/login">
0d00: 6c 6f 67 69 6e 3c 2f 61 3e 2e 3c 2f 70 3e 0a 20  login</a>.</p>. 
0d10: 20 7d 0a 20 20 7a 53 51 4c 20 3d 20 6d 70 72 69   }.  zSQL = mpri
0d20: 6e 74 66 28 0a 20 20 20 20 22 53 45 4c 45 43 54  ntf(.    "SELECT
0d30: 20 75 75 69 64 2c 20 64 61 74 65 74 69 6d 65 28   uuid, datetime(
0d40: 65 76 65 6e 74 2e 6d 74 69 6d 65 2c 27 6c 6f 63  event.mtime,'loc
0d50: 61 6c 74 69 6d 65 27 29 2c 20 63 6f 6d 6d 65 6e  altime'), commen
0d60: 74 2c 20 75 73 65 72 22 0a 20 20 20 20 22 20 20  t, user".    "  
0d70: 46 52 4f 4d 20 65 76 65 6e 74 2c 20 62 6c 6f 62  FROM event, blob
0d80: 22 0a 20 20 20 20 22 20 57 48 45 52 45 20 65 76  ".    " WHERE ev
0d90: 65 6e 74 2e 74 79 70 65 3d 27 63 69 27 20 41 4e  ent.type='ci' AN
0da0: 44 20 62 6c 6f 62 2e 72 69 64 3d 65 76 65 6e 74  D blob.rid=event
0db0: 2e 6f 62 6a 69 64 22 0a 20 20 29 3b 0a 20 20 69  .objid".  );.  i
0dc0: 66 28 20 7a 53 74 61 72 74 20 29 7b 0a 20 20 20  f( zStart ){.   
0dd0: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
0de0: 7a 53 74 61 72 74 5b 30 5d 29 20 29 7b 20 7a 53  zStart[0]) ){ zS
0df0: 74 61 72 74 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  tart++; }.    if
0e00: 28 20 7a 53 74 61 72 74 5b 30 5d 20 29 7b 0a 20  ( zStart[0] ){. 
0e10: 20 20 20 20 20 7a 53 51 4c 20 3d 20 6d 70 72 69       zSQL = mpri
0e20: 6e 74 66 28 22 25 7a 20 41 4e 44 20 65 76 65 6e  ntf("%z AND even
0e30: 74 2e 6d 74 69 6d 65 3c 3d 6a 75 6c 69 61 6e 64  t.mtime<=juliand
0e40: 61 79 28 25 51 2c 20 27 6c 6f 63 61 6c 74 69 6d  ay(%Q, 'localtim
0e50: 65 27 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  e')",.          
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 51 4c              zSQL
0e70: 2c 20 7a 53 74 61 72 74 29 3b 0a 20 20 20 20 7d  , zStart);.    }
0e80: 0a 20 20 7d 0a 20 20 7a 53 51 4c 20 3d 20 6d 70  .  }.  zSQL = mp
0e90: 72 69 6e 74 66 28 22 25 7a 20 4f 52 44 45 52 20  rintf("%z ORDER 
0ea0: 42 59 20 65 76 65 6e 74 2e 6d 74 69 6d 65 20 44  BY event.mtime D
0eb0: 45 53 43 20 4c 49 4d 49 54 20 25 64 22 2c 20 7a  ESC LIMIT %d", z
0ec0: 53 51 4c 2c 20 6e 45 6e 74 72 79 29 3b 0a 20 20  SQL, nEntry);.  
0ed0: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 7a  db_prepare(&q, z
0ee0: 53 51 4c 29 3b 0a 20 20 66 72 65 65 28 7a 53 51  SQL);.  free(zSQ
0ef0: 4c 29 3b 0a 20 20 7a 44 61 74 65 5b 30 5d 20 3d  L);.  zDate[0] =
0f00: 20 30 3b 0a 20 20 77 77 77 5f 70 72 69 6e 74 5f   0;.  www_print_
0f10: 74 69 6d 65 6c 69 6e 65 28 26 71 2c 20 7a 44 61  timeline(&q, zDa
0f20: 74 65 29 3b 0a 20 20 64 62 5f 66 69 6e 61 6c 69  te);.  db_finali
0f30: 7a 65 28 26 71 29 3b 0a 20 20 69 66 28 20 7a 53  ze(&q);.  if( zS
0f40: 74 61 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  tart==0 ){.    z
0f50: 53 74 61 72 74 20 3d 20 7a 44 61 74 65 3b 0a 20  Start = zDate;. 
0f60: 20 7d 0a 20 20 40 20 3c 68 72 3e 0a 20 20 40 20   }.  @ <hr>.  @ 
0f70: 3c 66 6f 72 6d 20 6d 65 74 68 6f 64 3d 22 47 45  <form method="GE
0f80: 54 22 20 61 63 74 69 6f 6e 3d 22 25 73 28 67 2e  T" action="%s(g.
0f90: 7a 42 61 73 65 55 52 4c 29 2f 74 69 6d 65 6c 69  zBaseURL)/timeli
0fa0: 6e 65 22 3e 0a 20 20 40 20 53 74 61 72 74 20 44  ne">.  @ Start D
0fb0: 61 74 65 3a 0a 20 20 40 20 3c 69 6e 70 75 74 20  ate:.  @ <input 
0fc0: 74 79 70 65 3d 22 74 65 78 74 22 20 73 69 7a 65  type="text" size
0fd0: 3d 22 33 30 22 20 76 61 6c 75 65 3d 22 25 68 28  ="30" value="%h(
0fe0: 7a 53 74 61 72 74 29 22 20 6e 61 6d 65 3d 22 64  zStart)" name="d
0ff0: 22 3e 0a 20 20 40 20 4e 75 6d 62 65 72 20 4f 66  ">.  @ Number Of
1000: 20 45 6e 74 72 69 65 73 3a 20 20 0a 20 20 40 20   Entries:  .  @ 
1010: 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 74 65 78  <input type="tex
1020: 74 22 20 73 69 7a 65 3d 22 34 22 20 76 61 6c 75  t" size="4" valu
1030: 65 3d 22 25 64 28 6e 45 6e 74 72 79 29 22 20 6e  e="%d(nEntry)" n
1040: 61 6d 65 3d 22 6e 22 3e 0a 20 20 40 20 3c 62 72  ame="n">.  @ <br
1050: 3e 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75  ><input type="su
1060: 62 6d 69 74 22 20 76 61 6c 75 65 3d 22 53 75 62  bmit" value="Sub
1070: 6d 69 74 22 3e 0a 20 20 40 20 3c 2f 66 6f 72 6d  mit">.  @ </form
1080: 3e 0a 20 20 40 20 3c 66 6f 72 6d 20 6d 65 74 68  >.  @ <form meth
1090: 6f 64 3d 22 47 45 54 22 20 61 63 74 69 6f 6e 3d  od="GET" action=
10a0: 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f  "%s(g.zBaseURL)/
10b0: 74 69 6d 65 6c 69 6e 65 22 3e 0a 20 20 40 20 3c  timeline">.  @ <
10c0: 69 6e 70 75 74 20 74 79 70 65 3d 22 68 69 64 64  input type="hidd
10d0: 65 6e 22 20 76 61 6c 75 65 3d 22 25 68 28 7a 44  en" value="%h(zD
10e0: 61 74 65 29 22 20 6e 61 6d 65 3d 22 64 22 3e 0a  ate)" name="d">.
10f0: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
1100: 22 68 69 64 64 65 6e 22 20 76 61 6c 75 65 3d 22  "hidden" value="
1110: 25 64 28 6e 45 6e 74 72 79 29 22 20 6e 61 6d 65  %d(nEntry)" name
1120: 3d 22 6e 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74  ="n">.  @ <input
1130: 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20 76   type="submit" v
1140: 61 6c 75 65 3d 22 4e 65 78 74 20 25 64 28 6e 45  alue="Next %d(nE
1150: 6e 74 72 79 29 20 52 6f 77 73 22 3e 0a 20 20 40  ntry) Rows">.  @
1160: 20 3c 2f 66 6f 72 6d 3e 0a 20 20 73 74 79 6c 65   </form>.  style
1170: 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a  _footer();.}../*
1180: 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 71 75  .** The input qu
1190: 65 72 79 20 71 20 73 65 6c 65 63 74 73 20 76 61  ery q selects va
11a0: 72 69 6f 75 73 20 72 65 63 6f 72 64 73 2e 20 20  rious records.  
11b0: 50 72 69 6e 74 20 61 20 68 75 6d 61 6e 2d 72 65  Print a human-re
11c0: 61 64 61 62 6c 65 0a 2a 2a 20 73 75 6d 6d 61 72  adable.** summar
11d0: 79 20 6f 66 20 74 68 6f 73 65 20 72 65 63 6f 72  y of those recor
11e0: 64 73 2e 0a 2a 2a 0a 2a 2a 20 4c 69 6d 69 74 20  ds..**.** Limit 
11f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
1200: 74 72 69 65 73 20 70 72 69 6e 74 65 64 20 74 6f  tries printed to
1210: 20 6e 4c 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20   nLine..*/.void 
1220: 70 72 69 6e 74 5f 74 69 6d 65 6c 69 6e 65 28 53  print_timeline(S
1230: 74 6d 74 20 2a 71 2c 20 69 6e 74 20 6d 78 4c 69  tmt *q, int mxLi
1240: 6e 65 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65  ne){.  int nLine
1250: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 50 72   = 0;.  char zPr
1260: 65 76 44 61 74 65 5b 32 30 5d 3b 0a 20 20 7a 50  evDate[20];.  zP
1270: 72 65 76 44 61 74 65 5b 30 5d 20 3d 20 30 3b 0a  revDate[0] = 0;.
1280: 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65  .  while( db_ste
1290: 70 28 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  p(q)==SQLITE_ROW
12a0: 20 26 26 20 6e 4c 69 6e 65 3c 3d 6d 78 4c 69 6e   && nLine<=mxLin
12b0: 65 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  e ){.    const c
12c0: 68 61 72 20 2a 7a 49 64 20 3d 20 64 62 5f 63 6f  har *zId = db_co
12d0: 6c 75 6d 6e 5f 74 65 78 74 28 71 2c 20 31 29 3b  lumn_text(q, 1);
12e0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
12f0: 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63 6f 6c 75  *zDate = db_colu
1300: 6d 6e 5f 74 65 78 74 28 71 2c 20 32 29 3b 0a 20  mn_text(q, 2);. 
1310: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1320: 43 6f 6d 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  Com = db_column_
1330: 74 65 78 74 28 71 2c 20 33 29 3b 0a 20 20 20 20  text(q, 3);.    
1340: 69 6e 74 20 6e 43 68 69 6c 64 20 3d 20 64 62 5f  int nChild = db_
1350: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 71 2c 20 34 29  column_int(q, 4)
1360: 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 65 6e  ;.    int nParen
1370: 74 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e  t = db_column_in
1380: 74 28 71 2c 20 35 29 3b 0a 20 20 20 20 63 68 61  t(q, 5);.    cha
1390: 72 20 2a 7a 46 72 65 65 20 3d 20 30 3b 0a 20 20  r *zFree = 0;.  
13a0: 20 20 63 68 61 72 20 7a 55 75 69 64 5b 55 55 49    char zUuid[UUI
13b0: 44 5f 53 49 5a 45 2b 31 5d 3b 0a 0a 20 20 20 20  D_SIZE+1];..    
13c0: 73 70 72 69 6e 74 66 28 7a 55 75 69 64 2c 20 22  sprintf(zUuid, "
13d0: 25 2e 31 30 73 22 2c 20 7a 49 64 29 3b 0a 20 20  %.10s", zId);.  
13e0: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 7a 44 61    if( memcmp(zDa
13f0: 74 65 2c 20 7a 50 72 65 76 44 61 74 65 2c 20 31  te, zPrevDate, 1
1400: 30 29 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e  0) ){.      prin
1410: 74 66 28 22 3d 3d 3d 20 25 2e 31 30 73 20 3d 3d  tf("=== %.10s ==
1420: 3d 5c 6e 22 2c 20 7a 44 61 74 65 29 3b 0a 20 20  =\n", zDate);.  
1430: 20 20 20 20 6d 65 6d 63 70 79 28 7a 50 72 65 76      memcpy(zPrev
1440: 44 61 74 65 2c 20 7a 44 61 74 65 2c 20 31 30 29  Date, zDate, 10)
1450: 3b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 2b 2b 3b  ;.      nLine++;
1460: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
1470: 43 6f 6d 3d 3d 30 20 29 20 7a 43 6f 6d 20 3d 20  Com==0 ) zCom = 
1480: 22 22 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  "";.    printf("
1490: 25 2e 35 73 20 5b 25 2e 31 30 73 5d 20 22 2c 20  %.5s [%.10s] ", 
14a0: 26 7a 44 61 74 65 5b 31 31 5d 2c 20 7a 55 75 69  &zDate[11], zUui
14b0: 64 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 68 69  d);.    if( nChi
14c0: 6c 64 3e 31 20 7c 7c 20 6e 50 61 72 65 6e 74 3e  ld>1 || nParent>
14d0: 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  1 ){.      int n
14e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72   = 0;.      char
14f0: 20 7a 50 72 65 66 69 78 5b 35 30 5d 3b 0a 20 20   zPrefix[50];.  
1500: 20 20 20 20 69 66 28 20 6e 50 61 72 65 6e 74 3e      if( nParent>
1510: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
1520: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
1530: 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2c 20 7a  zeof(zPrefix), z
1540: 50 72 65 66 69 78 2c 20 22 2a 4d 45 52 47 45 2a  Prefix, "*MERGE*
1550: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d   ");.        n =
1560: 20 73 74 72 6c 65 6e 28 7a 50 72 65 66 69 78 29   strlen(zPrefix)
1570: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1580: 69 66 28 20 6e 43 68 69 6c 64 3e 31 20 29 7b 0a  if( nChild>1 ){.
1590: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
15a0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
15b0: 7a 50 72 65 66 69 78 29 2d 6e 2c 20 26 7a 50 72  zPrefix)-n, &zPr
15c0: 65 66 69 78 5b 6e 5d 2c 20 22 2a 46 4f 52 4b 2a  efix[n], "*FORK*
15d0: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d   ");.        n =
15e0: 20 73 74 72 6c 65 6e 28 7a 50 72 65 66 69 78 29   strlen(zPrefix)
15f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1600: 7a 43 6f 6d 20 3d 20 7a 46 72 65 65 20 3d 20 73  zCom = zFree = s
1610: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1620: 25 73 25 73 22 2c 20 7a 50 72 65 66 69 78 2c 20  %s%s", zPrefix, 
1630: 7a 43 6f 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zCom);.    }.   
1640: 20 6e 4c 69 6e 65 20 2b 3d 20 63 6f 6d 6d 65 6e   nLine += commen
1650: 74 5f 70 72 69 6e 74 28 7a 43 6f 6d 2c 20 31 39  t_print(zCom, 19
1660: 2c 20 37 39 29 3b 0a 20 20 20 20 73 71 6c 69 74  , 79);.    sqlit
1670: 65 33 5f 66 72 65 65 28 7a 46 72 65 65 29 3b 0a  e3_free(zFree);.
1680: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 4f    }.}.../*.** CO
1690: 4d 4d 41 4e 44 3a 20 74 69 6d 65 6c 69 6e 65 0a  MMAND: timeline.
16a0: 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f  **.** Usage: %fo
16b0: 73 73 69 6c 20 74 69 6d 65 6c 69 6e 65 20 3f 44  ssil timeline ?D
16c0: 41 54 45 54 49 4d 45 3f 20 3f 2d 6e 7c 2d 2d 63  ATETIME? ?-n|--c
16d0: 6f 75 6e 74 20 4e 3f 0a 2a 2a 0a 2a 2a 20 50 72  ount N?.**.** Pr
16e0: 69 6e 74 20 61 20 73 75 6d 6d 61 72 79 20 6f 66  int a summary of
16f0: 20 61 63 74 69 76 69 74 79 20 67 6f 69 6e 67 20   activity going 
1700: 62 61 63 6b 77 61 72 64 73 20 69 6e 20 64 61 74  backwards in dat
1710: 65 20 61 6e 64 20 74 69 6d 65 0a 2a 2a 20 73 70  e and time.** sp
1720: 65 63 69 66 69 65 64 20 6f 72 20 66 72 6f 6d 20  ecified or from 
1730: 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 65  the current date
1740: 20 61 6e 64 20 74 69 6d 65 20 69 66 20 6e 6f 20   and time if no 
1750: 61 72 67 75 6d 65 6e 74 73 0a 2a 2a 20 61 72 65  arguments.** are
1760: 20 67 69 76 65 6e 2e 20 20 53 68 6f 77 20 61 73   given.  Show as
1770: 20 6d 61 6e 79 20 61 73 20 4e 20 28 64 65 66 61   many as N (defa
1780: 75 6c 74 20 32 30 29 20 63 68 65 63 6b 2d 69 6e  ult 20) check-in
1790: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74  s..**.** The dat
17a0: 65 20 61 6e 64 20 74 69 6d 65 20 73 68 6f 75 6c  e and time shoul
17b0: 64 20 62 65 20 69 6e 20 74 68 65 20 49 53 4f 38  d be in the ISO8
17c0: 36 30 31 20 66 6f 72 6d 61 74 2e 20 20 46 6f 72  601 format.  For
17d0: 0a 2a 2a 20 65 78 61 6d 70 6c 65 73 3a 20 22 32  .** examples: "2
17e0: 30 30 37 2d 30 38 2d 31 38 20 30 37 3a 32 31 3a  007-08-18 07:21:
17f0: 32 31 22 2e 20 20 54 68 65 20 74 69 6d 65 20 6d  21".  The time m
1800: 61 79 20 62 65 20 6f 6d 69 74 74 65 64 2e 0a 2a  ay be omitted..*
1810: 2a 20 54 69 6d 65 73 20 61 72 65 20 61 63 63 6f  * Times are acco
1820: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63  rding to the loc
1830: 61 6c 20 74 69 6d 65 7a 6f 6e 65 2e 0a 2a 2f 0a  al timezone..*/.
1840: 76 6f 69 64 20 74 69 6d 65 6c 69 6e 65 5f 63 6d  void timeline_cm
1850: 64 28 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74 20  d(void){.  Stmt 
1860: 71 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f  q;.  int n;.  co
1870: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 75 6e 74  nst char *zCount
1880: 3b 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 65 3b  ;.  char *zDate;
1890: 0a 20 20 64 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f  .  db_find_and_o
18a0: 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 29  pen_repository()
18b0: 3b 0a 20 20 7a 43 6f 75 6e 74 20 3d 20 66 69 6e  ;.  zCount = fin
18c0: 64 5f 6f 70 74 69 6f 6e 28 22 6e 22 2c 22 63 6f  d_option("n","co
18d0: 75 6e 74 22 2c 31 29 3b 0a 20 20 69 66 28 20 7a  unt",1);.  if( z
18e0: 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 6e 20 3d  Count ){.    n =
18f0: 20 61 74 6f 69 28 7a 43 6f 75 6e 74 29 3b 0a 20   atoi(zCount);. 
1900: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 20 3d 20   }else{.    n = 
1910: 32 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 2e  20;.  }.  if( g.
1920: 61 72 67 63 21 3d 32 20 26 26 20 67 2e 61 72 67  argc!=2 && g.arg
1930: 63 21 3d 33 20 29 7b 0a 20 20 20 20 75 73 61 67  c!=3 ){.    usag
1940: 65 28 22 59 59 59 59 2d 4d 4d 2d 44 44 74 48 48  e("YYYY-MM-DDtHH
1950: 3a 4d 4d 3a 53 53 22 29 3b 0a 20 20 7d 0a 20 20  :MM:SS");.  }.  
1960: 69 66 28 20 67 2e 61 72 67 63 3d 3d 33 20 29 7b  if( g.argc==3 ){
1970: 0a 20 20 20 20 7a 44 61 74 65 20 3d 20 67 2e 61  .    zDate = g.a
1980: 72 67 76 5b 32 5d 3b 0a 20 20 7d 65 6c 73 65 7b  rgv[2];.  }else{
1990: 0a 20 20 20 20 7a 44 61 74 65 20 3d 20 22 6e 6f  .    zDate = "no
19a0: 77 22 3b 0a 20 20 7d 0a 20 20 64 62 5f 70 72 65  w";.  }.  db_pre
19b0: 70 61 72 65 28 26 71 2c 0a 20 20 20 20 22 53 45  pare(&q,.    "SE
19c0: 4c 45 43 54 20 62 6c 6f 62 2e 72 69 64 2c 20 75  LECT blob.rid, u
19d0: 75 69 64 2c 20 64 61 74 65 74 69 6d 65 28 65 76  uid, datetime(ev
19e0: 65 6e 74 2e 6d 74 69 6d 65 2c 27 6c 6f 63 61 6c  ent.mtime,'local
19f0: 74 69 6d 65 27 29 2c 22 0a 20 20 20 20 22 20 20  time'),".    "  
1a00: 20 20 20 20 20 63 6f 6d 6d 65 6e 74 20 7c 7c 20       comment || 
1a10: 27 20 28 62 79 20 27 20 7c 7c 20 75 73 65 72 20  ' (by ' || user 
1a20: 7c 7c 20 27 29 27 2c 22 0a 20 20 20 20 22 20 20  || ')',".    "  
1a30: 20 20 20 20 20 28 53 45 4c 45 43 54 20 63 6f 75       (SELECT cou
1a40: 6e 74 28 2a 29 20 46 52 4f 4d 20 70 6c 69 6e 6b  nt(*) FROM plink
1a50: 20 57 48 45 52 45 20 70 69 64 3d 62 6c 6f 62 2e   WHERE pid=blob.
1a60: 72 69 64 20 41 4e 44 20 69 73 70 72 69 6d 29 2c  rid AND isprim),
1a70: 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 28 53  ".    "       (S
1a80: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1a90: 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20  ROM plink WHERE 
1aa0: 63 69 64 3d 62 6c 6f 62 2e 72 69 64 29 22 0a 20  cid=blob.rid)". 
1ab0: 20 20 20 22 20 20 46 52 4f 4d 20 65 76 65 6e 74     "  FROM event
1ac0: 2c 20 62 6c 6f 62 22 0a 20 20 20 20 22 20 57 48  , blob".    " WH
1ad0: 45 52 45 20 65 76 65 6e 74 2e 74 79 70 65 3d 27  ERE event.type='
1ae0: 63 69 27 20 41 4e 44 20 62 6c 6f 62 2e 72 69 64  ci' AND blob.rid
1af0: 3d 65 76 65 6e 74 2e 6f 62 6a 69 64 22 0a 20 20  =event.objid".  
1b00: 20 20 22 20 20 20 41 4e 44 20 65 76 65 6e 74 2e    "   AND event.
1b10: 6d 74 69 6d 65 3c 3d 28 53 45 4c 45 43 54 20 6a  mtime<=(SELECT j
1b20: 75 6c 69 61 6e 64 61 79 28 25 51 2c 27 75 74 63  ulianday(%Q,'utc
1b30: 27 29 29 22 0a 20 20 20 20 22 20 4f 52 44 45 52  '))".    " ORDER
1b40: 20 42 59 20 65 76 65 6e 74 2e 6d 74 69 6d 65 20   BY event.mtime 
1b50: 44 45 53 43 22 2c 20 7a 44 61 74 65 0a 20 20 29  DESC", zDate.  )
1b60: 3b 0a 20 20 70 72 69 6e 74 5f 74 69 6d 65 6c 69  ;.  print_timeli
1b70: 6e 65 28 26 71 2c 20 6e 29 3b 0a 20 20 64 62 5f  ne(&q, n);.  db_
1b80: 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 7d 0a  finalize(&q);.}.