Hex Artifact Content
Not logged in

Artifact cea178cd6b519c1716ea500ccb9d945361b5416e:

File src/descendents.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. Also file src/descendents.c part of check-in [15652ff081] - Merged drh's fixes new features (xfer, timeline handling, javascript based timeline highlighting) into my branch. by aku on 2007-08-29 02:55: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 75   contains code u
0380: 73 65 64 20 74 6f 20 66 69 6e 64 20 64 65 63 65  sed to find dece
0390: 6e 64 65 6e 74 73 20 6f 66 20 61 20 76 65 72 73  ndents of a vers
03a0: 69 6f 6e 0a 2a 2a 20 6f 72 20 6c 65 61 76 65 73  ion.** or leaves
03b0: 20 6f 66 20 61 20 76 65 72 73 69 6f 6e 20 74 72   of a version tr
03c0: 65 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  ee..*/.#include 
03d0: 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c  "config.h".#incl
03e0: 75 64 65 20 22 64 65 73 63 65 6e 64 65 6e 74 73  ude "descendents
03f0: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73  .h".#include <as
0400: 73 65 72 74 2e 68 3e 0a 0a 0a 2f 2a 0a 2a 2a 20  sert.h>.../*.** 
0410: 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  Create a tempora
0420: 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22  ry table named "
0430: 6c 65 61 76 65 73 22 20 69 66 20 69 74 20 64 6f  leaves" if it do
0440: 65 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64  es not.** alread
0450: 79 20 65 78 69 73 74 2e 20 20 4c 6f 61 64 20 74  y exist.  Load t
0460: 68 69 73 20 74 61 62 6c 65 20 77 69 74 68 20 74  his table with t
0470: 68 65 20 52 49 44 20 6f 66 20 61 6c 6c 0a 2a 2a  he RID of all.**
0480: 20 76 65 72 73 69 6f 6e 73 20 74 68 61 74 20 61   versions that a
0490: 72 65 20 6c 65 61 76 65 73 20 61 72 65 20 77 68  re leaves are wh
04a0: 69 63 68 20 61 72 65 20 64 65 63 65 6e 64 65 64  ich are decended
04b0: 20 66 72 6f 6d 0a 2a 2a 20 76 65 72 73 69 6f 6e   from.** version
04c0: 20 69 42 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20   iBase..*/.void 
04d0: 63 6f 6d 70 75 74 65 5f 6c 65 61 76 65 73 28 69  compute_leaves(i
04e0: 6e 74 20 69 42 61 73 65 29 7b 0a 20 20 69 6e 74  nt iBase){.  int
04f0: 20 67 65 6e 65 72 61 74 69 6f 6e 20 3d 20 30 3b   generation = 0;
0500: 0a 20 20 69 6e 74 20 63 68 6e 67 43 6e 74 20 3d  .  int chngCnt =
0510: 20 30 3b 0a 0a 20 20 64 62 5f 6d 75 6c 74 69 5f   0;..  db_multi_
0520: 65 78 65 63 28 0a 20 20 20 20 22 43 52 45 41 54  exec(.    "CREAT
0530: 45 20 54 45 4d 50 20 54 41 42 4c 45 20 49 46 20  E TEMP TABLE IF 
0540: 4e 4f 54 20 45 58 49 53 54 53 20 6c 65 61 76 65  NOT EXISTS leave
0550: 73 28 22 0a 20 20 20 20 22 20 20 72 69 64 20 49  s(".    "  rid I
0560: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0570: 45 59 2c 22 0a 20 20 20 20 22 20 20 67 65 6e 65  EY,".    "  gene
0580: 72 61 74 69 6f 6e 20 49 4e 54 45 47 45 52 22 0a  ration INTEGER".
0590: 20 20 20 20 22 29 3b 22 0a 20 20 20 20 22 44 45      ");".    "DE
05a0: 4c 45 54 45 20 46 52 4f 4d 20 6c 65 61 76 65 73  LETE FROM leaves
05b0: 3b 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49  ;".    "INSERT I
05c0: 4e 54 4f 20 6c 65 61 76 65 73 20 56 41 4c 55 45  NTO leaves VALUE
05d0: 53 28 25 64 2c 30 29 3b 22 2c 0a 20 20 20 20 69  S(%d,0);",.    i
05e0: 42 61 73 65 0a 20 20 29 3b 0a 20 20 64 6f 7b 0a  Base.  );.  do{.
05f0: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
0600: 63 28 0a 20 20 20 20 20 20 22 49 4e 53 45 52 54  c(.      "INSERT
0610: 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20   OR IGNORE INTO 
0620: 6c 65 61 76 65 73 28 72 69 64 2c 67 65 6e 65 72  leaves(rid,gener
0630: 61 74 69 6f 6e 29 20 22 0a 20 20 20 20 20 20 22  ation) ".      "
0640: 53 45 4c 45 43 54 20 63 69 64 2c 20 25 64 20 46  SELECT cid, %d F
0650: 52 4f 4d 20 70 6c 69 6e 6b 22 0a 20 20 20 20 20  ROM plink".     
0660: 20 22 20 57 48 45 52 45 20 70 69 64 20 49 4e 20   " WHERE pid IN 
0670: 28 53 45 4c 45 43 54 20 72 69 64 20 46 52 4f 4d  (SELECT rid FROM
0680: 20 6c 65 61 76 65 73 20 57 48 45 52 45 20 67 65   leaves WHERE ge
0690: 6e 65 72 61 74 69 6f 6e 3d 25 64 29 22 2c 0a 20  neration=%d)",. 
06a0: 20 20 20 20 20 67 65 6e 65 72 61 74 69 6f 6e 2b       generation+
06b0: 31 2c 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20  1, generation.  
06c0: 20 20 29 3b 0a 20 20 20 20 67 65 6e 65 72 61 74    );.    generat
06d0: 69 6f 6e 2b 2b 3b 0a 20 20 20 20 63 68 6e 67 43  ion++;.    chngC
06e0: 6e 74 20 3d 20 64 62 5f 63 68 61 6e 67 65 73 28  nt = db_changes(
06f0: 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63 68 6e  );.  }while( chn
0700: 67 43 6e 74 3e 30 20 29 3b 0a 20 20 64 62 5f 6d  gCnt>0 );.  db_m
0710: 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 22  ulti_exec(.    "
0720: 44 45 4c 45 54 45 20 46 52 4f 4d 20 6c 65 61 76  DELETE FROM leav
0730: 65 73 22 0a 20 20 20 20 22 20 57 48 45 52 45 20  es".    " WHERE 
0740: 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 31 20  EXISTS(SELECT 1 
0750: 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45  FROM plink WHERE
0760: 20 70 69 64 3d 72 69 64 29 22 0a 20 20 29 3b 0a   pid=rid)".  );.
0770: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44  }../*.** COMMAND
0780: 3a 20 20 6c 65 61 76 65 73 0a 2a 2a 0a 2a 2a 20  :  leaves.**.** 
0790: 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20 6c  Usage: %fossil l
07a0: 65 61 76 65 73 20 3f 55 55 49 44 3f 0a 2a 2a 20  eaves ?UUID?.** 
07b0: 46 69 6e 64 20 61 6c 6c 20 6c 65 61 66 20 64 65  Find all leaf de
07c0: 73 63 65 6e 64 65 6e 74 73 20 6f 66 20 74 68 65  scendents of the
07d0: 20 63 75 72 72 65 6e 74 20 76 65 72 73 69 6f 6e   current version
07e0: 20 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 73 70   or of the.** sp
07f0: 65 63 69 66 69 65 64 20 76 65 72 73 69 6f 6e 2e  ecified version.
0800: 0a 2a 2f 0a 76 6f 69 64 20 6c 65 61 76 65 73 5f  .*/.void leaves_
0810: 63 6d 64 28 76 6f 69 64 29 7b 0a 20 20 53 74 6d  cmd(void){.  Stm
0820: 74 20 71 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b  t q;.  int base;
0830: 0a 0a 20 20 64 62 5f 6d 75 73 74 5f 62 65 5f 77  ..  db_must_be_w
0840: 69 74 68 69 6e 5f 74 72 65 65 28 29 3b 0a 20 20  ithin_tree();.  
0850: 69 66 28 20 67 2e 61 72 67 63 3d 3d 32 20 29 7b  if( g.argc==2 ){
0860: 0a 20 20 20 20 62 61 73 65 20 3d 20 64 62 5f 6c  .    base = db_l
0870: 67 65 74 5f 69 6e 74 28 22 63 68 65 63 6b 6f 75  get_int("checkou
0880: 74 22 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  t", 0);.  }else{
0890: 0a 20 20 20 20 62 61 73 65 20 3d 20 6e 61 6d 65  .    base = name
08a0: 5f 74 6f 5f 72 69 64 28 67 2e 61 72 67 76 5b 32  _to_rid(g.argv[2
08b0: 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 61  ]);.  }.  if( ba
08c0: 73 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  se==0 ) return;.
08d0: 20 20 63 6f 6d 70 75 74 65 5f 6c 65 61 76 65 73    compute_leaves
08e0: 28 62 61 73 65 29 3b 0a 20 20 64 62 5f 70 72 65  (base);.  db_pre
08f0: 70 61 72 65 28 26 71 2c 0a 20 20 20 20 22 53 45  pare(&q,.    "SE
0900: 4c 45 43 54 20 62 6c 6f 62 2e 72 69 64 2c 20 75  LECT blob.rid, u
0910: 75 69 64 2c 20 64 61 74 65 74 69 6d 65 28 65 76  uid, datetime(ev
0920: 65 6e 74 2e 6d 74 69 6d 65 2c 27 6c 6f 63 61 6c  ent.mtime,'local
0930: 74 69 6d 65 27 29 2c 20 63 6f 6d 6d 65 6e 74 2c  time'), comment,
0940: 20 30 2c 22 0a 20 20 20 20 22 20 20 20 20 20 20   0,".    "      
0950: 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   (SELECT count(*
0960: 29 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45  ) FROM plink WHE
0970: 52 45 20 63 69 64 3d 62 6c 6f 62 2e 72 69 64 29  RE cid=blob.rid)
0980: 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 6c 65  ".    "  FROM le
0990: 61 76 65 73 2c 20 62 6c 6f 62 2c 20 65 76 65 6e  aves, blob, even
09a0: 74 22 0a 20 20 20 20 22 20 57 48 45 52 45 20 62  t".    " WHERE b
09b0: 6c 6f 62 2e 72 69 64 3d 6c 65 61 76 65 73 2e 72  lob.rid=leaves.r
09c0: 69 64 22 0a 20 20 20 20 22 20 20 20 41 4e 44 20  id".    "   AND 
09d0: 65 76 65 6e 74 2e 6f 62 6a 69 64 3d 6c 65 61 76  event.objid=leav
09e0: 65 73 2e 72 69 64 22 0a 20 20 20 20 22 20 4f 52  es.rid".    " OR
09f0: 44 45 52 20 42 59 20 65 76 65 6e 74 2e 6d 74 69  DER BY event.mti
0a00: 6d 65 20 44 45 53 43 22 0a 20 20 29 3b 0a 20 20  me DESC".  );.  
0a10: 70 72 69 6e 74 5f 74 69 6d 65 6c 69 6e 65 28 26  print_timeline(&
0a20: 71 2c 20 32 30 29 3b 0a 20 20 64 62 5f 66 69 6e  q, 20);.  db_fin
0a30: 61 6c 69 7a 65 28 26 71 29 3b 0a 7d 0a 0a 2f 2a  alize(&q);.}../*
0a40: 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 20 62 72  .** COMMAND:  br
0a50: 61 6e 63 68 65 73 0a 2a 2a 0a 2a 2a 20 55 73 61  anches.**.** Usa
0a60: 67 65 3a 20 25 66 6f 73 73 69 6c 20 62 72 61 6e  ge: %fossil bran
0a70: 63 68 65 73 0a 2a 2a 20 46 69 6e 64 20 6c 65 61  ches.** Find lea
0a80: 76 65 73 20 6f 66 20 61 6c 6c 20 62 72 61 6e 63  ves of all branc
0a90: 68 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 62 72 61  hes..*/.void bra
0aa0: 6e 63 68 65 73 5f 63 6d 64 28 76 6f 69 64 29 7b  nches_cmd(void){
0ab0: 0a 20 20 53 74 6d 74 20 71 3b 0a 0a 20 20 64 62  .  Stmt q;..  db
0ac0: 5f 6d 75 73 74 5f 62 65 5f 77 69 74 68 69 6e 5f  _must_be_within_
0ad0: 74 72 65 65 28 29 3b 0a 20 20 64 62 5f 70 72 65  tree();.  db_pre
0ae0: 70 61 72 65 28 26 71 2c 0a 20 20 20 20 22 53 45  pare(&q,.    "SE
0af0: 4c 45 43 54 20 62 6c 6f 62 2e 72 69 64 2c 20 62  LECT blob.rid, b
0b00: 6c 6f 62 2e 75 75 69 64 2c 20 64 61 74 65 74 69  lob.uuid, dateti
0b10: 6d 65 28 65 76 65 6e 74 2e 6d 74 69 6d 65 2c 27  me(event.mtime,'
0b20: 6c 6f 63 61 6c 74 69 6d 65 27 29 2c 22 0a 20 20  localtime'),".  
0b30: 20 20 22 20 20 20 20 20 20 20 65 76 65 6e 74 2e    "       event.
0b40: 63 6f 6d 6d 65 6e 74 2c 20 30 2c 22 0a 20 20 20  comment, 0,".   
0b50: 20 22 20 20 20 20 20 20 20 28 53 45 4c 45 43 54   "       (SELECT
0b60: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70   count(*) FROM p
0b70: 6c 69 6e 6b 20 57 48 45 52 45 20 63 69 64 3d 62  link WHERE cid=b
0b80: 6c 6f 62 2e 72 69 64 29 22 0a 20 20 20 20 22 20  lob.rid)".    " 
0b90: 20 46 52 4f 4d 20 62 6c 6f 62 2c 20 65 76 65 6e   FROM blob, even
0ba0: 74 22 0a 20 20 20 20 22 20 57 48 45 52 45 20 62  t".    " WHERE b
0bb0: 6c 6f 62 2e 72 69 64 20 49 4e 22 0a 20 20 20 20  lob.rid IN".    
0bc0: 22 20 20 20 20 20 20 20 28 53 45 4c 45 43 54 20  "       (SELECT 
0bd0: 63 69 64 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 45  cid FROM plink E
0be0: 58 43 45 50 54 20 53 45 4c 45 43 54 20 70 69 64  XCEPT SELECT pid
0bf0: 20 46 52 4f 4d 20 70 6c 69 6e 6b 29 22 0a 20 20   FROM plink)".  
0c00: 20 20 22 20 20 20 41 4e 44 20 65 76 65 6e 74 2e    "   AND event.
0c10: 6f 62 6a 69 64 3d 62 6c 6f 62 2e 72 69 64 22 0a  objid=blob.rid".
0c20: 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 65      " ORDER BY e
0c30: 76 65 6e 74 2e 6d 74 69 6d 65 20 44 45 53 43 22  vent.mtime DESC"
0c40: 0a 20 20 29 3b 0a 20 20 70 72 69 6e 74 5f 74 69  .  );.  print_ti
0c50: 6d 65 6c 69 6e 65 28 26 71 2c 20 32 30 29 3b 0a  meline(&q, 20);.
0c60: 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71    db_finalize(&q
0c70: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50  );.}../*.** WEBP
0c80: 41 47 45 3a 20 20 6c 65 61 76 65 73 0a 2a 2a 0a  AGE:  leaves.**.
0c90: 2a 2a 20 46 69 6e 64 20 6c 65 61 76 65 73 20 6f  ** Find leaves o
0ca0: 66 20 61 6c 6c 20 62 72 61 6e 63 68 65 73 2e 0a  f all branches..
0cb0: 2a 2f 0a 76 6f 69 64 20 62 72 61 6e 63 68 65 73  */.void branches
0cc0: 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 53  _page(void){.  S
0cd0: 74 6d 74 20 71 3b 0a 0a 20 20 6c 6f 67 69 6e 5f  tmt q;..  login_
0ce0: 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c  check_credential
0cf0: 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b  s();.  if( !g.ok
0d00: 52 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65  Read ){ login_ne
0d10: 65 64 65 64 28 29 3b 20 72 65 74 75 72 6e 3b 20  eded(); return; 
0d20: 7d 0a 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65  }..  style_heade
0d30: 72 28 22 4c 65 61 76 65 73 22 29 3b 0a 20 20 64  r("Leaves");.  d
0d40: 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20  b_prepare(&q,.  
0d50: 20 20 22 53 45 4c 45 43 54 20 62 6c 6f 62 2e 72    "SELECT blob.r
0d60: 69 64 2c 20 62 6c 6f 62 2e 75 75 69 64 2c 20 64  id, blob.uuid, d
0d70: 61 74 65 74 69 6d 65 28 65 76 65 6e 74 2e 6d 74  atetime(event.mt
0d80: 69 6d 65 2c 27 6c 6f 63 61 6c 74 69 6d 65 27 29  ime,'localtime')
0d90: 2c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 65  ,".    "       e
0da0: 76 65 6e 74 2e 63 6f 6d 6d 65 6e 74 2c 20 65 76  vent.comment, ev
0db0: 65 6e 74 2e 75 73 65 72 2c 20 31 2c 20 31 2c 20  ent.user, 1, 1, 
0dc0: 30 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 62  0".    "  FROM b
0dd0: 6c 6f 62 2c 20 65 76 65 6e 74 22 0a 20 20 20 20  lob, event".    
0de0: 22 20 57 48 45 52 45 20 62 6c 6f 62 2e 72 69 64  " WHERE blob.rid
0df0: 20 49 4e 22 0a 20 20 20 20 22 20 20 20 20 20 20   IN".    "      
0e00: 20 28 53 45 4c 45 43 54 20 63 69 64 20 46 52 4f   (SELECT cid FRO
0e10: 4d 20 70 6c 69 6e 6b 20 45 58 43 45 50 54 20 53  M plink EXCEPT S
0e20: 45 4c 45 43 54 20 70 69 64 20 46 52 4f 4d 20 70  ELECT pid FROM p
0e30: 6c 69 6e 6b 29 22 0a 20 20 20 20 22 20 20 20 41  link)".    "   A
0e40: 4e 44 20 65 76 65 6e 74 2e 6f 62 6a 69 64 3d 62  ND event.objid=b
0e50: 6c 6f 62 2e 72 69 64 22 0a 20 20 20 20 22 20 4f  lob.rid".    " O
0e60: 52 44 45 52 20 42 59 20 65 76 65 6e 74 2e 6d 74  RDER BY event.mt
0e70: 69 6d 65 20 44 45 53 43 22 0a 20 20 29 3b 0a 20  ime DESC".  );. 
0e80: 20 77 77 77 5f 70 72 69 6e 74 5f 74 69 6d 65 6c   www_print_timel
0e90: 69 6e 65 28 26 71 2c 20 30 2c 20 30 2c 20 30 29  ine(&q, 0, 0, 0)
0ea0: 3b 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28  ;.  db_finalize(
0eb0: 26 71 29 3b 0a 20 20 40 20 3c 73 63 72 69 70 74  &q);.  @ <script
0ec0: 3e 0a 20 20 40 20 66 75 6e 63 74 69 6f 6e 20 78  >.  @ function x
0ed0: 69 6e 28 69 64 29 7b 0a 20 20 40 20 7d 0a 20 20  in(id){.  @ }.  
0ee0: 40 20 66 75 6e 63 74 69 6f 6e 20 78 6f 75 74 28  @ function xout(
0ef0: 69 64 29 7b 0a 20 20 40 20 7d 0a 20 20 40 20 3c  id){.  @ }.  @ <
0f00: 2f 73 63 72 69 70 74 3e 0a 20 20 73 74 79 6c 65  /script>.  style
0f10: 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a           _footer();.}.