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 63 72 6f 73 73 20 6c 69 6e sed to cross lin
0390: 6b 20 6d 61 6e 69 66 65 73 74 73 0a 2a 2f 0a 23 k manifests.*/.#
03a0: 69 6e 63 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e include "config.
03b0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6d 61 6e h".#include "man
03c0: 69 66 65 73 74 2e 68 22 0a 23 69 6e 63 6c 75 64 ifest.h".#includ
03d0: 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 23 69 e <assert.h>..#i
03e0: 66 20 49 4e 54 45 52 46 41 43 45 0a 2f 2a 0a 2a f INTERFACE./*.*
03f0: 2a 20 41 20 70 61 72 73 65 64 20 6d 61 6e 69 66 * A parsed manif
0400: 65 73 74 0a 2a 2f 0a 73 74 72 75 63 74 20 4d 61 est.*/.struct Ma
0410: 6e 69 66 65 73 74 20 7b 0a 20 20 42 6c 6f 62 20 nifest {. Blob
0420: 63 6f 6e 74 65 6e 74 3b 20 20 20 20 20 20 20 20 content;
0430: 20 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c /* The original
0440: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 62 20 2a 2f content blob */
0450: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 65 6e . char *zCommen
0460: 74 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f t; /* Deco
0470: 64 65 64 20 63 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 ded comment */.
0480: 20 64 6f 75 62 6c 65 20 72 44 61 74 65 3b 20 20 double rDate;
0490: 20 20 20 20 20 20 20 2f 2a 20 54 69 6d 65 20 69 /* Time i
04a0: 6e 20 74 68 65 20 22 44 22 20 6c 69 6e 65 20 2a n the "D" line *
04b0: 2f 0a 20 20 63 68 61 72 20 2a 7a 55 73 65 72 3b /. char *zUser;
04c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d /* Nam
04d0: 65 20 6f 66 20 74 68 65 20 75 73 65 72 20 2a 2f e of the user */
04e0: 0a 20 20 63 68 61 72 20 2a 7a 52 65 70 6f 43 6b . char *zRepoCk
04f0: 73 75 6d 3b 20 20 20 20 20 2f 2a 20 4d 44 35 20 sum; /* MD5
0500: 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 checksum of the
0510: 62 61 73 65 6c 69 6e 65 20 63 6f 6e 74 65 6e 74 baseline content
0520: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 6c 65 3b */. int nFile;
0530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e /* N
0540: 75 6d 62 65 72 20 6f 66 20 46 20 6c 69 6e 65 73 umber of F lines
0550: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 6c 65 41 */. int nFileA
0560: 6c 6c 6f 63 3b 20 20 20 20 20 20 20 2f 2a 20 53 lloc; /* S
0570: 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 lots allocated i
0580: 6e 20 61 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20 73 n aFile[] */. s
0590: 74 72 75 63 74 20 7b 20 0a 20 20 20 20 63 68 61 truct { . cha
05a0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 r *zName;
05b0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 /* Name of a
05c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 file */. cha
05d0: 72 20 2a 7a 55 75 69 64 3b 20 20 20 20 20 20 20 r *zUuid;
05e0: 20 20 20 20 2f 2a 20 55 55 49 44 20 6f 66 20 74 /* UUID of t
05f0: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 7d 20 2a he file */. } *
0600: 61 46 69 6c 65 3b 0a 20 20 69 6e 74 20 6e 50 61 aFile;. int nPa
0610: 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f rent; /
0620: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 65 * Number of pare
0630: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 nts */. int nPa
0640: 72 65 6e 74 41 6c 6c 6f 63 3b 20 20 20 20 20 2f rentAlloc; /
0650: 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 * Slots allocate
0660: 64 20 69 6e 20 61 7a 50 61 72 65 6e 74 5b 5d 20 d in azParent[]
0670: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 50 61 */. char **azPa
0680: 72 65 6e 74 3b 20 20 20 20 20 20 2f 2a 20 55 55 rent; /* UU
0690: 49 44 73 20 6f 66 20 70 61 72 65 6e 74 73 20 2a IDs of parents *
06a0: 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a /.};.#endif.../*
06b0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 6d 65 .** Clear the me
06c0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 mory allocated i
06d0: 6e 20 61 20 6d 61 6e 69 66 65 73 74 20 6f 62 6a n a manifest obj
06e0: 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 6d 61 6e 69 ect.*/.void mani
06f0: 66 65 73 74 5f 63 6c 65 61 72 28 4d 61 6e 69 66 fest_clear(Manif
0700: 65 73 74 20 2a 70 29 7b 0a 20 20 62 6c 6f 62 5f est *p){. blob_
0710: 72 65 73 65 74 28 26 70 2d 3e 63 6f 6e 74 65 6e reset(&p->conten
0720: 74 29 3b 0a 20 20 66 72 65 65 28 70 2d 3e 61 46 t);. free(p->aF
0730: 69 6c 65 29 3b 0a 20 20 66 72 65 65 28 70 2d 3e ile);. free(p->
0740: 61 7a 50 61 72 65 6e 74 29 3b 0a 20 20 6d 65 6d azParent);. mem
0750: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 set(p, 0, sizeof
0760: 28 2a 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 (*p));.}../*.**
0770: 50 61 72 73 65 20 61 20 6d 61 6e 69 66 65 73 74 Parse a manifest
0780: 20 62 6c 6f 62 20 69 6e 74 6f 20 61 20 4d 61 6e blob into a Man
0790: 69 66 65 73 74 20 6f 62 6a 65 63 74 2e 20 20 54 ifest object. T
07a0: 68 65 20 4d 61 6e 69 66 65 73 74 0a 2a 2a 20 6f he Manifest.** o
07b0: 62 6a 65 63 74 20 74 61 6b 65 73 20 6f 76 65 72 bject takes over
07c0: 20 74 68 65 20 69 6e 70 75 74 20 62 6c 6f 62 20 the input blob
07d0: 61 6e 64 20 77 69 6c 6c 20 66 72 65 65 20 69 74 and will free it
07e0: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 4d 61 6e when the.** Man
07f0: 69 66 65 73 74 20 6f 62 6a 65 63 74 20 69 73 20 ifest object is
0800: 66 72 65 65 64 2e 20 20 5a 65 72 6f 73 20 61 72 freed. Zeros ar
0810: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 e inserted into
0820: 74 68 65 20 62 6c 6f 62 0a 2a 2a 20 61 73 20 73 the blob.** as s
0830: 74 72 69 6e 67 20 74 65 72 6d 69 6e 61 74 6f 72 tring terminator
0840: 73 20 73 6f 20 74 68 61 74 20 62 6c 6f 62 20 73 s so that blob s
0850: 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 hould not be use
0860: 64 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 52 d again..**.** R
0870: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 eturn TRUE if th
0880: 65 20 63 6f 6e 74 65 6e 74 20 72 65 61 6c 6c 79 e content really
0890: 20 69 73 20 61 20 6d 61 6e 69 66 65 73 74 2e 20 is a manifest.
08a0: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a Return FALSE.**
08b0: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 73 79 if there are sy
08c0: 6e 74 61 78 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a ntax errors..**.
08d0: 2a 2a 20 54 68 65 20 70 43 6f 6e 74 65 6e 74 20 ** The pContent
08e0: 69 73 20 72 65 73 65 74 2e 20 20 49 66 20 54 52 is reset. If TR
08f0: 55 45 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 UE is returned,
0900: 74 68 65 6e 20 70 43 6f 6e 74 65 6e 74 20 77 69 then pContent wi
0910: 6c 6c 0a 2a 2a 20 62 65 20 72 65 73 65 74 20 77 ll.** be reset w
0920: 68 65 6e 20 74 68 65 20 4d 61 6e 69 66 65 73 74 hen the Manifest
0930: 20 6f 62 6a 65 63 74 20 69 73 20 63 6c 65 61 72 object is clear
0940: 65 64 2e 20 20 49 66 20 46 41 4c 53 45 20 69 73 ed. If FALSE is
0950: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 68 65 .** returned the
0960: 6e 20 74 68 65 20 4d 61 6e 69 66 65 73 74 20 6f n the Manifest o
0970: 62 6a 65 63 74 20 69 73 20 63 6c 65 61 72 65 64 bject is cleared
0980: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a automatically.*
0990: 2a 20 61 6e 64 20 70 43 6f 6e 74 65 6e 74 20 69 * and pContent i
09a0: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 s reset before t
09b0: 68 65 20 72 65 74 75 72 6e 2e 0a 2a 2f 0a 69 6e he return..*/.in
09c0: 74 20 6d 61 6e 69 66 65 73 74 5f 70 61 72 73 65 t manifest_parse
09d0: 28 4d 61 6e 69 66 65 73 74 20 2a 70 2c 20 42 6c (Manifest *p, Bl
09e0: 6f 62 20 2a 70 43 6f 6e 74 65 6e 74 29 7b 0a 20 ob *pContent){.
09f0: 20 69 6e 74 20 73 65 65 6e 48 65 61 64 65 72 20 int seenHeader
0a00: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 = 0;. int i;.
0a10: 42 6c 6f 62 20 6c 69 6e 65 2c 20 74 6f 6b 65 6e Blob line, token
0a20: 2c 20 61 31 2c 20 61 32 2c 20 61 33 3b 0a 0a 20 , a1, a2, a3;..
0a30: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 memset(p, 0, si
0a40: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 6d 65 6d zeof(*p));. mem
0a50: 63 70 79 28 26 70 2d 3e 63 6f 6e 74 65 6e 74 2c cpy(&p->content,
0a60: 20 70 43 6f 6e 74 65 6e 74 2c 20 73 69 7a 65 6f pContent, sizeo
0a70: 66 28 70 2d 3e 63 6f 6e 74 65 6e 74 29 29 3b 0a f(p->content));.
0a80: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 70 43 6f 6e blob_zero(pCon
0a90: 74 65 6e 74 29 3b 0a 20 20 70 43 6f 6e 74 65 6e tent);. pConten
0aa0: 74 20 3d 20 26 70 2d 3e 63 6f 6e 74 65 6e 74 3b t = &p->content;
0ab0: 0a 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 61 .. blob_zero(&a
0ac0: 31 29 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 1);. blob_zero(
0ad0: 26 61 32 29 3b 0a 20 20 6d 64 35 73 75 6d 5f 69 &a2);. md5sum_i
0ae0: 6e 69 74 28 29 3b 0a 20 20 77 68 69 6c 65 28 20 nit();. while(
0af0: 62 6c 6f 62 5f 6c 69 6e 65 28 70 43 6f 6e 74 65 blob_line(pConte
0b00: 6e 74 2c 20 26 6c 69 6e 65 29 20 29 7b 0a 20 20 nt, &line) ){.
0b10: 20 20 63 68 61 72 20 2a 7a 20 3d 20 62 6c 6f 62 char *z = blob
0b20: 5f 62 75 66 66 65 72 28 26 6c 69 6e 65 29 3b 0a _buffer(&line);.
0b30: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d if( z[0]=='-
0b40: 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 ' ){. if( s
0b50: 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 2d 2d 2d 2d trncmp(z, "-----
0b60: 42 45 47 49 4e 20 50 47 50 20 22 2c 20 31 35 29 BEGIN PGP ", 15)
0b70: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 67 !=0 ){. g
0b80: 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e oto manifest_syn
0b90: 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 tax_error;.
0ba0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 65 65 }. if( see
0bb0: 6e 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 nHeader ){.
0bc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 break;.
0bd0: 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 62 }. while( b
0be0: 6c 6f 62 5f 6c 69 6e 65 28 70 43 6f 6e 74 65 6e lob_line(pConten
0bf0: 74 2c 20 26 6c 69 6e 65 29 3e 31 20 29 7b 7d 0a t, &line)>1 ){}.
0c00: 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 6c if( blob_l
0c10: 69 6e 65 28 70 43 6f 6e 74 65 6e 74 2c 20 26 6c ine(pContent, &l
0c20: 69 6e 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b ine)==0 ) break;
0c30: 0a 20 20 20 20 20 20 7a 20 3d 20 62 6c 6f 62 5f . z = blob_
0c40: 62 75 66 66 65 72 28 26 6c 69 6e 65 29 3b 0a 20 buffer(&line);.
0c50: 20 20 20 7d 0a 20 20 20 20 73 65 65 6e 48 65 61 }. seenHea
0c60: 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 der = 1;. if(
0c70: 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e blob_token(&lin
0c80: 65 2c 20 26 74 6f 6b 65 6e 29 21 3d 31 20 29 20 e, &token)!=1 )
0c90: 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 goto manifest_sy
0ca0: 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 ntax_error;.
0cb0: 69 66 28 20 7a 5b 30 5d 3d 3d 27 46 27 20 29 7b if( z[0]=='F' ){
0cc0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 . char *zNa
0cd0: 6d 65 2c 20 2a 7a 55 75 69 64 3b 0a 20 20 20 20 me, *zUuid;.
0ce0: 20 20 6d 64 35 73 75 6d 5f 73 74 65 70 5f 74 65 md5sum_step_te
0cf0: 78 74 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 xt(blob_buffer(&
0d00: 6c 69 6e 65 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 line), blob_size
0d10: 28 26 6c 69 6e 65 29 2b 31 29 3b 0a 20 20 20 20 (&line)+1);.
0d20: 20 20 69 66 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e if( blob_token
0d30: 28 26 6c 69 6e 65 2c 20 26 61 31 29 3d 3d 30 20 (&line, &a1)==0
0d40: 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f ) goto manifest_
0d50: 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 syntax_error;.
0d60: 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 74 6f 6b if( blob_tok
0d70: 65 6e 28 26 6c 69 6e 65 2c 20 26 61 32 29 3d 3d en(&line, &a2)==
0d80: 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 0 ) goto manifes
0d90: 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a t_syntax_error;.
0da0: 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 74 if( blob_t
0db0: 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 61 33 29 oken(&line, &a3)
0dc0: 21 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 !=0 ) goto manif
0dd0: 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 est_syntax_error
0de0: 3b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 ;. zName =
0df0: 62 6c 6f 62 5f 74 65 72 6d 69 6e 61 74 65 28 26 blob_terminate(&
0e00: 61 31 29 3b 0a 20 20 20 20 20 20 7a 55 75 69 64 a1);. zUuid
0e10: 20 3d 20 62 6c 6f 62 5f 74 65 72 6d 69 6e 61 74 = blob_terminat
0e20: 65 28 26 61 32 29 3b 0a 20 20 20 20 20 20 69 66 e(&a2);. if
0e30: 28 20 62 6c 6f 62 5f 73 69 7a 65 28 26 61 32 29 ( blob_size(&a2)
0e40: 21 3d 55 55 49 44 5f 53 49 5a 45 20 29 20 67 6f !=UUID_SIZE ) go
0e50: 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 to manifest_synt
0e60: 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 ax_error;.
0e70: 69 66 28 20 21 76 61 6c 69 64 61 74 65 31 36 28 if( !validate16(
0e80: 7a 55 75 69 64 2c 20 55 55 49 44 5f 53 49 5a 45 zUuid, UUID_SIZE
0e90: 29 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 ) ) goto manifes
0ea0: 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a t_syntax_error;.
0eb0: 20 20 20 20 20 20 64 65 66 6f 73 73 69 6c 69 7a defossiliz
0ec0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 e(zName);.
0ed0: 69 66 28 20 21 66 69 6c 65 5f 69 73 5f 73 69 6d if( !file_is_sim
0ee0: 70 6c 65 5f 70 61 74 68 6e 61 6d 65 28 7a 4e 61 ple_pathname(zNa
0ef0: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 me) ){. g
0f00: 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e oto manifest_syn
0f10: 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 tax_error;.
0f20: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e }. if( p->
0f30: 6e 46 69 6c 65 3e 3d 70 2d 3e 6e 46 69 6c 65 41 nFile>=p->nFileA
0f40: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 lloc ){.
0f50: 70 2d 3e 6e 46 69 6c 65 41 6c 6c 6f 63 20 3d 20 p->nFileAlloc =
0f60: 70 2d 3e 6e 46 69 6c 65 41 6c 6c 6f 63 2a 32 20 p->nFileAlloc*2
0f70: 2b 20 31 30 3b 0a 20 20 20 20 20 20 20 20 70 2d + 10;. p-
0f80: 3e 61 46 69 6c 65 20 3d 20 72 65 61 6c 6c 6f 63 >aFile = realloc
0f90: 28 70 2d 3e 61 46 69 6c 65 2c 20 70 2d 3e 6e 46 (p->aFile, p->nF
0fa0: 69 6c 65 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 ileAlloc*sizeof(
0fb0: 70 2d 3e 61 46 69 6c 65 5b 30 5d 29 20 29 3b 0a p->aFile[0]) );.
0fc0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 if( p->a
0fd0: 46 69 6c 65 3d 3d 30 20 29 20 66 6f 73 73 69 6c File==0 ) fossil
0fe0: 5f 70 61 6e 69 63 28 22 6f 75 74 20 6f 66 20 6d _panic("out of m
0ff0: 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 7d emory");. }
1000: 0a 20 20 20 20 20 20 69 20 3d 20 70 2d 3e 6e 46 . i = p->nF
1010: 69 6c 65 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e ile++;. p->
1020: 61 46 69 6c 65 5b 69 5d 2e 7a 4e 61 6d 65 20 3d aFile[i].zName =
1030: 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70 2d zName;. p-
1040: 3e 61 46 69 6c 65 5b 69 5d 2e 7a 55 75 69 64 20 >aFile[i].zUuid
1050: 3d 20 7a 55 75 69 64 3b 0a 20 20 20 20 20 20 69 = zUuid;. i
1060: 66 28 20 69 3e 30 20 26 26 20 73 74 72 63 6d 70 f( i>0 && strcmp
1070: 28 70 2d 3e 61 46 69 6c 65 5b 69 2d 31 5d 2e 7a (p->aFile[i-1].z
1080: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 Name, zName)>=0
1090: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 ){. goto
10a0: 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f manifest_syntax_
10b0: 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 error;. }.
10c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 }else if( z[0
10d0: 5d 3d 3d 27 43 27 20 29 7b 0a 20 20 20 20 20 20 ]=='C' ){.
10e0: 6d 64 35 73 75 6d 5f 73 74 65 70 5f 74 65 78 74 md5sum_step_text
10f0: 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 6c 69 (blob_buffer(&li
1100: 6e 65 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 ne), blob_size(&
1110: 6c 69 6e 65 29 2b 31 29 3b 0a 20 20 20 20 20 20 line)+1);.
1120: 69 66 28 20 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 21 if( p->zComment!
1130: 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 =0 ) goto manife
1140: 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b st_syntax_error;
1150: 0a 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62 5f . if( blob_
1160: 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 61 31 token(&line, &a1
1170: 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 )==0 ) goto mani
1180: 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f fest_syntax_erro
1190: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 62 6c 6f r;. if( blo
11a0: 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 b_token(&line, &
11b0: 61 32 29 21 3d 30 20 29 20 67 6f 74 6f 20 6d 61 a2)!=0 ) goto ma
11c0: 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 nifest_syntax_er
11d0: 72 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 43 ror;. p->zC
11e0: 6f 6d 6d 65 6e 74 20 3d 20 62 6c 6f 62 5f 74 65 omment = blob_te
11f0: 72 6d 69 6e 61 74 65 28 26 61 31 29 3b 0a 20 20 rminate(&a1);.
1200: 20 20 20 20 64 65 66 6f 73 73 69 6c 69 7a 65 28 defossilize(
1210: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 p->zComment);.
1220: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d }else if( z[0]
1230: 3d 3d 27 44 27 20 29 7b 0a 20 20 20 20 20 20 63 =='D' ){. c
1240: 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20 20 20 20 har *zDate;.
1250: 20 20 6d 64 35 73 75 6d 5f 73 74 65 70 5f 74 65 md5sum_step_te
1260: 78 74 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 xt(blob_buffer(&
1270: 6c 69 6e 65 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 line), blob_size
1280: 28 26 6c 69 6e 65 29 2b 31 29 3b 0a 20 20 20 20 (&line)+1);.
1290: 20 20 69 66 28 20 70 2d 3e 72 44 61 74 65 21 3d if( p->rDate!=
12a0: 30 2e 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 0.0 ) goto manif
12b0: 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 est_syntax_error
12c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62 ;. if( blob
12d0: 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 61 _token(&line, &a
12e0: 31 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e 1)==0 ) goto man
12f0: 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 ifest_syntax_err
1300: 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 62 6c or;. if( bl
1310: 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 ob_token(&line,
1320: 26 61 32 29 21 3d 30 20 29 20 67 6f 74 6f 20 6d &a2)!=0 ) goto m
1330: 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 anifest_syntax_e
1340: 72 72 6f 72 3b 0a 20 20 20 20 20 20 7a 44 61 74 rror;. zDat
1350: 65 20 3d 20 62 6c 6f 62 5f 74 65 72 6d 69 6e 61 e = blob_termina
1360: 74 65 28 26 61 31 29 3b 0a 20 20 20 20 20 20 70 te(&a1);. p
1370: 2d 3e 72 44 61 74 65 20 3d 20 64 62 5f 64 6f 75 ->rDate = db_dou
1380: 62 6c 65 28 30 2e 30 2c 20 22 53 45 4c 45 43 54 ble(0.0, "SELECT
1390: 20 6a 75 6c 69 61 6e 64 61 79 28 25 51 29 22 2c julianday(%Q)",
13a0: 20 7a 44 61 74 65 29 3b 0a 20 20 20 20 7d 65 6c zDate);. }el
13b0: 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 55 27 se if( z[0]=='U'
13c0: 20 29 7b 0a 20 20 20 20 20 20 6d 64 35 73 75 6d ){. md5sum
13d0: 5f 73 74 65 70 5f 74 65 78 74 28 62 6c 6f 62 5f _step_text(blob_
13e0: 62 75 66 66 65 72 28 26 6c 69 6e 65 29 2c 20 62 buffer(&line), b
13f0: 6c 6f 62 5f 73 69 7a 65 28 26 6c 69 6e 65 29 2b lob_size(&line)+
1400: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 1);. if( p-
1410: 3e 7a 55 73 65 72 21 3d 30 20 29 20 67 6f 74 6f >zUser!=0 ) goto
1420: 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 manifest_syntax
1430: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 _error;. if
1440: 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69 ( blob_token(&li
1450: 6e 65 2c 20 26 61 31 29 3d 3d 30 20 29 20 67 6f ne, &a1)==0 ) go
1460: 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 to manifest_synt
1470: 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 ax_error;.
1480: 69 66 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 if( blob_token(&
1490: 6c 69 6e 65 2c 20 26 61 32 29 21 3d 30 20 29 20 line, &a2)!=0 )
14a0: 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 goto manifest_sy
14b0: 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 ntax_error;.
14c0: 20 20 70 2d 3e 7a 55 73 65 72 20 3d 20 62 6c 6f p->zUser = blo
14d0: 62 5f 74 65 72 6d 69 6e 61 74 65 28 26 61 31 29 b_terminate(&a1)
14e0: 3b 0a 20 20 20 20 20 20 64 65 66 6f 73 73 69 6c ;. defossil
14f0: 69 7a 65 28 70 2d 3e 7a 55 73 65 72 29 3b 0a 20 ize(p->zUser);.
1500: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 }else if( z[0
1510: 5d 3d 3d 27 52 27 20 29 7b 0a 20 20 20 20 20 20 ]=='R' ){.
1520: 6d 64 35 73 75 6d 5f 73 74 65 70 5f 74 65 78 74 md5sum_step_text
1530: 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 6c 69 (blob_buffer(&li
1540: 6e 65 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 ne), blob_size(&
1550: 6c 69 6e 65 29 2b 31 29 3b 0a 20 20 20 20 20 20 line)+1);.
1560: 69 66 28 20 70 2d 3e 7a 52 65 70 6f 43 6b 73 75 if( p->zRepoCksu
1570: 6d 21 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 m!=0 ) goto mani
1580: 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f fest_syntax_erro
1590: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 62 6c 6f r;. if( blo
15a0: 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 b_token(&line, &
15b0: 61 31 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6d 61 a1)==0 ) goto ma
15c0: 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 nifest_syntax_er
15d0: 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 62 ror;. if( b
15e0: 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c lob_token(&line,
15f0: 20 26 61 32 29 21 3d 30 20 29 20 67 6f 74 6f 20 &a2)!=0 ) goto
1600: 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f manifest_syntax_
1610: 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 error;. if(
1620: 20 62 6c 6f 62 5f 73 69 7a 65 28 26 61 31 29 21 blob_size(&a1)!
1630: 3d 33 32 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 =32 ) goto manif
1640: 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 est_syntax_error
1650: 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 52 65 70 6f ;. p->zRepo
1660: 43 6b 73 75 6d 20 3d 20 62 6c 6f 62 5f 74 65 72 Cksum = blob_ter
1670: 6d 69 6e 61 74 65 28 26 61 31 29 3b 0a 20 20 20 minate(&a1);.
1680: 20 20 20 69 66 28 20 21 76 61 6c 69 64 61 74 65 if( !validate
1690: 31 36 28 70 2d 3e 7a 52 65 70 6f 43 6b 73 75 6d 16(p->zRepoCksum
16a0: 2c 20 33 32 29 20 29 20 67 6f 74 6f 20 6d 61 6e , 32) ) goto man
16b0: 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 ifest_syntax_err
16c0: 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 or;. }else if
16d0: 28 20 7a 5b 30 5d 3d 3d 27 50 27 20 29 7b 0a 20 ( z[0]=='P' ){.
16e0: 20 20 20 20 20 6d 64 35 73 75 6d 5f 73 74 65 70 md5sum_step
16f0: 5f 74 65 78 74 28 62 6c 6f 62 5f 62 75 66 66 65 _text(blob_buffe
1700: 72 28 26 6c 69 6e 65 29 2c 20 62 6c 6f 62 5f 73 r(&line), blob_s
1710: 69 7a 65 28 26 6c 69 6e 65 29 2b 31 29 3b 0a 20 ize(&line)+1);.
1720: 20 20 20 20 20 77 68 69 6c 65 28 20 62 6c 6f 62 while( blob
1730: 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 61 _token(&line, &a
1740: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 1) ){. ch
1750: 61 72 20 2a 7a 55 75 69 64 3b 0a 20 20 20 20 20 ar *zUuid;.
1760: 20 20 20 69 66 28 20 62 6c 6f 62 5f 73 69 7a 65 if( blob_size
1770: 28 26 61 31 29 21 3d 55 55 49 44 5f 53 49 5a 45 (&a1)!=UUID_SIZE
1780: 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 ) goto manifest
1790: 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 _syntax_error;.
17a0: 20 20 20 20 20 20 20 7a 55 75 69 64 20 3d 20 62 zUuid = b
17b0: 6c 6f 62 5f 74 65 72 6d 69 6e 61 74 65 28 26 61 lob_terminate(&a
17c0: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 1);. if(
17d0: 21 76 61 6c 69 64 61 74 65 31 36 28 7a 55 75 69 !validate16(zUui
17e0: 64 2c 20 55 55 49 44 5f 53 49 5a 45 29 20 29 20 d, UUID_SIZE) )
17f0: 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 goto manifest_sy
1800: 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 ntax_error;.
1810: 20 20 20 20 69 66 28 20 70 2d 3e 6e 50 61 72 65 if( p->nPare
1820: 6e 74 3e 3d 70 2d 3e 6e 50 61 72 65 6e 74 41 6c nt>=p->nParentAl
1830: 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 loc ){.
1840: 20 70 2d 3e 6e 50 61 72 65 6e 74 41 6c 6c 6f 63 p->nParentAlloc
1850: 20 3d 20 70 2d 3e 6e 50 61 72 65 6e 74 41 6c 6c = p->nParentAll
1860: 6f 63 2a 32 20 2b 20 35 3b 0a 20 20 20 20 20 20 oc*2 + 5;.
1870: 20 20 20 20 70 2d 3e 61 7a 50 61 72 65 6e 74 20 p->azParent
1880: 3d 20 72 65 61 6c 6c 6f 63 28 70 2d 3e 61 7a 50 = realloc(p->azP
1890: 61 72 65 6e 74 2c 20 70 2d 3e 6e 50 61 72 65 6e arent, p->nParen
18a0: 74 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 63 68 tAlloc*sizeof(ch
18b0: 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 ar*));.
18c0: 20 69 66 28 20 70 2d 3e 61 7a 50 61 72 65 6e 74 if( p->azParent
18d0: 3d 3d 30 20 29 20 66 6f 73 73 69 6c 5f 70 61 6e ==0 ) fossil_pan
18e0: 69 63 28 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 ic("out of memor
18f0: 79 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 y");. }.
1900: 20 20 20 20 20 20 20 69 20 3d 20 70 2d 3e 6e 50 i = p->nP
1910: 61 72 65 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 arent++;.
1920: 20 70 2d 3e 61 7a 50 61 72 65 6e 74 5b 69 5d 20 p->azParent[i]
1930: 3d 20 7a 55 75 69 64 3b 0a 20 20 20 20 20 20 7d = zUuid;. }
1940: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a . }else if( z
1950: 5b 30 5d 3d 3d 27 5a 27 20 29 7b 0a 20 20 20 20 [0]=='Z' ){.
1960: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 int rc;.
1970: 42 6c 6f 62 20 68 61 73 68 3b 0a 20 20 20 20 20 Blob hash;.
1980: 20 69 66 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 if( blob_token(
1990: 26 6c 69 6e 65 2c 20 26 61 31 29 3d 3d 30 20 29 &line, &a1)==0 )
19a0: 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 goto manifest_s
19b0: 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 yntax_error;.
19c0: 20 20 20 69 66 28 20 62 6c 6f 62 5f 74 6f 6b 65 if( blob_toke
19d0: 6e 28 26 6c 69 6e 65 2c 20 26 61 32 29 21 3d 30 n(&line, &a2)!=0
19e0: 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 ) goto manifest
19f0: 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 _syntax_error;.
1a00: 20 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 73 69 if( blob_si
1a10: 7a 65 28 26 61 31 29 21 3d 33 32 20 29 20 67 6f ze(&a1)!=32 ) go
1a20: 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 to manifest_synt
1a30: 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 ax_error;.
1a40: 69 66 28 20 21 76 61 6c 69 64 61 74 65 31 36 28 if( !validate16(
1a50: 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 61 31 29 blob_buffer(&a1)
1a60: 2c 20 33 32 29 20 29 20 67 6f 74 6f 20 6d 61 6e , 32) ) goto man
1a70: 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 ifest_syntax_err
1a80: 6f 72 3b 0a 20 20 20 20 20 20 6d 64 35 73 75 6d or;. md5sum
1a90: 5f 66 69 6e 69 73 68 28 26 68 61 73 68 29 3b 0a _finish(&hash);.
1aa0: 20 20 20 20 20 20 72 63 20 3d 20 62 6c 6f 62 5f rc = blob_
1ab0: 63 6f 6d 70 61 72 65 28 26 68 61 73 68 2c 20 26 compare(&hash, &
1ac0: 61 31 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f a1);. blob_
1ad0: 72 65 73 65 74 28 26 68 61 73 68 29 3b 0a 20 20 reset(&hash);.
1ae0: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 if( rc!=0 )
1af0: 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 goto manifest_sy
1b00: 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 ntax_error;.
1b10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 }else{. got
1b20: 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 o manifest_synta
1b30: 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 x_error;. }.
1b40: 20 7d 0a 20 20 69 66 28 20 21 73 65 65 6e 48 65 }. if( !seenHe
1b50: 61 64 65 72 20 29 20 67 6f 74 6f 20 6d 61 6e 69 ader ) goto mani
1b60: 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f fest_syntax_erro
1b70: 72 3b 0a 20 20 6d 64 35 73 75 6d 5f 69 6e 69 74 r;. md5sum_init
1b80: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a ();. return 1;.
1b90: 0a 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 .manifest_syntax
1ba0: 5f 65 72 72 6f 72 3a 0a 20 20 6d 64 35 73 75 6d _error:. md5sum
1bb0: 5f 69 6e 69 74 28 29 3b 0a 20 20 6d 61 6e 69 66 _init();. manif
1bc0: 65 73 74 5f 63 6c 65 61 72 28 70 29 3b 0a 20 20 est_clear(p);.
1bd0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a return 0;.}../*.
1be0: 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 ** Add a single
1bf0: 65 6e 74 72 79 20 74 6f 20 74 68 65 20 6d 6c 69 entry to the mli
1c00: 6e 6b 20 74 61 62 6c 65 2e 20 20 41 6c 73 6f 20 nk table. Also
1c10: 61 64 64 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 add the filename
1c20: 20 74 6f 0a 2a 2a 20 74 68 65 20 66 69 6c 65 6e to.** the filen
1c30: 61 6d 65 20 74 61 62 6c 65 20 69 66 20 69 74 20 ame table if it
1c40: 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 is not there alr
1c50: 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 eady..*/.static
1c60: 76 6f 69 64 20 61 64 64 5f 6f 6e 65 5f 6d 6c 69 void add_one_mli
1c70: 6e 6b 28 0a 20 20 69 6e 74 20 6d 69 64 2c 20 20 nk(. int mid,
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1c90: 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 49 44 /* The record ID
1ca0: 20 6f 66 20 74 68 65 20 6d 61 6e 69 66 65 73 74 of the manifest
1cb0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 */. const char
1cc0: 20 2a 7a 46 72 6f 6d 55 75 69 64 2c 20 20 20 20 *zFromUuid,
1cd0: 2f 2a 20 55 55 49 44 20 66 6f 72 20 74 68 65 20 /* UUID for the
1ce0: 6d 6c 69 6e 6b 2e 70 69 64 20 66 69 65 6c 64 20 mlink.pid field
1cf0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 */. const char
1d00: 2a 7a 54 6f 55 75 69 64 2c 20 20 20 20 20 20 2f *zToUuid, /
1d10: 2a 20 55 55 49 44 20 66 6f 72 20 74 68 65 20 6d * UUID for the m
1d20: 6c 69 6e 6b 2e 66 69 64 20 66 69 65 6c 64 20 2a link.fid field *
1d30: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a /. const char *
1d40: 7a 46 69 6c 65 6e 61 6d 65 20 20 20 20 20 2f 2a zFilename /*
1d50: 20 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 29 7b 0a Filename */.){.
1d60: 20 20 69 6e 74 20 66 6e 69 64 2c 20 70 69 64 2c int fnid, pid,
1d70: 20 66 69 64 3b 0a 0a 20 20 66 6e 69 64 20 3d 20 fid;.. fnid =
1d80: 64 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c 45 43 db_int(0, "SELEC
1d90: 54 20 66 6e 69 64 20 46 52 4f 4d 20 66 69 6c 65 T fnid FROM file
1da0: 6e 61 6d 65 20 57 48 45 52 45 20 6e 61 6d 65 3d name WHERE name=
1db0: 25 51 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b %Q", zFilename);
1dc0: 0a 20 20 69 66 28 20 66 6e 69 64 3d 3d 30 20 29 . if( fnid==0 )
1dd0: 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 {. db_multi_e
1de0: 78 65 63 28 22 49 4e 53 45 52 54 20 49 4e 54 4f xec("INSERT INTO
1df0: 20 66 69 6c 65 6e 61 6d 65 28 6e 61 6d 65 29 20 filename(name)
1e00: 56 41 4c 55 45 53 28 25 51 29 22 2c 20 7a 46 69 VALUES(%Q)", zFi
1e10: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 66 6e 69 lename);. fni
1e20: 64 20 3d 20 64 62 5f 6c 61 73 74 5f 69 6e 73 65 d = db_last_inse
1e30: 72 74 5f 72 6f 77 69 64 28 29 3b 0a 20 20 7d 0a rt_rowid();. }.
1e40: 20 20 69 66 28 20 7a 46 72 6f 6d 55 75 69 64 3d if( zFromUuid=
1e50: 3d 30 20 29 7b 0a 20 20 20 20 70 69 64 20 3d 20 =0 ){. pid =
1e60: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 0;. }else{.
1e70: 70 69 64 20 3d 20 75 75 69 64 5f 74 6f 5f 72 69 pid = uuid_to_ri
1e80: 64 28 7a 46 72 6f 6d 55 75 69 64 2c 20 31 29 3b d(zFromUuid, 1);
1e90: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 6f 55 75 . }. if( zToUu
1ea0: 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 66 69 64 id==0 ){. fid
1eb0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 = 0;. }else{.
1ec0: 20 20 20 66 69 64 20 3d 20 75 75 69 64 5f 74 6f fid = uuid_to
1ed0: 5f 72 69 64 28 7a 54 6f 55 75 69 64 2c 20 31 29 _rid(zToUuid, 1)
1ee0: 3b 0a 20 20 7d 0a 20 20 64 62 5f 6d 75 6c 74 69 ;. }. db_multi
1ef0: 5f 65 78 65 63 28 0a 20 20 20 20 22 49 4e 53 45 _exec(. "INSE
1f00: 52 54 20 49 4e 54 4f 20 6d 6c 69 6e 6b 28 6d 69 RT INTO mlink(mi
1f10: 64 2c 70 69 64 2c 66 69 64 2c 66 6e 69 64 29 22 d,pid,fid,fnid)"
1f20: 0a 20 20 20 20 22 56 41 4c 55 45 53 28 25 64 2c . "VALUES(%d,
1f30: 25 64 2c 25 64 2c 25 64 29 22 2c 20 6d 69 64 2c %d,%d,%d)", mid,
1f40: 20 70 69 64 2c 20 66 69 64 2c 20 66 6e 69 64 0a pid, fid, fnid.
1f50: 20 20 29 3b 0a 20 20 69 66 28 20 70 69 64 20 26 );. if( pid &
1f60: 26 20 66 69 64 20 29 7b 0a 20 20 20 20 63 6f 6e & fid ){. con
1f70: 74 65 6e 74 5f 64 65 6c 74 69 66 79 28 70 69 64 tent_deltify(pid
1f80: 2c 20 66 69 64 2c 20 30 29 3b 0a 20 20 7d 0a 7d , fid, 0);. }.}
1f90: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6d 6c 69 6e ../*.** Add mlin
1fa0: 6b 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 k table entries
1fb0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 associated with
1fc0: 6d 61 6e 69 66 65 73 74 20 63 69 64 2e 0a 2a 2a manifest cid..**
1fd0: 20 54 68 65 72 65 20 69 73 20 61 6e 20 6d 6c 69 There is an mli
1fe0: 6e 6b 20 65 6e 74 72 79 20 66 6f 72 20 65 76 65 nk entry for eve
1ff0: 72 79 20 66 69 6c 65 20 74 68 61 74 20 63 68 61 ry file that cha
2000: 6e 67 65 64 20 67 6f 69 6e 67 0a 2a 2a 20 66 72 nged going.** fr
2010: 6f 6d 20 70 69 64 20 74 6f 20 63 69 64 2e 0a 2a om pid to cid..*
2020: 2a 0a 2a 2a 20 44 65 6c 65 74 65 64 20 66 69 6c *.** Deleted fil
2030: 65 73 20 68 61 76 65 20 6d 6c 69 6e 6b 2e 66 69 es have mlink.fi
2040: 64 3d 30 2e 0a 2a 2a 20 41 64 64 65 64 20 66 69 d=0..** Added fi
2050: 6c 65 73 20 68 61 76 65 20 6d 6c 69 6e 6b 2e 70 les have mlink.p
2060: 69 64 3d 30 2e 0a 2a 2a 20 45 64 69 74 65 64 20 id=0..** Edited
2070: 66 69 6c 65 73 20 68 61 76 65 20 62 6f 74 68 20 files have both
2080: 6d 6c 69 6e 6b 2e 70 69 64 21 3d 30 20 61 6e 64 mlink.pid!=0 and
2090: 20 6d 6c 69 6e 6b 2e 66 69 64 21 3d 30 0a 2a 2f mlink.fid!=0.*/
20a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 .static void add
20b0: 5f 6d 6c 69 6e 6b 28 69 6e 74 20 70 69 64 2c 20 _mlink(int pid,
20c0: 4d 61 6e 69 66 65 73 74 20 2a 70 50 61 72 65 6e Manifest *pParen
20d0: 74 2c 20 69 6e 74 20 63 69 64 2c 20 4d 61 6e 69 t, int cid, Mani
20e0: 66 65 73 74 20 2a 70 43 68 69 6c 64 29 7b 0a 20 fest *pChild){.
20f0: 20 4d 61 6e 69 66 65 73 74 20 6f 74 68 65 72 3b Manifest other;
2100: 0a 20 20 42 6c 6f 62 20 6f 74 68 65 72 43 6f 6e . Blob otherCon
2110: 74 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a tent;. int i, j
2120: 3b 0a 0a 20 20 69 66 28 20 64 62 5f 65 78 69 73 ;.. if( db_exis
2130: 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f ts("SELECT 1 FRO
2140: 4d 20 6d 6c 69 6e 6b 20 57 48 45 52 45 20 6d 69 M mlink WHERE mi
2150: 64 3d 25 64 22 2c 20 63 69 64 29 20 29 7b 0a 20 d=%d", cid) ){.
2160: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 return;. }.
2170: 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 assert( pParent
2180: 3d 3d 30 20 7c 7c 20 70 43 68 69 6c 64 3d 3d 30 ==0 || pChild==0
2190: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e );. if( pParen
21a0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 t==0 ){. pPar
21b0: 65 6e 74 20 3d 20 26 6f 74 68 65 72 3b 0a 20 20 ent = &other;.
21c0: 20 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 70 69 content_get(pi
21d0: 64 2c 20 26 6f 74 68 65 72 43 6f 6e 74 65 6e 74 d, &otherContent
21e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 );. }else{.
21f0: 70 43 68 69 6c 64 20 3d 20 26 6f 74 68 65 72 3b pChild = &other;
2200: 0a 20 20 20 20 63 6f 6e 74 65 6e 74 5f 67 65 74 . content_get
2210: 28 63 69 64 2c 20 26 6f 74 68 65 72 43 6f 6e 74 (cid, &otherCont
2220: 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 ent);. }. if(
2230: 62 6c 6f 62 5f 73 69 7a 65 28 26 6f 74 68 65 72 blob_size(&other
2240: 43 6f 6e 74 65 6e 74 29 3d 3d 30 20 29 20 72 65 Content)==0 ) re
2250: 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 61 6e 69 turn;. if( mani
2260: 66 65 73 74 5f 70 61 72 73 65 28 26 6f 74 68 65 fest_parse(&othe
2270: 72 2c 20 26 6f 74 68 65 72 43 6f 6e 74 65 6e 74 r, &otherContent
2280: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 )==0 ) return;.
2290: 20 63 6f 6e 74 65 6e 74 5f 64 65 6c 74 69 66 79 content_deltify
22a0: 28 70 69 64 2c 20 63 69 64 2c 20 30 29 3b 0a 20 (pid, cid, 0);.
22b0: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 70 50 for(i=j=0; i<pP
22c0: 61 72 65 6e 74 2d 3e 6e 46 69 6c 65 20 26 26 20 arent->nFile &&
22d0: 6a 3c 70 43 68 69 6c 64 2d 3e 6e 46 69 6c 65 3b j<pChild->nFile;
22e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 ){. int c =
22f0: 73 74 72 63 6d 70 28 70 50 61 72 65 6e 74 2d 3e strcmp(pParent->
2300: 61 46 69 6c 65 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 aFile[i].zName,
2310: 70 43 68 69 6c 64 2d 3e 61 46 69 6c 65 5b 6a 5d pChild->aFile[j]
2320: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 .zName);. if(
2330: 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 64 c<0 ){. ad
2340: 64 5f 6f 6e 65 5f 6d 6c 69 6e 6b 28 63 69 64 2c d_one_mlink(cid,
2350: 20 70 50 61 72 65 6e 74 2d 3e 61 46 69 6c 65 5b pParent->aFile[
2360: 69 5d 2e 7a 55 75 69 64 2c 20 30 2c 20 70 50 61 i].zUuid, 0, pPa
2370: 72 65 6e 74 2d 3e 61 46 69 6c 65 5b 69 5d 2e 7a rent->aFile[i].z
2380: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 2b 2b Name);. i++
2390: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 ;. }else if(
23a0: 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 c>0 ){. add
23b0: 5f 6f 6e 65 5f 6d 6c 69 6e 6b 28 63 69 64 2c 20 _one_mlink(cid,
23c0: 30 2c 20 70 43 68 69 6c 64 2d 3e 61 46 69 6c 65 0, pChild->aFile
23d0: 5b 6a 5d 2e 7a 55 75 69 64 2c 20 70 43 68 69 6c [j].zUuid, pChil
23e0: 64 2d 3e 61 46 69 6c 65 5b 6a 5d 2e 7a 4e 61 6d d->aFile[j].zNam
23f0: 65 29 3b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 e);. j++;.
2400: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
2410: 69 66 28 20 73 74 72 63 6d 70 28 70 50 61 72 65 if( strcmp(pPare
2420: 6e 74 2d 3e 61 46 69 6c 65 5b 69 5d 2e 7a 55 75 nt->aFile[i].zUu
2430: 69 64 2c 20 70 43 68 69 6c 64 2d 3e 61 46 69 6c id, pChild->aFil
2440: 65 5b 6a 5d 2e 7a 55 75 69 64 29 21 3d 30 20 29 e[j].zUuid)!=0 )
2450: 7b 0a 20 20 20 20 20 20 61 64 64 5f 6f 6e 65 5f {. add_one_
2460: 6d 6c 69 6e 6b 28 63 69 64 2c 20 70 50 61 72 65 mlink(cid, pPare
2470: 6e 74 2d 3e 61 46 69 6c 65 5b 69 5d 2e 7a 55 75 nt->aFile[i].zUu
2480: 69 64 2c 20 70 43 68 69 6c 64 2d 3e 61 46 69 6c id, pChild->aFil
2490: 65 5b 6a 5d 2e 7a 55 75 69 64 2c 20 0a 20 20 20 e[j].zUuid, .
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
24b0: 20 70 43 68 69 6c 64 2d 3e 61 46 69 6c 65 5b 6a pChild->aFile[j
24c0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 ].zName);.
24d0: 7d 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 }. i++;.
24e0: 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 j++;. }.
24f0: 7d 0a 20 20 77 68 69 6c 65 28 20 69 3c 70 50 61 }. while( i<pPa
2500: 72 65 6e 74 2d 3e 6e 46 69 6c 65 20 29 7b 0a 20 rent->nFile ){.
2510: 20 20 20 61 64 64 5f 6f 6e 65 5f 6d 6c 69 6e 6b add_one_mlink
2520: 28 63 69 64 2c 20 70 50 61 72 65 6e 74 2d 3e 61 (cid, pParent->a
2530: 46 69 6c 65 5b 69 5d 2e 7a 55 75 69 64 2c 20 30 File[i].zUuid, 0
2540: 2c 20 70 50 61 72 65 6e 74 2d 3e 61 46 69 6c 65 , pParent->aFile
2550: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 [i].zName);.
2560: 69 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 i++;. }. while
2570: 28 20 6a 3c 70 43 68 69 6c 64 2d 3e 6e 46 69 6c ( j<pChild->nFil
2580: 65 20 29 7b 0a 20 20 20 20 61 64 64 5f 6f 6e 65 e ){. add_one
2590: 5f 6d 6c 69 6e 6b 28 63 69 64 2c 20 30 2c 20 70 _mlink(cid, 0, p
25a0: 43 68 69 6c 64 2d 3e 61 46 69 6c 65 5b 6a 5d 2e Child->aFile[j].
25b0: 7a 55 75 69 64 2c 20 70 43 68 69 6c 64 2d 3e 61 zUuid, pChild->a
25c0: 46 69 6c 65 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a File[j].zName);.
25d0: 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d j++;. }. m
25e0: 61 6e 69 66 65 73 74 5f 63 6c 65 61 72 28 26 6f anifest_clear(&o
25f0: 74 68 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 ther);.}../*.**
2600: 53 63 61 6e 20 72 65 63 6f 72 64 20 72 69 64 2f Scan record rid/
2610: 70 43 6f 6e 74 65 6e 74 20 74 6f 20 73 65 65 20 pContent to see
2620: 69 66 20 69 74 20 69 73 20 61 20 6d 61 6e 69 66 if it is a manif
2630: 65 73 74 2e 20 20 49 66 0a 2a 2a 20 69 74 20 69 est. If.** it i
2640: 73 20 61 20 6d 61 6e 69 66 65 73 74 2c 20 74 68 s a manifest, th
2650: 65 6e 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 en populate the
2660: 6d 6c 69 6e 6b 2c 20 70 6c 69 6e 6b 2c 0a 2a 2a mlink, plink,.**
2670: 20 66 69 6c 65 6e 61 6d 65 2c 20 61 6e 64 20 65 filename, and e
2680: 76 65 6e 74 20 74 61 62 6c 65 73 20 77 69 74 68 vent tables with
2690: 20 63 72 6f 73 73 2d 72 65 66 65 72 65 6e 63 65 cross-reference
26a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f information..*/
26b0: 0a 69 6e 74 20 6d 61 6e 69 66 65 73 74 5f 63 72 .int manifest_cr
26c0: 6f 73 73 6c 69 6e 6b 28 69 6e 74 20 72 69 64 2c osslink(int rid,
26d0: 20 42 6c 6f 62 20 2a 70 43 6f 6e 74 65 6e 74 29 Blob *pContent)
26e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 61 6e {. int i;. Man
26f0: 69 66 65 73 74 20 6d 3b 0a 20 20 53 74 6d 74 20 ifest m;. Stmt
2700: 71 3b 0a 0a 20 20 69 66 28 20 6d 61 6e 69 66 65 q;.. if( manife
2710: 73 74 5f 70 61 72 73 65 28 26 6d 2c 20 70 43 6f st_parse(&m, pCo
2720: 6e 74 65 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20 ntent)==0 ){.
2730: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 return 0;. }.
2740: 20 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 db_begin_transa
2750: 63 74 69 6f 6e 28 29 3b 0a 20 20 69 66 28 20 21 ction();. if( !
2760: 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45 43 db_exists("SELEC
2770: 54 20 31 20 46 52 4f 4d 20 6d 6c 69 6e 6b 20 57 T 1 FROM mlink W
2780: 48 45 52 45 20 6d 69 64 3d 25 64 22 2c 20 72 69 HERE mid=%d", ri
2790: 64 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d d) ){. for(i=
27a0: 30 3b 20 69 3c 6d 2e 6e 50 61 72 65 6e 74 3b 20 0; i<m.nParent;
27b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 i++){. int
27c0: 70 69 64 20 3d 20 75 75 69 64 5f 74 6f 5f 72 69 pid = uuid_to_ri
27d0: 64 28 6d 2e 61 7a 50 61 72 65 6e 74 5b 69 5d 2c d(m.azParent[i],
27e0: 20 31 29 3b 0a 20 20 20 20 20 20 64 62 5f 6d 75 1);. db_mu
27f0: 6c 74 69 5f 65 78 65 63 28 22 49 4e 53 45 52 54 lti_exec("INSERT
2800: 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 OR IGNORE INTO
2810: 70 6c 69 6e 6b 28 70 69 64 2c 20 63 69 64 2c 20 plink(pid, cid,
2820: 69 73 70 72 69 6d 2c 20 6d 74 69 6d 65 29 22 0a isprim, mtime)".
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2840: 20 20 20 20 22 56 41 4c 55 45 53 28 25 64 2c 20 "VALUES(%d,
2850: 25 64 2c 20 25 64 2c 20 25 2e 31 37 67 29 22 2c %d, %d, %.17g)",
2860: 20 70 69 64 2c 20 72 69 64 2c 20 69 3d 3d 30 2c pid, rid, i==0,
2870: 20 6d 2e 72 44 61 74 65 29 3b 0a 20 20 20 20 20 m.rDate);.
2880: 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 if( i==0 ){.
2890: 20 20 20 20 20 61 64 64 5f 6d 6c 69 6e 6b 28 70 add_mlink(p
28a0: 69 64 2c 20 30 2c 20 72 69 64 2c 20 26 6d 29 3b id, 0, rid, &m);
28b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 . }. }.
28c0: 20 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 db_prepare(&q
28d0: 2c 20 22 53 45 4c 45 43 54 20 63 69 64 20 46 52 , "SELECT cid FR
28e0: 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 70 OM plink WHERE p
28f0: 69 64 3d 25 64 20 41 4e 44 20 69 73 70 72 69 6d id=%d AND isprim
2900: 22 2c 20 72 69 64 29 3b 0a 20 20 20 20 77 68 69 ", rid);. whi
2910: 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d le( db_step(&q)=
2920: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 =SQLITE_ROW ){.
2930: 20 20 20 20 20 69 6e 74 20 63 69 64 20 3d 20 64 int cid = d
2940: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c b_column_int(&q,
2950: 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 5f 6d 0);. add_m
2960: 6c 69 6e 6b 28 72 69 64 2c 20 26 6d 2c 20 63 69 link(rid, &m, ci
2970: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 d, 0);. }.
2980: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 db_finalize(&q)
2990: 3b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 ;. db_multi_e
29a0: 78 65 63 28 0a 20 20 20 20 20 20 22 49 4e 53 45 xec(. "INSE
29b0: 52 54 20 49 4e 54 4f 20 65 76 65 6e 74 28 74 79 RT INTO event(ty
29c0: 70 65 2c 6d 74 69 6d 65 2c 6f 62 6a 69 64 2c 75 pe,mtime,objid,u
29d0: 73 65 72 2c 63 6f 6d 6d 65 6e 74 29 22 0a 20 20 ser,comment)".
29e0: 20 20 20 20 22 56 41 4c 55 45 53 28 27 63 69 27 "VALUES('ci'
29f0: 2c 25 2e 31 37 67 2c 25 64 2c 25 51 2c 25 51 29 ,%.17g,%d,%Q,%Q)
2a00: 22 2c 0a 20 20 20 20 20 20 6d 2e 72 44 61 74 65 ",. m.rDate
2a10: 2c 20 72 69 64 2c 20 6d 2e 7a 55 73 65 72 2c 20 , rid, m.zUser,
2a20: 6d 2e 7a 43 6f 6d 6d 65 6e 74 0a 20 20 20 20 29 m.zComment. )
2a30: 3b 0a 20 20 7d 0a 20 20 64 62 5f 65 6e 64 5f 74 ;. }. db_end_t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a 20 ransaction(0);.
2a50: 20 6d 61 6e 69 66 65 73 74 5f 63 6c 65 61 72 28 manifest_clear(
2a60: 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b &m);. return 1;
2a70: 0a 7d 0a .}.