/ Hex Artifact Content
Login

Artifact c4de8f0ad446ce4a49aae11ff7b771cd7af60d7136c0bcfb53da1475b9075e79:


0000: 2f 2a 0a 2a 2a 20 32 30 31 37 2d 31 32 2d 32 36  /*.** 2017-12-26
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
0190: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
01a0: 66 6f 72 20 72 65 61 64 69 6e 67 20 61 6e 64 20  for reading and 
01b0: 77 72 69 74 69 6e 67 20 5a 49 50 20 61 72 63 68  writing ZIP arch
01c0: 69 76 65 0a 2a 2a 20 66 69 6c 65 73 2e 0a 2a 2a  ive.** files..**
01d0: 0a 2a 2a 20 55 73 61 67 65 20 65 78 61 6d 70 6c  .** Usage exampl
01e0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  e:.**.**     SEL
01f0: 45 43 54 20 6e 61 6d 65 2c 20 73 7a 2c 20 64 61  ECT name, sz, da
0200: 74 65 74 69 6d 65 28 6d 74 69 6d 65 2c 27 75 6e  tetime(mtime,'un
0210: 69 78 65 70 6f 63 68 27 29 20 46 52 4f 4d 20 7a  ixepoch') FROM z
0220: 69 70 66 69 6c 65 28 24 66 69 6c 65 6e 61 6d 65  ipfile($filename
0230: 29 3b 0a 2a 2a 0a 2a 2a 20 43 75 72 72 65 6e 74  );.**.** Current
0240: 20 6c 69 6d 69 74 61 74 69 6f 6e 73 3a 0a 2a 2a   limitations:.**
0250: 0a 2a 2a 20 20 20 20 2a 20 20 4e 6f 20 73 75 70  .**    *  No sup
0260: 70 6f 72 74 20 66 6f 72 20 65 6e 63 72 79 70 74  port for encrypt
0270: 69 6f 6e 0a 2a 2a 20 20 20 20 2a 20 20 4e 6f 20  ion.**    *  No 
0280: 73 75 70 70 6f 72 74 20 66 6f 72 20 5a 49 50 20  support for ZIP 
0290: 61 72 63 68 69 76 65 73 20 73 70 61 6e 6e 69 6e  archives spannin
02a0: 67 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 73  g multiple files
02b0: 0a 2a 2a 20 20 20 20 2a 20 20 4e 6f 20 73 75 70  .**    *  No sup
02c0: 70 6f 72 74 20 66 6f 72 20 7a 69 70 36 34 20 65  port for zip64 e
02d0: 78 74 65 6e 73 69 6f 6e 73 0a 2a 2a 20 20 20 20  xtensions.**    
02e0: 2a 20 20 4f 6e 6c 79 20 74 68 65 20 22 69 6e 66  *  Only the "inf
02f0: 6c 61 74 65 2f 64 65 66 6c 61 74 65 22 20 28 7a  late/deflate" (z
0300: 6c 69 62 29 20 63 6f 6d 70 72 65 73 73 69 6f 6e  lib) compression
0310: 20 6d 65 74 68 6f 64 20 69 73 20 73 75 70 70 6f   method is suppo
0320: 72 74 65 64 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  rted.*/.#include
0330: 20 22 73 71 6c 69 74 65 33 65 78 74 2e 68 22 0a   "sqlite3ext.h".
0340: 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e  SQLITE_EXTENSION
0350: 5f 49 4e 49 54 31 0a 23 69 6e 63 6c 75 64 65 20  _INIT1.#include 
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69  de <string.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
0390: 3e 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 7a 6c 69  >..#include <zli
03a0: 62 2e 68 3e 0a 0a 23 69 66 6e 64 65 66 20 53 51  b.h>..#ifndef SQ
03b0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
03c0: 4c 54 41 42 4c 45 0a 0a 23 69 66 6e 64 65 66 20  LTABLE..#ifndef 
03d0: 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54  SQLITE_AMALGAMAT
03e0: 49 4f 4e 0a 0a 74 79 70 65 64 65 66 20 73 71 6c  ION..typedef sql
03f0: 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34 3b 0a  ite3_int64 i64;.
0400: 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64  typedef unsigned
0410: 20 63 68 61 72 20 75 38 3b 0a 74 79 70 65 64 65   char u8;.typede
0420: 66 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74  f unsigned short
0430: 20 75 31 36 3b 0a 74 79 70 65 64 65 66 20 75 6e   u16;.typedef un
0440: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 75 33 32 3b  signed long u32;
0450: 0a 23 64 65 66 69 6e 65 20 4d 49 4e 28 61 2c 62  .#define MIN(a,b
0460: 29 20 28 28 61 29 3c 28 62 29 20 3f 20 28 61 29  ) ((a)<(b) ? (a)
0470: 20 3a 20 28 62 29 29 0a 0a 23 69 66 20 64 65 66   : (b))..#if def
0480: 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45  ined(SQLITE_COVE
0490: 52 41 47 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  RAGE_TEST) || de
04a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 55 54  fined(SQLITE_MUT
04b0: 41 54 49 4f 4e 5f 54 45 53 54 29 0a 23 20 64 65  ATION_TEST).# de
04c0: 66 69 6e 65 20 41 4c 57 41 59 53 28 58 29 20 20  fine ALWAYS(X)  
04d0: 20 20 20 20 28 31 29 0a 23 20 64 65 66 69 6e 65      (1).# define
04e0: 20 4e 45 56 45 52 28 58 29 20 20 20 20 20 20 20   NEVER(X)       
04f0: 28 30 29 0a 23 65 6c 69 66 20 21 64 65 66 69 6e  (0).#elif !defin
0500: 65 64 28 4e 44 45 42 55 47 29 0a 23 20 64 65 66  ed(NDEBUG).# def
0510: 69 6e 65 20 41 4c 57 41 59 53 28 58 29 20 20 20  ine ALWAYS(X)   
0520: 20 20 20 28 28 58 29 3f 31 3a 28 61 73 73 65 72     ((X)?1:(asser
0530: 74 28 30 29 2c 30 29 29 0a 23 20 64 65 66 69 6e  t(0),0)).# defin
0540: 65 20 4e 45 56 45 52 28 58 29 20 20 20 20 20 20  e NEVER(X)      
0550: 20 28 28 58 29 3f 28 61 73 73 65 72 74 28 30 29   ((X)?(assert(0)
0560: 2c 31 29 3a 30 29 0a 23 65 6c 73 65 0a 23 20 64  ,1):0).#else.# d
0570: 65 66 69 6e 65 20 41 4c 57 41 59 53 28 58 29 20  efine ALWAYS(X) 
0580: 20 20 20 20 20 28 58 29 0a 23 20 64 65 66 69 6e       (X).# defin
0590: 65 20 4e 45 56 45 52 28 58 29 20 20 20 20 20 20  e NEVER(X)      
05a0: 20 28 58 29 0a 23 65 6e 64 69 66 0a 0a 23 65 6e   (X).#endif..#en
05b0: 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  dif   /* SQLITE_
05c0: 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 20 2a 2f 0a  AMALGAMATION */.
05d0: 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f  ./*.** Definitio
05e0: 6e 73 20 66 6f 72 20 6d 6f 64 65 20 62 69 74 6d  ns for mode bitm
05f0: 61 73 6b 73 20 53 5f 49 46 44 49 52 2c 20 53 5f  asks S_IFDIR, S_
0600: 49 46 52 45 47 20 61 6e 64 20 53 5f 49 46 4c 4e  IFREG and S_IFLN
0610: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 73 6f 6d 65  K..**.** In some
0620: 20 77 61 79 73 20 69 74 20 77 6f 75 6c 64 20 62   ways it would b
0630: 65 20 62 65 74 74 65 72 20 74 6f 20 6f 62 74 61  e better to obta
0640: 69 6e 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  in these values 
0650: 66 72 6f 6d 20 73 79 73 74 65 6d 20 0a 2a 2a 20  from system .** 
0660: 68 65 61 64 65 72 20 66 69 6c 65 73 2e 20 42 75  header files. Bu
0670: 74 2c 20 74 68 65 20 64 65 70 65 6e 64 65 6e 63  t, the dependenc
0680: 79 20 69 73 20 75 6e 64 65 73 69 72 61 62 6c 65  y is undesirable
0690: 20 61 6e 64 20 28 61 29 20 74 68 65 73 65 0a 2a   and (a) these.*
06a0: 2a 20 68 61 76 65 20 62 65 65 6e 20 73 74 61 62  * have been stab
06b0: 6c 65 20 66 6f 72 20 64 65 63 61 64 65 73 2c 20  le for decades, 
06c0: 28 62 29 20 74 68 65 20 76 61 6c 75 65 73 20 61  (b) the values a
06d0: 72 65 20 70 61 72 74 20 6f 66 20 50 4f 53 49 58  re part of POSIX
06e0: 20 61 6e 64 0a 2a 2a 20 61 72 65 20 61 6c 73 6f   and.** are also
06f0: 20 6d 61 64 65 20 65 78 70 6c 69 63 69 74 20 69   made explicit i
0700: 6e 20 5b 6d 61 6e 20 73 74 61 74 5d 2c 20 61 6e  n [man stat], an
0710: 64 20 28 63 29 20 61 72 65 20 70 61 72 74 20 6f  d (c) are part o
0720: 66 20 74 68 65 20 0a 2a 2a 20 66 69 6c 65 20 66  f the .** file f
0730: 6f 72 6d 61 74 20 66 6f 72 20 7a 69 70 20 61 72  ormat for zip ar
0740: 63 68 69 76 65 73 2e 0a 2a 2f 0a 23 69 66 6e 64  chives..*/.#ifnd
0750: 65 66 20 53 5f 49 46 44 49 52 0a 23 20 64 65 66  ef S_IFDIR.# def
0760: 69 6e 65 20 53 5f 49 46 44 49 52 20 30 30 34 30  ine S_IFDIR 0040
0770: 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  000.#endif.#ifnd
0780: 65 66 20 53 5f 49 46 52 45 47 0a 23 20 64 65 66  ef S_IFREG.# def
0790: 69 6e 65 20 53 5f 49 46 52 45 47 20 30 31 30 30  ine S_IFREG 0100
07a0: 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  000.#endif.#ifnd
07b0: 65 66 20 53 5f 49 46 4c 4e 4b 0a 23 20 64 65 66  ef S_IFLNK.# def
07c0: 69 6e 65 20 53 5f 49 46 4c 4e 4b 20 30 31 32 30  ine S_IFLNK 0120
07d0: 30 30 30 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74  000.#endif..stat
07e0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 5a 49  ic const char ZI
07f0: 50 46 49 4c 45 5f 53 43 48 45 4d 41 5b 5d 20 3d  PFILE_SCHEMA[] =
0800: 20 0a 20 20 22 43 52 45 41 54 45 20 54 41 42 4c   .  "CREATE TABL
0810: 45 20 79 28 22 0a 20 20 20 20 22 6e 61 6d 65 20  E y(".    "name 
0820: 50 52 49 4d 41 52 59 20 4b 45 59 2c 22 20 20 2f  PRIMARY KEY,"  /
0830: 2a 20 30 3a 20 4e 61 6d 65 20 6f 66 20 66 69 6c  * 0: Name of fil
0840: 65 20 69 6e 20 7a 69 70 20 61 72 63 68 69 76 65  e in zip archive
0850: 20 2a 2f 0a 20 20 20 20 22 6d 6f 64 65 2c 22 20   */.    "mode," 
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0870: 31 3a 20 50 4f 53 49 58 20 6d 6f 64 65 20 66 6f  1: POSIX mode fo
0880: 72 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 22 6d  r file */.    "m
0890: 74 69 6d 65 2c 22 20 20 20 20 20 20 20 20 20 20  time,"          
08a0: 20 20 20 2f 2a 20 32 3a 20 4c 61 73 74 20 6d 6f     /* 2: Last mo
08b0: 64 69 66 69 63 61 74 69 6f 6e 20 74 69 6d 65 20  dification time 
08c0: 28 73 65 63 73 20 73 69 6e 63 65 20 31 39 37 30  (secs since 1970
08d0: 29 2a 2f 0a 20 20 20 20 22 73 7a 2c 22 20 20 20  )*/.    "sz,"   
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
08f0: 33 3a 20 53 69 7a 65 20 6f 66 20 6f 62 6a 65 63  3: Size of objec
0900: 74 20 2a 2f 0a 20 20 20 20 22 72 61 77 64 61 74  t */.    "rawdat
0910: 61 2c 22 20 20 20 20 20 20 20 20 20 20 20 2f 2a  a,"           /*
0920: 20 34 3a 20 52 61 77 20 64 61 74 61 20 2a 2f 0a   4: Raw data */.
0930: 20 20 20 20 22 64 61 74 61 2c 22 20 20 20 20 20      "data,"     
0940: 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 55           /* 5: U
0950: 6e 63 6f 6d 70 72 65 73 73 65 64 20 64 61 74 61  ncompressed data
0960: 20 2a 2f 0a 20 20 20 20 22 6d 65 74 68 6f 64 2c   */.    "method,
0970: 22 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  "            /* 
0980: 36 3a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 6d  6: Compression m
0990: 65 74 68 6f 64 20 28 69 6e 74 65 67 65 72 29 20  ethod (integer) 
09a0: 2a 2f 0a 20 20 20 20 22 7a 20 48 49 44 44 45 4e  */.    "z HIDDEN
09b0: 22 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37  "           /* 7
09c0: 3a 20 4e 61 6d 65 20 6f 66 20 7a 69 70 20 66 69  : Name of zip fi
09d0: 6c 65 20 2a 2f 0a 20 20 22 29 20 57 49 54 48 4f  le */.  ") WITHO
09e0: 55 54 20 52 4f 57 49 44 3b 22 3b 0a 0a 23 64 65  UT ROWID;";..#de
09f0: 66 69 6e 65 20 5a 49 50 46 49 4c 45 5f 46 5f 43  fine ZIPFILE_F_C
0a00: 4f 4c 55 4d 4e 5f 49 44 58 20 37 20 20 20 20 2f  OLUMN_IDX 7    /
0a10: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
0a20: 6e 20 22 66 69 6c 65 22 20 69 6e 20 74 68 65 20  n "file" in the 
0a30: 61 62 6f 76 65 20 2a 2f 0a 23 64 65 66 69 6e 65  above */.#define
0a40: 20 5a 49 50 46 49 4c 45 5f 42 55 46 46 45 52 5f   ZIPFILE_BUFFER_
0a50: 53 49 5a 45 20 28 36 34 2a 31 30 32 34 29 0a 0a  SIZE (64*1024)..
0a60: 0a 2f 2a 0a 2a 2a 20 4d 61 67 69 63 20 6e 75 6d  ./*.** Magic num
0a70: 62 65 72 73 20 75 73 65 64 20 74 6f 20 72 65 61  bers used to rea
0a80: 64 20 61 6e 64 20 77 72 69 74 65 20 7a 69 70 20  d and write zip 
0a90: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 5a 49 50  files..**.** ZIP
0aa0: 46 49 4c 45 5f 4e 45 57 45 4e 54 52 59 5f 4d 41  FILE_NEWENTRY_MA
0ab0: 44 45 42 59 3a 0a 2a 2a 20 20 20 55 73 65 20 74  DEBY:.**   Use t
0ac0: 68 69 73 20 76 61 6c 75 65 20 66 6f 72 20 74 68  his value for th
0ad0: 65 20 22 76 65 72 73 69 6f 6e 2d 6d 61 64 65 2d  e "version-made-
0ae0: 62 79 22 20 66 69 65 6c 64 20 69 6e 20 6e 65 77  by" field in new
0af0: 20 7a 69 70 20 66 69 6c 65 0a 2a 2a 20 20 20 65   zip file.**   e
0b00: 6e 74 72 69 65 73 2e 20 54 68 65 20 75 70 70 65  ntries. The uppe
0b10: 72 20 62 79 74 65 20 69 6e 64 69 63 61 74 65 73  r byte indicates
0b20: 20 22 75 6e 69 78 22 2c 20 61 6e 64 20 74 68 65   "unix", and the
0b30: 20 6c 6f 77 65 72 20 62 79 74 65 20 0a 2a 2a 20   lower byte .** 
0b40: 20 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74    indicates that
0b50: 20 74 68 65 20 7a 69 70 20 66 69 6c 65 20 6d 61   the zip file ma
0b60: 74 63 68 65 73 20 70 6b 7a 69 70 20 73 70 65 63  tches pkzip spec
0b70: 69 66 69 63 61 74 69 6f 6e 20 33 2e 30 2e 20 0a  ification 3.0. .
0b80: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 77 68 61  **   This is wha
0b90: 74 20 69 6e 66 6f 2d 7a 69 70 20 73 65 65 6d 73  t info-zip seems
0ba0: 20 74 6f 20 64 6f 2e 0a 2a 2a 0a 2a 2a 20 5a 49   to do..**.** ZI
0bb0: 50 46 49 4c 45 5f 4e 45 57 45 4e 54 52 59 5f 52  PFILE_NEWENTRY_R
0bc0: 45 51 55 49 52 45 44 3a 0a 2a 2a 20 20 20 56 61  EQUIRED:.**   Va
0bd0: 6c 75 65 20 66 6f 72 20 22 76 65 72 73 69 6f 6e  lue for "version
0be0: 2d 72 65 71 75 69 72 65 64 2d 74 6f 2d 65 78 74  -required-to-ext
0bf0: 72 61 63 74 22 20 66 69 65 6c 64 20 6f 66 20 6e  ract" field of n
0c00: 65 77 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 20 20  ew entries..**  
0c10: 20 56 65 72 73 69 6f 6e 20 32 2e 30 20 69 73 20   Version 2.0 is 
0c20: 72 65 71 75 69 72 65 64 20 74 6f 20 73 75 70 70  required to supp
0c30: 6f 72 74 20 66 6f 6c 64 65 72 73 20 61 6e 64 20  ort folders and 
0c40: 64 65 66 6c 61 74 65 20 63 6f 6d 70 72 65 73 73  deflate compress
0c50: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 5a 49 50 46 49  ion..**.** ZIPFI
0c60: 4c 45 5f 4e 45 57 45 4e 54 52 59 5f 46 4c 41 47  LE_NEWENTRY_FLAG
0c70: 53 3a 0a 2a 2a 20 20 20 56 61 6c 75 65 20 66 6f  S:.**   Value fo
0c80: 72 20 22 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f  r "general-purpo
0c90: 73 65 2d 62 69 74 2d 66 6c 61 67 73 22 20 66 69  se-bit-flags" fi
0ca0: 65 6c 64 20 6f 66 20 6e 65 77 20 65 6e 74 72 69  eld of new entri
0cb0: 65 73 2e 20 42 69 74 0a 2a 2a 20 20 20 31 31 20  es. Bit.**   11 
0cc0: 6d 65 61 6e 73 20 22 75 74 66 2d 38 20 66 69 6c  means "utf-8 fil
0cd0: 65 6e 61 6d 65 20 61 6e 64 20 63 6f 6d 6d 65 6e  ename and commen
0ce0: 74 22 2e 0a 2a 2a 0a 2a 2a 20 5a 49 50 46 49 4c  t"..**.** ZIPFIL
0cf0: 45 5f 53 49 47 4e 41 54 55 52 45 5f 43 44 53 3a  E_SIGNATURE_CDS:
0d00: 0a 2a 2a 20 20 20 46 69 72 73 74 20 34 20 62 79  .**   First 4 by
0d10: 74 65 73 20 6f 66 20 61 20 76 61 6c 69 64 20 43  tes of a valid C
0d20: 44 53 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  DS record..**.**
0d30: 20 5a 49 50 46 49 4c 45 5f 53 49 47 4e 41 54 55   ZIPFILE_SIGNATU
0d40: 52 45 5f 4c 46 48 3a 0a 2a 2a 20 20 20 46 69 72  RE_LFH:.**   Fir
0d50: 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 61 20  st 4 bytes of a 
0d60: 76 61 6c 69 64 20 4c 46 48 20 72 65 63 6f 72 64  valid LFH record
0d70: 2e 0a 2a 2a 0a 2a 2a 20 5a 49 50 46 49 4c 45 5f  ..**.** ZIPFILE_
0d80: 53 49 47 4e 41 54 55 52 45 5f 45 4f 43 44 0a 2a  SIGNATURE_EOCD.*
0d90: 2a 20 20 20 46 69 72 73 74 20 34 20 62 79 74 65  *   First 4 byte
0da0: 73 20 6f 66 20 61 20 76 61 6c 69 64 20 45 4f 43  s of a valid EOC
0db0: 44 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 23 64 65  D record..*/.#de
0dc0: 66 69 6e 65 20 5a 49 50 46 49 4c 45 5f 45 58 54  fine ZIPFILE_EXT
0dd0: 52 41 5f 54 49 4d 45 53 54 41 4d 50 20 20 20 30  RA_TIMESTAMP   0
0de0: 78 35 34 35 35 0a 23 64 65 66 69 6e 65 20 5a 49  x5455.#define ZI
0df0: 50 46 49 4c 45 5f 4e 45 57 45 4e 54 52 59 5f 4d  PFILE_NEWENTRY_M
0e00: 41 44 45 42 59 20 20 20 28 28 33 3c 3c 38 29 20  ADEBY   ((3<<8) 
0e10: 2b 20 33 30 29 0a 23 64 65 66 69 6e 65 20 5a 49  + 30).#define ZI
0e20: 50 46 49 4c 45 5f 4e 45 57 45 4e 54 52 59 5f 52  PFILE_NEWENTRY_R
0e30: 45 51 55 49 52 45 44 20 32 30 0a 23 64 65 66 69  EQUIRED 20.#defi
0e40: 6e 65 20 5a 49 50 46 49 4c 45 5f 4e 45 57 45 4e  ne ZIPFILE_NEWEN
0e50: 54 52 59 5f 46 4c 41 47 53 20 20 20 20 30 78 38  TRY_FLAGS    0x8
0e60: 30 30 0a 23 64 65 66 69 6e 65 20 5a 49 50 46 49  00.#define ZIPFI
0e70: 4c 45 5f 53 49 47 4e 41 54 55 52 45 5f 43 44 53  LE_SIGNATURE_CDS
0e80: 20 20 20 20 20 30 78 30 32 30 31 34 62 35 30 0a       0x02014b50.
0e90: 23 64 65 66 69 6e 65 20 5a 49 50 46 49 4c 45 5f  #define ZIPFILE_
0ea0: 53 49 47 4e 41 54 55 52 45 5f 4c 46 48 20 20 20  SIGNATURE_LFH   
0eb0: 20 20 30 78 30 34 30 33 34 62 35 30 0a 23 64 65    0x04034b50.#de
0ec0: 66 69 6e 65 20 5a 49 50 46 49 4c 45 5f 53 49 47  fine ZIPFILE_SIG
0ed0: 4e 41 54 55 52 45 5f 45 4f 43 44 20 20 20 20 30  NATURE_EOCD    0
0ee0: 78 30 36 30 35 34 62 35 30 0a 0a 2f 2a 0a 2a 2a  x06054b50../*.**
0ef0: 20 54 68 65 20 73 69 7a 65 73 20 6f 66 20 74 68   The sizes of th
0f00: 65 20 66 69 78 65 64 2d 73 69 7a 65 20 70 61 72  e fixed-size par
0f10: 74 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65  t of each of the
0f20: 20 74 68 72 65 65 20 6d 61 69 6e 20 64 61 74 61   three main data
0f30: 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20   .** structures 
0f40: 69 6e 20 61 20 7a 69 70 20 61 72 63 68 69 76 65  in a zip archive
0f50: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5a 49 50  ..*/.#define ZIP
0f60: 46 49 4c 45 5f 4c 46 48 5f 46 49 58 45 44 5f 53  FILE_LFH_FIXED_S
0f70: 5a 20 20 20 20 20 20 33 30 0a 23 64 65 66 69 6e  Z      30.#defin
0f80: 65 20 5a 49 50 46 49 4c 45 5f 45 4f 43 44 5f 46  e ZIPFILE_EOCD_F
0f90: 49 58 45 44 5f 53 5a 20 20 20 20 20 32 32 0a 23  IXED_SZ     22.#
0fa0: 64 65 66 69 6e 65 20 5a 49 50 46 49 4c 45 5f 43  define ZIPFILE_C
0fb0: 44 53 5f 46 49 58 45 44 5f 53 5a 20 20 20 20 20  DS_FIXED_SZ     
0fc0: 20 34 36 0a 0a 2f 2a 0a 2a 2a 2a 20 34 2e 33 2e   46../*.*** 4.3.
0fd0: 31 36 20 20 45 6e 64 20 6f 66 20 63 65 6e 74 72  16  End of centr
0fe0: 61 6c 20 64 69 72 65 63 74 6f 72 79 20 72 65 63  al directory rec
0ff0: 6f 72 64 3a 0a 2a 2a 2a 0a 2a 2a 2a 20 20 20 65  ord:.***.***   e
1000: 6e 64 20 6f 66 20 63 65 6e 74 72 61 6c 20 64 69  nd of central di
1010: 72 20 73 69 67 6e 61 74 75 72 65 20 20 20 20 34  r signature    4
1020: 20 62 79 74 65 73 20 20 28 30 78 30 36 30 35 34   bytes  (0x06054
1030: 62 35 30 29 0a 2a 2a 2a 20 20 20 6e 75 6d 62 65  b50).***   numbe
1040: 72 20 6f 66 20 74 68 69 73 20 64 69 73 6b 20 20  r of this disk  
1050: 20 20 20 20 20 20 20 20 20 20 20 32 20 62 79 74             2 byt
1060: 65 73 0a 2a 2a 2a 20 20 20 6e 75 6d 62 65 72 20  es.***   number 
1070: 6f 66 20 74 68 65 20 64 69 73 6b 20 77 69 74 68  of the disk with
1080: 20 74 68 65 0a 2a 2a 2a 20 20 20 73 74 61 72 74   the.***   start
1090: 20 6f 66 20 74 68 65 20 63 65 6e 74 72 61 6c 20   of the central 
10a0: 64 69 72 65 63 74 6f 72 79 20 20 32 20 62 79 74  directory  2 byt
10b0: 65 73 0a 2a 2a 2a 20 20 20 74 6f 74 61 6c 20 6e  es.***   total n
10c0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
10d0: 20 69 6e 20 74 68 65 0a 2a 2a 2a 20 20 20 63 65   in the.***   ce
10e0: 6e 74 72 61 6c 20 64 69 72 65 63 74 6f 72 79 20  ntral directory 
10f0: 6f 6e 20 74 68 69 73 20 64 69 73 6b 20 20 32 20  on this disk  2 
1100: 62 79 74 65 73 0a 2a 2a 2a 20 20 20 74 6f 74 61  bytes.***   tota
1110: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  l number of entr
1120: 69 65 73 20 69 6e 0a 2a 2a 2a 20 20 20 74 68 65  ies in.***   the
1130: 20 63 65 6e 74 72 61 6c 20 64 69 72 65 63 74 6f   central directo
1140: 72 79 20 20 20 20 20 20 20 20 20 20 20 32 20 62  ry           2 b
1150: 79 74 65 73 0a 2a 2a 2a 20 20 20 73 69 7a 65 20  ytes.***   size 
1160: 6f 66 20 74 68 65 20 63 65 6e 74 72 61 6c 20 64  of the central d
1170: 69 72 65 63 74 6f 72 79 20 20 20 34 20 62 79 74  irectory   4 byt
1180: 65 73 0a 2a 2a 2a 20 20 20 6f 66 66 73 65 74 20  es.***   offset 
1190: 6f 66 20 73 74 61 72 74 20 6f 66 20 63 65 6e 74  of start of cent
11a0: 72 61 6c 0a 2a 2a 2a 20 20 20 64 69 72 65 63 74  ral.***   direct
11b0: 6f 72 79 20 77 69 74 68 20 72 65 73 70 65 63 74  ory with respect
11c0: 20 74 6f 0a 2a 2a 2a 20 20 20 74 68 65 20 73 74   to.***   the st
11d0: 61 72 74 69 6e 67 20 64 69 73 6b 20 6e 75 6d 62  arting disk numb
11e0: 65 72 20 20 20 20 20 20 20 20 34 20 62 79 74 65  er        4 byte
11f0: 73 0a 2a 2a 2a 20 20 20 2e 5a 49 50 20 66 69 6c  s.***   .ZIP fil
1200: 65 20 63 6f 6d 6d 65 6e 74 20 6c 65 6e 67 74 68  e comment length
1210: 20 20 20 20 20 20 20 20 32 20 62 79 74 65 73 0a          2 bytes.
1220: 2a 2a 2a 20 20 20 2e 5a 49 50 20 66 69 6c 65 20  ***   .ZIP file 
1230: 63 6f 6d 6d 65 6e 74 20 20 20 20 20 20 20 28 76  comment       (v
1240: 61 72 69 61 62 6c 65 20 73 69 7a 65 29 0a 2a 2f  ariable size).*/
1250: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1260: 5a 69 70 66 69 6c 65 45 4f 43 44 20 5a 69 70 66  ZipfileEOCD Zipf
1270: 69 6c 65 45 4f 43 44 3b 0a 73 74 72 75 63 74 20  ileEOCD;.struct 
1280: 5a 69 70 66 69 6c 65 45 4f 43 44 20 7b 0a 20 20  ZipfileEOCD {.  
1290: 75 31 36 20 69 44 69 73 6b 3b 0a 20 20 75 31 36  u16 iDisk;.  u16
12a0: 20 69 46 69 72 73 74 44 69 73 6b 3b 0a 20 20 75   iFirstDisk;.  u
12b0: 31 36 20 6e 45 6e 74 72 79 3b 0a 20 20 75 31 36  16 nEntry;.  u16
12c0: 20 6e 45 6e 74 72 79 54 6f 74 61 6c 3b 0a 20 20   nEntryTotal;.  
12d0: 75 33 32 20 6e 53 69 7a 65 3b 0a 20 20 75 33 32  u32 nSize;.  u32
12e0: 20 69 4f 66 66 73 65 74 3b 0a 7d 3b 0a 0a 2f 2a   iOffset;.};../*
12f0: 0a 2a 2a 2a 20 34 2e 33 2e 31 32 20 20 43 65 6e  .*** 4.3.12  Cen
1300: 74 72 61 6c 20 64 69 72 65 63 74 6f 72 79 20 73  tral directory s
1310: 74 72 75 63 74 75 72 65 3a 0a 2a 2a 2a 0a 2a 2a  tructure:.***.**
1320: 2a 20 2e 2e 2e 0a 2a 2a 2a 0a 2a 2a 2a 20 20 20  * ....***.***   
1330: 63 65 6e 74 72 61 6c 20 66 69 6c 65 20 68 65 61  central file hea
1340: 64 65 72 20 73 69 67 6e 61 74 75 72 65 20 20 20  der signature   
1350: 34 20 62 79 74 65 73 20 20 28 30 78 30 32 30 31  4 bytes  (0x0201
1360: 34 62 35 30 29 0a 2a 2a 2a 20 20 20 76 65 72 73  4b50).***   vers
1370: 69 6f 6e 20 6d 61 64 65 20 62 79 20 20 20 20 20  ion made by     
1380: 20 20 20 20 20 20 20 20 20 20 20 20 32 20 62 79              2 by
1390: 74 65 73 0a 2a 2a 2a 20 20 20 76 65 72 73 69 6f  tes.***   versio
13a0: 6e 20 6e 65 65 64 65 64 20 74 6f 20 65 78 74 72  n needed to extr
13b0: 61 63 74 20 20 20 20 20 20 20 32 20 62 79 74 65  act       2 byte
13c0: 73 0a 2a 2a 2a 20 20 20 67 65 6e 65 72 61 6c 20  s.***   general 
13d0: 70 75 72 70 6f 73 65 20 62 69 74 20 66 6c 61 67  purpose bit flag
13e0: 20 20 20 20 20 20 20 20 32 20 62 79 74 65 73 0a          2 bytes.
13f0: 2a 2a 2a 20 20 20 63 6f 6d 70 72 65 73 73 69 6f  ***   compressio
1400: 6e 20 6d 65 74 68 6f 64 20 20 20 20 20 20 20 20  n method        
1410: 20 20 20 20 20 20 32 20 62 79 74 65 73 0a 2a 2a        2 bytes.**
1420: 2a 20 20 20 6c 61 73 74 20 6d 6f 64 20 66 69 6c  *   last mod fil
1430: 65 20 74 69 6d 65 20 20 20 20 20 20 20 20 20 20  e time          
1440: 20 20 20 20 32 20 62 79 74 65 73 0a 2a 2a 2a 20      2 bytes.*** 
1450: 20 20 6c 61 73 74 20 6d 6f 64 20 66 69 6c 65 20    last mod file 
1460: 64 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20  date            
1470: 20 20 32 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20    2 bytes.***   
1480: 63 72 63 2d 33 32 20 20 20 20 20 20 20 20 20 20  crc-32          
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 34 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20 63 6f  4 bytes.***   co
14b0: 6d 70 72 65 73 73 65 64 20 73 69 7a 65 20 20 20  mpressed size   
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
14d0: 62 79 74 65 73 0a 2a 2a 2a 20 20 20 75 6e 63 6f  bytes.***   unco
14e0: 6d 70 72 65 73 73 65 64 20 73 69 7a 65 20 20 20  mpressed size   
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 34 20 62 79              4 by
1500: 74 65 73 0a 2a 2a 2a 20 20 20 66 69 6c 65 20 6e  tes.***   file n
1510: 61 6d 65 20 6c 65 6e 67 74 68 20 20 20 20 20 20  ame length      
1520: 20 20 20 20 20 20 20 20 20 20 32 20 62 79 74 65            2 byte
1530: 73 0a 2a 2a 2a 20 20 20 65 78 74 72 61 20 66 69  s.***   extra fi
1540: 65 6c 64 20 6c 65 6e 67 74 68 20 20 20 20 20 20  eld length      
1550: 20 20 20 20 20 20 20 20 32 20 62 79 74 65 73 0a          2 bytes.
1560: 2a 2a 2a 20 20 20 66 69 6c 65 20 63 6f 6d 6d 65  ***   file comme
1570: 6e 74 20 6c 65 6e 67 74 68 20 20 20 20 20 20 20  nt length       
1580: 20 20 20 20 20 20 32 20 62 79 74 65 73 0a 2a 2a        2 bytes.**
1590: 2a 20 20 20 64 69 73 6b 20 6e 75 6d 62 65 72 20  *   disk number 
15a0: 73 74 61 72 74 20 20 20 20 20 20 20 20 20 20 20  start           
15b0: 20 20 20 20 32 20 62 79 74 65 73 0a 2a 2a 2a 20      2 bytes.*** 
15c0: 20 20 69 6e 74 65 72 6e 61 6c 20 66 69 6c 65 20    internal file 
15d0: 61 74 74 72 69 62 75 74 65 73 20 20 20 20 20 20  attributes      
15e0: 20 20 32 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20    2 bytes.***   
15f0: 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 61 74  external file at
1600: 74 72 69 62 75 74 65 73 20 20 20 20 20 20 20 20  tributes        
1610: 34 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20 72 65  4 bytes.***   re
1620: 6c 61 74 69 76 65 20 6f 66 66 73 65 74 20 6f 66  lative offset of
1630: 20 6c 6f 63 61 6c 20 68 65 61 64 65 72 20 34 20   local header 4 
1640: 62 79 74 65 73 0a 2a 2f 0a 74 79 70 65 64 65 66  bytes.*/.typedef
1650: 20 73 74 72 75 63 74 20 5a 69 70 66 69 6c 65 43   struct ZipfileC
1660: 44 53 20 5a 69 70 66 69 6c 65 43 44 53 3b 0a 73  DS ZipfileCDS;.s
1670: 74 72 75 63 74 20 5a 69 70 66 69 6c 65 43 44 53  truct ZipfileCDS
1680: 20 7b 0a 20 20 75 31 36 20 69 56 65 72 73 69 6f   {.  u16 iVersio
1690: 6e 4d 61 64 65 42 79 3b 0a 20 20 75 31 36 20 69  nMadeBy;.  u16 i
16a0: 56 65 72 73 69 6f 6e 45 78 74 72 61 63 74 3b 0a  VersionExtract;.
16b0: 20 20 75 31 36 20 66 6c 61 67 73 3b 0a 20 20 75    u16 flags;.  u
16c0: 31 36 20 69 43 6f 6d 70 72 65 73 73 69 6f 6e 3b  16 iCompression;
16d0: 0a 20 20 75 31 36 20 6d 54 69 6d 65 3b 0a 20 20  .  u16 mTime;.  
16e0: 75 31 36 20 6d 44 61 74 65 3b 0a 20 20 75 33 32  u16 mDate;.  u32
16f0: 20 63 72 63 33 32 3b 0a 20 20 75 33 32 20 73 7a   crc32;.  u32 sz
1700: 43 6f 6d 70 72 65 73 73 65 64 3b 0a 20 20 75 33  Compressed;.  u3
1710: 32 20 73 7a 55 6e 63 6f 6d 70 72 65 73 73 65 64  2 szUncompressed
1720: 3b 0a 20 20 75 31 36 20 6e 46 69 6c 65 3b 0a 20  ;.  u16 nFile;. 
1730: 20 75 31 36 20 6e 45 78 74 72 61 3b 0a 20 20 75   u16 nExtra;.  u
1740: 31 36 20 6e 43 6f 6d 6d 65 6e 74 3b 0a 20 20 75  16 nComment;.  u
1750: 31 36 20 69 44 69 73 6b 53 74 61 72 74 3b 0a 20  16 iDiskStart;. 
1760: 20 75 31 36 20 69 49 6e 74 65 72 6e 61 6c 41 74   u16 iInternalAt
1770: 74 72 3b 0a 20 20 75 33 32 20 69 45 78 74 65 72  tr;.  u32 iExter
1780: 6e 61 6c 41 74 74 72 3b 0a 20 20 75 33 32 20 69  nalAttr;.  u32 i
1790: 4f 66 66 73 65 74 3b 0a 20 20 63 68 61 72 20 2a  Offset;.  char *
17a0: 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  zFile;          
17b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
17c0: 65 6e 61 6d 65 20 28 73 71 6c 69 74 65 33 5f 6d  ename (sqlite3_m
17d0: 61 6c 6c 6f 63 28 29 29 20 2a 2f 0a 7d 3b 0a 0a  alloc()) */.};..
17e0: 2f 2a 0a 2a 2a 2a 20 34 2e 33 2e 37 20 20 4c 6f  /*.*** 4.3.7  Lo
17f0: 63 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 3a  cal file header:
1800: 0a 2a 2a 2a 0a 2a 2a 2a 20 20 20 6c 6f 63 61 6c  .***.***   local
1810: 20 66 69 6c 65 20 68 65 61 64 65 72 20 73 69 67   file header sig
1820: 6e 61 74 75 72 65 20 20 20 20 20 34 20 62 79 74  nature     4 byt
1830: 65 73 20 20 28 30 78 30 34 30 33 34 62 35 30 29  es  (0x04034b50)
1840: 0a 2a 2a 2a 20 20 20 76 65 72 73 69 6f 6e 20 6e  .***   version n
1850: 65 65 64 65 64 20 74 6f 20 65 78 74 72 61 63 74  eeded to extract
1860: 20 20 20 20 20 20 20 32 20 62 79 74 65 73 0a 2a         2 bytes.*
1870: 2a 2a 20 20 20 67 65 6e 65 72 61 6c 20 70 75 72  **   general pur
1880: 70 6f 73 65 20 62 69 74 20 66 6c 61 67 20 20 20  pose bit flag   
1890: 20 20 20 20 20 32 20 62 79 74 65 73 0a 2a 2a 2a       2 bytes.***
18a0: 20 20 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 6d     compression m
18b0: 65 74 68 6f 64 20 20 20 20 20 20 20 20 20 20 20  ethod           
18c0: 20 20 20 32 20 62 79 74 65 73 0a 2a 2a 2a 20 20     2 bytes.***  
18d0: 20 6c 61 73 74 20 6d 6f 64 20 66 69 6c 65 20 74   last mod file t
18e0: 69 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ime             
18f0: 20 32 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20 6c   2 bytes.***   l
1900: 61 73 74 20 6d 6f 64 20 66 69 6c 65 20 64 61 74  ast mod file dat
1910: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32  e              2
1920: 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20 63 72 63   bytes.***   crc
1930: 2d 33 32 20 20 20 20 20 20 20 20 20 20 20 20 20  -32             
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20 62               4 b
1950: 79 74 65 73 0a 2a 2a 2a 20 20 20 63 6f 6d 70 72  ytes.***   compr
1960: 65 73 73 65 64 20 73 69 7a 65 20 20 20 20 20 20  essed size      
1970: 20 20 20 20 20 20 20 20 20 20 20 34 20 62 79 74             4 byt
1980: 65 73 0a 2a 2a 2a 20 20 20 75 6e 63 6f 6d 70 72  es.***   uncompr
1990: 65 73 73 65 64 20 73 69 7a 65 20 20 20 20 20 20  essed size      
19a0: 20 20 20 20 20 20 20 20 20 34 20 62 79 74 65 73           4 bytes
19b0: 0a 2a 2a 2a 20 20 20 66 69 6c 65 20 6e 61 6d 65  .***   file name
19c0: 20 6c 65 6e 67 74 68 20 20 20 20 20 20 20 20 20   length         
19d0: 20 20 20 20 20 20 20 32 20 62 79 74 65 73 0a 2a         2 bytes.*
19e0: 2a 2a 20 20 20 65 78 74 72 61 20 66 69 65 6c 64  **   extra field
19f0: 20 6c 65 6e 67 74 68 20 20 20 20 20 20 20 20 20   length         
1a00: 20 20 20 20 20 32 20 62 79 74 65 73 0a 2a 2a 2a       2 bytes.***
1a10: 20 20 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73     .*/.typedef s
1a20: 74 72 75 63 74 20 5a 69 70 66 69 6c 65 4c 46 48  truct ZipfileLFH
1a30: 20 5a 69 70 66 69 6c 65 4c 46 48 3b 0a 73 74 72   ZipfileLFH;.str
1a40: 75 63 74 20 5a 69 70 66 69 6c 65 4c 46 48 20 7b  uct ZipfileLFH {
1a50: 0a 20 20 75 31 36 20 69 56 65 72 73 69 6f 6e 45  .  u16 iVersionE
1a60: 78 74 72 61 63 74 3b 0a 20 20 75 31 36 20 66 6c  xtract;.  u16 fl
1a70: 61 67 73 3b 0a 20 20 75 31 36 20 69 43 6f 6d 70  ags;.  u16 iComp
1a80: 72 65 73 73 69 6f 6e 3b 0a 20 20 75 31 36 20 6d  ression;.  u16 m
1a90: 54 69 6d 65 3b 0a 20 20 75 31 36 20 6d 44 61 74  Time;.  u16 mDat
1aa0: 65 3b 0a 20 20 75 33 32 20 63 72 63 33 32 3b 0a  e;.  u32 crc32;.
1ab0: 20 20 75 33 32 20 73 7a 43 6f 6d 70 72 65 73 73    u32 szCompress
1ac0: 65 64 3b 0a 20 20 75 33 32 20 73 7a 55 6e 63 6f  ed;.  u32 szUnco
1ad0: 6d 70 72 65 73 73 65 64 3b 0a 20 20 75 31 36 20  mpressed;.  u16 
1ae0: 6e 46 69 6c 65 3b 0a 20 20 75 31 36 20 6e 45 78  nFile;.  u16 nEx
1af0: 74 72 61 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65 66  tra;.};..typedef
1b00: 20 73 74 72 75 63 74 20 5a 69 70 66 69 6c 65 45   struct ZipfileE
1b10: 6e 74 72 79 20 5a 69 70 66 69 6c 65 45 6e 74 72  ntry ZipfileEntr
1b20: 79 3b 0a 73 74 72 75 63 74 20 5a 69 70 66 69 6c  y;.struct Zipfil
1b30: 65 45 6e 74 72 79 20 7b 0a 20 20 5a 69 70 66 69  eEntry {.  Zipfi
1b40: 6c 65 43 44 53 20 63 64 73 3b 20 20 20 20 20 20  leCDS cds;      
1b50: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 64 20        /* Parsed 
1b60: 43 44 53 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  CDS record */.  
1b70: 75 33 32 20 6d 55 6e 69 78 54 69 6d 65 3b 20 20  u32 mUnixTime;  
1b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f             /* Mo
1b90: 64 69 66 69 63 61 74 69 6f 6e 20 74 69 6d 65 2c  dification time,
1ba0: 20 69 6e 20 55 4e 49 58 20 66 6f 72 6d 61 74 20   in UNIX format 
1bb0: 2a 2f 0a 20 20 75 38 20 2a 61 45 78 74 72 61 3b  */.  u8 *aExtra;
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 2f 2a 20 63 64 73 2e 6e 45 78 74 72 61 2b 63 64  /* cds.nExtra+cd
1be0: 73 2e 6e 43 6f 6d 6d 65 6e 74 20 62 79 74 65 73  s.nComment bytes
1bf0: 20 6f 66 20 65 78 74 72 61 20 64 61 74 61 20 2a   of extra data *
1c00: 2f 0a 20 20 69 36 34 20 69 44 61 74 61 4f 66 66  /.  i64 iDataOff
1c10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1c20: 2a 20 4f 66 66 73 65 74 20 74 6f 20 64 61 74 61  * Offset to data
1c30: 20 69 6e 20 66 69 6c 65 20 28 69 66 20 61 44 61   in file (if aDa
1c40: 74 61 3d 3d 30 29 20 2a 2f 0a 20 20 75 38 20 2a  ta==0) */.  u8 *
1c50: 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
1c60: 20 20 20 20 20 20 20 2f 2a 20 63 64 73 2e 73 7a         /* cds.sz
1c70: 43 6f 6d 70 72 65 73 73 65 64 20 62 79 74 65 73  Compressed bytes
1c80: 20 6f 66 20 63 6f 6d 70 72 65 73 73 65 64 20 64   of compressed d
1c90: 61 74 61 20 2a 2f 0a 20 20 5a 69 70 66 69 6c 65  ata */.  Zipfile
1ca0: 45 6e 74 72 79 20 2a 70 4e 65 78 74 3b 20 20 20  Entry *pNext;   
1cb0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6c 65 6d      /* Next elem
1cc0: 65 6e 74 20 69 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ent in in-memory
1cd0: 20 43 44 53 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a   CDS */.};../* .
1ce0: 2a 2a 20 43 75 72 73 6f 72 20 74 79 70 65 20 66  ** Cursor type f
1cf0: 6f 72 20 7a 69 70 66 69 6c 65 20 74 61 62 6c 65  or zipfile table
1d00: 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  s..*/.typedef st
1d10: 72 75 63 74 20 5a 69 70 66 69 6c 65 43 73 72 20  ruct ZipfileCsr 
1d20: 5a 69 70 66 69 6c 65 43 73 72 3b 0a 73 74 72 75  ZipfileCsr;.stru
1d30: 63 74 20 5a 69 70 66 69 6c 65 43 73 72 20 7b 0a  ct ZipfileCsr {.
1d40: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
1d50: 75 72 73 6f 72 20 62 61 73 65 3b 20 20 2f 2a 20  ursor base;  /* 
1d60: 42 61 73 65 20 63 6c 61 73 73 20 2d 20 6d 75 73  Base class - mus
1d70: 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20  t be first */.  
1d80: 69 36 34 20 69 49 64 3b 20 20 20 20 20 20 20 20  i64 iId;        
1d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1da0: 72 73 6f 72 20 49 44 20 2a 2f 0a 20 20 75 38 20  rsor ID */.  u8 
1db0: 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20  bEof;           
1dc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1dd0: 77 68 65 6e 20 61 74 20 45 4f 46 20 2a 2f 0a 20  when at EOF */. 
1de0: 20 75 38 20 62 4e 6f 6f 70 3b 20 20 20 20 20 20   u8 bNoop;      
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1e00: 66 20 6e 65 78 74 20 78 4e 65 78 74 28 29 20 63  f next xNext() c
1e10: 61 6c 6c 20 69 73 20 6e 6f 2d 6f 70 20 2a 2f 0a  all is no-op */.
1e20: 0a 20 20 2f 2a 20 55 73 65 64 20 6f 75 74 73 69  .  /* Used outsi
1e30: 64 65 20 6f 66 20 77 72 69 74 65 20 74 72 61 6e  de of write tran
1e40: 73 61 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 46 49  sactions */.  FI
1e50: 4c 45 20 2a 70 46 69 6c 65 3b 20 20 20 20 20 20  LE *pFile;      
1e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 69 70 20           /* Zip 
1e70: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69 4e  file */.  i64 iN
1e80: 65 78 74 4f 66 66 3b 20 20 20 20 20 20 20 20 20  extOff;         
1e90: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
1ea0: 66 20 6e 65 78 74 20 72 65 63 6f 72 64 20 69 6e  f next record in
1eb0: 20 63 65 6e 74 72 61 6c 20 64 69 72 65 63 74 6f   central directo
1ec0: 72 79 20 2a 2f 0a 20 20 5a 69 70 66 69 6c 65 45  ry */.  ZipfileE
1ed0: 4f 43 44 20 65 6f 63 64 3b 20 20 20 20 20 20 20  OCD eocd;       
1ee0: 20 20 20 2f 2a 20 50 61 72 73 65 20 6f 66 20 63     /* Parse of c
1ef0: 65 6e 74 72 61 6c 20 64 69 72 65 63 74 6f 72 79  entral directory
1f00: 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 5a 69   record */..  Zi
1f10: 70 66 69 6c 65 45 6e 74 72 79 20 2a 70 46 72 65  pfileEntry *pFre
1f20: 65 45 6e 74 72 79 3b 20 20 2f 2a 20 46 72 65 65  eEntry;  /* Free
1f30: 20 74 68 69 73 20 6c 69 73 74 20 77 68 65 6e 20   this list when 
1f40: 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
1f50: 20 6f 72 20 72 65 73 65 74 20 2a 2f 0a 20 20 5a   or reset */.  Z
1f60: 69 70 66 69 6c 65 45 6e 74 72 79 20 2a 70 43 75  ipfileEntry *pCu
1f70: 72 72 65 6e 74 3b 20 20 20 20 2f 2a 20 43 75 72  rrent;    /* Cur
1f80: 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rent entry */.  
1f90: 5a 69 70 66 69 6c 65 43 73 72 20 2a 70 43 73 72  ZipfileCsr *pCsr
1fa0: 4e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65  Next;      /* Ne
1fb0: 78 74 20 63 75 72 73 6f 72 20 6f 6e 20 73 61 6d  xt cursor on sam
1fc0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
1fd0: 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73  */.};..typedef s
1fe0: 74 72 75 63 74 20 5a 69 70 66 69 6c 65 54 61 62  truct ZipfileTab
1ff0: 20 5a 69 70 66 69 6c 65 54 61 62 3b 0a 73 74 72   ZipfileTab;.str
2000: 75 63 74 20 5a 69 70 66 69 6c 65 54 61 62 20 7b  uct ZipfileTab {
2010: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
2020: 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  base;         /*
2030: 20 42 61 73 65 20 63 6c 61 73 73 20 2d 20 6d 75   Base class - mu
2040: 73 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20  st be first */. 
2050: 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20   char *zFile;   
2060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a              /* Z
2070: 69 70 20 66 69 6c 65 20 74 68 69 73 20 74 61 62  ip file this tab
2080: 6c 65 20 61 63 63 65 73 73 65 73 20 28 6d 61 79  le accesses (may
2090: 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73   be NULL) */.  s
20a0: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
20b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 73            /* Hos
20c0: 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  t database conne
20d0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 2a 61  ction */.  u8 *a
20e0: 42 75 66 66 65 72 3b 20 20 20 20 20 20 20 20 20  Buffer;         
20f0: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
2100: 72 79 20 62 75 66 66 65 72 20 75 73 65 64 20 66  ry buffer used f
2110: 6f 72 20 76 61 72 69 6f 75 73 20 74 61 73 6b 73  or various tasks
2120: 20 2a 2f 0a 0a 20 20 5a 69 70 66 69 6c 65 43 73   */..  ZipfileCs
2130: 72 20 2a 70 43 73 72 4c 69 73 74 3b 20 20 20 20  r *pCsrList;    
2140: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 75 72    /* List of cur
2150: 73 6f 72 73 20 2a 2f 0a 20 20 69 36 34 20 69 4e  sors */.  i64 iN
2160: 65 78 74 43 73 72 69 64 3b 0a 0a 20 20 2f 2a 20  extCsrid;..  /* 
2170: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  The following ar
2180: 65 20 75 73 65 64 20 62 79 20 77 72 69 74 65 20  e used by write 
2190: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 6e 6c  transactions onl
21a0: 79 20 2a 2f 0a 20 20 5a 69 70 66 69 6c 65 45 6e  y */.  ZipfileEn
21b0: 74 72 79 20 2a 70 46 69 72 73 74 45 6e 74 72 79  try *pFirstEntry
21c0: 3b 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74  ; /* Linked list
21d0: 20 6f 66 20 61 6c 6c 20 66 69 6c 65 73 20 28 69   of all files (i
21e0: 66 20 70 57 72 69 74 65 46 64 21 3d 30 29 20 2a  f pWriteFd!=0) *
21f0: 2f 0a 20 20 5a 69 70 66 69 6c 65 45 6e 74 72 79  /.  ZipfileEntry
2200: 20 2a 70 4c 61 73 74 45 6e 74 72 79 3b 20 20 2f   *pLastEntry;  /
2210: 2a 20 4c 61 73 74 20 65 6c 65 6d 65 6e 74 20 69  * Last element i
2220: 6e 20 70 46 69 72 73 74 45 6e 74 72 79 20 6c 69  n pFirstEntry li
2230: 73 74 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 70 57  st */.  FILE *pW
2240: 72 69 74 65 46 64 3b 20 20 20 20 20 20 20 20 20  riteFd;         
2250: 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c     /* File handl
2260: 65 20 6f 70 65 6e 20 6f 6e 20 7a 69 70 20 61 72  e open on zip ar
2270: 63 68 69 76 65 20 2a 2f 0a 20 20 69 36 34 20 73  chive */.  i64 s
2280: 7a 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20  zCurrent;       
2290: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
22a0: 20 73 69 7a 65 20 6f 66 20 7a 69 70 20 61 72 63   size of zip arc
22b0: 68 69 76 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a  hive */.  i64 sz
22c0: 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  Orig;           
22d0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
22e0: 61 72 63 68 69 76 65 20 61 74 20 73 74 61 72 74  archive at start
22f0: 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   of transaction 
2300: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  */.};../*.** Set
2310: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
2320: 67 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ge contained in 
2330: 63 6f 6e 74 65 78 74 20 63 74 78 20 74 6f 20 74  context ctx to t
2340: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 0a 2a 2a  he results of.**
2350: 20 76 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 2e   vprintf(zFmt, .
2360: 2e 2e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ..)..*/.static v
2370: 6f 69 64 20 7a 69 70 66 69 6c 65 43 74 78 45 72  oid zipfileCtxEr
2380: 72 6f 72 4d 73 67 28 73 71 6c 69 74 65 33 5f 63  rorMsg(sqlite3_c
2390: 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 63 6f 6e  ontext *ctx, con
23a0: 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e  st char *zFmt, .
23b0: 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73  ..){.  char *zMs
23c0: 67 20 3d 20 30 3b 0a 20 20 76 61 5f 6c 69 73 74  g = 0;.  va_list
23d0: 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   ap;.  va_start(
23e0: 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a 4d 73  ap, zFmt);.  zMs
23f0: 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72  g = sqlite3_vmpr
2400: 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a  intf(zFmt, ap);.
2410: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2420: 5f 65 72 72 6f 72 28 63 74 78 2c 20 7a 4d 73 67  _error(ctx, zMsg
2430: 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , -1);.  sqlite3
2440: 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20 20 76  _free(zMsg);.  v
2450: 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a  a_end(ap);.}../*
2460: 0a 2a 2a 20 49 66 20 73 74 72 69 6e 67 20 7a 49  .** If string zI
2470: 6e 20 69 73 20 71 75 6f 74 65 64 2c 20 64 65 71  n is quoted, deq
2480: 75 6f 74 65 20 69 74 20 69 6e 20 70 6c 61 63 65  uote it in place
2490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
24a0: 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  the string.** is
24b0: 20 6e 6f 74 20 71 75 6f 74 65 64 2c 20 64 6f 20   not quoted, do 
24c0: 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  nothing..*/.stat
24d0: 69 63 20 76 6f 69 64 20 7a 69 70 66 69 6c 65 44  ic void zipfileD
24e0: 65 71 75 6f 74 65 28 63 68 61 72 20 2a 7a 49 6e  equote(char *zIn
24f0: 29 7b 0a 20 20 63 68 61 72 20 71 20 3d 20 7a 49  ){.  char q = zI
2500: 6e 5b 30 5d 3b 0a 20 20 69 66 28 20 71 3d 3d 27  n[0];.  if( q=='
2510: 22 27 20 7c 7c 20 71 3d 3d 27 5c 27 27 20 7c 7c  "' || q=='\'' ||
2520: 20 71 3d 3d 27 60 27 20 7c 7c 20 71 3d 3d 27 5b   q=='`' || q=='[
2530: 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 6e  ' ){.    int iIn
2540: 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 69 4f   = 1;.    int iO
2550: 75 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ut = 0;.    if( 
2560: 71 3d 3d 27 5b 27 20 29 20 71 20 3d 20 27 5d 27  q=='[' ) q = ']'
2570: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57  ;.    while( ALW
2580: 41 59 53 28 7a 49 6e 5b 69 49 6e 5d 29 20 29 7b  AYS(zIn[iIn]) ){
2590: 0a 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20  .      char c = 
25a0: 7a 49 6e 5b 69 49 6e 2b 2b 5d 3b 0a 20 20 20 20  zIn[iIn++];.    
25b0: 20 20 69 66 28 20 63 3d 3d 71 20 26 26 20 7a 49    if( c==q && zI
25c0: 6e 5b 69 49 6e 2b 2b 5d 21 3d 71 20 29 20 62 72  n[iIn++]!=q ) br
25d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7a 49 6e 5b 69  eak;.      zIn[i
25e0: 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  Out++] = c;.    
25f0: 7d 0a 20 20 20 20 7a 49 6e 5b 69 4f 75 74 5d 20  }.    zIn[iOut] 
2600: 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = '\0';.  }.}../
2610: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
2620: 20 6e 65 77 20 5a 69 70 66 69 6c 65 54 61 62 20   new ZipfileTab 
2630: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62  virtual table ob
2640: 6a 65 63 74 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 61  ject..** .**   a
2650: 72 67 76 5b 30 5d 20 20 20 2d 3e 20 6d 6f 64 75  rgv[0]   -> modu
2660: 6c 65 20 6e 61 6d 65 20 20 28 22 7a 69 70 66 69  le name  ("zipfi
2670: 6c 65 22 29 0a 2a 2a 20 20 20 61 72 67 76 5b 31  le").**   argv[1
2680: 5d 20 20 20 2d 3e 20 64 61 74 61 62 61 73 65 20  ]   -> database 
2690: 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b 32  name.**   argv[2
26a0: 5d 20 20 20 2d 3e 20 74 61 62 6c 65 20 6e 61 6d  ]   -> table nam
26b0: 65 0a 2a 2a 20 20 20 61 72 67 76 5b 2e 2e 2e 5d  e.**   argv[...]
26c0: 20 2d 3e 20 22 63 6f 6c 75 6d 6e 20 6e 61 6d 65   -> "column name
26d0: 22 20 61 6e 64 20 6f 74 68 65 72 20 6d 6f 64 75  " and other modu
26e0: 6c 65 20 61 72 67 75 6d 65 6e 74 20 66 69 65 6c  le argument fiel
26f0: 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ds..*/.static in
2700: 74 20 7a 69 70 66 69 6c 65 43 6f 6e 6e 65 63 74  t zipfileConnect
2710: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
2720: 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20  .  void *pAux,. 
2730: 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74   int argc, const
2740: 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67   char *const*arg
2750: 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  v,.  sqlite3_vta
2760: 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68  b **ppVtab,.  ch
2770: 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
2780: 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
2790: 6f 66 28 5a 69 70 66 69 6c 65 54 61 62 29 20 2b  of(ZipfileTab) +
27a0: 20 5a 49 50 46 49 4c 45 5f 42 55 46 46 45 52 5f   ZIPFILE_BUFFER_
27b0: 53 49 5a 45 3b 0a 20 20 69 6e 74 20 6e 46 69 6c  SIZE;.  int nFil
27c0: 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63  e = 0;.  const c
27d0: 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 30 3b 0a  har *zFile = 0;.
27e0: 20 20 5a 69 70 66 69 6c 65 54 61 62 20 2a 70 4e    ZipfileTab *pN
27f0: 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ew = 0;.  int rc
2800: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74  ;..  /* If the t
2810: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
2820: 20 22 7a 69 70 66 69 6c 65 22 2c 20 72 65 71 75   "zipfile", requ
2830: 69 72 65 20 74 68 61 74 20 74 68 65 20 61 72 67  ire that the arg
2840: 75 6d 65 6e 74 20 62 65 0a 20 20 2a 2a 20 73 70  ument be.  ** sp
2850: 65 63 69 66 69 65 64 2e 20 54 68 69 73 20 73 74  ecified. This st
2860: 6f 70 73 20 7a 69 70 66 69 6c 65 20 74 61 62 6c  ops zipfile tabl
2870: 65 73 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 72  es from being cr
2880: 65 61 74 65 64 20 61 73 3a 0a 20 20 2a 2a 0a 20  eated as:.  **. 
2890: 20 2a 2a 20 20 20 43 52 45 41 54 45 20 56 49 52   **   CREATE VIR
28a0: 54 55 41 4c 20 54 41 42 4c 45 20 7a 7a 7a 20 55  TUAL TABLE zzz U
28b0: 53 49 4e 47 20 7a 69 70 66 69 6c 65 28 29 3b 0a  SING zipfile();.
28c0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 74 20 64 6f 65    **.  ** It doe
28d0: 73 20 6e 6f 74 20 70 72 65 76 65 6e 74 3a 0a 20  s not prevent:. 
28e0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 43 52 45 41 54   **.  **   CREAT
28f0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
2900: 7a 69 70 66 69 6c 65 20 55 53 49 4e 47 20 7a 69  zipfile USING zi
2910: 70 66 69 6c 65 28 29 3b 0a 20 20 2a 2f 0a 20 20  pfile();.  */.  
2920: 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
2930: 65 33 5f 73 74 72 69 63 6d 70 28 61 72 67 76 5b  e3_stricmp(argv[
2940: 30 5d 2c 20 22 7a 69 70 66 69 6c 65 22 29 20 29  0], "zipfile") )
2950: 3b 0a 20 20 69 66 28 20 28 30 21 3d 73 71 6c 69  ;.  if( (0!=sqli
2960: 74 65 33 5f 73 74 72 69 63 6d 70 28 61 72 67 76  te3_stricmp(argv
2970: 5b 32 5d 2c 20 22 7a 69 70 66 69 6c 65 22 29 20  [2], "zipfile") 
2980: 26 26 20 61 72 67 63 3c 34 29 20 7c 7c 20 61 72  && argc<4) || ar
2990: 67 63 3e 34 20 29 7b 0a 20 20 20 20 2a 70 7a 45  gc>4 ){.    *pzE
29a0: 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
29b0: 69 6e 74 66 28 22 7a 69 70 66 69 6c 65 20 63 6f  intf("zipfile co
29c0: 6e 73 74 72 75 63 74 6f 72 20 72 65 71 75 69 72  nstructor requir
29d0: 65 73 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 22  es one argument"
29e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
29f0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
2a00: 0a 20 20 69 66 28 20 61 72 67 63 3e 33 20 29 7b  .  if( argc>3 ){
2a10: 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 72 67  .    zFile = arg
2a20: 76 5b 33 5d 3b 0a 20 20 20 20 6e 46 69 6c 65 20  v[3];.    nFile 
2a30: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46  = (int)strlen(zF
2a40: 69 6c 65 29 2b 31 3b 0a 20 20 7d 0a 0a 20 20 72  ile)+1;.  }..  r
2a50: 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c  c = sqlite3_decl
2a60: 61 72 65 5f 76 74 61 62 28 64 62 2c 20 5a 49 50  are_vtab(db, ZIP
2a70: 46 49 4c 45 5f 53 43 48 45 4d 41 29 3b 0a 20 20  FILE_SCHEMA);.  
2a80: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a90: 4b 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  K ){.    pNew = 
2aa0: 28 5a 69 70 66 69 6c 65 54 61 62 2a 29 73 71 6c  (ZipfileTab*)sql
2ab0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74  ite3_malloc(nByt
2ac0: 65 2b 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  e+nFile);.    if
2ad0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
2ae0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2af0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77  .    memset(pNew
2b00: 2c 20 30 2c 20 6e 42 79 74 65 2b 6e 46 69 6c 65  , 0, nByte+nFile
2b10: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 64 62 20  );.    pNew->db 
2b20: 3d 20 64 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  = db;.    pNew->
2b30: 61 42 75 66 66 65 72 20 3d 20 28 75 38 2a 29 26  aBuffer = (u8*)&
2b40: 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 69 66 28  pNew[1];.    if(
2b50: 20 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20   zFile ){.      
2b60: 70 4e 65 77 2d 3e 7a 46 69 6c 65 20 3d 20 28 63  pNew->zFile = (c
2b70: 68 61 72 2a 29 26 70 4e 65 77 2d 3e 61 42 75 66  har*)&pNew->aBuf
2b80: 66 65 72 5b 5a 49 50 46 49 4c 45 5f 42 55 46 46  fer[ZIPFILE_BUFF
2b90: 45 52 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 20 20  ER_SIZE];.      
2ba0: 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 46 69  memcpy(pNew->zFi
2bb0: 6c 65 2c 20 7a 46 69 6c 65 2c 20 6e 46 69 6c 65  le, zFile, nFile
2bc0: 29 3b 0a 20 20 20 20 20 20 7a 69 70 66 69 6c 65  );.      zipfile
2bd0: 44 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 7a 46  Dequote(pNew->zF
2be0: 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
2bf0: 20 20 2a 70 70 56 74 61 62 20 3d 20 28 73 71 6c    *ppVtab = (sql
2c00: 69 74 65 33 5f 76 74 61 62 2a 29 70 4e 65 77 3b  ite3_vtab*)pNew;
2c10: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2c20: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
2c30: 5a 69 70 66 69 6c 65 45 6e 74 72 79 20 73 74 72  ZipfileEntry str
2c40: 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
2c50: 20 62 79 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   by the only arg
2c60: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
2c70: 20 76 6f 69 64 20 7a 69 70 66 69 6c 65 45 6e 74   void zipfileEnt
2c80: 72 79 46 72 65 65 28 5a 69 70 66 69 6c 65 45 6e  ryFree(ZipfileEn
2c90: 74 72 79 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  try *p){.  if( p
2ca0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2cb0: 66 72 65 65 28 70 2d 3e 63 64 73 2e 7a 46 69 6c  free(p->cds.zFil
2cc0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
2cd0: 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
2ce0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 72 65  /*.** Release re
2cf0: 73 6f 75 72 63 65 73 20 74 68 61 74 20 73 68 6f  sources that sho
2d00: 75 6c 64 20 62 65 20 66 72 65 65 64 20 61 74 20  uld be freed at 
2d10: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 77 72 69  the end of a wri
2d20: 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  te .** transacti
2d30: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
2d40: 69 64 20 7a 69 70 66 69 6c 65 43 6c 65 61 6e 75  id zipfileCleanu
2d50: 70 54 72 61 6e 73 61 63 74 69 6f 6e 28 5a 69 70  pTransaction(Zip
2d60: 66 69 6c 65 54 61 62 20 2a 70 54 61 62 29 7b 0a  fileTab *pTab){.
2d70: 20 20 5a 69 70 66 69 6c 65 45 6e 74 72 79 20 2a    ZipfileEntry *
2d80: 70 45 6e 74 72 79 3b 0a 20 20 5a 69 70 66 69 6c  pEntry;.  Zipfil
2d90: 65 45 6e 74 72 79 20 2a 70 4e 65 78 74 3b 0a 0a  eEntry *pNext;..
2da0: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 57 72 69    if( pTab->pWri
2db0: 74 65 46 64 20 29 7b 0a 20 20 20 20 66 63 6c 6f  teFd ){.    fclo
2dc0: 73 65 28 70 54 61 62 2d 3e 70 57 72 69 74 65 46  se(pTab->pWriteF
2dd0: 64 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70 57  d);.    pTab->pW
2de0: 72 69 74 65 46 64 20 3d 20 30 3b 0a 20 20 7d 0a  riteFd = 0;.  }.
2df0: 20 20 66 6f 72 28 70 45 6e 74 72 79 3d 70 54 61    for(pEntry=pTa
2e00: 62 2d 3e 70 46 69 72 73 74 45 6e 74 72 79 3b 20  b->pFirstEntry; 
2e10: 70 45 6e 74 72 79 3b 20 70 45 6e 74 72 79 3d 70  pEntry; pEntry=p
2e20: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
2e30: 20 3d 20 70 45 6e 74 72 79 2d 3e 70 4e 65 78 74   = pEntry->pNext
2e40: 3b 0a 20 20 20 20 7a 69 70 66 69 6c 65 45 6e 74  ;.    zipfileEnt
2e50: 72 79 46 72 65 65 28 70 45 6e 74 72 79 29 3b 0a  ryFree(pEntry);.
2e60: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 70 46 69 72    }.  pTab->pFir
2e70: 73 74 45 6e 74 72 79 20 3d 20 30 3b 0a 20 20 70  stEntry = 0;.  p
2e80: 54 61 62 2d 3e 70 4c 61 73 74 45 6e 74 72 79 20  Tab->pLastEntry 
2e90: 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 43  = 0;.  pTab->szC
2ea0: 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 70 54  urrent = 0;.  pT
2eb0: 61 62 2d 3e 73 7a 4f 72 69 67 20 3d 20 30 3b 0a  ab->szOrig = 0;.
2ec0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 65  }../*.** This me
2ed0: 74 68 6f 64 20 69 73 20 74 68 65 20 64 65 73 74  thod is the dest
2ee0: 72 75 63 74 6f 72 20 66 6f 72 20 7a 69 70 66 69  ructor for zipfi
2ef0: 6c 65 20 76 74 61 62 20 6f 62 6a 65 63 74 73 2e  le vtab objects.
2f00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .*/.static int z
2f10: 69 70 66 69 6c 65 44 69 73 63 6f 6e 6e 65 63 74  ipfileDisconnect
2f20: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70  (sqlite3_vtab *p
2f30: 56 74 61 62 29 7b 0a 20 20 7a 69 70 66 69 6c 65  Vtab){.  zipfile
2f40: 43 6c 65 61 6e 75 70 54 72 61 6e 73 61 63 74 69  CleanupTransacti
2f50: 6f 6e 28 28 5a 69 70 66 69 6c 65 54 61 62 2a 29  on((ZipfileTab*)
2f60: 70 56 74 61 62 29 3b 0a 20 20 73 71 6c 69 74 65  pVtab);.  sqlite
2f70: 33 5f 66 72 65 65 28 70 56 74 61 62 29 3b 0a 20  3_free(pVtab);. 
2f80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f90: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  K;.}../*.** Cons
2fa0: 74 72 75 63 74 6f 72 20 66 6f 72 20 61 20 6e 65  tructor for a ne
2fb0: 77 20 5a 69 70 66 69 6c 65 43 73 72 20 6f 62 6a  w ZipfileCsr obj
2fc0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ect..*/.static i
2fd0: 6e 74 20 7a 69 70 66 69 6c 65 4f 70 65 6e 28 73  nt zipfileOpen(s
2fe0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 2c 20  qlite3_vtab *p, 
2ff0: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
3000: 73 6f 72 20 2a 2a 70 70 43 73 72 29 7b 0a 20 20  sor **ppCsr){.  
3010: 5a 69 70 66 69 6c 65 54 61 62 20 2a 70 54 61 62  ZipfileTab *pTab
3020: 20 3d 20 28 5a 69 70 66 69 6c 65 54 61 62 2a 29   = (ZipfileTab*)
3030: 70 3b 0a 20 20 5a 69 70 66 69 6c 65 43 73 72 20  p;.  ZipfileCsr 
3040: 2a 70 43 73 72 3b 0a 20 20 70 43 73 72 20 3d 20  *pCsr;.  pCsr = 
3050: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
3060: 69 7a 65 6f 66 28 2a 70 43 73 72 29 29 3b 0a 20  izeof(*pCsr));. 
3070: 20 2a 70 70 43 73 72 20 3d 20 28 73 71 6c 69 74   *ppCsr = (sqlit
3080: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 2a 29  e3_vtab_cursor*)
3090: 70 43 73 72 3b 0a 20 20 69 66 28 20 70 43 73 72  pCsr;.  if( pCsr
30a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
30b0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
30c0: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 73    }.  memset(pCs
30d0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43  r, 0, sizeof(*pC
30e0: 73 72 29 29 3b 0a 20 20 70 43 73 72 2d 3e 69 49  sr));.  pCsr->iI
30f0: 64 20 3d 20 2b 2b 70 54 61 62 2d 3e 69 4e 65 78  d = ++pTab->iNex
3100: 74 43 73 72 69 64 3b 0a 20 20 70 43 73 72 2d 3e  tCsrid;.  pCsr->
3110: 70 43 73 72 4e 65 78 74 20 3d 20 70 54 61 62 2d  pCsrNext = pTab-
3120: 3e 70 43 73 72 4c 69 73 74 3b 0a 20 20 70 54 61  >pCsrList;.  pTa
3130: 62 2d 3e 70 43 73 72 4c 69 73 74 20 3d 20 70 43  b->pCsrList = pC
3140: 73 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  sr;.  return SQL
3150: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
3160: 20 52 65 73 65 74 20 61 20 63 75 72 73 6f 72 20   Reset a cursor 
3170: 62 61 63 6b 20 74 6f 20 74 68 65 20 73 74 61 74  back to the stat
3180: 65 20 69 74 20 77 61 73 20 69 6e 20 77 68 65 6e  e it was in when
3190: 20 66 69 72 73 74 20 72 65 74 75 72 6e 65 64 0a   first returned.
31a0: 2a 2a 20 62 79 20 7a 69 70 66 69 6c 65 4f 70 65  ** by zipfileOpe
31b0: 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  n()..*/.static v
31c0: 6f 69 64 20 7a 69 70 66 69 6c 65 52 65 73 65 74  oid zipfileReset
31d0: 43 75 72 73 6f 72 28 5a 69 70 66 69 6c 65 43 73  Cursor(ZipfileCs
31e0: 72 20 2a 70 43 73 72 29 7b 0a 20 20 5a 69 70 66  r *pCsr){.  Zipf
31f0: 69 6c 65 45 6e 74 72 79 20 2a 70 3b 0a 20 20 5a  ileEntry *p;.  Z
3200: 69 70 66 69 6c 65 45 6e 74 72 79 20 2a 70 4e 65  ipfileEntry *pNe
3210: 78 74 3b 0a 0a 20 20 70 43 73 72 2d 3e 62 45 6f  xt;..  pCsr->bEo
3220: 66 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 73  f = 0;.  if( pCs
3230: 72 2d 3e 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  r->pFile ){.    
3240: 66 63 6c 6f 73 65 28 70 43 73 72 2d 3e 70 46 69  fclose(pCsr->pFi
3250: 6c 65 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70  le);.    pCsr->p
3260: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7a 69  File = 0;.    zi
3270: 70 66 69 6c 65 45 6e 74 72 79 46 72 65 65 28 70  pfileEntryFree(p
3280: 43 73 72 2d 3e 70 43 75 72 72 65 6e 74 29 3b 0a  Csr->pCurrent);.
3290: 20 20 20 20 70 43 73 72 2d 3e 70 43 75 72 72 65      pCsr->pCurre
32a0: 6e 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 66  nt = 0;.  }..  f
32b0: 6f 72 28 70 3d 70 43 73 72 2d 3e 70 46 72 65 65  or(p=pCsr->pFree
32c0: 45 6e 74 72 79 3b 20 70 3b 20 70 3d 70 4e 65 78  Entry; p; p=pNex
32d0: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
32e0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7a 69  p->pNext;.    zi
32f0: 70 66 69 6c 65 45 6e 74 72 79 46 72 65 65 28 70  pfileEntryFree(p
3300: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3310: 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61  Destructor for a
3320: 6e 20 5a 69 70 66 69 6c 65 43 73 72 2e 0a 2a 2f  n ZipfileCsr..*/
3330: 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 69 70 66  .static int zipf
3340: 69 6c 65 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ileClose(sqlite3
3350: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
3360: 72 29 7b 0a 20 20 5a 69 70 66 69 6c 65 43 73 72  r){.  ZipfileCsr
3370: 20 2a 70 43 73 72 20 3d 20 28 5a 69 70 66 69 6c   *pCsr = (Zipfil
3380: 65 43 73 72 2a 29 63 75 72 3b 0a 20 20 5a 69 70  eCsr*)cur;.  Zip
3390: 66 69 6c 65 54 61 62 20 2a 70 54 61 62 20 3d 20  fileTab *pTab = 
33a0: 28 5a 69 70 66 69 6c 65 54 61 62 2a 29 28 70 43  (ZipfileTab*)(pC
33b0: 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 29 3b  sr->base.pVtab);
33c0: 0a 20 20 5a 69 70 66 69 6c 65 43 73 72 20 2a 2a  .  ZipfileCsr **
33d0: 70 70 3b 0a 20 20 7a 69 70 66 69 6c 65 52 65 73  pp;.  zipfileRes
33e0: 65 74 43 75 72 73 6f 72 28 70 43 73 72 29 3b 0a  etCursor(pCsr);.
33f0: 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 69  .  /* Remove thi
3400: 73 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 74 68  s cursor from th
3410: 65 20 5a 69 70 66 69 6c 65 54 61 62 2e 70 43 73  e ZipfileTab.pCs
3420: 72 4c 69 73 74 20 6c 69 73 74 2e 20 2a 2f 0a 20  rList list. */. 
3430: 20 66 6f 72 28 70 70 3d 26 70 54 61 62 2d 3e 70   for(pp=&pTab->p
3440: 43 73 72 4c 69 73 74 3b 20 2a 70 70 21 3d 70 43  CsrList; *pp!=pC
3450: 73 72 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e  sr; pp=&((*pp)->
3460: 70 43 73 72 4e 65 78 74 29 29 3b 0a 20 20 2a 70  pCsrNext));.  *p
3470: 70 20 3d 20 70 43 73 72 2d 3e 70 43 73 72 4e 65  p = pCsr->pCsrNe
3480: 78 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  xt;..  sqlite3_f
3490: 72 65 65 28 70 43 73 72 29 3b 0a 20 20 72 65 74  ree(pCsr);.  ret
34a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
34b0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
34c0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f  error message fo
34d0: 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  r the virtual ta
34e0: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
34f0: 69 74 68 20 63 75 72 73 6f 72 0a 2a 2a 20 70 43  ith cursor.** pC
3500: 73 72 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74  sr to the result
3510: 73 20 6f 66 20 76 70 72 69 6e 74 66 28 7a 46 6d  s of vprintf(zFm
3520: 74 2c 20 2e 2e 2e 29 2e 0a 2a 2f 0a 73 74 61 74  t, ...)..*/.stat
3530: 69 63 20 76 6f 69 64 20 7a 69 70 66 69 6c 65 54  ic void zipfileT
3540: 61 62 6c 65 45 72 72 28 5a 69 70 66 69 6c 65 54  ableErr(ZipfileT
3550: 61 62 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20  ab *pTab, const 
3560: 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29  char *zFmt, ...)
3570: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
3580: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
3590: 46 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Fmt);.  sqlite3_
35a0: 66 72 65 65 28 70 54 61 62 2d 3e 62 61 73 65 2e  free(pTab->base.
35b0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 54 61 62  zErrMsg);.  pTab
35c0: 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d  ->base.zErrMsg =
35d0: 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
35e0: 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 76  f(zFmt, ap);.  v
35f0: 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 73 74 61  a_end(ap);.}.sta
3600: 74 69 63 20 76 6f 69 64 20 7a 69 70 66 69 6c 65  tic void zipfile
3610: 43 75 72 73 6f 72 45 72 72 28 5a 69 70 66 69 6c  CursorErr(Zipfil
3620: 65 43 73 72 20 2a 70 43 73 72 2c 20 63 6f 6e 73  eCsr *pCsr, cons
3630: 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e  t char *zFmt, ..
3640: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
3650: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
3660: 20 7a 46 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65   zFmt);.  sqlite
3670: 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 62 61 73  3_free(pCsr->bas
3680: 65 2e 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  e.pVtab->zErrMsg
3690: 29 3b 0a 20 20 70 43 73 72 2d 3e 62 61 73 65 2e  );.  pCsr->base.
36a0: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
36b0: 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
36c0: 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 76  f(zFmt, ap);.  v
36d0: 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a  a_end(ap);.}../*
36e0: 0a 2a 2a 20 52 65 61 64 20 6e 52 65 61 64 20 62  .** Read nRead b
36f0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 72 6f  ytes of data fro
3700: 6d 20 6f 66 66 73 65 74 20 69 4f 66 66 20 6f 66  m offset iOff of
3710: 20 66 69 6c 65 20 70 46 69 6c 65 20 69 6e 74 6f   file pFile into
3720: 20 62 75 66 66 65 72 0a 2a 2a 20 61 52 65 61 64   buffer.** aRead
3730: 5b 5d 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  []. Return SQLIT
3740: 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
3750: 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
3760: 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 6f   error code.** o
3770: 74 68 65 72 77 69 73 65 2e 20 0a 2a 2a 0a 2a 2a  therwise. .**.**
3780: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   If an error doe
3790: 73 20 6f 63 63 75 72 2c 20 6f 75 74 70 75 74 20  s occur, output 
37a0: 76 61 72 69 61 62 6c 65 20 28 2a 70 7a 45 72 72  variable (*pzErr
37b0: 6d 73 67 29 20 6d 61 79 20 62 65 20 73 65 74 20  msg) may be set 
37c0: 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 61  to point.** to a
37d0: 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  n English langua
37e0: 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ge error message
37f0: 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
3800: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
3810: 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65  e.** caller to e
3820: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74  ventually free t
3830: 68 69 73 20 62 75 66 66 65 72 20 75 73 69 6e 67  his buffer using
3840: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65  .** sqlite3_free
3850: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
3860: 74 20 7a 69 70 66 69 6c 65 52 65 61 64 44 61 74  t zipfileReadDat
3870: 61 28 0a 20 20 46 49 4c 45 20 2a 70 46 69 6c 65  a(.  FILE *pFile
3880: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3890: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 66 72 6f       /* Read fro
38a0: 6d 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  m this file */. 
38b0: 20 75 38 20 2a 61 52 65 61 64 2c 20 20 20 20 20   u8 *aRead,     
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38d0: 20 2f 2a 20 52 65 61 64 20 69 6e 74 6f 20 74 68   /* Read into th
38e0: 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  is buffer */.  i
38f0: 6e 74 20 6e 52 65 61 64 2c 20 20 20 20 20 20 20  nt nRead,       
3900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3910: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
3920: 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  s to read */.  i
3930: 36 34 20 69 4f 66 66 2c 20 20 20 20 20 20 20 20  64 iOff,        
3940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3950: 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65 61 64  * Offset to read
3960: 20 66 72 6f 6d 20 2a 2f 0a 20 20 63 68 61 72 20   from */.  char 
3970: 2a 2a 70 7a 45 72 72 6d 73 67 20 20 20 20 20 20  **pzErrmsg      
3980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
3990: 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  T: Error message
39a0: 20 28 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d   (from sqlite3_m
39b0: 61 6c 6c 6f 63 29 20 2a 2f 0a 29 7b 0a 20 20 73  alloc) */.){.  s
39c0: 69 7a 65 5f 74 20 6e 3b 0a 20 20 66 73 65 65 6b  ize_t n;.  fseek
39d0: 28 70 46 69 6c 65 2c 20 28 6c 6f 6e 67 29 69 4f  (pFile, (long)iO
39e0: 66 66 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  ff, SEEK_SET);. 
39f0: 20 6e 20 3d 20 66 72 65 61 64 28 61 52 65 61 64   n = fread(aRead
3a00: 2c 20 31 2c 20 6e 52 65 61 64 2c 20 70 46 69 6c  , 1, nRead, pFil
3a10: 65 29 3b 0a 20 20 69 66 28 20 28 69 6e 74 29 6e  e);.  if( (int)n
3a20: 21 3d 6e 52 65 61 64 20 29 7b 0a 20 20 20 20 2a  !=nRead ){.    *
3a30: 70 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74  pzErrmsg = sqlit
3a40: 65 33 5f 6d 70 72 69 6e 74 66 28 22 65 72 72 6f  e3_mprintf("erro
3a50: 72 20 69 6e 20 66 72 65 61 64 28 29 22 29 3b 0a  r in fread()");.
3a60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3a70: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
3a80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3a90: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .}..static int z
3aa0: 69 70 66 69 6c 65 41 70 70 65 6e 64 44 61 74 61  ipfileAppendData
3ab0: 28 0a 20 20 5a 69 70 66 69 6c 65 54 61 62 20 2a  (.  ZipfileTab *
3ac0: 70 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 75 38  pTab,.  const u8
3ad0: 20 2a 61 57 72 69 74 65 2c 0a 20 20 69 6e 74 20   *aWrite,.  int 
3ae0: 6e 57 72 69 74 65 0a 29 7b 0a 20 20 73 69 7a 65  nWrite.){.  size
3af0: 5f 74 20 6e 3b 0a 20 20 66 73 65 65 6b 28 70 54  _t n;.  fseek(pT
3b00: 61 62 2d 3e 70 57 72 69 74 65 46 64 2c 20 28 6c  ab->pWriteFd, (l
3b10: 6f 6e 67 29 70 54 61 62 2d 3e 73 7a 43 75 72 72  ong)pTab->szCurr
3b20: 65 6e 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  ent, SEEK_SET);.
3b30: 20 20 6e 20 3d 20 66 77 72 69 74 65 28 61 57 72    n = fwrite(aWr
3b40: 69 74 65 2c 20 31 2c 20 6e 57 72 69 74 65 2c 20  ite, 1, nWrite, 
3b50: 70 54 61 62 2d 3e 70 57 72 69 74 65 46 64 29 3b  pTab->pWriteFd);
3b60: 0a 20 20 69 66 28 20 28 69 6e 74 29 6e 21 3d 6e  .  if( (int)n!=n
3b70: 57 72 69 74 65 20 29 7b 0a 20 20 20 20 70 54 61  Write ){.    pTa
3b80: 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 20  b->base.zErrMsg 
3b90: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
3ba0: 66 28 22 65 72 72 6f 72 20 69 6e 20 66 77 72 69  f("error in fwri
3bb0: 74 65 28 29 22 29 3b 0a 20 20 20 20 72 65 74 75  te()");.    retu
3bc0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
3bd0: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 43  .  }.  pTab->szC
3be0: 75 72 72 65 6e 74 20 2b 3d 20 6e 57 72 69 74 65  urrent += nWrite
3bf0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
3c00: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
3c10: 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ead and return a
3c20: 20 31 36 2d 62 69 74 20 6c 69 74 74 6c 65 2d 65   16-bit little-e
3c30: 6e 64 69 61 6e 20 75 6e 73 69 67 6e 65 64 20 69  ndian unsigned i
3c40: 6e 74 65 67 65 72 20 66 72 6f 6d 20 62 75 66 66  nteger from buff
3c50: 65 72 20 61 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  er aBuf..*/.stat
3c60: 69 63 20 75 31 36 20 7a 69 70 66 69 6c 65 47 65  ic u16 zipfileGe
3c70: 74 55 31 36 28 63 6f 6e 73 74 20 75 38 20 2a 61  tU16(const u8 *a
3c80: 42 75 66 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  Buf){.  return (
3c90: 61 42 75 66 5b 31 5d 20 3c 3c 20 38 29 20 2b 20  aBuf[1] << 8) + 
3ca0: 61 42 75 66 5b 30 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  aBuf[0];.}../*.*
3cb0: 2a 20 52 65 61 64 20 61 6e 64 20 72 65 74 75 72  * Read and retur
3cc0: 6e 20 61 20 33 32 2d 62 69 74 20 6c 69 74 74 6c  n a 32-bit littl
3cd0: 65 2d 65 6e 64 69 61 6e 20 75 6e 73 69 67 6e 65  e-endian unsigne
3ce0: 64 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 62  d integer from b
3cf0: 75 66 66 65 72 20 61 42 75 66 2e 0a 2a 2f 0a 73  uffer aBuf..*/.s
3d00: 74 61 74 69 63 20 75 33 32 20 7a 69 70 66 69 6c  tatic u32 zipfil
3d10: 65 47 65 74 55 33 32 28 63 6f 6e 73 74 20 75 38  eGetU32(const u8
3d20: 20 2a 61 42 75 66 29 7b 0a 20 20 72 65 74 75 72   *aBuf){.  retur
3d30: 6e 20 28 28 75 33 32 29 28 61 42 75 66 5b 33 5d  n ((u32)(aBuf[3]
3d40: 29 20 3c 3c 20 32 34 29 0a 20 20 20 20 20 20 20  ) << 24).       
3d50: 2b 20 28 28 75 33 32 29 28 61 42 75 66 5b 32 5d  + ((u32)(aBuf[2]
3d60: 29 20 3c 3c 20 31 36 29 0a 20 20 20 20 20 20 20  ) << 16).       
3d70: 2b 20 28 28 75 33 32 29 28 61 42 75 66 5b 31 5d  + ((u32)(aBuf[1]
3d80: 29 20 3c 3c 20 20 38 29 0a 20 20 20 20 20 20 20  ) <<  8).       
3d90: 2b 20 28 28 75 33 32 29 28 61 42 75 66 5b 30 5d  + ((u32)(aBuf[0]
3da0: 29 20 3c 3c 20 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  ) <<  0);.}../*.
3db0: 2a 2a 20 57 72 69 74 65 20 61 20 31 36 2d 62 69  ** Write a 16-bi
3dc0: 74 20 6c 69 74 74 6c 65 20 65 6e 64 69 61 74 65  t little endiate
3dd0: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 62 75   integer into bu
3de0: 66 66 65 72 20 61 42 75 66 2e 0a 2a 2f 0a 73 74  ffer aBuf..*/.st
3df0: 61 74 69 63 20 76 6f 69 64 20 7a 69 70 66 69 6c  atic void zipfil
3e00: 65 50 75 74 55 31 36 28 75 38 20 2a 61 42 75 66  ePutU16(u8 *aBuf
3e10: 2c 20 75 31 36 20 76 61 6c 29 7b 0a 20 20 61 42  , u16 val){.  aB
3e20: 75 66 5b 30 5d 20 3d 20 76 61 6c 20 26 20 30 78  uf[0] = val & 0x
3e30: 46 46 3b 0a 20 20 61 42 75 66 5b 31 5d 20 3d 20  FF;.  aBuf[1] = 
3e40: 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 46 46 3b  (val>>8) & 0xFF;
3e50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
3e60: 61 20 33 32 2d 62 69 74 20 6c 69 74 74 6c 65 20  a 32-bit little 
3e70: 65 6e 64 69 61 74 65 20 69 6e 74 65 67 65 72 20  endiate integer 
3e80: 69 6e 74 6f 20 62 75 66 66 65 72 20 61 42 75 66  into buffer aBuf
3e90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3ea0: 20 7a 69 70 66 69 6c 65 50 75 74 55 33 32 28 75   zipfilePutU32(u
3eb0: 38 20 2a 61 42 75 66 2c 20 75 33 32 20 76 61 6c  8 *aBuf, u32 val
3ec0: 29 7b 0a 20 20 61 42 75 66 5b 30 5d 20 3d 20 76  ){.  aBuf[0] = v
3ed0: 61 6c 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75  al & 0xFF;.  aBu
3ee0: 66 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20  f[1] = (val>>8) 
3ef0: 26 20 30 78 46 46 3b 0a 20 20 61 42 75 66 5b 32  & 0xFF;.  aBuf[2
3f00: 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20  ] = (val>>16) & 
3f10: 30 78 46 46 3b 0a 20 20 61 42 75 66 5b 33 5d 20  0xFF;.  aBuf[3] 
3f20: 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78  = (val>>24) & 0x
3f30: 46 46 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 7a  FF;.}..#define z
3f40: 69 70 66 69 6c 65 52 65 61 64 33 32 28 61 42 75  ipfileRead32(aBu
3f50: 66 29 20 28 20 61 42 75 66 2b 3d 34 2c 20 7a 69  f) ( aBuf+=4, zi
3f60: 70 66 69 6c 65 47 65 74 55 33 32 28 61 42 75 66  pfileGetU32(aBuf
3f70: 2d 34 29 20 29 0a 23 64 65 66 69 6e 65 20 7a 69  -4) ).#define zi
3f80: 70 66 69 6c 65 52 65 61 64 31 36 28 61 42 75 66  pfileRead16(aBuf
3f90: 29 20 28 20 61 42 75 66 2b 3d 32 2c 20 7a 69 70  ) ( aBuf+=2, zip
3fa0: 66 69 6c 65 47 65 74 55 31 36 28 61 42 75 66 2d  fileGetU16(aBuf-
3fb0: 32 29 20 29 0a 0a 23 64 65 66 69 6e 65 20 7a 69  2) )..#define zi
3fc0: 70 66 69 6c 65 57 72 69 74 65 33 32 28 61 42 75  pfileWrite32(aBu
3fd0: 66 2c 76 61 6c 29 20 7b 20 7a 69 70 66 69 6c 65  f,val) { zipfile
3fe0: 50 75 74 55 33 32 28 61 42 75 66 2c 76 61 6c 29  PutU32(aBuf,val)
3ff0: 3b 20 61 42 75 66 2b 3d 34 3b 20 7d 0a 23 64 65  ; aBuf+=4; }.#de
4000: 66 69 6e 65 20 7a 69 70 66 69 6c 65 57 72 69 74  fine zipfileWrit
4010: 65 31 36 28 61 42 75 66 2c 76 61 6c 29 20 7b 20  e16(aBuf,val) { 
4020: 7a 69 70 66 69 6c 65 50 75 74 55 31 36 28 61 42  zipfilePutU16(aB
4030: 75 66 2c 76 61 6c 29 3b 20 61 42 75 66 2b 3d 32  uf,val); aBuf+=2
4040: 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 67 69 63  ; }../*.** Magic
4050: 20 6e 75 6d 62 65 72 73 20 75 73 65 64 20 74 6f   numbers used to
4060: 20 72 65 61 64 20 43 44 53 20 72 65 63 6f 72 64   read CDS record
4070: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5a 49  s..*/.#define ZI
4080: 50 46 49 4c 45 5f 43 44 53 5f 4e 46 49 4c 45 5f  PFILE_CDS_NFILE_
4090: 4f 46 46 20 20 20 20 20 20 20 20 32 38 0a 23 64  OFF        28.#d
40a0: 65 66 69 6e 65 20 5a 49 50 46 49 4c 45 5f 43 44  efine ZIPFILE_CD
40b0: 53 5f 53 5a 43 4f 4d 50 52 45 53 53 45 44 5f 4f  S_SZCOMPRESSED_O
40c0: 46 46 20 32 30 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  FF 20../*.** Dec
40d0: 6f 64 65 20 74 68 65 20 43 44 53 20 72 65 63 6f  ode the CDS reco
40e0: 72 64 20 69 6e 20 62 75 66 66 65 72 20 61 42 75  rd in buffer aBu
40f0: 66 20 69 6e 74 6f 20 28 2a 70 43 44 53 29 2e 20  f into (*pCDS). 
4100: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  Return SQLITE_ER
4110: 52 4f 52 0a 2a 2a 20 69 66 20 74 68 65 20 72 65  ROR.** if the re
4120: 63 6f 72 64 20 69 73 20 6e 6f 74 20 77 65 6c 6c  cord is not well
4130: 2d 66 6f 72 6d 65 64 2c 20 6f 72 20 53 51 4c 49  -formed, or SQLI
4140: 54 45 5f 4f 4b 20 6f 74 68 65 72 77 69 73 65 2e  TE_OK otherwise.
4150: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .*/.static int z
4160: 69 70 66 69 6c 65 52 65 61 64 43 44 53 28 75 38  ipfileReadCDS(u8
4170: 20 2a 61 42 75 66 2c 20 5a 69 70 66 69 6c 65 43   *aBuf, ZipfileC
4180: 44 53 20 2a 70 43 44 53 29 7b 0a 20 20 75 38 20  DS *pCDS){.  u8 
4190: 2a 61 52 65 61 64 20 3d 20 61 42 75 66 3b 0a 20  *aRead = aBuf;. 
41a0: 20 75 33 32 20 73 69 67 20 3d 20 7a 69 70 66 69   u32 sig = zipfi
41b0: 6c 65 52 65 61 64 33 32 28 61 52 65 61 64 29 3b  leRead32(aRead);
41c0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
41d0: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 73 69 67  TE_OK;.  if( sig
41e0: 21 3d 5a 49 50 46 49 4c 45 5f 53 49 47 4e 41 54  !=ZIPFILE_SIGNAT
41f0: 55 52 45 5f 43 44 53 20 29 7b 0a 20 20 20 20 72  URE_CDS ){.    r
4200: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
4210: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
4220: 43 44 53 2d 3e 69 56 65 72 73 69 6f 6e 4d 61 64  CDS->iVersionMad
4230: 65 42 79 20 3d 20 7a 69 70 66 69 6c 65 52 65 61  eBy = zipfileRea
4240: 64 31 36 28 61 52 65 61 64 29 3b 0a 20 20 20 20  d16(aRead);.    
4250: 70 43 44 53 2d 3e 69 56 65 72 73 69 6f 6e 45 78  pCDS->iVersionEx
4260: 74 72 61 63 74 20 3d 20 7a 69 70 66 69 6c 65 52  tract = zipfileR
4270: 65 61 64 31 36 28 61 52 65 61 64 29 3b 0a 20 20  ead16(aRead);.  
4280: 20 20 70 43 44 53 2d 3e 66 6c 61 67 73 20 3d 20    pCDS->flags = 
4290: 7a 69 70 66 69 6c 65 52 65 61 64 31 36 28 61 52  zipfileRead16(aR
42a0: 65 61 64 29 3b 0a 20 20 20 20 70 43 44 53 2d 3e  ead);.    pCDS->
42b0: 69 43 6f 6d 70 72 65 73 73 69 6f 6e 20 3d 20 7a  iCompression = z
42c0: 69 70 66 69 6c 65 52 65 61 64 31 36 28 61 52 65  ipfileRead16(aRe
42d0: 61 64 29 3b 0a 20 20 20 20 70 43 44 53 2d 3e 6d  ad);.    pCDS->m
42e0: 54 69 6d 65 20 3d 20 7a 69 70 66 69 6c 65 52 65  Time = zipfileRe
42f0: 61 64 31 36 28 61 52 65 61 64 29 3b 0a 20 20 20  ad16(aRead);.   
4300: 20 70 43 44 53 2d 3e 6d 44 61 74 65 20 3d 20 7a   pCDS->mDate = z
4310: 69 70 66 69 6c 65 52 65 61 64 31 36 28 61 52 65  ipfileRead16(aRe
4320: 61 64 29 3b 0a 20 20 20 20 70 43 44 53 2d 3e 63  ad);.    pCDS->c
4330: 72 63 33 32 20 3d 20 7a 69 70 66 69 6c 65 52 65  rc32 = zipfileRe
4340: 61 64 33 32 28 61 52 65 61 64 29 3b 0a 20 20 20  ad32(aRead);.   
4350: 20 70 43 44 53 2d 3e 73 7a 43 6f 6d 70 72 65 73   pCDS->szCompres
4360: 73 65 64 20 3d 20 7a 69 70 66 69 6c 65 52 65 61  sed = zipfileRea
4370: 64 33 32 28 61 52 65 61 64 29 3b 0a 20 20 20 20  d32(aRead);.    
4380: 70 43 44 53 2d 3e 73 7a 55 6e 63 6f 6d 70 72 65  pCDS->szUncompre
4390: 73 73 65 64 20 3d 20 7a 69 70 66 69 6c 65 52 65  ssed = zipfileRe
43a0: 61 64 33 32 28 61 52 65 61 64 29 3b 0a 20 20 20  ad32(aRead);.   
43b0: 20 61 73 73 65 72 74 28 20 61 52 65 61 64 3d 3d   assert( aRead==
43c0: 26 61 42 75 66 5b 5a 49 50 46 49 4c 45 5f 43 44  &aBuf[ZIPFILE_CD
43d0: 53 5f 4e 46 49 4c 45 5f 4f 46 46 5d 20 29 3b 0a  S_NFILE_OFF] );.
43e0: 20 20 20 20 70 43 44 53 2d 3e 6e 46 69 6c 65 20      pCDS->nFile 
43f0: 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 31 36 28  = zipfileRead16(
4400: 61 52 65 61 64 29 3b 0a 20 20 20 20 70 43 44 53  aRead);.    pCDS
4410: 2d 3e 6e 45 78 74 72 61 20 3d 20 7a 69 70 66 69  ->nExtra = zipfi
4420: 6c 65 52 65 61 64 31 36 28 61 52 65 61 64 29 3b  leRead16(aRead);
4430: 0a 20 20 20 20 70 43 44 53 2d 3e 6e 43 6f 6d 6d  .    pCDS->nComm
4440: 65 6e 74 20 3d 20 7a 69 70 66 69 6c 65 52 65 61  ent = zipfileRea
4450: 64 31 36 28 61 52 65 61 64 29 3b 0a 20 20 20 20  d16(aRead);.    
4460: 70 43 44 53 2d 3e 69 44 69 73 6b 53 74 61 72 74  pCDS->iDiskStart
4470: 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 31 36   = zipfileRead16
4480: 28 61 52 65 61 64 29 3b 0a 20 20 20 20 70 43 44  (aRead);.    pCD
4490: 53 2d 3e 69 49 6e 74 65 72 6e 61 6c 41 74 74 72  S->iInternalAttr
44a0: 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 31 36   = zipfileRead16
44b0: 28 61 52 65 61 64 29 3b 0a 20 20 20 20 70 43 44  (aRead);.    pCD
44c0: 53 2d 3e 69 45 78 74 65 72 6e 61 6c 41 74 74 72  S->iExternalAttr
44d0: 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 33 32   = zipfileRead32
44e0: 28 61 52 65 61 64 29 3b 0a 20 20 20 20 70 43 44  (aRead);.    pCD
44f0: 53 2d 3e 69 4f 66 66 73 65 74 20 3d 20 7a 69 70  S->iOffset = zip
4500: 66 69 6c 65 52 65 61 64 33 32 28 61 52 65 61 64  fileRead32(aRead
4510: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
4520: 52 65 61 64 3d 3d 26 61 42 75 66 5b 5a 49 50 46  Read==&aBuf[ZIPF
4530: 49 4c 45 5f 43 44 53 5f 46 49 58 45 44 5f 53 5a  ILE_CDS_FIXED_SZ
4540: 5d 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ] );.  }..  retu
4550: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4560: 44 65 63 6f 64 65 20 74 68 65 20 4c 46 48 20 72  Decode the LFH r
4570: 65 63 6f 72 64 20 69 6e 20 62 75 66 66 65 72 20  ecord in buffer 
4580: 61 42 75 66 20 69 6e 74 6f 20 28 2a 70 4c 46 48  aBuf into (*pLFH
4590: 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ). Return SQLITE
45a0: 5f 45 52 52 4f 52 0a 2a 2a 20 69 66 20 74 68 65  _ERROR.** if the
45b0: 20 72 65 63 6f 72 64 20 69 73 20 6e 6f 74 20 77   record is not w
45c0: 65 6c 6c 2d 66 6f 72 6d 65 64 2c 20 6f 72 20 53  ell-formed, or S
45d0: 51 4c 49 54 45 5f 4f 4b 20 6f 74 68 65 72 77 69  QLITE_OK otherwi
45e0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
45f0: 74 20 7a 69 70 66 69 6c 65 52 65 61 64 4c 46 48  t zipfileReadLFH
4600: 28 0a 20 20 75 38 20 2a 61 42 75 66 66 65 72 2c  (.  u8 *aBuffer,
4610: 0a 20 20 5a 69 70 66 69 6c 65 4c 46 48 20 2a 70  .  ZipfileLFH *p
4620: 4c 46 48 0a 29 7b 0a 20 20 75 38 20 2a 61 52 65  LFH.){.  u8 *aRe
4630: 61 64 20 3d 20 61 42 75 66 66 65 72 3b 0a 20 20  ad = aBuffer;.  
4640: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4650: 4f 4b 3b 0a 0a 20 20 75 33 32 20 73 69 67 20 3d  OK;..  u32 sig =
4660: 20 7a 69 70 66 69 6c 65 52 65 61 64 33 32 28 61   zipfileRead32(a
4670: 52 65 61 64 29 3b 0a 20 20 69 66 28 20 73 69 67  Read);.  if( sig
4680: 21 3d 5a 49 50 46 49 4c 45 5f 53 49 47 4e 41 54  !=ZIPFILE_SIGNAT
4690: 55 52 45 5f 4c 46 48 20 29 7b 0a 20 20 20 20 72  URE_LFH ){.    r
46a0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
46b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
46c0: 4c 46 48 2d 3e 69 56 65 72 73 69 6f 6e 45 78 74  LFH->iVersionExt
46d0: 72 61 63 74 20 3d 20 7a 69 70 66 69 6c 65 52 65  ract = zipfileRe
46e0: 61 64 31 36 28 61 52 65 61 64 29 3b 0a 20 20 20  ad16(aRead);.   
46f0: 20 70 4c 46 48 2d 3e 66 6c 61 67 73 20 3d 20 7a   pLFH->flags = z
4700: 69 70 66 69 6c 65 52 65 61 64 31 36 28 61 52 65  ipfileRead16(aRe
4710: 61 64 29 3b 0a 20 20 20 20 70 4c 46 48 2d 3e 69  ad);.    pLFH->i
4720: 43 6f 6d 70 72 65 73 73 69 6f 6e 20 3d 20 7a 69  Compression = zi
4730: 70 66 69 6c 65 52 65 61 64 31 36 28 61 52 65 61  pfileRead16(aRea
4740: 64 29 3b 0a 20 20 20 20 70 4c 46 48 2d 3e 6d 54  d);.    pLFH->mT
4750: 69 6d 65 20 3d 20 7a 69 70 66 69 6c 65 52 65 61  ime = zipfileRea
4760: 64 31 36 28 61 52 65 61 64 29 3b 0a 20 20 20 20  d16(aRead);.    
4770: 70 4c 46 48 2d 3e 6d 44 61 74 65 20 3d 20 7a 69  pLFH->mDate = zi
4780: 70 66 69 6c 65 52 65 61 64 31 36 28 61 52 65 61  pfileRead16(aRea
4790: 64 29 3b 0a 20 20 20 20 70 4c 46 48 2d 3e 63 72  d);.    pLFH->cr
47a0: 63 33 32 20 3d 20 7a 69 70 66 69 6c 65 52 65 61  c32 = zipfileRea
47b0: 64 33 32 28 61 52 65 61 64 29 3b 0a 20 20 20 20  d32(aRead);.    
47c0: 70 4c 46 48 2d 3e 73 7a 43 6f 6d 70 72 65 73 73  pLFH->szCompress
47d0: 65 64 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64  ed = zipfileRead
47e0: 33 32 28 61 52 65 61 64 29 3b 0a 20 20 20 20 70  32(aRead);.    p
47f0: 4c 46 48 2d 3e 73 7a 55 6e 63 6f 6d 70 72 65 73  LFH->szUncompres
4800: 73 65 64 20 3d 20 7a 69 70 66 69 6c 65 52 65 61  sed = zipfileRea
4810: 64 33 32 28 61 52 65 61 64 29 3b 0a 20 20 20 20  d32(aRead);.    
4820: 70 4c 46 48 2d 3e 6e 46 69 6c 65 20 3d 20 7a 69  pLFH->nFile = zi
4830: 70 66 69 6c 65 52 65 61 64 31 36 28 61 52 65 61  pfileRead16(aRea
4840: 64 29 3b 0a 20 20 20 20 70 4c 46 48 2d 3e 6e 45  d);.    pLFH->nE
4850: 78 74 72 61 20 3d 20 7a 69 70 66 69 6c 65 52 65  xtra = zipfileRe
4860: 61 64 31 36 28 61 52 65 61 64 29 3b 0a 20 20 7d  ad16(aRead);.  }
4870: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4880: 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 61  ../*.** Buffer a
4890: 45 78 74 72 61 20 28 73 69 7a 65 20 6e 45 78 74  Extra (size nExt
48a0: 72 61 20 62 79 74 65 73 29 20 63 6f 6e 74 61 69  ra bytes) contai
48b0: 6e 73 20 7a 69 70 20 61 72 63 68 69 76 65 20 22  ns zip archive "
48c0: 65 78 74 72 61 22 20 66 69 65 6c 64 73 2e 0a 2a  extra" fields..*
48d0: 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
48e0: 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 66 69  his buffer to fi
48f0: 6e 64 20 61 6e 20 22 65 78 74 72 61 2d 74 69 6d  nd an "extra-tim
4900: 65 73 74 61 6d 70 22 20 66 69 65 6c 64 2e 20 49  estamp" field. I
4910: 66 20 6f 6e 65 0a 2a 2a 20 65 78 69 73 74 73 2c  f one.** exists,
4920: 20 65 78 74 72 61 63 74 20 74 68 65 20 33 32 2d   extract the 32-
4930: 62 69 74 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  bit modification
4940: 2d 74 69 6d 65 73 74 61 6d 70 20 66 72 6f 6d 20  -timestamp from 
4950: 69 74 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20  it and store.** 
4960: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 6f 75 74  the value in out
4970: 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70  put parameter *p
4980: 6d 54 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72  mTime..**.** Zer
4990: 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  o is returned if
49a0: 20 6e 6f 20 65 78 74 72 61 2d 74 69 6d 65 73 74   no extra-timest
49b0: 61 6d 70 20 72 65 63 6f 72 64 20 63 6f 75 6c 64  amp record could
49c0: 20 62 65 20 66 6f 75 6e 64 20 28 61 6e 64 20 73   be found (and s
49d0: 6f 0a 2a 2a 20 2a 70 6d 54 69 6d 65 20 69 73 20  o.** *pmTime is 
49e0: 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 29 2c  left unchanged),
49f0: 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 74 68   or non-zero oth
4a00: 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  erwise..**.** Th
4a10: 65 20 67 65 6e 65 72 61 6c 20 66 6f 72 6d 61 74  e general format
4a20: 20 6f 66 20 61 6e 20 65 78 74 72 61 20 66 69 65   of an extra fie
4a30: 6c 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 48  ld is:.**.**   H
4a40: 65 61 64 65 72 20 49 44 20 20 20 20 32 20 62 79  eader ID    2 by
4a50: 74 65 73 0a 2a 2a 20 20 20 44 61 74 61 20 53 69  tes.**   Data Si
4a60: 7a 65 20 20 20 20 32 20 62 79 74 65 73 0a 2a 2a  ze    2 bytes.**
4a70: 20 20 20 44 61 74 61 20 20 20 20 20 20 20 20 20     Data         
4a80: 4e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69  N bytes.*/.stati
4a90: 63 20 69 6e 74 20 7a 69 70 66 69 6c 65 53 63 61  c int zipfileSca
4aa0: 6e 45 78 74 72 61 28 75 38 20 2a 61 45 78 74 72  nExtra(u8 *aExtr
4ab0: 61 2c 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 75  a, int nExtra, u
4ac0: 33 32 20 2a 70 6d 54 69 6d 65 29 7b 0a 20 20 69  32 *pmTime){.  i
4ad0: 6e 74 20 72 65 74 20 3d 20 30 3b 0a 20 20 75 38  nt ret = 0;.  u8
4ae0: 20 2a 70 20 3d 20 61 45 78 74 72 61 3b 0a 20 20   *p = aExtra;.  
4af0: 75 38 20 2a 70 45 6e 64 20 3d 20 26 61 45 78 74  u8 *pEnd = &aExt
4b00: 72 61 5b 6e 45 78 74 72 61 5d 3b 0a 0a 20 20 77  ra[nExtra];..  w
4b10: 68 69 6c 65 28 20 70 3c 70 45 6e 64 20 29 7b 0a  hile( p<pEnd ){.
4b20: 20 20 20 20 75 31 36 20 69 64 20 3d 20 7a 69 70      u16 id = zip
4b30: 66 69 6c 65 52 65 61 64 31 36 28 70 29 3b 0a 20  fileRead16(p);. 
4b40: 20 20 20 75 31 36 20 6e 42 79 74 65 20 3d 20 7a     u16 nByte = z
4b50: 69 70 66 69 6c 65 52 65 61 64 31 36 28 70 29 3b  ipfileRead16(p);
4b60: 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20 69 64  ..    switch( id
4b70: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 5a   ){.      case Z
4b80: 49 50 46 49 4c 45 5f 45 58 54 52 41 5f 54 49 4d  IPFILE_EXTRA_TIM
4b90: 45 53 54 41 4d 50 3a 20 7b 0a 20 20 20 20 20 20  ESTAMP: {.      
4ba0: 20 20 75 38 20 62 20 3d 20 70 5b 30 5d 3b 0a 20    u8 b = p[0];. 
4bb0: 20 20 20 20 20 20 20 69 66 28 20 62 20 26 20 30         if( b & 0
4bc0: 78 30 31 20 29 7b 20 20 20 20 20 2f 2a 20 30 78  x01 ){     /* 0x
4bd0: 30 31 20 2d 3e 20 6d 6f 64 74 69 6d 65 20 69 73  01 -> modtime is
4be0: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 20 20   present */.    
4bf0: 20 20 20 20 20 20 2a 70 6d 54 69 6d 65 20 3d 20        *pmTime = 
4c00: 7a 69 70 66 69 6c 65 47 65 74 55 33 32 28 26 70  zipfileGetU32(&p
4c10: 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [1]);.          
4c20: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ret = 1;.       
4c30: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
4c40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4c50: 0a 20 20 20 20 70 20 2b 3d 20 6e 42 79 74 65 3b  .    p += nByte;
4c60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
4c70: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  t;.}../*.** Conv
4c80: 65 72 74 20 74 68 65 20 73 74 61 6e 64 61 72 64  ert the standard
4c90: 20 4d 53 2d 44 4f 53 20 74 69 6d 65 73 74 61 6d   MS-DOS timestam
4ca0: 70 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  p stored in the 
4cb0: 6d 54 69 6d 65 20 61 6e 64 20 6d 44 61 74 65 0a  mTime and mDate.
4cc0: 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ** fields of the
4cd0: 20 43 44 53 20 73 74 72 75 63 74 75 72 65 20 70   CDS structure p
4ce0: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
4cf0: 79 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 61 20  y argument to a 
4d00: 33 32 2d 62 69 74 0a 2a 2a 20 55 4e 49 58 20 73  32-bit.** UNIX s
4d10: 65 63 6f 6e 64 73 2d 73 69 6e 63 65 2d 74 68 65  econds-since-the
4d20: 2d 65 70 6f 63 68 20 74 69 6d 65 73 74 61 6d 70  -epoch timestamp
4d30: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73  . Return the res
4d40: 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 22 53 74 61 6e  ult..**.** "Stan
4d50: 64 61 72 64 22 20 4d 53 2d 44 4f 53 20 74 69 6d  dard" MS-DOS tim
4d60: 65 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20  e format:.**.** 
4d70: 20 20 46 69 6c 65 20 6d 6f 64 69 66 69 63 61 74    File modificat
4d80: 69 6f 6e 20 74 69 6d 65 3a 0a 2a 2a 20 20 20 20  ion time:.**    
4d90: 20 42 69 74 73 20 30 30 2d 30 34 3a 20 73 65 63   Bits 00-04: sec
4da0: 6f 6e 64 73 20 64 69 76 69 64 65 64 20 62 79 20  onds divided by 
4db0: 32 0a 2a 2a 20 20 20 20 20 42 69 74 73 20 30 35  2.**     Bits 05
4dc0: 2d 31 30 3a 20 6d 69 6e 75 74 65 0a 2a 2a 20 20  -10: minute.**  
4dd0: 20 20 20 42 69 74 73 20 31 31 2d 31 35 3a 20 68     Bits 11-15: h
4de0: 6f 75 72 0a 2a 2a 20 20 20 46 69 6c 65 20 6d 6f  our.**   File mo
4df0: 64 69 66 69 63 61 74 69 6f 6e 20 64 61 74 65 3a  dification date:
4e00: 0a 2a 2a 20 20 20 20 20 42 69 74 73 20 30 30 2d  .**     Bits 00-
4e10: 30 34 3a 20 64 61 79 0a 2a 2a 20 20 20 20 20 42  04: day.**     B
4e20: 69 74 73 20 30 35 2d 30 38 3a 20 6d 6f 6e 74 68  its 05-08: month
4e30: 20 28 31 2d 31 32 29 0a 2a 2a 20 20 20 20 20 42   (1-12).**     B
4e40: 69 74 73 20 30 39 2d 31 35 3a 20 79 65 61 72 73  its 09-15: years
4e50: 20 66 72 6f 6d 20 31 39 38 30 20 0a 2a 2a 0a 2a   from 1980 .**.*
4e60: 2a 20 68 74 74 70 73 3a 2f 2f 6d 73 64 6e 2e 6d  * https://msdn.m
4e70: 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 65 6e 2d  icrosoft.com/en-
4e80: 75 73 2f 6c 69 62 72 61 72 79 2f 39 6b 6b 66 39  us/library/9kkf9
4e90: 74 61 68 2e 61 73 70 78 0a 2a 2f 0a 73 74 61 74  tah.aspx.*/.stat
4ea0: 69 63 20 75 33 32 20 7a 69 70 66 69 6c 65 4d 74  ic u32 zipfileMt
4eb0: 69 6d 65 28 5a 69 70 66 69 6c 65 43 44 53 20 2a  ime(ZipfileCDS *
4ec0: 70 43 44 53 29 7b 0a 20 20 69 6e 74 20 59 20 3d  pCDS){.  int Y =
4ed0: 20 28 31 39 38 30 20 2b 20 28 28 70 43 44 53 2d   (1980 + ((pCDS-
4ee0: 3e 6d 44 61 74 65 20 3e 3e 20 39 29 20 26 20 30  >mDate >> 9) & 0
4ef0: 78 37 46 29 29 3b 0a 20 20 69 6e 74 20 4d 20 3d  x7F));.  int M =
4f00: 20 28 28 70 43 44 53 2d 3e 6d 44 61 74 65 20 3e   ((pCDS->mDate >
4f10: 3e 20 35 29 20 26 20 30 78 30 46 29 3b 0a 20 20  > 5) & 0x0F);.  
4f20: 69 6e 74 20 44 20 3d 20 28 70 43 44 53 2d 3e 6d  int D = (pCDS->m
4f30: 44 61 74 65 20 26 20 30 78 31 46 29 3b 0a 20 20  Date & 0x1F);.  
4f40: 69 6e 74 20 42 20 3d 20 2d 31 33 3b 0a 0a 20 20  int B = -13;..  
4f50: 69 6e 74 20 73 65 63 20 3d 20 28 70 43 44 53 2d  int sec = (pCDS-
4f60: 3e 6d 54 69 6d 65 20 26 20 30 78 31 46 29 2a 32  >mTime & 0x1F)*2
4f70: 3b 0a 20 20 69 6e 74 20 6d 69 6e 20 3d 20 28 70  ;.  int min = (p
4f80: 43 44 53 2d 3e 6d 54 69 6d 65 20 3e 3e 20 35 29  CDS->mTime >> 5)
4f90: 20 26 20 30 78 33 46 3b 0a 20 20 69 6e 74 20 68   & 0x3F;.  int h
4fa0: 72 20 3d 20 28 70 43 44 53 2d 3e 6d 54 69 6d 65  r = (pCDS->mTime
4fb0: 20 3e 3e 20 31 31 29 20 26 20 30 78 31 46 3b 0a   >> 11) & 0x1F;.
4fc0: 20 20 69 36 34 20 4a 44 3b 0a 0a 20 20 2f 2a 20    i64 JD;..  /* 
4fd0: 4a 44 20 3d 20 49 4e 54 28 33 36 35 2e 32 35 20  JD = INT(365.25 
4fe0: 2a 20 28 59 2b 34 37 31 36 29 29 20 2b 20 49 4e  * (Y+4716)) + IN
4ff0: 54 28 33 30 2e 36 30 30 31 20 2a 20 28 4d 2b 31  T(30.6001 * (M+1
5000: 29 29 20 2b 20 44 20 2b 20 42 20 2d 20 31 35 32  )) + D + B - 152
5010: 34 2e 35 20 2a 2f 0a 0a 20 20 2f 2a 20 43 61 6c  4.5 */..  /* Cal
5020: 63 75 6c 61 74 65 20 74 68 65 20 4a 44 20 69 6e  culate the JD in
5030: 20 73 65 63 6f 6e 64 73 20 66 6f 72 20 6e 6f 6f   seconds for noo
5040: 6e 20 6f 6e 20 74 68 65 20 64 61 79 20 69 6e 20  n on the day in 
5050: 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  question */.  if
5060: 28 20 4d 3c 33 20 29 7b 0a 20 20 20 20 59 20 3d  ( M<3 ){.    Y =
5070: 20 59 2d 31 3b 0a 20 20 20 20 4d 20 3d 20 4d 2b   Y-1;.    M = M+
5080: 31 32 3b 0a 20 20 7d 0a 20 20 4a 44 20 3d 20 28  12;.  }.  JD = (
5090: 69 36 34 29 28 32 34 2a 36 30 2a 36 30 29 20 2a  i64)(24*60*60) *
50a0: 20 28 0a 20 20 20 20 20 20 28 69 6e 74 29 28 33   (.      (int)(3
50b0: 36 35 2e 32 35 20 2a 20 28 59 20 2b 20 34 37 31  65.25 * (Y + 471
50c0: 36 29 29 0a 20 20 20 20 2b 20 28 69 6e 74 29 28  6)).    + (int)(
50d0: 33 30 2e 36 30 30 31 20 2a 20 28 4d 20 2b 20 31  30.6001 * (M + 1
50e0: 29 29 0a 20 20 20 20 2b 20 44 20 2b 20 42 20 2d  )).    + D + B -
50f0: 20 31 35 32 34 0a 20 20 29 3b 0a 0a 20 20 2f 2a   1524.  );..  /*
5100: 20 43 6f 72 72 65 63 74 20 74 68 65 20 4a 44 20   Correct the JD 
5110: 66 6f 72 20 74 68 65 20 74 69 6d 65 20 77 69 74  for the time wit
5120: 68 69 6e 20 74 68 65 20 64 61 79 20 2a 2f 0a 20  hin the day */. 
5130: 20 4a 44 20 2b 3d 20 28 68 72 2d 31 32 29 20 2a   JD += (hr-12) *
5140: 20 33 36 30 30 20 2b 20 6d 69 6e 20 2a 20 36 30   3600 + min * 60
5150: 20 2b 20 73 65 63 3b 0a 0a 20 20 2f 2a 20 43 6f   + sec;..  /* Co
5160: 6e 76 65 72 74 20 4a 44 20 74 6f 20 75 6e 69 78  nvert JD to unix
5170: 20 74 69 6d 65 73 74 61 6d 70 20 28 74 68 65 20   timestamp (the 
5180: 4a 44 20 65 70 6f 63 68 20 69 73 20 32 34 34 30  JD epoch is 2440
5190: 35 38 37 2e 35 29 20 2a 2f 0a 20 20 72 65 74 75  587.5) */.  retu
51a0: 72 6e 20 28 75 33 32 29 28 4a 44 20 2d 20 28 69  rn (u32)(JD - (i
51b0: 36 34 29 28 32 34 34 30 35 38 37 35 29 20 2a 20  64)(24405875) * 
51c0: 32 34 2a 36 30 2a 36 29 3b 0a 7d 0a 0a 2f 2a 0a  24*60*6);.}../*.
51d0: 2a 2a 20 54 68 65 20 6f 70 70 6f 73 69 74 65 20  ** The opposite 
51e0: 6f 66 20 7a 69 70 66 69 6c 65 4d 74 69 6d 65 28  of zipfileMtime(
51f0: 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ). This function
5200: 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 6d   populates the m
5210: 54 69 6d 65 20 61 6e 64 0a 2a 2a 20 6d 44 61 74  Time and.** mDat
5220: 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
5230: 43 44 53 20 73 74 72 75 63 74 75 72 65 20 70 61  CDS structure pa
5240: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
5250: 74 20 61 72 67 75 6d 65 6e 74 20 61 63 63 6f 72  t argument accor
5260: 64 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 55  ding.** to the U
5270: 4e 49 58 20 74 69 6d 65 73 74 61 6d 70 20 76 61  NIX timestamp va
5280: 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
5290: 65 20 73 65 63 6f 6e 64 2e 0a 2a 2f 0a 73 74 61  e second..*/.sta
52a0: 74 69 63 20 76 6f 69 64 20 7a 69 70 66 69 6c 65  tic void zipfile
52b0: 4d 74 69 6d 65 54 6f 44 6f 73 28 5a 69 70 66 69  MtimeToDos(Zipfi
52c0: 6c 65 43 44 53 20 2a 70 43 64 73 2c 20 75 33 32  leCDS *pCds, u32
52d0: 20 6d 55 6e 69 78 54 69 6d 65 29 7b 0a 20 20 2f   mUnixTime){.  /
52e0: 2a 20 43 6f 6e 76 65 72 74 20 75 6e 69 78 20 74  * Convert unix t
52f0: 69 6d 65 73 74 61 6d 70 20 74 6f 20 4a 44 20 28  imestamp to JD (
5300: 32 34 34 30 35 38 38 20 69 73 20 6e 6f 6f 6e 20  2440588 is noon 
5310: 6f 6e 20 31 2f 31 2f 31 39 37 30 29 20 2a 2f 0a  on 1/1/1970) */.
5320: 20 20 69 36 34 20 4a 44 20 3d 20 28 69 36 34 29    i64 JD = (i64)
5330: 32 34 34 30 35 38 38 20 2b 20 6d 55 6e 69 78 54  2440588 + mUnixT
5340: 69 6d 65 20 2f 20 28 32 34 2a 36 30 2a 36 30 29  ime / (24*60*60)
5350: 3b 0a 0a 20 20 69 6e 74 20 41 2c 20 42 2c 20 43  ;..  int A, B, C
5360: 2c 20 44 2c 20 45 3b 0a 20 20 69 6e 74 20 79 72  , D, E;.  int yr
5370: 2c 20 6d 6f 6e 2c 20 64 61 79 3b 0a 20 20 69 6e  , mon, day;.  in
5380: 74 20 68 72 2c 20 6d 69 6e 2c 20 73 65 63 3b 0a  t hr, min, sec;.
5390: 0a 20 20 41 20 3d 20 28 69 6e 74 29 28 28 4a 44  .  A = (int)((JD
53a0: 20 2d 20 31 38 36 37 32 31 36 2e 32 35 29 2f 33   - 1867216.25)/3
53b0: 36 35 32 34 2e 32 35 29 3b 0a 20 20 41 20 3d 20  6524.25);.  A = 
53c0: 28 69 6e 74 29 28 4a 44 20 2b 20 31 20 2b 20 41  (int)(JD + 1 + A
53d0: 20 2d 20 28 41 2f 34 29 29 3b 0a 20 20 42 20 3d   - (A/4));.  B =
53e0: 20 41 20 2b 20 31 35 32 34 3b 0a 20 20 43 20 3d   A + 1524;.  C =
53f0: 20 28 69 6e 74 29 28 28 42 20 2d 20 31 32 32 2e   (int)((B - 122.
5400: 31 29 2f 33 36 35 2e 32 35 29 3b 0a 20 20 44 20  1)/365.25);.  D 
5410: 3d 20 28 33 36 35 32 35 2a 28 43 26 33 32 37 36  = (36525*(C&3276
5420: 37 29 29 2f 31 30 30 3b 0a 20 20 45 20 3d 20 28  7))/100;.  E = (
5430: 69 6e 74 29 28 28 42 2d 44 29 2f 33 30 2e 36 30  int)((B-D)/30.60
5440: 30 31 29 3b 0a 0a 20 20 64 61 79 20 3d 20 42 20  01);..  day = B 
5450: 2d 20 44 20 2d 20 28 69 6e 74 29 28 33 30 2e 36  - D - (int)(30.6
5460: 30 30 31 2a 45 29 3b 0a 20 20 6d 6f 6e 20 3d 20  001*E);.  mon = 
5470: 28 45 3c 31 34 20 3f 20 45 2d 31 20 3a 20 45 2d  (E<14 ? E-1 : E-
5480: 31 33 29 3b 0a 20 20 79 72 20 3d 20 6d 6f 6e 3e  13);.  yr = mon>
5490: 32 20 3f 20 43 2d 34 37 31 36 20 3a 20 43 2d 34  2 ? C-4716 : C-4
54a0: 37 31 35 3b 0a 0a 20 20 68 72 20 3d 20 28 6d 55  715;..  hr = (mU
54b0: 6e 69 78 54 69 6d 65 20 25 20 28 32 34 2a 36 30  nixTime % (24*60
54c0: 2a 36 30 29 29 20 2f 20 28 36 30 2a 36 30 29 3b  *60)) / (60*60);
54d0: 0a 20 20 6d 69 6e 20 3d 20 28 6d 55 6e 69 78 54  .  min = (mUnixT
54e0: 69 6d 65 20 25 20 28 36 30 2a 36 30 29 29 20 2f  ime % (60*60)) /
54f0: 20 36 30 3b 0a 20 20 73 65 63 20 3d 20 28 6d 55   60;.  sec = (mU
5500: 6e 69 78 54 69 6d 65 20 25 20 36 30 29 3b 0a 0a  nixTime % 60);..
5510: 20 20 69 66 28 20 79 72 3e 3d 31 39 38 30 20 29    if( yr>=1980 )
5520: 7b 0a 20 20 20 20 70 43 64 73 2d 3e 6d 44 61 74  {.    pCds->mDat
5530: 65 20 3d 20 28 75 31 36 29 28 64 61 79 20 2b 20  e = (u16)(day + 
5540: 28 6d 6f 6e 20 3c 3c 20 35 29 20 2b 20 28 28 79  (mon << 5) + ((y
5550: 72 2d 31 39 38 30 29 20 3c 3c 20 39 29 29 3b 0a  r-1980) << 9));.
5560: 20 20 20 20 70 43 64 73 2d 3e 6d 54 69 6d 65 20      pCds->mTime 
5570: 3d 20 28 75 31 36 29 28 73 65 63 2f 32 20 2b 20  = (u16)(sec/2 + 
5580: 28 6d 69 6e 3c 3c 35 29 20 2b 20 28 68 72 3c 3c  (min<<5) + (hr<<
5590: 31 31 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  11));.  }else{. 
55a0: 20 20 20 70 43 64 73 2d 3e 6d 44 61 74 65 20 3d     pCds->mDate =
55b0: 20 70 43 64 73 2d 3e 6d 54 69 6d 65 20 3d 20 30   pCds->mTime = 0
55c0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
55d0: 20 6d 55 6e 69 78 54 69 6d 65 3c 33 31 35 35 30   mUnixTime<31550
55e0: 37 36 30 30 20 0a 20 20 20 20 20 20 20 7c 7c 20  7600 .       || 
55f0: 6d 55 6e 69 78 54 69 6d 65 3d 3d 7a 69 70 66 69  mUnixTime==zipfi
5600: 6c 65 4d 74 69 6d 65 28 70 43 64 73 29 20 0a 20  leMtime(pCds) . 
5610: 20 20 20 20 20 20 7c 7c 20 28 28 6d 55 6e 69 78        || ((mUnix
5620: 54 69 6d 65 20 25 20 32 29 20 26 26 20 6d 55 6e  Time % 2) && mUn
5630: 69 78 54 69 6d 65 2d 31 3d 3d 7a 69 70 66 69 6c  ixTime-1==zipfil
5640: 65 4d 74 69 6d 65 28 70 43 64 73 29 29 20 0a 20  eMtime(pCds)) . 
5650: 20 20 20 20 20 20 2f 2a 20 7c 7c 20 28 6d 55 6e        /* || (mUn
5660: 69 78 54 69 6d 65 20 25 20 32 29 20 2a 2f 0a 20  ixTime % 2) */. 
5670: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   );.}../*.** If 
5680: 61 42 6c 6f 62 20 69 73 20 6e 6f 74 20 4e 55 4c  aBlob is not NUL
5690: 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  L, then it is a 
56a0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66  pointer to a buf
56b0: 66 65 72 20 28 6e 42 6c 6f 62 20 62 79 74 65 73  fer (nBlob bytes
56c0: 20 69 6e 0a 2a 2a 20 73 69 7a 65 29 20 63 6f 6e   in.** size) con
56d0: 74 61 69 6e 69 6e 67 20 61 6e 20 65 6e 74 69 72  taining an entir
56e0: 65 20 7a 69 70 20 61 72 63 68 69 76 65 20 69 6d  e zip archive im
56f0: 61 67 65 2e 20 4f 72 2c 20 69 66 20 61 42 6c 6f  age. Or, if aBlo
5700: 62 20 69 73 20 4e 55 4c 4c 2c 0a 2a 2a 20 74 68  b is NULL,.** th
5710: 65 6e 20 70 46 69 6c 65 20 69 73 20 61 20 66 69  en pFile is a fi
5720: 6c 65 2d 68 61 6e 64 6c 65 20 6f 70 65 6e 20 6f  le-handle open o
5730: 6e 20 61 20 7a 69 70 20 66 69 6c 65 2e 20 49 6e  n a zip file. In
5740: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68   either case, th
5750: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63  is.** function c
5760: 72 65 61 74 65 73 20 61 20 5a 69 70 66 69 6c 65  reates a Zipfile
5770: 45 6e 74 72 79 20 6f 62 6a 65 63 74 20 62 61 73  Entry object bas
5780: 65 64 20 6f 6e 20 74 68 65 20 7a 69 70 20 61 72  ed on the zip ar
5790: 63 68 69 76 65 20 65 6e 74 72 79 0a 2a 2a 20 66  chive entry.** f
57a0: 6f 72 20 77 68 69 63 68 20 74 68 65 20 43 44 53  or which the CDS
57b0: 20 72 65 63 6f 72 64 20 69 73 20 61 74 20 6f 66   record is at of
57c0: 66 73 65 74 20 69 4f 66 66 2e 0a 2a 2a 0a 2a 2a  fset iOff..**.**
57d0: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
57e0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
57f0: 75 72 6e 65 64 20 61 6e 64 20 28 2a 70 70 45 6e  urned and (*ppEn
5800: 74 72 79 29 20 73 65 74 20 74 6f 20 70 6f 69 6e  try) set to poin
5810: 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20  t to.** the new 
5820: 6f 62 6a 65 63 74 2e 20 4f 74 68 65 72 77 69 73  object. Otherwis
5830: 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  e, an SQLite err
5840: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
5850: 6e 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66  ned and the.** f
5860: 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 28 2a  inal value of (*
5870: 70 70 45 6e 74 72 79 29 20 75 6e 64 65 66 69 6e  ppEntry) undefin
5880: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
5890: 74 20 7a 69 70 66 69 6c 65 47 65 74 45 6e 74 72  t zipfileGetEntr
58a0: 79 28 0a 20 20 5a 69 70 66 69 6c 65 54 61 62 20  y(.  ZipfileTab 
58b0: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
58c0: 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 61 6e       /* Store an
58d0: 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  y error message 
58e0: 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
58f0: 75 38 20 2a 61 42 6c 6f 62 2c 20 20 20 20 20 20  u8 *aBlob,      
5900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
5910: 6e 74 65 72 20 74 6f 20 69 6e 2d 6d 65 6d 6f 72  nter to in-memor
5920: 79 20 66 69 6c 65 20 69 6d 61 67 65 20 2a 2f 0a  y file image */.
5930: 20 20 69 6e 74 20 6e 42 6c 6f 62 2c 20 20 20 20    int nBlob,    
5940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5950: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 42 6c    /* Size of aBl
5960: 6f 62 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f  ob[] in bytes */
5970: 0a 20 20 46 49 4c 45 20 2a 70 46 69 6c 65 2c 20  .  FILE *pFile, 
5980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5990: 20 20 20 2f 2a 20 49 66 20 61 42 6c 6f 62 3d 3d     /* If aBlob==
59a0: 30 2c 20 72 65 61 64 20 66 72 6f 6d 20 74 68 69  0, read from thi
59b0: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  s file */.  i64 
59c0: 69 4f 66 66 2c 20 20 20 20 20 20 20 20 20 20 20  iOff,           
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
59e0: 66 66 73 65 74 20 6f 66 20 43 44 53 20 72 65 63  ffset of CDS rec
59f0: 6f 72 64 20 2a 2f 0a 20 20 5a 69 70 66 69 6c 65  ord */.  Zipfile
5a00: 45 6e 74 72 79 20 2a 2a 70 70 45 6e 74 72 79 20  Entry **ppEntry 
5a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
5a20: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
5a30: 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 75  object */.){.  u
5a40: 38 20 2a 61 52 65 61 64 3b 0a 20 20 63 68 61 72  8 *aRead;.  char
5a50: 20 2a 2a 70 7a 45 72 72 20 3d 20 26 70 54 61 62   **pzErr = &pTab
5a60: 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 3b 0a  ->base.zErrMsg;.
5a70: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
5a80: 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 61 42 6c  E_OK;..  if( aBl
5a90: 6f 62 3d 3d 30 20 29 7b 0a 20 20 20 20 61 52 65  ob==0 ){.    aRe
5aa0: 61 64 20 3d 20 70 54 61 62 2d 3e 61 42 75 66 66  ad = pTab->aBuff
5ab0: 65 72 3b 0a 20 20 20 20 72 63 20 3d 20 7a 69 70  er;.    rc = zip
5ac0: 66 69 6c 65 52 65 61 64 44 61 74 61 28 70 46 69  fileReadData(pFi
5ad0: 6c 65 2c 20 61 52 65 61 64 2c 20 5a 49 50 46 49  le, aRead, ZIPFI
5ae0: 4c 45 5f 43 44 53 5f 46 49 58 45 44 5f 53 5a 2c  LE_CDS_FIXED_SZ,
5af0: 20 69 4f 66 66 2c 20 70 7a 45 72 72 29 3b 0a 20   iOff, pzErr);. 
5b00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 52 65 61   }else{.    aRea
5b10: 64 20 3d 20 28 75 38 2a 29 26 61 42 6c 6f 62 5b  d = (u8*)&aBlob[
5b20: 69 4f 66 66 5d 3b 0a 20 20 7d 0a 0a 20 20 69 66  iOff];.  }..  if
5b30: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5b40: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f  ){.    int nAllo
5b50: 63 3b 0a 20 20 20 20 5a 69 70 66 69 6c 65 45 6e  c;.    ZipfileEn
5b60: 74 72 79 20 2a 70 4e 65 77 3b 0a 0a 20 20 20 20  try *pNew;..    
5b70: 69 6e 74 20 6e 46 69 6c 65 20 3d 20 7a 69 70 66  int nFile = zipf
5b80: 69 6c 65 47 65 74 55 31 36 28 26 61 52 65 61 64  ileGetU16(&aRead
5b90: 5b 5a 49 50 46 49 4c 45 5f 43 44 53 5f 4e 46 49  [ZIPFILE_CDS_NFI
5ba0: 4c 45 5f 4f 46 46 5d 29 3b 0a 20 20 20 20 69 6e  LE_OFF]);.    in
5bb0: 74 20 6e 45 78 74 72 61 20 3d 20 7a 69 70 66 69  t nExtra = zipfi
5bc0: 6c 65 47 65 74 55 31 36 28 26 61 52 65 61 64 5b  leGetU16(&aRead[
5bd0: 5a 49 50 46 49 4c 45 5f 43 44 53 5f 4e 46 49 4c  ZIPFILE_CDS_NFIL
5be0: 45 5f 4f 46 46 2b 32 5d 29 3b 0a 20 20 20 20 6e  E_OFF+2]);.    n
5bf0: 45 78 74 72 61 20 2b 3d 20 7a 69 70 66 69 6c 65  Extra += zipfile
5c00: 47 65 74 55 31 36 28 26 61 52 65 61 64 5b 5a 49  GetU16(&aRead[ZI
5c10: 50 46 49 4c 45 5f 43 44 53 5f 4e 46 49 4c 45 5f  PFILE_CDS_NFILE_
5c20: 4f 46 46 2b 34 5d 29 3b 0a 0a 20 20 20 20 6e 41  OFF+4]);..    nA
5c30: 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66 28 5a 69  lloc = sizeof(Zi
5c40: 70 66 69 6c 65 45 6e 74 72 79 29 20 2b 20 6e 45  pfileEntry) + nE
5c50: 78 74 72 61 3b 0a 20 20 20 20 69 66 28 20 61 42  xtra;.    if( aB
5c60: 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 6e 41 6c  lob ){.      nAl
5c70: 6c 6f 63 20 2b 3d 20 7a 69 70 66 69 6c 65 47 65  loc += zipfileGe
5c80: 74 55 33 32 28 26 61 52 65 61 64 5b 5a 49 50 46  tU32(&aRead[ZIPF
5c90: 49 4c 45 5f 43 44 53 5f 53 5a 43 4f 4d 50 52 45  ILE_CDS_SZCOMPRE
5ca0: 53 53 45 44 5f 4f 46 46 5d 29 3b 0a 20 20 20 20  SSED_OFF]);.    
5cb0: 7d 0a 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 5a  }..    pNew = (Z
5cc0: 69 70 66 69 6c 65 45 6e 74 72 79 2a 29 73 71 6c  ipfileEntry*)sql
5cd0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 41 6c 6c  ite3_malloc(nAll
5ce0: 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  oc);.    if( pNe
5cf0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  w==0 ){.      rc
5d00: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
5d10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5d20: 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
5d30: 2c 20 73 69 7a 65 6f 66 28 5a 69 70 66 69 6c 65  , sizeof(Zipfile
5d40: 45 6e 74 72 79 29 29 3b 0a 20 20 20 20 20 20 72  Entry));.      r
5d50: 63 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 43  c = zipfileReadC
5d60: 44 53 28 61 52 65 61 64 2c 20 26 70 4e 65 77 2d  DS(aRead, &pNew-
5d70: 3e 63 64 73 29 3b 0a 20 20 20 20 20 20 69 66 28  >cds);.      if(
5d80: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5d90: 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72  {.        *pzErr
5da0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
5db0: 74 66 28 22 66 61 69 6c 65 64 20 74 6f 20 72 65  tf("failed to re
5dc0: 61 64 20 43 44 53 20 61 74 20 6f 66 66 73 65 74  ad CDS at offset
5dd0: 20 25 6c 6c 64 22 2c 20 69 4f 66 66 29 3b 0a 20   %lld", iOff);. 
5de0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
5df0: 42 6c 6f 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Blob==0 ){.     
5e00: 20 20 20 72 63 20 3d 20 7a 69 70 66 69 6c 65 52     rc = zipfileR
5e10: 65 61 64 44 61 74 61 28 0a 20 20 20 20 20 20 20  eadData(.       
5e20: 20 20 20 20 20 70 46 69 6c 65 2c 20 61 52 65 61       pFile, aRea
5e30: 64 2c 20 6e 45 78 74 72 61 2b 6e 46 69 6c 65 2c  d, nExtra+nFile,
5e40: 20 69 4f 66 66 2b 5a 49 50 46 49 4c 45 5f 43 44   iOff+ZIPFILE_CD
5e50: 53 5f 46 49 58 45 44 5f 53 5a 2c 20 70 7a 45 72  S_FIXED_SZ, pzEr
5e60: 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
5e70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5e80: 20 20 61 52 65 61 64 20 3d 20 28 75 38 2a 29 26    aRead = (u8*)&
5e90: 61 42 6c 6f 62 5b 69 4f 66 66 20 2b 20 5a 49 50  aBlob[iOff + ZIP
5ea0: 46 49 4c 45 5f 43 44 53 5f 46 49 58 45 44 5f 53  FILE_CDS_FIXED_S
5eb0: 5a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Z];.      }.    
5ec0: 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
5ed0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5ee0: 20 20 75 33 32 20 2a 70 74 20 3d 20 26 70 4e 65    u32 *pt = &pNe
5ef0: 77 2d 3e 6d 55 6e 69 78 54 69 6d 65 3b 0a 20 20  w->mUnixTime;.  
5f00: 20 20 20 20 70 4e 65 77 2d 3e 63 64 73 2e 7a 46      pNew->cds.zF
5f10: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ile = sqlite3_mp
5f20: 72 69 6e 74 66 28 22 25 2e 2a 73 22 2c 20 6e 46  rintf("%.*s", nF
5f30: 69 6c 65 2c 20 61 52 65 61 64 29 3b 20 0a 20 20  ile, aRead); .  
5f40: 20 20 20 20 70 4e 65 77 2d 3e 61 45 78 74 72 61      pNew->aExtra
5f50: 20 3d 20 28 75 38 2a 29 26 70 4e 65 77 5b 31 5d   = (u8*)&pNew[1]
5f60: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
5f70: 4e 65 77 2d 3e 61 45 78 74 72 61 2c 20 26 61 52  New->aExtra, &aR
5f80: 65 61 64 5b 6e 46 69 6c 65 5d 2c 20 6e 45 78 74  ead[nFile], nExt
5f90: 72 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ra);.      if( p
5fa0: 4e 65 77 2d 3e 63 64 73 2e 7a 46 69 6c 65 3d 3d  New->cds.zFile==
5fb0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
5fc0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
5fd0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
5fe0: 30 3d 3d 7a 69 70 66 69 6c 65 53 63 61 6e 45 78  0==zipfileScanEx
5ff0: 74 72 61 28 26 61 52 65 61 64 5b 6e 46 69 6c 65  tra(&aRead[nFile
6000: 5d 2c 20 70 4e 65 77 2d 3e 63 64 73 2e 6e 45 78  ], pNew->cds.nEx
6010: 74 72 61 2c 20 70 74 29 20 29 7b 0a 20 20 20 20  tra, pt) ){.    
6020: 20 20 20 20 70 4e 65 77 2d 3e 6d 55 6e 69 78 54      pNew->mUnixT
6030: 69 6d 65 20 3d 20 7a 69 70 66 69 6c 65 4d 74 69  ime = zipfileMti
6040: 6d 65 28 26 70 4e 65 77 2d 3e 63 64 73 29 3b 0a  me(&pNew->cds);.
6050: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
6060: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6070: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 74  E_OK ){.      st
6080: 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 73  atic const int s
6090: 7a 46 69 78 20 3d 20 5a 49 50 46 49 4c 45 5f 4c  zFix = ZIPFILE_L
60a0: 46 48 5f 46 49 58 45 44 5f 53 5a 3b 0a 20 20 20  FH_FIXED_SZ;.   
60b0: 20 20 20 5a 69 70 66 69 6c 65 4c 46 48 20 6c 66     ZipfileLFH lf
60c0: 68 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69  h;.      if( pFi
60d0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
60e0: 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 44 61   = zipfileReadDa
60f0: 74 61 28 70 46 69 6c 65 2c 20 61 52 65 61 64 2c  ta(pFile, aRead,
6100: 20 73 7a 46 69 78 2c 20 70 4e 65 77 2d 3e 63 64   szFix, pNew->cd
6110: 73 2e 69 4f 66 66 73 65 74 2c 20 70 7a 45 72 72  s.iOffset, pzErr
6120: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6130: 20 20 20 20 20 20 20 20 61 52 65 61 64 20 3d 20          aRead = 
6140: 28 75 38 2a 29 26 61 42 6c 6f 62 5b 70 4e 65 77  (u8*)&aBlob[pNew
6150: 2d 3e 63 64 73 2e 69 4f 66 66 73 65 74 5d 3b 0a  ->cds.iOffset];.
6160: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72        }..      r
6170: 63 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 4c  c = zipfileReadL
6180: 46 48 28 61 52 65 61 64 2c 20 26 6c 66 68 29 3b  FH(aRead, &lfh);
6190: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
61a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
61b0: 20 20 20 20 70 4e 65 77 2d 3e 69 44 61 74 61 4f      pNew->iDataO
61c0: 66 66 20 3d 20 20 70 4e 65 77 2d 3e 63 64 73 2e  ff =  pNew->cds.
61d0: 69 4f 66 66 73 65 74 20 2b 20 5a 49 50 46 49 4c  iOffset + ZIPFIL
61e0: 45 5f 4c 46 48 5f 46 49 58 45 44 5f 53 5a 3b 0a  E_LFH_FIXED_SZ;.
61f0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 44          pNew->iD
6200: 61 74 61 4f 66 66 20 2b 3d 20 6c 66 68 2e 6e 46  ataOff += lfh.nF
6210: 69 6c 65 20 2b 20 6c 66 68 2e 6e 45 78 74 72 61  ile + lfh.nExtra
6220: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 42  ;.        if( aB
6230: 6c 6f 62 20 26 26 20 70 4e 65 77 2d 3e 63 64 73  lob && pNew->cds
6240: 2e 73 7a 43 6f 6d 70 72 65 73 73 65 64 20 29 7b  .szCompressed ){
6250: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
6260: 3e 61 44 61 74 61 20 3d 20 26 70 4e 65 77 2d 3e  >aData = &pNew->
6270: 61 45 78 74 72 61 5b 6e 45 78 74 72 61 5d 3b 0a  aExtra[nExtra];.
6280: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
6290: 28 70 4e 65 77 2d 3e 61 44 61 74 61 2c 20 26 61  (pNew->aData, &a
62a0: 42 6c 6f 62 5b 70 4e 65 77 2d 3e 69 44 61 74 61  Blob[pNew->iData
62b0: 4f 66 66 5d 2c 20 70 4e 65 77 2d 3e 63 64 73 2e  Off], pNew->cds.
62c0: 73 7a 43 6f 6d 70 72 65 73 73 65 64 29 3b 0a 20  szCompressed);. 
62d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
62e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70  else{.        *p
62f0: 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zErr = sqlite3_m
6300: 70 72 69 6e 74 66 28 22 66 61 69 6c 65 64 20 74  printf("failed t
6310: 6f 20 72 65 61 64 20 4c 46 48 20 61 74 20 6f 66  o read LFH at of
6320: 66 73 65 74 20 25 64 22 2c 20 0a 20 20 20 20 20  fset %d", .     
6330: 20 20 20 20 20 20 20 28 69 6e 74 29 70 4e 65 77         (int)pNew
6340: 2d 3e 63 64 73 2e 69 4f 66 66 73 65 74 0a 20 20  ->cds.iOffset.  
6350: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
6360: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
6370: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
6380: 0a 20 20 20 20 20 20 7a 69 70 66 69 6c 65 45 6e  .      zipfileEn
6390: 74 72 79 46 72 65 65 28 70 4e 65 77 29 3b 0a 20  tryFree(pNew);. 
63a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
63b0: 2a 70 70 45 6e 74 72 79 20 3d 20 70 4e 65 77 3b  *ppEntry = pNew;
63c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
63d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
63e0: 2a 20 41 64 76 61 6e 63 65 20 61 6e 20 5a 69 70  * Advance an Zip
63f0: 66 69 6c 65 43 73 72 20 74 6f 20 69 74 73 20 6e  fileCsr to its n
6400: 65 78 74 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  ext row of outpu
6410: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
6420: 20 7a 69 70 66 69 6c 65 4e 65 78 74 28 73 71 6c   zipfileNext(sql
6430: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
6440: 20 2a 63 75 72 29 7b 0a 20 20 5a 69 70 66 69 6c   *cur){.  Zipfil
6450: 65 43 73 72 20 2a 70 43 73 72 20 3d 20 28 5a 69  eCsr *pCsr = (Zi
6460: 70 66 69 6c 65 43 73 72 2a 29 63 75 72 3b 0a 20  pfileCsr*)cur;. 
6470: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
6480: 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 43 73 72  _OK;..  if( pCsr
6490: 2d 3e 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  ->pFile ){.    i
64a0: 36 34 20 69 45 6f 66 20 3d 20 70 43 73 72 2d 3e  64 iEof = pCsr->
64b0: 65 6f 63 64 2e 69 4f 66 66 73 65 74 20 2b 20 70  eocd.iOffset + p
64c0: 43 73 72 2d 3e 65 6f 63 64 2e 6e 53 69 7a 65 3b  Csr->eocd.nSize;
64d0: 0a 20 20 20 20 7a 69 70 66 69 6c 65 45 6e 74 72  .    zipfileEntr
64e0: 79 46 72 65 65 28 70 43 73 72 2d 3e 70 43 75 72  yFree(pCsr->pCur
64f0: 72 65 6e 74 29 3b 0a 20 20 20 20 70 43 73 72 2d  rent);.    pCsr-
6500: 3e 70 43 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20  >pCurrent = 0;. 
6510: 20 20 20 69 66 28 20 70 43 73 72 2d 3e 69 4e 65     if( pCsr->iNe
6520: 78 74 4f 66 66 3e 3d 69 45 6f 66 20 29 7b 0a 20  xtOff>=iEof ){. 
6530: 20 20 20 20 20 70 43 73 72 2d 3e 62 45 6f 66 20       pCsr->bEof 
6540: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
6550: 20 20 20 20 20 20 5a 69 70 66 69 6c 65 45 6e 74        ZipfileEnt
6560: 72 79 20 2a 70 20 3d 20 30 3b 0a 20 20 20 20 20  ry *p = 0;.     
6570: 20 5a 69 70 66 69 6c 65 54 61 62 20 2a 70 54 61   ZipfileTab *pTa
6580: 62 20 3d 20 28 5a 69 70 66 69 6c 65 54 61 62 2a  b = (ZipfileTab*
6590: 29 28 63 75 72 2d 3e 70 56 74 61 62 29 3b 0a 20  )(cur->pVtab);. 
65a0: 20 20 20 20 20 72 63 20 3d 20 7a 69 70 66 69 6c       rc = zipfil
65b0: 65 47 65 74 45 6e 74 72 79 28 70 54 61 62 2c 20  eGetEntry(pTab, 
65c0: 30 2c 20 30 2c 20 70 43 73 72 2d 3e 70 46 69 6c  0, 0, pCsr->pFil
65d0: 65 2c 20 70 43 73 72 2d 3e 69 4e 65 78 74 4f 66  e, pCsr->iNextOf
65e0: 66 2c 20 26 70 29 3b 0a 20 20 20 20 20 20 69 66  f, &p);.      if
65f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6600: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d  ){.        pCsr-
6610: 3e 69 4e 65 78 74 4f 66 66 20 2b 3d 20 5a 49 50  >iNextOff += ZIP
6620: 46 49 4c 45 5f 43 44 53 5f 46 49 58 45 44 5f 53  FILE_CDS_FIXED_S
6630: 5a 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d  Z;.        pCsr-
6640: 3e 69 4e 65 78 74 4f 66 66 20 2b 3d 20 28 69 6e  >iNextOff += (in
6650: 74 29 70 2d 3e 63 64 73 2e 6e 45 78 74 72 61 20  t)p->cds.nExtra 
6660: 2b 20 70 2d 3e 63 64 73 2e 6e 46 69 6c 65 20 2b  + p->cds.nFile +
6670: 20 70 2d 3e 63 64 73 2e 6e 43 6f 6d 6d 65 6e 74   p->cds.nComment
6680: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6690: 70 43 73 72 2d 3e 70 43 75 72 72 65 6e 74 20 3d  pCsr->pCurrent =
66a0: 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   p;.    }.  }els
66b0: 65 7b 0a 20 20 20 20 69 66 28 20 21 70 43 73 72  e{.    if( !pCsr
66c0: 2d 3e 62 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  ->bNoop ){.     
66d0: 20 70 43 73 72 2d 3e 70 43 75 72 72 65 6e 74 20   pCsr->pCurrent 
66e0: 3d 20 70 43 73 72 2d 3e 70 43 75 72 72 65 6e 74  = pCsr->pCurrent
66f0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
6700: 20 20 20 69 66 28 20 70 43 73 72 2d 3e 70 43 75     if( pCsr->pCu
6710: 72 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  rrent==0 ){.    
6720: 20 20 70 43 73 72 2d 3e 62 45 6f 66 20 3d 20 31    pCsr->bEof = 1
6730: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
6740: 43 73 72 2d 3e 62 4e 6f 6f 70 20 3d 20 30 3b 0a  Csr->bNoop = 0;.
6750: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6760: 73 74 61 74 69 63 20 76 6f 69 64 20 7a 69 70 66  static void zipf
6770: 69 6c 65 46 72 65 65 28 76 6f 69 64 20 2a 70 29  ileFree(void *p)
6780: 20 7b 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   { .  sqlite3_fr
6790: 65 65 28 70 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee(p); .}../*.**
67a0: 20 42 75 66 66 65 72 20 61 49 6e 20 28 73 69 7a   Buffer aIn (siz
67b0: 65 20 6e 49 6e 20 62 79 74 65 73 29 20 63 6f 6e  e nIn bytes) con
67c0: 74 61 69 6e 73 20 63 6f 6d 70 72 65 73 73 65 64  tains compressed
67d0: 20 64 61 74 61 2e 20 55 6e 63 6f 6d 70 72 65 73   data. Uncompres
67e0: 73 65 64 2c 20 74 68 65 0a 2a 2a 20 73 69 7a 65  sed, the.** size
67f0: 20 69 73 20 6e 4f 75 74 20 62 79 74 65 73 2e 20   is nOut bytes. 
6800: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 6e  This function un
6810: 63 6f 6d 70 72 65 73 73 65 73 20 74 68 65 20 64  compresses the d
6820: 61 74 61 20 61 6e 64 20 73 65 74 73 20 74 68 65  ata and sets the
6830: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
6840: 20 69 6e 20 63 6f 6e 74 65 78 74 20 70 43 74 78   in context pCtx
6850: 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 28   to the result (
6860: 61 20 62 6c 6f 62 29 2e 0a 2a 2a 0a 2a 2a 20 49  a blob)..**.** I
6870: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
6880: 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
6890: 20 69 73 20 6c 65 66 74 20 69 6e 20 70 43 74 78   is left in pCtx
68a0: 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 73 74 61   instead..*/.sta
68b0: 74 69 63 20 76 6f 69 64 20 7a 69 70 66 69 6c 65  tic void zipfile
68c0: 49 6e 66 6c 61 74 65 28 0a 20 20 73 71 6c 69 74  Inflate(.  sqlit
68d0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
68e0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  ,          /* St
68f0: 6f 72 65 20 72 65 73 75 6c 74 20 68 65 72 65 20  ore result here 
6900: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  */.  const u8 *a
6910: 49 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  In,             
6920: 20 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73       /* Compress
6930: 65 64 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ed data */.  int
6940: 20 6e 49 6e 2c 20 20 20 20 20 20 20 20 20 20 20   nIn,           
6950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6960: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 61  Size of buffer a
6970: 49 6e 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f  In[] in bytes */
6980: 0a 20 20 69 6e 74 20 6e 4f 75 74 20 20 20 20 20  .  int nOut     
6990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69a0: 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6f     /* Expected o
69b0: 75 74 70 75 74 20 73 69 7a 65 20 2a 2f 0a 29 7b  utput size */.){
69c0: 0a 20 20 75 38 20 2a 61 52 65 73 20 3d 20 73 71  .  u8 *aRes = sq
69d0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4f 75  lite3_malloc(nOu
69e0: 74 29 3b 0a 20 20 69 66 28 20 61 52 65 73 3d 3d  t);.  if( aRes==
69f0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
6a00: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
6a10: 6d 65 6d 28 70 43 74 78 29 3b 0a 20 20 7d 65 6c  mem(pCtx);.  }el
6a20: 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 72 72 3b  se{.    int err;
6a30: 0a 20 20 20 20 7a 5f 73 74 72 65 61 6d 20 73 74  .    z_stream st
6a40: 72 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  r;.    memset(&s
6a50: 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 74  tr, 0, sizeof(st
6a60: 72 29 29 3b 0a 0a 20 20 20 20 73 74 72 2e 6e 65  r));..    str.ne
6a70: 78 74 5f 69 6e 20 3d 20 28 42 79 74 65 2a 29 61  xt_in = (Byte*)a
6a80: 49 6e 3b 0a 20 20 20 20 73 74 72 2e 61 76 61 69  In;.    str.avai
6a90: 6c 5f 69 6e 20 3d 20 6e 49 6e 3b 0a 20 20 20 20  l_in = nIn;.    
6aa0: 73 74 72 2e 6e 65 78 74 5f 6f 75 74 20 3d 20 28  str.next_out = (
6ab0: 42 79 74 65 2a 29 61 52 65 73 3b 0a 20 20 20 20  Byte*)aRes;.    
6ac0: 73 74 72 2e 61 76 61 69 6c 5f 6f 75 74 20 3d 20  str.avail_out = 
6ad0: 6e 4f 75 74 3b 0a 0a 20 20 20 20 65 72 72 20 3d  nOut;..    err =
6ae0: 20 69 6e 66 6c 61 74 65 49 6e 69 74 32 28 26 73   inflateInit2(&s
6af0: 74 72 2c 20 2d 31 35 29 3b 0a 20 20 20 20 69 66  tr, -15);.    if
6b00: 28 20 65 72 72 21 3d 5a 5f 4f 4b 20 29 7b 0a 20  ( err!=Z_OK ){. 
6b10: 20 20 20 20 20 7a 69 70 66 69 6c 65 43 74 78 45       zipfileCtxE
6b20: 72 72 6f 72 4d 73 67 28 70 43 74 78 2c 20 22 69  rrorMsg(pCtx, "i
6b30: 6e 66 6c 61 74 65 49 6e 69 74 32 28 29 20 66 61  nflateInit2() fa
6b40: 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 29  iled (%d)", err)
6b50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6b60: 20 20 20 65 72 72 20 3d 20 69 6e 66 6c 61 74 65     err = inflate
6b70: 28 26 73 74 72 2c 20 5a 5f 4e 4f 5f 46 4c 55 53  (&str, Z_NO_FLUS
6b80: 48 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72  H);.      if( er
6b90: 72 21 3d 5a 5f 53 54 52 45 41 4d 5f 45 4e 44 20  r!=Z_STREAM_END 
6ba0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 69 70 66 69  ){.        zipfi
6bb0: 6c 65 43 74 78 45 72 72 6f 72 4d 73 67 28 70 43  leCtxErrorMsg(pC
6bc0: 74 78 2c 20 22 69 6e 66 6c 61 74 65 28 29 20 66  tx, "inflate() f
6bd0: 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72  ailed (%d)", err
6be0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6bf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
6c00: 72 65 73 75 6c 74 5f 62 6c 6f 62 28 70 43 74 78  result_blob(pCtx
6c10: 2c 20 61 52 65 73 2c 20 6e 4f 75 74 2c 20 7a 69  , aRes, nOut, zi
6c20: 70 66 69 6c 65 46 72 65 65 29 3b 0a 20 20 20 20  pfileFree);.    
6c30: 20 20 20 20 61 52 65 73 20 3d 20 30 3b 0a 20 20      aRes = 0;.  
6c40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6c50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 52 65  sqlite3_free(aRe
6c60: 73 29 3b 0a 20 20 20 20 69 6e 66 6c 61 74 65 45  s);.    inflateE
6c70: 6e 64 28 26 73 74 72 29 3b 0a 20 20 7d 0a 7d 0a  nd(&str);.  }.}.
6c80: 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 61 49  ./*.** Buffer aI
6c90: 6e 20 28 73 69 7a 65 20 6e 49 6e 20 62 79 74 65  n (size nIn byte
6ca0: 73 29 20 63 6f 6e 74 61 69 6e 73 20 75 6e 63 6f  s) contains unco
6cb0: 6d 70 72 65 73 73 65 64 20 64 61 74 61 2e 20 54  mpressed data. T
6cc0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
6cd0: 63 6f 6d 70 72 65 73 73 65 73 20 69 74 20 61 6e  compresses it an
6ce0: 64 20 73 65 74 73 20 28 2a 70 70 4f 75 74 29 20  d sets (*ppOut) 
6cf0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
6d00: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
6d10: 74 68 65 0a 2a 2a 20 63 6f 6d 70 72 65 73 73 65  the.** compresse
6d20: 64 20 64 61 74 61 2e 20 54 68 65 20 63 61 6c 6c  d data. The call
6d30: 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
6d40: 65 20 66 6f 72 20 65 76 65 6e 74 75 61 6c 6c 79  e for eventually
6d50: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
6d60: 74 65 33 5f 66 72 65 65 28 29 20 74 6f 20 72 65  te3_free() to re
6d70: 6c 65 61 73 65 20 62 75 66 66 65 72 20 28 2a 70  lease buffer (*p
6d80: 70 4f 75 74 29 2e 20 42 65 66 6f 72 65 20 72 65  pOut). Before re
6d90: 74 75 72 6e 69 6e 67 2c 20 28 2a 70 6e 4f 75 74  turning, (*pnOut
6da0: 29 20 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ) .** is set to 
6db0: 74 68 65 20 73 69 7a 65 20 6f 66 20 62 75 66 66  the size of buff
6dc0: 65 72 20 28 2a 70 70 4f 75 74 29 20 69 6e 20 62  er (*ppOut) in b
6dd0: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ytes..**.** If n
6de0: 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
6df0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
6e00: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
6e10: 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
6e20: 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74  r.** code is ret
6e30: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
6e40: 6f 72 20 6d 65 73 73 61 67 65 20 6c 65 66 74 20  or message left 
6e50: 69 6e 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65  in virtual-table
6e60: 20 68 61 6e 64 6c 65 0a 2a 2a 20 70 54 61 62 2e   handle.** pTab.
6e70: 20 54 68 65 20 76 61 6c 75 65 73 20 6f 66 20 28   The values of (
6e80: 2a 70 70 4f 75 74 29 20 61 6e 64 20 28 2a 70 6e  *ppOut) and (*pn
6e90: 4f 75 74 29 20 61 72 65 20 6c 65 66 74 20 75 6e  Out) are left un
6ea0: 63 68 61 6e 67 65 64 20 69 6e 20 74 68 69 73 0a  changed in this.
6eb0: 2a 2a 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  ** case..*/.stat
6ec0: 69 63 20 69 6e 74 20 7a 69 70 66 69 6c 65 44 65  ic int zipfileDe
6ed0: 66 6c 61 74 65 28 0a 20 20 63 6f 6e 73 74 20 75  flate(.  const u
6ee0: 38 20 2a 61 49 6e 2c 20 69 6e 74 20 6e 49 6e 2c  8 *aIn, int nIn,
6ef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
6f00: 74 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 4f 75  t */.  u8 **ppOu
6f10: 74 2c 20 69 6e 74 20 2a 70 6e 4f 75 74 2c 20 20  t, int *pnOut,  
6f20: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
6f30: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
6f40: 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rr              
6f50: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72        /* OUT: Er
6f60: 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 29  ror message */.)
6f70: 7b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d  {.  int nAlloc =
6f80: 20 28 69 6e 74 29 63 6f 6d 70 72 65 73 73 42 6f   (int)compressBo
6f90: 75 6e 64 28 6e 49 6e 29 3b 0a 20 20 75 38 20 2a  und(nIn);.  u8 *
6fa0: 61 4f 75 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  aOut;.  int rc =
6fb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
6fc0: 4f 75 74 20 3d 20 28 75 38 2a 29 73 71 6c 69 74  Out = (u8*)sqlit
6fd0: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 41 6c 6c 6f 63  e3_malloc(nAlloc
6fe0: 29 3b 0a 20 20 69 66 28 20 61 4f 75 74 3d 3d 30  );.  if( aOut==0
6ff0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
7000: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
7010: 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b  se{.    int res;
7020: 0a 20 20 20 20 7a 5f 73 74 72 65 61 6d 20 73 74  .    z_stream st
7030: 72 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  r;.    memset(&s
7040: 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 74  tr, 0, sizeof(st
7050: 72 29 29 3b 0a 20 20 20 20 73 74 72 2e 6e 65 78  r));.    str.nex
7060: 74 5f 69 6e 20 3d 20 28 42 79 74 65 66 2a 29 61  t_in = (Bytef*)a
7070: 49 6e 3b 0a 20 20 20 20 73 74 72 2e 61 76 61 69  In;.    str.avai
7080: 6c 5f 69 6e 20 3d 20 6e 49 6e 3b 0a 20 20 20 20  l_in = nIn;.    
7090: 73 74 72 2e 6e 65 78 74 5f 6f 75 74 20 3d 20 61  str.next_out = a
70a0: 4f 75 74 3b 0a 20 20 20 20 73 74 72 2e 61 76 61  Out;.    str.ava
70b0: 69 6c 5f 6f 75 74 20 3d 20 6e 41 6c 6c 6f 63 3b  il_out = nAlloc;
70c0: 0a 0a 20 20 20 20 64 65 66 6c 61 74 65 49 6e 69  ..    deflateIni
70d0: 74 32 28 26 73 74 72 2c 20 39 2c 20 5a 5f 44 45  t2(&str, 9, Z_DE
70e0: 46 4c 41 54 45 44 2c 20 2d 31 35 2c 20 38 2c 20  FLATED, -15, 8, 
70f0: 5a 5f 44 45 46 41 55 4c 54 5f 53 54 52 41 54 45  Z_DEFAULT_STRATE
7100: 47 59 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 64  GY);.    res = d
7110: 65 66 6c 61 74 65 28 26 73 74 72 2c 20 5a 5f 46  eflate(&str, Z_F
7120: 49 4e 49 53 48 29 3b 0a 0a 20 20 20 20 69 66 28  INISH);..    if(
7130: 20 72 65 73 3d 3d 5a 5f 53 54 52 45 41 4d 5f 45   res==Z_STREAM_E
7140: 4e 44 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f  ND ){.      *ppO
7150: 75 74 20 3d 20 61 4f 75 74 3b 0a 20 20 20 20 20  ut = aOut;.     
7160: 20 2a 70 6e 4f 75 74 20 3d 20 28 69 6e 74 29 73   *pnOut = (int)s
7170: 74 72 2e 74 6f 74 61 6c 5f 6f 75 74 3b 0a 20 20  tr.total_out;.  
7180: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
7190: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 4f 75 74  qlite3_free(aOut
71a0: 29 3b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 20  );.      *pzErr 
71b0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
71c0: 66 28 22 7a 69 70 66 69 6c 65 3a 20 64 65 66 6c  f("zipfile: defl
71d0: 61 74 65 28 29 20 65 72 72 6f 72 22 29 3b 0a 20  ate() error");. 
71e0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
71f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
7200: 20 20 64 65 66 6c 61 74 65 45 6e 64 28 26 73 74    deflateEnd(&st
7210: 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
7220: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
7230: 52 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66  Return values of
7240: 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 68 65   columns for the
7250: 20 72 6f 77 20 61 74 20 77 68 69 63 68 20 74 68   row at which th
7260: 65 20 73 65 72 69 65 73 5f 63 75 72 73 6f 72 0a  e series_cursor.
7270: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
7280: 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61  pointing..*/.sta
7290: 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c 65 43  tic int zipfileC
72a0: 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65 33  olumn(.  sqlite3
72b0: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
72c0: 72 2c 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73  r,   /* The curs
72d0: 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  or */.  sqlite3_
72e0: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 20 20  context *ctx,   
72f0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
7300: 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33  ument to sqlite3
7310: 5f 72 65 73 75 6c 74 5f 2e 2e 2e 28 29 20 2a 2f  _result_...() */
7320: 0a 20 20 69 6e 74 20 69 20 20 20 20 20 20 20 20  .  int i        
7330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7340: 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20 74  * Which column t
7350: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 29 7b 0a 20  o return */.){. 
7360: 20 5a 69 70 66 69 6c 65 43 73 72 20 2a 70 43 73   ZipfileCsr *pCs
7370: 72 20 3d 20 28 5a 69 70 66 69 6c 65 43 73 72 2a  r = (ZipfileCsr*
7380: 29 63 75 72 3b 0a 20 20 5a 69 70 66 69 6c 65 43  )cur;.  ZipfileC
7390: 44 53 20 2a 70 43 44 53 20 3d 20 26 70 43 73 72  DS *pCDS = &pCsr
73a0: 2d 3e 70 43 75 72 72 65 6e 74 2d 3e 63 64 73 3b  ->pCurrent->cds;
73b0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
73c0: 54 45 5f 4f 4b 3b 0a 20 20 73 77 69 74 63 68 28  TE_OK;.  switch(
73d0: 20 69 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30   i ){.    case 0
73e0: 3a 20 20 20 2f 2a 20 6e 61 6d 65 20 2a 2f 0a 20  :   /* name */. 
73f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
7400: 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 70 43  ult_text(ctx, pC
7410: 44 53 2d 3e 7a 46 69 6c 65 2c 20 2d 31 2c 20 53  DS->zFile, -1, S
7420: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
7430: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7440: 20 20 20 63 61 73 65 20 31 3a 20 20 20 2f 2a 20     case 1:   /* 
7450: 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  mode */.      /*
7460: 20 54 4f 44 4f 3a 20 57 68 65 74 68 65 72 20 6f   TODO: Whether o
7470: 72 20 6e 6f 74 20 74 68 65 20 66 6f 6c 6c 6f 77  r not the follow
7480: 69 6e 67 20 69 73 20 63 6f 72 72 65 63 74 20 73  ing is correct s
7490: 75 72 65 6c 79 20 64 65 70 65 6e 64 73 20 6f 6e  urely depends on
74a0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c  .      ** the pl
74b0: 61 74 66 6f 72 6d 20 6f 6e 20 77 68 69 63 68 20  atform on which 
74c0: 74 68 65 20 61 72 63 68 69 76 65 20 77 61 73 20  the archive was 
74d0: 63 72 65 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20  created.  */.   
74e0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
74f0: 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 44 53 2d  t_int(ctx, pCDS-
7500: 3e 69 45 78 74 65 72 6e 61 6c 41 74 74 72 20 3e  >iExternalAttr >
7510: 3e 20 31 36 29 3b 0a 20 20 20 20 20 20 62 72 65  > 16);.      bre
7520: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 20  ak;.    case 2: 
7530: 7b 20 2f 2a 20 6d 74 69 6d 65 20 2a 2f 0a 20 20  { /* mtime */.  
7540: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
7550: 6c 74 5f 69 6e 74 36 34 28 63 74 78 2c 20 70 43  lt_int64(ctx, pC
7560: 73 72 2d 3e 70 43 75 72 72 65 6e 74 2d 3e 6d 55  sr->pCurrent->mU
7570: 6e 69 78 54 69 6d 65 29 3b 0a 20 20 20 20 20 20  nixTime);.      
7580: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7590: 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 73 7a   case 3: { /* sz
75a0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
75b0: 6c 69 74 65 33 5f 76 74 61 62 5f 6e 6f 63 68 61  lite3_vtab_nocha
75c0: 6e 67 65 28 63 74 78 29 3d 3d 30 20 29 7b 0a 20  nge(ctx)==0 ){. 
75d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
75e0: 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 74 78 2c  esult_int64(ctx,
75f0: 20 70 43 44 53 2d 3e 73 7a 55 6e 63 6f 6d 70 72   pCDS->szUncompr
7600: 65 73 73 65 64 29 3b 0a 20 20 20 20 20 20 7d 0a  essed);.      }.
7610: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7620: 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 20   }.    case 4:  
7630: 20 2f 2a 20 72 61 77 64 61 74 61 20 2a 2f 0a 20   /* rawdata */. 
7640: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
7650: 5f 76 74 61 62 5f 6e 6f 63 68 61 6e 67 65 28 63  _vtab_nochange(c
7660: 74 78 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  tx) ) break;.   
7670: 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 64 61   case 5: { /* da
7680: 74 61 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ta */.      if( 
7690: 69 3d 3d 34 20 7c 7c 20 70 43 44 53 2d 3e 69 43  i==4 || pCDS->iC
76a0: 6f 6d 70 72 65 73 73 69 6f 6e 3d 3d 30 20 7c 7c  ompression==0 ||
76b0: 20 70 43 44 53 2d 3e 69 43 6f 6d 70 72 65 73 73   pCDS->iCompress
76c0: 69 6f 6e 3d 3d 38 20 29 7b 0a 20 20 20 20 20 20  ion==8 ){.      
76d0: 20 20 69 6e 74 20 73 7a 20 3d 20 70 43 44 53 2d    int sz = pCDS-
76e0: 3e 73 7a 43 6f 6d 70 72 65 73 73 65 64 3b 0a 20  >szCompressed;. 
76f0: 20 20 20 20 20 20 20 69 6e 74 20 73 7a 46 69 6e         int szFin
7700: 61 6c 20 3d 20 70 43 44 53 2d 3e 73 7a 55 6e 63  al = pCDS->szUnc
7710: 6f 6d 70 72 65 73 73 65 64 3b 0a 20 20 20 20 20  ompressed;.     
7720: 20 20 20 69 66 28 20 73 7a 46 69 6e 61 6c 3e 30     if( szFinal>0
7730: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38   ){.          u8
7740: 20 2a 61 42 75 66 3b 0a 20 20 20 20 20 20 20 20   *aBuf;.        
7750: 20 20 75 38 20 2a 61 46 72 65 65 20 3d 20 30 3b    u8 *aFree = 0;
7760: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
7770: 43 73 72 2d 3e 70 43 75 72 72 65 6e 74 2d 3e 61  Csr->pCurrent->a
7780: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
7790: 20 20 20 20 61 42 75 66 20 3d 20 70 43 73 72 2d      aBuf = pCsr-
77a0: 3e 70 43 75 72 72 65 6e 74 2d 3e 61 44 61 74 61  >pCurrent->aData
77b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
77c0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  e{.            a
77d0: 42 75 66 20 3d 20 61 46 72 65 65 20 3d 20 73 71  Buf = aFree = sq
77e0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a 29  lite3_malloc(sz)
77f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
7800: 28 20 61 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ( aBuf==0 ){.   
7810: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
7820: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
7830: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
7840: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46  .              F
7850: 49 4c 45 20 2a 70 46 69 6c 65 20 3d 20 70 43 73  ILE *pFile = pCs
7860: 72 2d 3e 70 46 69 6c 65 3b 0a 20 20 20 20 20 20  r->pFile;.      
7870: 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c          if( pFil
7880: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
7890: 20 20 20 20 20 20 20 20 70 46 69 6c 65 20 3d 20          pFile = 
78a0: 28 28 5a 69 70 66 69 6c 65 54 61 62 2a 29 28 70  ((ZipfileTab*)(p
78b0: 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 29  Csr->base.pVtab)
78c0: 29 2d 3e 70 57 72 69 74 65 46 64 3b 0a 20 20 20  )->pWriteFd;.   
78d0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
78e0: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
78f0: 7a 69 70 66 69 6c 65 52 65 61 64 44 61 74 61 28  zipfileReadData(
7900: 70 46 69 6c 65 2c 20 61 42 75 66 2c 20 73 7a 2c  pFile, aBuf, sz,
7910: 20 70 43 73 72 2d 3e 70 43 75 72 72 65 6e 74 2d   pCsr->pCurrent-
7920: 3e 69 44 61 74 61 4f 66 66 2c 0a 20 20 20 20 20  >iDataOff,.     
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 43               &pC
7940: 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 2d 3e  sr->base.pVtab->
7950: 7a 45 72 72 4d 73 67 0a 20 20 20 20 20 20 20 20  zErrMsg.        
7960: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
7970: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7980: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
7990: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
79a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
79b0: 28 20 69 3d 3d 35 20 26 26 20 70 43 44 53 2d 3e  ( i==5 && pCDS->
79c0: 69 43 6f 6d 70 72 65 73 73 69 6f 6e 20 29 7b 0a  iCompression ){.
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 69                zi
79e0: 70 66 69 6c 65 49 6e 66 6c 61 74 65 28 63 74 78  pfileInflate(ctx
79f0: 2c 20 61 42 75 66 2c 20 73 7a 2c 20 73 7a 46 69  , aBuf, sz, szFi
7a00: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nal);.          
7a10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7a20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
7a30: 65 73 75 6c 74 5f 62 6c 6f 62 28 63 74 78 2c 20  esult_blob(ctx, 
7a40: 61 42 75 66 2c 20 73 7a 2c 20 53 51 4c 49 54 45  aBuf, sz, SQLITE
7a50: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
7a60: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7a70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7a80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 46   sqlite3_free(aF
7a90: 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ree);.        }e
7aa0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
7ab0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69 66 20  * Figure out if 
7ac0: 74 68 69 73 20 69 73 20 61 20 64 69 72 65 63 74  this is a direct
7ad0: 6f 72 79 20 6f 72 20 61 20 7a 65 72 6f 2d 73 69  ory or a zero-si
7ae0: 7a 65 64 20 66 69 6c 65 2e 20 43 6f 6e 73 69 64  zed file. Consid
7af0: 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
7b00: 69 74 20 74 6f 20 62 65 20 61 20 64 69 72 65 63  it to be a direc
7b10: 74 6f 72 79 20 65 69 74 68 65 72 20 69 66 20 74  tory either if t
7b20: 68 65 20 6d 6f 64 65 20 73 75 67 67 65 73 74 73  he mode suggests
7b30: 20 73 6f 2c 20 6f 72 20 69 66 0a 20 20 20 20 20   so, or if.     
7b40: 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6e 61       ** the fina
7b50: 6c 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74  l character in t
7b60: 68 65 20 6e 61 6d 65 20 69 73 20 27 2f 27 2e 20  he name is '/'. 
7b70: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 33   */.          u3
7b80: 32 20 6d 6f 64 65 20 3d 20 70 43 44 53 2d 3e 69  2 mode = pCDS->i
7b90: 45 78 74 65 72 6e 61 6c 41 74 74 72 20 3e 3e 20  ExternalAttr >> 
7ba0: 31 36 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  16;.          if
7bb0: 28 20 21 28 6d 6f 64 65 20 26 20 53 5f 49 46 44  ( !(mode & S_IFD
7bc0: 49 52 29 20 26 26 20 70 43 44 53 2d 3e 7a 46 69  IR) && pCDS->zFi
7bd0: 6c 65 5b 70 43 44 53 2d 3e 6e 46 69 6c 65 2d 31  le[pCDS->nFile-1
7be0: 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]!='/' ){.      
7bf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7c00: 73 75 6c 74 5f 62 6c 6f 62 28 63 74 78 2c 20 22  sult_blob(ctx, "
7c10: 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f 53 54 41  ", 0, SQLITE_STA
7c20: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TIC);.          
7c30: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
7c40: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7c50: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7c60: 36 3a 20 20 20 2f 2a 20 6d 65 74 68 6f 64 20 2a  6:   /* method *
7c70: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
7c80: 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20  result_int(ctx, 
7c90: 70 43 44 53 2d 3e 69 43 6f 6d 70 72 65 73 73 69  pCDS->iCompressi
7ca0: 6f 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  on);.      break
7cb0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
7cc0: 2f 2a 20 7a 20 2a 2f 0a 20 20 20 20 20 20 61 73  /* z */.      as
7cd0: 73 65 72 74 28 20 69 3d 3d 37 20 29 3b 0a 20 20  sert( i==7 );.  
7ce0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
7cf0: 6c 74 5f 69 6e 74 36 34 28 63 74 78 2c 20 70 43  lt_int64(ctx, pC
7d00: 73 72 2d 3e 69 49 64 29 3b 0a 20 20 20 20 20 20  sr->iId);.      
7d10: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  break;.  }..  re
7d20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7d30: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
7d40: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
7d50: 74 20 45 4f 46 2e 0a 2a 2f 0a 73 74 61 74 69 63  t EOF..*/.static
7d60: 20 69 6e 74 20 7a 69 70 66 69 6c 65 45 6f 66 28   int zipfileEof(
7d70: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
7d80: 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 5a 69 70  sor *cur){.  Zip
7d90: 66 69 6c 65 43 73 72 20 2a 70 43 73 72 20 3d 20  fileCsr *pCsr = 
7da0: 28 5a 69 70 66 69 6c 65 43 73 72 2a 29 63 75 72  (ZipfileCsr*)cur
7db0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 73 72 2d  ;.  return pCsr-
7dc0: 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >bEof;.}../*.** 
7dd0: 49 66 20 61 42 6c 6f 62 20 69 73 20 6e 6f 74 20  If aBlob is not 
7de0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 70 6f  NULL, then it po
7df0: 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
7e00: 20 6e 42 6c 6f 62 20 62 79 74 65 73 20 69 6e 20   nBlob bytes in 
7e10: 73 69 7a 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  size.** containi
7e20: 6e 67 20 61 6e 20 65 6e 74 69 72 65 20 7a 69 70  ng an entire zip
7e30: 20 61 72 63 68 69 76 65 20 69 6d 61 67 65 2e 20   archive image. 
7e40: 4f 72 2c 20 69 66 20 61 42 6c 6f 62 20 69 73 20  Or, if aBlob is 
7e50: 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 46 69 6c 65  NULL, then pFile
7e60: 0a 2a 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65  .** is guarantee
7e70: 64 20 74 6f 20 62 65 20 61 20 66 69 6c 65 2d 68  d to be a file-h
7e80: 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 61 20  andle open on a 
7e90: 7a 69 70 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  zip file..**.** 
7ea0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  This function at
7eb0: 74 65 6d 70 74 73 20 74 6f 20 6c 6f 63 61 74 65  tempts to locate
7ec0: 20 74 68 65 20 45 4f 43 44 20 72 65 63 6f 72 64   the EOCD record
7ed0: 20 77 69 74 68 69 6e 20 74 68 65 20 7a 69 70 20   within the zip 
7ee0: 61 72 63 68 69 76 65 0a 2a 2a 20 61 6e 64 20 70  archive.** and p
7ef0: 6f 70 75 6c 61 74 65 20 2a 70 45 4f 43 44 20 77  opulate *pEOCD w
7f00: 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 73 20  ith the results 
7f10: 6f 66 20 64 65 63 6f 64 69 6e 67 20 69 74 2e 20  of decoding it. 
7f20: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20  SQLITE_OK is.** 
7f30: 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63  returned if succ
7f40: 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73  essful. Otherwis
7f50: 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  e, an SQLite err
7f60: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
7f70: 6e 65 64 20 61 6e 64 0a 2a 2a 20 61 6e 20 45 6e  ned and.** an En
7f80: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
7f90: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d 61 79  rror message may
7fa0: 20 62 65 20 6c 65 66 74 20 69 6e 20 76 69 72 74   be left in virt
7fb0: 75 61 6c 2d 74 61 62 6c 65 20 70 54 61 62 2e 0a  ual-table pTab..
7fc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 69  */.static int zi
7fd0: 70 66 69 6c 65 52 65 61 64 45 4f 43 44 28 0a 20  pfileReadEOCD(. 
7fe0: 20 5a 69 70 66 69 6c 65 54 61 62 20 2a 70 54 61   ZipfileTab *pTa
7ff0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
8000: 20 2f 2a 20 52 65 74 75 72 6e 20 65 72 72 6f 72   /* Return error
8010: 73 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  s here */.  cons
8020: 74 20 75 38 20 2a 61 42 6c 6f 62 2c 20 20 20 20  t u8 *aBlob,    
8030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8040: 6f 69 6e 74 65 72 20 74 6f 20 69 6e 2d 6d 65 6d  ointer to in-mem
8050: 6f 72 79 20 66 69 6c 65 20 69 6d 61 67 65 20 2a  ory file image *
8060: 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 2c 20 20  /.  int nBlob,  
8070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8080: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
8090: 42 6c 6f 62 5b 5d 20 69 6e 20 62 79 74 65 73 20  Blob[] in bytes 
80a0: 2a 2f 0a 20 20 46 49 4c 45 20 2a 70 46 69 6c 65  */.  FILE *pFile
80b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
80c0: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 66 72 6f       /* Read fro
80d0: 6d 20 74 68 69 73 20 66 69 6c 65 20 69 66 20 61  m this file if a
80e0: 42 6c 6f 62 3d 3d 30 20 2a 2f 0a 20 20 5a 69 70  Blob==0 */.  Zip
80f0: 66 69 6c 65 45 4f 43 44 20 2a 70 45 4f 43 44 20  fileEOCD *pEOCD 
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8110: 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61  Object to popula
8120: 74 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 61  te */.){.  u8 *a
8130: 52 65 61 64 20 3d 20 70 54 61 62 2d 3e 61 42 75  Read = pTab->aBu
8140: 66 66 65 72 3b 20 20 20 20 20 20 2f 2a 20 54 65  ffer;      /* Te
8150: 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 2a  mporary buffer *
8160: 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20  /.  int nRead;  
8170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8180: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
8190: 72 65 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a  read from file *
81a0: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
81b0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 61  ITE_OK;..  if( a
81c0: 42 6c 6f 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Blob==0 ){.    i
81d0: 36 34 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20  64 iOff;        
81e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81f0: 4f 66 66 73 65 74 20 74 6f 20 72 65 61 64 20 66  Offset to read f
8200: 72 6f 6d 20 2a 2f 0a 20 20 20 20 69 36 34 20 73  rom */.    i64 s
8210: 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  zFile;          
8220: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
8230: 6c 20 73 69 7a 65 20 6f 66 20 66 69 6c 65 20 69  l size of file i
8240: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 66  n bytes */.    f
8250: 73 65 65 6b 28 70 46 69 6c 65 2c 20 30 2c 20 53  seek(pFile, 0, S
8260: 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 20 20 73 7a  EEK_END);.    sz
8270: 46 69 6c 65 20 3d 20 28 69 36 34 29 66 74 65 6c  File = (i64)ftel
8280: 6c 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  l(pFile);.    if
8290: 28 20 73 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  ( szFile==0 ){. 
82a0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 45 4f 43       memset(pEOC
82b0: 44 2c 20 30 2c 20 73 69 7a 65 6f 66 28 5a 69 70  D, 0, sizeof(Zip
82c0: 66 69 6c 65 45 4f 43 44 29 29 3b 0a 20 20 20 20  fileEOCD));.    
82d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
82e0: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 52  OK;.    }.    nR
82f0: 65 61 64 20 3d 20 28 69 6e 74 29 28 4d 49 4e 28  ead = (int)(MIN(
8300: 73 7a 46 69 6c 65 2c 20 5a 49 50 46 49 4c 45 5f  szFile, ZIPFILE_
8310: 42 55 46 46 45 52 5f 53 49 5a 45 29 29 3b 0a 20  BUFFER_SIZE));. 
8320: 20 20 20 69 4f 66 66 20 3d 20 73 7a 46 69 6c 65     iOff = szFile
8330: 20 2d 20 6e 52 65 61 64 3b 0a 20 20 20 20 72 63   - nRead;.    rc
8340: 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 44 61   = zipfileReadDa
8350: 74 61 28 70 46 69 6c 65 2c 20 61 52 65 61 64 2c  ta(pFile, aRead,
8360: 20 6e 52 65 61 64 2c 20 69 4f 66 66 2c 20 26 70   nRead, iOff, &p
8370: 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73  Tab->base.zErrMs
8380: 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  g);.  }else{.   
8390: 20 6e 52 65 61 64 20 3d 20 28 69 6e 74 29 28 4d   nRead = (int)(M
83a0: 49 4e 28 6e 42 6c 6f 62 2c 20 5a 49 50 46 49 4c  IN(nBlob, ZIPFIL
83b0: 45 5f 42 55 46 46 45 52 5f 53 49 5a 45 29 29 3b  E_BUFFER_SIZE));
83c0: 0a 20 20 20 20 61 52 65 61 64 20 3d 20 28 75 38  .    aRead = (u8
83d0: 2a 29 26 61 42 6c 6f 62 5b 6e 42 6c 6f 62 2d 6e  *)&aBlob[nBlob-n
83e0: 52 65 61 64 5d 3b 0a 20 20 7d 0a 0a 20 20 69 66  Read];.  }..  if
83f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8400: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  ){.    int i;.. 
8410: 20 20 20 2f 2a 20 53 63 61 6e 20 62 61 63 6b 77     /* Scan backw
8420: 61 72 64 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ards looking for
8430: 20 74 68 65 20 73 69 67 6e 61 74 75 72 65 20 62   the signature b
8440: 79 74 65 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ytes */.    for(
8450: 69 3d 6e 52 65 61 64 2d 32 30 3b 20 69 3e 3d 30  i=nRead-20; i>=0
8460: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  ; i--){.      if
8470: 28 20 61 52 65 61 64 5b 69 5d 3d 3d 30 78 35 30  ( aRead[i]==0x50
8480: 20 26 26 20 61 52 65 61 64 5b 69 2b 31 5d 3d 3d   && aRead[i+1]==
8490: 30 78 34 62 20 0a 20 20 20 20 20 20 20 26 26 20  0x4b .       && 
84a0: 61 52 65 61 64 5b 69 2b 32 5d 3d 3d 30 78 30 35  aRead[i+2]==0x05
84b0: 20 26 26 20 61 52 65 61 64 5b 69 2b 33 5d 3d 3d   && aRead[i+3]==
84c0: 30 78 30 36 20 0a 20 20 20 20 20 20 29 7b 0a 20  0x06 .      ){. 
84d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
84e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
84f0: 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20  if( i<0 ){.     
8500: 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72   pTab->base.zErr
8510: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
8520: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
8530: 20 22 63 61 6e 6e 6f 74 20 66 69 6e 64 20 65 6e   "cannot find en
8540: 64 20 6f 66 20 63 65 6e 74 72 61 6c 20 64 69 72  d of central dir
8550: 65 63 74 6f 72 79 20 72 65 63 6f 72 64 22 0a 20  ectory record". 
8560: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65       );.      re
8570: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
8580: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 52  R;.    }..    aR
8590: 65 61 64 20 2b 3d 20 69 2b 34 3b 0a 20 20 20 20  ead += i+4;.    
85a0: 70 45 4f 43 44 2d 3e 69 44 69 73 6b 20 3d 20 7a  pEOCD->iDisk = z
85b0: 69 70 66 69 6c 65 52 65 61 64 31 36 28 61 52 65  ipfileRead16(aRe
85c0: 61 64 29 3b 0a 20 20 20 20 70 45 4f 43 44 2d 3e  ad);.    pEOCD->
85d0: 69 46 69 72 73 74 44 69 73 6b 20 3d 20 7a 69 70  iFirstDisk = zip
85e0: 66 69 6c 65 52 65 61 64 31 36 28 61 52 65 61 64  fileRead16(aRead
85f0: 29 3b 0a 20 20 20 20 70 45 4f 43 44 2d 3e 6e 45  );.    pEOCD->nE
8600: 6e 74 72 79 20 3d 20 7a 69 70 66 69 6c 65 52 65  ntry = zipfileRe
8610: 61 64 31 36 28 61 52 65 61 64 29 3b 0a 20 20 20  ad16(aRead);.   
8620: 20 70 45 4f 43 44 2d 3e 6e 45 6e 74 72 79 54 6f   pEOCD->nEntryTo
8630: 74 61 6c 20 3d 20 7a 69 70 66 69 6c 65 52 65 61  tal = zipfileRea
8640: 64 31 36 28 61 52 65 61 64 29 3b 0a 20 20 20 20  d16(aRead);.    
8650: 70 45 4f 43 44 2d 3e 6e 53 69 7a 65 20 3d 20 7a  pEOCD->nSize = z
8660: 69 70 66 69 6c 65 52 65 61 64 33 32 28 61 52 65  ipfileRead32(aRe
8670: 61 64 29 3b 0a 20 20 20 20 70 45 4f 43 44 2d 3e  ad);.    pEOCD->
8680: 69 4f 66 66 73 65 74 20 3d 20 7a 69 70 66 69 6c  iOffset = zipfil
8690: 65 52 65 61 64 33 32 28 61 52 65 61 64 29 3b 0a  eRead32(aRead);.
86a0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
86b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f  ;.}../*.** Add o
86c0: 62 6a 65 63 74 20 70 4e 65 77 20 74 6f 20 74 68  bject pNew to th
86d0: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 74 68  e linked list th
86e0: 61 74 20 62 65 67 69 6e 73 20 61 74 20 5a 69 70  at begins at Zip
86f0: 66 69 6c 65 54 61 62 2e 70 46 69 72 73 74 45 6e  fileTab.pFirstEn
8700: 74 72 79 20 0a 2a 2a 20 61 6e 64 20 65 6e 64 73  try .** and ends
8710: 20 77 69 74 68 20 70 4c 61 73 74 45 6e 74 72 79   with pLastEntry
8720: 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 70 42  . If argument pB
8730: 65 66 6f 72 65 20 69 73 20 4e 55 4c 4c 2c 20 74  efore is NULL, t
8740: 68 65 6e 20 70 4e 65 77 20 69 73 20 61 64 64 65  hen pNew is adde
8750: 64 0a 2a 2a 20 74 6f 20 74 68 65 20 65 6e 64 20  d.** to the end 
8760: 6f 66 20 74 68 65 20 6c 69 73 74 2e 20 4f 74 68  of the list. Oth
8770: 65 72 77 69 73 65 2c 20 69 74 20 69 73 20 61 64  erwise, it is ad
8780: 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73 74 20  ded to the list 
8790: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 62  immediately.** b
87a0: 65 66 6f 72 65 20 70 42 65 66 6f 72 65 20 28 77  efore pBefore (w
87b0: 68 69 63 68 20 69 73 20 67 75 61 72 61 6e 74 65  hich is guarante
87c0: 65 64 20 74 6f 20 62 65 20 61 20 70 61 72 74 20  ed to be a part 
87d0: 6f 66 20 73 61 69 64 20 6c 69 73 74 29 2e 0a 2a  of said list)..*
87e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 69  /.static void zi
87f0: 70 66 69 6c 65 41 64 64 45 6e 74 72 79 28 0a 20  pfileAddEntry(. 
8800: 20 5a 69 70 66 69 6c 65 54 61 62 20 2a 70 54 61   ZipfileTab *pTa
8810: 62 2c 20 0a 20 20 5a 69 70 66 69 6c 65 45 6e 74  b, .  ZipfileEnt
8820: 72 79 20 2a 70 42 65 66 6f 72 65 2c 20 0a 20 20  ry *pBefore, .  
8830: 5a 69 70 66 69 6c 65 45 6e 74 72 79 20 2a 70 4e  ZipfileEntry *pN
8840: 65 77 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ew.){.  assert( 
8850: 28 70 54 61 62 2d 3e 70 46 69 72 73 74 45 6e 74  (pTab->pFirstEnt
8860: 72 79 3d 3d 30 29 3d 3d 28 70 54 61 62 2d 3e 70  ry==0)==(pTab->p
8870: 4c 61 73 74 45 6e 74 72 79 3d 3d 30 29 20 29 3b  LastEntry==0) );
8880: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
8890: 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 69  >pNext==0 );.  i
88a0: 66 28 20 70 42 65 66 6f 72 65 3d 3d 30 20 29 7b  f( pBefore==0 ){
88b0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70  .    if( pTab->p
88c0: 46 69 72 73 74 45 6e 74 72 79 3d 3d 30 20 29 7b  FirstEntry==0 ){
88d0: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 46 69  .      pTab->pFi
88e0: 72 73 74 45 6e 74 72 79 20 3d 20 70 54 61 62 2d  rstEntry = pTab-
88f0: 3e 70 4c 61 73 74 45 6e 74 72 79 20 3d 20 70 4e  >pLastEntry = pN
8900: 65 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ew;.    }else{. 
8910: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
8920: 62 2d 3e 70 4c 61 73 74 45 6e 74 72 79 2d 3e 70  b->pLastEntry->p
8930: 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Next==0 );.     
8940: 20 70 54 61 62 2d 3e 70 4c 61 73 74 45 6e 74 72   pTab->pLastEntr
8950: 79 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  y->pNext = pNew;
8960: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 4c 61  .      pTab->pLa
8970: 73 74 45 6e 74 72 79 20 3d 20 70 4e 65 77 3b 0a  stEntry = pNew;.
8980: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
8990: 20 20 20 5a 69 70 66 69 6c 65 45 6e 74 72 79 20     ZipfileEntry 
89a0: 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70  **pp;.    for(pp
89b0: 3d 26 70 54 61 62 2d 3e 70 46 69 72 73 74 45 6e  =&pTab->pFirstEn
89c0: 74 72 79 3b 20 2a 70 70 21 3d 70 42 65 66 6f 72  try; *pp!=pBefor
89d0: 65 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70  e; pp=&((*pp)->p
89e0: 4e 65 78 74 29 29 3b 0a 20 20 20 20 70 4e 65 77  Next));.    pNew
89f0: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 65 66 6f 72  ->pNext = pBefor
8a00: 65 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 4e 65  e;.    *pp = pNe
8a10: 77 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  w;.  }.}..static
8a20: 20 69 6e 74 20 7a 69 70 66 69 6c 65 4c 6f 61 64   int zipfileLoad
8a30: 44 69 72 65 63 74 6f 72 79 28 5a 69 70 66 69 6c  Directory(Zipfil
8a40: 65 54 61 62 20 2a 70 54 61 62 2c 20 63 6f 6e 73  eTab *pTab, cons
8a50: 74 20 75 38 20 2a 61 42 6c 6f 62 2c 20 69 6e 74  t u8 *aBlob, int
8a60: 20 6e 42 6c 6f 62 29 7b 0a 20 20 5a 69 70 66 69   nBlob){.  Zipfi
8a70: 6c 65 45 4f 43 44 20 65 6f 63 64 3b 0a 20 20 69  leEOCD eocd;.  i
8a80: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 3b 0a  nt rc;.  int i;.
8a90: 20 20 69 36 34 20 69 4f 66 66 3b 0a 0a 20 20 72    i64 iOff;..  r
8aa0: 63 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 45  c = zipfileReadE
8ab0: 4f 43 44 28 70 54 61 62 2c 20 61 42 6c 6f 62 2c  OCD(pTab, aBlob,
8ac0: 20 6e 42 6c 6f 62 2c 20 70 54 61 62 2d 3e 70 57   nBlob, pTab->pW
8ad0: 72 69 74 65 46 64 2c 20 26 65 6f 63 64 29 3b 0a  riteFd, &eocd);.
8ae0: 20 20 69 4f 66 66 20 3d 20 65 6f 63 64 2e 69 4f    iOff = eocd.iO
8af0: 66 66 73 65 74 3b 0a 20 20 66 6f 72 28 69 3d 30  ffset;.  for(i=0
8b00: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
8b10: 26 26 20 69 3c 65 6f 63 64 2e 6e 45 6e 74 72 79  && i<eocd.nEntry
8b20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 5a 69 70 66  ; i++){.    Zipf
8b30: 69 6c 65 45 6e 74 72 79 20 2a 70 4e 65 77 20 3d  ileEntry *pNew =
8b40: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 7a 69 70   0;.    rc = zip
8b50: 66 69 6c 65 47 65 74 45 6e 74 72 79 28 70 54 61  fileGetEntry(pTa
8b60: 62 2c 20 61 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c  b, aBlob, nBlob,
8b70: 20 70 54 61 62 2d 3e 70 57 72 69 74 65 46 64 2c   pTab->pWriteFd,
8b80: 20 69 4f 66 66 2c 20 26 70 4e 65 77 29 3b 0a 0a   iOff, &pNew);..
8b90: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
8ba0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 7a  TE_OK ){.      z
8bb0: 69 70 66 69 6c 65 41 64 64 45 6e 74 72 79 28 70  ipfileAddEntry(p
8bc0: 54 61 62 2c 20 30 2c 20 70 4e 65 77 29 3b 0a 20  Tab, 0, pNew);. 
8bd0: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 5a 49 50       iOff += ZIP
8be0: 46 49 4c 45 5f 43 44 53 5f 46 49 58 45 44 5f 53  FILE_CDS_FIXED_S
8bf0: 5a 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  Z;.      iOff +=
8c00: 20 28 69 6e 74 29 70 4e 65 77 2d 3e 63 64 73 2e   (int)pNew->cds.
8c10: 6e 45 78 74 72 61 20 2b 20 70 4e 65 77 2d 3e 63  nExtra + pNew->c
8c20: 64 73 2e 6e 46 69 6c 65 20 2b 20 70 4e 65 77 2d  ds.nFile + pNew-
8c30: 3e 63 64 73 2e 6e 43 6f 6d 6d 65 6e 74 3b 0a 20  >cds.nComment;. 
8c40: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
8c50: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78  n rc;.}../*.** x
8c60: 46 69 6c 74 65 72 20 63 61 6c 6c 62 61 63 6b 2e  Filter callback.
8c70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .*/.static int z
8c80: 69 70 66 69 6c 65 46 69 6c 74 65 72 28 0a 20 20  ipfileFilter(.  
8c90: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
8ca0: 73 6f 72 20 2a 63 75 72 2c 20 0a 20 20 69 6e 74  sor *cur, .  int
8cb0: 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63   idxNum, const c
8cc0: 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20 69  har *idxStr,.  i
8cd0: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
8ce0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
8cf0: 0a 20 20 5a 69 70 66 69 6c 65 54 61 62 20 2a 70  .  ZipfileTab *p
8d00: 54 61 62 20 3d 20 28 5a 69 70 66 69 6c 65 54 61  Tab = (ZipfileTa
8d10: 62 2a 29 63 75 72 2d 3e 70 56 74 61 62 3b 0a 20  b*)cur->pVtab;. 
8d20: 20 5a 69 70 66 69 6c 65 43 73 72 20 2a 70 43 73   ZipfileCsr *pCs
8d30: 72 20 3d 20 28 5a 69 70 66 69 6c 65 43 73 72 2a  r = (ZipfileCsr*
8d40: 29 63 75 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68  )cur;.  const ch
8d50: 61 72 20 2a 7a 46 69 6c 65 20 3d 20 30 3b 20 20  ar *zFile = 0;  
8d60: 20 20 20 20 20 20 20 20 2f 2a 20 5a 69 70 20 66          /* Zip f
8d70: 69 6c 65 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20  ile to scan */. 
8d80: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
8d90: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
8da0: 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
8db0: 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 4d 65 6d 6f  */.  int bInMemo
8dc0: 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ry = 0;         
8dd0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
8de0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 7a 69   an in-memory zi
8df0: 70 66 69 6c 65 20 2a 2f 0a 0a 20 20 7a 69 70 66  pfile */..  zipf
8e00: 69 6c 65 52 65 73 65 74 43 75 72 73 6f 72 28 70  ileResetCursor(p
8e10: 43 73 72 29 3b 0a 0a 20 20 69 66 28 20 70 54 61  Csr);..  if( pTa
8e20: 62 2d 3e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20  b->zFile ){.    
8e30: 7a 46 69 6c 65 20 3d 20 70 54 61 62 2d 3e 7a 46  zFile = pTab->zF
8e40: 69 6c 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ile;.  }else if(
8e50: 20 69 64 78 4e 75 6d 3d 3d 30 20 29 7b 0a 20 20   idxNum==0 ){.  
8e60: 20 20 7a 69 70 66 69 6c 65 43 75 72 73 6f 72 45    zipfileCursorE
8e70: 72 72 28 70 43 73 72 2c 20 22 7a 69 70 66 69 6c  rr(pCsr, "zipfil
8e80: 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 71  e() function req
8e90: 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e  uires an argumen
8ea0: 74 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t");.    return 
8eb0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
8ec0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
8ed0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
8ee0: 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 42 4c  v[0])==SQLITE_BL
8ef0: 4f 42 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OB ){.    const 
8f00: 75 38 20 2a 61 42 6c 6f 62 20 3d 20 28 63 6f 6e  u8 *aBlob = (con
8f10: 73 74 20 75 38 2a 29 73 71 6c 69 74 65 33 5f 76  st u8*)sqlite3_v
8f20: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
8f30: 5d 29 3b 0a 20 20 20 20 69 6e 74 20 6e 42 6c 6f  ]);.    int nBlo
8f40: 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  b = sqlite3_valu
8f50: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
8f60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
8f70: 61 62 2d 3e 70 46 69 72 73 74 45 6e 74 72 79 3d  ab->pFirstEntry=
8f80: 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 7a  =0 );.    rc = z
8f90: 69 70 66 69 6c 65 4c 6f 61 64 44 69 72 65 63 74  ipfileLoadDirect
8fa0: 6f 72 79 28 70 54 61 62 2c 20 61 42 6c 6f 62 2c  ory(pTab, aBlob,
8fb0: 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 70 43 73   nBlob);.    pCs
8fc0: 72 2d 3e 70 46 72 65 65 45 6e 74 72 79 20 3d 20  r->pFreeEntry = 
8fd0: 70 54 61 62 2d 3e 70 46 69 72 73 74 45 6e 74 72  pTab->pFirstEntr
8fe0: 79 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70 46 69  y;.    pTab->pFi
8ff0: 72 73 74 45 6e 74 72 79 20 3d 20 70 54 61 62 2d  rstEntry = pTab-
9000: 3e 70 4c 61 73 74 45 6e 74 72 79 20 3d 20 30 3b  >pLastEntry = 0;
9010: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
9020: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
9030: 72 63 3b 0a 20 20 20 20 62 49 6e 4d 65 6d 6f 72  rc;.    bInMemor
9040: 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 1;.  }else{.
9050: 20 20 20 20 7a 46 69 6c 65 20 3d 20 28 63 6f 6e      zFile = (con
9060: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
9070: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
9080: 5b 30 5d 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  [0]);.  }..  if(
9090: 20 30 3d 3d 70 54 61 62 2d 3e 70 57 72 69 74 65   0==pTab->pWrite
90a0: 46 64 20 26 26 20 30 3d 3d 62 49 6e 4d 65 6d 6f  Fd && 0==bInMemo
90b0: 72 79 20 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e  ry ){.    pCsr->
90c0: 70 46 69 6c 65 20 3d 20 66 6f 70 65 6e 28 7a 46  pFile = fopen(zF
90d0: 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20  ile, "rb");.    
90e0: 69 66 28 20 70 43 73 72 2d 3e 70 46 69 6c 65 3d  if( pCsr->pFile=
90f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 69 70 66  =0 ){.      zipf
9100: 69 6c 65 43 75 72 73 6f 72 45 72 72 28 70 43 73  ileCursorErr(pCs
9110: 72 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  r, "cannot open 
9120: 66 69 6c 65 3a 20 25 73 22 2c 20 7a 46 69 6c 65  file: %s", zFile
9130: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
9140: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
9150: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
9160: 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 45 4f 43  = zipfileReadEOC
9170: 44 28 70 54 61 62 2c 20 30 2c 20 30 2c 20 70 43  D(pTab, 0, 0, pC
9180: 73 72 2d 3e 70 46 69 6c 65 2c 20 26 70 43 73 72  sr->pFile, &pCsr
9190: 2d 3e 65 6f 63 64 29 3b 0a 20 20 20 20 20 20 69  ->eocd);.      i
91a0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
91b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
91c0: 70 43 73 72 2d 3e 65 6f 63 64 2e 6e 45 6e 74 72  pCsr->eocd.nEntr
91d0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
91e0: 20 20 70 43 73 72 2d 3e 62 45 6f 66 20 3d 20 31    pCsr->bEof = 1
91f0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
9200: 0a 20 20 20 20 20 20 20 20 20 20 70 43 73 72 2d  .          pCsr-
9210: 3e 69 4e 65 78 74 4f 66 66 20 3d 20 70 43 73 72  >iNextOff = pCsr
9220: 2d 3e 65 6f 63 64 2e 69 4f 66 66 73 65 74 3b 0a  ->eocd.iOffset;.
9230: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 7a            rc = z
9240: 69 70 66 69 6c 65 4e 65 78 74 28 63 75 72 29 3b  ipfileNext(cur);
9250: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9260: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
9270: 7b 0a 20 20 20 20 70 43 73 72 2d 3e 62 4e 6f 6f  {.    pCsr->bNoo
9280: 70 20 3d 20 31 3b 0a 20 20 20 20 70 43 73 72 2d  p = 1;.    pCsr-
9290: 3e 70 43 75 72 72 65 6e 74 20 3d 20 70 43 73 72  >pCurrent = pCsr
92a0: 2d 3e 70 46 72 65 65 45 6e 74 72 79 20 3f 20 70  ->pFreeEntry ? p
92b0: 43 73 72 2d 3e 70 46 72 65 65 45 6e 74 72 79 20  Csr->pFreeEntry 
92c0: 3a 20 70 54 61 62 2d 3e 70 46 69 72 73 74 45 6e  : pTab->pFirstEn
92d0: 74 72 79 3b 0a 20 20 20 20 72 63 20 3d 20 7a 69  try;.    rc = zi
92e0: 70 66 69 6c 65 4e 65 78 74 28 63 75 72 29 3b 0a  pfileNext(cur);.
92f0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
9300: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 42 65 73 74  ;.}../*.** xBest
9310: 49 6e 64 65 78 20 63 61 6c 6c 62 61 63 6b 2e 0a  Index callback..
9320: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 69  */.static int zi
9330: 70 66 69 6c 65 42 65 73 74 49 6e 64 65 78 28 0a  pfileBestIndex(.
9340: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
9350: 74 61 62 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  tab,.  sqlite3_i
9360: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
9370: 6e 66 6f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nfo.){.  int i;.
9380: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
9390: 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
93a0: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  int; i++){.    c
93b0: 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69  onst struct sqli
93c0: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
93d0: 61 69 6e 74 20 2a 70 43 6f 6e 73 20 3d 20 26 70  aint *pCons = &p
93e0: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
93f0: 61 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  aint[i];.    if(
9400: 20 70 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 3d 3d   pCons->usable==
9410: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
9420: 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 6f 70 21    if( pCons->op!
9430: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
9440: 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 20 63 6f  NSTRAINT_EQ ) co
9450: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
9460: 70 43 6f 6e 73 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pCons->iColumn!=
9470: 5a 49 50 46 49 4c 45 5f 46 5f 43 4f 4c 55 4d 4e  ZIPFILE_F_COLUMN
9480: 5f 49 44 58 20 29 20 63 6f 6e 74 69 6e 75 65 3b  _IDX ) continue;
9490: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
94a0: 0a 20 20 69 66 28 20 69 3c 70 49 64 78 49 6e 66  .  if( i<pIdxInf
94b0: 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29  o->nConstraint )
94c0: 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  {.    pIdxInfo->
94d0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
94e0: 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  [i].argvIndex = 
94f0: 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  1;.    pIdxInfo-
9500: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
9510: 65 5b 69 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20  e[i].omit = 1;. 
9520: 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
9530: 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 31 30 30  imatedCost = 100
9540: 30 2e 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  0.0;.    pIdxInf
9550: 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 31 3b 0a 20  o->idxNum = 1;. 
9560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78   }else{.    pIdx
9570: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
9580: 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 28 28  ost = (double)((
9590: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 31  (sqlite3_int64)1
95a0: 29 20 3c 3c 20 35 30 29 3b 0a 20 20 20 20 70 49  ) << 50);.    pI
95b0: 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
95c0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   0;.  }..  retur
95d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
95e0: 73 74 61 74 69 63 20 5a 69 70 66 69 6c 65 45 6e  static ZipfileEn
95f0: 74 72 79 20 2a 7a 69 70 66 69 6c 65 4e 65 77 45  try *zipfileNewE
9600: 6e 74 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20  ntry(const char 
9610: 2a 7a 50 61 74 68 29 7b 0a 20 20 5a 69 70 66 69  *zPath){.  Zipfi
9620: 6c 65 45 6e 74 72 79 20 2a 70 4e 65 77 3b 0a 20  leEntry *pNew;. 
9630: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
9640: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 5a 69  malloc(sizeof(Zi
9650: 70 66 69 6c 65 45 6e 74 72 79 29 29 3b 0a 20 20  pfileEntry));.  
9660: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
9670: 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20  memset(pNew, 0, 
9680: 73 69 7a 65 6f 66 28 5a 69 70 66 69 6c 65 45 6e  sizeof(ZipfileEn
9690: 74 72 79 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d  try));.    pNew-
96a0: 3e 63 64 73 2e 7a 46 69 6c 65 20 3d 20 73 71 6c  >cds.zFile = sql
96b0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
96c0: 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 69  ", zPath);.    i
96d0: 66 28 20 70 4e 65 77 2d 3e 63 64 73 2e 7a 46 69  f( pNew->cds.zFi
96e0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  le==0 ){.      s
96f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
9700: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
9710: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
9720: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 73  eturn pNew;.}..s
9730: 74 61 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c  tatic int zipfil
9740: 65 53 65 72 69 61 6c 69 7a 65 4c 46 48 28 5a 69  eSerializeLFH(Zi
9750: 70 66 69 6c 65 45 6e 74 72 79 20 2a 70 45 6e 74  pfileEntry *pEnt
9760: 72 79 2c 20 75 38 20 2a 61 42 75 66 29 7b 0a 20  ry, u8 *aBuf){. 
9770: 20 5a 69 70 66 69 6c 65 43 44 53 20 2a 70 43 64   ZipfileCDS *pCd
9780: 73 20 3d 20 26 70 45 6e 74 72 79 2d 3e 63 64 73  s = &pEntry->cds
9790: 3b 0a 20 20 75 38 20 2a 61 20 3d 20 61 42 75 66  ;.  u8 *a = aBuf
97a0: 3b 0a 0a 20 20 70 43 64 73 2d 3e 6e 45 78 74 72  ;..  pCds->nExtr
97b0: 61 20 3d 20 39 3b 0a 0a 20 20 2f 2a 20 57 72 69  a = 9;..  /* Wri
97c0: 74 65 20 74 68 65 20 4c 46 48 20 69 74 73 65 6c  te the LFH itsel
97d0: 66 20 2a 2f 0a 20 20 7a 69 70 66 69 6c 65 57 72  f */.  zipfileWr
97e0: 69 74 65 33 32 28 61 2c 20 5a 49 50 46 49 4c 45  ite32(a, ZIPFILE
97f0: 5f 53 49 47 4e 41 54 55 52 45 5f 4c 46 48 29 3b  _SIGNATURE_LFH);
9800: 0a 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65 31  .  zipfileWrite1
9810: 36 28 61 2c 20 70 43 64 73 2d 3e 69 56 65 72 73  6(a, pCds->iVers
9820: 69 6f 6e 45 78 74 72 61 63 74 29 3b 0a 20 20 7a  ionExtract);.  z
9830: 69 70 66 69 6c 65 57 72 69 74 65 31 36 28 61 2c  ipfileWrite16(a,
9840: 20 70 43 64 73 2d 3e 66 6c 61 67 73 29 3b 0a 20   pCds->flags);. 
9850: 20 7a 69 70 66 69 6c 65 57 72 69 74 65 31 36 28   zipfileWrite16(
9860: 61 2c 20 70 43 64 73 2d 3e 69 43 6f 6d 70 72 65  a, pCds->iCompre
9870: 73 73 69 6f 6e 29 3b 0a 20 20 7a 69 70 66 69 6c  ssion);.  zipfil
9880: 65 57 72 69 74 65 31 36 28 61 2c 20 70 43 64 73  eWrite16(a, pCds
9890: 2d 3e 6d 54 69 6d 65 29 3b 0a 20 20 7a 69 70 66  ->mTime);.  zipf
98a0: 69 6c 65 57 72 69 74 65 31 36 28 61 2c 20 70 43  ileWrite16(a, pC
98b0: 64 73 2d 3e 6d 44 61 74 65 29 3b 0a 20 20 7a 69  ds->mDate);.  zi
98c0: 70 66 69 6c 65 57 72 69 74 65 33 32 28 61 2c 20  pfileWrite32(a, 
98d0: 70 43 64 73 2d 3e 63 72 63 33 32 29 3b 0a 20 20  pCds->crc32);.  
98e0: 7a 69 70 66 69 6c 65 57 72 69 74 65 33 32 28 61  zipfileWrite32(a
98f0: 2c 20 70 43 64 73 2d 3e 73 7a 43 6f 6d 70 72 65  , pCds->szCompre
9900: 73 73 65 64 29 3b 0a 20 20 7a 69 70 66 69 6c 65  ssed);.  zipfile
9910: 57 72 69 74 65 33 32 28 61 2c 20 70 43 64 73 2d  Write32(a, pCds-
9920: 3e 73 7a 55 6e 63 6f 6d 70 72 65 73 73 65 64 29  >szUncompressed)
9930: 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65  ;.  zipfileWrite
9940: 31 36 28 61 2c 20 28 75 31 36 29 70 43 64 73 2d  16(a, (u16)pCds-
9950: 3e 6e 46 69 6c 65 29 3b 0a 20 20 7a 69 70 66 69  >nFile);.  zipfi
9960: 6c 65 57 72 69 74 65 31 36 28 61 2c 20 70 43 64  leWrite16(a, pCd
9970: 73 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 61 73  s->nExtra);.  as
9980: 73 65 72 74 28 20 61 3d 3d 26 61 42 75 66 5b 5a  sert( a==&aBuf[Z
9990: 49 50 46 49 4c 45 5f 4c 46 48 5f 46 49 58 45 44  IPFILE_LFH_FIXED
99a0: 5f 53 5a 5d 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  _SZ] );..  /* Ad
99b0: 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20  d the file name 
99c0: 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 61 2c 20 70  */.  memcpy(a, p
99d0: 43 64 73 2d 3e 7a 46 69 6c 65 2c 20 28 69 6e 74  Cds->zFile, (int
99e0: 29 70 43 64 73 2d 3e 6e 46 69 6c 65 29 3b 0a 20  )pCds->nFile);. 
99f0: 20 61 20 2b 3d 20 28 69 6e 74 29 70 43 64 73 2d   a += (int)pCds-
9a00: 3e 6e 46 69 6c 65 3b 0a 0a 20 20 2f 2a 20 54 68  >nFile;..  /* Th
9a10: 65 20 22 65 78 74 72 61 22 20 64 61 74 61 20 2a  e "extra" data *
9a20: 2f 0a 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65  /.  zipfileWrite
9a30: 31 36 28 61 2c 20 5a 49 50 46 49 4c 45 5f 45 58  16(a, ZIPFILE_EX
9a40: 54 52 41 5f 54 49 4d 45 53 54 41 4d 50 29 3b 0a  TRA_TIMESTAMP);.
9a50: 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65 31 36    zipfileWrite16
9a60: 28 61 2c 20 35 29 3b 0a 20 20 2a 61 2b 2b 20 3d  (a, 5);.  *a++ =
9a70: 20 30 78 30 31 3b 0a 20 20 7a 69 70 66 69 6c 65   0x01;.  zipfile
9a80: 57 72 69 74 65 33 32 28 61 2c 20 70 45 6e 74 72  Write32(a, pEntr
9a90: 79 2d 3e 6d 55 6e 69 78 54 69 6d 65 29 3b 0a 0a  y->mUnixTime);..
9aa0: 20 20 72 65 74 75 72 6e 20 61 2d 61 42 75 66 3b    return a-aBuf;
9ab0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .}..static int z
9ac0: 69 70 66 69 6c 65 41 70 70 65 6e 64 45 6e 74 72  ipfileAppendEntr
9ad0: 79 28 0a 20 20 5a 69 70 66 69 6c 65 54 61 62 20  y(.  ZipfileTab 
9ae0: 2a 70 54 61 62 2c 0a 20 20 5a 69 70 66 69 6c 65  *pTab,.  Zipfile
9af0: 45 6e 74 72 79 20 2a 70 45 6e 74 72 79 2c 0a 20  Entry *pEntry,. 
9b00: 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61   const u8 *pData
9b10: 2c 0a 20 20 69 6e 74 20 6e 44 61 74 61 0a 29 7b  ,.  int nData.){
9b20: 0a 20 20 75 38 20 2a 61 42 75 66 20 3d 20 70 54  .  u8 *aBuf = pT
9b30: 61 62 2d 3e 61 42 75 66 66 65 72 3b 0a 20 20 69  ab->aBuffer;.  i
9b40: 6e 74 20 6e 42 75 66 3b 0a 20 20 69 6e 74 20 72  nt nBuf;.  int r
9b50: 63 3b 0a 0a 20 20 6e 42 75 66 20 3d 20 7a 69 70  c;..  nBuf = zip
9b60: 66 69 6c 65 53 65 72 69 61 6c 69 7a 65 4c 46 48  fileSerializeLFH
9b70: 28 70 45 6e 74 72 79 2c 20 61 42 75 66 29 3b 0a  (pEntry, aBuf);.
9b80: 20 20 72 63 20 3d 20 7a 69 70 66 69 6c 65 41 70    rc = zipfileAp
9b90: 70 65 6e 64 44 61 74 61 28 70 54 61 62 2c 20 61  pendData(pTab, a
9ba0: 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 69 66  Buf, nBuf);.  if
9bb0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
9bc0: 29 7b 0a 20 20 20 20 70 45 6e 74 72 79 2d 3e 69  ){.    pEntry->i
9bd0: 44 61 74 61 4f 66 66 20 3d 20 70 54 61 62 2d 3e  DataOff = pTab->
9be0: 73 7a 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 72  szCurrent;.    r
9bf0: 63 20 3d 20 7a 69 70 66 69 6c 65 41 70 70 65 6e  c = zipfileAppen
9c00: 64 44 61 74 61 28 70 54 61 62 2c 20 70 44 61 74  dData(pTab, pDat
9c10: 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 0a  a, nData);.  }..
9c20: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9c30: 73 74 61 74 69 63 20 69 6e 74 20 7a 69 70 66 69  static int zipfi
9c40: 6c 65 47 65 74 4d 6f 64 65 28 0a 20 20 73 71 6c  leGetMode(.  sql
9c50: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
9c60: 2c 20 0a 20 20 69 6e 74 20 62 49 73 44 69 72 2c  , .  int bIsDir,
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c80: 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
9c90: 20 64 65 66 61 75 6c 74 20 74 6f 20 64 69 72 65   default to dire
9ca0: 63 74 6f 72 79 20 2a 2f 0a 20 20 75 33 32 20 2a  ctory */.  u32 *
9cb0: 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  pMode,          
9cc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
9cd0: 54 3a 20 4d 6f 64 65 20 76 61 6c 75 65 20 2a 2f  T: Mode value */
9ce0: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20  .  char **pzErr 
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d00: 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72     /* OUT: Error
9d10: 20 6d 65 73 73 61 67 65 20 2a 2f 0a 29 7b 0a 20   message */.){. 
9d20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
9d30: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
9d40: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
9d50: 28 70 56 61 6c 29 3b 0a 20 20 75 33 32 20 6d 6f  (pVal);.  u32 mo
9d60: 64 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 3d  de = 0;.  if( z=
9d70: 3d 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 20 3d  =0 ){.    mode =
9d80: 20 28 62 49 73 44 69 72 20 3f 20 28 53 5f 49 46   (bIsDir ? (S_IF
9d90: 44 49 52 20 2b 20 30 37 35 35 29 20 3a 20 28 53  DIR + 0755) : (S
9da0: 5f 49 46 52 45 47 20 2b 20 30 36 34 34 29 29 3b  _IFREG + 0644));
9db0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30  .  }else if( z[0
9dc0: 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 30 5d 3c 3d  ]>='0' && z[0]<=
9dd0: 27 39 27 20 29 7b 0a 20 20 20 20 6d 6f 64 65 20  '9' ){.    mode 
9de0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  = (unsigned int)
9df0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
9e00: 74 28 70 56 61 6c 29 3b 0a 20 20 7d 65 6c 73 65  t(pVal);.  }else
9e10: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
9e20: 20 7a 54 65 6d 70 6c 61 74 65 5b 31 31 5d 20 3d   zTemplate[11] =
9e30: 20 22 2d 72 77 78 72 77 78 72 77 78 22 3b 0a 20   "-rwxrwxrwx";. 
9e40: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66     int i;.    if
9e50: 28 20 73 74 72 6c 65 6e 28 7a 29 21 3d 31 30 20  ( strlen(z)!=10 
9e60: 29 20 67 6f 74 6f 20 70 61 72 73 65 5f 65 72 72  ) goto parse_err
9e70: 6f 72 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  or;.    switch( 
9e80: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 63 61  z[0] ){.      ca
9e90: 73 65 20 27 2d 27 3a 20 6d 6f 64 65 20 7c 3d 20  se '-': mode |= 
9ea0: 53 5f 49 46 52 45 47 3b 20 62 72 65 61 6b 3b 0a  S_IFREG; break;.
9eb0: 20 20 20 20 20 20 63 61 73 65 20 27 64 27 3a 20        case 'd': 
9ec0: 6d 6f 64 65 20 7c 3d 20 53 5f 49 46 44 49 52 3b  mode |= S_IFDIR;
9ed0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9ee0: 73 65 20 27 6c 27 3a 20 6d 6f 64 65 20 7c 3d 20  se 'l': mode |= 
9ef0: 53 5f 49 46 4c 4e 4b 3b 20 62 72 65 61 6b 3b 0a  S_IFLNK; break;.
9f00: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 67        default: g
9f10: 6f 74 6f 20 70 61 72 73 65 5f 65 72 72 6f 72 3b  oto parse_error;
9f20: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
9f30: 3d 31 3b 20 69 3c 31 30 3b 20 69 2b 2b 29 7b 0a  =1; i<10; i++){.
9f40: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d        if( z[i]==
9f50: 7a 54 65 6d 70 6c 61 74 65 5b 69 5d 20 29 20 6d  zTemplate[i] ) m
9f60: 6f 64 65 20 7c 3d 20 31 20 3c 3c 20 28 39 2d 69  ode |= 1 << (9-i
9f70: 29 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66  );.      else if
9f80: 28 20 7a 5b 69 5d 21 3d 27 2d 27 20 29 20 67 6f  ( z[i]!='-' ) go
9f90: 74 6f 20 70 61 72 73 65 5f 65 72 72 6f 72 3b 0a  to parse_error;.
9fa0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
9fb0: 28 28 6d 6f 64 65 20 26 20 53 5f 49 46 44 49 52  ((mode & S_IFDIR
9fc0: 29 3d 3d 30 29 3d 3d 62 49 73 44 69 72 20 29 7b  )==0)==bIsDir ){
9fd0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 22 6d 6f 64  .    /* The "mod
9fe0: 65 22 20 61 74 74 72 69 62 75 74 65 20 69 73 20  e" attribute is 
9ff0: 61 20 64 69 72 65 63 74 6f 72 79 2c 20 62 75 74  a directory, but
a000: 20 64 61 74 61 20 68 61 73 20 62 65 65 6e 20 73   data has been s
a010: 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2a  pecified..    **
a020: 20 4f 72 20 76 69 63 65 2d 76 65 72 73 61 20 2d   Or vice-versa -
a030: 20 6e 6f 20 64 61 74 61 20 62 75 74 20 22 6d 6f   no data but "mo
a040: 64 65 22 20 69 73 20 61 20 66 69 6c 65 20 6f 72  de" is a file or
a050: 20 73 79 6d 6c 69 6e 6b 2e 20 20 2a 2f 0a 20 20   symlink.  */.  
a060: 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74    *pzErr = sqlit
a070: 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69 70 66  e3_mprintf("zipf
a080: 69 6c 65 3a 20 6d 6f 64 65 20 64 6f 65 73 20 6e  ile: mode does n
a090: 6f 74 20 6d 61 74 63 68 20 64 61 74 61 22 29 3b  ot match data");
a0a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a0b0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
a0c0: 20 7d 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 6d 6f   }.  *pMode = mo
a0d0: 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  de;.  return SQL
a0e0: 49 54 45 5f 4f 4b 3b 0a 0a 20 70 61 72 73 65 5f  ITE_OK;.. parse_
a0f0: 65 72 72 6f 72 3a 0a 20 20 2a 70 7a 45 72 72 20  error:.  *pzErr 
a100: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
a110: 66 28 22 7a 69 70 66 69 6c 65 3a 20 70 61 72 73  f("zipfile: pars
a120: 65 20 65 72 72 6f 72 20 69 6e 20 6d 6f 64 65 3a  e error in mode:
a130: 20 25 73 22 2c 20 7a 29 3b 0a 20 20 72 65 74 75   %s", z);.  retu
a140: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
a150: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 28  .}../*.** Both (
a160: 63 6f 6e 73 74 20 63 68 61 72 2a 29 20 61 72 67  const char*) arg
a170: 75 6d 65 6e 74 73 20 70 6f 69 6e 74 20 74 6f 20  uments point to 
a180: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
a190: 74 72 69 6e 67 73 2e 20 41 72 67 75 6d 65 6e 74  trings. Argument
a1a0: 0a 2a 2a 20 6e 42 20 69 73 20 74 68 65 20 76 61  .** nB is the va
a1b0: 6c 75 65 20 6f 66 20 73 74 72 6c 65 6e 28 7a 42  lue of strlen(zB
a1c0: 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ). This function
a1d0: 20 72 65 74 75 72 6e 73 20 30 20 69 66 20 74 68   returns 0 if th
a1e0: 65 20 73 74 72 69 6e 67 73 20 61 72 65 0a 2a 2a  e strings are.**
a1f0: 20 69 64 65 6e 74 69 63 61 6c 2c 20 69 67 6e 6f   identical, igno
a200: 72 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e  ring any trailin
a210: 67 20 27 2f 27 20 63 68 61 72 61 63 74 65 72 20  g '/' character 
a220: 69 6e 20 65 69 74 68 65 72 20 70 61 74 68 2e 20  in either path. 
a230: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a   */.static int z
a240: 69 70 66 69 6c 65 43 6f 6d 70 61 72 65 50 61 74  ipfileComparePat
a250: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  h(const char *zA
a260: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42  , const char *zB
a270: 2c 20 69 6e 74 20 6e 42 29 7b 0a 20 20 69 6e 74  , int nB){.  int
a280: 20 6e 41 20 3d 20 28 69 6e 74 29 73 74 72 6c 65   nA = (int)strle
a290: 6e 28 7a 41 29 3b 0a 20 20 69 66 28 20 7a 41 5b  n(zA);.  if( zA[
a2a0: 6e 41 2d 31 5d 3d 3d 27 2f 27 20 29 20 6e 41 2d  nA-1]=='/' ) nA-
a2b0: 2d 3b 0a 20 20 69 66 28 20 7a 42 5b 6e 42 2d 31  -;.  if( zB[nB-1
a2c0: 5d 3d 3d 27 2f 27 20 29 20 6e 42 2d 2d 3b 0a 20  ]=='/' ) nB--;. 
a2d0: 20 69 66 28 20 6e 41 3d 3d 6e 42 20 26 26 20 6d   if( nA==nB && m
a2e0: 65 6d 63 6d 70 28 7a 41 2c 20 7a 42 2c 20 6e 41  emcmp(zA, zB, nA
a2f0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
a300: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
a310: 73 74 61 74 69 63 20 69 6e 74 20 7a 69 70 66 69  static int zipfi
a320: 6c 65 42 65 67 69 6e 28 73 71 6c 69 74 65 33 5f  leBegin(sqlite3_
a330: 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
a340: 5a 69 70 66 69 6c 65 54 61 62 20 2a 70 54 61 62  ZipfileTab *pTab
a350: 20 3d 20 28 5a 69 70 66 69 6c 65 54 61 62 2a 29   = (ZipfileTab*)
a360: 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20  pVtab;.  int rc 
a370: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
a380: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 57  assert( pTab->pW
a390: 72 69 74 65 46 64 3d 3d 30 20 29 3b 0a 0a 20 20  riteFd==0 );..  
a3a0: 2f 2a 20 4f 70 65 6e 20 61 20 77 72 69 74 65 20  /* Open a write 
a3b0: 66 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20  fd on the file. 
a3c0: 41 6c 73 6f 20 6c 6f 61 64 20 74 68 65 20 65 6e  Also load the en
a3d0: 74 69 72 65 20 63 65 6e 74 72 61 6c 20 64 69 72  tire central dir
a3e0: 65 63 74 6f 72 79 0a 20 20 2a 2a 20 73 74 72 75  ectory.  ** stru
a3f0: 63 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72  cture into memor
a400: 79 2e 20 44 75 72 69 6e 67 20 74 68 65 20 74 72  y. During the tr
a410: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 79 20 6e 65  ansaction any ne
a420: 77 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 0a  w file data is .
a430: 20 20 2a 2a 20 61 70 70 65 6e 64 65 64 20 74 6f    ** appended to
a440: 20 74 68 65 20 61 72 63 68 69 76 65 20 66 69 6c   the archive fil
a450: 65 2c 20 62 75 74 20 74 68 65 20 63 65 6e 74 72  e, but the centr
a460: 61 6c 20 64 69 72 65 63 74 6f 72 79 20 69 73 20  al directory is 
a470: 61 63 63 75 6d 75 6c 61 74 65 64 0a 20 20 2a 2a  accumulated.  **
a480: 20 69 6e 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20   in main-memory 
a490: 75 6e 74 69 6c 20 74 68 65 20 74 72 61 6e 73 61  until the transa
a4a0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
a4b0: 65 64 2e 20 20 2a 2f 0a 20 20 70 54 61 62 2d 3e  ed.  */.  pTab->
a4c0: 70 57 72 69 74 65 46 64 20 3d 20 66 6f 70 65 6e  pWriteFd = fopen
a4d0: 28 70 54 61 62 2d 3e 7a 46 69 6c 65 2c 20 22 61  (pTab->zFile, "a
a4e0: 62 2b 22 29 3b 0a 20 20 69 66 28 20 70 54 61 62  b+");.  if( pTab
a4f0: 2d 3e 70 57 72 69 74 65 46 64 3d 3d 30 20 29 7b  ->pWriteFd==0 ){
a500: 0a 20 20 20 20 70 54 61 62 2d 3e 62 61 73 65 2e  .    pTab->base.
a510: 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
a520: 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
a530: 20 20 20 22 7a 69 70 66 69 6c 65 3a 20 66 61 69     "zipfile: fai
a540: 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  led to open file
a550: 20 25 73 20 66 6f 72 20 77 72 69 74 69 6e 67 22   %s for writing"
a560: 2c 20 70 54 61 62 2d 3e 7a 46 69 6c 65 0a 20 20  , pTab->zFile.  
a570: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20        );.    rc 
a580: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
a590: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 73 65    }else{.    fse
a5a0: 65 6b 28 70 54 61 62 2d 3e 70 57 72 69 74 65 46  ek(pTab->pWriteF
a5b0: 64 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44 29 3b  d, 0, SEEK_END);
a5c0: 0a 20 20 20 20 70 54 61 62 2d 3e 73 7a 43 75 72  .    pTab->szCur
a5d0: 72 65 6e 74 20 3d 20 70 54 61 62 2d 3e 73 7a 4f  rent = pTab->szO
a5e0: 72 69 67 20 3d 20 28 69 36 34 29 66 74 65 6c 6c  rig = (i64)ftell
a5f0: 28 70 54 61 62 2d 3e 70 57 72 69 74 65 46 64 29  (pTab->pWriteFd)
a600: 3b 0a 20 20 20 20 72 63 20 3d 20 7a 69 70 66 69  ;.    rc = zipfi
a610: 6c 65 4c 6f 61 64 44 69 72 65 63 74 6f 72 79 28  leLoadDirectory(
a620: 70 54 61 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  pTab, 0, 0);.  }
a630: 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
a640: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 69 70  TE_OK ){.    zip
a650: 66 69 6c 65 43 6c 65 61 6e 75 70 54 72 61 6e 73  fileCleanupTrans
a660: 61 63 74 69 6f 6e 28 70 54 61 62 29 3b 0a 20 20  action(pTab);.  
a670: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
a680: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
a690: 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
a6a0: 20 61 73 20 61 20 33 32 2d 62 69 74 20 74 69 6d   as a 32-bit tim
a6b0: 65 73 74 61 6d 70 20 69 6e 20 55 4e 49 58 20 65  estamp in UNIX e
a6c0: 70 6f 63 68 20 66 6f 72 6d 61 74 20 28 6c 69 6b  poch format (lik
a6d0: 65 0a 2a 2a 20 74 69 6d 65 28 32 29 29 2e 0a 2a  e.** time(2))..*
a6e0: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 7a 69 70  /.static u32 zip
a6f0: 66 69 6c 65 54 69 6d 65 28 76 6f 69 64 29 7b 0a  fileTime(void){.
a700: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
a710: 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
a720: 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 75 33 32  s_find(0);.  u32
a730: 20 72 65 74 3b 0a 20 20 69 66 28 20 70 56 66 73   ret;.  if( pVfs
a740: 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32 20 26 26  ->iVersion>=2 &&
a750: 20 70 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54   pVfs->xCurrentT
a760: 69 6d 65 49 6e 74 36 34 20 29 7b 0a 20 20 20 20  imeInt64 ){.    
a770: 69 36 34 20 6d 73 3b 0a 20 20 20 20 70 56 66 73  i64 ms;.    pVfs
a780: 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  ->xCurrentTimeIn
a790: 74 36 34 28 70 56 66 73 2c 20 26 6d 73 29 3b 0a  t64(pVfs, &ms);.
a7a0: 20 20 20 20 72 65 74 20 3d 20 28 75 33 32 29 28      ret = (u32)(
a7b0: 28 6d 73 2f 31 30 30 30 29 20 2d 20 28 28 69 36  (ms/1000) - ((i6
a7c0: 34 29 32 34 34 30 35 38 37 35 20 2a 20 38 36 34  4)24405875 * 864
a7d0: 30 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0));.  }else{.  
a7e0: 20 20 64 6f 75 62 6c 65 20 64 61 79 3b 0a 20 20    double day;.  
a7f0: 20 20 70 56 66 73 2d 3e 78 43 75 72 72 65 6e 74    pVfs->xCurrent
a800: 54 69 6d 65 28 70 56 66 73 2c 20 26 64 61 79 29  Time(pVfs, &day)
a810: 3b 0a 20 20 20 20 72 65 74 20 3d 20 28 75 33 32  ;.    ret = (u32
a820: 29 28 28 64 61 79 20 2d 20 32 34 34 30 35 38 37  )((day - 2440587
a830: 2e 35 29 20 2a 20 38 36 34 30 30 29 3b 0a 20 20  .5) * 86400);.  
a840: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
a850: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
a860: 61 20 33 32 2d 62 69 74 20 74 69 6d 65 73 74 61  a 32-bit timesta
a870: 6d 70 20 69 6e 20 55 4e 49 58 20 65 70 6f 63 68  mp in UNIX epoch
a880: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
a890: 66 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73  f the value pass
a8a0: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
a8b0: 72 67 75 6d 65 6e 74 20 69 73 20 65 69 74 68 65  rgument is eithe
a8c0: 72 20 4e 55 4c 4c 20 6f 72 20 61 6e 20 53 51 4c  r NULL or an SQL
a8d0: 20 4e 55 4c 4c 2c 0a 2a 2a 20 72 65 74 75 72 6e   NULL,.** return
a8e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
a8f0: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  e. Otherwise, re
a900: 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 73  turn the value s
a910: 74 6f 72 65 64 20 69 6e 20 28 2a 70 56 61 6c 29  tored in (*pVal)
a920: 0a 2a 2a 20 63 61 73 74 20 74 6f 20 61 20 33 32  .** cast to a 32
a930: 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e  -bit unsigned in
a940: 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  teger..*/.static
a950: 20 75 33 32 20 7a 69 70 66 69 6c 65 47 65 74 54   u32 zipfileGetT
a960: 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  ime(sqlite3_valu
a970: 65 20 2a 70 56 61 6c 29 7b 0a 20 20 69 66 28 20  e *pVal){.  if( 
a980: 70 56 61 6c 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  pVal==0 || sqlit
a990: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56  e3_value_type(pV
a9a0: 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  al)==SQLITE_NULL
a9b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 7a   ){.    return z
a9c0: 69 70 66 69 6c 65 54 69 6d 65 28 29 3b 0a 20 20  ipfileTime();.  
a9d0: 7d 0a 20 20 72 65 74 75 72 6e 20 28 75 33 32 29  }.  return (u32)
a9e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
a9f0: 74 36 34 28 70 56 61 6c 29 3b 0a 7d 0a 0a 2f 2a  t64(pVal);.}../*
aa00: 0a 2a 2a 20 55 6e 6c 65 73 73 20 69 74 20 69 73  .** Unless it is
aa10: 20 4e 55 4c 4c 2c 20 65 6e 74 72 79 20 70 4f 6c   NULL, entry pOl
aa20: 64 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  d is currently p
aa30: 61 72 74 20 6f 66 20 74 68 65 20 70 54 61 62 2d  art of the pTab-
aa40: 3e 70 46 69 72 73 74 45 6e 74 72 79 0a 2a 2a 20  >pFirstEntry.** 
aa50: 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 52 65  linked list.  Re
aa60: 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65  move it from the
aa70: 20 6c 69 73 74 20 61 6e 64 20 66 72 65 65 20 74   list and free t
aa80: 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  he object..*/.st
aa90: 61 74 69 63 20 76 6f 69 64 20 7a 69 70 66 69 6c  atic void zipfil
aaa0: 65 52 65 6d 6f 76 65 45 6e 74 72 79 46 72 6f 6d  eRemoveEntryFrom
aab0: 4c 69 73 74 28 5a 69 70 66 69 6c 65 54 61 62 20  List(ZipfileTab 
aac0: 2a 70 54 61 62 2c 20 5a 69 70 66 69 6c 65 45 6e  *pTab, ZipfileEn
aad0: 74 72 79 20 2a 70 4f 6c 64 29 7b 0a 20 20 69 66  try *pOld){.  if
aae0: 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 5a 69  ( pOld ){.    Zi
aaf0: 70 66 69 6c 65 45 6e 74 72 79 20 2a 2a 70 70 3b  pfileEntry **pp;
ab00: 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 70 54 61  .    for(pp=&pTa
ab10: 62 2d 3e 70 46 69 72 73 74 45 6e 74 72 79 3b 20  b->pFirstEntry; 
ab20: 28 2a 70 70 29 21 3d 70 4f 6c 64 3b 20 70 70 3d  (*pp)!=pOld; pp=
ab30: 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29  &((*pp)->pNext))
ab40: 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 2a 70 70  ;.    *pp = (*pp
ab50: 29 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7a 69  )->pNext;.    zi
ab60: 70 66 69 6c 65 45 6e 74 72 79 46 72 65 65 28 70  pfileEntryFree(p
ab70: 4f 6c 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Old);.  }.}../*.
ab80: 2a 2a 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f  ** xUpdate metho
ab90: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
aba0: 20 7a 69 70 66 69 6c 65 55 70 64 61 74 65 28 0a   zipfileUpdate(.
abb0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
abc0: 70 56 74 61 62 2c 20 0a 20 20 69 6e 74 20 6e 56  pVtab, .  int nV
abd0: 61 6c 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  al, .  sqlite3_v
abe0: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 0a 20  alue **apVal, . 
abf0: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
ac00: 52 6f 77 69 64 0a 29 7b 0a 20 20 5a 69 70 66 69  Rowid.){.  Zipfi
ac10: 6c 65 54 61 62 20 2a 70 54 61 62 20 3d 20 28 5a  leTab *pTab = (Z
ac20: 69 70 66 69 6c 65 54 61 62 2a 29 70 56 74 61 62  ipfileTab*)pVtab
ac30: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
ac40: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
ac50: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
ac60: 64 65 20 2a 2f 0a 20 20 5a 69 70 66 69 6c 65 45  de */.  ZipfileE
ac70: 6e 74 72 79 20 2a 70 4e 65 77 20 3d 20 30 3b 20  ntry *pNew = 0; 
ac80: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 69          /* New i
ac90: 6e 2d 6d 65 6d 6f 72 79 20 43 44 53 20 65 6e 74  n-memory CDS ent
aca0: 72 79 20 2a 2f 0a 0a 20 20 75 33 32 20 6d 6f 64  ry */..  u32 mod
acb0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
acc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 65           /* Mode
acd0: 20 66 6f 72 20 6e 65 77 20 65 6e 74 72 79 20 2a   for new entry *
ace0: 2f 0a 20 20 75 33 32 20 6d 54 69 6d 65 20 3d 20  /.  u32 mTime = 
acf0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
ad00: 20 20 20 20 2f 2a 20 4d 6f 64 69 66 69 63 61 74      /* Modificat
ad10: 69 6f 6e 20 74 69 6d 65 20 66 6f 72 20 6e 65 77  ion time for new
ad20: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 36 34 20   entry */.  i64 
ad30: 73 7a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sz = 0;         
ad40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
ad50: 6e 63 6f 6d 70 72 65 73 73 65 64 20 73 69 7a 65  ncompressed size
ad60: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
ad70: 20 2a 7a 50 61 74 68 20 3d 20 30 3b 20 20 20 20   *zPath = 0;    
ad80: 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 66 6f        /* Path fo
ad90: 72 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20  r new entry */. 
ada0: 20 69 6e 74 20 6e 50 61 74 68 20 3d 20 30 3b 20   int nPath = 0; 
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adc0: 20 2f 2a 20 73 74 72 6c 65 6e 28 7a 50 61 74 68   /* strlen(zPath
add0: 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  ) */.  const u8 
ade0: 2a 70 44 61 74 61 20 3d 20 30 3b 20 20 20 20 20  *pData = 0;     
adf0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
ae00: 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74  r to buffer cont
ae10: 61 69 6e 69 6e 67 20 63 6f 6e 74 65 6e 74 20 2a  aining content *
ae20: 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 20 3d 20  /.  int nData = 
ae30: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
ae40: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70      /* Size of p
ae50: 44 61 74 61 20 62 75 66 66 65 72 20 69 6e 20 62  Data buffer in b
ae60: 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  ytes */.  int iM
ae70: 65 74 68 6f 64 20 3d 20 30 3b 20 20 20 20 20 20  ethod = 0;      
ae80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
ae90: 70 72 65 73 73 69 6f 6e 20 6d 65 74 68 6f 64 20  pression method 
aea0: 66 6f 72 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  for new entry */
aeb0: 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30  .  u8 *pFree = 0
aec0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aed0: 20 20 20 2f 2a 20 46 72 65 65 20 74 68 69 73 20     /* Free this 
aee0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 72 65 65  */.  char *zFree
aef0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
af00: 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 66 72 65       /* Also fre
af10: 65 20 74 68 69 73 20 2a 2f 0a 20 20 5a 69 70 66  e this */.  Zipf
af20: 69 6c 65 45 6e 74 72 79 20 2a 70 4f 6c 64 20 3d  ileEntry *pOld =
af30: 20 30 3b 0a 20 20 5a 69 70 66 69 6c 65 45 6e 74   0;.  ZipfileEnt
af40: 72 79 20 2a 70 4f 6c 64 32 20 3d 20 30 3b 0a 20  ry *pOld2 = 0;. 
af50: 20 69 6e 74 20 62 55 70 64 61 74 65 20 3d 20 30   int bUpdate = 0
af60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
af70: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 6e 20   /* True for an 
af80: 75 70 64 61 74 65 20 74 68 61 74 20 6d 6f 64 69  update that modi
af90: 66 69 65 73 20 22 6e 61 6d 65 22 20 2a 2f 0a 20  fies "name" */. 
afa0: 20 69 6e 74 20 62 49 73 44 69 72 20 3d 20 30 3b   int bIsDir = 0;
afb0: 0a 20 20 75 33 32 20 69 43 72 63 33 32 20 3d 20  .  u32 iCrc32 = 
afc0: 30 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  0;..  if( pTab->
afd0: 70 57 72 69 74 65 46 64 3d 3d 30 20 29 7b 0a 20  pWriteFd==0 ){. 
afe0: 20 20 20 72 63 20 3d 20 7a 69 70 66 69 6c 65 42     rc = zipfileB
aff0: 65 67 69 6e 28 70 56 74 61 62 29 3b 0a 20 20 20  egin(pVtab);.   
b000: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b010: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
b020: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
b030: 73 20 69 73 20 61 20 44 45 4c 45 54 45 20 6f 72  s is a DELETE or
b040: 20 55 50 44 41 54 45 2c 20 66 69 6e 64 20 74 68   UPDATE, find th
b050: 65 20 61 72 63 68 69 76 65 20 65 6e 74 72 79 20  e archive entry 
b060: 74 6f 20 64 65 6c 65 74 65 2e 20 2a 2f 0a 20 20  to delete. */.  
b070: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
b080: 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 30 5d 29  e_type(apVal[0])
b090: 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b  !=SQLITE_NULL ){
b0a0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
b0b0: 2a 7a 44 65 6c 65 74 65 20 3d 20 28 63 6f 6e 73  *zDelete = (cons
b0c0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
b0d0: 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
b0e0: 5b 30 5d 29 3b 0a 20 20 20 20 69 6e 74 20 6e 44  [0]);.    int nD
b0f0: 65 6c 65 74 65 20 3d 20 28 69 6e 74 29 73 74 72  elete = (int)str
b100: 6c 65 6e 28 7a 44 65 6c 65 74 65 29 3b 0a 20 20  len(zDelete);.  
b110: 20 20 69 66 28 20 6e 56 61 6c 3e 31 20 29 7b 0a    if( nVal>1 ){.
b120: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
b130: 20 2a 7a 55 70 64 61 74 65 20 3d 20 28 63 6f 6e   *zUpdate = (con
b140: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
b150: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
b160: 6c 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  l[1]);.      if(
b170: 20 7a 55 70 64 61 74 65 20 26 26 20 7a 69 70 66   zUpdate && zipf
b180: 69 6c 65 43 6f 6d 70 61 72 65 50 61 74 68 28 7a  ileComparePath(z
b190: 55 70 64 61 74 65 2c 20 7a 44 65 6c 65 74 65 2c  Update, zDelete,
b1a0: 20 6e 44 65 6c 65 74 65 29 21 3d 30 20 29 7b 0a   nDelete)!=0 ){.
b1b0: 20 20 20 20 20 20 20 20 62 55 70 64 61 74 65 20          bUpdate 
b1c0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
b1d0: 20 7d 0a 20 20 20 20 66 6f 72 28 70 4f 6c 64 3d   }.    for(pOld=
b1e0: 70 54 61 62 2d 3e 70 46 69 72 73 74 45 6e 74 72  pTab->pFirstEntr
b1f0: 79 3b 20 31 3b 20 70 4f 6c 64 3d 70 4f 6c 64 2d  y; 1; pOld=pOld-
b200: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
b210: 66 28 20 7a 69 70 66 69 6c 65 43 6f 6d 70 61 72  f( zipfileCompar
b220: 65 50 61 74 68 28 70 4f 6c 64 2d 3e 63 64 73 2e  ePath(pOld->cds.
b230: 7a 46 69 6c 65 2c 20 7a 44 65 6c 65 74 65 2c 20  zFile, zDelete, 
b240: 6e 44 65 6c 65 74 65 29 3d 3d 30 20 29 7b 0a 20  nDelete)==0 ){. 
b250: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b260: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
b270: 72 74 28 20 70 4f 6c 64 2d 3e 70 4e 65 78 74 20  rt( pOld->pNext 
b280: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
b290: 69 66 28 20 6e 56 61 6c 3e 31 20 29 7b 0a 20 20  if( nVal>1 ){.  
b2a0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
b2b0: 22 73 7a 22 20 61 6e 64 20 22 72 61 77 64 61 74  "sz" and "rawdat
b2c0: 61 22 20 61 72 65 20 62 6f 74 68 20 4e 55 4c 4c  a" are both NULL
b2d0: 3a 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  : */.    if( sql
b2e0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
b2f0: 61 70 56 61 6c 5b 35 5d 29 21 3d 53 51 4c 49 54  apVal[5])!=SQLIT
b300: 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  E_NULL ){.      
b310: 7a 69 70 66 69 6c 65 54 61 62 6c 65 45 72 72 28  zipfileTableErr(
b320: 70 54 61 62 2c 20 22 73 7a 20 6d 75 73 74 20 62  pTab, "sz must b
b330: 65 20 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20  e NULL");.      
b340: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
b350: 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20  TRAINT;.    }.  
b360: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
b370: 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 36  lue_type(apVal[6
b380: 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])!=SQLITE_NULL 
b390: 29 7b 0a 20 20 20 20 20 20 7a 69 70 66 69 6c 65  ){.      zipfile
b3a0: 54 61 62 6c 65 45 72 72 28 70 54 61 62 2c 20 22  TableErr(pTab, "
b3b0: 72 61 77 64 61 74 61 20 6d 75 73 74 20 62 65 20  rawdata must be 
b3c0: 4e 55 4c 4c 22 29 3b 20 0a 20 20 20 20 20 20 72  NULL"); .      r
b3d0: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
b3e0: 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  RAINT;.    }..  
b3f0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b400: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
b410: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
b420: 79 70 65 28 61 70 56 61 6c 5b 37 5d 29 3d 3d 53  ype(apVal[7])==S
b430: 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20  QLITE_NULL ){.  
b440: 20 20 20 20 20 20 2f 2a 20 64 61 74 61 3d 4e 55        /* data=NU
b450: 4c 4c 2e 20 41 20 64 69 72 65 63 74 6f 72 79 20  LL. A directory 
b460: 2a 2f 0a 20 20 20 20 20 20 20 20 62 49 73 44 69  */.        bIsDi
b470: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  r = 1;.      }el
b480: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56  se{.        /* V
b490: 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 20 66  alue specified f
b4a0: 6f 72 20 22 64 61 74 61 22 2c 20 61 6e 64 20 70  or "data", and p
b4b0: 6f 73 73 69 62 6c 79 20 22 6d 65 74 68 6f 64 22  ossibly "method"
b4c0: 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 0a 20  . This must be. 
b4d0: 20 20 20 20 20 20 20 2a 2a 20 61 20 72 65 67 75         ** a regu
b4e0: 6c 61 72 20 66 69 6c 65 20 6f 72 20 61 20 73 79  lar file or a sy
b4f0: 6d 6c 69 6e 6b 2e 20 2a 2f 0a 20 20 20 20 20 20  mlink. */.      
b500: 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e 20    const u8 *aIn 
b510: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
b520: 62 6c 6f 62 28 61 70 56 61 6c 5b 37 5d 29 3b 0a  blob(apVal[7]);.
b530: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 49 6e 20          int nIn 
b540: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
b550: 62 79 74 65 73 28 61 70 56 61 6c 5b 37 5d 29 3b  bytes(apVal[7]);
b560: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 41 75  .        int bAu
b570: 74 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  to = sqlite3_val
b580: 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 38 5d  ue_type(apVal[8]
b590: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a  )==SQLITE_NULL;.
b5a0: 0a 20 20 20 20 20 20 20 20 69 4d 65 74 68 6f 64  .        iMethod
b5b0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
b5c0: 5f 69 6e 74 28 61 70 56 61 6c 5b 38 5d 29 3b 0a  _int(apVal[8]);.
b5d0: 20 20 20 20 20 20 20 20 73 7a 20 3d 20 6e 49 6e          sz = nIn
b5e0: 3b 0a 20 20 20 20 20 20 20 20 70 44 61 74 61 20  ;.        pData 
b5f0: 3d 20 61 49 6e 3b 0a 20 20 20 20 20 20 20 20 6e  = aIn;.        n
b600: 44 61 74 61 20 3d 20 6e 49 6e 3b 0a 20 20 20 20  Data = nIn;.    
b610: 20 20 20 20 69 66 28 20 69 4d 65 74 68 6f 64 21      if( iMethod!
b620: 3d 30 20 26 26 20 69 4d 65 74 68 6f 64 21 3d 38  =0 && iMethod!=8
b630: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 69   ){.          zi
b640: 70 66 69 6c 65 54 61 62 6c 65 45 72 72 28 70 54  pfileTableErr(pT
b650: 61 62 2c 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6d  ab, "unknown com
b660: 70 72 65 73 73 69 6f 6e 20 6d 65 74 68 6f 64 3a  pression method:
b670: 20 25 64 22 2c 20 69 4d 65 74 68 6f 64 29 3b 0a   %d", iMethod);.
b680: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
b690: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b6a0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
b6b0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 62  .          if( b
b6c0: 41 75 74 6f 20 7c 7c 20 69 4d 65 74 68 6f 64 20  Auto || iMethod 
b6d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
b6e0: 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 20 20 20  nt nCmp;.       
b6f0: 20 20 20 20 20 72 63 20 3d 20 7a 69 70 66 69 6c       rc = zipfil
b700: 65 44 65 66 6c 61 74 65 28 61 49 6e 2c 20 6e 49  eDeflate(aIn, nI
b710: 6e 2c 20 26 70 46 72 65 65 2c 20 26 6e 43 6d 70  n, &pFree, &nCmp
b720: 2c 20 26 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45  , &pTab->base.zE
b730: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
b740: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
b750: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
b760: 20 20 20 20 20 20 20 69 66 28 20 69 4d 65 74 68         if( iMeth
b770: 6f 64 20 7c 7c 20 6e 43 6d 70 3c 6e 49 6e 20 29  od || nCmp<nIn )
b780: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b790: 20 20 69 4d 65 74 68 6f 64 20 3d 20 38 3b 0a 20    iMethod = 8;. 
b7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b7b0: 44 61 74 61 20 3d 20 70 46 72 65 65 3b 0a 20 20  Data = pFree;.  
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 44                nD
b7d0: 61 74 61 20 3d 20 6e 43 6d 70 3b 0a 20 20 20 20  ata = nCmp;.    
b7e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b7f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b800: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b810: 69 43 72 63 33 32 20 3d 20 63 72 63 33 32 28 30  iCrc32 = crc32(0
b820: 2c 20 61 49 6e 2c 20 6e 49 6e 29 3b 0a 20 20 20  , aIn, nIn);.   
b830: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b840: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
b850: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b860: 20 20 20 20 20 72 63 20 3d 20 7a 69 70 66 69 6c       rc = zipfil
b870: 65 47 65 74 4d 6f 64 65 28 61 70 56 61 6c 5b 33  eGetMode(apVal[3
b880: 5d 2c 20 62 49 73 44 69 72 2c 20 26 6d 6f 64 65  ], bIsDir, &mode
b890: 2c 20 26 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45  , &pTab->base.zE
b8a0: 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 0a 20  rrMsg);.    }.. 
b8b0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b8c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 7a 50  E_OK ){.      zP
b8d0: 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ath = (const cha
b8e0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
b8f0: 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b  _text(apVal[2]);
b900: 0a 20 20 20 20 20 20 6e 50 61 74 68 20 3d 20 28  .      nPath = (
b910: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 50 61 74 68  int)strlen(zPath
b920: 29 3b 0a 20 20 20 20 20 20 6d 54 69 6d 65 20 3d  );.      mTime =
b930: 20 7a 69 70 66 69 6c 65 47 65 74 54 69 6d 65 28   zipfileGetTime(
b940: 61 70 56 61 6c 5b 34 5d 29 3b 0a 20 20 20 20 7d  apVal[4]);.    }
b950: 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
b960: 4c 49 54 45 5f 4f 4b 20 26 26 20 62 49 73 44 69  LITE_OK && bIsDi
b970: 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f  r ){.      /* Fo
b980: 72 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 63  r a directory, c
b990: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c 61  heck that the la
b9a0: 73 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  st character in 
b9b0: 74 68 65 20 70 61 74 68 20 69 73 20 61 0a 20 20  the path is a.  
b9c0: 20 20 20 20 2a 2a 20 27 2f 27 2e 20 54 68 69 73      ** '/'. This
b9d0: 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 72   appears to be r
b9e0: 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
b9f0: 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 69  atibility with i
ba00: 6e 66 6f 2d 7a 69 70 0a 20 20 20 20 20 20 2a 2a  nfo-zip.      **
ba10: 20 28 74 68 65 20 75 6e 7a 69 70 20 63 6f 6d 6d   (the unzip comm
ba20: 61 6e 64 20 6f 6e 20 75 6e 69 78 29 2e 20 49 74  and on unix). It
ba30: 20 64 6f 65 73 20 6e 6f 74 20 63 72 65 61 74 65   does not create
ba40: 20 64 69 72 65 63 74 6f 72 69 65 73 0a 20 20 20   directories.   
ba50: 20 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e     ** otherwise.
ba60: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a    */.      if( z
ba70: 50 61 74 68 5b 6e 50 61 74 68 2d 31 5d 21 3d 27  Path[nPath-1]!='
ba80: 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46  /' ){.        zF
ba90: 72 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ree = sqlite3_mp
baa0: 72 69 6e 74 66 28 22 25 73 2f 22 2c 20 7a 50 61  rintf("%s/", zPa
bab0: 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  th);.        if(
bac0: 20 7a 46 72 65 65 3d 3d 30 20 29 7b 20 72 63 20   zFree==0 ){ rc 
bad0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 20  = SQLITE_NOMEM; 
bae0: 7d 0a 20 20 20 20 20 20 20 20 7a 50 61 74 68 20  }.        zPath 
baf0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a  = (const char*)z
bb00: 46 72 65 65 3b 0a 20 20 20 20 20 20 20 20 6e 50  Free;.        nP
bb10: 61 74 68 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ath++;.      }. 
bb20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
bb30: 63 6b 20 74 68 61 74 20 77 65 27 72 65 20 6e 6f  ck that we're no
bb40: 74 20 69 6e 73 65 72 74 69 6e 67 20 61 20 64 75  t inserting a du
bb50: 70 6c 69 63 61 74 65 20 65 6e 74 72 79 20 2d 4f  plicate entry -O
bb60: 52 2d 20 75 70 64 61 74 69 6e 67 20 61 6e 0a 20  R- updating an. 
bb70: 20 20 20 2a 2a 20 65 6e 74 72 79 20 77 69 74 68     ** entry with
bb80: 20 61 20 70 61 74 68 2c 20 74 68 65 72 65 62 79   a path, thereby
bb90: 20 6d 61 6b 69 6e 67 20 69 74 20 69 6e 74 6f 20   making it into 
bba0: 61 20 64 75 70 6c 69 63 61 74 65 2e 20 2a 2f 0a  a duplicate. */.
bbb0: 20 20 20 20 69 66 28 20 28 70 4f 6c 64 3d 3d 30      if( (pOld==0
bbc0: 20 7c 7c 20 62 55 70 64 61 74 65 29 20 26 26 20   || bUpdate) && 
bbd0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
bbe0: 0a 20 20 20 20 20 20 5a 69 70 66 69 6c 65 45 6e  .      ZipfileEn
bbf0: 74 72 79 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f  try *p;.      fo
bc00: 72 28 70 3d 70 54 61 62 2d 3e 70 46 69 72 73 74  r(p=pTab->pFirst
bc10: 45 6e 74 72 79 3b 20 70 3b 20 70 3d 70 2d 3e 70  Entry; p; p=p->p
bc20: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Next){.        i
bc30: 66 28 20 7a 69 70 66 69 6c 65 43 6f 6d 70 61 72  f( zipfileCompar
bc40: 65 50 61 74 68 28 70 2d 3e 63 64 73 2e 7a 46 69  ePath(p->cds.zFi
bc50: 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 50 61 74 68  le, zPath, nPath
bc60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
bc70: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
bc80: 33 5f 76 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69  3_vtab_on_confli
bc90: 63 74 28 70 54 61 62 2d 3e 64 62 29 20 29 7b 0a  ct(pTab->db) ){.
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
bcb0: 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 3a 20   SQLITE_IGNORE: 
bcc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
bcd0: 67 6f 74 6f 20 7a 69 70 66 69 6c 65 5f 75 70 64  goto zipfile_upd
bce0: 61 74 65 5f 64 6f 6e 65 3b 0a 20 20 20 20 20 20  ate_done;.      
bcf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bd00: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bd10: 52 45 50 4c 41 43 45 3a 20 7b 0a 20 20 20 20 20  REPLACE: {.     
bd20: 20 20 20 20 20 20 20 20 20 70 4f 6c 64 32 20 3d           pOld2 =
bd30: 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   p;.            
bd40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
bd50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
bd60: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 7a 69 70 66              zipf
bd80: 69 6c 65 54 61 62 6c 65 45 72 72 28 70 54 61 62  ileTableErr(pTab
bd90: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 6e 61 6d  , "duplicate nam
bda0: 65 3a 20 5c 22 25 73 5c 22 22 2c 20 7a 50 61 74  e: \"%s\"", zPat
bdb0: 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  h);.            
bdc0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
bdd0: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20  NSTRAINT;.      
bde0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bdf0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
be00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
be10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
be20: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
be30: 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
be40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
be50: 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
be60: 6e 65 77 20 43 44 53 20 72 65 63 6f 72 64 2e 20  new CDS record. 
be70: 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  */.      pNew = 
be80: 7a 69 70 66 69 6c 65 4e 65 77 45 6e 74 72 79 28  zipfileNewEntry(
be90: 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 69 66  zPath);.      if
bea0: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
beb0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
bec0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
bed0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  lse{.        pNe
bee0: 77 2d 3e 63 64 73 2e 69 56 65 72 73 69 6f 6e 4d  w->cds.iVersionM
bef0: 61 64 65 42 79 20 3d 20 5a 49 50 46 49 4c 45 5f  adeBy = ZIPFILE_
bf00: 4e 45 57 45 4e 54 52 59 5f 4d 41 44 45 42 59 3b  NEWENTRY_MADEBY;
bf10: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 63  .        pNew->c
bf20: 64 73 2e 69 56 65 72 73 69 6f 6e 45 78 74 72 61  ds.iVersionExtra
bf30: 63 74 20 3d 20 5a 49 50 46 49 4c 45 5f 4e 45 57  ct = ZIPFILE_NEW
bf40: 45 4e 54 52 59 5f 52 45 51 55 49 52 45 44 3b 0a  ENTRY_REQUIRED;.
bf50: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 63 64          pNew->cd
bf60: 73 2e 66 6c 61 67 73 20 3d 20 5a 49 50 46 49 4c  s.flags = ZIPFIL
bf70: 45 5f 4e 45 57 45 4e 54 52 59 5f 46 4c 41 47 53  E_NEWENTRY_FLAGS
bf80: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
bf90: 63 64 73 2e 69 43 6f 6d 70 72 65 73 73 69 6f 6e  cds.iCompression
bfa0: 20 3d 20 28 75 31 36 29 69 4d 65 74 68 6f 64 3b   = (u16)iMethod;
bfb0: 0a 20 20 20 20 20 20 20 20 7a 69 70 66 69 6c 65  .        zipfile
bfc0: 4d 74 69 6d 65 54 6f 44 6f 73 28 26 70 4e 65 77  MtimeToDos(&pNew
bfd0: 2d 3e 63 64 73 2c 20 6d 54 69 6d 65 29 3b 0a 20  ->cds, mTime);. 
bfe0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 63 64 73         pNew->cds
bff0: 2e 63 72 63 33 32 20 3d 20 69 43 72 63 33 32 3b  .crc32 = iCrc32;
c000: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 63  .        pNew->c
c010: 64 73 2e 73 7a 43 6f 6d 70 72 65 73 73 65 64 20  ds.szCompressed 
c020: 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 20  = nData;.       
c030: 20 70 4e 65 77 2d 3e 63 64 73 2e 73 7a 55 6e 63   pNew->cds.szUnc
c040: 6f 6d 70 72 65 73 73 65 64 20 3d 20 28 75 33 32  ompressed = (u32
c050: 29 73 7a 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  )sz;.        pNe
c060: 77 2d 3e 63 64 73 2e 69 45 78 74 65 72 6e 61 6c  w->cds.iExternal
c070: 41 74 74 72 20 3d 20 28 6d 6f 64 65 3c 3c 31 36  Attr = (mode<<16
c080: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
c090: 3e 63 64 73 2e 69 4f 66 66 73 65 74 20 3d 20 28  >cds.iOffset = (
c0a0: 75 33 32 29 70 54 61 62 2d 3e 73 7a 43 75 72 72  u32)pTab->szCurr
c0b0: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ent;.        pNe
c0c0: 77 2d 3e 63 64 73 2e 6e 46 69 6c 65 20 3d 20 28  w->cds.nFile = (
c0d0: 75 31 36 29 6e 50 61 74 68 3b 0a 20 20 20 20 20  u16)nPath;.     
c0e0: 20 20 20 70 4e 65 77 2d 3e 6d 55 6e 69 78 54 69     pNew->mUnixTi
c0f0: 6d 65 20 3d 20 28 75 33 32 29 6d 54 69 6d 65 3b  me = (u32)mTime;
c100: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 7a 69  .        rc = zi
c110: 70 66 69 6c 65 41 70 70 65 6e 64 45 6e 74 72 79  pfileAppendEntry
c120: 28 70 54 61 62 2c 20 70 4e 65 77 2c 20 70 44 61  (pTab, pNew, pDa
c130: 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20 20  ta, nData);.    
c140: 20 20 20 20 7a 69 70 66 69 6c 65 41 64 64 45 6e      zipfileAddEn
c150: 74 72 79 28 70 54 61 62 2c 20 70 4f 6c 64 2c 20  try(pTab, pOld, 
c160: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
c170: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
c180: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
c190: 20 28 70 4f 6c 64 20 7c 7c 20 70 4f 6c 64 32 29   (pOld || pOld2)
c1a0: 20 29 7b 0a 20 20 20 20 5a 69 70 66 69 6c 65 43   ){.    ZipfileC
c1b0: 73 72 20 2a 70 43 73 72 3b 0a 20 20 20 20 66 6f  sr *pCsr;.    fo
c1c0: 72 28 70 43 73 72 3d 70 54 61 62 2d 3e 70 43 73  r(pCsr=pTab->pCs
c1d0: 72 4c 69 73 74 3b 20 70 43 73 72 3b 20 70 43 73  rList; pCsr; pCs
c1e0: 72 3d 70 43 73 72 2d 3e 70 43 73 72 4e 65 78 74  r=pCsr->pCsrNext
c1f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 73  ){.      if( pCs
c200: 72 2d 3e 70 43 75 72 72 65 6e 74 20 26 26 20 28  r->pCurrent && (
c210: 70 43 73 72 2d 3e 70 43 75 72 72 65 6e 74 3d 3d  pCsr->pCurrent==
c220: 70 4f 6c 64 20 7c 7c 20 70 43 73 72 2d 3e 70 43  pOld || pCsr->pC
c230: 75 72 72 65 6e 74 3d 3d 70 4f 6c 64 32 29 20 29  urrent==pOld2) )
c240: 7b 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e  {.        pCsr->
c250: 70 43 75 72 72 65 6e 74 20 3d 20 70 43 73 72 2d  pCurrent = pCsr-
c260: 3e 70 43 75 72 72 65 6e 74 2d 3e 70 4e 65 78 74  >pCurrent->pNext
c270: 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e  ;.        pCsr->
c280: 62 4e 6f 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20  bNoop = 1;.     
c290: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a 69   }.    }..    zi
c2a0: 70 66 69 6c 65 52 65 6d 6f 76 65 45 6e 74 72 79  pfileRemoveEntry
c2b0: 46 72 6f 6d 4c 69 73 74 28 70 54 61 62 2c 20 70  FromList(pTab, p
c2c0: 4f 6c 64 29 3b 0a 20 20 20 20 7a 69 70 66 69 6c  Old);.    zipfil
c2d0: 65 52 65 6d 6f 76 65 45 6e 74 72 79 46 72 6f 6d  eRemoveEntryFrom
c2e0: 4c 69 73 74 28 70 54 61 62 2c 20 70 4f 6c 64 32  List(pTab, pOld2
c2f0: 29 3b 0a 20 20 7d 0a 0a 7a 69 70 66 69 6c 65 5f  );.  }..zipfile_
c300: 75 70 64 61 74 65 5f 64 6f 6e 65 3a 0a 20 20 73  update_done:.  s
c310: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 72 65  qlite3_free(pFre
c320: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
c330: 65 65 28 7a 46 72 65 65 29 3b 0a 20 20 72 65 74  ee(zFree);.  ret
c340: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
c350: 63 20 69 6e 74 20 7a 69 70 66 69 6c 65 53 65 72  c int zipfileSer
c360: 69 61 6c 69 7a 65 45 4f 43 44 28 5a 69 70 66 69  ializeEOCD(Zipfi
c370: 6c 65 45 4f 43 44 20 2a 70 2c 20 75 38 20 2a 61  leEOCD *p, u8 *a
c380: 42 75 66 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20  Buf){.  u8 *a = 
c390: 61 42 75 66 3b 0a 20 20 7a 69 70 66 69 6c 65 57  aBuf;.  zipfileW
c3a0: 72 69 74 65 33 32 28 61 2c 20 5a 49 50 46 49 4c  rite32(a, ZIPFIL
c3b0: 45 5f 53 49 47 4e 41 54 55 52 45 5f 45 4f 43 44  E_SIGNATURE_EOCD
c3c0: 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72 69 74  );.  zipfileWrit
c3d0: 65 31 36 28 61 2c 20 70 2d 3e 69 44 69 73 6b 29  e16(a, p->iDisk)
c3e0: 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65  ;.  zipfileWrite
c3f0: 31 36 28 61 2c 20 70 2d 3e 69 46 69 72 73 74 44  16(a, p->iFirstD
c400: 69 73 6b 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57  isk);.  zipfileW
c410: 72 69 74 65 31 36 28 61 2c 20 70 2d 3e 6e 45 6e  rite16(a, p->nEn
c420: 74 72 79 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57  try);.  zipfileW
c430: 72 69 74 65 31 36 28 61 2c 20 70 2d 3e 6e 45 6e  rite16(a, p->nEn
c440: 74 72 79 54 6f 74 61 6c 29 3b 0a 20 20 7a 69 70  tryTotal);.  zip
c450: 66 69 6c 65 57 72 69 74 65 33 32 28 61 2c 20 70  fileWrite32(a, p
c460: 2d 3e 6e 53 69 7a 65 29 3b 0a 20 20 7a 69 70 66  ->nSize);.  zipf
c470: 69 6c 65 57 72 69 74 65 33 32 28 61 2c 20 70 2d  ileWrite32(a, p-
c480: 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20 7a 69 70  >iOffset);.  zip
c490: 66 69 6c 65 57 72 69 74 65 31 36 28 61 2c 20 30  fileWrite16(a, 0
c4a0: 29 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  );        /* Siz
c4b0: 65 20 6f 66 20 74 72 61 69 6c 69 6e 67 20 63 6f  e of trailing co
c4c0: 6d 6d 65 6e 74 20 69 6e 20 62 79 74 65 73 2a 2f  mment in bytes*/
c4d0: 0a 0a 20 20 72 65 74 75 72 6e 20 61 2d 61 42 75  ..  return a-aBu
c4e0: 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  f;.}..static int
c4f0: 20 7a 69 70 66 69 6c 65 41 70 70 65 6e 64 45 4f   zipfileAppendEO
c500: 43 44 28 5a 69 70 66 69 6c 65 54 61 62 20 2a 70  CD(ZipfileTab *p
c510: 54 61 62 2c 20 5a 69 70 66 69 6c 65 45 4f 43 44  Tab, ZipfileEOCD
c520: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 42 75 66   *p){.  int nBuf
c530: 20 3d 20 7a 69 70 66 69 6c 65 53 65 72 69 61 6c   = zipfileSerial
c540: 69 7a 65 45 4f 43 44 28 70 2c 20 70 54 61 62 2d  izeEOCD(p, pTab-
c550: 3e 61 42 75 66 66 65 72 29 3b 0a 20 20 61 73 73  >aBuffer);.  ass
c560: 65 72 74 28 20 6e 42 75 66 3d 3d 5a 49 50 46 49  ert( nBuf==ZIPFI
c570: 4c 45 5f 45 4f 43 44 5f 46 49 58 45 44 5f 53 5a  LE_EOCD_FIXED_SZ
c580: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 69 70   );.  return zip
c590: 66 69 6c 65 41 70 70 65 6e 64 44 61 74 61 28 70  fileAppendData(p
c5a0: 54 61 62 2c 20 70 54 61 62 2d 3e 61 42 75 66 66  Tab, pTab->aBuff
c5b0: 65 72 2c 20 6e 42 75 66 29 3b 0a 7d 0a 0a 2f 2a  er, nBuf);.}../*
c5c0: 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 74 68  .** Serialize th
c5d0: 65 20 43 44 53 20 73 74 72 75 63 74 75 72 65 20  e CDS structure 
c5e0: 69 6e 74 6f 20 62 75 66 66 65 72 20 61 42 75 66  into buffer aBuf
c5f0: 5b 5d 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  []. Return the n
c600: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65  umber.** of byte
c610: 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 73 74  s written..*/.st
c620: 61 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c 65  atic int zipfile
c630: 53 65 72 69 61 6c 69 7a 65 43 44 53 28 5a 69 70  SerializeCDS(Zip
c640: 66 69 6c 65 45 6e 74 72 79 20 2a 70 45 6e 74 72  fileEntry *pEntr
c650: 79 2c 20 75 38 20 2a 61 42 75 66 29 7b 0a 20 20  y, u8 *aBuf){.  
c660: 75 38 20 2a 61 20 3d 20 61 42 75 66 3b 0a 20 20  u8 *a = aBuf;.  
c670: 5a 69 70 66 69 6c 65 43 44 53 20 2a 70 43 44 53  ZipfileCDS *pCDS
c680: 20 3d 20 26 70 45 6e 74 72 79 2d 3e 63 64 73 3b   = &pEntry->cds;
c690: 0a 0a 20 20 69 66 28 20 70 45 6e 74 72 79 2d 3e  ..  if( pEntry->
c6a0: 61 45 78 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20  aExtra==0 ){.   
c6b0: 20 70 43 44 53 2d 3e 6e 45 78 74 72 61 20 3d 20   pCDS->nExtra = 
c6c0: 39 3b 0a 20 20 7d 0a 0a 20 20 7a 69 70 66 69 6c  9;.  }..  zipfil
c6d0: 65 57 72 69 74 65 33 32 28 61 2c 20 5a 49 50 46  eWrite32(a, ZIPF
c6e0: 49 4c 45 5f 53 49 47 4e 41 54 55 52 45 5f 43 44  ILE_SIGNATURE_CD
c6f0: 53 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72 69  S);.  zipfileWri
c700: 74 65 31 36 28 61 2c 20 70 43 44 53 2d 3e 69 56  te16(a, pCDS->iV
c710: 65 72 73 69 6f 6e 4d 61 64 65 42 79 29 3b 0a 20  ersionMadeBy);. 
c720: 20 7a 69 70 66 69 6c 65 57 72 69 74 65 31 36 28   zipfileWrite16(
c730: 61 2c 20 70 43 44 53 2d 3e 69 56 65 72 73 69 6f  a, pCDS->iVersio
c740: 6e 45 78 74 72 61 63 74 29 3b 0a 20 20 7a 69 70  nExtract);.  zip
c750: 66 69 6c 65 57 72 69 74 65 31 36 28 61 2c 20 70  fileWrite16(a, p
c760: 43 44 53 2d 3e 66 6c 61 67 73 29 3b 0a 20 20 7a  CDS->flags);.  z
c770: 69 70 66 69 6c 65 57 72 69 74 65 31 36 28 61 2c  ipfileWrite16(a,
c780: 20 70 43 44 53 2d 3e 69 43 6f 6d 70 72 65 73 73   pCDS->iCompress
c790: 69 6f 6e 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57  ion);.  zipfileW
c7a0: 72 69 74 65 31 36 28 61 2c 20 70 43 44 53 2d 3e  rite16(a, pCDS->
c7b0: 6d 54 69 6d 65 29 3b 0a 20 20 7a 69 70 66 69 6c  mTime);.  zipfil
c7c0: 65 57 72 69 74 65 31 36 28 61 2c 20 70 43 44 53  eWrite16(a, pCDS
c7d0: 2d 3e 6d 44 61 74 65 29 3b 0a 20 20 7a 69 70 66  ->mDate);.  zipf
c7e0: 69 6c 65 57 72 69 74 65 33 32 28 61 2c 20 70 43  ileWrite32(a, pC
c7f0: 44 53 2d 3e 63 72 63 33 32 29 3b 0a 20 20 7a 69  DS->crc32);.  zi
c800: 70 66 69 6c 65 57 72 69 74 65 33 32 28 61 2c 20  pfileWrite32(a, 
c810: 70 43 44 53 2d 3e 73 7a 43 6f 6d 70 72 65 73 73  pCDS->szCompress
c820: 65 64 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72  ed);.  zipfileWr
c830: 69 74 65 33 32 28 61 2c 20 70 43 44 53 2d 3e 73  ite32(a, pCDS->s
c840: 7a 55 6e 63 6f 6d 70 72 65 73 73 65 64 29 3b 0a  zUncompressed);.
c850: 20 20 61 73 73 65 72 74 28 20 61 3d 3d 26 61 42    assert( a==&aB
c860: 75 66 5b 5a 49 50 46 49 4c 45 5f 43 44 53 5f 4e  uf[ZIPFILE_CDS_N
c870: 46 49 4c 45 5f 4f 46 46 5d 20 29 3b 0a 20 20 7a  FILE_OFF] );.  z
c880: 69 70 66 69 6c 65 57 72 69 74 65 31 36 28 61 2c  ipfileWrite16(a,
c890: 20 70 43 44 53 2d 3e 6e 46 69 6c 65 29 3b 0a 20   pCDS->nFile);. 
c8a0: 20 7a 69 70 66 69 6c 65 57 72 69 74 65 31 36 28   zipfileWrite16(
c8b0: 61 2c 20 70 43 44 53 2d 3e 6e 45 78 74 72 61 29  a, pCDS->nExtra)
c8c0: 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65  ;.  zipfileWrite
c8d0: 31 36 28 61 2c 20 70 43 44 53 2d 3e 6e 43 6f 6d  16(a, pCDS->nCom
c8e0: 6d 65 6e 74 29 3b 0a 20 20 7a 69 70 66 69 6c 65  ment);.  zipfile
c8f0: 57 72 69 74 65 31 36 28 61 2c 20 70 43 44 53 2d  Write16(a, pCDS-
c900: 3e 69 44 69 73 6b 53 74 61 72 74 29 3b 0a 20 20  >iDiskStart);.  
c910: 7a 69 70 66 69 6c 65 57 72 69 74 65 31 36 28 61  zipfileWrite16(a
c920: 2c 20 70 43 44 53 2d 3e 69 49 6e 74 65 72 6e 61  , pCDS->iInterna
c930: 6c 41 74 74 72 29 3b 0a 20 20 7a 69 70 66 69 6c  lAttr);.  zipfil
c940: 65 57 72 69 74 65 33 32 28 61 2c 20 70 43 44 53  eWrite32(a, pCDS
c950: 2d 3e 69 45 78 74 65 72 6e 61 6c 41 74 74 72 29  ->iExternalAttr)
c960: 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65  ;.  zipfileWrite
c970: 33 32 28 61 2c 20 70 43 44 53 2d 3e 69 4f 66 66  32(a, pCDS->iOff
c980: 73 65 74 29 3b 0a 0a 20 20 6d 65 6d 63 70 79 28  set);..  memcpy(
c990: 61 2c 20 70 43 44 53 2d 3e 7a 46 69 6c 65 2c 20  a, pCDS->zFile, 
c9a0: 70 43 44 53 2d 3e 6e 46 69 6c 65 29 3b 0a 20 20  pCDS->nFile);.  
c9b0: 61 20 2b 3d 20 70 43 44 53 2d 3e 6e 46 69 6c 65  a += pCDS->nFile
c9c0: 3b 0a 0a 20 20 69 66 28 20 70 45 6e 74 72 79 2d  ;..  if( pEntry-
c9d0: 3e 61 45 78 74 72 61 20 29 7b 0a 20 20 20 20 69  >aExtra ){.    i
c9e0: 6e 74 20 6e 20 3d 20 28 69 6e 74 29 70 43 44 53  nt n = (int)pCDS
c9f0: 2d 3e 6e 45 78 74 72 61 20 2b 20 28 69 6e 74 29  ->nExtra + (int)
ca00: 70 43 44 53 2d 3e 6e 43 6f 6d 6d 65 6e 74 3b 0a  pCDS->nComment;.
ca10: 20 20 20 20 6d 65 6d 63 70 79 28 61 2c 20 70 45      memcpy(a, pE
ca20: 6e 74 72 79 2d 3e 61 45 78 74 72 61 2c 20 6e 29  ntry->aExtra, n)
ca30: 3b 0a 20 20 20 20 61 20 2b 3d 20 6e 3b 0a 20 20  ;.    a += n;.  
ca40: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
ca50: 74 28 20 70 43 44 53 2d 3e 6e 45 78 74 72 61 3d  t( pCDS->nExtra=
ca60: 3d 39 20 29 3b 0a 20 20 20 20 7a 69 70 66 69 6c  =9 );.    zipfil
ca70: 65 57 72 69 74 65 31 36 28 61 2c 20 5a 49 50 46  eWrite16(a, ZIPF
ca80: 49 4c 45 5f 45 58 54 52 41 5f 54 49 4d 45 53 54  ILE_EXTRA_TIMEST
ca90: 41 4d 50 29 3b 0a 20 20 20 20 7a 69 70 66 69 6c  AMP);.    zipfil
caa0: 65 57 72 69 74 65 31 36 28 61 2c 20 35 29 3b 0a  eWrite16(a, 5);.
cab0: 20 20 20 20 2a 61 2b 2b 20 3d 20 30 78 30 31 3b      *a++ = 0x01;
cac0: 0a 20 20 20 20 7a 69 70 66 69 6c 65 57 72 69 74  .    zipfileWrit
cad0: 65 33 32 28 61 2c 20 70 45 6e 74 72 79 2d 3e 6d  e32(a, pEntry->m
cae0: 55 6e 69 78 54 69 6d 65 29 3b 0a 20 20 7d 0a 0a  UnixTime);.  }..
caf0: 20 20 72 65 74 75 72 6e 20 61 2d 61 42 75 66 3b    return a-aBuf;
cb00: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .}..static int z
cb10: 69 70 66 69 6c 65 43 6f 6d 6d 69 74 28 73 71 6c  ipfileCommit(sql
cb20: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
cb30: 29 7b 0a 20 20 5a 69 70 66 69 6c 65 54 61 62 20  ){.  ZipfileTab 
cb40: 2a 70 54 61 62 20 3d 20 28 5a 69 70 66 69 6c 65  *pTab = (Zipfile
cb50: 54 61 62 2a 29 70 56 74 61 62 3b 0a 20 20 69 6e  Tab*)pVtab;.  in
cb60: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
cb70: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 57  ;.  if( pTab->pW
cb80: 72 69 74 65 46 64 20 29 7b 0a 20 20 20 20 69 36  riteFd ){.    i6
cb90: 34 20 69 4f 66 66 73 65 74 20 3d 20 70 54 61 62  4 iOffset = pTab
cba0: 2d 3e 73 7a 43 75 72 72 65 6e 74 3b 0a 20 20 20  ->szCurrent;.   
cbb0: 20 5a 69 70 66 69 6c 65 45 6e 74 72 79 20 2a 70   ZipfileEntry *p
cbc0: 3b 0a 20 20 20 20 5a 69 70 66 69 6c 65 45 4f 43  ;.    ZipfileEOC
cbd0: 44 20 65 6f 63 64 3b 0a 20 20 20 20 69 6e 74 20  D eocd;.    int 
cbe0: 6e 45 6e 74 72 79 20 3d 20 30 3b 0a 0a 20 20 20  nEntry = 0;..   
cbf0: 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 61 6c   /* Write out al
cc00: 6c 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 20  l entries */.   
cc10: 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70 46 69   for(p=pTab->pFi
cc20: 72 73 74 45 6e 74 72 79 3b 20 72 63 3d 3d 53 51  rstEntry; rc==SQ
cc30: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 3b 20 70 3d  LITE_OK && p; p=
cc40: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  p->pNext){.     
cc50: 20 69 6e 74 20 6e 20 3d 20 7a 69 70 66 69 6c 65   int n = zipfile
cc60: 53 65 72 69 61 6c 69 7a 65 43 44 53 28 70 2c 20  SerializeCDS(p, 
cc70: 70 54 61 62 2d 3e 61 42 75 66 66 65 72 29 3b 0a  pTab->aBuffer);.
cc80: 20 20 20 20 20 20 72 63 20 3d 20 7a 69 70 66 69        rc = zipfi
cc90: 6c 65 41 70 70 65 6e 64 44 61 74 61 28 70 54 61  leAppendData(pTa
cca0: 62 2c 20 70 54 61 62 2d 3e 61 42 75 66 66 65 72  b, pTab->aBuffer
ccb0: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 6e 45 6e 74  , n);.      nEnt
ccc0: 72 79 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ry++;.    }..   
ccd0: 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68   /* Write out th
cce0: 65 20 45 4f 43 44 20 72 65 63 6f 72 64 20 2a 2f  e EOCD record */
ccf0: 0a 20 20 20 20 65 6f 63 64 2e 69 44 69 73 6b 20  .    eocd.iDisk 
cd00: 3d 20 30 3b 0a 20 20 20 20 65 6f 63 64 2e 69 46  = 0;.    eocd.iF
cd10: 69 72 73 74 44 69 73 6b 20 3d 20 30 3b 0a 20 20  irstDisk = 0;.  
cd20: 20 20 65 6f 63 64 2e 6e 45 6e 74 72 79 20 3d 20    eocd.nEntry = 
cd30: 28 75 31 36 29 6e 45 6e 74 72 79 3b 0a 20 20 20  (u16)nEntry;.   
cd40: 20 65 6f 63 64 2e 6e 45 6e 74 72 79 54 6f 74 61   eocd.nEntryTota
cd50: 6c 20 3d 20 28 75 31 36 29 6e 45 6e 74 72 79 3b  l = (u16)nEntry;
cd60: 0a 20 20 20 20 65 6f 63 64 2e 6e 53 69 7a 65 20  .    eocd.nSize 
cd70: 3d 20 28 75 33 32 29 28 70 54 61 62 2d 3e 73 7a  = (u32)(pTab->sz
cd80: 43 75 72 72 65 6e 74 20 2d 20 69 4f 66 66 73 65  Current - iOffse
cd90: 74 29 3b 0a 20 20 20 20 65 6f 63 64 2e 69 4f 66  t);.    eocd.iOf
cda0: 66 73 65 74 20 3d 20 28 75 33 32 29 69 4f 66 66  fset = (u32)iOff
cdb0: 73 65 74 3b 0a 20 20 20 20 72 63 20 3d 20 7a 69  set;.    rc = zi
cdc0: 70 66 69 6c 65 41 70 70 65 6e 64 45 4f 43 44 28  pfileAppendEOCD(
cdd0: 70 54 61 62 2c 20 26 65 6f 63 64 29 3b 0a 0a 20  pTab, &eocd);.. 
cde0: 20 20 20 7a 69 70 66 69 6c 65 43 6c 65 61 6e 75     zipfileCleanu
cdf0: 70 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 54 61  pTransaction(pTa
ce00: 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  b);.  }.  return
ce10: 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
ce20: 6e 74 20 7a 69 70 66 69 6c 65 52 6f 6c 6c 62 61  nt zipfileRollba
ce30: 63 6b 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  ck(sqlite3_vtab 
ce40: 2a 70 56 74 61 62 29 7b 0a 20 20 72 65 74 75 72  *pVtab){.  retur
ce50: 6e 20 7a 69 70 66 69 6c 65 43 6f 6d 6d 69 74 28  n zipfileCommit(
ce60: 70 56 74 61 62 29 3b 0a 7d 0a 0a 73 74 61 74 69  pVtab);.}..stati
ce70: 63 20 5a 69 70 66 69 6c 65 43 73 72 20 2a 7a 69  c ZipfileCsr *zi
ce80: 70 66 69 6c 65 46 69 6e 64 43 75 72 73 6f 72 28  pfileFindCursor(
ce90: 5a 69 70 66 69 6c 65 54 61 62 20 2a 70 54 61 62  ZipfileTab *pTab
cea0: 2c 20 69 36 34 20 69 49 64 29 7b 0a 20 20 5a 69  , i64 iId){.  Zi
ceb0: 70 66 69 6c 65 43 73 72 20 2a 70 43 73 72 3b 0a  pfileCsr *pCsr;.
cec0: 20 20 66 6f 72 28 70 43 73 72 3d 70 54 61 62 2d    for(pCsr=pTab-
ced0: 3e 70 43 73 72 4c 69 73 74 3b 20 70 43 73 72 3b  >pCsrList; pCsr;
cee0: 20 70 43 73 72 3d 70 43 73 72 2d 3e 70 43 73 72   pCsr=pCsr->pCsr
cef0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 69  Next){.    if( i
cf00: 49 64 3d 3d 70 43 73 72 2d 3e 69 49 64 20 29 20  Id==pCsr->iId ) 
cf10: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
cf20: 75 72 6e 20 70 43 73 72 3b 0a 7d 0a 0a 73 74 61  urn pCsr;.}..sta
cf30: 74 69 63 20 76 6f 69 64 20 7a 69 70 66 69 6c 65  tic void zipfile
cf40: 46 75 6e 63 74 69 6f 6e 43 64 73 28 0a 20 20 73  FunctionCds(.  s
cf50: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
cf60: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
cf70: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
cf80: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
cf90: 20 5a 69 70 66 69 6c 65 43 73 72 20 2a 70 43 73   ZipfileCsr *pCs
cfa0: 72 3b 0a 20 20 5a 69 70 66 69 6c 65 54 61 62 20  r;.  ZipfileTab 
cfb0: 2a 70 54 61 62 20 3d 20 28 5a 69 70 66 69 6c 65  *pTab = (Zipfile
cfc0: 54 61 62 2a 29 73 71 6c 69 74 65 33 5f 75 73 65  Tab*)sqlite3_use
cfd0: 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b  r_data(context);
cfe0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3e  .  assert( argc>
cff0: 30 20 29 3b 0a 0a 20 20 70 43 73 72 20 3d 20 7a  0 );..  pCsr = z
d000: 69 70 66 69 6c 65 46 69 6e 64 43 75 72 73 6f 72  ipfileFindCursor
d010: 28 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 76  (pTab, sqlite3_v
d020: 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
d030: 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 43 73 72  0]));.  if( pCsr
d040: 20 29 7b 0a 20 20 20 20 5a 69 70 66 69 6c 65 43   ){.    ZipfileC
d050: 44 53 20 2a 70 20 3d 20 26 70 43 73 72 2d 3e 70  DS *p = &pCsr->p
d060: 43 75 72 72 65 6e 74 2d 3e 63 64 73 3b 0a 20 20  Current->cds;.  
d070: 20 20 63 68 61 72 20 2a 7a 52 65 73 20 3d 20 73    char *zRes = s
d080: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
d090: 7b 22 0a 20 20 20 20 20 20 20 20 22 5c 22 76 65  {".        "\"ve
d0a0: 72 73 69 6f 6e 2d 6d 61 64 65 2d 62 79 5c 22 20  rsion-made-by\" 
d0b0: 3a 20 25 75 2c 20 22 0a 20 20 20 20 20 20 20 20  : %u, ".        
d0c0: 22 5c 22 76 65 72 73 69 6f 6e 2d 74 6f 2d 65 78  "\"version-to-ex
d0d0: 74 72 61 63 74 5c 22 20 3a 20 25 75 2c 20 22 0a  tract\" : %u, ".
d0e0: 20 20 20 20 20 20 20 20 22 5c 22 66 6c 61 67 73          "\"flags
d0f0: 5c 22 20 3a 20 25 75 2c 20 22 0a 20 20 20 20 20  \" : %u, ".     
d100: 20 20 20 22 5c 22 63 6f 6d 70 72 65 73 73 69 6f     "\"compressio
d110: 6e 5c 22 20 3a 20 25 75 2c 20 22 0a 20 20 20 20  n\" : %u, ".    
d120: 20 20 20 20 22 5c 22 74 69 6d 65 5c 22 20 3a 20      "\"time\" : 
d130: 25 75 2c 20 22 0a 20 20 20 20 20 20 20 20 22 5c  %u, ".        "\
d140: 22 64 61 74 65 5c 22 20 3a 20 25 75 2c 20 22 0a  "date\" : %u, ".
d150: 20 20 20 20 20 20 20 20 22 5c 22 63 72 63 33 32          "\"crc32
d160: 5c 22 20 3a 20 25 75 2c 20 22 0a 20 20 20 20 20  \" : %u, ".     
d170: 20 20 20 22 5c 22 63 6f 6d 70 72 65 73 73 65 64     "\"compressed
d180: 2d 73 69 7a 65 5c 22 20 3a 20 25 75 2c 20 22 0a  -size\" : %u, ".
d190: 20 20 20 20 20 20 20 20 22 5c 22 75 6e 63 6f 6d          "\"uncom
d1a0: 70 72 65 73 73 65 64 2d 73 69 7a 65 5c 22 20 3a  pressed-size\" :
d1b0: 20 25 75 2c 20 22 0a 20 20 20 20 20 20 20 20 22   %u, ".        "
d1c0: 5c 22 66 69 6c 65 2d 6e 61 6d 65 2d 6c 65 6e 67  \"file-name-leng
d1d0: 74 68 5c 22 20 3a 20 25 75 2c 20 22 0a 20 20 20  th\" : %u, ".   
d1e0: 20 20 20 20 20 22 5c 22 65 78 74 72 61 2d 66 69       "\"extra-fi
d1f0: 65 6c 64 2d 6c 65 6e 67 74 68 5c 22 20 3a 20 25  eld-length\" : %
d200: 75 2c 20 22 0a 20 20 20 20 20 20 20 20 22 5c 22  u, ".        "\"
d210: 66 69 6c 65 2d 63 6f 6d 6d 65 6e 74 2d 6c 65 6e  file-comment-len
d220: 67 74 68 5c 22 20 3a 20 25 75 2c 20 22 0a 20 20  gth\" : %u, ".  
d230: 20 20 20 20 20 20 22 5c 22 64 69 73 6b 2d 6e 75        "\"disk-nu
d240: 6d 62 65 72 2d 73 74 61 72 74 5c 22 20 3a 20 25  mber-start\" : %
d250: 75 2c 20 22 0a 20 20 20 20 20 20 20 20 22 5c 22  u, ".        "\"
d260: 69 6e 74 65 72 6e 61 6c 2d 61 74 74 72 5c 22 20  internal-attr\" 
d270: 3a 20 25 75 2c 20 22 0a 20 20 20 20 20 20 20 20  : %u, ".        
d280: 22 5c 22 65 78 74 65 72 6e 61 6c 2d 61 74 74 72  "\"external-attr
d290: 5c 22 20 3a 20 25 75 2c 20 22 0a 20 20 20 20 20  \" : %u, ".     
d2a0: 20 20 20 22 5c 22 6f 66 66 73 65 74 5c 22 20 3a     "\"offset\" :
d2b0: 20 25 75 20 7d 22 2c 0a 20 20 20 20 20 20 20 20   %u }",.        
d2c0: 28 75 33 32 29 70 2d 3e 69 56 65 72 73 69 6f 6e  (u32)p->iVersion
d2d0: 4d 61 64 65 42 79 2c 20 28 75 33 32 29 70 2d 3e  MadeBy, (u32)p->
d2e0: 69 56 65 72 73 69 6f 6e 45 78 74 72 61 63 74 2c  iVersionExtract,
d2f0: 0a 20 20 20 20 20 20 20 20 28 75 33 32 29 70 2d  .        (u32)p-
d300: 3e 66 6c 61 67 73 2c 20 28 75 33 32 29 70 2d 3e  >flags, (u32)p->
d310: 69 43 6f 6d 70 72 65 73 73 69 6f 6e 2c 0a 20 20  iCompression,.  
d320: 20 20 20 20 20 20 28 75 33 32 29 70 2d 3e 6d 54        (u32)p->mT
d330: 69 6d 65 2c 20 28 75 33 32 29 70 2d 3e 6d 44 61  ime, (u32)p->mDa
d340: 74 65 2c 0a 20 20 20 20 20 20 20 20 28 75 33 32  te,.        (u32
d350: 29 70 2d 3e 63 72 63 33 32 2c 20 28 75 33 32 29  )p->crc32, (u32)
d360: 70 2d 3e 73 7a 43 6f 6d 70 72 65 73 73 65 64 2c  p->szCompressed,
d370: 0a 20 20 20 20 20 20 20 20 28 75 33 32 29 70 2d  .        (u32)p-
d380: 3e 73 7a 55 6e 63 6f 6d 70 72 65 73 73 65 64 2c  >szUncompressed,
d390: 20 28 75 33 32 29 70 2d 3e 6e 46 69 6c 65 2c 0a   (u32)p->nFile,.
d3a0: 20 20 20 20 20 20 20 20 28 75 33 32 29 70 2d 3e          (u32)p->
d3b0: 6e 45 78 74 72 61 2c 20 28 75 33 32 29 70 2d 3e  nExtra, (u32)p->
d3c0: 6e 43 6f 6d 6d 65 6e 74 2c 0a 20 20 20 20 20 20  nComment,.      
d3d0: 20 20 28 75 33 32 29 70 2d 3e 69 44 69 73 6b 53    (u32)p->iDiskS
d3e0: 74 61 72 74 2c 20 28 75 33 32 29 70 2d 3e 69 49  tart, (u32)p->iI
d3f0: 6e 74 65 72 6e 61 6c 41 74 74 72 2c 0a 20 20 20  nternalAttr,.   
d400: 20 20 20 20 20 28 75 33 32 29 70 2d 3e 69 45 78       (u32)p->iEx
d410: 74 65 72 6e 61 6c 41 74 74 72 2c 20 28 75 33 32  ternalAttr, (u32
d420: 29 70 2d 3e 69 4f 66 66 73 65 74 0a 20 20 20 20  )p->iOffset.    
d430: 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 52 65 73  );..    if( zRes
d440: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
d450: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
d460: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
d470: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d480: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
d490: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
d4a0: 7a 52 65 73 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zRes, -1, SQLITE
d4b0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
d4c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
d4d0: 7a 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zRes);.    }.  }
d4e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 46 69 6e 64 46  .}../*.** xFindF
d4f0: 75 6e 63 74 69 6f 6e 20 6d 65 74 68 6f 64 2e 0a  unction method..
d500: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 69  */.static int zi
d510: 70 66 69 6c 65 46 69 6e 64 46 75 6e 63 74 69 6f  pfileFindFunctio
d520: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  n(.  sqlite3_vta
d530: 62 20 2a 70 56 74 61 62 2c 20 20 20 20 20 20 20  b *pVtab,       
d540: 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
d550: 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
d560: 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d580: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53    /* Number of S
d590: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  QL function argu
d5a0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
d5b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
d5c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
d5d0: 6d 65 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69  me of SQL functi
d5e0: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 2a  on */.  void (**
d5f0: 70 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  pxFunc)(sqlite3_
d600: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
d610: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 20 2f  ite3_value**), /
d620: 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f  * OUT: Result */
d630: 0a 20 20 76 6f 69 64 20 2a 2a 70 70 41 72 67 20  .  void **ppArg 
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d650: 20 20 20 2f 2a 20 4f 55 54 3a 20 55 73 65 72 20     /* OUT: User 
d660: 64 61 74 61 20 66 6f 72 20 2a 70 78 46 75 6e 63  data for *pxFunc
d670: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 73 71 6c   */.){.  if( sql
d680: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 22 7a 69  ite3_stricmp("zi
d690: 70 66 69 6c 65 5f 63 64 73 22 2c 20 7a 4e 61 6d  pfile_cds", zNam
d6a0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 78  e)==0 ){.    *px
d6b0: 46 75 6e 63 20 3d 20 7a 69 70 66 69 6c 65 46 75  Func = zipfileFu
d6c0: 6e 63 74 69 6f 6e 43 64 73 3b 0a 20 20 20 20 2a  nctionCds;.    *
d6d0: 70 70 41 72 67 20 3d 20 28 76 6f 69 64 2a 29 70  ppArg = (void*)p
d6e0: 56 74 61 62 3b 0a 20 20 20 20 72 65 74 75 72 6e  Vtab;.    return
d6f0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
d700: 20 30 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73   0;.}..typedef s
d710: 74 72 75 63 74 20 5a 69 70 66 69 6c 65 42 75 66  truct ZipfileBuf
d720: 66 65 72 20 5a 69 70 66 69 6c 65 42 75 66 66 65  fer ZipfileBuffe
d730: 72 3b 0a 73 74 72 75 63 74 20 5a 69 70 66 69 6c  r;.struct Zipfil
d740: 65 42 75 66 66 65 72 20 7b 0a 20 20 75 38 20 2a  eBuffer {.  u8 *
d750: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
d760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
d770: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
d780: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7a0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
d7b0: 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
d7c0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63   */.  int nAlloc
d7d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d7e0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 61 6c        /* Byte al
d7f0: 6c 6f 63 61 74 65 64 20 61 74 20 61 5b 5d 20 2a  located at a[] *
d800: 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73 74  /.};..typedef st
d810: 72 75 63 74 20 5a 69 70 66 69 6c 65 43 74 78 20  ruct ZipfileCtx 
d820: 5a 69 70 66 69 6c 65 43 74 78 3b 0a 73 74 72 75  ZipfileCtx;.stru
d830: 63 74 20 5a 69 70 66 69 6c 65 43 74 78 20 7b 0a  ct ZipfileCtx {.
d840: 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 0a 20 20    int nEntry;.  
d850: 5a 69 70 66 69 6c 65 42 75 66 66 65 72 20 62 6f  ZipfileBuffer bo
d860: 64 79 3b 0a 20 20 5a 69 70 66 69 6c 65 42 75 66  dy;.  ZipfileBuf
d870: 66 65 72 20 63 64 73 3b 0a 7d 3b 0a 0a 73 74 61  fer cds;.};..sta
d880: 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c 65 42  tic int zipfileB
d890: 75 66 66 65 72 47 72 6f 77 28 5a 69 70 66 69 6c  ufferGrow(Zipfil
d8a0: 65 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69  eBuffer *pBuf, i
d8b0: 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28  nt nByte){.  if(
d8c0: 20 70 42 75 66 2d 3e 6e 2b 6e 42 79 74 65 3e 70   pBuf->n+nByte>p
d8d0: 42 75 66 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  Buf->nAlloc ){. 
d8e0: 20 20 20 75 38 20 2a 61 4e 65 77 3b 0a 20 20 20     u8 *aNew;.   
d8f0: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 42 75 66   int nNew = pBuf
d900: 2d 3e 6e 20 3f 20 70 42 75 66 2d 3e 6e 2a 32 20  ->n ? pBuf->n*2 
d910: 3a 20 35 31 32 3b 0a 20 20 20 20 69 6e 74 20 6e  : 512;.    int n
d920: 52 65 71 20 3d 20 70 42 75 66 2d 3e 6e 20 2b 20  Req = pBuf->n + 
d930: 6e 42 79 74 65 3b 0a 0a 20 20 20 20 77 68 69 6c  nByte;..    whil
d940: 65 28 20 6e 4e 65 77 3c 6e 52 65 71 20 29 20 6e  e( nNew<nReq ) n
d950: 4e 65 77 20 3d 20 6e 4e 65 77 2a 32 3b 0a 20 20  New = nNew*2;.  
d960: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    aNew = sqlite3
d970: 5f 72 65 61 6c 6c 6f 63 28 70 42 75 66 2d 3e 61  _realloc(pBuf->a
d980: 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28  , nNew);.    if(
d990: 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   aNew==0 ) retur
d9a0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
d9b0: 20 20 20 20 70 42 75 66 2d 3e 61 20 3d 20 61 4e      pBuf->a = aN
d9c0: 65 77 3b 0a 20 20 20 20 70 42 75 66 2d 3e 6e 41  ew;.    pBuf->nA
d9d0: 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d  lloc = nNew;.  }
d9e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d9f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53  _OK;.}../*.** xS
da00: 74 65 70 28 29 20 63 61 6c 6c 62 61 63 6b 20 66  tep() callback f
da10: 6f 72 20 74 68 65 20 7a 69 70 66 69 6c 65 28 29  or the zipfile()
da20: 20 61 67 67 72 65 67 61 74 65 2e 20 54 68 69 73   aggregate. This
da30: 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69   can be called i
da40: 6e 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65 20  n.** any of the 
da50: 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 79 73 3a 0a  following ways:.
da60: 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 7a  **.**   SELECT z
da70: 69 70 66 69 6c 65 28 6e 61 6d 65 2c 64 61 74 61  ipfile(name,data
da80: 29 20 2e 2e 2e 0a 2a 2a 20 20 20 53 45 4c 45 43  ) ....**   SELEC
da90: 54 20 7a 69 70 66 69 6c 65 28 6e 61 6d 65 2c 6d  T zipfile(name,m
daa0: 6f 64 65 2c 6d 74 69 6d 65 2c 64 61 74 61 29 20  ode,mtime,data) 
dab0: 2e 2e 2e 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  ....**   SELECT 
dac0: 7a 69 70 66 69 6c 65 28 6e 61 6d 65 2c 6d 6f 64  zipfile(name,mod
dad0: 65 2c 6d 74 69 6d 65 2c 64 61 74 61 2c 6d 65 74  e,mtime,data,met
dae0: 68 6f 64 29 20 2e 2e 2e 0a 2a 2f 0a 76 6f 69 64  hod) ....*/.void
daf0: 20 7a 69 70 66 69 6c 65 53 74 65 70 28 73 71 6c   zipfileStep(sql
db00: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
db10: 74 78 2c 20 69 6e 74 20 6e 56 61 6c 2c 20 73 71  tx, int nVal, sq
db20: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
db30: 56 61 6c 29 7b 0a 20 20 5a 69 70 66 69 6c 65 43  Val){.  ZipfileC
db40: 74 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  tx *p;          
db50: 20 20 20 20 20 20 20 20 2f 2a 20 41 67 67 72 65          /* Aggre
db60: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 63 6f  gate function co
db70: 6e 74 65 78 74 20 2a 2f 0a 20 20 5a 69 70 66 69  ntext */.  Zipfi
db80: 6c 65 45 6e 74 72 79 20 65 3b 20 20 20 20 20 20  leEntry e;      
db90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
dba0: 77 20 65 6e 74 72 79 20 74 6f 20 61 64 64 20 74  w entry to add t
dbb0: 6f 20 7a 69 70 20 61 72 63 68 69 76 65 20 2a 2f  o zip archive */
dbc0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ..  sqlite3_valu
dbd0: 65 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  e *pName = 0;.  
dbe0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
dbf0: 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Mode = 0;.  sqli
dc00: 74 65 33 5f 76 61 6c 75 65 20 2a 70 4d 74 69 6d  te3_value *pMtim
dc10: 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
dc20: 5f 76 61 6c 75 65 20 2a 70 44 61 74 61 20 3d 20  _value *pData = 
dc30: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  0;.  sqlite3_val
dc40: 75 65 20 2a 70 4d 65 74 68 6f 64 20 3d 20 30 3b  ue *pMethod = 0;
dc50: 0a 0a 20 20 69 6e 74 20 62 49 73 44 69 72 20 3d  ..  int bIsDir =
dc60: 20 30 3b 0a 20 20 75 33 32 20 6d 6f 64 65 3b 0a   0;.  u32 mode;.
dc70: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
dc80: 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 45  E_OK;.  char *zE
dc90: 72 72 20 3d 20 30 3b 0a 0a 20 20 69 6e 74 20 69  rr = 0;..  int i
dca0: 4d 65 74 68 6f 64 20 3d 20 2d 31 3b 20 20 20 20  Method = -1;    
dcb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
dcc0: 6d 70 72 65 73 73 69 6f 6e 20 6d 65 74 68 6f 64  mpression method
dcd0: 20 74 6f 20 75 73 65 20 28 30 20 6f 72 20 38 29   to use (0 or 8)
dce0: 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 75 38 20   */..  const u8 
dcf0: 2a 61 44 61 74 61 20 3d 20 30 3b 20 20 20 20 20  *aData = 0;     
dd00: 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62         /* Possib
dd10: 6c 79 20 63 6f 6d 70 72 65 73 73 65 64 20 64 61  ly compressed da
dd20: 74 61 20 66 6f 72 20 6e 65 77 20 65 6e 74 72 79  ta for new entry
dd30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 20   */.  int nData 
dd40: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
dd50: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
dd60: 20 61 44 61 74 61 5b 5d 20 69 6e 20 62 79 74 65   aData[] in byte
dd70: 73 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 55 6e 63  s */.  int szUnc
dd80: 6f 6d 70 72 65 73 73 65 64 20 3d 20 30 3b 20 20  ompressed = 0;  
dd90: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
dda0: 66 20 64 61 74 61 20 62 65 66 6f 72 65 20 63 6f  f data before co
ddb0: 6d 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 75  mpression */.  u
ddc0: 38 20 2a 61 46 72 65 65 20 3d 20 30 3b 20 20 20  8 *aFree = 0;   
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dde0: 2a 20 46 72 65 65 20 74 68 69 73 20 62 65 66 6f  * Free this befo
ddf0: 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a  re returning */.
de00: 20 20 75 33 32 20 69 43 72 63 33 32 20 3d 20 30    u32 iCrc32 = 0
de10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
de20: 20 20 2f 2a 20 63 72 63 33 32 20 6f 66 20 75 6e    /* crc32 of un
de30: 63 6f 6d 70 72 65 73 73 65 64 20 64 61 74 61 20  compressed data 
de40: 2a 2f 0a 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  */..  char *zNam
de50: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
de60: 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 28 6e        /* Path (n
de70: 61 6d 65 29 20 6f 66 20 6e 65 77 20 65 6e 74 72  ame) of new entr
de80: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  y */.  int nName
de90: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
dea0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
deb0: 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65 73  f zName in bytes
dec0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 72 65   */.  char *zFre
ded0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
dee0: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68        /* Free th
def0: 69 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  is before return
df00: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ing */.  int nBy
df10: 74 65 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 65  te;..  memset(&e
df20: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 65 29 29 3b  , 0, sizeof(e));
df30: 0a 20 20 70 20 3d 20 28 5a 69 70 66 69 6c 65 43  .  p = (ZipfileC
df40: 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  tx*)sqlite3_aggr
df50: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
df60: 74 78 2c 20 73 69 7a 65 6f 66 28 5a 69 70 66 69  tx, sizeof(Zipfi
df70: 6c 65 43 74 78 29 29 3b 0a 20 20 69 66 28 20 70  leCtx));.  if( p
df80: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
df90: 20 2f 2a 20 4d 61 72 74 69 61 6c 20 74 68 65 20   /* Martial the 
dfa0: 61 72 67 75 6d 65 6e 74 73 20 69 6e 74 6f 20 73  arguments into s
dfb0: 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20 2a  tack variables *
dfc0: 2f 0a 20 20 69 66 28 20 6e 56 61 6c 21 3d 32 20  /.  if( nVal!=2 
dfd0: 26 26 20 6e 56 61 6c 21 3d 34 20 26 26 20 6e 56  && nVal!=4 && nV
dfe0: 61 6c 21 3d 35 20 29 7b 0a 20 20 20 20 7a 45 72  al!=5 ){.    zEr
dff0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
e000: 6e 74 66 28 22 77 72 6f 6e 67 20 6e 75 6d 62 65  ntf("wrong numbe
e010: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74  r of arguments t
e020: 6f 20 66 75 6e 63 74 69 6f 6e 20 7a 69 70 66 69  o function zipfi
e030: 6c 65 28 29 22 29 3b 0a 20 20 20 20 72 63 20 3d  le()");.    rc =
e040: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
e050: 20 20 20 67 6f 74 6f 20 7a 69 70 66 69 6c 65 5f     goto zipfile_
e060: 73 74 65 70 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  step_out;.  }.  
e070: 70 4e 61 6d 65 20 3d 20 61 70 56 61 6c 5b 30 5d  pName = apVal[0]
e080: 3b 0a 20 20 69 66 28 20 6e 56 61 6c 3d 3d 32 20  ;.  if( nVal==2 
e090: 29 7b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 61  ){.    pData = a
e0a0: 70 56 61 6c 5b 31 5d 3b 0a 20 20 7d 65 6c 73 65  pVal[1];.  }else
e0b0: 7b 0a 20 20 20 20 70 4d 6f 64 65 20 3d 20 61 70  {.    pMode = ap
e0c0: 56 61 6c 5b 31 5d 3b 0a 20 20 20 20 70 4d 74 69  Val[1];.    pMti
e0d0: 6d 65 20 3d 20 61 70 56 61 6c 5b 32 5d 3b 0a 20  me = apVal[2];. 
e0e0: 20 20 20 70 44 61 74 61 20 3d 20 61 70 56 61 6c     pData = apVal
e0f0: 5b 33 5d 3b 0a 20 20 20 20 69 66 28 20 6e 56 61  [3];.    if( nVa
e100: 6c 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20 70 4d  l==5 ){.      pM
e110: 65 74 68 6f 64 20 3d 20 61 70 56 61 6c 5b 34 5d  ethod = apVal[4]
e120: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
e130: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
e140: 20 27 6e 61 6d 65 27 20 70 61 72 61 6d 65 74 65   'name' paramete
e150: 72 20 6c 6f 6f 6b 73 20 6f 6b 2e 20 2a 2f 0a 20  r looks ok. */. 
e160: 20 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29   zName = (char*)
e170: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
e180: 78 74 28 70 4e 61 6d 65 29 3b 0a 20 20 6e 4e 61  xt(pName);.  nNa
e190: 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  me = sqlite3_val
e1a0: 75 65 5f 62 79 74 65 73 28 70 4e 61 6d 65 29 3b  ue_bytes(pName);
e1b0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
e1c0: 29 7b 0a 20 20 20 20 7a 45 72 72 20 3d 20 73 71  ){.    zErr = sq
e1d0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 66  lite3_mprintf("f
e1e0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
e1f0: 20 7a 69 70 66 69 6c 65 28 29 20 6d 75 73 74 20   zipfile() must 
e200: 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 22 29 3b 0a 20  be non-NULL");. 
e210: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
e220: 52 52 4f 52 3b 0a 20 20 20 20 67 6f 74 6f 20 7a  RROR;.    goto z
e230: 69 70 66 69 6c 65 5f 73 74 65 70 5f 6f 75 74 3b  ipfile_step_out;
e240: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 70 65  .  }..  /* Inspe
e250: 63 74 20 74 68 65 20 27 6d 65 74 68 6f 64 27 20  ct the 'method' 
e260: 70 61 72 61 6d 65 74 65 72 2e 20 54 68 69 73 20  parameter. This 
e270: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 30  must be either 0
e280: 20 28 73 74 6f 72 65 29 2c 20 38 20 28 75 73 65   (store), 8 (use
e290: 0a 20 20 2a 2a 20 64 65 66 6c 61 74 65 20 63 6f  .  ** deflate co
e2a0: 6d 70 72 65 73 73 69 6f 6e 29 20 6f 72 20 4e 55  mpression) or NU
e2b0: 4c 4c 20 28 63 68 6f 6f 73 65 20 61 75 74 6f 6d  LL (choose autom
e2c0: 61 74 69 63 61 6c 6c 79 29 2e 20 20 2a 2f 0a 20  atically).  */. 
e2d0: 20 69 66 28 20 70 4d 65 74 68 6f 64 20 26 26 20   if( pMethod && 
e2e0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c  SQLITE_NULL!=sql
e2f0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
e300: 70 4d 65 74 68 6f 64 29 20 29 7b 0a 20 20 20 20  pMethod) ){.    
e310: 69 4d 65 74 68 6f 64 20 3d 20 28 69 6e 74 29 73  iMethod = (int)s
e320: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
e330: 36 34 28 70 4d 65 74 68 6f 64 29 3b 0a 20 20 20  64(pMethod);.   
e340: 20 69 66 28 20 69 4d 65 74 68 6f 64 21 3d 30 20   if( iMethod!=0 
e350: 26 26 20 69 4d 65 74 68 6f 64 21 3d 38 20 29 7b  && iMethod!=8 ){
e360: 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20 73 71  .      zErr = sq
e370: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69  lite3_mprintf("i
e380: 6c 6c 65 67 61 6c 20 6d 65 74 68 6f 64 20 76 61  llegal method va
e390: 6c 75 65 3a 20 25 64 22 2c 20 69 4d 65 74 68 6f  lue: %d", iMetho
e3a0: 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  d);.      rc = S
e3b0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
e3c0: 20 20 20 67 6f 74 6f 20 7a 69 70 66 69 6c 65 5f     goto zipfile_
e3d0: 73 74 65 70 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  step_out;.    }.
e3e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 69 6e    }..  /* Now in
e3f0: 73 70 65 63 74 20 74 68 65 20 64 61 74 61 2e 20  spect the data. 
e400: 49 66 20 74 68 69 73 20 69 73 20 4e 55 4c 4c 2c  If this is NULL,
e410: 20 74 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e   then the new en
e420: 74 72 79 20 6d 75 73 74 20 62 65 20 61 0a 20 20  try must be a.  
e430: 2a 2a 20 64 69 72 65 63 74 6f 72 79 2e 20 20 4f  ** directory.  O
e440: 74 68 65 72 77 69 73 65 2c 20 66 69 67 75 72 65  therwise, figure
e450: 20 6f 75 74 20 77 68 65 74 68 65 72 20 6f 72 20   out whether or 
e460: 6e 6f 74 20 74 68 65 20 64 61 74 61 20 73 68 6f  not the data sho
e470: 75 6c 64 0a 20 20 2a 2a 20 62 65 20 64 65 66 6c  uld.  ** be defl
e480: 61 74 65 64 20 6f 72 20 73 69 6d 70 6c 79 20 73  ated or simply s
e490: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 7a 69 70  tored in the zip
e4a0: 20 61 72 63 68 69 76 65 2e 20 2a 2f 0a 20 20 69   archive. */.  i
e4b0: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
e4c0: 5f 74 79 70 65 28 70 44 61 74 61 29 3d 3d 53 51  _type(pData)==SQ
e4d0: 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  LITE_NULL ){.   
e4e0: 20 62 49 73 44 69 72 20 3d 20 31 3b 0a 20 20 20   bIsDir = 1;.   
e4f0: 20 69 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20   iMethod = 0;.  
e500: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 44 61 74 61  }else{.    aData
e510: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
e520: 5f 62 6c 6f 62 28 70 44 61 74 61 29 3b 0a 20 20  _blob(pData);.  
e530: 20 20 73 7a 55 6e 63 6f 6d 70 72 65 73 73 65 64    szUncompressed
e540: 20 3d 20 6e 44 61 74 61 20 3d 20 73 71 6c 69 74   = nData = sqlit
e550: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70  e3_value_bytes(p
e560: 44 61 74 61 29 3b 0a 20 20 20 20 69 43 72 63 33  Data);.    iCrc3
e570: 32 20 3d 20 63 72 63 33 32 28 30 2c 20 61 44 61  2 = crc32(0, aDa
e580: 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20 20  ta, nData);.    
e590: 69 66 28 20 69 4d 65 74 68 6f 64 3c 30 20 7c 7c  if( iMethod<0 ||
e5a0: 20 69 4d 65 74 68 6f 64 3d 3d 38 20 29 7b 0a 20   iMethod==8 ){. 
e5b0: 20 20 20 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20       int nOut = 
e5c0: 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 69  0;.      rc = zi
e5d0: 70 66 69 6c 65 44 65 66 6c 61 74 65 28 61 44 61  pfileDeflate(aDa
e5e0: 74 61 2c 20 6e 44 61 74 61 2c 20 26 61 46 72 65  ta, nData, &aFre
e5f0: 65 2c 20 26 6e 4f 75 74 2c 20 26 7a 45 72 72 29  e, &nOut, &zErr)
e600: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
e610: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e620: 20 20 20 20 20 67 6f 74 6f 20 7a 69 70 66 69 6c       goto zipfil
e630: 65 5f 73 74 65 70 5f 6f 75 74 3b 0a 20 20 20 20  e_step_out;.    
e640: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 4d    }.      if( iM
e650: 65 74 68 6f 64 3d 3d 38 20 7c 7c 20 6e 4f 75 74  ethod==8 || nOut
e660: 3c 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  <nData ){.      
e670: 20 20 61 44 61 74 61 20 3d 20 61 46 72 65 65 3b    aData = aFree;
e680: 0a 20 20 20 20 20 20 20 20 6e 44 61 74 61 20 3d  .        nData =
e690: 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 69   nOut;.        i
e6a0: 4d 65 74 68 6f 64 20 3d 20 38 3b 0a 20 20 20 20  Method = 8;.    
e6b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e6c0: 20 69 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20   iMethod = 0;.  
e6d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
e6e0: 0a 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65  .  /* Decode the
e6f0: 20 22 6d 6f 64 65 22 20 61 72 67 75 6d 65 6e 74   "mode" argument
e700: 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 7a 69 70 66  . */.  rc = zipf
e710: 69 6c 65 47 65 74 4d 6f 64 65 28 70 4d 6f 64 65  ileGetMode(pMode
e720: 2c 20 62 49 73 44 69 72 2c 20 26 6d 6f 64 65 2c  , bIsDir, &mode,
e730: 20 26 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 72   &zErr);.  if( r
e740: 63 20 29 20 67 6f 74 6f 20 7a 69 70 66 69 6c 65  c ) goto zipfile
e750: 5f 73 74 65 70 5f 6f 75 74 3b 0a 0a 20 20 2f 2a  _step_out;..  /*
e760: 20 44 65 63 6f 64 65 20 74 68 65 20 22 6d 74 69   Decode the "mti
e770: 6d 65 22 20 61 72 67 75 6d 65 6e 74 2e 20 2a 2f  me" argument. */
e780: 0a 20 20 65 2e 6d 55 6e 69 78 54 69 6d 65 20 3d  .  e.mUnixTime =
e790: 20 7a 69 70 66 69 6c 65 47 65 74 54 69 6d 65 28   zipfileGetTime(
e7a0: 70 4d 74 69 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49  pMtime);..  /* I
e7b0: 66 20 74 68 69 73 20 69 73 20 61 20 64 69 72 65  f this is a dire
e7c0: 63 74 6f 72 79 20 65 6e 74 72 79 2c 20 65 6e 73  ctory entry, ens
e7d0: 75 72 65 20 74 68 61 74 20 74 68 65 72 65 20 69  ure that there i
e7e0: 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 27 2f  s exactly one '/
e7f0: 27 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e  '.  ** at the en
e800: 64 20 6f 66 20 74 68 65 20 70 61 74 68 2e 20 4f  d of the path. O
e810: 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  r, if this is no
e820: 74 20 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e  t a directory an
e830: 64 20 74 68 65 20 70 61 74 68 0a 20 20 2a 2a 20  d the path.  ** 
e840: 65 6e 64 73 20 69 6e 20 27 2f 27 20 69 74 20 69  ends in '/' it i
e850: 73 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20  s an error. */. 
e860: 20 69 66 28 20 62 49 73 44 69 72 3d 3d 30 20 29   if( bIsDir==0 )
e870: 7b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b  {.    if( zName[
e880: 6e 4e 61 6d 65 2d 31 5d 3d 3d 27 2f 27 20 29 7b  nName-1]=='/' ){
e890: 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20 73 71  .      zErr = sq
e8a0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e  lite3_mprintf("n
e8b0: 6f 6e 2d 64 69 72 65 63 74 6f 72 79 20 6e 61 6d  on-directory nam
e8c0: 65 20 6d 75 73 74 20 6e 6f 74 20 65 6e 64 20 77  e must not end w
e8d0: 69 74 68 20 2f 22 29 3b 0a 20 20 20 20 20 20 72  ith /");.      r
e8e0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
e8f0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 7a 69 70  ;.      goto zip
e900: 66 69 6c 65 5f 73 74 65 70 5f 6f 75 74 3b 0a 20  file_step_out;. 
e910: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
e920: 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6e 4e 61 6d    if( zName[nNam
e930: 65 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20  e-1]!='/' ){.   
e940: 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 46 72 65 65     zName = zFree
e950: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
e960: 74 66 28 22 25 73 2f 22 2c 20 7a 4e 61 6d 65 29  tf("%s/", zName)
e970: 3b 0a 20 20 20 20 20 20 6e 4e 61 6d 65 2b 2b 3b  ;.      nName++;
e980: 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  .      if( zName
e990: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
e9a0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
e9b0: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 7a  ;.        goto z
e9c0: 69 70 66 69 6c 65 5f 73 74 65 70 5f 6f 75 74 3b  ipfile_step_out;
e9d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
e9e0: 73 65 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  se{.      while(
e9f0: 20 6e 4e 61 6d 65 3e 31 20 26 26 20 7a 4e 61 6d   nName>1 && zNam
ea00: 65 5b 6e 4e 61 6d 65 2d 32 5d 3d 3d 27 2f 27 20  e[nName-2]=='/' 
ea10: 29 20 6e 4e 61 6d 65 2d 2d 3b 0a 20 20 20 20 7d  ) nName--;.    }
ea20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 65 6d  .  }..  /* Assem
ea30: 62 6c 65 20 74 68 65 20 5a 69 70 66 69 6c 65 45  ble the ZipfileE
ea40: 6e 74 72 79 20 6f 62 6a 65 63 74 20 66 6f 72 20  ntry object for 
ea50: 74 68 65 20 6e 65 77 20 7a 69 70 20 61 72 63 68  the new zip arch
ea60: 69 76 65 20 65 6e 74 72 79 20 2a 2f 0a 20 20 65  ive entry */.  e
ea70: 2e 63 64 73 2e 69 56 65 72 73 69 6f 6e 4d 61 64  .cds.iVersionMad
ea80: 65 42 79 20 3d 20 5a 49 50 46 49 4c 45 5f 4e 45  eBy = ZIPFILE_NE
ea90: 57 45 4e 54 52 59 5f 4d 41 44 45 42 59 3b 0a 20  WENTRY_MADEBY;. 
eaa0: 20 65 2e 63 64 73 2e 69 56 65 72 73 69 6f 6e 45   e.cds.iVersionE
eab0: 78 74 72 61 63 74 20 3d 20 5a 49 50 46 49 4c 45  xtract = ZIPFILE
eac0: 5f 4e 45 57 45 4e 54 52 59 5f 52 45 51 55 49 52  _NEWENTRY_REQUIR
ead0: 45 44 3b 0a 20 20 65 2e 63 64 73 2e 66 6c 61 67  ED;.  e.cds.flag
eae0: 73 20 3d 20 5a 49 50 46 49 4c 45 5f 4e 45 57 45  s = ZIPFILE_NEWE
eaf0: 4e 54 52 59 5f 46 4c 41 47 53 3b 0a 20 20 65 2e  NTRY_FLAGS;.  e.
eb00: 63 64 73 2e 69 43 6f 6d 70 72 65 73 73 69 6f 6e  cds.iCompression
eb10: 20 3d 20 28 75 31 36 29 69 4d 65 74 68 6f 64 3b   = (u16)iMethod;
eb20: 0a 20 20 7a 69 70 66 69 6c 65 4d 74 69 6d 65 54  .  zipfileMtimeT
eb30: 6f 44 6f 73 28 26 65 2e 63 64 73 2c 20 28 75 33  oDos(&e.cds, (u3
eb40: 32 29 65 2e 6d 55 6e 69 78 54 69 6d 65 29 3b 0a  2)e.mUnixTime);.
eb50: 20 20 65 2e 63 64 73 2e 63 72 63 33 32 20 3d 20    e.cds.crc32 = 
eb60: 69 43 72 63 33 32 3b 0a 20 20 65 2e 63 64 73 2e  iCrc32;.  e.cds.
eb70: 73 7a 43 6f 6d 70 72 65 73 73 65 64 20 3d 20 6e  szCompressed = n
eb80: 44 61 74 61 3b 0a 20 20 65 2e 63 64 73 2e 73 7a  Data;.  e.cds.sz
eb90: 55 6e 63 6f 6d 70 72 65 73 73 65 64 20 3d 20 73  Uncompressed = s
eba0: 7a 55 6e 63 6f 6d 70 72 65 73 73 65 64 3b 0a 20  zUncompressed;. 
ebb0: 20 65 2e 63 64 73 2e 69 45 78 74 65 72 6e 61 6c   e.cds.iExternal
ebc0: 41 74 74 72 20 3d 20 28 6d 6f 64 65 3c 3c 31 36  Attr = (mode<<16
ebd0: 29 3b 0a 20 20 65 2e 63 64 73 2e 69 4f 66 66 73  );.  e.cds.iOffs
ebe0: 65 74 20 3d 20 70 2d 3e 62 6f 64 79 2e 6e 3b 0a  et = p->body.n;.
ebf0: 20 20 65 2e 63 64 73 2e 6e 46 69 6c 65 20 3d 20    e.cds.nFile = 
ec00: 28 75 31 36 29 6e 4e 61 6d 65 3b 0a 20 20 65 2e  (u16)nName;.  e.
ec10: 63 64 73 2e 7a 46 69 6c 65 20 3d 20 7a 4e 61 6d  cds.zFile = zNam
ec20: 65 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20  e;..  /* Append 
ec30: 74 68 65 20 4c 46 48 20 74 6f 20 74 68 65 20 62  the LFH to the b
ec40: 6f 64 79 20 6f 66 20 74 68 65 20 6e 65 77 20 61  ody of the new a
ec50: 72 63 68 69 76 65 20 2a 2f 0a 20 20 6e 42 79 74  rchive */.  nByt
ec60: 65 20 3d 20 5a 49 50 46 49 4c 45 5f 4c 46 48 5f  e = ZIPFILE_LFH_
ec70: 46 49 58 45 44 5f 53 5a 20 2b 20 65 2e 63 64 73  FIXED_SZ + e.cds
ec80: 2e 6e 46 69 6c 65 20 2b 20 39 3b 0a 20 20 69 66  .nFile + 9;.  if
ec90: 28 20 28 72 63 20 3d 20 7a 69 70 66 69 6c 65 42  ( (rc = zipfileB
eca0: 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 62 6f  ufferGrow(&p->bo
ecb0: 64 79 2c 20 6e 42 79 74 65 29 29 20 29 20 67 6f  dy, nByte)) ) go
ecc0: 74 6f 20 7a 69 70 66 69 6c 65 5f 73 74 65 70 5f  to zipfile_step_
ecd0: 6f 75 74 3b 0a 20 20 70 2d 3e 62 6f 64 79 2e 6e  out;.  p->body.n
ece0: 20 2b 3d 20 7a 69 70 66 69 6c 65 53 65 72 69 61   += zipfileSeria
ecf0: 6c 69 7a 65 4c 46 48 28 26 65 2c 20 26 70 2d 3e  lizeLFH(&e, &p->
ed00: 62 6f 64 79 2e 61 5b 70 2d 3e 62 6f 64 79 2e 6e  body.a[p->body.n
ed10: 5d 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64  ]);..  /* Append
ed20: 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65   the data to the
ed30: 20 62 6f 64 79 20 6f 66 20 74 68 65 20 6e 65 77   body of the new
ed40: 20 61 72 63 68 69 76 65 20 2a 2f 0a 20 20 69 66   archive */.  if
ed50: 28 20 6e 44 61 74 61 3e 30 20 29 7b 0a 20 20 20  ( nData>0 ){.   
ed60: 20 69 66 28 20 28 72 63 20 3d 20 7a 69 70 66 69   if( (rc = zipfi
ed70: 6c 65 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d  leBufferGrow(&p-
ed80: 3e 62 6f 64 79 2c 20 6e 44 61 74 61 29 29 20 29  >body, nData)) )
ed90: 20 67 6f 74 6f 20 7a 69 70 66 69 6c 65 5f 73 74   goto zipfile_st
eda0: 65 70 5f 6f 75 74 3b 0a 20 20 20 20 6d 65 6d 63  ep_out;.    memc
edb0: 70 79 28 26 70 2d 3e 62 6f 64 79 2e 61 5b 70 2d  py(&p->body.a[p-
edc0: 3e 62 6f 64 79 2e 6e 5d 2c 20 61 44 61 74 61 2c  >body.n], aData,
edd0: 20 6e 44 61 74 61 29 3b 0a 20 20 20 20 70 2d 3e   nData);.    p->
ede0: 62 6f 64 79 2e 6e 20 2b 3d 20 6e 44 61 74 61 3b  body.n += nData;
edf0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e  .  }..  /* Appen
ee00: 64 20 74 68 65 20 43 44 53 20 72 65 63 6f 72 64  d the CDS record
ee10: 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
ee20: 79 20 6f 66 20 74 68 65 20 6e 65 77 20 61 72 63  y of the new arc
ee30: 68 69 76 65 20 2a 2f 0a 20 20 6e 42 79 74 65 20  hive */.  nByte 
ee40: 3d 20 5a 49 50 46 49 4c 45 5f 43 44 53 5f 46 49  = ZIPFILE_CDS_FI
ee50: 58 45 44 5f 53 5a 20 2b 20 65 2e 63 64 73 2e 6e  XED_SZ + e.cds.n
ee60: 46 69 6c 65 20 2b 20 39 3b 0a 20 20 69 66 28 20  File + 9;.  if( 
ee70: 28 72 63 20 3d 20 7a 69 70 66 69 6c 65 42 75 66  (rc = zipfileBuf
ee80: 66 65 72 47 72 6f 77 28 26 70 2d 3e 63 64 73 2c  ferGrow(&p->cds,
ee90: 20 6e 42 79 74 65 29 29 20 29 20 67 6f 74 6f 20   nByte)) ) goto 
eea0: 7a 69 70 66 69 6c 65 5f 73 74 65 70 5f 6f 75 74  zipfile_step_out
eeb0: 3b 0a 20 20 70 2d 3e 63 64 73 2e 6e 20 2b 3d 20  ;.  p->cds.n += 
eec0: 7a 69 70 66 69 6c 65 53 65 72 69 61 6c 69 7a 65  zipfileSerialize
eed0: 43 44 53 28 26 65 2c 20 26 70 2d 3e 63 64 73 2e  CDS(&e, &p->cds.
eee0: 61 5b 70 2d 3e 63 64 73 2e 6e 5d 29 3b 0a 0a 20  a[p->cds.n]);.. 
eef0: 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
ef00: 65 20 63 6f 75 6e 74 20 6f 66 20 65 6e 74 72 69  e count of entri
ef10: 65 73 20 69 6e 20 74 68 65 20 61 72 63 68 69 76  es in the archiv
ef20: 65 20 2a 2f 0a 20 20 70 2d 3e 6e 45 6e 74 72 79  e */.  p->nEntry
ef30: 2b 2b 3b 0a 0a 20 7a 69 70 66 69 6c 65 5f 73 74  ++;.. zipfile_st
ef40: 65 70 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  ep_out:.  sqlite
ef50: 33 5f 66 72 65 65 28 61 46 72 65 65 29 3b 0a 20  3_free(aFree);. 
ef60: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
ef70: 72 65 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ree);.  if( rc )
ef80: 7b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 20 29  {.    if( zErr )
ef90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
efa0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
efb0: 78 2c 20 7a 45 72 72 2c 20 2d 31 29 3b 0a 20 20  x, zErr, -1);.  
efc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
efd0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
efe0: 72 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c 20 72  ror_code(pCtx, r
eff0: 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  c);.    }.  }.  
f000: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
f010: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 46 69  r);.}../*.** xFi
f020: 6e 61 6c 69 7a 65 28 29 20 63 61 6c 6c 62 61 63  nalize() callbac
f030: 6b 20 66 6f 72 20 7a 69 70 66 69 6c 65 20 61 67  k for zipfile ag
f040: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
f050: 2e 0a 2a 2f 0a 76 6f 69 64 20 7a 69 70 66 69 6c  ..*/.void zipfil
f060: 65 46 69 6e 61 6c 28 73 71 6c 69 74 65 33 5f 63  eFinal(sqlite3_c
f070: 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20  ontext *pCtx){. 
f080: 20 5a 69 70 66 69 6c 65 43 74 78 20 2a 70 3b 0a   ZipfileCtx *p;.
f090: 20 20 5a 69 70 66 69 6c 65 45 4f 43 44 20 65 6f    ZipfileEOCD eo
f0a0: 63 64 3b 0a 20 20 69 6e 74 20 6e 5a 69 70 3b 0a  cd;.  int nZip;.
f0b0: 20 20 75 38 20 2a 61 5a 69 70 3b 0a 0a 20 20 70    u8 *aZip;..  p
f0c0: 20 3d 20 28 5a 69 70 66 69 6c 65 43 74 78 2a 29   = (ZipfileCtx*)
f0d0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
f0e0: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
f0f0: 73 69 7a 65 6f 66 28 5a 69 70 66 69 6c 65 43 74  sizeof(ZipfileCt
f100: 78 29 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  x));.  if( p==0 
f110: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
f120: 70 2d 3e 6e 45 6e 74 72 79 3e 30 20 29 7b 0a 20  p->nEntry>0 ){. 
f130: 20 20 20 6d 65 6d 73 65 74 28 26 65 6f 63 64 2c     memset(&eocd,
f140: 20 30 2c 20 73 69 7a 65 6f 66 28 65 6f 63 64 29   0, sizeof(eocd)
f150: 29 3b 0a 20 20 20 20 65 6f 63 64 2e 6e 45 6e 74  );.    eocd.nEnt
f160: 72 79 20 3d 20 28 75 31 36 29 70 2d 3e 6e 45 6e  ry = (u16)p->nEn
f170: 74 72 79 3b 0a 20 20 20 20 65 6f 63 64 2e 6e 45  try;.    eocd.nE
f180: 6e 74 72 79 54 6f 74 61 6c 20 3d 20 28 75 31 36  ntryTotal = (u16
f190: 29 70 2d 3e 6e 45 6e 74 72 79 3b 0a 20 20 20 20  )p->nEntry;.    
f1a0: 65 6f 63 64 2e 6e 53 69 7a 65 20 3d 20 70 2d 3e  eocd.nSize = p->
f1b0: 63 64 73 2e 6e 3b 0a 20 20 20 20 65 6f 63 64 2e  cds.n;.    eocd.
f1c0: 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 62 6f 64  iOffset = p->bod
f1d0: 79 2e 6e 3b 0a 0a 20 20 20 20 6e 5a 69 70 20 3d  y.n;..    nZip =
f1e0: 20 70 2d 3e 62 6f 64 79 2e 6e 20 2b 20 70 2d 3e   p->body.n + p->
f1f0: 63 64 73 2e 6e 20 2b 20 5a 49 50 46 49 4c 45 5f  cds.n + ZIPFILE_
f200: 45 4f 43 44 5f 46 49 58 45 44 5f 53 5a 3b 0a 20  EOCD_FIXED_SZ;. 
f210: 20 20 20 61 5a 69 70 20 3d 20 28 75 38 2a 29 73     aZip = (u8*)s
f220: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 5a  qlite3_malloc(nZ
f230: 69 70 29 3b 0a 20 20 20 20 69 66 28 20 61 5a 69  ip);.    if( aZi
f240: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
f250: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
f260: 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b 0a  or_nomem(pCtx);.
f270: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f280: 20 6d 65 6d 63 70 79 28 61 5a 69 70 2c 20 70 2d   memcpy(aZip, p-
f290: 3e 62 6f 64 79 2e 61 2c 20 70 2d 3e 62 6f 64 79  >body.a, p->body
f2a0: 2e 6e 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  .n);.      memcp
f2b0: 79 28 26 61 5a 69 70 5b 70 2d 3e 62 6f 64 79 2e  y(&aZip[p->body.
f2c0: 6e 5d 2c 20 70 2d 3e 63 64 73 2e 61 2c 20 70 2d  n], p->cds.a, p-
f2d0: 3e 63 64 73 2e 6e 29 3b 0a 20 20 20 20 20 20 7a  >cds.n);.      z
f2e0: 69 70 66 69 6c 65 53 65 72 69 61 6c 69 7a 65 45  ipfileSerializeE
f2f0: 4f 43 44 28 26 65 6f 63 64 2c 20 26 61 5a 69 70  OCD(&eocd, &aZip
f300: 5b 70 2d 3e 62 6f 64 79 2e 6e 20 2b 20 70 2d 3e  [p->body.n + p->
f310: 63 64 73 2e 6e 5d 29 3b 0a 20 20 20 20 20 20 73  cds.n]);.      s
f320: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
f330: 6f 62 28 70 43 74 78 2c 20 61 5a 69 70 2c 20 6e  ob(pCtx, aZip, n
f340: 5a 69 70 2c 20 7a 69 70 66 69 6c 65 46 72 65 65  Zip, zipfileFree
f350: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
f360: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
f370: 62 6f 64 79 2e 61 29 3b 0a 20 20 73 71 6c 69 74  body.a);.  sqlit
f380: 65 33 5f 66 72 65 65 28 70 2d 3e 63 64 73 2e 61  e3_free(p->cds.a
f390: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  );.}.../*.** Reg
f3a0: 69 73 74 65 72 20 74 68 65 20 22 7a 69 70 66 69  ister the "zipfi
f3b0: 6c 65 22 20 76 69 72 74 75 61 6c 20 74 61 62 6c  le" virtual tabl
f3c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
f3d0: 20 7a 69 70 66 69 6c 65 52 65 67 69 73 74 65 72   zipfileRegister
f3e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
f3f0: 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
f400: 6d 6f 64 75 6c 65 20 7a 69 70 66 69 6c 65 4d 6f  module zipfileMo
f410: 64 75 6c 65 20 3d 20 7b 0a 20 20 20 20 31 2c 20  dule = {.    1, 
f420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f430: 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
f440: 69 6f 6e 20 2a 2f 0a 20 20 20 20 7a 69 70 66 69  ion */.    zipfi
f450: 6c 65 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20  leConnect,      
f460: 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65        /* xCreate
f470: 20 2a 2f 0a 20 20 20 20 7a 69 70 66 69 6c 65 43   */.    zipfileC
f480: 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20  onnect,         
f490: 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2a     /* xConnect *
f4a0: 2f 0a 20 20 20 20 7a 69 70 66 69 6c 65 42 65 73  /.    zipfileBes
f4b0: 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  tIndex,         
f4c0: 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2a   /* xBestIndex *
f4d0: 2f 0a 20 20 20 20 7a 69 70 66 69 6c 65 44 69 73  /.    zipfileDis
f4e0: 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20  connect,        
f4f0: 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20   /* xDisconnect 
f500: 2a 2f 0a 20 20 20 20 7a 69 70 66 69 6c 65 44 69  */.    zipfileDi
f510: 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20  sconnect,       
f520: 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2a 2f    /* xDestroy */
f530: 0a 20 20 20 20 7a 69 70 66 69 6c 65 4f 70 65 6e  .    zipfileOpen
f540: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f550: 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20  /* xOpen - open 
f560: 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20  a cursor */.    
f570: 7a 69 70 66 69 6c 65 43 6c 6f 73 65 2c 20 20 20  zipfileClose,   
f580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
f590: 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63  lose - close a c
f5a0: 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 7a 69 70  ursor */.    zip
f5b0: 66 69 6c 65 46 69 6c 74 65 72 2c 20 20 20 20 20  fileFilter,     
f5c0: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74          /* xFilt
f5d0: 65 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73  er - configure s
f5e0: 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  can constraints 
f5f0: 2a 2f 0a 20 20 20 20 7a 69 70 66 69 6c 65 4e 65  */.    zipfileNe
f600: 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  xt,             
f610: 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76    /* xNext - adv
f620: 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f  ance a cursor */
f630: 0a 20 20 20 20 7a 69 70 66 69 6c 65 45 6f 66 2c  .    zipfileEof,
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f650: 2f 2a 20 78 45 6f 66 20 2d 20 63 68 65 63 6b 20  /* xEof - check 
f660: 66 6f 72 20 65 6e 64 20 6f 66 20 73 63 61 6e 20  for end of scan 
f670: 2a 2f 0a 20 20 20 20 7a 69 70 66 69 6c 65 43 6f  */.    zipfileCo
f680: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lumn,           
f690: 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72    /* xColumn - r
f6a0: 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 20 20  ead data */.    
f6b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
f6c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
f6d0: 6f 77 69 64 20 2d 20 72 65 61 64 20 64 61 74 61  owid - read data
f6e0: 20 2a 2f 0a 20 20 20 20 7a 69 70 66 69 6c 65 55   */.    zipfileU
f6f0: 70 64 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  pdate,          
f700: 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f     /* xUpdate */
f710: 0a 20 20 20 20 7a 69 70 66 69 6c 65 42 65 67 69  .    zipfileBegi
f720: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
f730: 2f 2a 20 78 42 65 67 69 6e 20 2a 2f 0a 20 20 20  /* xBegin */.   
f740: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
f750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
f760: 53 79 6e 63 20 2a 2f 0a 20 20 20 20 7a 69 70 66  Sync */.    zipf
f770: 69 6c 65 43 6f 6d 6d 69 74 2c 20 20 20 20 20 20  ileCommit,      
f780: 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69         /* xCommi
f790: 74 20 2a 2f 0a 20 20 20 20 7a 69 70 66 69 6c 65  t */.    zipfile
f7a0: 52 6f 6c 6c 62 61 63 6b 2c 20 20 20 20 20 20 20  Rollback,       
f7b0: 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b      /* xRollback
f7c0: 20 2a 2f 0a 20 20 20 20 7a 69 70 66 69 6c 65 46   */.    zipfileF
f7d0: 69 6e 64 46 75 6e 63 74 69 6f 6e 2c 20 20 20 20  indFunction,    
f7e0: 20 20 20 2f 2a 20 78 46 69 6e 64 4d 65 74 68 6f     /* xFindMetho
f7f0: 64 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  d */.    0,     
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f810: 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a      /* xRename *
f820: 2f 0a 20 20 7d 3b 0a 0a 20 20 69 6e 74 20 72 63  /.  };..  int rc
f830: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
f840: 65 5f 6d 6f 64 75 6c 65 28 64 62 2c 20 22 7a 69  e_module(db, "zi
f850: 70 66 69 6c 65 22 20 20 2c 20 26 7a 69 70 66 69  pfile"  , &zipfi
f860: 6c 65 4d 6f 64 75 6c 65 2c 20 30 29 3b 0a 20 20  leModule, 0);.  
f870: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
f880: 4b 20 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33  K ) rc = sqlite3
f890: 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69  _overload_functi
f8a0: 6f 6e 28 64 62 2c 20 22 7a 69 70 66 69 6c 65 5f  on(db, "zipfile_
f8b0: 63 64 73 22 2c 20 2d 31 29 3b 0a 20 20 69 66 28  cds", -1);.  if(
f8c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f8d0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
f8e0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
f8f0: 6f 6e 28 64 62 2c 20 22 7a 69 70 66 69 6c 65 22  on(db, "zipfile"
f900: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
f910: 38 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20  8, 0, 0, .      
f920: 20 20 7a 69 70 66 69 6c 65 53 74 65 70 2c 20 7a    zipfileStep, z
f930: 69 70 66 69 6c 65 46 69 6e 61 6c 0a 20 20 20 20  ipfileFinal.    
f940: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
f950: 72 63 3b 0a 7d 0a 23 65 6c 73 65 20 20 20 20 20  rc;.}.#else     
f960: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d      /* SQLITE_OM
f970: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
f980: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 7a 69 70 66  */.# define zipf
f990: 69 6c 65 52 65 67 69 73 74 65 72 28 78 29 20 53  ileRegister(x) S
f9a0: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
f9b0: 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f  .#ifdef _WIN32._
f9c0: 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70  _declspec(dllexp
f9d0: 6f 72 74 29 0a 23 65 6e 64 69 66 0a 69 6e 74 20  ort).#endif.int 
f9e0: 73 71 6c 69 74 65 33 5f 7a 69 70 66 69 6c 65 5f  sqlite3_zipfile_
f9f0: 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65 33 20  init(.  sqlite3 
fa00: 2a 64 62 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70  *db, .  char **p
fa10: 7a 45 72 72 4d 73 67 2c 20 0a 20 20 63 6f 6e 73  zErrMsg, .  cons
fa20: 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
fa30: 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a  utines *pApi.){.
fa40: 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49    SQLITE_EXTENSI
fa50: 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 3b 0a  ON_INIT2(pApi);.
fa60: 20 20 28 76 6f 69 64 29 70 7a 45 72 72 4d 73 67    (void)pzErrMsg
fa70: 3b 20 20 2f 2a 20 55 6e 75 73 65 64 20 70 61 72  ;  /* Unused par
fa80: 61 6d 65 74 65 72 20 2a 2f 0a 20 20 72 65 74 75  ameter */.  retu
fa90: 72 6e 20 7a 69 70 66 69 6c 65 52 65 67 69 73 74  rn zipfileRegist
faa0: 65 72 28 64 62 29 3b 0a 7d 0a                    er(db);.}.