Hex Artifact Content
Not logged in

Artifact 5979683d08945c596e6cd81781ac8c39a0321000:

File src/merge.c part of check-in [36b96b8616] - Rework the merge algorithm. It now only works for text files. But, it no longer gets confused by line endings (\r\n versus \n) and it reports conflicts. by drh on 2007-11-16 20:42:31. Also file src/merge.c part of check-in [d0305b305a] - Merged mainline into my branch to get the newest application. by aku on 2007-12-05 08:07:46.

0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68  (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76  lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c  ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65  ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73  s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20  tributed in the 
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c  hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20  l be useful,.** 
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20  but WITHOUT ANY 
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75  WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69  t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a  ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52  Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55   A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20  RPOSE.  See the 
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50  GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f  ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a  r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c  ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  d have received 
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e  a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e  .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72  g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69  ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65  te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20  ation, Inc., 59 
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53  Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73  uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31  ton, MA  02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20  307, USA..**.** 
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69  Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20  nformation:.**  
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a   drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68  *   http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a  waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  .**.** This file
0370: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75   contains code u
0380: 73 65 64 20 74 6f 20 6d 65 72 67 65 20 74 77 6f  sed to merge two
0390: 20 6f 72 20 6d 6f 72 65 20 62 72 61 6e 63 68 65   or more branche
03a0: 73 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  s into.** a sing
03b0: 6c 65 20 74 72 65 65 2e 0a 2a 2f 0a 23 69 6e 63  le tree..*/.#inc
03c0: 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e 68 22 0a  lude "config.h".
03d0: 23 69 6e 63 6c 75 64 65 20 22 6d 65 72 67 65 2e  #include "merge.
03e0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73  h".#include <ass
03f0: 65 72 74 2e 68 3e 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ert.h>.../*.** C
0400: 4f 4d 4d 41 4e 44 3a 20 6d 65 72 67 65 0a 2a 2a  OMMAND: merge.**
0410: 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 73  .** Usage: %foss
0420: 69 6c 20 6d 65 72 67 65 20 56 45 52 53 49 4f 4e  il merge VERSION
0430: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  .**.** The argum
0440: 65 6e 74 20 69 73 20 61 20 76 65 72 73 69 6f 6e  ent is a version
0450: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
0460: 6d 65 72 67 65 64 20 69 6e 74 6f 20 74 68 65 20  merged into the 
0470: 63 75 72 72 65 6e 74 0a 2a 2a 20 63 68 65 63 6b  current.** check
0480: 6f 75 74 2e 20 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  out. .**.** Only
0490: 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 20 69 73   file content is
04a0: 20 6d 65 72 67 65 64 2e 20 20 54 68 65 20 72 65   merged.  The re
04b0: 73 75 6c 74 20 63 6f 6e 74 69 6e 75 65 73 20 74  sult continues t
04c0: 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 66 69 6c  o use the.** fil
04d0: 65 20 61 6e 64 20 64 69 72 65 63 74 6f 72 79 20  e and directory 
04e0: 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 63  names from the c
04f0: 75 72 72 65 6e 74 20 63 68 65 63 6b 2d 6f 75 74  urrent check-out
0500: 20 65 76 65 6e 20 69 66 20 74 68 6f 73 65 0a 2a   even if those.*
0510: 2a 20 6e 61 6d 65 73 20 6d 69 67 68 74 20 68 61  * names might ha
0520: 76 65 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20  ve been changed 
0530: 69 6e 20 74 68 65 20 62 72 61 6e 63 68 20 62 65  in the branch be
0540: 69 6e 67 20 6d 65 72 67 65 64 20 69 6e 2e 0a 2a  ing merged in..*
0550: 2f 0a 76 6f 69 64 20 6d 65 72 67 65 5f 63 6d 64  /.void merge_cmd
0560: 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 76 69  (void){.  int vi
0570: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
0580: 2f 2a 20 43 75 72 72 65 6e 74 20 76 65 72 73 69  /* Current versi
0590: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 64 3b  on */.  int mid;
05a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
05b0: 20 56 65 72 73 69 6f 6e 20 77 65 20 61 72 65 20   Version we are 
05c0: 6d 65 72 67 69 6e 67 20 61 67 61 69 6e 73 74 20  merging against 
05d0: 2a 2f 0a 20 20 69 6e 74 20 70 69 64 3b 20 20 20  */.  int pid;   
05e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
05f0: 65 20 70 69 76 6f 74 20 76 65 72 73 69 6f 6e 20  e pivot version 
0600: 2d 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f  - most recent co
0610: 6d 6d 6f 6e 20 61 6e 63 65 73 74 6f 72 20 2a 2f  mmon ancestor */
0620: 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 69 6e 74  .  Stmt q;.  int
0630: 20 64 65 74 61 69 6c 46 6c 61 67 3b 0a 0a 20 20   detailFlag;..  
0640: 64 65 74 61 69 6c 46 6c 61 67 20 3d 20 66 69 6e  detailFlag = fin
0650: 64 5f 6f 70 74 69 6f 6e 28 22 64 65 74 61 69 6c  d_option("detail
0660: 22 2c 30 2c 30 29 21 3d 30 3b 0a 20 20 69 66 28  ",0,0)!=0;.  if(
0670: 20 67 2e 61 72 67 63 21 3d 33 20 29 7b 0a 20 20   g.argc!=3 ){.  
0680: 20 20 75 73 61 67 65 28 22 56 45 52 53 49 4f 4e    usage("VERSION
0690: 22 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 6d 75 73  ");.  }.  db_mus
06a0: 74 5f 62 65 5f 77 69 74 68 69 6e 5f 74 72 65 65  t_be_within_tree
06b0: 28 29 3b 0a 20 20 76 69 64 20 3d 20 64 62 5f 6c  ();.  vid = db_l
06c0: 67 65 74 5f 69 6e 74 28 22 63 68 65 63 6b 6f 75  get_int("checkou
06d0: 74 22 2c 20 30 29 3b 0a 20 20 69 66 28 20 76 69  t", 0);.  if( vi
06e0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 73 73  d==0 ){.    foss
06f0: 69 6c 5f 70 61 6e 69 63 28 22 6e 6f 74 68 69 6e  il_panic("nothin
0700: 67 20 69 73 20 63 68 65 63 6b 65 64 20 6f 75 74  g is checked out
0710: 22 29 3b 0a 20 20 7d 0a 20 20 6d 69 64 20 3d 20  ");.  }.  mid = 
0720: 6e 61 6d 65 5f 74 6f 5f 72 69 64 28 67 2e 61 72  name_to_rid(g.ar
0730: 67 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 6d 69  gv[2]);.  if( mi
0740: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 73 73  d==0 ){.    foss
0750: 69 6c 5f 70 61 6e 69 63 28 22 6e 6f 74 20 61 20  il_panic("not a 
0760: 76 65 72 73 69 6f 6e 3a 20 25 73 22 2c 20 67 2e  version: %s", g.
0770: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20  argv[2]);.  }.  
0780: 69 66 28 20 6d 69 64 3e 31 20 26 26 20 21 64 62  if( mid>1 && !db
0790: 5f 65 78 69 73 74 73 28 22 53 45 4c 45 43 54 20  _exists("SELECT 
07a0: 31 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45  1 FROM plink WHE
07b0: 52 45 20 63 69 64 3d 25 64 22 2c 20 6d 69 64 29  RE cid=%d", mid)
07c0: 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70   ){.    fossil_p
07d0: 61 6e 69 63 28 22 6e 6f 74 20 61 20 76 65 72 73  anic("not a vers
07e0: 69 6f 6e 3a 20 25 73 22 2c 20 67 2e 61 72 67 76  ion: %s", g.argv
07f0: 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 70 69 76 6f  [2]);.  }.  pivo
0800: 74 5f 73 65 74 5f 70 72 69 6d 61 72 79 28 6d 69  t_set_primary(mi
0810: 64 29 3b 0a 20 20 70 69 76 6f 74 5f 73 65 74 5f  d);.  pivot_set_
0820: 73 65 63 6f 6e 64 61 72 79 28 76 69 64 29 3b 0a  secondary(vid);.
0830: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c    db_prepare(&q,
0840: 20 22 53 45 4c 45 43 54 20 6d 65 72 67 65 20 46   "SELECT merge F
0850: 52 4f 4d 20 76 6d 65 72 67 65 20 57 48 45 52 45  ROM vmerge WHERE
0860: 20 69 64 3d 30 22 29 3b 0a 20 20 77 68 69 6c 65   id=0");.  while
0870: 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53  ( db_step(&q)==S
0880: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
0890: 20 70 69 76 6f 74 5f 73 65 74 5f 73 65 63 6f 6e   pivot_set_secon
08a0: 64 61 72 79 28 64 62 5f 63 6f 6c 75 6d 6e 5f 69  dary(db_column_i
08b0: 6e 74 28 26 71 2c 30 29 29 3b 0a 20 20 7d 0a 20  nt(&q,0));.  }. 
08c0: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29   db_finalize(&q)
08d0: 3b 0a 20 20 70 69 64 20 3d 20 70 69 76 6f 74 5f  ;.  pid = pivot_
08e0: 66 69 6e 64 28 29 3b 0a 20 20 69 66 28 20 70 69  find();.  if( pi
08f0: 64 3c 3d 30 20 29 7b 0a 20 20 20 20 66 6f 73 73  d<=0 ){.    foss
0900: 69 6c 5f 70 61 6e 69 63 28 22 63 61 6e 6e 6f 74  il_panic("cannot
0910: 20 66 69 6e 64 20 61 20 63 6f 6d 6d 6f 6e 20 61   find a common a
0920: 6e 63 65 73 74 6f 72 20 62 65 74 77 65 65 6e 20  ncestor between 
0930: 74 68 65 20 63 75 72 72 65 6e 74 22 0a 20 20 20  the current".   
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
0950: 68 65 63 6b 6f 75 74 20 61 6e 64 20 25 73 22 2c  heckout and %s",
0960: 20 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 7d   g.argv[2]);.  }
0970: 0a 20 20 69 66 28 20 70 69 64 3e 31 20 26 26 20  .  if( pid>1 && 
0980: 21 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45  !db_exists("SELE
0990: 43 54 20 31 20 46 52 4f 4d 20 70 6c 69 6e 6b 20  CT 1 FROM plink 
09a0: 57 48 45 52 45 20 63 69 64 3d 25 64 22 2c 20 70  WHERE cid=%d", p
09b0: 69 64 29 20 29 7b 0a 20 20 20 20 66 6f 73 73 69  id) ){.    fossi
09c0: 6c 5f 70 61 6e 69 63 28 22 6e 6f 74 20 61 20 76  l_panic("not a v
09d0: 65 72 73 69 6f 6e 3a 20 72 65 63 6f 72 64 20 23  ersion: record #
09e0: 25 64 22 2c 20 6d 69 64 29 3b 0a 20 20 7d 0a 20  %d", mid);.  }. 
09f0: 20 76 66 69 6c 65 5f 63 68 65 63 6b 5f 73 69 67   vfile_check_sig
0a00: 6e 61 74 75 72 65 28 76 69 64 29 3b 0a 20 20 64  nature(vid);.  d
0a10: 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  b_begin_transact
0a20: 69 6f 6e 28 29 3b 0a 20 20 75 6e 64 6f 5f 62 65  ion();.  undo_be
0a30: 67 69 6e 28 29 3b 0a 20 20 6c 6f 61 64 5f 76 66  gin();.  load_vf
0a40: 69 6c 65 5f 66 72 6f 6d 5f 72 69 64 28 6d 69 64  ile_from_rid(mid
0a50: 29 3b 0a 20 20 6c 6f 61 64 5f 76 66 69 6c 65 5f  );.  load_vfile_
0a60: 66 72 6f 6d 5f 72 69 64 28 70 69 64 29 3b 0a 0a  from_rid(pid);..
0a70: 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 76 66    /*.  ** The vf
0a80: 69 6c 65 2e 70 61 74 68 6e 61 6d 65 20 66 69 65  ile.pathname fie
0a90: 6c 64 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  ld is used to ma
0aa0: 74 63 68 20 66 69 6c 65 73 20 61 67 61 69 6e 73  tch files agains
0ab0: 74 20 65 61 63 68 20 6f 74 68 65 72 2e 20 20 54  t each other.  T
0ac0: 68 65 0a 20 20 2a 2a 20 46 56 20 74 61 62 6c 65  he.  ** FV table
0ad0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 72 6f   contains one ro
0ae0: 77 20 66 6f 72 20 65 61 63 68 20 65 61 63 68 20  w for each each 
0af0: 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 20  unique filename 
0b00: 69 6e 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 63  in.  ** in the c
0b10: 75 72 72 65 6e 74 20 63 68 65 63 6b 6f 75 74 2c  urrent checkout,
0b20: 20 74 68 65 20 70 69 76 6f 74 2c 20 61 6e 64 20   the pivot, and 
0b30: 74 68 65 20 76 65 72 73 69 6f 6e 20 62 65 69 6e  the version bein
0b40: 67 20 6d 65 72 67 65 64 2e 0a 20 20 2a 2f 0a 20  g merged..  */. 
0b50: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a   db_multi_exec(.
0b60: 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20      "DROP TABLE 
0b70: 49 46 20 45 58 49 53 54 53 20 66 76 3b 22 0a 20  IF EXISTS fv;". 
0b80: 20 20 20 22 43 52 45 41 54 45 20 54 45 4d 50 20     "CREATE TEMP 
0b90: 54 41 42 4c 45 20 66 76 28 22 0a 20 20 20 20 22  TABLE fv(".    "
0ba0: 20 20 66 6e 20 54 45 58 54 20 50 52 49 4d 41 52    fn TEXT PRIMAR
0bb0: 59 20 4b 45 59 2c 22 20 20 20 20 20 20 2f 2a 20  Y KEY,"      /* 
0bc0: 54 68 65 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a  The filename */.
0bd0: 20 20 20 20 22 20 20 69 64 76 20 49 4e 54 45 47      "  idv INTEG
0be0: 45 52 2c 22 20 20 20 20 20 20 20 20 20 20 20 20  ER,"            
0bf0: 20 20 2f 2a 20 56 46 49 4c 45 20 65 6e 74 72 79    /* VFILE entry
0c00: 20 66 6f 72 20 63 75 72 72 65 6e 74 20 76 65 72   for current ver
0c10: 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 22 20 20 69  sion */.    "  i
0c20: 64 70 20 49 4e 54 45 47 45 52 2c 22 20 20 20 20  dp INTEGER,"    
0c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 49            /* VFI
0c40: 4c 45 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  LE entry for the
0c50: 20 70 69 76 6f 74 20 2a 2f 0a 20 20 20 20 22 20   pivot */.    " 
0c60: 20 69 64 6d 20 49 4e 54 45 47 45 52 2c 22 20 20   idm INTEGER,"  
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
0c80: 46 49 4c 45 20 65 6e 74 72 79 20 66 6f 72 20 76  FILE entry for v
0c90: 65 72 73 69 6f 6e 20 6d 65 72 67 69 6e 67 20 69  ersion merging i
0ca0: 6e 20 2a 2f 0a 20 20 20 20 22 20 20 63 68 6e 67  n */.    "  chng
0cb0: 65 64 20 42 4f 4f 4c 45 41 4e 2c 22 20 20 20 20  ed BOOLEAN,"    
0cc0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
0cd0: 66 20 63 75 72 72 65 6e 74 20 76 65 72 73 69 6f  f current versio
0ce0: 6e 20 68 61 73 20 62 65 65 6e 20 65 64 69 74 65  n has been edite
0cf0: 64 20 2a 2f 0a 20 20 20 20 22 20 20 72 69 64 76  d */.    "  ridv
0d00: 20 49 4e 54 45 47 45 52 2c 22 20 20 20 20 20 20   INTEGER,"      
0d10: 20 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64         /* Record
0d20: 20 49 44 20 66 6f 72 20 63 75 72 72 65 6e 74 20   ID for current 
0d30: 76 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 22  version */.    "
0d40: 20 20 72 69 64 70 20 49 4e 54 45 47 45 52 2c 22    ridp INTEGER,"
0d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0d60: 52 65 63 6f 72 64 20 49 44 20 66 6f 72 20 70 69  Record ID for pi
0d70: 76 6f 74 20 2a 2f 0a 20 20 20 20 22 20 20 72 69  vot */.    "  ri
0d80: 64 6d 20 49 4e 54 45 47 45 52 22 20 20 20 20 20  dm INTEGER"     
0d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63 6f           /* Reco
0da0: 72 64 20 49 44 20 66 6f 72 20 6d 65 72 67 65 20  rd ID for merge 
0db0: 2a 2f 0a 20 20 20 20 22 29 3b 22 0a 20 20 20 20  */.    ");".    
0dc0: 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52  "INSERT OR IGNOR
0dd0: 45 20 49 4e 54 4f 20 66 76 22 0a 20 20 20 20 22  E INTO fv".    "
0de0: 20 53 45 4c 45 43 54 20 70 61 74 68 6e 61 6d 65   SELECT pathname
0df0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0e00: 20 30 2c 20 30 20 46 52 4f 4d 20 76 66 69 6c 65   0, 0 FROM vfile
0e10: 22 0a 20 20 29 3b 0a 20 20 64 62 5f 70 72 65 70  ".  );.  db_prep
0e20: 61 72 65 28 26 71 2c 0a 20 20 20 20 22 53 45 4c  are(&q,.    "SEL
0e30: 45 43 54 20 69 64 2c 20 70 61 74 68 6e 61 6d 65  ECT id, pathname
0e40: 2c 20 72 69 64 20 46 52 4f 4d 20 76 66 69 6c 65  , rid FROM vfile
0e50: 22 0a 20 20 20 20 22 20 57 48 45 52 45 20 76 69  ".    " WHERE vi
0e60: 64 3d 25 64 22 2c 20 70 69 64 0a 20 20 29 3b 0a  d=%d", pid.  );.
0e70: 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70    while( db_step
0e80: 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  (&q)==SQLITE_ROW
0e90: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 20 3d   ){.    int id =
0ea0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26   db_column_int(&
0eb0: 71 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74  q, 0);.    const
0ec0: 20 63 68 61 72 20 2a 66 6e 20 3d 20 64 62 5f 63   char *fn = db_c
0ed0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31  olumn_text(&q, 1
0ee0: 29 3b 0a 20 20 20 20 69 6e 74 20 72 69 64 20 3d  );.    int rid =
0ef0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26   db_column_int(&
0f00: 71 2c 20 32 29 3b 0a 20 20 20 20 64 62 5f 6d 75  q, 2);.    db_mu
0f10: 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20 20  lti_exec(.      
0f20: 22 55 50 44 41 54 45 20 66 76 20 53 45 54 20 69  "UPDATE fv SET i
0f30: 64 70 3d 25 64 2c 20 72 69 64 70 3d 25 64 20 57  dp=%d, ridp=%d W
0f40: 48 45 52 45 20 66 6e 3d 25 51 22 2c 0a 20 20 20  HERE fn=%Q",.   
0f50: 20 20 20 69 64 2c 20 72 69 64 2c 20 66 6e 0a 20     id, rid, fn. 
0f60: 20 20 20 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66     );.  }.  db_f
0f70: 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 64  inalize(&q);.  d
0f80: 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20  b_prepare(&q,.  
0f90: 20 20 22 53 45 4c 45 43 54 20 69 64 2c 20 70 61    "SELECT id, pa
0fa0: 74 68 6e 61 6d 65 2c 20 72 69 64 20 46 52 4f 4d  thname, rid FROM
0fb0: 20 76 66 69 6c 65 22 0a 20 20 20 20 22 20 57 48   vfile".    " WH
0fc0: 45 52 45 20 76 69 64 3d 25 64 22 2c 20 6d 69 64  ERE vid=%d", mid
0fd0: 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 64  .  );.  while( d
0fe0: 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49  b_step(&q)==SQLI
0ff0: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e  TE_ROW ){.    in
1000: 74 20 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  t id = db_column
1010: 5f 69 6e 74 28 26 71 2c 20 30 29 3b 0a 20 20 20  _int(&q, 0);.   
1020: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6e 20   const char *fn 
1030: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
1040: 28 26 71 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74  (&q, 1);.    int
1050: 20 72 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e   rid = db_column
1060: 5f 69 6e 74 28 26 71 2c 20 32 29 3b 0a 20 20 20  _int(&q, 2);.   
1070: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a   db_multi_exec(.
1080: 20 20 20 20 20 20 22 55 50 44 41 54 45 20 66 76        "UPDATE fv
1090: 20 53 45 54 20 69 64 6d 3d 25 64 2c 20 72 69 64   SET idm=%d, rid
10a0: 6d 3d 25 64 20 57 48 45 52 45 20 66 6e 3d 25 51  m=%d WHERE fn=%Q
10b0: 22 2c 0a 20 20 20 20 20 20 69 64 2c 20 72 69 64  ",.      id, rid
10c0: 2c 20 66 6e 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  , fn.    );.  }.
10d0: 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71    db_finalize(&q
10e0: 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28  );.  db_prepare(
10f0: 26 71 2c 0a 20 20 20 20 22 53 45 4c 45 43 54 20  &q,.    "SELECT 
1100: 69 64 2c 20 70 61 74 68 6e 61 6d 65 2c 20 72 69  id, pathname, ri
1110: 64 2c 20 63 68 6e 67 65 64 20 46 52 4f 4d 20 76  d, chnged FROM v
1120: 66 69 6c 65 22 0a 20 20 20 20 22 20 57 48 45 52  file".    " WHER
1130: 45 20 76 69 64 3d 25 64 22 2c 20 76 69 64 0a 20  E vid=%d", vid. 
1140: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f   );.  while( db_
1150: 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45  step(&q)==SQLITE
1160: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20  _ROW ){.    int 
1170: 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69  id = db_column_i
1180: 6e 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 63  nt(&q, 0);.    c
1190: 6f 6e 73 74 20 63 68 61 72 20 2a 66 6e 20 3d 20  onst char *fn = 
11a0: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
11b0: 71 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 72  q, 1);.    int r
11c0: 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69  id = db_column_i
11d0: 6e 74 28 26 71 2c 20 32 29 3b 0a 20 20 20 20 69  nt(&q, 2);.    i
11e0: 6e 74 20 63 68 6e 67 65 64 20 3d 20 64 62 5f 63  nt chnged = db_c
11f0: 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 33 29  olumn_int(&q, 3)
1200: 3b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65  ;.    db_multi_e
1210: 78 65 63 28 0a 20 20 20 20 20 20 22 55 50 44 41  xec(.      "UPDA
1220: 54 45 20 66 76 20 53 45 54 20 69 64 76 3d 25 64  TE fv SET idv=%d
1230: 2c 20 72 69 64 76 3d 25 64 2c 20 63 68 6e 67 65  , ridv=%d, chnge
1240: 64 3d 25 64 20 57 48 45 52 45 20 66 6e 3d 25 51  d=%d WHERE fn=%Q
1250: 22 2c 0a 20 20 20 20 20 20 69 64 2c 20 72 69 64  ",.      id, rid
1260: 2c 20 63 68 6e 67 65 64 2c 20 66 6e 0a 20 20 20  , chnged, fn.   
1270: 20 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e   );.  }.  db_fin
1280: 61 6c 69 7a 65 28 26 71 29 3b 0a 0a 20 20 2f 2a  alize(&q);..  /*
1290: 0a 20 20 2a 2a 20 46 69 6e 64 20 66 69 6c 65 73  .  ** Find files
12a0: 20 69 6e 20 6d 69 64 20 61 6e 64 20 76 69 64 20   in mid and vid 
12b0: 62 75 74 20 6e 6f 74 20 69 6e 20 70 69 64 20 61  but not in pid a
12c0: 6e 64 20 72 65 70 6f 72 74 20 63 6f 6e 66 6c 69  nd report confli
12d0: 63 74 73 2e 0a 20 20 2a 2a 20 54 68 65 20 66 69  cts..  ** The fi
12e0: 6c 65 20 69 6e 20 6d 69 64 20 77 69 6c 6c 20 62  le in mid will b
12f0: 65 20 69 67 6e 6f 72 65 64 2e 20 20 49 74 20 77  e ignored.  It w
1300: 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64 20 61  ill be treated a
1310: 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 64 6f 65  s if it.  ** doe
1320: 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 2a  s not exist..  *
1330: 2f 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26  /.  db_prepare(&
1340: 71 2c 0a 20 20 20 20 22 53 45 4c 45 43 54 20 69  q,.    "SELECT i
1350: 64 6d 20 46 52 4f 4d 20 66 76 20 57 48 45 52 45  dm FROM fv WHERE
1360: 20 69 64 70 3d 30 20 41 4e 44 20 69 64 76 3e 30   idp=0 AND idv>0
1370: 20 41 4e 44 20 69 64 6d 3e 30 22 0a 20 20 29 3b   AND idm>0".  );
1380: 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65  .  while( db_ste
1390: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
13a0: 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 6d  W ){.    int idm
13b0: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   = db_column_int
13c0: 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 63 68 61  (&q, 0);.    cha
13d0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 64 62 5f 74 65  r *zName = db_te
13e0: 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 70 61  xt(0, "SELECT pa
13f0: 74 68 6e 61 6d 65 20 46 52 4f 4d 20 76 66 69 6c  thname FROM vfil
1400: 65 20 57 48 45 52 45 20 69 64 3d 25 64 22 2c 20  e WHERE id=%d", 
1410: 69 64 6d 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  idm);.    printf
1420: 28 22 57 41 52 4e 49 4e 47 3a 20 63 6f 6e 66 6c  ("WARNING: confl
1430: 69 63 74 20 6f 6e 20 25 73 5c 6e 22 2c 20 7a 4e  ict on %s\n", zN
1440: 61 6d 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  ame);.    free(z
1450: 4e 61 6d 65 29 3b 0a 20 20 20 20 64 62 5f 6d 75  Name);.    db_mu
1460: 6c 74 69 5f 65 78 65 63 28 22 55 50 44 41 54 45  lti_exec("UPDATE
1470: 20 66 76 20 53 45 54 20 69 64 6d 3d 30 20 57 48   fv SET idm=0 WH
1480: 45 52 45 20 69 64 6d 3d 25 64 22 2c 20 69 64 6d  ERE idm=%d", idm
1490: 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61  );.  }.  db_fina
14a0: 6c 69 7a 65 28 26 71 29 3b 0a 0a 20 20 2f 2a 0a  lize(&q);..  /*.
14b0: 20 20 2a 2a 20 41 64 64 20 74 6f 20 76 69 64 20    ** Add to vid 
14c0: 66 69 6c 65 73 20 74 68 61 74 20 61 72 65 20 6e  files that are n
14d0: 6f 74 20 69 6e 20 70 69 64 20 62 75 74 20 61 72  ot in pid but ar
14e0: 65 20 69 6e 20 6d 69 64 0a 20 20 2a 2f 0a 20 20  e in mid.  */.  
14f0: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 0a  db_prepare(&q, .
1500: 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 6d 2c      "SELECT idm,
1510: 20 72 6f 77 69 64 2c 20 66 6e 20 46 52 4f 4d 20   rowid, fn FROM 
1520: 66 76 20 57 48 45 52 45 20 69 64 70 3d 30 20 41  fv WHERE idp=0 A
1530: 4e 44 20 69 64 76 3d 30 20 41 4e 44 20 69 64 6d  ND idv=0 AND idm
1540: 3e 30 22 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65  >0".  );.  while
1550: 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53  ( db_step(&q)==S
1560: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
1570: 20 69 6e 74 20 69 64 6d 20 3d 20 64 62 5f 63 6f   int idm = db_co
1580: 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 30 29 3b  lumn_int(&q, 0);
1590: 0a 20 20 20 20 69 6e 74 20 72 6f 77 69 64 20 3d  .    int rowid =
15a0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26   db_column_int(&
15b0: 71 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 69  q, 1);.    int i
15c0: 64 76 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  dv;.    const ch
15d0: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 64  ar *zName;.    d
15e0: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20  b_multi_exec(.  
15f0: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
1600: 20 76 66 69 6c 65 28 76 69 64 2c 63 68 6e 67 65   vfile(vid,chnge
1610: 64 2c 64 65 6c 65 74 65 64 2c 72 69 64 2c 6d 72  d,deleted,rid,mr
1620: 69 64 2c 70 61 74 68 6e 61 6d 65 29 22 0a 20 20  id,pathname)".  
1630: 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 25 64      "  SELECT %d
1640: 2c 33 2c 30 2c 72 69 64 2c 6d 72 69 64 2c 70 61  ,3,0,rid,mrid,pa
1650: 74 68 6e 61 6d 65 20 46 52 4f 4d 20 76 66 69 6c  thname FROM vfil
1660: 65 20 57 48 45 52 45 20 69 64 3d 25 64 22 2c 0a  e WHERE id=%d",.
1670: 20 20 20 20 20 20 76 69 64 2c 20 69 64 6d 0a 20        vid, idm. 
1680: 20 20 20 29 3b 0a 20 20 20 20 69 64 76 20 3d 20     );.    idv = 
1690: 64 62 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  db_last_insert_r
16a0: 6f 77 69 64 28 29 3b 0a 20 20 20 20 64 62 5f 6d  owid();.    db_m
16b0: 75 6c 74 69 5f 65 78 65 63 28 22 55 50 44 41 54  ulti_exec("UPDAT
16c0: 45 20 66 76 20 53 45 54 20 69 64 76 3d 25 64 20  E fv SET idv=%d 
16d0: 57 48 45 52 45 20 72 6f 77 69 64 3d 25 64 22 2c  WHERE rowid=%d",
16e0: 20 69 64 76 2c 20 72 6f 77 69 64 29 3b 0a 20 20   idv, rowid);.  
16f0: 20 20 7a 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c    zName = db_col
1700: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32 29 3b  umn_text(&q, 2);
1710: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 41 44 44  .    printf("ADD
1720: 45 44 20 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 29  ED %s\n", zName)
1730: 3b 0a 20 20 20 20 75 6e 64 6f 5f 73 61 76 65 28  ;.    undo_save(
1740: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 76 66 69 6c  zName);.    vfil
1750: 65 5f 74 6f 5f 64 69 73 6b 28 30 2c 20 69 64 6d  e_to_disk(0, idm
1760: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66  , 0);.  }.  db_f
1770: 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 0a  inalize(&q);.  .
1780: 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 66    /*.  ** Find f
1790: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 63  iles that have c
17a0: 68 61 6e 67 65 64 20 66 72 6f 6d 20 70 69 64 2d  hanged from pid-
17b0: 3e 6d 69 64 20 62 75 74 20 6e 6f 74 20 70 69 64  >mid but not pid
17c0: 2d 3e 76 69 64 2e 20 0a 20 20 2a 2a 20 43 6f 70  ->vid. .  ** Cop
17d0: 79 20 74 68 65 20 6d 69 64 20 63 6f 6e 74 65 6e  y the mid conten
17e0: 74 20 6f 76 65 72 20 69 6e 74 6f 20 76 69 64 2e  t over into vid.
17f0: 0a 20 20 2a 2f 0a 20 20 64 62 5f 70 72 65 70 61  .  */.  db_prepa
1800: 72 65 28 26 71 2c 0a 20 20 20 20 22 53 45 4c 45  re(&q,.    "SELE
1810: 43 54 20 69 64 76 2c 20 72 69 64 6d 20 46 52 4f  CT idv, ridm FRO
1820: 4d 20 66 76 22 0a 20 20 20 20 22 20 57 48 45 52  M fv".    " WHER
1830: 45 20 69 64 70 3e 30 20 41 4e 44 20 69 64 76 3e  E idp>0 AND idv>
1840: 30 20 41 4e 44 20 69 64 6d 3e 30 22 0a 20 20 20  0 AND idm>0".   
1850: 20 22 20 20 20 41 4e 44 20 72 69 64 6d 21 3d 72   "   AND ridm!=r
1860: 69 64 70 20 41 4e 44 20 72 69 64 76 3d 72 69 64  idp AND ridv=rid
1870: 70 20 41 4e 44 20 4e 4f 54 20 63 68 6e 67 65 64  p AND NOT chnged
1880: 22 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  ".  );.  while( 
1890: 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c  db_step(&q)==SQL
18a0: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69  ITE_ROW ){.    i
18b0: 6e 74 20 69 64 76 20 3d 20 64 62 5f 63 6f 6c 75  nt idv = db_colu
18c0: 6d 6e 5f 69 6e 74 28 26 71 2c 20 30 29 3b 0a 20  mn_int(&q, 0);. 
18d0: 20 20 20 69 6e 74 20 72 69 64 6d 20 3d 20 64 62     int ridm = db
18e0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20  _column_int(&q, 
18f0: 31 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  1);.    char *zN
1900: 61 6d 65 20 3d 20 64 62 5f 74 65 78 74 28 30 2c  ame = db_text(0,
1910: 20 22 53 45 4c 45 43 54 20 70 61 74 68 6e 61 6d   "SELECT pathnam
1920: 65 20 46 52 4f 4d 20 76 66 69 6c 65 20 57 48 45  e FROM vfile WHE
1930: 52 45 20 69 64 3d 25 64 22 2c 20 69 64 76 29 3b  RE id=%d", idv);
1940: 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 63 6f 6e  .    /* Copy con
1950: 74 65 6e 74 20 66 72 6f 6d 20 69 64 6d 20 6f 76  tent from idm ov
1960: 65 72 20 69 6e 74 6f 20 69 64 76 2e 20 20 4f 76  er into idv.  Ov
1970: 65 72 77 72 69 74 65 20 69 64 76 2e 20 2a 2f 0a  erwrite idv. */.
1980: 20 20 20 20 70 72 69 6e 74 66 28 22 55 50 44 41      printf("UPDA
1990: 54 45 20 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 29  TE %s\n", zName)
19a0: 3b 0a 20 20 20 20 75 6e 64 6f 5f 73 61 76 65 28  ;.    undo_save(
19b0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 64 62 5f 6d  zName);.    db_m
19c0: 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20  ulti_exec(.     
19d0: 20 22 55 50 44 41 54 45 20 76 66 69 6c 65 20 53   "UPDATE vfile S
19e0: 45 54 20 6d 72 69 64 3d 25 64 2c 20 63 68 6e 67  ET mrid=%d, chng
19f0: 65 64 3d 32 20 57 48 45 52 45 20 69 64 3d 25 64  ed=2 WHERE id=%d
1a00: 22 2c 20 72 69 64 6d 2c 20 69 64 76 0a 20 20 20  ", ridm, idv.   
1a10: 20 29 3b 0a 20 20 20 20 76 66 69 6c 65 5f 74 6f   );.    vfile_to
1a20: 5f 64 69 73 6b 28 30 2c 20 69 64 76 2c 20 30 29  _disk(0, idv, 0)
1a30: 3b 0a 20 20 20 20 66 72 65 65 28 7a 4e 61 6d 65  ;.    free(zName
1a40: 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61  );.  }.  db_fina
1a50: 6c 69 7a 65 28 26 71 29 3b 0a 0a 20 20 2f 2a 0a  lize(&q);..  /*.
1a60: 20 20 2a 2a 20 44 6f 20 61 20 74 68 72 65 65 2d    ** Do a three-
1a70: 77 61 79 20 6d 65 72 67 65 20 6f 6e 20 66 69 6c  way merge on fil
1a80: 65 73 20 74 68 61 74 20 68 61 76 65 20 63 68 61  es that have cha
1a90: 6e 67 65 73 20 70 69 64 2d 3e 6d 69 64 20 61 6e  nges pid->mid an
1aa0: 64 20 70 69 64 2d 3e 76 69 64 0a 20 20 2a 2f 0a  d pid->vid.  */.
1ab0: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c    db_prepare(&q,
1ac0: 0a 20 20 20 20 22 53 45 4c 45 43 54 20 72 69 64  .    "SELECT rid
1ad0: 6d 2c 20 69 64 76 2c 20 72 69 64 70 2c 20 72 69  m, idv, ridp, ri
1ae0: 64 76 20 46 52 4f 4d 20 66 76 22 0a 20 20 20 20  dv FROM fv".    
1af0: 22 20 57 48 45 52 45 20 69 64 70 3e 30 20 41 4e  " WHERE idp>0 AN
1b00: 44 20 69 64 76 3e 30 20 41 4e 44 20 69 64 6d 3e  D idv>0 AND idm>
1b10: 30 22 0a 20 20 20 20 22 20 20 20 41 4e 44 20 72  0".    "   AND r
1b20: 69 64 6d 21 3d 72 69 64 70 20 41 4e 44 20 28 72  idm!=ridp AND (r
1b30: 69 64 76 21 3d 72 69 64 70 20 4f 52 20 63 68 6e  idv!=ridp OR chn
1b40: 67 65 64 29 22 0a 20 20 29 3b 0a 20 20 77 68 69  ged)".  );.  whi
1b50: 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d  le( db_step(&q)=
1b60: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
1b70: 20 20 20 69 6e 74 20 72 69 64 6d 20 3d 20 64 62     int ridm = db
1b80: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20  _column_int(&q, 
1b90: 30 29 3b 0a 20 20 20 20 69 6e 74 20 69 64 76 20  0);.    int idv 
1ba0: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  = db_column_int(
1bb0: 26 71 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20  &q, 1);.    int 
1bc0: 72 69 64 70 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  ridp = db_column
1bd0: 5f 69 6e 74 28 26 71 2c 20 32 29 3b 0a 20 20 20  _int(&q, 2);.   
1be0: 20 69 6e 74 20 72 69 64 76 20 3d 20 64 62 5f 63   int ridv = db_c
1bf0: 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 33 29  olumn_int(&q, 3)
1c00: 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  ;.    int rc;.  
1c10: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
1c20: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45  db_text(0, "SELE
1c30: 43 54 20 70 61 74 68 6e 61 6d 65 20 46 52 4f 4d  CT pathname FROM
1c40: 20 76 66 69 6c 65 20 57 48 45 52 45 20 69 64 3d   vfile WHERE id=
1c50: 25 64 22 2c 20 69 64 76 29 3b 0a 20 20 20 20 63  %d", idv);.    c
1c60: 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 3b 0a  har *zFullPath;.
1c70: 20 20 20 20 42 6c 6f 62 20 6d 2c 20 70 2c 20 76      Blob m, p, v
1c80: 2c 20 72 3b 0a 20 20 20 20 2f 2a 20 44 6f 20 61  , r;.    /* Do a
1c90: 20 33 2d 77 61 79 20 6d 65 72 67 65 20 6f 66 20   3-way merge of 
1ca0: 69 64 70 2d 3e 69 64 6d 20 69 6e 74 6f 20 69 64  idp->idm into id
1cb0: 70 2d 3e 69 64 76 2e 20 20 54 68 65 20 72 65 73  p->idv.  The res
1cc0: 75 6c 74 73 20 67 6f 20 69 6e 74 6f 20 69 64 76  ults go into idv
1cd0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65 74  . */.    if( det
1ce0: 61 69 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 20  ailFlag ){.     
1cf0: 20 70 72 69 6e 74 66 28 22 4d 45 52 47 45 20 25   printf("MERGE %
1d00: 73 20 20 28 70 69 76 6f 74 3d 25 64 20 76 31 3d  s  (pivot=%d v1=
1d10: 25 64 20 76 32 3d 25 64 29 5c 6e 22 2c 20 7a 4e  %d v2=%d)\n", zN
1d20: 61 6d 65 2c 20 72 69 64 70 2c 20 72 69 64 6d 2c  ame, ridp, ridm,
1d30: 20 72 69 64 76 29 3b 0a 20 20 20 20 7d 65 6c 73   ridv);.    }els
1d40: 65 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  e{.      printf(
1d50: 22 4d 45 52 47 45 20 25 73 5c 6e 22 2c 20 7a 4e  "MERGE %s\n", zN
1d60: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
1d70: 75 6e 64 6f 5f 73 61 76 65 28 7a 4e 61 6d 65 29  undo_save(zName)
1d80: 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 20  ;.    zFullPath 
1d90: 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 2f 25 73  = mprintf("%s/%s
1da0: 22 2c 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 2c  ", g.zLocalRoot,
1db0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 63 6f 6e   zName);.    con
1dc0: 74 65 6e 74 5f 67 65 74 28 72 69 64 70 2c 20 26  tent_get(ridp, &
1dd0: 70 29 3b 0a 20 20 20 20 63 6f 6e 74 65 6e 74 5f  p);.    content_
1de0: 67 65 74 28 72 69 64 6d 2c 20 26 6d 29 3b 0a 20  get(ridm, &m);. 
1df0: 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 76 29     blob_zero(&v)
1e00: 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 61 64 5f  ;.    blob_read_
1e10: 66 72 6f 6d 5f 66 69 6c 65 28 26 76 2c 20 7a 46  from_file(&v, zF
1e20: 75 6c 6c 50 61 74 68 29 3b 0a 20 20 20 20 72 63  ullPath);.    rc
1e30: 20 3d 20 62 6c 6f 62 5f 6d 65 72 67 65 28 26 70   = blob_merge(&p
1e40: 2c 20 26 6d 2c 20 26 76 2c 20 26 72 29 3b 0a 20  , &m, &v, &r);. 
1e50: 20 20 20 69 66 28 20 72 63 3e 3d 30 20 29 7b 0a     if( rc>=0 ){.
1e60: 20 20 20 20 20 20 62 6c 6f 62 5f 77 72 69 74 65        blob_write
1e70: 5f 74 6f 5f 66 69 6c 65 28 26 72 2c 20 7a 46 75  _to_file(&r, zFu
1e80: 6c 6c 50 61 74 68 29 3b 0a 20 20 20 20 20 20 69  llPath);.      i
1e90: 66 28 20 72 63 3e 30 20 29 7b 0a 20 20 20 20 20  f( rc>0 ){.     
1ea0: 20 20 20 70 72 69 6e 74 66 28 22 2a 2a 2a 2a 2a     printf("*****
1eb0: 20 25 64 20 6d 65 72 67 65 20 63 6f 6e 66 6c 69   %d merge confli
1ec0: 63 74 73 20 69 6e 20 25 73 5c 6e 22 2c 20 72 63  cts in %s\n", rc
1ed0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
1ee0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1ef0: 20 20 20 70 72 69 6e 74 66 28 22 2a 2a 2a 2a 2a     printf("*****
1f00: 20 43 61 6e 6e 6f 74 20 6d 65 72 67 65 20 62 69   Cannot merge bi
1f10: 6e 61 72 79 20 66 69 6c 65 20 25 73 5c 6e 22 2c  nary file %s\n",
1f20: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zName);.    }. 
1f30: 20 20 20 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a     free(zName);.
1f40: 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26      blob_reset(&
1f50: 70 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73  p);.    blob_res
1f60: 65 74 28 26 6d 29 3b 0a 20 20 20 20 62 6c 6f 62  et(&m);.    blob
1f70: 5f 72 65 73 65 74 28 26 76 29 3b 0a 20 20 20 20  _reset(&v);.    
1f80: 62 6c 6f 62 5f 72 65 73 65 74 28 26 72 29 3b 0a  blob_reset(&r);.
1f90: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
1fa0: 63 28 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e  c("INSERT OR IGN
1fb0: 4f 52 45 20 49 4e 54 4f 20 76 6d 65 72 67 65 28  ORE INTO vmerge(
1fc0: 69 64 2c 6d 65 72 67 65 29 20 56 41 4c 55 45 53  id,merge) VALUES
1fd0: 28 25 64 2c 25 64 29 22 2c 0a 20 20 20 20 20 20  (%d,%d)",.      
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 69 64 76 2c              idv,
1ff0: 72 69 64 6d 29 3b 0a 20 20 7d 0a 20 20 64 62 5f  ridm);.  }.  db_
2000: 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 0a 20  finalize(&q);.. 
2010: 20 2f 2a 0a 20 20 2a 2a 20 44 72 6f 70 20 66 69   /*.  ** Drop fi
2020: 6c 65 73 20 66 72 6f 6d 20 76 69 64 20 74 68 61  les from vid tha
2030: 74 20 61 72 65 20 69 6e 20 70 69 64 20 62 75 74  t are in pid but
2040: 20 6e 6f 74 20 69 6e 20 6d 69 64 0a 20 20 2a 2f   not in mid.  */
2050: 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71  .  db_prepare(&q
2060: 2c 0a 20 20 20 20 22 53 45 4c 45 43 54 20 69 64  ,.    "SELECT id
2070: 76 20 46 52 4f 4d 20 66 76 22 0a 20 20 20 20 22  v FROM fv".    "
2080: 20 57 48 45 52 45 20 69 64 70 3e 30 20 41 4e 44   WHERE idp>0 AND
2090: 20 69 64 76 3e 30 20 41 4e 44 20 69 64 6d 3d 30   idv>0 AND idm=0
20a0: 22 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  ".  );.  while( 
20b0: 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c  db_step(&q)==SQL
20c0: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69  ITE_ROW ){.    i
20d0: 6e 74 20 69 64 76 20 3d 20 64 62 5f 63 6f 6c 75  nt idv = db_colu
20e0: 6d 6e 5f 69 6e 74 28 26 71 2c 20 30 29 3b 0a 20  mn_int(&q, 0);. 
20f0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
2100: 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c   db_text(0, "SEL
2110: 45 43 54 20 70 61 74 68 6e 61 6d 65 20 46 52 4f  ECT pathname FRO
2120: 4d 20 76 66 69 6c 65 20 57 48 45 52 45 20 69 64  M vfile WHERE id
2130: 3d 25 64 22 2c 20 69 64 76 29 3b 0a 20 20 20 20  =%d", idv);.    
2140: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69  /* Delete the fi
2150: 6c 65 20 69 64 76 20 2a 2f 0a 20 20 20 20 70 72  le idv */.    pr
2160: 69 6e 74 66 28 22 44 45 4c 45 54 45 20 25 73 5c  intf("DELETE %s\
2170: 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n", zName);.    
2180: 75 6e 64 6f 5f 73 61 76 65 28 7a 4e 61 6d 65 29  undo_save(zName)
2190: 3b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65  ;.    db_multi_e
21a0: 78 65 63 28 0a 20 20 20 20 20 20 22 55 50 44 41  xec(.      "UPDA
21b0: 54 45 20 76 66 69 6c 65 20 53 45 54 20 64 65 6c  TE vfile SET del
21c0: 65 74 65 64 3d 31 20 57 48 45 52 45 20 69 64 3d  eted=1 WHERE id=
21d0: 25 64 22 2c 20 69 64 76 0a 20 20 20 20 29 3b 0a  %d", idv.    );.
21e0: 20 20 20 20 66 72 65 65 28 7a 4e 61 6d 65 29 3b      free(zName);
21f0: 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69  .  }.  db_finali
2200: 7a 65 28 26 71 29 3b 0a 20 20 0a 20 20 2f 2a 0a  ze(&q);.  .  /*.
2210: 20 20 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68    ** Clean up th
2220: 65 20 6d 69 64 20 61 6e 64 20 70 69 64 20 56 46  e mid and pid VF
2230: 49 4c 45 20 65 6e 74 72 69 65 73 2e 20 20 54 68  ILE entries.  Th
2240: 65 6e 20 63 6f 6d 6d 69 74 20 74 68 65 20 63 68  en commit the ch
2250: 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 64 62  anges..  */.  db
2260: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 44 45 4c  _multi_exec("DEL
2270: 45 54 45 20 46 52 4f 4d 20 76 66 69 6c 65 20 57  ETE FROM vfile W
2280: 48 45 52 45 20 76 69 64 21 3d 25 64 22 2c 20 76  HERE vid!=%d", v
2290: 69 64 29 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f  id);.  db_multi_
22a0: 65 78 65 63 28 22 49 4e 53 45 52 54 20 4f 52 20  exec("INSERT OR 
22b0: 49 47 4e 4f 52 45 20 49 4e 54 4f 20 76 6d 65 72  IGNORE INTO vmer
22c0: 67 65 28 69 64 2c 6d 65 72 67 65 29 20 56 41 4c  ge(id,merge) VAL
22d0: 55 45 53 28 30 2c 25 64 29 22 2c 20 6d 69 64 29  UES(0,%d)", mid)
22e0: 3b 0a 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73  ;.  db_end_trans
22f0: 61 63 74 69 6f 6e 28 30 29 3b 0a 7d 0a           action(0);.}.