Fossil

Hex Artifact Content
Login

Artifact f698cae20e3740796f6ffa65f69324f27f19d96c:


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 31 34 20 44 2e 20 52 69 63 68  (c) 2014 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 53 69 6d 70 6c 69 66 69 65 64 20 42 53 44 20   Simplified BSD 
00a0: 4c 69 63 65 6e 73 65 20 28 61 6c 73 6f 0a 2a 2a  License (also.**
00b0: 20 6b 6e 6f 77 6e 20 61 73 20 74 68 65 20 22 32   known as the "2
00c0: 2d 43 6c 61 75 73 65 20 4c 69 63 65 6e 73 65 22  -Clause License"
00d0: 20 6f 72 20 22 46 72 65 65 42 53 44 20 4c 69 63   or "FreeBSD Lic
00e0: 65 6e 73 65 22 2e 29 0a 0a 2a 2a 20 54 68 69 73  ense".)..** This
00f0: 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 74   program is dist
0100: 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 68  ributed in the h
0110: 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c 6c  ope that it will
0120: 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 62   be useful,.** b
0130: 75 74 20 77 69 74 68 6f 75 74 20 61 6e 79 20 77  ut without any w
0140: 61 72 72 61 6e 74 79 3b 20 77 69 74 68 6f 75 74  arranty; without
0150: 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 65   even the implie
0160: 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a 2a  d warranty of.**
0170: 20 6d 65 72 63 68 61 6e 74 61 62 69 6c 69 74 79   merchantability
0180: 20 6f 72 20 66 69 74 6e 65 73 73 20 66 6f 72 20   or fitness for 
0190: 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 75 72  a particular pur
01a0: 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75 74 68  pose..**.** Auth
01b0: 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66 6f 72  or contact infor
01c0: 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64 72 68  mation:.**   drh
01d0: 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20 20 20  @hwaci.com.**   
01e0: 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61 63 69  http://www.hwaci
01f0: 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a  .com/drh/.**.***
0200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
0250: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e  ** This file con
0260: 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65 64 20  tains code used 
0270: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
0280: 20 22 70 75 72 67 65 22 20 63 6f 6d 6d 61 6e 64   "purge" command
0290: 20 61 6e 64 0a 2a 2a 20 72 65 6c 61 74 65 64 20   and.** related 
02a0: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 66 6f  functionality fo
02b0: 72 20 72 65 6d 6f 76 69 6e 67 20 63 68 65 63 6b  r removing check
02c0: 2d 69 6e 73 20 66 72 6f 6d 20 61 20 72 65 70 6f  -ins from a repo
02d0: 73 69 74 6f 72 79 2e 20 20 49 74 20 61 6c 73 6f  sitory.  It also
02e0: 0a 2a 2a 20 6d 61 6e 61 67 65 73 20 74 68 65 20  .** manages the 
02f0: 67 72 61 76 65 79 61 72 64 20 6f 66 20 70 75 72  graveyard of pur
0300: 67 65 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  ged content..*/.
0310: 23 69 6e 63 6c 75 64 65 20 22 63 6f 6e 66 69 67  #include "config
0320: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 75  .h".#include "pu
0330: 72 67 65 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  rge.h".#include 
0340: 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a  <assert.h>../*.*
0350: 2a 20 53 51 4c 20 63 6f 64 65 20 75 73 65 64 20  * SQL code used 
0360: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  to initialize th
0370: 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20  e schema of the 
0380: 67 72 61 76 65 79 61 72 64 2e 0a 2a 2a 0a 2a 2a  graveyard..**.**
0390: 20 54 68 65 20 70 75 72 67 65 65 76 65 6e 74 20   The purgeevent 
03a0: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f  table contains o
03b0: 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63  ne entry for eac
03c0: 68 20 70 75 72 67 65 20 65 76 65 6e 74 2e 20 20  h purge event.  
03d0: 46 6f 72 20 65 61 63 68 0a 2a 2a 20 70 75 72 67  For each.** purg
03e0: 65 20 65 76 65 6e 74 2c 20 6d 75 6c 74 69 70 6c  e event, multipl
03f0: 65 20 61 72 74 69 66 61 63 74 73 20 6d 69 67 68  e artifacts migh
0400: 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 6d 6f  t have been remo
0410: 76 65 64 2e 20 20 45 61 63 68 20 72 65 6d 6f 76  ved.  Each remov
0420: 65 64 0a 2a 2a 20 61 72 74 69 66 61 63 74 20 69  ed.** artifact i
0430: 73 20 73 74 6f 72 65 64 20 61 73 20 61 6e 20 65  s stored as an e
0440: 6e 74 72 79 20 69 6e 20 74 68 65 20 70 75 72 67  ntry in the purg
0450: 65 69 74 65 6d 20 74 61 62 6c 65 2e 0a 2a 2a 0a  eitem table..**.
0460: 2a 2a 20 54 68 65 20 70 75 72 67 65 65 76 65 6e  ** The purgeeven
0470: 74 20 61 6e 64 20 70 75 72 67 65 69 74 65 6d 20  t and purgeitem 
0480: 74 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 73  tables are not s
0490: 79 6e 63 65 64 2c 20 65 76 65 6e 20 62 79 20 74  ynced, even by t
04a0: 68 65 0a 2a 2a 20 22 66 6f 73 73 69 6c 20 63 6f  he.** "fossil co
04b0: 6e 66 69 67 22 20 63 6f 6d 6d 61 6e 64 2e 20 20  nfig" command.  
04c0: 54 68 65 79 20 65 78 69 73 74 20 6f 6e 6c 79 20  They exist only 
04d0: 61 73 20 61 20 62 61 63 6b 75 70 20 69 6e 20 63  as a backup in c
04e0: 61 73 65 20 6f 66 20 61 0a 2a 2a 20 6d 69 73 74  ase of a.** mist
04f0: 61 6b 65 6e 20 70 75 72 67 65 20 6f 72 20 66 6f  aken purge or fo
0500: 72 20 63 6f 6e 74 65 6e 74 20 72 65 63 6f 76 65  r content recove
0510: 72 79 20 69 6e 20 63 61 73 65 20 74 68 65 72 65  ry in case there
0520: 20 69 73 20 61 20 62 75 67 20 69 6e 20 74 68 65   is a bug in the
0530: 0a 2a 2a 20 70 75 72 67 65 20 63 6f 6d 6d 61 6e  .** purge comman
0540: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
0550: 73 74 20 63 68 61 72 20 7a 50 75 72 67 65 49 6e  st char zPurgeIn
0560: 69 74 5b 5d 20 3d 0a 40 20 43 52 45 41 54 45 20  it[] =.@ CREATE 
0570: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
0580: 53 54 53 20 22 25 77 22 2e 70 75 72 67 65 65 76  STS "%w".purgeev
0590: 65 6e 74 28 0a 40 20 20 20 70 65 69 64 20 49 4e  ent(.@   peid IN
05a0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
05b0: 59 2c 20 20 2d 2d 20 55 6e 69 71 75 65 20 49 44  Y,  -- Unique ID
05c0: 20 66 6f 72 20 74 68 65 20 70 75 72 67 65 20 65   for the purge e
05d0: 76 65 6e 74 0a 40 20 20 20 63 74 69 6d 65 20 44  vent.@   ctime D
05e0: 41 54 45 54 49 4d 45 2c 20 20 20 20 20 20 20 20  ATETIME,        
05f0: 20 20 20 20 2d 2d 20 57 68 65 6e 20 70 75 72 67      -- When purg
0600: 65 20 6f 63 63 75 72 72 65 64 2e 20 20 53 65 63  e occurred.  Sec
0610: 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e  onds since 1970.
0620: 0a 40 20 20 20 70 6e 6f 74 65 73 20 54 45 58 54  .@   pnotes TEXT
0630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0640: 2d 2d 20 48 75 6d 61 6e 2d 72 65 61 64 61 62 6c  -- Human-readabl
0650: 65 20 6e 6f 74 65 73 20 61 62 6f 75 74 20 74 68  e notes about th
0660: 65 20 70 75 72 67 65 20 65 76 65 6e 74 0a 40 20  e purge event.@ 
0670: 29 3b 0a 40 20 43 52 45 41 54 45 20 54 41 42 4c  );.@ CREATE TABL
0680: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
0690: 22 25 77 22 2e 70 75 72 67 65 69 74 65 6d 28 0a  "%w".purgeitem(.
06a0: 40 20 20 20 70 69 69 64 20 49 4e 54 45 47 45 52  @   piid INTEGER
06b0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 20 2d   PRIMARY KEY,  -
06c0: 2d 20 49 44 20 66 6f 72 20 74 68 65 20 70 75 72  - ID for the pur
06d0: 67 65 20 69 74 65 6d 0a 40 20 20 20 70 65 69 64  ge item.@   peid
06e0: 20 49 4e 54 45 47 45 52 20 52 45 46 45 52 45 4e   INTEGER REFEREN
06f0: 43 45 53 20 70 75 72 67 65 65 76 65 6e 74 20 4f  CES purgeevent O
0700: 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41 44 45  N DELETE CASCADE
0710: 2c 20 2d 2d 20 50 75 72 67 65 20 65 76 65 6e 74  , -- Purge event
0720: 0a 40 20 20 20 6f 72 69 64 20 49 4e 54 45 47 45  .@   orid INTEGE
0730: 52 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R,              
0740: 2d 2d 20 4f 72 69 67 69 6e 61 6c 20 52 49 44 20  -- Original RID 
0750: 62 65 66 6f 72 65 20 70 75 72 67 65 64 0a 40 20  before purged.@ 
0760: 20 20 75 75 69 64 20 54 45 58 54 20 4e 4f 54 20    uuid TEXT NOT 
0770: 4e 55 4c 4c 2c 20 20 20 20 20 20 20 20 2d 2d 20  NULL,        -- 
0780: 68 61 73 68 20 6f 66 20 74 68 65 20 70 75 72 67  hash of the purg
0790: 65 64 20 61 72 74 69 66 61 63 74 0a 40 20 20 20  ed artifact.@   
07a0: 73 72 63 69 64 20 49 4e 54 45 47 45 52 2c 20 20  srcid INTEGER,  
07b0: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 42 61             -- Ba
07c0: 73 69 73 20 70 75 72 67 65 69 74 65 6d 20 66 6f  sis purgeitem fo
07d0: 72 20 64 65 6c 74 61 20 63 6f 6d 70 72 65 73 73  r delta compress
07e0: 69 6f 6e 0a 40 20 20 20 69 73 50 72 69 76 61 74  ion.@   isPrivat
07f0: 65 20 42 4f 4f 4c 45 41 4e 2c 20 20 20 20 20 20  e BOOLEAN,      
0800: 20 20 20 2d 2d 20 54 72 75 65 20 69 66 20 61 72     -- True if ar
0810: 74 69 66 61 63 74 20 77 61 73 20 6f 72 69 67 69  tifact was origi
0820: 6e 61 6c 6c 79 20 70 72 69 76 61 74 65 0a 40 20  nally private.@ 
0830: 20 20 73 7a 20 49 4e 54 20 4e 4f 54 20 4e 55 4c    sz INT NOT NUL
0840: 4c 2c 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20  L,           -- 
0850: 55 6e 63 6f 6d 70 72 65 73 73 65 64 20 73 69 7a  Uncompressed siz
0860: 65 20 6f 66 20 74 68 65 20 70 75 72 67 65 64 20  e of the purged 
0870: 61 72 74 69 66 61 63 74 0a 40 20 20 20 64 65 73  artifact.@   des
0880: 63 20 54 45 58 54 2c 20 20 20 20 20 20 20 20 20  c TEXT,         
0890: 20 20 20 20 20 20 20 20 2d 2d 20 42 72 69 65 66          -- Brief
08a0: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
08b0: 74 68 69 73 20 61 72 74 69 66 61 63 74 0a 40 20  this artifact.@ 
08c0: 20 20 64 61 74 61 20 42 4c 4f 42 20 20 20 20 20    data BLOB     
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
08e0: 43 6f 6d 70 72 65 73 73 65 64 20 61 72 74 69 66  Compressed artif
08f0: 61 63 74 20 63 6f 6e 74 65 6e 74 0a 40 20 29 3b  act content.@ );
0900: 0a 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6c 61 67 73 20  .;../*.** Flags 
0910: 66 6f 72 20 74 68 65 20 70 75 72 67 65 5f 61 72  for the purge_ar
0920: 74 69 66 61 63 74 5f 6c 69 73 74 28 29 20 66 75  tifact_list() fu
0930: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 20 49  nction..*/.#if I
0940: 4e 54 45 52 46 41 43 45 0a 23 64 65 66 69 6e 65  NTERFACE.#define
0950: 20 50 55 52 47 45 5f 4d 4f 56 45 54 4f 5f 47 52   PURGE_MOVETO_GR
0960: 41 56 45 59 41 52 44 20 20 30 78 30 30 30 31 20  AVEYARD  0x0001 
0970: 20 20 20 2f 2a 20 4d 6f 76 65 20 61 72 74 69 66     /* Move artif
0980: 61 63 74 73 20 69 6e 20 67 72 61 76 65 79 61 72  acts in graveyar
0990: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 55 52  d */.#define PUR
09a0: 47 45 5f 45 58 50 4c 41 49 4e 5f 4f 4e 4c 59 20  GE_EXPLAIN_ONLY 
09b0: 20 20 20 20 20 30 78 30 30 30 32 20 20 20 20 2f       0x0002    /
09c0: 2a 20 53 68 6f 77 20 77 68 61 74 20 77 6f 75 6c  * Show what woul
09d0: 64 20 68 61 76 65 20 68 61 70 70 65 6e 65 64 20  d have happened 
09e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 55 52 47 45  */.#define PURGE
09f0: 5f 50 52 49 4e 54 5f 53 55 4d 4d 41 52 59 20 20  _PRINT_SUMMARY  
0a00: 20 20 20 30 78 30 30 30 34 20 20 20 20 2f 2a 20     0x0004    /* 
0a10: 50 72 69 6e 74 20 61 20 73 75 6d 6d 61 72 79 20  Print a summary 
0a20: 72 65 70 6f 72 74 20 61 74 20 65 6e 64 20 2a 2f  report at end */
0a30: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0a40: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 72 67  his routine purg
0a50: 65 73 20 6d 75 6c 74 69 70 6c 65 20 61 72 74 69  es multiple arti
0a60: 66 61 63 74 73 20 66 72 6f 6d 20 74 68 65 20 72  facts from the r
0a70: 65 70 6f 73 69 74 6f 72 79 2c 20 74 72 61 6e 73  epository, trans
0a80: 66 65 72 69 6e 67 0a 2a 2a 20 74 68 6f 73 65 20  fering.** those 
0a90: 61 72 74 69 66 61 63 74 73 20 69 6e 74 6f 20 74  artifacts into t
0aa0: 68 65 20 50 55 52 47 45 49 54 45 4d 20 74 61 62  he PURGEITEM tab
0ab0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 50 72 69 6f 72 20  le..**.** Prior 
0ac0: 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  to invoking this
0ad0: 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 63 61   routine, the ca
0ae0: 6c 6c 65 72 20 6d 75 73 74 20 63 72 65 61 74 65  ller must create
0af0: 20 61 20 28 54 45 4d 50 29 20 74 61 62 6c 65 0a   a (TEMP) table.
0b00: 2a 2a 20 6e 61 6d 65 64 20 7a 54 61 62 20 74 68  ** named zTab th
0b10: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
0b20: 52 49 44 20 6f 66 20 65 76 65 72 79 20 61 72 74  RID of every art
0b30: 69 66 61 63 74 20 74 6f 20 62 65 20 70 75 72 67  ifact to be purg
0b40: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
0b50: 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
0b60: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
0b70: 20 20 20 20 28 31 29 20 43 72 65 61 74 65 20 74      (1) Create t
0b80: 68 65 20 70 75 72 67 65 65 76 65 6e 74 20 61 6e  he purgeevent an
0b90: 64 20 70 75 72 67 65 69 74 65 6d 20 74 61 62 6c  d purgeitem tabl
0ba0: 65 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 0a  es, if required.
0bb0: 2a 2a 20 20 20 20 28 32 29 20 43 72 65 61 74 65  **    (2) Create
0bc0: 20 61 20 6e 65 77 20 70 75 72 67 65 65 76 65 6e   a new purgeeven
0bd0: 74 0a 2a 2a 20 20 20 20 28 33 29 20 4d 61 6b 65  t.**    (3) Make
0be0: 20 73 75 72 65 20 6e 6f 20 44 45 4c 54 41 20 74   sure no DELTA t
0bf0: 61 62 6c 65 20 65 6e 74 72 69 65 73 20 64 65 70  able entries dep
0c00: 65 6e 64 20 6f 6e 20 70 75 72 67 65 64 20 61 72  end on purged ar
0c10: 74 69 66 61 63 74 73 0a 2a 2a 20 20 20 20 28 34  tifacts.**    (4
0c20: 29 20 43 72 65 61 74 65 20 6e 65 77 20 70 75 72  ) Create new pur
0c30: 67 65 69 74 65 6d 20 65 6e 74 72 69 65 73 20 66  geitem entries f
0c40: 6f 72 20 65 61 63 68 20 70 75 72 67 65 64 20 61  or each purged a
0c50: 72 74 69 66 61 63 74 0a 2a 2a 20 20 20 20 28 35  rtifact.**    (5
0c60: 29 20 52 65 6d 6f 76 65 20 70 75 72 67 65 64 20  ) Remove purged 
0c70: 61 72 74 69 66 61 63 74 73 20 66 72 6f 6d 20 74  artifacts from t
0c80: 68 65 20 42 4c 4f 42 20 74 61 62 6c 65 0a 2a 2a  he BLOB table.**
0c90: 20 20 20 20 28 36 29 20 52 65 6d 6f 76 65 20 72      (6) Remove r
0ca0: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 70 75 72  eferences to pur
0cb0: 67 65 64 20 61 72 74 69 66 61 63 74 73 20 69 6e  ged artifacts in
0cc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
0cd0: 61 62 6c 65 73 3a 0a 2a 2a 20 20 20 20 20 20 20  ables:.**       
0ce0: 20 20 28 61 29 20 45 56 45 4e 54 0a 2a 2a 20 20    (a) EVENT.**  
0cf0: 20 20 20 20 20 20 20 28 62 29 20 50 52 49 56 41         (b) PRIVA
0d00: 54 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 28 63  TE.**         (c
0d10: 29 20 4d 4c 49 4e 4b 0a 2a 2a 20 20 20 20 20 20  ) MLINK.**      
0d20: 20 20 20 28 64 29 20 50 4c 49 4e 4b 0a 2a 2a 20     (d) PLINK.** 
0d30: 20 20 20 20 20 20 20 20 28 65 29 20 4c 45 41 46          (e) LEAF
0d40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 28 66 29 20  .**         (f) 
0d50: 55 4e 43 4c 55 53 54 45 52 45 44 0a 2a 2a 20 20  UNCLUSTERED.**  
0d60: 20 20 20 20 20 20 20 28 67 29 20 55 4e 53 45 4e         (g) UNSEN
0d70: 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 28 68 29  T.**         (h)
0d80: 20 42 41 43 4b 4c 49 4e 4b 0a 2a 2a 20 20 20 20   BACKLINK.**    
0d90: 20 20 20 20 20 28 69 29 20 41 54 54 41 43 48 4d       (i) ATTACHM
0da0: 45 4e 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 28  ENT.**         (
0db0: 6a 29 20 54 49 43 4b 45 54 43 48 4e 47 0a 2a 2a  j) TICKETCHNG.**
0dc0: 20 20 20 20 28 37 29 20 49 66 20 61 6e 79 20 74      (7) If any t
0dd0: 69 63 6b 65 74 20 61 72 74 69 66 61 63 74 73 20  icket artifacts 
0de0: 77 65 72 65 20 72 65 6d 6f 76 65 64 20 28 36 6a  were removed (6j
0df0: 29 20 74 68 65 6e 20 72 65 62 75 69 6c 64 20 74  ) then rebuild t
0e00: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 72  he.**        cor
0e10: 72 65 73 70 6f 6e 64 69 6e 67 20 74 69 63 6b 65  responding ticke
0e20: 74 20 65 6e 74 72 69 65 73 2e 20 20 50 6f 73 73  t entries.  Poss
0e30: 69 62 6c 79 20 72 65 6d 6f 76 65 20 65 6e 74 72  ibly remove entr
0e40: 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 20 20 20 20  ies from.**     
0e50: 20 20 20 74 68 65 20 74 69 63 6b 65 74 20 74 61     the ticket ta
0e60: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 65 70 73  ble..**.** Steps
0e70: 20 31 2d 34 20 28 73 61 76 69 6e 67 20 74 68 65   1-4 (saving the
0e80: 20 70 75 72 67 65 64 20 61 72 74 69 66 61 63 74   purged artifact
0e90: 73 20 69 6e 74 6f 20 74 68 65 20 67 72 61 76 65  s into the grave
0ea0: 79 61 72 64 29 20 61 72 65 20 6f 6e 6c 79 0a 2a  yard) are only.*
0eb0: 2a 20 75 6e 64 65 72 74 61 6b 65 6e 20 69 66 20  * undertaken if 
0ec0: 74 68 65 20 6d 6f 76 65 54 6f 47 72 61 76 65 79  the moveToGravey
0ed0: 61 72 64 20 66 6c 61 67 20 69 73 20 74 72 75 65  ard flag is true
0ee0: 2e 0a 2a 2f 0a 69 6e 74 20 70 75 72 67 65 5f 61  ..*/.int purge_a
0ef0: 72 74 69 66 61 63 74 5f 6c 69 73 74 28 0a 20 20  rtifact_list(.  
0f00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
0f10: 2c 20 20 20 20 20 20 20 2f 2a 20 54 45 4d 50 20  ,       /* TEMP 
0f20: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
0f30: 20 6c 69 73 74 20 6f 66 20 52 49 44 53 20 74 6f   list of RIDS to
0f40: 20 62 65 20 70 75 72 67 65 64 20 2a 2f 0a 20 20   be purged */.  
0f50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 6f 74  const char *zNot
0f60: 65 2c 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20  e,      /* Text 
0f70: 6f 66 20 74 68 65 20 70 75 72 67 65 65 76 65 6e  of the purgeeven
0f80: 74 2e 70 6e 6f 74 65 73 20 66 69 65 6c 64 20 2a  t.pnotes field *
0f90: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 75 72  /.  unsigned pur
0fa0: 67 65 46 6c 61 67 73 20 20 20 20 20 2f 2a 20 7a  geFlags     /* z
0fb0: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 50 55 52 47  ero or more PURG
0fc0: 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  E_* flags */.){.
0fd0: 20 20 69 6e 74 20 70 65 69 64 20 3d 20 30 3b 20    int peid = 0; 
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ff0: 2f 2a 20 4e 65 77 20 70 75 72 67 65 65 76 65 6e  /* New purgeeven
1000: 74 20 49 44 20 2a 2f 0a 20 20 53 74 6d 74 20 71  t ID */.  Stmt q
1010: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1020: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
1030: 61 6c 2d 75 73 65 20 70 72 65 70 61 72 65 64 20  al-use prepared 
1040: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63  statement */.  c
1050: 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72  har *z;..  asser
1060: 74 28 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f  t( g.repositoryO
1070: 70 65 6e 20 29 3b 20 20 20 2f 2a 20 4d 61 69 6e  pen );   /* Main
1080: 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 61   database must a
1090: 6c 72 65 61 64 79 20 62 65 20 6f 70 65 6e 20 2a  lready be open *
10a0: 2f 0a 20 20 64 62 5f 62 65 67 69 6e 5f 74 72 61  /.  db_begin_tra
10b0: 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 7a 20  nsaction();.  z 
10c0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
10d0: 66 28 22 49 4e 20 5c 22 25 77 5c 22 22 2c 20 7a  f("IN \"%w\"", z
10e0: 54 61 62 29 3b 0a 20 20 64 65 73 63 72 69 62 65  Tab);.  describe
10f0: 5f 61 72 74 69 66 61 63 74 73 28 7a 29 3b 0a 20  _artifacts(z);. 
1100: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
1110: 3b 0a 20 20 64 65 73 63 72 69 62 65 5f 61 72 74  ;.  describe_art
1120: 69 66 61 63 74 73 5f 74 6f 5f 73 74 64 6f 75 74  ifacts_to_stdout
1130: 28 30 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 54 68  (0, 0);..  /* Th
1140: 65 20 65 78 70 6c 61 69 6e 2d 6f 6e 6c 79 20 66  e explain-only f
1150: 6c 61 67 73 20 63 61 75 73 65 73 20 74 68 69 73  lags causes this
1160: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 69 73 74   routine to list
1170: 20 74 68 65 20 61 72 74 69 66 61 63 74 73 0a 20   the artifacts. 
1180: 20 2a 2a 20 74 68 61 74 20 77 6f 75 6c 64 20 68   ** that would h
1190: 61 76 65 20 62 65 65 6e 20 70 75 72 67 65 64 20  ave been purged 
11a0: 62 75 74 20 74 6f 20 6e 6f 74 20 61 63 74 75 61  but to not actua
11b0: 6c 6c 79 20 6d 61 6b 65 20 61 6e 79 20 63 68 61  lly make any cha
11c0: 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  nges.  ** to the
11d0: 20 72 65 70 6f 73 69 74 6f 72 79 2e 0a 20 20 2a   repository..  *
11e0: 2f 0a 20 20 69 66 28 20 70 75 72 67 65 46 6c 61  /.  if( purgeFla
11f0: 67 73 20 26 20 50 55 52 47 45 5f 45 58 50 4c 41  gs & PURGE_EXPLA
1200: 49 4e 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 64  IN_ONLY ){.    d
1210: 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  b_end_transactio
1220: 6e 28 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  n(0);.    return
1230: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61   0;.  }..  /* Ma
1240: 6b 65 20 73 75 72 65 20 77 65 20 61 72 65 20 6e  ke sure we are n
1250: 6f 74 20 72 65 6d 6f 76 69 6e 67 20 61 20 6d 61  ot removing a ma
1260: 6e 69 66 65 73 74 20 74 68 61 74 20 69 73 20 74  nifest that is t
1270: 68 65 20 62 61 73 65 6c 69 6e 65 20 6f 66 20 73  he baseline of s
1280: 6f 6d 65 0a 20 20 2a 2a 20 6d 61 6e 69 66 65 73  ome.  ** manifes
1290: 74 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  t that is being 
12a0: 6c 65 66 74 20 62 65 68 69 6e 64 2e 20 20 54 68  left behind.  Th
12b0: 69 73 20 73 74 65 70 20 69 73 20 6e 6f 74 20 73  is step is not s
12c0: 74 72 69 63 74 6c 79 20 6e 65 63 65 73 73 61 72  trictly necessar
12d0: 79 2e 0a 20 20 2a 2a 20 69 73 20 69 73 20 6a 75  y..  ** is is ju
12e0: 73 74 20 61 20 73 61 66 65 74 79 20 63 68 65 63  st a safety chec
12f0: 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 70 75 72 67  k. */.  if( purg
1300: 65 5f 62 61 73 65 6c 69 6e 65 5f 6f 75 74 5f 66  e_baseline_out_f
1310: 72 6f 6d 5f 75 6e 64 65 72 5f 64 65 6c 74 61 28  rom_under_delta(
1320: 7a 54 61 62 29 20 29 7b 0a 20 20 20 20 66 6f 73  zTab) ){.    fos
1330: 73 69 6c 5f 66 61 74 61 6c 28 22 61 74 74 65 6d  sil_fatal("attem
1340: 70 74 20 74 6f 20 70 75 72 67 65 20 61 20 62 61  pt to purge a ba
1350: 73 65 6c 69 6e 65 20 6d 61 6e 69 66 65 73 74 20  seline manifest 
1360: 77 69 74 68 6f 75 74 20 61 6c 73 6f 20 70 75 72  without also pur
1370: 67 69 6e 67 20 22 0a 20 20 20 20 20 20 20 20 20  ging ".         
1380: 20 20 20 20 20 20 20 20 22 61 6c 6c 20 6f 66 20          "all of 
1390: 69 74 73 20 64 65 6c 74 61 73 22 29 3b 0a 20 20  its deltas");.  
13a0: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
13b0: 65 20 74 68 61 74 20 6e 6f 20 64 65 6c 74 61 20  e that no delta 
13c0: 74 68 61 74 20 69 73 20 6c 65 66 74 20 62 65 68  that is left beh
13d0: 69 6e 64 20 72 65 71 75 69 72 65 73 20 61 20 70  ind requires a p
13e0: 75 72 67 65 64 20 61 72 74 69 66 61 63 74 0a 20  urged artifact. 
13f0: 20 2a 2a 20 61 73 20 69 74 73 20 62 61 73 69 73   ** as its basis
1400: 2e 20 20 49 66 20 73 75 63 68 20 61 72 74 69 66  .  If such artif
1410: 61 63 74 73 20 65 78 69 73 74 2c 20 67 6f 20 61  acts exist, go a
1420: 68 65 61 64 20 61 6e 64 20 75 6e 64 65 6c 74 61  head and undelta
1430: 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 2a 2f 0a   them now..  */.
1440: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c    db_prepare(&q,
1450: 20 22 53 45 4c 45 43 54 20 72 69 64 20 46 52 4f   "SELECT rid FRO
1460: 4d 20 64 65 6c 74 61 20 57 48 45 52 45 20 73 72  M delta WHERE sr
1470: 63 69 64 20 49 4e 20 5c 22 25 77 5c 22 22 0a 20  cid IN \"%w\"". 
1480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1490: 22 20 41 4e 44 20 72 69 64 20 4e 4f 54 20 49 4e  " AND rid NOT IN
14a0: 20 5c 22 25 77 5c 22 22 2c 20 7a 54 61 62 2c 20   \"%w\"", zTab, 
14b0: 7a 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20  zTab);.  while( 
14c0: 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c  db_step(&q)==SQL
14d0: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69  ITE_ROW ){.    i
14e0: 6e 74 20 72 69 64 20 3d 20 64 62 5f 63 6f 6c 75  nt rid = db_colu
14f0: 6d 6e 5f 69 6e 74 28 26 71 2c 20 30 29 3b 0a 20  mn_int(&q, 0);. 
1500: 20 20 20 63 6f 6e 74 65 6e 74 5f 75 6e 64 65 6c     content_undel
1510: 74 61 28 72 69 64 29 3b 0a 20 20 20 20 76 65 72  ta(rid);.    ver
1520: 69 66 79 5f 62 65 66 6f 72 65 5f 63 6f 6d 6d 69  ify_before_commi
1530: 74 28 72 69 64 29 3b 0a 20 20 7d 0a 20 20 64 62  t(rid);.  }.  db
1540: 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 0a  _finalize(&q);..
1550: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74    /* Construct t
1560: 68 65 20 67 72 61 76 65 79 61 72 64 20 61 6e 64  he graveyard and
1570: 20 63 6f 70 79 20 74 68 65 20 61 72 74 69 66 61   copy the artifa
1580: 63 74 73 20 74 6f 20 62 65 20 70 75 72 67 65 64  cts to be purged
1590: 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 67   into the.  ** g
15a0: 72 61 76 65 79 61 72 64 20 2a 2f 0a 20 20 69 66  raveyard */.  if
15b0: 28 20 70 75 72 67 65 46 6c 61 67 73 20 26 20 50  ( purgeFlags & P
15c0: 55 52 47 45 5f 4d 4f 56 45 54 4f 5f 47 52 41 56  URGE_MOVETO_GRAV
15d0: 45 59 41 52 44 20 29 7b 0a 20 20 20 20 64 62 5f  EYARD ){.    db_
15e0: 6d 75 6c 74 69 5f 65 78 65 63 28 7a 50 75 72 67  multi_exec(zPurg
15f0: 65 49 6e 69 74 20 2f 2a 77 6f 72 6b 73 2d 6c 69  eInit /*works-li
1600: 6b 65 3a 22 25 77 25 77 22 2a 2f 2c 0a 20 20 20  ke:"%w%w"*/,.   
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1620: 72 65 70 6f 73 69 74 6f 72 79 22 2c 20 22 72 65  repository", "re
1630: 70 6f 73 69 74 6f 72 79 22 29 3b 0a 20 20 20 20  pository");.    
1640: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20  db_multi_exec(. 
1650: 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
1660: 4f 20 70 75 72 67 65 65 76 65 6e 74 28 63 74 69  O purgeevent(cti
1670: 6d 65 2c 70 6e 6f 74 65 73 29 20 56 41 4c 55 45  me,pnotes) VALUE
1680: 53 28 6e 6f 77 28 29 2c 25 51 29 22 2c 20 7a 4e  S(now(),%Q)", zN
1690: 6f 74 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 70  ote.    );.    p
16a0: 65 69 64 20 3d 20 64 62 5f 6c 61 73 74 5f 69 6e  eid = db_last_in
16b0: 73 65 72 74 5f 72 6f 77 69 64 28 29 3b 0a 20 20  sert_rowid();.  
16c0: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c    db_prepare(&q,
16d0: 20 22 53 45 4c 45 43 54 20 72 69 64 20 46 52 4f   "SELECT rid FRO
16e0: 4d 20 64 65 6c 74 61 20 57 48 45 52 45 20 72 69  M delta WHERE ri
16f0: 64 20 49 4e 20 5c 22 25 77 5c 22 22 0a 20 20 20  d IN \"%w\"".   
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 22 20 41 4e 44 20 73 72 63 69 64 20 4e 4f 54 20  " AND srcid NOT 
1720: 49 4e 20 5c 22 25 77 5c 22 22 2c 20 7a 54 61 62  IN \"%w\"", zTab
1730: 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20 77 68 69  , zTab);.    whi
1740: 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d  le( db_step(&q)=
1750: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
1760: 20 20 20 20 20 69 6e 74 20 72 69 64 20 3d 20 64       int rid = d
1770: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c  b_column_int(&q,
1780: 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 65   0);.      conte
1790: 6e 74 5f 75 6e 64 65 6c 74 61 28 72 69 64 29 3b  nt_undelta(rid);
17a0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 66 69  .    }.    db_fi
17b0: 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 20 20  nalize(&q);.    
17c0: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20  db_multi_exec(. 
17d0: 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
17e0: 4f 20 70 75 72 67 65 69 74 65 6d 28 70 65 69 64  O purgeitem(peid
17f0: 2c 6f 72 69 64 2c 75 75 69 64 2c 73 7a 2c 69 73  ,orid,uuid,sz,is
1800: 50 72 69 76 61 74 65 2c 64 65 73 63 2c 64 61 74  Private,desc,dat
1810: 61 29 22 0a 20 20 20 20 20 20 22 20 20 53 45 4c  a)".      "  SEL
1820: 45 43 54 20 25 64 2c 20 72 69 64 2c 20 75 75 69  ECT %d, rid, uui
1830: 64 2c 20 73 69 7a 65 2c 22 0a 20 20 20 20 20 20  d, size,".      
1840: 22 20 20 20 20 45 58 49 53 54 53 28 53 45 4c 45  "    EXISTS(SELE
1850: 43 54 20 31 20 46 52 4f 4d 20 70 72 69 76 61 74  CT 1 FROM privat
1860: 65 20 57 48 45 52 45 20 70 72 69 76 61 74 65 2e  e WHERE private.
1870: 72 69 64 3d 62 6c 6f 62 2e 72 69 64 29 2c 22 0a  rid=blob.rid),".
1880: 20 20 20 20 20 20 22 20 20 20 20 28 53 45 4c 45        "    (SELE
1890: 43 54 20 73 75 6d 6d 61 72 79 20 46 52 4f 4d 20  CT summary FROM 
18a0: 64 65 73 63 72 69 70 74 69 6f 6e 20 57 48 45 52  description WHER
18b0: 45 20 72 69 64 3d 62 6c 6f 62 2e 72 69 64 29 2c  E rid=blob.rid),
18c0: 22 0a 20 20 20 20 20 20 22 20 20 20 20 63 6f 6e  ".      "    con
18d0: 74 65 6e 74 22 0a 20 20 20 20 20 20 22 20 20 20  tent".      "   
18e0: 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45   FROM blob WHERE
18f0: 20 72 69 64 20 49 4e 20 5c 22 25 77 5c 22 22 2c   rid IN \"%w\"",
1900: 0a 20 20 20 20 20 20 70 65 69 64 2c 20 7a 54 61  .      peid, zTa
1910: 62 0a 20 20 20 20 29 3b 0a 20 20 20 20 64 62 5f  b.    );.    db_
1920: 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20  multi_exec(.    
1930: 20 20 22 55 50 44 41 54 45 20 70 75 72 67 65 69    "UPDATE purgei
1940: 74 65 6d 22 0a 20 20 20 20 20 20 22 20 20 20 53  tem".      "   S
1950: 45 54 20 73 72 63 69 64 3d 28 53 45 4c 45 43 54  ET srcid=(SELECT
1960: 20 70 69 69 64 20 46 52 4f 4d 20 70 75 72 67 65   piid FROM purge
1970: 69 74 65 6d 20 70 78 2c 20 64 65 6c 74 61 22 0a  item px, delta".
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 20 22 20 57 48 45 52 45 20 70 78 2e 6f      " WHERE px.o
19a0: 72 69 64 3d 64 65 6c 74 61 2e 73 72 63 69 64 22  rid=delta.srcid"
19b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19c0: 20 20 20 20 20 22 20 20 20 41 4e 44 20 64 65 6c       "   AND del
19d0: 74 61 2e 72 69 64 3d 70 75 72 67 65 69 74 65 6d  ta.rid=purgeitem
19e0: 2e 6f 72 69 64 29 22 0a 20 20 20 20 20 20 22 20  .orid)".      " 
19f0: 57 48 45 52 45 20 70 65 69 64 3d 25 64 22 2c 0a  WHERE peid=%d",.
1a00: 20 20 20 20 20 20 70 65 69 64 0a 20 20 20 20 29        peid.    )
1a10: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f  ;.  }..  /* Remo
1a20: 76 65 20 74 68 65 20 61 72 74 69 66 61 63 74 73  ve the artifacts
1a30: 20 62 65 69 6e 67 20 70 75 72 67 65 64 2e 20 20   being purged.  
1a40: 41 6c 73 6f 20 72 65 6d 6f 76 65 20 61 6c 6c 20  Also remove all 
1a50: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
1a60: 6f 73 65 0a 20 20 2a 2a 20 61 72 74 69 66 61 63  ose.  ** artifac
1a70: 74 73 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ts from the seco
1a80: 6e 64 61 72 79 20 74 61 62 6c 65 73 2e 20 2a 2f  ndary tables. */
1a90: 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63  .  db_multi_exec
1aa0: 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 62 6c  ("DELETE FROM bl
1ab0: 6f 62 20 57 48 45 52 45 20 72 69 64 20 49 4e 20  ob WHERE rid IN 
1ac0: 5c 22 25 77 5c 22 22 2c 20 7a 54 61 62 29 3b 0a  \"%w\"", zTab);.
1ad0: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
1ae0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 64 65 6c  "DELETE FROM del
1af0: 74 61 20 57 48 45 52 45 20 72 69 64 20 49 4e 20  ta WHERE rid IN 
1b00: 5c 22 25 77 5c 22 22 2c 20 7a 54 61 62 29 3b 0a  \"%w\"", zTab);.
1b10: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
1b20: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 64 65 6c  "DELETE FROM del
1b30: 74 61 20 57 48 45 52 45 20 73 72 63 69 64 20 49  ta WHERE srcid I
1b40: 4e 20 5c 22 25 77 5c 22 22 2c 20 7a 54 61 62 29  N \"%w\"", zTab)
1b50: 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65  ;.  db_multi_exe
1b60: 63 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 65  c("DELETE FROM e
1b70: 76 65 6e 74 20 57 48 45 52 45 20 6f 62 6a 69 64  vent WHERE objid
1b80: 20 49 4e 20 5c 22 25 77 5c 22 22 2c 20 7a 54 61   IN \"%w\"", zTa
1b90: 62 29 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65  b);.  db_multi_e
1ba0: 78 65 63 28 22 44 45 4c 45 54 45 20 46 52 4f 4d  xec("DELETE FROM
1bb0: 20 70 72 69 76 61 74 65 20 57 48 45 52 45 20 72   private WHERE r
1bc0: 69 64 20 49 4e 20 5c 22 25 77 5c 22 22 2c 20 7a  id IN \"%w\"", z
1bd0: 54 61 62 29 3b 0a 20 20 64 62 5f 6d 75 6c 74 69  Tab);.  db_multi
1be0: 5f 65 78 65 63 28 22 44 45 4c 45 54 45 20 46 52  _exec("DELETE FR
1bf0: 4f 4d 20 6d 6c 69 6e 6b 20 57 48 45 52 45 20 6d  OM mlink WHERE m
1c00: 69 64 20 49 4e 20 5c 22 25 77 5c 22 22 2c 20 7a  id IN \"%w\"", z
1c10: 54 61 62 29 3b 0a 20 20 64 62 5f 6d 75 6c 74 69  Tab);.  db_multi
1c20: 5f 65 78 65 63 28 22 44 45 4c 45 54 45 20 46 52  _exec("DELETE FR
1c30: 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 70  OM plink WHERE p
1c40: 69 64 20 49 4e 20 5c 22 25 77 5c 22 22 2c 20 7a  id IN \"%w\"", z
1c50: 54 61 62 29 3b 0a 20 20 64 62 5f 6d 75 6c 74 69  Tab);.  db_multi
1c60: 5f 65 78 65 63 28 22 44 45 4c 45 54 45 20 46 52  _exec("DELETE FR
1c70: 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 63  OM plink WHERE c
1c80: 69 64 20 49 4e 20 5c 22 25 77 5c 22 22 2c 20 7a  id IN \"%w\"", z
1c90: 54 61 62 29 3b 0a 20 20 64 62 5f 6d 75 6c 74 69  Tab);.  db_multi
1ca0: 5f 65 78 65 63 28 22 44 45 4c 45 54 45 20 46 52  _exec("DELETE FR
1cb0: 4f 4d 20 6c 65 61 66 20 57 48 45 52 45 20 72 69  OM leaf WHERE ri
1cc0: 64 20 49 4e 20 5c 22 25 77 5c 22 22 2c 20 7a 54  d IN \"%w\"", zT
1cd0: 61 62 29 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f  ab);.  db_multi_
1ce0: 65 78 65 63 28 22 44 45 4c 45 54 45 20 46 52 4f  exec("DELETE FRO
1cf0: 4d 20 70 68 61 6e 74 6f 6d 20 57 48 45 52 45 20  M phantom WHERE 
1d00: 72 69 64 20 49 4e 20 5c 22 25 77 5c 22 22 2c 20  rid IN \"%w\"", 
1d10: 7a 54 61 62 29 3b 0a 20 20 64 62 5f 6d 75 6c 74  zTab);.  db_mult
1d20: 69 5f 65 78 65 63 28 22 44 45 4c 45 54 45 20 46  i_exec("DELETE F
1d30: 52 4f 4d 20 75 6e 63 6c 75 73 74 65 72 65 64 20  ROM unclustered 
1d40: 57 48 45 52 45 20 72 69 64 20 49 4e 20 5c 22 25  WHERE rid IN \"%
1d50: 77 5c 22 22 2c 20 7a 54 61 62 29 3b 0a 20 20 64  w\"", zTab);.  d
1d60: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 44 45  b_multi_exec("DE
1d70: 4c 45 54 45 20 46 52 4f 4d 20 75 6e 73 65 6e 74  LETE FROM unsent
1d80: 20 57 48 45 52 45 20 72 69 64 20 49 4e 20 5c 22   WHERE rid IN \"
1d90: 25 77 5c 22 22 2c 20 7a 54 61 62 29 3b 0a 20 20  %w\"", zTab);.  
1da0: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 44  db_multi_exec("D
1db0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 61 67 78 72  ELETE FROM tagxr
1dc0: 65 66 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ef".            
1dd0: 20 20 20 20 22 20 57 48 45 52 45 20 72 69 64 20      " WHERE rid 
1de0: 49 4e 20 5c 22 25 77 5c 22 22 0a 20 20 20 20 20  IN \"%w\"".     
1df0: 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20             "    
1e00: 4f 52 20 73 72 63 69 64 20 49 4e 20 5c 22 25 77  OR srcid IN \"%w
1e10: 5c 22 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  \"".            
1e20: 20 20 20 20 22 20 20 20 20 4f 52 20 6f 72 69 67      "    OR orig
1e30: 69 64 20 49 4e 20 5c 22 25 77 5c 22 22 2c 20 7a  id IN \"%w\"", z
1e40: 54 61 62 2c 20 7a 54 61 62 2c 20 7a 54 61 62 29  Tab, zTab, zTab)
1e50: 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65  ;.  db_multi_exe
1e60: 63 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 62  c("DELETE FROM b
1e70: 61 63 6b 6c 69 6e 6b 20 57 48 45 52 45 20 73 72  acklink WHERE sr
1e80: 63 74 79 70 65 3d 30 20 41 4e 44 20 73 72 63 69  ctype=0 AND srci
1e90: 64 20 49 4e 20 5c 22 25 77 5c 22 22 2c 0a 20 20  d IN \"%w\"",.  
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
1eb0: 61 62 29 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f  ab);.  db_multi_
1ec0: 65 78 65 63 28 0a 20 20 20 20 22 43 52 45 41 54  exec(.    "CREAT
1ed0: 45 20 54 45 4d 50 20 54 41 42 4c 45 20 5c 22 25  E TEMP TABLE \"%
1ee0: 77 5f 74 69 63 6b 65 74 73 5c 22 20 41 53 22 0a  w_tickets\" AS".
1ef0: 20 20 20 20 22 20 53 45 4c 45 43 54 20 44 49 53      " SELECT DIS
1f00: 54 49 4e 43 54 20 74 6b 74 5f 75 75 69 64 20 46  TINCT tkt_uuid F
1f10: 52 4f 4d 20 74 69 63 6b 65 74 20 57 48 45 52 45  ROM ticket WHERE
1f20: 20 74 6b 74 5f 69 64 20 49 4e 22 0a 20 20 20 20   tkt_id IN".    
1f30: 22 20 20 20 20 28 53 45 4c 45 43 54 20 74 6b 74  "    (SELECT tkt
1f40: 5f 69 64 20 46 52 4f 4d 20 74 69 63 6b 65 74 63  _id FROM ticketc
1f50: 68 6e 67 20 57 48 45 52 45 20 74 6b 74 5f 72 69  hng WHERE tkt_ri
1f60: 64 20 49 4e 20 5c 22 25 77 5c 22 29 22 2c 0a 20  d IN \"%w\")",. 
1f70: 20 20 20 7a 54 61 62 2c 20 7a 54 61 62 29 3b 0a     zTab, zTab);.
1f80: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
1f90: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 69 63  "DELETE FROM tic
1fa0: 6b 65 74 63 68 6e 67 20 57 48 45 52 45 20 74 6b  ketchng WHERE tk
1fb0: 74 5f 72 69 64 20 49 4e 20 5c 22 25 77 5c 22 22  t_rid IN \"%w\""
1fc0: 2c 20 7a 54 61 62 29 3b 0a 20 20 64 62 5f 70 72  , zTab);.  db_pr
1fd0: 65 70 61 72 65 28 26 71 2c 20 22 53 45 4c 45 43  epare(&q, "SELEC
1fe0: 54 20 74 6b 74 5f 75 75 69 64 20 46 52 4f 4d 20  T tkt_uuid FROM 
1ff0: 5c 22 25 77 5f 74 69 63 6b 65 74 73 5c 22 22 2c  \"%w_tickets\"",
2000: 20 7a 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28   zTab);.  while(
2010: 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51   db_step(&q)==SQ
2020: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
2030: 74 69 63 6b 65 74 5f 72 65 62 75 69 6c 64 5f 65  ticket_rebuild_e
2040: 6e 74 72 79 28 64 62 5f 63 6f 6c 75 6d 6e 5f 74  ntry(db_column_t
2050: 65 78 74 28 26 71 2c 20 30 29 29 3b 0a 20 20 7d  ext(&q, 0));.  }
2060: 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26  .  db_finalize(&
2070: 71 29 3b 0a 20 20 2f 2a 20 64 62 5f 6d 75 6c 74  q);.  /* db_mult
2080: 69 5f 65 78 65 63 28 22 44 52 4f 50 20 54 41 42  i_exec("DROP TAB
2090: 4c 45 20 5c 22 25 77 5f 74 69 63 6b 65 74 73 5c  LE \"%w_tickets\
20a0: 22 22 2c 20 7a 54 61 62 29 3b 20 2a 2f 0a 0a 20  "", zTab); */.. 
20b0: 20 2f 2a 20 4d 69 73 73 69 6f 6e 20 61 63 63 6f   /* Mission acco
20c0: 6d 70 6c 69 73 68 65 64 20 2a 2f 0a 20 20 64 62  mplished */.  db
20d0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
20e0: 28 30 29 3b 0a 0a 20 20 69 66 28 20 70 75 72 67  (0);..  if( purg
20f0: 65 46 6c 61 67 73 20 26 20 50 55 52 47 45 5f 50  eFlags & PURGE_P
2100: 52 49 4e 54 5f 53 55 4d 4d 41 52 59 20 29 7b 0a  RINT_SUMMARY ){.
2110: 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74      fossil_print
2120: 28 22 25 64 20 61 72 74 69 66 61 63 74 73 20 70  ("%d artifacts p
2130: 75 72 67 65 64 5c 6e 22 2c 0a 20 20 20 20 20 20  urged\n",.      
2140: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 5f 69              db_i
2150: 6e 74 28 30 2c 20 22 53 45 4c 45 43 54 20 63 6f  nt(0, "SELECT co
2160: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 5c 22 25 77  unt(*) FROM \"%w
2170: 5c 22 3b 22 2c 20 7a 54 61 62 29 29 3b 0a 20 20  \";", zTab));.  
2180: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
2190: 75 6e 64 6f 61 62 6c 65 20 75 73 69 6e 67 20 5c  undoable using \
21a0: 22 25 73 20 70 75 72 67 65 20 75 6e 64 6f 20 25  "%s purge undo %
21b0: 64 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d\".\n",.       
21c0: 20 20 20 20 20 20 20 20 20 20 20 67 2e 6e 61 6d             g.nam
21d0: 65 4f 66 45 78 65 2c 20 70 65 69 64 29 3b 0a 20  eOfExe, peid);. 
21e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 65 69 64   }.  return peid
21f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54  ;.}../*.** The T
2200: 45 4d 50 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  EMP table named 
2210: 7a 54 61 62 20 63 6f 6e 74 61 69 6e 73 20 52 49  zTab contains RI
2220: 44 73 20 66 6f 72 20 61 20 73 65 74 20 6f 66 20  Ds for a set of 
2230: 63 68 65 63 6b 2d 69 6e 73 2e 0a 2a 2a 0a 2a 2a  check-ins..**.**
2240: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2250: 20 61 6e 79 20 63 68 65 63 6b 2d 69 6e 20 69 6e   any check-in in
2260: 20 7a 54 61 62 20 69 73 20 61 20 62 61 73 65 6c   zTab is a basel
2270: 69 6e 65 20 6d 61 6e 69 66 65 73 74 20 66 6f 72  ine manifest for
2280: 20 73 6f 6d 65 0a 2a 2a 20 64 65 6c 74 61 20 6d   some.** delta m
2290: 61 6e 69 66 65 73 74 20 74 68 61 74 20 69 73 20  anifest that is 
22a0: 6e 6f 74 20 69 6e 20 7a 54 61 62 2e 20 20 52 65  not in zTab.  Re
22b0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 7a 54 61  turn true if zTa
22c0: 62 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  b contains a.** 
22d0: 62 61 73 65 6c 69 6e 65 20 66 6f 72 20 61 20 64  baseline for a d
22e0: 65 6c 74 61 20 74 68 61 74 20 69 73 20 6e 6f 74  elta that is not
22f0: 20 69 6e 20 7a 54 61 62 2e 0a 2a 2a 0a 2a 2a 20   in zTab..**.** 
2300: 54 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61  This is a databa
2310: 73 65 20 69 6e 74 65 67 72 69 74 79 20 70 72 65  se integrity pre
2320: 73 65 72 76 61 74 69 6f 6e 20 63 68 65 63 6b 2e  servation check.
2330: 20 20 54 68 65 20 63 68 65 63 6b 2d 69 6e 73 20    The check-ins 
2340: 69 6e 20 7a 54 61 62 0a 2a 2a 20 61 72 65 20 61  in zTab.** are a
2350: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
2360: 65 64 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20  ed or otherwise 
2370: 6d 61 64 65 20 69 6e 61 63 63 65 73 73 69 62 6c  made inaccessibl
2380: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2390: 0a 2a 2a 20 69 73 20 63 68 65 63 6b 69 6e 67 20  .** is checking 
23a0: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 70  to ensure that p
23b0: 75 72 67 69 6e 67 20 74 68 65 20 63 68 65 63 6b  urging the check
23c0: 2d 69 6e 73 20 69 6e 20 7a 54 61 62 20 77 69 6c  -ins in zTab wil
23d0: 6c 20 6e 6f 74 20 64 65 6c 65 74 65 0a 2a 2a 20  l not delete.** 
23e0: 61 20 62 61 73 65 6c 69 6e 65 20 6d 61 6e 69 66  a baseline manif
23f0: 65 73 74 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  est out from und
2400: 65 72 20 61 20 64 65 6c 74 61 2e 0a 2a 2f 0a 69  er a delta..*/.i
2410: 6e 74 20 70 75 72 67 65 5f 62 61 73 65 6c 69 6e  nt purge_baselin
2420: 65 5f 6f 75 74 5f 66 72 6f 6d 5f 75 6e 64 65 72  e_out_from_under
2430: 5f 64 65 6c 74 61 28 63 6f 6e 73 74 20 63 68 61  _delta(const cha
2440: 72 20 2a 7a 54 61 62 29 7b 0a 20 20 69 66 28 20  r *zTab){.  if( 
2450: 21 64 62 5f 74 61 62 6c 65 5f 68 61 73 5f 63 6f  !db_table_has_co
2460: 6c 75 6d 6e 28 22 72 65 70 6f 73 69 74 6f 72 79  lumn("repository
2470: 22 2c 22 70 6c 69 6e 6b 22 2c 22 62 61 73 65 69  ","plink","basei
2480: 64 22 29 20 29 7b 0a 20 20 20 20 2f 2a 20 53 6b  d") ){.    /* Sk
2490: 69 70 20 74 68 69 73 20 63 68 65 63 6b 20 69 66  ip this check if
24a0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
24b0: 61 62 61 73 65 20 69 73 20 61 6e 20 6f 6c 64 65  abase is an olde
24c0: 72 20 73 63 68 65 6d 61 20 74 68 61 74 0a 20 20  r schema that.  
24d0: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 63 6f    ** does not co
24e0: 6e 74 61 69 6e 20 74 68 65 20 50 4c 49 4e 4b 2e  ntain the PLINK.
24f0: 42 41 53 45 49 44 20 66 69 65 6c 64 2e 20 2a 2f  BASEID field. */
2500: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2510: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2520: 72 6e 20 64 62 5f 69 6e 74 28 30 2c 0a 20 20 20  rn db_int(0,.   
2530: 20 20 20 22 53 45 4c 45 43 54 20 31 20 46 52 4f     "SELECT 1 FRO
2540: 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 62 61  M plink WHERE ba
2550: 73 65 69 64 20 49 4e 20 5c 22 25 77 5c 22 20 41  seid IN \"%w\" A
2560: 4e 44 20 63 69 64 20 4e 4f 54 20 49 4e 20 5c 22  ND cid NOT IN \"
2570: 25 77 5c 22 22 2c 0a 20 20 20 20 20 20 7a 54 61  %w\"",.      zTa
2580: 62 2c 20 7a 54 61 62 29 3b 0a 20 20 7d 0a 7d 0a  b, zTab);.  }.}.
2590: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 45 4d 50  ../*.** The TEMP
25a0: 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 7a 54 61   table named zTa
25b0: 62 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 52  b contains the R
25c0: 49 44 73 20 66 6f 72 20 61 20 73 65 74 20 6f 66  IDs for a set of
25d0: 20 63 68 65 63 6b 2d 69 6e 0a 2a 2a 20 61 72 74   check-in.** art
25e0: 69 66 61 63 74 73 2e 20 20 45 78 70 61 6e 64 20  ifacts.  Expand 
25f0: 74 68 69 73 20 73 65 74 20 28 62 79 20 61 64 64  this set (by add
2600: 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 20  ing new entries 
2610: 74 6f 20 7a 54 61 62 29 20 74 6f 20 69 6e 63 6c  to zTab) to incl
2620: 75 64 65 0a 2a 2a 20 61 6c 6c 20 6f 74 68 65 72  ude.** all other
2630: 20 61 72 74 69 66 61 63 74 73 20 74 68 61 74 20   artifacts that 
2640: 61 72 65 20 75 73 65 64 20 62 79 20 74 68 65 20  are used by the 
2650: 63 68 65 63 6b 2d 69 6e 73 20 69 6e 0a 2a 2a 20  check-ins in.** 
2660: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73  the original lis
2670: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
2680: 62 45 78 63 6c 75 73 69 76 65 20 66 6c 61 67 20  bExclusive flag 
2690: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
26a0: 65 20 73 65 74 20 69 73 20 6f 6e 6c 79 20 65 78  e set is only ex
26b0: 70 61 6e 64 65 64 20 62 79 0a 2a 2a 20 61 72 74  panded by.** art
26c0: 69 66 61 63 74 73 20 74 68 61 74 20 61 72 65 20  ifacts that are 
26d0: 75 73 65 64 20 65 78 63 6c 75 73 69 76 65 6c 79  used exclusively
26e0: 20 62 79 20 74 68 65 20 63 68 65 63 6b 2d 69 6e   by the check-in
26f0: 73 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2a  s in the set..**
2700: 20 57 68 65 6e 20 62 45 78 63 6c 75 73 69 76 65   When bExclusive
2710: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
2720: 61 6c 6c 20 61 72 74 69 66 61 63 74 73 20 75 73  all artifacts us
2730: 65 64 20 62 79 20 74 68 65 20 63 68 65 63 6b 2d  ed by the check-
2740: 69 6e 73 0a 2a 2a 20 61 72 65 20 61 64 64 65 64  ins.** are added
2750: 20 65 76 65 6e 20 69 66 20 74 68 6f 73 65 20 61   even if those a
2760: 72 74 69 66 61 63 74 73 20 61 72 65 20 61 6c 73  rtifacts are als
2770: 6f 20 75 73 65 64 20 62 79 20 6f 74 68 65 72 20  o used by other 
2780: 63 68 65 63 6b 2d 69 6e 73 0a 2a 2a 20 6e 6f 74  check-ins.** not
2790: 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2a 0a   in the set..**.
27a0: 2a 2a 20 54 68 65 20 22 66 6f 73 73 69 6c 20 70  ** The "fossil p
27b0: 75 62 6c 69 73 68 22 20 63 6f 6d 6d 61 6e 64 20  ublish" command 
27c0: 77 69 74 68 20 74 68 65 20 28 75 6e 64 6f 63 75  with the (undocu
27d0: 6d 65 6e 74 65 64 29 20 2d 2d 74 65 73 74 20 61  mented) --test a
27e0: 6e 64 0a 2a 2a 20 2d 2d 65 78 63 6c 75 73 69 76  nd.** --exclusiv
27f0: 65 20 6f 70 74 69 6f 6e 73 20 63 61 6e 20 62 65  e options can be
2800: 20 75 73 65 64 20 66 6f 72 20 69 6e 74 65 72 61   used for intera
2810: 63 74 69 76 69 6e 67 20 74 65 73 74 69 6e 67 20  ctiving testing 
2820: 6f 66 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  of this.** funct
2830: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 66 69 6e  ion..*/.void fin
2840: 64 5f 63 68 65 63 6b 69 6e 5f 61 73 73 6f 63 69  d_checkin_associ
2850: 61 74 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20  ates(const char 
2860: 2a 7a 54 61 62 2c 20 69 6e 74 20 62 45 78 63 6c  *zTab, int bExcl
2870: 75 73 69 76 65 29 7b 0a 20 20 64 62 5f 62 65 67  usive){.  db_beg
2880: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29  in_transaction()
2890: 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
28a0: 74 68 65 20 73 65 74 20 6f 66 20 66 69 6c 65 73  the set of files
28b0: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
28c0: 20 61 64 64 65 64 20 74 6f 20 7a 54 61 62 20 2a   added to zTab *
28d0: 2f 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65  /.  db_multi_exe
28e0: 63 28 22 43 52 45 41 54 45 20 54 45 4d 50 20 54  c("CREATE TEMP T
28f0: 41 42 4c 45 20 5c 22 25 77 5f 66 69 6c 65 73 5c  ABLE \"%w_files\
2900: 22 28 66 69 64 20 49 4e 54 45 47 45 52 20 50 52  "(fid INTEGER PR
2910: 49 4d 41 52 59 20 4b 45 59 29 22 2c 7a 54 61 62  IMARY KEY)",zTab
2920: 29 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78  );.  db_multi_ex
2930: 65 63 28 0a 20 20 20 20 22 49 4e 53 45 52 54 20  ec(.    "INSERT 
2940: 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 5c  OR IGNORE INTO \
2950: 22 25 77 5f 66 69 6c 65 73 5c 22 28 66 69 64 29  "%w_files\"(fid)
2960: 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
2970: 66 69 64 20 46 52 4f 4d 20 6d 6c 69 6e 6b 20 57  fid FROM mlink W
2980: 48 45 52 45 20 66 69 64 21 3d 30 20 41 4e 44 20  HERE fid!=0 AND 
2990: 6d 69 64 20 49 4e 20 5c 22 25 77 5c 22 22 2c 0a  mid IN \"%w\"",.
29a0: 20 20 20 20 7a 54 61 62 2c 20 7a 54 61 62 0a 20      zTab, zTab. 
29b0: 20 29 3b 0a 20 20 69 66 28 20 62 45 78 63 6c 75   );.  if( bExclu
29c0: 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 42  sive ){.    /* B
29d0: 75 74 20 74 61 6b 65 20 6f 75 74 20 61 6c 6c 20  ut take out all 
29e0: 66 69 6c 65 73 20 74 68 61 74 20 61 72 65 20 72  files that are r
29f0: 65 66 65 72 65 6e 63 65 64 20 62 79 20 63 68 65  eferenced by che
2a00: 63 6b 2d 69 6e 73 20 6e 6f 74 20 69 6e 20 7a 54  ck-ins not in zT
2a10: 61 62 20 2a 2f 0a 20 20 20 20 64 62 5f 6d 75 6c  ab */.    db_mul
2a20: 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20 20 22  ti_exec(.      "
2a30: 44 45 4c 45 54 45 20 46 52 4f 4d 20 5c 22 25 77  DELETE FROM \"%w
2a40: 5f 66 69 6c 65 73 5c 22 22 0a 20 20 20 20 20 20  _files\"".      
2a50: 22 20 57 48 45 52 45 20 66 69 64 20 49 4e 20 28  " WHERE fid IN (
2a60: 53 45 4c 45 43 54 20 66 69 64 20 46 52 4f 4d 20  SELECT fid FROM 
2a70: 6d 6c 69 6e 6b 22 0a 20 20 20 20 20 20 20 20 20  mlink".         
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
2a90: 45 52 45 20 66 69 64 20 49 4e 20 5c 22 25 77 5f  ERE fid IN \"%w_
2aa0: 66 69 6c 65 73 5c 22 22 0a 20 20 20 20 20 20 20  files\"".       
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
2ac0: 20 20 41 4e 44 20 6d 69 64 20 4e 4f 54 20 49 4e    AND mid NOT IN
2ad0: 20 5c 22 25 77 5c 22 29 22 2c 0a 20 20 20 20 20   \"%w\")",.     
2ae0: 20 7a 54 61 62 2c 20 7a 54 61 62 2c 20 7a 54 61   zTab, zTab, zTa
2af0: 62 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  b.    );.  }..  
2b00: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73  /* Compute the s
2b10: 65 74 20 6f 66 20 74 61 67 73 20 74 68 61 74 20  et of tags that 
2b20: 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64  need to be added
2b30: 20 74 6f 20 7a 54 61 67 20 2a 2f 0a 20 20 64 62   to zTag */.  db
2b40: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 43 52 45  _multi_exec("CRE
2b50: 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 5c  ATE TEMP TABLE \
2b60: 22 25 77 5f 74 61 67 73 5c 22 28 74 69 64 20 49  "%w_tags\"(tid I
2b70: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
2b80: 45 59 29 22 2c 7a 54 61 62 29 3b 0a 20 20 64 62  EY)",zTab);.  db
2b90: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20  _multi_exec(.   
2ba0: 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f   "INSERT OR IGNO
2bb0: 52 45 20 49 4e 54 4f 20 5c 22 25 77 5f 74 61 67  RE INTO \"%w_tag
2bc0: 73 5c 22 28 74 69 64 29 22 0a 20 20 20 20 22 20  s\"(tid)".    " 
2bd0: 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
2be0: 20 73 72 63 69 64 20 46 52 4f 4d 20 74 61 67 78   srcid FROM tagx
2bf0: 72 65 66 20 57 48 45 52 45 20 72 69 64 20 69 6e  ref WHERE rid in
2c00: 20 5c 22 25 77 5c 22 20 41 4e 44 20 73 72 63 69   \"%w\" AND srci
2c10: 64 21 3d 30 22 2c 0a 20 20 20 20 7a 54 61 62 2c  d!=0",.    zTab,
2c20: 20 7a 54 61 62 0a 20 20 29 3b 0a 20 20 69 66 28   zTab.  );.  if(
2c30: 20 62 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20   bExclusive ){. 
2c40: 20 20 20 2f 2a 20 42 75 74 20 74 61 6b 65 20 6f     /* But take o
2c50: 75 74 20 74 61 67 73 20 74 68 61 74 20 72 65 66  ut tags that ref
2c60: 65 72 65 6e 63 65 73 20 73 6f 6d 65 20 63 68 65  erences some che
2c70: 63 6b 2d 69 6e 73 20 69 6e 20 7a 54 61 62 20 61  ck-ins in zTab a
2c80: 6e 64 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  nd other.    ** 
2c90: 63 68 65 63 6b 2d 69 6e 73 20 6e 6f 74 20 69 6e  check-ins not in
2ca0: 20 7a 54 61 62 2e 20 20 54 68 65 20 63 75 72 72   zTab.  The curr
2cb0: 65 6e 74 20 46 6f 73 73 69 6c 20 69 6d 70 6c 65  ent Fossil imple
2cc0: 6d 65 6e 74 61 74 69 6f 6e 20 6e 65 76 65 72 20  mentation never 
2cd0: 63 72 65 61 74 65 73 0a 20 20 20 20 2a 2a 20 73  creates.    ** s
2ce0: 75 63 68 20 74 61 67 73 2c 20 73 6f 20 74 68 65  uch tags, so the
2cf0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 68 6f 75 6c   following shoul
2d00: 64 20 75 73 75 61 6c 6c 79 20 62 65 20 61 20 6e  d usually be a n
2d10: 6f 2d 6f 70 2e 20 20 42 75 74 20 74 68 65 20 66  o-op.  But the f
2d20: 69 6c 65 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 61  ile.    ** forma
2d30: 74 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20  t specification 
2d40: 61 6c 6c 6f 77 73 20 73 75 63 68 20 74 61 67 73  allows such tags
2d50: 2c 20 73 6f 20 77 65 20 73 68 6f 75 6c 64 20 63  , so we should c
2d60: 68 65 63 6b 20 66 6f 72 20 74 68 65 6d 2e 0a 20  heck for them.. 
2d70: 20 20 20 2a 2f 0a 20 20 20 20 64 62 5f 6d 75 6c     */.    db_mul
2d80: 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20 20 22  ti_exec(.      "
2d90: 44 45 4c 45 54 45 20 46 52 4f 4d 20 5c 22 25 77  DELETE FROM \"%w
2da0: 5f 74 61 67 73 5c 22 22 0a 20 20 20 20 20 20 22  _tags\"".      "
2db0: 20 57 48 45 52 45 20 74 69 64 20 49 4e 20 28 53   WHERE tid IN (S
2dc0: 45 4c 45 43 54 20 73 72 63 69 64 20 46 52 4f 4d  ELECT srcid FROM
2dd0: 20 74 61 67 78 72 65 66 22 0a 20 20 20 20 20 20   tagxref".      
2de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2df0: 20 57 48 45 52 45 20 73 72 63 69 64 20 49 4e 20   WHERE srcid IN 
2e00: 5c 22 25 77 5f 74 61 67 73 5c 22 22 0a 20 20 20  \"%w_tags\"".   
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e20: 20 20 22 20 20 20 41 4e 44 20 72 69 64 20 4e 4f    "   AND rid NO
2e30: 54 20 49 4e 20 5c 22 25 77 5c 22 29 22 2c 0a 20  T IN \"%w\")",. 
2e40: 20 20 20 20 20 7a 54 61 62 2c 20 7a 54 61 62 2c       zTab, zTab,
2e50: 20 7a 54 61 62 0a 20 20 20 20 29 3b 0a 20 20 7d   zTab.    );.  }
2e60: 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20  ..  /* Transfer 
2e70: 74 68 65 20 65 78 74 72 61 20 61 72 74 69 66 61  the extra artifa
2e80: 63 74 73 20 69 6e 74 6f 20 7a 54 61 62 20 2a 2f  cts into zTab */
2e90: 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63  .  db_multi_exec
2ea0: 28 0a 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52  (.    "INSERT OR
2eb0: 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 5c 22 25   IGNORE INTO \"%
2ec0: 77 5c 22 20 53 45 4c 45 43 54 20 66 69 64 20 46  w\" SELECT fid F
2ed0: 52 4f 4d 20 5c 22 25 77 5f 66 69 6c 65 73 5c 22  ROM \"%w_files\"
2ee0: 3b 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 4f  ;".    "INSERT O
2ef0: 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 5c 22  R IGNORE INTO \"
2f00: 25 77 5c 22 20 53 45 4c 45 43 54 20 74 69 64 20  %w\" SELECT tid 
2f10: 46 52 4f 4d 20 5c 22 25 77 5f 74 61 67 73 5c 22  FROM \"%w_tags\"
2f20: 3b 22 0a 20 20 20 20 22 44 52 4f 50 20 54 41 42  ;".    "DROP TAB
2f30: 4c 45 20 5c 22 25 77 5f 66 69 6c 65 73 5c 22 3b  LE \"%w_files\";
2f40: 22 0a 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c  ".    "DROP TABL
2f50: 45 20 5c 22 25 77 5f 74 61 67 73 5c 22 3b 22 2c  E \"%w_tags\";",
2f60: 0a 20 20 20 20 7a 54 61 62 2c 20 7a 54 61 62 2c  .    zTab, zTab,
2f70: 20 7a 54 61 62 2c 20 7a 54 61 62 2c 20 7a 54 61   zTab, zTab, zTa
2f80: 62 2c 20 7a 54 61 62 0a 20 20 29 3b 0a 0a 20 20  b, zTab.  );..  
2f90: 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  db_end_transacti
2fa0: 6f 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  on(0);.}../*.** 
2fb0: 44 69 73 70 6c 61 79 20 74 68 65 20 63 6f 6e 74  Display the cont
2fc0: 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ent of a single 
2fd0: 70 75 72 67 65 20 65 76 65 6e 74 2e 0a 2a 2f 0a  purge event..*/.
2fe0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 72 67  static void purg
2ff0: 65 5f 6c 69 73 74 5f 65 76 65 6e 74 5f 63 6f 6e  e_list_event_con
3000: 74 65 6e 74 28 69 6e 74 20 70 65 69 64 29 7b 0a  tent(int peid){.
3010: 20 20 53 74 6d 74 20 71 3b 0a 20 20 73 71 6c 69    Stmt q;.  sqli
3020: 74 65 33 5f 69 6e 74 36 34 20 73 7a 20 3d 20 30  te3_int64 sz = 0
3030: 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26  ;.  db_prepare(&
3040: 71 2c 20 22 53 45 4c 45 43 54 20 70 69 69 64 2c  q, "SELECT piid,
3050: 20 73 75 62 73 74 72 28 75 75 69 64 2c 31 2c 31   substr(uuid,1,1
3060: 36 29 2c 20 73 72 63 69 64 2c 20 69 73 50 72 69  6), srcid, isPri
3070: 76 61 74 65 2c 22 0a 20 20 20 20 20 20 20 20 20  vate,".         
3080: 20 20 20 20 20 20 20 20 22 20 20 20 20 20 20 20          "       
3090: 6c 65 6e 67 74 68 28 64 61 74 61 29 2c 20 64 65  length(data), de
30a0: 73 63 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  sc".            
30b0: 20 20 20 20 20 22 20 46 52 4f 4d 20 70 75 72 67       " FROM purg
30c0: 65 69 74 65 6d 20 57 48 45 52 45 20 70 65 69 64  eitem WHERE peid
30d0: 3d 25 64 22 2c 20 70 65 69 64 29 3b 0a 20 20 77  =%d", peid);.  w
30e0: 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71  hile( db_step(&q
30f0: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
3100: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e  .    fossil_prin
3110: 74 28 22 20 20 20 20 20 25 35 64 20 25 73 20 25  t("     %5d %s %
3120: 34 73 20 25 63 20 25 31 30 64 20 25 73 5c 6e 22  4s %c %10d %s\n"
3130: 2c 0a 20 20 20 20 20 20 20 64 62 5f 63 6f 6c 75  ,.       db_colu
3140: 6d 6e 5f 69 6e 74 28 26 71 2c 30 29 2c 0a 20 20  mn_int(&q,0),.  
3150: 20 20 20 20 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74       db_column_t
3160: 65 78 74 28 26 71 2c 31 29 2c 0a 20 20 20 20 20  ext(&q,1),.     
3170: 20 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74    db_column_text
3180: 28 26 71 2c 32 29 2c 0a 20 20 20 20 20 20 20 64  (&q,2),.       d
3190: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c  b_column_int(&q,
31a0: 33 29 20 3f 20 27 50 27 20 3a 20 27 20 27 2c 0a  3) ? 'P' : ' ',.
31b0: 20 20 20 20 20 20 20 64 62 5f 63 6f 6c 75 6d 6e         db_column
31c0: 5f 69 6e 74 28 26 71 2c 34 29 2c 0a 20 20 20 20  _int(&q,4),.    
31d0: 20 20 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78     db_column_tex
31e0: 74 28 26 71 2c 35 29 29 3b 0a 20 20 20 20 73 7a  t(&q,5));.    sz
31f0: 20 2b 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e   += db_column_in
3200: 74 28 26 71 2c 34 29 3b 0a 20 20 7d 0a 20 20 64  t(&q,4);.  }.  d
3210: 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a  b_finalize(&q);.
3220: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
3230: 25 2e 31 31 63 25 31 36 73 25 2e 38 63 25 31 30  %.11c%16s%.8c%10
3240: 6c 6c 64 5c 6e 22 2c 20 27 20 27 2c 20 22 54 6f  lld\n", ' ', "To
3250: 74 61 6c 3a 22 2c 20 27 20 27 2c 20 73 7a 29 3b  tal:", ' ', sz);
3260: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63  .}../*.** Extrac
3270: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f  t the content fo
3280: 72 20 70 75 72 67 65 69 74 65 6d 20 6e 75 6d 62  r purgeitem numb
3290: 65 72 20 70 69 69 64 20 69 6e 74 6f 20 61 20 42  er piid into a B
32a0: 6c 6f 62 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  lob.  Return.** 
32b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
32c0: 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rors..*/.static 
32d0: 69 6e 74 20 70 75 72 67 65 5f 65 78 74 72 61 63  int purge_extrac
32e0: 74 5f 69 74 65 6d 28 0a 20 20 69 6e 74 20 70 69  t_item(.  int pi
32f0: 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  id,            /
3300: 2a 20 49 44 20 6f 66 20 74 68 65 20 69 74 65 6d  * ID of the item
3310: 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20   to extract */. 
3320: 20 42 6c 6f 62 20 2a 70 4f 75 74 20 20 20 20 20   Blob *pOut     
3330: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
3340: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  he content into 
3350: 74 68 69 73 20 62 6c 6f 62 20 2a 2f 0a 29 7b 0a  this blob */.){.
3360: 20 20 53 74 6d 74 20 71 3b 0a 20 20 69 6e 74 20    Stmt q;.  int 
3370: 73 72 63 69 64 3b 0a 20 20 42 6c 6f 62 20 68 31  srcid;.  Blob h1
3380: 2c 20 78 3b 0a 20 20 73 74 61 74 69 63 20 42 61  , x;.  static Ba
3390: 67 20 62 75 73 79 3b 0a 0a 20 20 64 62 5f 70 72  g busy;..  db_pr
33a0: 65 70 61 72 65 28 26 71 2c 20 22 53 45 4c 45 43  epare(&q, "SELEC
33b0: 54 20 75 75 69 64 2c 20 73 72 63 69 64 2c 20 64  T uuid, srcid, d
33c0: 61 74 61 20 46 52 4f 4d 20 70 75 72 67 65 69 74  ata FROM purgeit
33d0: 65 6d 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  em".            
33e0: 20 20 20 20 20 22 20 57 48 45 52 45 20 70 69 69       " WHERE pii
33f0: 64 3d 25 64 22 2c 20 70 69 69 64 29 3b 0a 20 20  d=%d", piid);.  
3400: 69 66 28 20 64 62 5f 73 74 65 70 28 26 71 29 21  if( db_step(&q)!
3410: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
3420: 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26     db_finalize(&
3430: 71 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66  q);.    fossil_f
3440: 61 74 61 6c 28 22 6d 69 73 73 69 6e 67 20 70 75  atal("missing pu
3450: 72 67 65 2d 69 74 65 6d 20 25 64 22 2c 20 70 69  rge-item %d", pi
3460: 69 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62  id);.  }.  if( b
3470: 61 67 5f 66 69 6e 64 28 26 62 75 73 79 2c 20 70  ag_find(&busy, p
3480: 69 69 64 29 20 29 20 72 65 74 75 72 6e 20 31 3b  iid) ) return 1;
3490: 0a 20 20 73 72 63 69 64 20 3d 20 64 62 5f 63 6f  .  srcid = db_co
34a0: 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 31 29 3b  lumn_int(&q, 1);
34b0: 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 70 4f 75  .  blob_zero(pOu
34c0: 74 29 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28  t);.  blob_zero(
34d0: 26 78 29 3b 0a 20 20 64 62 5f 63 6f 6c 75 6d 6e  &x);.  db_column
34e0: 5f 62 6c 6f 62 28 26 71 2c 20 32 2c 20 26 78 29  _blob(&q, 2, &x)
34f0: 3b 0a 20 20 62 6c 6f 62 5f 75 6e 63 6f 6d 70 72  ;.  blob_uncompr
3500: 65 73 73 28 26 78 2c 20 70 4f 75 74 29 3b 0a 20  ess(&x, pOut);. 
3510: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 78 29 3b   blob_reset(&x);
3520: 0a 20 20 69 66 28 20 73 72 63 69 64 3e 30 20 29  .  if( srcid>0 )
3530: 7b 0a 20 20 20 20 42 6c 6f 62 20 62 61 73 65 6c  {.    Blob basel
3540: 69 6e 65 2c 20 6f 75 74 3b 0a 20 20 20 20 62 61  ine, out;.    ba
3550: 67 5f 69 6e 73 65 72 74 28 26 62 75 73 79 2c 20  g_insert(&busy, 
3560: 70 69 69 64 29 3b 0a 20 20 20 20 70 75 72 67 65  piid);.    purge
3570: 5f 65 78 74 72 61 63 74 5f 69 74 65 6d 28 73 72  _extract_item(sr
3580: 63 69 64 2c 20 26 62 61 73 65 6c 69 6e 65 29 3b  cid, &baseline);
3590: 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26  .    blob_zero(&
35a0: 6f 75 74 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 64  out);.    blob_d
35b0: 65 6c 74 61 5f 61 70 70 6c 79 28 26 62 61 73 65  elta_apply(&base
35c0: 6c 69 6e 65 2c 20 70 4f 75 74 2c 20 26 6f 75 74  line, pOut, &out
35d0: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65  );.    blob_rese
35e0: 74 28 70 4f 75 74 29 3b 0a 20 20 20 20 2a 70 4f  t(pOut);.    *pO
35f0: 75 74 20 3d 20 6f 75 74 3b 0a 20 20 20 20 62 6c  ut = out;.    bl
3600: 6f 62 5f 72 65 73 65 74 28 26 62 61 73 65 6c 69  ob_reset(&baseli
3610: 6e 65 29 3b 0a 20 20 7d 0a 20 20 62 61 67 5f 72  ne);.  }.  bag_r
3620: 65 6d 6f 76 65 28 26 62 75 73 79 2c 20 70 69 69  emove(&busy, pii
3630: 64 29 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28  d);.  blob_zero(
3640: 26 68 31 29 3b 0a 20 20 64 62 5f 63 6f 6c 75 6d  &h1);.  db_colum
3650: 6e 5f 62 6c 6f 62 28 26 71 2c 20 30 2c 20 26 68  n_blob(&q, 0, &h
3660: 31 29 3b 0a 20 20 69 66 28 20 68 6e 61 6d 65 5f  1);.  if( hname_
3670: 76 65 72 69 66 79 5f 68 61 73 68 28 70 4f 75 74  verify_hash(pOut
3680: 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 68  , blob_buffer(&h
3690: 31 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 68  1), blob_size(&h
36a0: 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f  1))==0 ){.    fo
36b0: 73 73 69 6c 5f 66 61 74 61 6c 28 22 69 6e 63 6f  ssil_fatal("inco
36c0: 72 72 65 63 74 20 61 72 74 69 66 61 63 74 20 68  rrect artifact h
36d0: 61 73 68 20 6f 6e 20 25 62 22 2c 20 26 68 31 29  ash on %b", &h1)
36e0: 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 72 65 73  ;.  }.  blob_res
36f0: 65 74 28 26 68 31 29 3b 0a 20 20 64 62 5f 66 69  et(&h1);.  db_fi
3700: 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 72 65  nalize(&q);.  re
3710: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
3720: 20 54 68 65 72 65 20 69 73 20 61 20 54 45 4d 50   There is a TEMP
3730: 20 74 61 62 6c 65 20 69 78 28 70 69 69 64 2c 73   table ix(piid,s
3740: 72 63 69 64 29 20 63 6f 6e 74 61 69 6e 69 6e 67  rcid) containing
3750: 20 61 20 73 65 74 20 6f 66 20 70 75 72 67 65 69   a set of purgei
3760: 74 65 6d 73 0a 2a 2a 20 74 68 61 74 20 6e 65 65  tems.** that nee
3770: 64 20 74 6f 20 62 65 20 74 72 61 6e 73 66 65 72  d to be transfer
3780: 72 65 64 20 74 6f 20 74 68 65 20 42 4c 4f 42 20  red to the BLOB 
3790: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  table.  This rou
37a0: 74 69 6e 65 20 64 6f 65 73 0a 2a 2a 20 61 6c 6c  tine does.** all
37b0: 20 69 74 65 6d 73 20 74 68 61 74 20 68 61 76 65   items that have
37c0: 20 73 72 63 69 64 3d 69 53 72 63 2e 20 20 54 68   srcid=iSrc.  Th
37d0: 65 20 70 42 61 73 69 73 20 62 6c 6f 62 20 68 6f  e pBasis blob ho
37e0: 6c 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a  lds the content.
37f0: 2a 2a 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65  ** of the source
3800: 20 64 6f 63 75 6d 65 6e 74 20 69 66 20 69 53 72   document if iSr
3810: 63 3e 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  c>0..*/.static v
3820: 6f 69 64 20 70 75 72 67 65 5f 69 74 65 6d 5f 72  oid purge_item_r
3830: 65 73 75 72 72 65 63 74 28 69 6e 74 20 69 53 72  esurrect(int iSr
3840: 63 2c 20 42 6c 6f 62 20 2a 70 42 61 73 69 73 29  c, Blob *pBasis)
3850: 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 73 74  {.  Stmt q;.  st
3860: 61 74 69 63 20 42 61 67 20 62 75 73 79 3b 0a 20  atic Bag busy;. 
3870: 20 61 73 73 65 72 74 28 20 70 42 61 73 69 73 21   assert( pBasis!
3880: 3d 30 20 7c 7c 20 69 53 72 63 3d 3d 30 20 29 3b  =0 || iSrc==0 );
3890: 0a 20 20 69 66 28 20 69 53 72 63 3e 30 20 29 7b  .  if( iSrc>0 ){
38a0: 0a 20 20 20 20 69 66 28 20 62 61 67 5f 66 69 6e  .    if( bag_fin
38b0: 64 28 26 62 75 73 79 2c 20 69 53 72 63 29 20 29  d(&busy, iSrc) )
38c0: 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66  {.      fossil_f
38d0: 61 74 61 6c 28 22 64 65 6c 74 61 20 6c 6f 6f 70  atal("delta loop
38e0: 20 77 68 69 6c 65 20 75 6e 63 6f 6d 70 72 65 73   while uncompres
38f0: 73 69 6e 67 20 70 75 72 67 65 64 20 61 72 74 69  sing purged arti
3900: 66 61 63 74 73 22 29 3b 0a 20 20 20 20 7d 0a 20  facts");.    }. 
3910: 20 20 20 62 61 67 5f 69 6e 73 65 72 74 28 26 62     bag_insert(&b
3920: 75 73 79 2c 20 69 53 72 63 29 3b 0a 20 20 7d 0a  usy, iSrc);.  }.
3930: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c    db_prepare(&q,
3940: 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 75 75  .     "SELECT uu
3950: 69 64 2c 20 64 61 74 61 2c 20 69 73 50 72 69 76  id, data, isPriv
3960: 61 74 65 2c 20 69 78 2e 70 69 69 64 22 0a 20 20  ate, ix.piid".  
3970: 20 20 20 22 20 20 46 52 4f 4d 20 69 78 2c 20 70     "  FROM ix, p
3980: 75 72 67 65 69 74 65 6d 22 0a 20 20 20 20 20 22  urgeitem".     "
3990: 20 57 48 45 52 45 20 69 78 2e 73 72 63 69 64 3d   WHERE ix.srcid=
39a0: 25 64 22 0a 20 20 20 20 20 22 20 20 20 41 4e 44  %d".     "   AND
39b0: 20 69 78 2e 70 69 69 64 3d 70 75 72 67 65 69 74   ix.piid=purgeit
39c0: 65 6d 2e 70 69 69 64 3b 22 2c 0a 20 20 20 20 20  em.piid;",.     
39d0: 69 53 72 63 0a 20 20 29 3b 0a 20 20 77 68 69 6c  iSrc.  );.  whil
39e0: 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d  e( db_step(&q)==
39f0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
3a00: 20 20 42 6c 6f 62 20 68 31 2c 20 63 31 2c 20 63    Blob h1, c1, c
3a10: 32 3b 0a 20 20 20 20 69 6e 74 20 69 73 50 72 69  2;.    int isPri
3a20: 76 2c 20 72 69 64 3b 0a 20 20 20 20 62 6c 6f 62  v, rid;.    blob
3a30: 5f 7a 65 72 6f 28 26 68 31 29 3b 0a 20 20 20 20  _zero(&h1);.    
3a40: 64 62 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 26  db_column_blob(&
3a50: 71 2c 20 30 2c 20 26 68 31 29 3b 0a 20 20 20 20  q, 0, &h1);.    
3a60: 62 6c 6f 62 5f 7a 65 72 6f 28 26 63 31 29 3b 0a  blob_zero(&c1);.
3a70: 20 20 20 20 64 62 5f 63 6f 6c 75 6d 6e 5f 62 6c      db_column_bl
3a80: 6f 62 28 26 71 2c 20 31 2c 20 26 63 31 29 3b 0a  ob(&q, 1, &c1);.
3a90: 20 20 20 20 62 6c 6f 62 5f 75 6e 63 6f 6d 70 72      blob_uncompr
3aa0: 65 73 73 28 26 63 31 2c 20 26 63 31 29 3b 0a 20  ess(&c1, &c1);. 
3ab0: 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 63 32     blob_zero(&c2
3ac0: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 73 69  );.    if( pBasi
3ad0: 73 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f  s ){.      blob_
3ae0: 64 65 6c 74 61 5f 61 70 70 6c 79 28 70 42 61 73  delta_apply(pBas
3af0: 69 73 2c 20 26 63 31 2c 20 26 63 32 29 3b 0a 20  is, &c1, &c2);. 
3b00: 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28       blob_reset(
3b10: 26 63 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  &c1);.    }else{
3b20: 0a 20 20 20 20 20 20 63 32 20 3d 20 63 31 3b 0a  .      c2 = c1;.
3b30: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 68 6e      }.    if( hn
3b40: 61 6d 65 5f 76 65 72 69 66 79 5f 68 61 73 68 28  ame_verify_hash(
3b50: 26 63 32 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72  &c2, blob_buffer
3b60: 28 26 68 31 29 2c 20 62 6c 6f 62 5f 73 69 7a 65  (&h1), blob_size
3b70: 28 26 68 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20  (&h1))==0 ){.   
3b80: 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28     fossil_fatal(
3b90: 22 69 6e 63 6f 72 72 65 63 74 20 68 61 73 68 20  "incorrect hash 
3ba0: 6f 6e 20 25 62 22 2c 20 26 68 31 29 3b 0a 20 20  on %b", &h1);.  
3bb0: 20 20 7d 0a 20 20 20 20 69 73 50 72 69 76 20 3d    }.    isPriv =
3bc0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26   db_column_int(&
3bd0: 71 2c 20 32 29 3b 0a 20 20 20 20 72 69 64 20 3d  q, 2);.    rid =
3be0: 20 63 6f 6e 74 65 6e 74 5f 70 75 74 5f 65 78 28   content_put_ex(
3bf0: 26 63 32 2c 20 62 6c 6f 62 5f 73 74 72 28 26 68  &c2, blob_str(&h
3c00: 31 29 2c 20 30 2c 20 30 2c 20 69 73 50 72 69 76  1), 0, 0, isPriv
3c10: 29 3b 0a 20 20 20 20 69 66 28 20 72 69 64 3d 3d  );.    if( rid==
3c20: 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69  0 ){.      fossi
3c30: 6c 5f 66 61 74 61 6c 28 22 25 73 22 2c 20 67 2e  l_fatal("%s", g.
3c40: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 65  zErrMsg);.    }e
3c50: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
3c60: 69 73 50 72 69 76 20 29 20 63 6f 6e 74 65 6e 74  isPriv ) content
3c70: 5f 6d 61 6b 65 5f 70 75 62 6c 69 63 28 72 69 64  _make_public(rid
3c80: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 65 6e 74  );.      content
3c90: 5f 67 65 74 28 72 69 64 2c 20 26 63 31 29 3b 0a  _get(rid, &c1);.
3ca0: 20 20 20 20 20 20 6d 61 6e 69 66 65 73 74 5f 63        manifest_c
3cb0: 72 6f 73 73 6c 69 6e 6b 28 72 69 64 2c 20 26 63  rosslink(rid, &c
3cc0: 31 2c 20 4d 43 5f 4e 4f 5f 45 52 52 4f 52 53 29  1, MC_NO_ERRORS)
3cd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 72 67  ;.    }.    purg
3ce0: 65 5f 69 74 65 6d 5f 72 65 73 75 72 72 65 63 74  e_item_resurrect
3cf0: 28 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26  (db_column_int(&
3d00: 71 2c 33 29 2c 20 26 63 32 29 3b 0a 20 20 20 20  q,3), &c2);.    
3d10: 62 6c 6f 62 5f 72 65 73 65 74 28 26 63 32 29 3b  blob_reset(&c2);
3d20: 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69  .  }.  db_finali
3d30: 7a 65 28 26 71 29 3b 0a 20 20 69 66 28 20 69 53  ze(&q);.  if( iS
3d40: 72 63 3e 30 20 29 20 62 61 67 5f 72 65 6d 6f 76  rc>0 ) bag_remov
3d50: 65 28 26 62 75 73 79 2c 20 69 53 72 63 29 3b 0a  e(&busy, iSrc);.
3d60: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44  }../*.** COMMAND
3d70: 3a 20 70 75 72 67 65 2a 0a 2a 2a 0a 2a 2a 20 54  : purge*.**.** T
3d80: 68 65 20 70 75 72 67 65 20 63 6f 6d 6d 61 6e 64  he purge command
3d90: 20 72 65 6d 6f 76 65 73 20 63 6f 6e 74 65 6e 74   removes content
3da0: 20 66 72 6f 6d 20 61 20 72 65 70 6f 73 69 74 6f   from a reposito
3db0: 72 79 20 61 6e 64 20 73 74 6f 72 65 73 20 74 68  ry and stores th
3dc0: 61 74 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 69 6e  at content.** in
3dd0: 20 61 20 22 67 72 61 76 65 79 61 72 64 22 2e 20   a "graveyard". 
3de0: 20 54 68 65 20 67 72 61 76 65 79 61 72 64 20 65   The graveyard e
3df0: 78 69 73 74 73 20 73 6f 20 74 68 61 74 20 63 6f  xists so that co
3e00: 6e 74 65 6e 74 20 63 61 6e 20 62 65 20 72 65 63  ntent can be rec
3e10: 6f 76 65 72 65 64 0a 2a 2a 20 75 73 69 6e 67 20  overed.** using 
3e20: 74 68 65 20 22 66 6f 73 73 69 6c 20 70 75 72 67  the "fossil purg
3e30: 65 20 75 6e 64 6f 22 20 63 6f 6d 6d 61 6e 64 2e  e undo" command.
3e40: 20 20 54 68 65 20 22 66 6f 73 73 69 6c 20 70 75    The "fossil pu
3e50: 72 67 65 20 6f 62 6c 69 74 65 72 61 74 65 22 0a  rge obliterate".
3e60: 2a 2a 20 63 6f 6d 6d 61 6e 64 20 65 6d 70 74 69  ** command empti
3e70: 65 73 20 74 68 65 20 67 72 61 76 65 79 61 72 64  es the graveyard
3e80: 2c 20 6d 61 6b 69 6e 67 20 74 68 65 20 63 6f 6e  , making the con
3e90: 74 65 6e 74 20 75 6e 72 65 63 6f 76 65 72 61 62  tent unrecoverab
3ea0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 3d 3d 3d 3d 20 57  le..**.** ==== W
3eb0: 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 63 6f 6d  ARNING: This com
3ec0: 6d 61 6e 64 20 63 61 6e 20 70 6f 74 65 6e 74 69  mand can potenti
3ed0: 61 6c 6c 79 20 64 65 73 74 72 6f 79 20 68 69 73  ally destroy his
3ee0: 74 6f 72 69 63 61 6c 20 64 61 74 61 20 61 6e 64  torical data and
3ef0: 20 3d 3d 3d 3d 0a 2a 2a 20 3d 3d 3d 3d 20 6c 65   ====.** ==== le
3f00: 61 76 65 20 79 6f 75 72 20 72 65 70 6f 73 69 74  ave your reposit
3f10: 6f 72 79 20 69 6e 20 61 20 67 6f 6f 66 79 20 73  ory in a goofy s
3f20: 74 61 74 65 2e 20 4b 6e 6f 77 20 77 68 61 74 20  tate. Know what 
3f30: 79 6f 75 20 61 72 65 20 64 6f 69 6e 67 21 20 20  you are doing!  
3f40: 3d 3d 3d 3d 0a 2a 2a 20 3d 3d 3d 3d 20 4d 61 6b  ====.** ==== Mak
3f50: 65 20 61 20 62 61 63 6b 75 70 20 6f 66 20 79 6f  e a backup of yo
3f60: 75 72 20 72 65 70 6f 73 69 74 6f 72 79 20 62 65  ur repository be
3f70: 66 6f 72 65 20 75 73 69 6e 67 20 74 68 69 73 20  fore using this 
3f80: 63 6f 6d 6d 61 6e 64 21 20 20 20 20 20 20 20 3d  command!       =
3f90: 3d 3d 3d 0a 2a 2a 0a 2a 2a 20 3d 3d 3d 3d 20 46  ===.**.** ==== F
3fa0: 55 52 54 48 45 52 20 57 41 52 4e 49 4e 47 3a 20  URTHER WARNING: 
3fb0: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20  This command is 
3fc0: 61 20 77 6f 72 6b 2d 69 6e 2d 70 72 6f 67 72 65  a work-in-progre
3fd0: 73 73 20 61 6e 64 20 6d 61 79 20 79 65 74 20 20  ss and may yet  
3fe0: 20 3d 3d 3d 3d 0a 2a 2a 20 3d 3d 3d 3d 20 63 6f   ====.** ==== co
3ff0: 6e 74 61 69 6e 20 62 75 67 73 2e 20 20 20 20 20  ntain bugs.     
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4030: 3d 3d 3d 3d 0a 2a 2a 0a 2a 2a 20 20 20 66 6f 73  ====.**.**   fos
4040: 73 69 6c 20 70 75 72 67 65 20 61 72 74 69 66 61  sil purge artifa
4050: 63 74 73 20 55 55 49 44 2e 2e 2e 20 3f 4f 50 54  cts UUID... ?OPT
4060: 49 4f 4e 53 3f 0a 2a 2a 0a 2a 2a 20 20 20 20 20  IONS?.**.**     
4070: 20 4d 6f 76 65 20 61 72 62 69 74 72 61 72 79 20   Move arbitrary 
4080: 61 72 74 69 66 61 63 74 73 20 69 64 65 6e 74 69  artifacts identi
4090: 66 69 65 64 20 62 79 20 74 68 65 20 55 55 49 44  fied by the UUID
40a0: 20 6c 69 73 74 20 69 6e 74 6f 20 74 68 65 0a 2a   list into the.*
40b0: 2a 20 20 20 20 20 20 67 72 61 76 65 79 61 72 64  *      graveyard
40c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 6f 73 73 69 6c  ..**.**   fossil
40d0: 20 70 75 72 67 65 20 63 61 74 20 55 55 49 44 2e   purge cat UUID.
40e0: 2e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 57 72  ...**.**      Wr
40f0: 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ite the content 
4100: 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61  of one or more a
4110: 72 74 69 66 61 63 74 73 20 69 6e 20 74 68 65 20  rtifacts in the 
4120: 67 72 61 76 65 79 61 72 64 20 6f 6e 74 6f 0a 2a  graveyard onto.*
4130: 2a 20 20 20 20 20 20 73 74 61 6e 64 61 72 64 20  *      standard 
4140: 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  output..**.**   
4150: 66 6f 73 73 69 6c 20 70 75 72 67 65 20 63 68 65  fossil purge che
4160: 63 6b 69 6e 73 20 54 41 47 53 2e 2e 2e 20 3f 4f  ckins TAGS... ?O
4170: 50 54 49 4f 4e 53 3f 0a 2a 2a 0a 2a 2a 20 20 20  PTIONS?.**.**   
4180: 20 20 20 4d 6f 76 65 20 74 68 65 20 63 68 65 63     Move the chec
4190: 6b 2d 69 6e 73 20 6f 72 20 62 72 61 6e 63 68 65  k-ins or branche
41a0: 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
41b0: 54 41 47 53 20 61 6e 64 20 61 6c 6c 20 6f 66 0a  TAGS and all of.
41c0: 2a 2a 20 20 20 20 20 20 74 68 65 69 72 20 64 65  **      their de
41d0: 73 63 65 6e 64 61 6e 74 73 20 6f 75 74 20 6f 66  scendants out of
41e0: 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20   the repository 
41f0: 61 6e 64 20 69 6e 74 6f 20 74 68 65 20 67 72 61  and into the gra
4200: 76 65 79 61 72 64 2e 0a 2a 2a 20 20 20 20 20 20  veyard..**      
4210: 49 66 20 54 41 47 53 20 69 6e 63 6c 75 64 65 73  If TAGS includes
4220: 20 61 20 62 72 61 6e 63 68 20 6e 61 6d 65 20 74   a branch name t
4230: 68 65 6e 20 69 74 20 6d 65 61 6e 73 20 61 6c 6c  hen it means all
4240: 20 74 68 65 20 63 68 65 63 6b 2d 69 6e 73 0a 2a   the check-ins.*
4250: 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 6d 6f  *      on the mo
4260: 73 74 20 72 65 63 65 6e 74 20 6f 63 63 75 72 72  st recent occurr
4270: 65 6e 63 65 20 6f 66 20 74 68 61 74 20 62 72 61  ence of that bra
4280: 6e 63 68 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 6f 73  nch..**.**   fos
4290: 73 69 6c 20 70 75 72 67 65 20 66 69 6c 65 73 20  sil purge files 
42a0: 4e 41 4d 45 20 2e 2e 2e 20 3f 4f 50 54 49 4f 4e  NAME ... ?OPTION
42b0: 53 3f 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 4d 6f  S?.**.**      Mo
42c0: 76 65 20 61 6c 6c 20 69 6e 73 74 61 6e 63 65 73  ve all instances
42d0: 20 6f 66 20 66 69 6c 65 73 20 63 61 6c 6c 65 64   of files called
42e0: 20 4e 41 4d 45 20 69 6e 74 6f 20 74 68 65 20 67   NAME into the g
42f0: 72 61 76 65 79 61 72 64 2e 0a 2a 2a 20 20 20 20  raveyard..**    
4300: 20 20 4e 41 4d 45 20 73 68 6f 75 6c 64 20 62 65    NAME should be
4310: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
4320: 20 66 69 6c 65 20 72 65 6c 61 74 69 76 65 20 74   file relative t
4330: 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  o the root of th
4340: 65 0a 2a 2a 20 20 20 20 20 20 72 65 70 6f 73 69  e.**      reposi
4350: 74 6f 72 79 2e 20 20 49 66 20 4e 41 4d 45 20 69  tory.  If NAME i
4360: 73 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 74  s a directory, t
4370: 68 65 6e 20 61 6c 6c 20 66 69 6c 65 73 20 77 69  hen all files wi
4380: 74 68 69 6e 20 74 68 61 74 0a 2a 2a 20 20 20 20  thin that.**    
4390: 20 20 64 69 72 65 63 74 6f 72 79 20 61 72 65 20    directory are 
43a0: 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 66  moved..**.**   f
43b0: 6f 73 73 69 6c 20 70 75 72 67 65 20 6c 69 73 74  ossil purge list
43c0: 7c 6c 73 20 3f 2d 6c 3f 0a 2a 2a 0a 2a 2a 20 20  |ls ?-l?.**.**  
43d0: 20 20 20 20 53 68 6f 77 20 74 68 65 20 67 72 61      Show the gra
43e0: 76 65 79 61 72 64 20 6f 66 20 70 72 69 6f 72 20  veyard of prior 
43f0: 70 75 72 67 65 73 2e 20 20 54 68 65 20 2d 6c 20  purges.  The -l 
4400: 6f 70 74 69 6f 6e 20 67 69 76 65 73 20 6d 6f 72  option gives mor
4410: 65 0a 2a 2a 20 20 20 20 20 20 64 65 74 61 69 6c  e.**      detail
4420: 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 0a   in the output..
4430: 2a 2a 0a 2a 2a 20 20 20 66 6f 73 73 69 6c 20 70  **.**   fossil p
4440: 75 72 67 65 20 6f 62 6c 69 74 65 72 61 74 65 20  urge obliterate 
4450: 49 44 2e 2e 2e 20 3f 2d 2d 66 6f 72 63 65 3f 0a  ID... ?--force?.
4460: 2a 2a 0a 2a 2a 20 20 20 20 20 20 52 65 6d 6f 76  **.**      Remov
4470: 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 70 75  e one or more pu
4480: 72 67 65 20 65 76 65 6e 74 73 20 66 72 6f 6d 20  rge events from 
4490: 74 68 65 20 67 72 61 76 65 79 61 72 64 2e 20 20  the graveyard.  
44a0: 4f 6e 63 65 20 61 20 70 75 72 67 65 0a 2a 2a 20  Once a purge.** 
44b0: 20 20 20 20 20 65 76 65 6e 74 20 69 73 20 6f 62       event is ob
44c0: 6c 69 74 65 72 61 74 65 64 2c 20 69 74 20 63 61  literated, it ca
44d0: 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 75  n no longer be u
44e0: 6e 64 6f 6e 65 2e 20 20 54 68 65 20 2d 2d 66 6f  ndone.  The --fo
44f0: 72 63 65 0a 2a 2a 20 20 20 20 20 20 6f 70 74 69  rce.**      opti
4500: 6f 6e 20 73 75 70 70 72 65 73 73 65 73 20 74 68  on suppresses th
4510: 65 20 63 6f 6e 66 69 72 6d 61 74 69 6f 6e 20 70  e confirmation p
4520: 72 6f 6d 70 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 66  rompt..**.**   f
4530: 6f 73 73 69 6c 20 70 75 72 67 65 20 74 69 63 6b  ossil purge tick
4540: 65 74 73 20 4e 41 4d 45 20 2e 2e 2e 20 3f 4f 50  ets NAME ... ?OP
4550: 54 49 4f 4e 53 3f 0a 2a 2a 0a 2a 2a 20 20 20 20  TIONS?.**.**    
4560: 20 20 54 42 44 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 20    TBD....**.**  
4570: 20 66 6f 73 73 69 6c 20 70 75 72 67 65 20 75 6e   fossil purge un
4580: 64 6f 20 49 44 0a 2a 2a 0a 2a 2a 20 20 20 20 20  do ID.**.**     
4590: 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e   Restore the con
45a0: 74 65 6e 74 20 70 72 65 76 69 6f 75 73 6c 79 20  tent previously 
45b0: 72 65 6d 6f 76 65 64 20 62 79 20 70 75 72 67 65  removed by purge
45c0: 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 6f 73   ID..**.**   fos
45d0: 73 69 6c 20 70 75 72 67 65 20 77 69 6b 69 20 4e  sil purge wiki N
45e0: 41 4d 45 20 2e 2e 2e 20 3f 4f 50 54 49 4f 4e 53  AME ... ?OPTIONS
45f0: 3f 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 54 42 44  ?.**.**      TBD
4600: 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 43 4f 4d 4d 4f 4e  ....**.** COMMON
4610: 20 4f 50 54 49 4f 4e 53 3a 0a 2a 2a 0a 2a 2a 20   OPTIONS:.**.** 
4620: 20 20 2d 2d 65 78 70 6c 61 69 6e 20 20 20 20 20    --explain     
4630: 20 20 20 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e      Make no chan
4640: 67 65 73 2c 20 62 75 74 20 73 68 6f 77 20 77 68  ges, but show wh
4650: 61 74 20 77 6f 75 6c 64 20 68 61 70 70 65 6e 2e  at would happen.
4660: 0a 2a 2a 20 20 20 2d 2d 64 72 79 2d 72 75 6e 20  .**   --dry-run 
4670: 20 20 20 20 20 20 20 20 41 6e 20 61 6c 69 61 73          An alias
4680: 20 66 6f 72 20 2d 2d 65 78 70 6c 61 69 6e 0a 2a   for --explain.*
4690: 2a 0a 2a 2a 20 53 55 4d 4d 41 52 59 3a 0a 2a 2a  *.** SUMMARY:.**
46a0: 20 20 20 66 6f 73 73 69 6c 20 70 75 72 67 65 20     fossil purge 
46b0: 61 72 74 69 66 61 63 74 73 20 55 55 49 44 2e 2e  artifacts UUID..
46c0: 20 5b 4f 50 54 49 4f 4e 53 5d 0a 2a 2a 20 20 20   [OPTIONS].**   
46d0: 66 6f 73 73 69 6c 20 70 75 72 67 65 20 63 61 74  fossil purge cat
46e0: 20 55 55 49 44 2e 2e 2e 0a 2a 2a 20 20 20 66 6f   UUID....**   fo
46f0: 73 73 69 6c 20 70 75 72 67 65 20 63 68 65 63 6b  ssil purge check
4700: 69 6e 73 20 54 41 47 53 2e 2e 2e 20 5b 4f 50 54  ins TAGS... [OPT
4710: 49 4f 4e 53 5d 0a 2a 2a 20 20 20 66 6f 73 73 69  IONS].**   fossi
4720: 6c 20 70 75 72 67 65 20 66 69 6c 65 73 20 46 49  l purge files FI
4730: 4c 45 4e 41 4d 45 2e 2e 2e 20 5b 4f 50 54 49 4f  LENAME... [OPTIO
4740: 4e 53 5d 0a 2a 2a 20 20 20 66 6f 73 73 69 6c 20  NS].**   fossil 
4750: 70 75 72 67 65 20 6c 69 73 74 0a 2a 2a 20 20 20  purge list.**   
4760: 66 6f 73 73 69 6c 20 70 75 72 67 65 20 6f 62 6c  fossil purge obl
4770: 69 74 65 72 61 74 65 20 49 44 2e 2e 2e 0a 2a 2a  iterate ID....**
4780: 20 20 20 66 6f 73 73 69 6c 20 70 75 72 67 65 20     fossil purge 
4790: 74 69 63 6b 65 74 73 20 4e 41 4d 45 2e 2e 2e 20  tickets NAME... 
47a0: 5b 4f 50 54 49 4f 4e 53 5d 0a 2a 2a 20 20 20 66  [OPTIONS].**   f
47b0: 6f 73 73 69 6c 20 70 75 72 67 65 20 75 6e 64 6f  ossil purge undo
47c0: 20 49 44 0a 2a 2a 20 20 20 66 6f 73 73 69 6c 20   ID.**   fossil 
47d0: 70 75 72 67 65 20 77 69 6b 69 20 4e 41 4d 45 2e  purge wiki NAME.
47e0: 2e 2e 20 5b 4f 50 54 49 4f 4e 53 5d 0a 2a 2f 0a  .. [OPTIONS].*/.
47f0: 76 6f 69 64 20 70 75 72 67 65 5f 63 6d 64 28 76  void purge_cmd(v
4800: 6f 69 64 29 7b 0a 20 20 69 6e 74 20 70 75 72 67  oid){.  int purg
4810: 65 46 6c 61 67 73 20 3d 20 50 55 52 47 45 5f 4d  eFlags = PURGE_M
4820: 4f 56 45 54 4f 5f 47 52 41 56 45 59 41 52 44 20  OVETO_GRAVEYARD 
4830: 7c 20 50 55 52 47 45 5f 50 52 49 4e 54 5f 53 55  | PURGE_PRINT_SU
4840: 4d 4d 41 52 59 3b 0a 20 20 63 6f 6e 73 74 20 63  MMARY;.  const c
4850: 68 61 72 20 2a 7a 53 75 62 63 6d 64 3b 0a 20 20  har *zSubcmd;.  
4860: 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  int n;.  int i;.
4870: 20 20 53 74 6d 74 20 71 3b 0a 0a 20 20 69 66 28    Stmt q;..  if(
4880: 20 67 2e 61 72 67 63 3c 33 20 29 20 75 73 61 67   g.argc<3 ) usag
4890: 65 28 22 53 55 42 43 4f 4d 4d 41 4e 44 20 3f 41  e("SUBCOMMAND ?A
48a0: 52 47 53 3f 22 29 3b 0a 20 20 7a 53 75 62 63 6d  RGS?");.  zSubcm
48b0: 64 20 3d 20 67 2e 61 72 67 76 5b 32 5d 3b 0a 20  d = g.argv[2];. 
48c0: 20 64 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f 70 65   db_find_and_ope
48d0: 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 30 2c 30  n_repository(0,0
48e0: 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74  );.  n = (int)st
48f0: 72 6c 65 6e 28 7a 53 75 62 63 6d 64 29 3b 0a 20  rlen(zSubcmd);. 
4900: 20 69 66 28 20 66 69 6e 64 5f 6f 70 74 69 6f 6e   if( find_option
4910: 28 22 65 78 70 6c 61 69 6e 22 2c 30 2c 30 29 21  ("explain",0,0)!
4920: 3d 30 20 7c 7c 20 66 69 6e 64 5f 6f 70 74 69 6f  =0 || find_optio
4930: 6e 28 22 64 72 79 2d 72 75 6e 22 2c 30 2c 30 29  n("dry-run",0,0)
4940: 21 3d 30 20 29 7b 0a 20 20 20 20 70 75 72 67 65  !=0 ){.    purge
4950: 46 6c 61 67 73 20 7c 3d 20 50 55 52 47 45 5f 45  Flags |= PURGE_E
4960: 58 50 4c 41 49 4e 5f 4f 4e 4c 59 3b 0a 20 20 7d  XPLAIN_ONLY;.  }
4970: 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a  .  if( strncmp(z
4980: 53 75 62 63 6d 64 2c 20 22 61 72 74 69 66 61 63  Subcmd, "artifac
4990: 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ts", n)==0 ){.  
49a0: 20 20 76 65 72 69 66 79 5f 61 6c 6c 5f 6f 70 74    verify_all_opt
49b0: 69 6f 6e 73 28 29 3b 0a 20 20 20 20 64 62 5f 62  ions();.    db_b
49c0: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
49d0: 28 29 3b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69  ();.    db_multi
49e0: 5f 65 78 65 63 28 22 43 52 45 41 54 45 20 54 45  _exec("CREATE TE
49f0: 4d 50 20 54 41 42 4c 45 20 6f 6b 28 72 69 64 20  MP TABLE ok(rid 
4a00: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
4a10: 4b 45 59 29 22 29 3b 0a 20 20 20 20 66 6f 72 28  KEY)");.    for(
4a20: 69 3d 33 3b 20 69 3c 67 2e 61 72 67 63 3b 20 69  i=3; i<g.argc; i
4a30: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  ++){.      int r
4a40: 20 3d 20 6e 61 6d 65 5f 74 6f 5f 74 79 70 65 64   = name_to_typed
4a50: 5f 72 69 64 28 67 2e 61 72 67 76 5b 69 5d 2c 20  _rid(g.argv[i], 
4a60: 22 22 29 3b 0a 20 20 20 20 20 20 64 62 5f 6d 75  "");.      db_mu
4a70: 6c 74 69 5f 65 78 65 63 28 22 49 4e 53 45 52 54  lti_exec("INSERT
4a80: 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20   OR IGNORE INTO 
4a90: 6f 6b 28 72 69 64 29 20 56 41 4c 55 45 53 28 25  ok(rid) VALUES(%
4aa0: 64 29 3b 22 2c 20 72 29 3b 0a 20 20 20 20 7d 0a  d);", r);.    }.
4ab0: 20 20 20 20 64 65 73 63 72 69 62 65 5f 61 72 74      describe_art
4ac0: 69 66 61 63 74 73 5f 74 6f 5f 73 74 64 6f 75 74  ifacts_to_stdout
4ad0: 28 22 49 4e 20 6f 6b 22 2c 20 30 29 3b 0a 20 20  ("IN ok", 0);.  
4ae0: 20 20 70 75 72 67 65 5f 61 72 74 69 66 61 63 74    purge_artifact
4af0: 5f 6c 69 73 74 28 22 6f 6b 22 2c 20 22 22 2c 20  _list("ok", "", 
4b00: 70 75 72 67 65 46 6c 61 67 73 29 3b 0a 20 20 20  purgeFlags);.   
4b10: 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74   db_end_transact
4b20: 69 6f 6e 28 30 29 3b 0a 20 20 7d 65 6c 73 65 20  ion(0);.  }else 
4b30: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 75 62  if( strncmp(zSub
4b40: 63 6d 64 2c 20 22 63 61 74 22 2c 20 6e 29 3d 3d  cmd, "cat", n)==
4b50: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  0 ){.    int i, 
4b60: 70 69 69 64 3b 0a 20 20 20 20 42 6c 6f 62 20 63  piid;.    Blob c
4b70: 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 69 66 28 20  ontent;.    if( 
4b80: 67 2e 61 72 67 63 3c 34 20 29 20 75 73 61 67 65  g.argc<4 ) usage
4b90: 28 22 63 61 74 20 55 55 49 44 2e 2e 2e 22 29 3b  ("cat UUID...");
4ba0: 0a 20 20 20 20 66 6f 72 28 69 3d 33 3b 20 69 3c  .    for(i=3; i<
4bb0: 67 2e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  g.argc; i++){.  
4bc0: 20 20 20 20 70 69 69 64 20 3d 20 64 62 5f 69 6e      piid = db_in
4bd0: 74 28 30 2c 20 22 53 45 4c 45 43 54 20 70 69 69  t(0, "SELECT pii
4be0: 64 20 46 52 4f 4d 20 70 75 72 67 65 69 74 65 6d  d FROM purgeitem
4bf0: 20 57 48 45 52 45 20 75 75 69 64 20 4c 49 4b 45   WHERE uuid LIKE
4c00: 20 27 25 71 25 25 27 22 2c 0a 20 20 20 20 20 20   '%q%%'",.      
4c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c20: 20 67 2e 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20   g.argv[i]);.   
4c30: 20 20 20 69 66 28 20 70 69 69 64 3d 3d 30 20 29     if( piid==0 )
4c40: 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 6e   fossil_fatal("n
4c50: 6f 20 73 75 63 68 20 69 74 65 6d 3a 20 25 73 22  o such item: %s"
4c60: 2c 20 67 2e 61 72 67 76 5b 33 5d 29 3b 0a 20 20  , g.argv[3]);.  
4c70: 20 20 20 20 70 75 72 67 65 5f 65 78 74 72 61 63      purge_extrac
4c80: 74 5f 69 74 65 6d 28 70 69 69 64 2c 20 26 63 6f  t_item(piid, &co
4c90: 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 62 6c  ntent);.      bl
4ca0: 6f 62 5f 77 72 69 74 65 5f 74 6f 5f 66 69 6c 65  ob_write_to_file
4cb0: 28 26 63 6f 6e 74 65 6e 74 2c 20 22 2d 22 29 3b  (&content, "-");
4cc0: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 65  .      blob_rese
4cd0: 74 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  t(&content);.   
4ce0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73   }.  }else if( s
4cf0: 74 72 6e 63 6d 70 28 7a 53 75 62 63 6d 64 2c 20  trncmp(zSubcmd, 
4d00: 22 63 68 65 63 6b 69 6e 73 22 2c 20 6e 29 3d 3d  "checkins", n)==
4d10: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 76 69 64  0 ){.    int vid
4d20: 3b 0a 20 20 20 20 69 66 28 20 66 69 6e 64 5f 6f  ;.    if( find_o
4d30: 70 74 69 6f 6e 28 22 65 78 70 6c 61 69 6e 22 2c  ption("explain",
4d40: 30 2c 30 29 21 3d 30 20 7c 7c 20 66 69 6e 64 5f  0,0)!=0 || find_
4d50: 6f 70 74 69 6f 6e 28 22 64 72 79 2d 72 75 6e 22  option("dry-run"
4d60: 2c 30 2c 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  ,0,0)!=0 ){.    
4d70: 20 20 70 75 72 67 65 46 6c 61 67 73 20 7c 3d 20    purgeFlags |= 
4d80: 50 55 52 47 45 5f 45 58 50 4c 41 49 4e 5f 4f 4e  PURGE_EXPLAIN_ON
4d90: 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 65  LY;.    }.    ve
4da0: 72 69 66 79 5f 61 6c 6c 5f 6f 70 74 69 6f 6e 73  rify_all_options
4db0: 28 29 3b 0a 20 20 20 20 64 62 5f 62 65 67 69 6e  ();.    db_begin
4dc0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a  _transaction();.
4dd0: 20 20 20 20 69 66 28 20 67 2e 61 72 67 63 3c 3d      if( g.argc<=
4de0: 33 20 29 20 75 73 61 67 65 28 22 63 68 65 63 6b  3 ) usage("check
4df0: 69 6e 73 20 54 41 47 53 2e 2e 2e 20 5b 4f 50 54  ins TAGS... [OPT
4e00: 49 4f 4e 53 5d 22 29 3b 0a 20 20 20 20 64 62 5f  IONS]");.    db_
4e10: 6d 75 6c 74 69 5f 65 78 65 63 28 22 43 52 45 41  multi_exec("CREA
4e20: 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 6f 6b  TE TEMP TABLE ok
4e30: 28 72 69 64 20 49 4e 54 45 47 45 52 20 50 52 49  (rid INTEGER PRI
4e40: 4d 41 52 59 20 4b 45 59 29 22 29 3b 0a 20 20 20  MARY KEY)");.   
4e50: 20 66 6f 72 28 69 3d 33 3b 20 69 3c 67 2e 61 72   for(i=3; i<g.ar
4e60: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gc; i++){.      
4e70: 69 6e 74 20 72 20 3d 20 6e 61 6d 65 5f 74 6f 5f  int r = name_to_
4e80: 74 79 70 65 64 5f 72 69 64 28 67 2e 61 72 67 76  typed_rid(g.argv
4e90: 5b 69 5d 2c 20 22 62 72 22 29 3b 0a 20 20 20 20  [i], "br");.    
4ea0: 20 20 63 6f 6d 70 75 74 65 5f 64 65 73 63 65 6e    compute_descen
4eb0: 64 61 6e 74 73 28 72 2c 20 31 30 30 30 30 30 30  dants(r, 1000000
4ec0: 30 30 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  000);.    }.    
4ed0: 76 69 64 20 3d 20 64 62 5f 6c 67 65 74 5f 69 6e  vid = db_lget_in
4ee0: 74 28 22 63 68 65 63 6b 6f 75 74 22 2c 30 29 3b  t("checkout",0);
4ef0: 0a 20 20 20 20 69 66 28 20 64 62 5f 65 78 69 73  .    if( db_exis
4f00: 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f  ts("SELECT 1 FRO
4f10: 4d 20 6f 6b 20 57 48 45 52 45 20 72 69 64 3d 25  M ok WHERE rid=%
4f20: 64 22 2c 76 69 64 29 20 29 7b 0a 20 20 20 20 20  d",vid) ){.     
4f30: 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 63   fossil_fatal("c
4f40: 61 6e 6e 6f 74 20 70 75 72 67 65 20 74 68 65 20  annot purge the 
4f50: 63 75 72 72 65 6e 74 20 63 68 65 63 6b 6f 75 74  current checkout
4f60: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 69  ");.    }.    fi
4f70: 6e 64 5f 63 68 65 63 6b 69 6e 5f 61 73 73 6f 63  nd_checkin_assoc
4f80: 69 61 74 65 73 28 22 6f 6b 22 2c 20 31 29 3b 0a  iates("ok", 1);.
4f90: 20 20 20 20 70 75 72 67 65 5f 61 72 74 69 66 61      purge_artifa
4fa0: 63 74 5f 6c 69 73 74 28 22 6f 6b 22 2c 20 22 22  ct_list("ok", ""
4fb0: 2c 20 70 75 72 67 65 46 6c 61 67 73 29 3b 0a 20  , purgeFlags);. 
4fc0: 20 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61     db_end_transa
4fd0: 63 74 69 6f 6e 28 30 29 3b 0a 20 20 7d 65 6c 73  ction(0);.  }els
4fe0: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53  e if( strncmp(zS
4ff0: 75 62 63 6d 64 2c 20 22 66 69 6c 65 73 22 2c 20  ubcmd, "files", 
5000: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 76 65 72  n)==0 ){.    ver
5010: 69 66 79 5f 61 6c 6c 5f 6f 70 74 69 6f 6e 73 28  ify_all_options(
5020: 29 3b 0a 20 20 20 20 64 62 5f 62 65 67 69 6e 5f  );.    db_begin_
5030: 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20  transaction();. 
5040: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63     db_multi_exec
5050: 28 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41  ("CREATE TEMP TA
5060: 42 4c 45 20 6f 6b 28 72 69 64 20 49 4e 54 45 47  BLE ok(rid INTEG
5070: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 29 22  ER PRIMARY KEY)"
5080: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33 3b 20  );.    for(i=3; 
5090: 69 3c 67 2e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  i<g.argc; i++){.
50a0: 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65        db_multi_e
50b0: 78 65 63 28 0a 20 20 20 20 20 20 20 20 20 22 49  xec(.         "I
50c0: 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
50d0: 49 4e 54 4f 20 6f 6b 28 72 69 64 29 20 22 0a 20  INTO ok(rid) ". 
50e0: 20 20 20 20 20 20 20 20 22 20 20 53 45 4c 45 43          "  SELEC
50f0: 54 20 66 69 64 20 46 52 4f 4d 20 6d 6c 69 6e 6b  T fid FROM mlink
5100: 2c 20 66 69 6c 65 6e 61 6d 65 22 0a 20 20 20 20  , filename".    
5110: 20 20 20 20 20 22 20 20 20 57 48 45 52 45 20 6d       "   WHERE m
5120: 6c 69 6e 6b 2e 66 6e 69 64 3d 66 69 6c 65 6e 61  link.fnid=filena
5130: 6d 65 2e 66 6e 69 64 22 0a 20 20 20 20 20 20 20  me.fnid".       
5140: 20 20 22 20 20 20 20 20 41 4e 44 20 28 66 69 6c    "     AND (fil
5150: 65 6e 61 6d 65 2e 6e 61 6d 65 3d 25 51 20 4f 52  ename.name=%Q OR
5160: 20 66 69 6c 65 6e 61 6d 65 2e 6e 61 6d 65 20 47   filename.name G
5170: 4c 4f 42 20 27 25 71 2f 2a 27 29 22 2c 0a 20 20  LOB '%q/*')",.  
5180: 20 20 20 20 20 20 20 67 2e 61 72 67 76 5b 69 5d         g.argv[i]
5190: 2c 20 67 2e 61 72 67 76 5b 69 5d 0a 20 20 20 20  , g.argv[i].    
51a0: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70    );.    }.    p
51b0: 75 72 67 65 5f 61 72 74 69 66 61 63 74 5f 6c 69  urge_artifact_li
51c0: 73 74 28 22 6f 6b 22 2c 20 22 22 2c 20 70 75 72  st("ok", "", pur
51d0: 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 64 62  geFlags);.    db
51e0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
51f0: 28 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  (0);.  }else if(
5200: 20 73 74 72 6e 63 6d 70 28 7a 53 75 62 63 6d 64   strncmp(zSubcmd
5210: 2c 20 22 6c 69 73 74 22 2c 20 6e 29 3d 3d 30 20  , "list", n)==0 
5220: 7c 7c 20 73 74 72 63 6d 70 28 7a 53 75 62 63 6d  || strcmp(zSubcm
5230: 64 2c 22 6c 73 22 29 3d 3d 30 20 29 7b 0a 20 20  d,"ls")==0 ){.  
5240: 20 20 69 6e 74 20 73 68 6f 77 44 65 74 61 69 6c    int showDetail
5250: 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22   = find_option("
5260: 6c 22 2c 22 6c 22 2c 30 29 21 3d 30 3b 0a 20 20  l","l",0)!=0;.  
5270: 20 20 69 66 28 20 21 64 62 5f 74 61 62 6c 65 5f    if( !db_table_
5280: 65 78 69 73 74 73 28 22 72 65 70 6f 73 69 74 6f  exists("reposito
5290: 72 79 22 2c 22 70 75 72 67 65 65 76 65 6e 74 22  ry","purgeevent"
52a0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ) ) return;.    
52b0: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 22  db_prepare(&q, "
52c0: 53 45 4c 45 43 54 20 70 65 69 64 2c 20 64 61 74  SELECT peid, dat
52d0: 65 74 69 6d 65 28 63 74 69 6d 65 2c 27 75 6e 69  etime(ctime,'uni
52e0: 78 65 70 6f 63 68 27 2c 74 6f 4c 6f 63 61 6c 28  xepoch',toLocal(
52f0: 29 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))".            
5300: 20 20 20 20 20 20 20 22 20 46 52 4f 4d 20 70 75         " FROM pu
5310: 72 67 65 65 76 65 6e 74 22 29 3b 0a 20 20 20 20  rgeevent");.    
5320: 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26  while( db_step(&
5330: 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  q)==SQLITE_ROW )
5340: 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70  {.      fossil_p
5350: 72 69 6e 74 28 22 25 34 64 20 6f 6e 20 25 73 5c  rint("%4d on %s\
5360: 6e 22 2c 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e  n", db_column_in
5370: 74 28 26 71 2c 30 29 2c 20 64 62 5f 63 6f 6c 75  t(&q,0), db_colu
5380: 6d 6e 5f 74 65 78 74 28 26 71 2c 31 29 29 3b 0a  mn_text(&q,1));.
5390: 20 20 20 20 20 20 69 66 28 20 73 68 6f 77 44 65        if( showDe
53a0: 74 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  tail ){.        
53b0: 70 75 72 67 65 5f 6c 69 73 74 5f 65 76 65 6e 74  purge_list_event
53c0: 5f 63 6f 6e 74 65 6e 74 28 64 62 5f 63 6f 6c 75  _content(db_colu
53d0: 6d 6e 5f 69 6e 74 28 26 71 2c 30 29 29 3b 0a 20  mn_int(&q,0));. 
53e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
53f0: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29   db_finalize(&q)
5400: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
5410: 72 6e 63 6d 70 28 7a 53 75 62 63 6d 64 2c 20 22  rncmp(zSubcmd, "
5420: 6f 62 6c 69 74 65 72 61 74 65 22 2c 20 6e 29 3d  obliterate", n)=
5430: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
5440: 0a 20 20 20 20 69 6e 74 20 62 46 6f 72 63 65 20  .    int bForce 
5450: 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 66  = find_option("f
5460: 6f 72 63 65 22 2c 22 66 22 2c 30 29 21 3d 30 3b  orce","f",0)!=0;
5470: 0a 20 20 20 20 69 66 28 20 67 2e 61 72 67 63 3c  .    if( g.argc<
5480: 34 20 29 20 75 73 61 67 65 28 22 6f 62 6c 69 74  4 ) usage("oblit
5490: 65 72 61 74 65 20 49 44 2e 2e 2e 22 29 3b 0a 20  erate ID...");. 
54a0: 20 20 20 69 66 28 20 21 62 46 6f 72 63 65 20 29     if( !bForce )
54b0: 7b 0a 20 20 20 20 20 20 42 6c 6f 62 20 61 6e 73  {.      Blob ans
54c0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 52 65  ;.      char cRe
54d0: 70 6c 79 3b 0a 20 20 20 20 20 20 70 72 6f 6d 70  ply;.      promp
54e0: 74 5f 75 73 65 72 28 0a 20 20 20 20 20 20 20 20  t_user(.        
54f0: 20 22 4f 62 6c 69 74 65 72 61 74 69 6e 67 20 74   "Obliterating t
5500: 68 65 20 67 72 61 76 65 79 61 72 64 20 77 69 6c  he graveyard wil
5510: 6c 20 70 65 72 6d 61 6e 65 6e 74 6c 79 20 64 65  l permanently de
5520: 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  lete information
5530: 2e 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 43  .\n".         "C
5540: 68 61 6e 67 65 73 20 63 61 6e 6e 6f 74 20 62 65  hanges cannot be
5550: 20 75 6e 64 6f 6e 65 2e 20 20 43 6f 6e 74 69 6e   undone.  Contin
5560: 75 65 20 28 79 2f 4e 29 3f 20 22 2c 20 26 61 6e  ue (y/N)? ", &an
5570: 73 29 3b 0a 20 20 20 20 20 20 63 52 65 70 6c 79  s);.      cReply
5580: 20 3d 20 62 6c 6f 62 5f 73 74 72 28 26 61 6e 73   = blob_str(&ans
5590: 29 5b 30 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  )[0];.      if( 
55a0: 63 52 65 70 6c 79 21 3d 27 79 27 20 26 26 20 63  cReply!='y' && c
55b0: 52 65 70 6c 79 21 3d 27 59 27 20 29 7b 0a 20 20  Reply!='Y' ){.  
55c0: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 65 78 69        fossil_exi
55d0: 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t(1);.      }.  
55e0: 20 20 7d 0a 20 20 20 20 64 62 5f 62 65 67 69 6e    }.    db_begin
55f0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a  _transaction();.
5600: 20 20 20 20 66 6f 72 28 69 3d 33 3b 20 69 3c 67      for(i=3; i<g
5610: 2e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  .argc; i++){.   
5620: 20 20 20 69 6e 74 20 70 65 69 64 20 3d 20 61 74     int peid = at
5630: 6f 69 28 67 2e 61 72 67 76 5b 69 5d 29 3b 0a 20  oi(g.argv[i]);. 
5640: 20 20 20 20 20 69 66 28 20 21 64 62 5f 65 78 69       if( !db_exi
5650: 73 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52  sts("SELECT 1 FR
5660: 4f 4d 20 70 75 72 67 65 65 76 65 6e 74 20 57 48  OM purgeevent WH
5670: 45 52 45 20 70 65 69 64 3d 25 64 22 2c 70 65 69  ERE peid=%d",pei
5680: 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  d) ){.        fo
5690: 73 73 69 6c 5f 66 61 74 61 6c 28 22 6e 6f 20 73  ssil_fatal("no s
56a0: 75 63 68 20 70 75 72 67 65 20 65 76 65 6e 74 3a  uch purge event:
56b0: 20 25 73 22 2c 20 67 2e 61 72 67 76 5b 69 5d 29   %s", g.argv[i])
56c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
56d0: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20  db_multi_exec(. 
56e0: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
56f0: 52 4f 4d 20 70 75 72 67 65 65 76 65 6e 74 20 57  ROM purgeevent W
5700: 48 45 52 45 20 70 65 69 64 3d 25 64 3b 22 0a 20  HERE peid=%d;". 
5710: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
5720: 52 4f 4d 20 70 75 72 67 65 69 74 65 6d 20 57 48  ROM purgeitem WH
5730: 45 52 45 20 70 65 69 64 3d 25 64 3b 22 2c 0a 20  ERE peid=%d;",. 
5740: 20 20 20 20 20 20 20 70 65 69 64 2c 20 70 65 69         peid, pei
5750: 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  d.      );.    }
5760: 0a 20 20 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e  .    db_end_tran
5770: 73 61 63 74 69 6f 6e 28 30 29 3b 0a 20 20 7d 65  saction(0);.  }e
5780: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
5790: 7a 53 75 62 63 6d 64 2c 20 22 74 69 63 6b 65 74  zSubcmd, "ticket
57a0: 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  s", n)==0 ){.   
57b0: 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 6e   fossil_fatal("n
57c0: 6f 74 20 79 65 74 20 69 6d 70 6c 65 6d 65 6e 74  ot yet implement
57d0: 65 64 2e 2e 2e 2e 22 29 3b 0a 20 20 7d 65 6c 73  ed....");.  }els
57e0: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53  e if( strncmp(zS
57f0: 75 62 63 6d 64 2c 20 22 75 6e 64 6f 22 2c 20 6e  ubcmd, "undo", n
5800: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )==0 ){.    int 
5810: 70 65 69 64 3b 0a 20 20 20 20 69 66 28 20 67 2e  peid;.    if( g.
5820: 61 72 67 63 21 3d 34 20 29 20 75 73 61 67 65 28  argc!=4 ) usage(
5830: 22 75 6e 64 6f 20 49 44 22 29 3b 0a 20 20 20 20  "undo ID");.    
5840: 70 65 69 64 20 3d 20 61 74 6f 69 28 67 2e 61 72  peid = atoi(g.ar
5850: 67 76 5b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[3]);.    if( 
5860: 28 70 75 72 67 65 46 6c 61 67 73 20 26 20 50 55  (purgeFlags & PU
5870: 52 47 45 5f 45 58 50 4c 41 49 4e 5f 4f 4e 4c 59  RGE_EXPLAIN_ONLY
5880: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 62  )==0 ){.      db
5890: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
58a0: 6f 6e 28 29 3b 0a 20 20 20 20 20 20 64 62 5f 6d  on();.      db_m
58b0: 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20  ulti_exec(.     
58c0: 20 20 20 22 43 52 45 41 54 45 20 54 45 4d 50 20     "CREATE TEMP 
58d0: 54 41 42 4c 45 20 69 78 28 22 0a 20 20 20 20 20  TABLE ix(".     
58e0: 20 20 20 22 20 20 70 69 69 64 20 49 4e 54 45 47     "  piid INTEG
58f0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 22  ER PRIMARY KEY,"
5900: 0a 20 20 20 20 20 20 20 20 22 20 20 73 72 63 69  .        "  srci
5910: 64 20 49 4e 54 45 47 45 52 22 0a 20 20 20 20 20  d INTEGER".     
5920: 20 20 20 22 29 3b 22 0a 20 20 20 20 20 20 20 20     ");".        
5930: 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 78  "CREATE INDEX ix
5940: 73 72 63 69 64 20 4f 4e 20 69 78 28 73 72 63 69  srcid ON ix(srci
5950: 64 29 3b 22 0a 20 20 20 20 20 20 20 20 22 49 4e  d);".        "IN
5960: 53 45 52 54 20 49 4e 54 4f 20 69 78 28 70 69 69  SERT INTO ix(pii
5970: 64 2c 73 72 63 69 64 29 20 22 0a 20 20 20 20 20  d,srcid) ".     
5980: 20 20 20 22 20 20 53 45 4c 45 43 54 20 70 69 69     "  SELECT pii
5990: 64 2c 20 63 6f 61 6c 65 73 63 65 28 73 72 63 69  d, coalesce(srci
59a0: 64 2c 30 29 20 46 52 4f 4d 20 70 75 72 67 65 69  d,0) FROM purgei
59b0: 74 65 6d 20 57 48 45 52 45 20 70 65 69 64 3d 25  tem WHERE peid=%
59c0: 64 3b 22 2c 0a 20 20 20 20 20 20 20 20 70 65 69  d;",.        pei
59d0: 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  d.      );.     
59e0: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a   db_multi_exec(.
59f0: 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20          "DELETE 
5a00: 46 52 4f 4d 20 73 68 75 6e 22 0a 20 20 20 20 20  FROM shun".     
5a10: 20 20 20 22 20 57 48 45 52 45 20 75 75 69 64 20     " WHERE uuid 
5a20: 49 4e 20 28 53 45 4c 45 43 54 20 75 75 69 64 20  IN (SELECT uuid 
5a30: 46 52 4f 4d 20 70 75 72 67 65 69 74 65 6d 20 57  FROM purgeitem W
5a40: 48 45 52 45 20 70 65 69 64 3d 25 64 29 3b 22 2c  HERE peid=%d);",
5a50: 0a 20 20 20 20 20 20 20 20 70 65 69 64 0a 20 20  .        peid.  
5a60: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 6d 61 6e      );.      man
5a70: 69 66 65 73 74 5f 63 72 6f 73 73 6c 69 6e 6b 5f  ifest_crosslink_
5a80: 62 65 67 69 6e 28 29 3b 0a 20 20 20 20 20 20 70  begin();.      p
5a90: 75 72 67 65 5f 69 74 65 6d 5f 72 65 73 75 72 72  urge_item_resurr
5aa0: 65 63 74 28 30 2c 20 30 29 3b 0a 20 20 20 20 20  ect(0, 0);.     
5ab0: 20 6d 61 6e 69 66 65 73 74 5f 63 72 6f 73 73 6c   manifest_crossl
5ac0: 69 6e 6b 5f 65 6e 64 28 30 29 3b 0a 20 20 20 20  ink_end(0);.    
5ad0: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
5ae0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 75 72  "DELETE FROM pur
5af0: 67 65 65 76 65 6e 74 20 57 48 45 52 45 20 70 65  geevent WHERE pe
5b00: 69 64 3d 25 64 22 2c 20 70 65 69 64 29 3b 0a 20  id=%d", peid);. 
5b10: 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78       db_multi_ex
5b20: 65 63 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  ec("DELETE FROM 
5b30: 70 75 72 67 65 69 74 65 6d 20 57 48 45 52 45 20  purgeitem WHERE 
5b40: 70 65 69 64 3d 25 64 22 2c 20 70 65 69 64 29 3b  peid=%d", peid);
5b50: 0a 20 20 20 20 20 20 64 62 5f 65 6e 64 5f 74 72  .      db_end_tr
5b60: 61 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a 20 20  ansaction(0);.  
5b70: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
5b80: 73 74 72 6e 63 6d 70 28 7a 53 75 62 63 6d 64 2c  strncmp(zSubcmd,
5b90: 20 22 77 69 6b 69 22 2c 20 6e 29 3d 3d 30 20 29   "wiki", n)==0 )
5ba0: 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74  {.    fossil_fat
5bb0: 61 6c 28 22 6e 6f 74 20 79 65 74 20 69 6d 70 6c  al("not yet impl
5bc0: 65 6d 65 6e 74 65 64 2e 2e 2e 2e 22 29 3b 0a 20  emented....");. 
5bd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 73 73   }else{.    foss
5be0: 69 6c 5f 66 61 74 61 6c 28 22 75 6e 6b 6e 6f 77  il_fatal("unknow
5bf0: 6e 20 73 75 62 63 6f 6d 6d 61 6e 64 20 5c 22 25  n subcommand \"%
5c00: 73 5c 22 2e 5c 6e 22 0a 20 20 20 20 20 20 20 20  s\".\n".        
5c10: 20 20 20 20 20 20 20 20 20 22 73 68 6f 75 6c 64           "should
5c20: 20 62 65 20 6f 6e 65 20 6f 66 3a 20 20 63 61 74   be one of:  cat
5c30: 2c 20 63 68 65 63 6b 69 6e 73 2c 20 66 69 6c 65  , checkins, file
5c40: 73 2c 20 6c 69 73 74 2c 20 6f 62 6c 69 74 65 72  s, list, obliter
5c50: 61 74 65 2c 22 0a 20 20 20 20 20 20 20 20 20 20  ate,".          
5c60: 20 20 20 20 20 20 20 22 20 74 69 63 6b 65 74 73         " tickets
5c70: 2c 20 75 6e 64 6f 2c 20 77 69 6b 69 22 2c 20 7a  , undo, wiki", z
5c80: 53 75 62 63 6d 64 29 3b 0a 20 20 7d 0a 7d 0a     Subcmd);.  }.}.