/ Hex Artifact Content
Login

Artifact 7ad29133e304e40c8fe239bea10e101580ed56bc68c16d992af514cce19572d0:


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 36 34 28 28 73  ite3_malloc64((s
2ac0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 6e 42 79  qlite3_int64)nBy
2ad0: 74 65 2b 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69  te+nFile);.    i
2ae0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
2af0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2b00: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65  ;.    memset(pNe
2b10: 77 2c 20 30 2c 20 6e 42 79 74 65 2b 6e 46 69 6c  w, 0, nByte+nFil
2b20: 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 64 62  e);.    pNew->db
2b30: 20 3d 20 64 62 3b 0a 20 20 20 20 70 4e 65 77 2d   = db;.    pNew-
2b40: 3e 61 42 75 66 66 65 72 20 3d 20 28 75 38 2a 29  >aBuffer = (u8*)
2b50: 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 69 66  &pNew[1];.    if
2b60: 28 20 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  ( zFile ){.     
2b70: 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 20 3d 20 28   pNew->zFile = (
2b80: 63 68 61 72 2a 29 26 70 4e 65 77 2d 3e 61 42 75  char*)&pNew->aBu
2b90: 66 66 65 72 5b 5a 49 50 46 49 4c 45 5f 42 55 46  ffer[ZIPFILE_BUF
2ba0: 46 45 52 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 20  FER_SIZE];.     
2bb0: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 46   memcpy(pNew->zF
2bc0: 69 6c 65 2c 20 7a 46 69 6c 65 2c 20 6e 46 69 6c  ile, zFile, nFil
2bd0: 65 29 3b 0a 20 20 20 20 20 20 7a 69 70 66 69 6c  e);.      zipfil
2be0: 65 44 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 7a  eDequote(pNew->z
2bf0: 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  File);.    }.  }
2c00: 0a 20 20 2a 70 70 56 74 61 62 20 3d 20 28 73 71  .  *ppVtab = (sq
2c10: 6c 69 74 65 33 5f 76 74 61 62 2a 29 70 4e 65 77  lite3_vtab*)pNew
2c20: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2c30: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
2c40: 20 5a 69 70 66 69 6c 65 45 6e 74 72 79 20 73 74   ZipfileEntry st
2c50: 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65  ructure indicate
2c60: 64 20 62 79 20 74 68 65 20 6f 6e 6c 79 20 61 72  d by the only ar
2c70: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
2c80: 63 20 76 6f 69 64 20 7a 69 70 66 69 6c 65 45 6e  c void zipfileEn
2c90: 74 72 79 46 72 65 65 28 5a 69 70 66 69 6c 65 45  tryFree(ZipfileE
2ca0: 6e 74 72 79 20 2a 70 29 7b 0a 20 20 69 66 28 20  ntry *p){.  if( 
2cb0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
2cc0: 5f 66 72 65 65 28 70 2d 3e 63 64 73 2e 7a 46 69  _free(p->cds.zFi
2cd0: 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  le);.    sqlite3
2ce0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  _free(p);.  }.}.
2cf0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 72  ./*.** Release r
2d00: 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 73 68  esources that sh
2d10: 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20 61 74  ould be freed at
2d20: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 77 72   the end of a wr
2d30: 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ite .** transact
2d40: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
2d50: 6f 69 64 20 7a 69 70 66 69 6c 65 43 6c 65 61 6e  oid zipfileClean
2d60: 75 70 54 72 61 6e 73 61 63 74 69 6f 6e 28 5a 69  upTransaction(Zi
2d70: 70 66 69 6c 65 54 61 62 20 2a 70 54 61 62 29 7b  pfileTab *pTab){
2d80: 0a 20 20 5a 69 70 66 69 6c 65 45 6e 74 72 79 20  .  ZipfileEntry 
2d90: 2a 70 45 6e 74 72 79 3b 0a 20 20 5a 69 70 66 69  *pEntry;.  Zipfi
2da0: 6c 65 45 6e 74 72 79 20 2a 70 4e 65 78 74 3b 0a  leEntry *pNext;.
2db0: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 57 72  .  if( pTab->pWr
2dc0: 69 74 65 46 64 20 29 7b 0a 20 20 20 20 66 63 6c  iteFd ){.    fcl
2dd0: 6f 73 65 28 70 54 61 62 2d 3e 70 57 72 69 74 65  ose(pTab->pWrite
2de0: 46 64 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70  Fd);.    pTab->p
2df0: 57 72 69 74 65 46 64 20 3d 20 30 3b 0a 20 20 7d  WriteFd = 0;.  }
2e00: 0a 20 20 66 6f 72 28 70 45 6e 74 72 79 3d 70 54  .  for(pEntry=pT
2e10: 61 62 2d 3e 70 46 69 72 73 74 45 6e 74 72 79 3b  ab->pFirstEntry;
2e20: 20 70 45 6e 74 72 79 3b 20 70 45 6e 74 72 79 3d   pEntry; pEntry=
2e30: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
2e40: 74 20 3d 20 70 45 6e 74 72 79 2d 3e 70 4e 65 78  t = pEntry->pNex
2e50: 74 3b 0a 20 20 20 20 7a 69 70 66 69 6c 65 45 6e  t;.    zipfileEn
2e60: 74 72 79 46 72 65 65 28 70 45 6e 74 72 79 29 3b  tryFree(pEntry);
2e70: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 70 46 69  .  }.  pTab->pFi
2e80: 72 73 74 45 6e 74 72 79 20 3d 20 30 3b 0a 20 20  rstEntry = 0;.  
2e90: 70 54 61 62 2d 3e 70 4c 61 73 74 45 6e 74 72 79  pTab->pLastEntry
2ea0: 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 73 7a   = 0;.  pTab->sz
2eb0: 43 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 70  Current = 0;.  p
2ec0: 54 61 62 2d 3e 73 7a 4f 72 69 67 20 3d 20 30 3b  Tab->szOrig = 0;
2ed0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d  .}../*.** This m
2ee0: 65 74 68 6f 64 20 69 73 20 74 68 65 20 64 65 73  ethod is the des
2ef0: 74 72 75 63 74 6f 72 20 66 6f 72 20 7a 69 70 66  tructor for zipf
2f00: 69 6c 65 20 76 74 61 62 20 6f 62 6a 65 63 74 73  ile vtab objects
2f10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2f20: 7a 69 70 66 69 6c 65 44 69 73 63 6f 6e 6e 65 63  zipfileDisconnec
2f30: 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  t(sqlite3_vtab *
2f40: 70 56 74 61 62 29 7b 0a 20 20 7a 69 70 66 69 6c  pVtab){.  zipfil
2f50: 65 43 6c 65 61 6e 75 70 54 72 61 6e 73 61 63 74  eCleanupTransact
2f60: 69 6f 6e 28 28 5a 69 70 66 69 6c 65 54 61 62 2a  ion((ZipfileTab*
2f70: 29 70 56 74 61 62 29 3b 0a 20 20 73 71 6c 69 74  )pVtab);.  sqlit
2f80: 65 33 5f 66 72 65 65 28 70 56 74 61 62 29 3b 0a  e3_free(pVtab);.
2f90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2fa0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  OK;.}../*.** Con
2fb0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61 20 6e  structor for a n
2fc0: 65 77 20 5a 69 70 66 69 6c 65 43 73 72 20 6f 62  ew ZipfileCsr ob
2fd0: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
2fe0: 69 6e 74 20 7a 69 70 66 69 6c 65 4f 70 65 6e 28  int zipfileOpen(
2ff0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 2c  sqlite3_vtab *p,
3000: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
3010: 72 73 6f 72 20 2a 2a 70 70 43 73 72 29 7b 0a 20  rsor **ppCsr){. 
3020: 20 5a 69 70 66 69 6c 65 54 61 62 20 2a 70 54 61   ZipfileTab *pTa
3030: 62 20 3d 20 28 5a 69 70 66 69 6c 65 54 61 62 2a  b = (ZipfileTab*
3040: 29 70 3b 0a 20 20 5a 69 70 66 69 6c 65 43 73 72  )p;.  ZipfileCsr
3050: 20 2a 70 43 73 72 3b 0a 20 20 70 43 73 72 20 3d   *pCsr;.  pCsr =
3060: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
3070: 73 69 7a 65 6f 66 28 2a 70 43 73 72 29 29 3b 0a  sizeof(*pCsr));.
3080: 20 20 2a 70 70 43 73 72 20 3d 20 28 73 71 6c 69    *ppCsr = (sqli
3090: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 2a  te3_vtab_cursor*
30a0: 29 70 43 73 72 3b 0a 20 20 69 66 28 20 70 43 73  )pCsr;.  if( pCs
30b0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  r==0 ){.    retu
30c0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
30d0: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43  .  }.  memset(pC
30e0: 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  sr, 0, sizeof(*p
30f0: 43 73 72 29 29 3b 0a 20 20 70 43 73 72 2d 3e 69  Csr));.  pCsr->i
3100: 49 64 20 3d 20 2b 2b 70 54 61 62 2d 3e 69 4e 65  Id = ++pTab->iNe
3110: 78 74 43 73 72 69 64 3b 0a 20 20 70 43 73 72 2d  xtCsrid;.  pCsr-
3120: 3e 70 43 73 72 4e 65 78 74 20 3d 20 70 54 61 62  >pCsrNext = pTab
3130: 2d 3e 70 43 73 72 4c 69 73 74 3b 0a 20 20 70 54  ->pCsrList;.  pT
3140: 61 62 2d 3e 70 43 73 72 4c 69 73 74 20 3d 20 70  ab->pCsrList = p
3150: 43 73 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Csr;.  return SQ
3160: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
3170: 2a 20 52 65 73 65 74 20 61 20 63 75 72 73 6f 72  * Reset a cursor
3180: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 74 61   back to the sta
3190: 74 65 20 69 74 20 77 61 73 20 69 6e 20 77 68 65  te it was in whe
31a0: 6e 20 66 69 72 73 74 20 72 65 74 75 72 6e 65 64  n first returned
31b0: 0a 2a 2a 20 62 79 20 7a 69 70 66 69 6c 65 4f 70  .** by zipfileOp
31c0: 65 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  en()..*/.static 
31d0: 76 6f 69 64 20 7a 69 70 66 69 6c 65 52 65 73 65  void zipfileRese
31e0: 74 43 75 72 73 6f 72 28 5a 69 70 66 69 6c 65 43  tCursor(ZipfileC
31f0: 73 72 20 2a 70 43 73 72 29 7b 0a 20 20 5a 69 70  sr *pCsr){.  Zip
3200: 66 69 6c 65 45 6e 74 72 79 20 2a 70 3b 0a 20 20  fileEntry *p;.  
3210: 5a 69 70 66 69 6c 65 45 6e 74 72 79 20 2a 70 4e  ZipfileEntry *pN
3220: 65 78 74 3b 0a 0a 20 20 70 43 73 72 2d 3e 62 45  ext;..  pCsr->bE
3230: 6f 66 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43  of = 0;.  if( pC
3240: 73 72 2d 3e 70 46 69 6c 65 20 29 7b 0a 20 20 20  sr->pFile ){.   
3250: 20 66 63 6c 6f 73 65 28 70 43 73 72 2d 3e 70 46   fclose(pCsr->pF
3260: 69 6c 65 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e  ile);.    pCsr->
3270: 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7a  pFile = 0;.    z
3280: 69 70 66 69 6c 65 45 6e 74 72 79 46 72 65 65 28  ipfileEntryFree(
3290: 70 43 73 72 2d 3e 70 43 75 72 72 65 6e 74 29 3b  pCsr->pCurrent);
32a0: 0a 20 20 20 20 70 43 73 72 2d 3e 70 43 75 72 72  .    pCsr->pCurr
32b0: 65 6e 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ent = 0;.  }..  
32c0: 66 6f 72 28 70 3d 70 43 73 72 2d 3e 70 46 72 65  for(p=pCsr->pFre
32d0: 65 45 6e 74 72 79 3b 20 70 3b 20 70 3d 70 4e 65  eEntry; p; p=pNe
32e0: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
32f0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7a   p->pNext;.    z
3300: 69 70 66 69 6c 65 45 6e 74 72 79 46 72 65 65 28  ipfileEntryFree(
3310: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
3320: 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   Destructor for 
3330: 61 6e 20 5a 69 70 66 69 6c 65 43 73 72 2e 0a 2a  an ZipfileCsr..*
3340: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 69 70  /.static int zip
3350: 66 69 6c 65 43 6c 6f 73 65 28 73 71 6c 69 74 65  fileClose(sqlite
3360: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
3370: 75 72 29 7b 0a 20 20 5a 69 70 66 69 6c 65 43 73  ur){.  ZipfileCs
3380: 72 20 2a 70 43 73 72 20 3d 20 28 5a 69 70 66 69  r *pCsr = (Zipfi
3390: 6c 65 43 73 72 2a 29 63 75 72 3b 0a 20 20 5a 69  leCsr*)cur;.  Zi
33a0: 70 66 69 6c 65 54 61 62 20 2a 70 54 61 62 20 3d  pfileTab *pTab =
33b0: 20 28 5a 69 70 66 69 6c 65 54 61 62 2a 29 28 70   (ZipfileTab*)(p
33c0: 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 29  Csr->base.pVtab)
33d0: 3b 0a 20 20 5a 69 70 66 69 6c 65 43 73 72 20 2a  ;.  ZipfileCsr *
33e0: 2a 70 70 3b 0a 20 20 7a 69 70 66 69 6c 65 52 65  *pp;.  zipfileRe
33f0: 73 65 74 43 75 72 73 6f 72 28 70 43 73 72 29 3b  setCursor(pCsr);
3400: 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  ..  /* Remove th
3410: 69 73 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 74  is cursor from t
3420: 68 65 20 5a 69 70 66 69 6c 65 54 61 62 2e 70 43  he ZipfileTab.pC
3430: 73 72 4c 69 73 74 20 6c 69 73 74 2e 20 2a 2f 0a  srList list. */.
3440: 20 20 66 6f 72 28 70 70 3d 26 70 54 61 62 2d 3e    for(pp=&pTab->
3450: 70 43 73 72 4c 69 73 74 3b 20 2a 70 70 21 3d 70  pCsrList; *pp!=p
3460: 43 73 72 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d  Csr; pp=&((*pp)-
3470: 3e 70 43 73 72 4e 65 78 74 29 29 3b 0a 20 20 2a  >pCsrNext));.  *
3480: 70 70 20 3d 20 70 43 73 72 2d 3e 70 43 73 72 4e  pp = pCsr->pCsrN
3490: 65 78 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ext;..  sqlite3_
34a0: 66 72 65 65 28 70 43 73 72 29 3b 0a 20 20 72 65  free(pCsr);.  re
34b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
34c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
34d0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
34e0: 6f 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  or the virtual t
34f0: 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
3500: 77 69 74 68 20 63 75 72 73 6f 72 0a 2a 2a 20 70  with cursor.** p
3510: 43 73 72 20 74 6f 20 74 68 65 20 72 65 73 75 6c  Csr to the resul
3520: 74 73 20 6f 66 20 76 70 72 69 6e 74 66 28 7a 46  ts of vprintf(zF
3530: 6d 74 2c 20 2e 2e 2e 29 2e 0a 2a 2f 0a 73 74 61  mt, ...)..*/.sta
3540: 74 69 63 20 76 6f 69 64 20 7a 69 70 66 69 6c 65  tic void zipfile
3550: 54 61 62 6c 65 45 72 72 28 5a 69 70 66 69 6c 65  TableErr(Zipfile
3560: 54 61 62 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74  Tab *pTab, const
3570: 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e   char *zFmt, ...
3580: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
3590: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
35a0: 7a 46 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  zFmt);.  sqlite3
35b0: 5f 66 72 65 65 28 70 54 61 62 2d 3e 62 61 73 65  _free(pTab->base
35c0: 2e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 54 61  .zErrMsg);.  pTa
35d0: 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 20  b->base.zErrMsg 
35e0: 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e  = sqlite3_vmprin
35f0: 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20  tf(zFmt, ap);.  
3600: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 73 74  va_end(ap);.}.st
3610: 61 74 69 63 20 76 6f 69 64 20 7a 69 70 66 69 6c  atic void zipfil
3620: 65 43 75 72 73 6f 72 45 72 72 28 5a 69 70 66 69  eCursorErr(Zipfi
3630: 6c 65 43 73 72 20 2a 70 43 73 72 2c 20 63 6f 6e  leCsr *pCsr, con
3640: 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e  st char *zFmt, .
3650: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
3660: 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  p;.  va_start(ap
3670: 2c 20 7a 46 6d 74 29 3b 0a 20 20 73 71 6c 69 74  , zFmt);.  sqlit
3680: 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 62 61  e3_free(pCsr->ba
3690: 73 65 2e 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  se.pVtab->zErrMs
36a0: 67 29 3b 0a 20 20 70 43 73 72 2d 3e 62 61 73 65  g);.  pCsr->base
36b0: 2e 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20  .pVtab->zErrMsg 
36c0: 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e  = sqlite3_vmprin
36d0: 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20  tf(zFmt, ap);.  
36e0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f  va_end(ap);.}../
36f0: 2a 0a 2a 2a 20 52 65 61 64 20 6e 52 65 61 64 20  *.** Read nRead 
3700: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 72  bytes of data fr
3710: 6f 6d 20 6f 66 66 73 65 74 20 69 4f 66 66 20 6f  om offset iOff o
3720: 66 20 66 69 6c 65 20 70 46 69 6c 65 20 69 6e 74  f file pFile int
3730: 6f 20 62 75 66 66 65 72 0a 2a 2a 20 61 52 65 61  o buffer.** aRea
3740: 64 5b 5d 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  d[]. Return SQLI
3750: 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
3760: 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
3770: 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  e error code.** 
3780: 6f 74 68 65 72 77 69 73 65 2e 20 0a 2a 2a 0a 2a  otherwise. .**.*
3790: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f  * If an error do
37a0: 65 73 20 6f 63 63 75 72 2c 20 6f 75 74 70 75 74  es occur, output
37b0: 20 76 61 72 69 61 62 6c 65 20 28 2a 70 7a 45 72   variable (*pzEr
37c0: 72 6d 73 67 29 20 6d 61 79 20 62 65 20 73 65 74  rmsg) may be set
37d0: 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20   to point.** to 
37e0: 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  an English langu
37f0: 61 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  age error messag
3800: 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
3810: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
3820: 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20  he.** caller to 
3830: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
3840: 74 68 69 73 20 62 75 66 66 65 72 20 75 73 69 6e  this buffer usin
3850: 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72 65  g.** sqlite3_fre
3860: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
3870: 6e 74 20 7a 69 70 66 69 6c 65 52 65 61 64 44 61  nt zipfileReadDa
3880: 74 61 28 0a 20 20 46 49 4c 45 20 2a 70 46 69 6c  ta(.  FILE *pFil
3890: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
38a0: 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 66 72        /* Read fr
38b0: 6f 6d 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  om this file */.
38c0: 20 20 75 38 20 2a 61 52 65 61 64 2c 20 20 20 20    u8 *aRead,    
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38e0: 20 20 2f 2a 20 52 65 61 64 20 69 6e 74 6f 20 74    /* Read into t
38f0: 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  his buffer */.  
3900: 69 6e 74 20 6e 52 65 61 64 2c 20 20 20 20 20 20  int nRead,      
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
3930: 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  es to read */.  
3940: 69 36 34 20 69 4f 66 66 2c 20 20 20 20 20 20 20  i64 iOff,       
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3960: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65 61  /* Offset to rea
3970: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 63 68 61 72  d from */.  char
3980: 20 2a 2a 70 7a 45 72 72 6d 73 67 20 20 20 20 20   **pzErrmsg     
3990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
39a0: 55 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67  UT: Error messag
39b0: 65 20 28 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  e (from sqlite3_
39c0: 6d 61 6c 6c 6f 63 29 20 2a 2f 0a 29 7b 0a 20 20  malloc) */.){.  
39d0: 73 69 7a 65 5f 74 20 6e 3b 0a 20 20 66 73 65 65  size_t n;.  fsee
39e0: 6b 28 70 46 69 6c 65 2c 20 28 6c 6f 6e 67 29 69  k(pFile, (long)i
39f0: 4f 66 66 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  Off, SEEK_SET);.
3a00: 20 20 6e 20 3d 20 66 72 65 61 64 28 61 52 65 61    n = fread(aRea
3a10: 64 2c 20 31 2c 20 6e 52 65 61 64 2c 20 70 46 69  d, 1, nRead, pFi
3a20: 6c 65 29 3b 0a 20 20 69 66 28 20 28 69 6e 74 29  le);.  if( (int)
3a30: 6e 21 3d 6e 52 65 61 64 20 29 7b 0a 20 20 20 20  n!=nRead ){.    
3a40: 2a 70 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69  *pzErrmsg = sqli
3a50: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 65 72 72  te3_mprintf("err
3a60: 6f 72 20 69 6e 20 66 72 65 61 64 28 29 22 29 3b  or in fread()");
3a70: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
3a80: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
3a90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
3aa0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
3ab0: 7a 69 70 66 69 6c 65 41 70 70 65 6e 64 44 61 74  zipfileAppendDat
3ac0: 61 28 0a 20 20 5a 69 70 66 69 6c 65 54 61 62 20  a(.  ZipfileTab 
3ad0: 2a 70 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 75  *pTab,.  const u
3ae0: 38 20 2a 61 57 72 69 74 65 2c 0a 20 20 69 6e 74  8 *aWrite,.  int
3af0: 20 6e 57 72 69 74 65 0a 29 7b 0a 20 20 73 69 7a   nWrite.){.  siz
3b00: 65 5f 74 20 6e 3b 0a 20 20 66 73 65 65 6b 28 70  e_t n;.  fseek(p
3b10: 54 61 62 2d 3e 70 57 72 69 74 65 46 64 2c 20 28  Tab->pWriteFd, (
3b20: 6c 6f 6e 67 29 70 54 61 62 2d 3e 73 7a 43 75 72  long)pTab->szCur
3b30: 72 65 6e 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  rent, SEEK_SET);
3b40: 0a 20 20 6e 20 3d 20 66 77 72 69 74 65 28 61 57  .  n = fwrite(aW
3b50: 72 69 74 65 2c 20 31 2c 20 6e 57 72 69 74 65 2c  rite, 1, nWrite,
3b60: 20 70 54 61 62 2d 3e 70 57 72 69 74 65 46 64 29   pTab->pWriteFd)
3b70: 3b 0a 20 20 69 66 28 20 28 69 6e 74 29 6e 21 3d  ;.  if( (int)n!=
3b80: 6e 57 72 69 74 65 20 29 7b 0a 20 20 20 20 70 54  nWrite ){.    pT
3b90: 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67  ab->base.zErrMsg
3ba0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
3bb0: 74 66 28 22 65 72 72 6f 72 20 69 6e 20 66 77 72  tf("error in fwr
3bc0: 69 74 65 28 29 22 29 3b 0a 20 20 20 20 72 65 74  ite()");.    ret
3bd0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
3be0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a  ;.  }.  pTab->sz
3bf0: 43 75 72 72 65 6e 74 20 2b 3d 20 6e 57 72 69 74  Current += nWrit
3c00: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
3c10: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
3c20: 52 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 20  Read and return 
3c30: 61 20 31 36 2d 62 69 74 20 6c 69 74 74 6c 65 2d  a 16-bit little-
3c40: 65 6e 64 69 61 6e 20 75 6e 73 69 67 6e 65 64 20  endian unsigned 
3c50: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 62 75 66  integer from buf
3c60: 66 65 72 20 61 42 75 66 2e 0a 2a 2f 0a 73 74 61  fer aBuf..*/.sta
3c70: 74 69 63 20 75 31 36 20 7a 69 70 66 69 6c 65 47  tic u16 zipfileG
3c80: 65 74 55 31 36 28 63 6f 6e 73 74 20 75 38 20 2a  etU16(const u8 *
3c90: 61 42 75 66 29 7b 0a 20 20 72 65 74 75 72 6e 20  aBuf){.  return 
3ca0: 28 61 42 75 66 5b 31 5d 20 3c 3c 20 38 29 20 2b  (aBuf[1] << 8) +
3cb0: 20 61 42 75 66 5b 30 5d 3b 0a 7d 0a 0a 2f 2a 0a   aBuf[0];.}../*.
3cc0: 2a 2a 20 52 65 61 64 20 61 6e 64 20 72 65 74 75  ** Read and retu
3cd0: 72 6e 20 61 20 33 32 2d 62 69 74 20 6c 69 74 74  rn a 32-bit litt
3ce0: 6c 65 2d 65 6e 64 69 61 6e 20 75 6e 73 69 67 6e  le-endian unsign
3cf0: 65 64 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  ed integer from 
3d00: 62 75 66 66 65 72 20 61 42 75 66 2e 0a 2a 2f 0a  buffer aBuf..*/.
3d10: 73 74 61 74 69 63 20 75 33 32 20 7a 69 70 66 69  static u32 zipfi
3d20: 6c 65 47 65 74 55 33 32 28 63 6f 6e 73 74 20 75  leGetU32(const u
3d30: 38 20 2a 61 42 75 66 29 7b 0a 20 20 72 65 74 75  8 *aBuf){.  retu
3d40: 72 6e 20 28 28 75 33 32 29 28 61 42 75 66 5b 33  rn ((u32)(aBuf[3
3d50: 5d 29 20 3c 3c 20 32 34 29 0a 20 20 20 20 20 20  ]) << 24).      
3d60: 20 2b 20 28 28 75 33 32 29 28 61 42 75 66 5b 32   + ((u32)(aBuf[2
3d70: 5d 29 20 3c 3c 20 31 36 29 0a 20 20 20 20 20 20  ]) << 16).      
3d80: 20 2b 20 28 28 75 33 32 29 28 61 42 75 66 5b 31   + ((u32)(aBuf[1
3d90: 5d 29 20 3c 3c 20 20 38 29 0a 20 20 20 20 20 20  ]) <<  8).      
3da0: 20 2b 20 28 28 75 33 32 29 28 61 42 75 66 5b 30   + ((u32)(aBuf[0
3db0: 5d 29 20 3c 3c 20 20 30 29 3b 0a 7d 0a 0a 2f 2a  ]) <<  0);.}../*
3dc0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 31 36 2d 62  .** Write a 16-b
3dd0: 69 74 20 6c 69 74 74 6c 65 20 65 6e 64 69 61 74  it little endiat
3de0: 65 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 62  e integer into b
3df0: 75 66 66 65 72 20 61 42 75 66 2e 0a 2a 2f 0a 73  uffer aBuf..*/.s
3e00: 74 61 74 69 63 20 76 6f 69 64 20 7a 69 70 66 69  tatic void zipfi
3e10: 6c 65 50 75 74 55 31 36 28 75 38 20 2a 61 42 75  lePutU16(u8 *aBu
3e20: 66 2c 20 75 31 36 20 76 61 6c 29 7b 0a 20 20 61  f, u16 val){.  a
3e30: 42 75 66 5b 30 5d 20 3d 20 76 61 6c 20 26 20 30  Buf[0] = val & 0
3e40: 78 46 46 3b 0a 20 20 61 42 75 66 5b 31 5d 20 3d  xFF;.  aBuf[1] =
3e50: 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 46 46   (val>>8) & 0xFF
3e60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
3e70: 20 61 20 33 32 2d 62 69 74 20 6c 69 74 74 6c 65   a 32-bit little
3e80: 20 65 6e 64 69 61 74 65 20 69 6e 74 65 67 65 72   endiate integer
3e90: 20 69 6e 74 6f 20 62 75 66 66 65 72 20 61 42 75   into buffer aBu
3ea0: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  f..*/.static voi
3eb0: 64 20 7a 69 70 66 69 6c 65 50 75 74 55 33 32 28  d zipfilePutU32(
3ec0: 75 38 20 2a 61 42 75 66 2c 20 75 33 32 20 76 61  u8 *aBuf, u32 va
3ed0: 6c 29 7b 0a 20 20 61 42 75 66 5b 30 5d 20 3d 20  l){.  aBuf[0] = 
3ee0: 76 61 6c 20 26 20 30 78 46 46 3b 0a 20 20 61 42  val & 0xFF;.  aB
3ef0: 75 66 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 38 29  uf[1] = (val>>8)
3f00: 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75 66 5b   & 0xFF;.  aBuf[
3f10: 32 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26  2] = (val>>16) &
3f20: 20 30 78 46 46 3b 0a 20 20 61 42 75 66 5b 33 5d   0xFF;.  aBuf[3]
3f30: 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30   = (val>>24) & 0
3f40: 78 46 46 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20  xFF;.}..#define 
3f50: 7a 69 70 66 69 6c 65 52 65 61 64 33 32 28 61 42  zipfileRead32(aB
3f60: 75 66 29 20 28 20 61 42 75 66 2b 3d 34 2c 20 7a  uf) ( aBuf+=4, z
3f70: 69 70 66 69 6c 65 47 65 74 55 33 32 28 61 42 75  ipfileGetU32(aBu
3f80: 66 2d 34 29 20 29 0a 23 64 65 66 69 6e 65 20 7a  f-4) ).#define z
3f90: 69 70 66 69 6c 65 52 65 61 64 31 36 28 61 42 75  ipfileRead16(aBu
3fa0: 66 29 20 28 20 61 42 75 66 2b 3d 32 2c 20 7a 69  f) ( aBuf+=2, zi
3fb0: 70 66 69 6c 65 47 65 74 55 31 36 28 61 42 75 66  pfileGetU16(aBuf
3fc0: 2d 32 29 20 29 0a 0a 23 64 65 66 69 6e 65 20 7a  -2) )..#define z
3fd0: 69 70 66 69 6c 65 57 72 69 74 65 33 32 28 61 42  ipfileWrite32(aB
3fe0: 75 66 2c 76 61 6c 29 20 7b 20 7a 69 70 66 69 6c  uf,val) { zipfil
3ff0: 65 50 75 74 55 33 32 28 61 42 75 66 2c 76 61 6c  ePutU32(aBuf,val
4000: 29 3b 20 61 42 75 66 2b 3d 34 3b 20 7d 0a 23 64  ); aBuf+=4; }.#d
4010: 65 66 69 6e 65 20 7a 69 70 66 69 6c 65 57 72 69  efine zipfileWri
4020: 74 65 31 36 28 61 42 75 66 2c 76 61 6c 29 20 7b  te16(aBuf,val) {
4030: 20 7a 69 70 66 69 6c 65 50 75 74 55 31 36 28 61   zipfilePutU16(a
4040: 42 75 66 2c 76 61 6c 29 3b 20 61 42 75 66 2b 3d  Buf,val); aBuf+=
4050: 32 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 67 69  2; }../*.** Magi
4060: 63 20 6e 75 6d 62 65 72 73 20 75 73 65 64 20 74  c numbers used t
4070: 6f 20 72 65 61 64 20 43 44 53 20 72 65 63 6f 72  o read CDS recor
4080: 64 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5a  ds..*/.#define Z
4090: 49 50 46 49 4c 45 5f 43 44 53 5f 4e 46 49 4c 45  IPFILE_CDS_NFILE
40a0: 5f 4f 46 46 20 20 20 20 20 20 20 20 32 38 0a 23  _OFF        28.#
40b0: 64 65 66 69 6e 65 20 5a 49 50 46 49 4c 45 5f 43  define ZIPFILE_C
40c0: 44 53 5f 53 5a 43 4f 4d 50 52 45 53 53 45 44 5f  DS_SZCOMPRESSED_
40d0: 4f 46 46 20 32 30 0a 0a 2f 2a 0a 2a 2a 20 44 65  OFF 20../*.** De
40e0: 63 6f 64 65 20 74 68 65 20 43 44 53 20 72 65 63  code the CDS rec
40f0: 6f 72 64 20 69 6e 20 62 75 66 66 65 72 20 61 42  ord in buffer aB
4100: 75 66 20 69 6e 74 6f 20 28 2a 70 43 44 53 29 2e  uf into (*pCDS).
4110: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   Return SQLITE_E
4120: 52 52 4f 52 0a 2a 2a 20 69 66 20 74 68 65 20 72  RROR.** if the r
4130: 65 63 6f 72 64 20 69 73 20 6e 6f 74 20 77 65 6c  ecord is not wel
4140: 6c 2d 66 6f 72 6d 65 64 2c 20 6f 72 20 53 51 4c  l-formed, or SQL
4150: 49 54 45 5f 4f 4b 20 6f 74 68 65 72 77 69 73 65  ITE_OK otherwise
4160: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4170: 7a 69 70 66 69 6c 65 52 65 61 64 43 44 53 28 75  zipfileReadCDS(u
4180: 38 20 2a 61 42 75 66 2c 20 5a 69 70 66 69 6c 65  8 *aBuf, Zipfile
4190: 43 44 53 20 2a 70 43 44 53 29 7b 0a 20 20 75 38  CDS *pCDS){.  u8
41a0: 20 2a 61 52 65 61 64 20 3d 20 61 42 75 66 3b 0a   *aRead = aBuf;.
41b0: 20 20 75 33 32 20 73 69 67 20 3d 20 7a 69 70 66    u32 sig = zipf
41c0: 69 6c 65 52 65 61 64 33 32 28 61 52 65 61 64 29  ileRead32(aRead)
41d0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
41e0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 73 69  ITE_OK;.  if( si
41f0: 67 21 3d 5a 49 50 46 49 4c 45 5f 53 49 47 4e 41  g!=ZIPFILE_SIGNA
4200: 54 55 52 45 5f 43 44 53 20 29 7b 0a 20 20 20 20  TURE_CDS ){.    
4210: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
4220: 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
4230: 70 43 44 53 2d 3e 69 56 65 72 73 69 6f 6e 4d 61  pCDS->iVersionMa
4240: 64 65 42 79 20 3d 20 7a 69 70 66 69 6c 65 52 65  deBy = zipfileRe
4250: 61 64 31 36 28 61 52 65 61 64 29 3b 0a 20 20 20  ad16(aRead);.   
4260: 20 70 43 44 53 2d 3e 69 56 65 72 73 69 6f 6e 45   pCDS->iVersionE
4270: 78 74 72 61 63 74 20 3d 20 7a 69 70 66 69 6c 65  xtract = zipfile
4280: 52 65 61 64 31 36 28 61 52 65 61 64 29 3b 0a 20  Read16(aRead);. 
4290: 20 20 20 70 43 44 53 2d 3e 66 6c 61 67 73 20 3d     pCDS->flags =
42a0: 20 7a 69 70 66 69 6c 65 52 65 61 64 31 36 28 61   zipfileRead16(a
42b0: 52 65 61 64 29 3b 0a 20 20 20 20 70 43 44 53 2d  Read);.    pCDS-
42c0: 3e 69 43 6f 6d 70 72 65 73 73 69 6f 6e 20 3d 20  >iCompression = 
42d0: 7a 69 70 66 69 6c 65 52 65 61 64 31 36 28 61 52  zipfileRead16(aR
42e0: 65 61 64 29 3b 0a 20 20 20 20 70 43 44 53 2d 3e  ead);.    pCDS->
42f0: 6d 54 69 6d 65 20 3d 20 7a 69 70 66 69 6c 65 52  mTime = zipfileR
4300: 65 61 64 31 36 28 61 52 65 61 64 29 3b 0a 20 20  ead16(aRead);.  
4310: 20 20 70 43 44 53 2d 3e 6d 44 61 74 65 20 3d 20    pCDS->mDate = 
4320: 7a 69 70 66 69 6c 65 52 65 61 64 31 36 28 61 52  zipfileRead16(aR
4330: 65 61 64 29 3b 0a 20 20 20 20 70 43 44 53 2d 3e  ead);.    pCDS->
4340: 63 72 63 33 32 20 3d 20 7a 69 70 66 69 6c 65 52  crc32 = zipfileR
4350: 65 61 64 33 32 28 61 52 65 61 64 29 3b 0a 20 20  ead32(aRead);.  
4360: 20 20 70 43 44 53 2d 3e 73 7a 43 6f 6d 70 72 65    pCDS->szCompre
4370: 73 73 65 64 20 3d 20 7a 69 70 66 69 6c 65 52 65  ssed = zipfileRe
4380: 61 64 33 32 28 61 52 65 61 64 29 3b 0a 20 20 20  ad32(aRead);.   
4390: 20 70 43 44 53 2d 3e 73 7a 55 6e 63 6f 6d 70 72   pCDS->szUncompr
43a0: 65 73 73 65 64 20 3d 20 7a 69 70 66 69 6c 65 52  essed = zipfileR
43b0: 65 61 64 33 32 28 61 52 65 61 64 29 3b 0a 20 20  ead32(aRead);.  
43c0: 20 20 61 73 73 65 72 74 28 20 61 52 65 61 64 3d    assert( aRead=
43d0: 3d 26 61 42 75 66 5b 5a 49 50 46 49 4c 45 5f 43  =&aBuf[ZIPFILE_C
43e0: 44 53 5f 4e 46 49 4c 45 5f 4f 46 46 5d 20 29 3b  DS_NFILE_OFF] );
43f0: 0a 20 20 20 20 70 43 44 53 2d 3e 6e 46 69 6c 65  .    pCDS->nFile
4400: 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 31 36   = zipfileRead16
4410: 28 61 52 65 61 64 29 3b 0a 20 20 20 20 70 43 44  (aRead);.    pCD
4420: 53 2d 3e 6e 45 78 74 72 61 20 3d 20 7a 69 70 66  S->nExtra = zipf
4430: 69 6c 65 52 65 61 64 31 36 28 61 52 65 61 64 29  ileRead16(aRead)
4440: 3b 0a 20 20 20 20 70 43 44 53 2d 3e 6e 43 6f 6d  ;.    pCDS->nCom
4450: 6d 65 6e 74 20 3d 20 7a 69 70 66 69 6c 65 52 65  ment = zipfileRe
4460: 61 64 31 36 28 61 52 65 61 64 29 3b 0a 20 20 20  ad16(aRead);.   
4470: 20 70 43 44 53 2d 3e 69 44 69 73 6b 53 74 61 72   pCDS->iDiskStar
4480: 74 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 31  t = zipfileRead1
4490: 36 28 61 52 65 61 64 29 3b 0a 20 20 20 20 70 43  6(aRead);.    pC
44a0: 44 53 2d 3e 69 49 6e 74 65 72 6e 61 6c 41 74 74  DS->iInternalAtt
44b0: 72 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 31  r = zipfileRead1
44c0: 36 28 61 52 65 61 64 29 3b 0a 20 20 20 20 70 43  6(aRead);.    pC
44d0: 44 53 2d 3e 69 45 78 74 65 72 6e 61 6c 41 74 74  DS->iExternalAtt
44e0: 72 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 33  r = zipfileRead3
44f0: 32 28 61 52 65 61 64 29 3b 0a 20 20 20 20 70 43  2(aRead);.    pC
4500: 44 53 2d 3e 69 4f 66 66 73 65 74 20 3d 20 7a 69  DS->iOffset = zi
4510: 70 66 69 6c 65 52 65 61 64 33 32 28 61 52 65 61  pfileRead32(aRea
4520: 64 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  d);.    assert( 
4530: 61 52 65 61 64 3d 3d 26 61 42 75 66 5b 5a 49 50  aRead==&aBuf[ZIP
4540: 46 49 4c 45 5f 43 44 53 5f 46 49 58 45 44 5f 53  FILE_CDS_FIXED_S
4550: 5a 5d 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Z] );.  }..  ret
4560: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4570: 20 44 65 63 6f 64 65 20 74 68 65 20 4c 46 48 20   Decode the LFH 
4580: 72 65 63 6f 72 64 20 69 6e 20 62 75 66 66 65 72  record in buffer
4590: 20 61 42 75 66 20 69 6e 74 6f 20 28 2a 70 4c 46   aBuf into (*pLF
45a0: 48 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  H). Return SQLIT
45b0: 45 5f 45 52 52 4f 52 0a 2a 2a 20 69 66 20 74 68  E_ERROR.** if th
45c0: 65 20 72 65 63 6f 72 64 20 69 73 20 6e 6f 74 20  e record is not 
45d0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 2c 20 6f 72 20  well-formed, or 
45e0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 74 68 65 72 77  SQLITE_OK otherw
45f0: 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
4600: 6e 74 20 7a 69 70 66 69 6c 65 52 65 61 64 4c 46  nt zipfileReadLF
4610: 48 28 0a 20 20 75 38 20 2a 61 42 75 66 66 65 72  H(.  u8 *aBuffer
4620: 2c 0a 20 20 5a 69 70 66 69 6c 65 4c 46 48 20 2a  ,.  ZipfileLFH *
4630: 70 4c 46 48 0a 29 7b 0a 20 20 75 38 20 2a 61 52  pLFH.){.  u8 *aR
4640: 65 61 64 20 3d 20 61 42 75 66 66 65 72 3b 0a 20  ead = aBuffer;. 
4650: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4660: 5f 4f 4b 3b 0a 0a 20 20 75 33 32 20 73 69 67 20  _OK;..  u32 sig 
4670: 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 33 32 28  = zipfileRead32(
4680: 61 52 65 61 64 29 3b 0a 20 20 69 66 28 20 73 69  aRead);.  if( si
4690: 67 21 3d 5a 49 50 46 49 4c 45 5f 53 49 47 4e 41  g!=ZIPFILE_SIGNA
46a0: 54 55 52 45 5f 4c 46 48 20 29 7b 0a 20 20 20 20  TURE_LFH ){.    
46b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
46c0: 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
46d0: 70 4c 46 48 2d 3e 69 56 65 72 73 69 6f 6e 45 78  pLFH->iVersionEx
46e0: 74 72 61 63 74 20 3d 20 7a 69 70 66 69 6c 65 52  tract = zipfileR
46f0: 65 61 64 31 36 28 61 52 65 61 64 29 3b 0a 20 20  ead16(aRead);.  
4700: 20 20 70 4c 46 48 2d 3e 66 6c 61 67 73 20 3d 20    pLFH->flags = 
4710: 7a 69 70 66 69 6c 65 52 65 61 64 31 36 28 61 52  zipfileRead16(aR
4720: 65 61 64 29 3b 0a 20 20 20 20 70 4c 46 48 2d 3e  ead);.    pLFH->
4730: 69 43 6f 6d 70 72 65 73 73 69 6f 6e 20 3d 20 7a  iCompression = z
4740: 69 70 66 69 6c 65 52 65 61 64 31 36 28 61 52 65  ipfileRead16(aRe
4750: 61 64 29 3b 0a 20 20 20 20 70 4c 46 48 2d 3e 6d  ad);.    pLFH->m
4760: 54 69 6d 65 20 3d 20 7a 69 70 66 69 6c 65 52 65  Time = zipfileRe
4770: 61 64 31 36 28 61 52 65 61 64 29 3b 0a 20 20 20  ad16(aRead);.   
4780: 20 70 4c 46 48 2d 3e 6d 44 61 74 65 20 3d 20 7a   pLFH->mDate = z
4790: 69 70 66 69 6c 65 52 65 61 64 31 36 28 61 52 65  ipfileRead16(aRe
47a0: 61 64 29 3b 0a 20 20 20 20 70 4c 46 48 2d 3e 63  ad);.    pLFH->c
47b0: 72 63 33 32 20 3d 20 7a 69 70 66 69 6c 65 52 65  rc32 = zipfileRe
47c0: 61 64 33 32 28 61 52 65 61 64 29 3b 0a 20 20 20  ad32(aRead);.   
47d0: 20 70 4c 46 48 2d 3e 73 7a 43 6f 6d 70 72 65 73   pLFH->szCompres
47e0: 73 65 64 20 3d 20 7a 69 70 66 69 6c 65 52 65 61  sed = zipfileRea
47f0: 64 33 32 28 61 52 65 61 64 29 3b 0a 20 20 20 20  d32(aRead);.    
4800: 70 4c 46 48 2d 3e 73 7a 55 6e 63 6f 6d 70 72 65  pLFH->szUncompre
4810: 73 73 65 64 20 3d 20 7a 69 70 66 69 6c 65 52 65  ssed = zipfileRe
4820: 61 64 33 32 28 61 52 65 61 64 29 3b 0a 20 20 20  ad32(aRead);.   
4830: 20 70 4c 46 48 2d 3e 6e 46 69 6c 65 20 3d 20 7a   pLFH->nFile = z
4840: 69 70 66 69 6c 65 52 65 61 64 31 36 28 61 52 65  ipfileRead16(aRe
4850: 61 64 29 3b 0a 20 20 20 20 70 4c 46 48 2d 3e 6e  ad);.    pLFH->n
4860: 45 78 74 72 61 20 3d 20 7a 69 70 66 69 6c 65 52  Extra = zipfileR
4870: 65 61 64 31 36 28 61 52 65 61 64 29 3b 0a 20 20  ead16(aRead);.  
4880: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4890: 0a 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20  .../*.** Buffer 
48a0: 61 45 78 74 72 61 20 28 73 69 7a 65 20 6e 45 78  aExtra (size nEx
48b0: 74 72 61 20 62 79 74 65 73 29 20 63 6f 6e 74 61  tra bytes) conta
48c0: 69 6e 73 20 7a 69 70 20 61 72 63 68 69 76 65 20  ins zip archive 
48d0: 22 65 78 74 72 61 22 20 66 69 65 6c 64 73 2e 0a  "extra" fields..
48e0: 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
48f0: 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 66  this buffer to f
4900: 69 6e 64 20 61 6e 20 22 65 78 74 72 61 2d 74 69  ind an "extra-ti
4910: 6d 65 73 74 61 6d 70 22 20 66 69 65 6c 64 2e 20  mestamp" field. 
4920: 49 66 20 6f 6e 65 0a 2a 2a 20 65 78 69 73 74 73  If one.** exists
4930: 2c 20 65 78 74 72 61 63 74 20 74 68 65 20 33 32  , extract the 32
4940: 2d 62 69 74 20 6d 6f 64 69 66 69 63 61 74 69 6f  -bit modificatio
4950: 6e 2d 74 69 6d 65 73 74 61 6d 70 20 66 72 6f 6d  n-timestamp from
4960: 20 69 74 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a   it and store.**
4970: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 6f 75   the value in ou
4980: 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a  tput parameter *
4990: 70 6d 54 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 5a 65  pmTime..**.** Ze
49a0: 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ro is returned i
49b0: 66 20 6e 6f 20 65 78 74 72 61 2d 74 69 6d 65 73  f no extra-times
49c0: 74 61 6d 70 20 72 65 63 6f 72 64 20 63 6f 75 6c  tamp record coul
49d0: 64 20 62 65 20 66 6f 75 6e 64 20 28 61 6e 64 20  d be found (and 
49e0: 73 6f 0a 2a 2a 20 2a 70 6d 54 69 6d 65 20 69 73  so.** *pmTime is
49f0: 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 29   left unchanged)
4a00: 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 74  , or non-zero ot
4a10: 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  herwise..**.** T
4a20: 68 65 20 67 65 6e 65 72 61 6c 20 66 6f 72 6d 61  he general forma
4a30: 74 20 6f 66 20 61 6e 20 65 78 74 72 61 20 66 69  t of an extra fi
4a40: 65 6c 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  eld is:.**.**   
4a50: 48 65 61 64 65 72 20 49 44 20 20 20 20 32 20 62  Header ID    2 b
4a60: 79 74 65 73 0a 2a 2a 20 20 20 44 61 74 61 20 53  ytes.**   Data S
4a70: 69 7a 65 20 20 20 20 32 20 62 79 74 65 73 0a 2a  ize    2 bytes.*
4a80: 2a 20 20 20 44 61 74 61 20 20 20 20 20 20 20 20  *   Data        
4a90: 20 4e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74   N bytes.*/.stat
4aa0: 69 63 20 69 6e 74 20 7a 69 70 66 69 6c 65 53 63  ic int zipfileSc
4ab0: 61 6e 45 78 74 72 61 28 75 38 20 2a 61 45 78 74  anExtra(u8 *aExt
4ac0: 72 61 2c 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  ra, int nExtra, 
4ad0: 75 33 32 20 2a 70 6d 54 69 6d 65 29 7b 0a 20 20  u32 *pmTime){.  
4ae0: 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 20 20 75  int ret = 0;.  u
4af0: 38 20 2a 70 20 3d 20 61 45 78 74 72 61 3b 0a 20  8 *p = aExtra;. 
4b00: 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 61 45 78   u8 *pEnd = &aEx
4b10: 74 72 61 5b 6e 45 78 74 72 61 5d 3b 0a 0a 20 20  tra[nExtra];..  
4b20: 77 68 69 6c 65 28 20 70 3c 70 45 6e 64 20 29 7b  while( p<pEnd ){
4b30: 0a 20 20 20 20 75 31 36 20 69 64 20 3d 20 7a 69  .    u16 id = zi
4b40: 70 66 69 6c 65 52 65 61 64 31 36 28 70 29 3b 0a  pfileRead16(p);.
4b50: 20 20 20 20 75 31 36 20 6e 42 79 74 65 20 3d 20      u16 nByte = 
4b60: 7a 69 70 66 69 6c 65 52 65 61 64 31 36 28 70 29  zipfileRead16(p)
4b70: 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20 69  ;..    switch( i
4b80: 64 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  d ){.      case 
4b90: 5a 49 50 46 49 4c 45 5f 45 58 54 52 41 5f 54 49  ZIPFILE_EXTRA_TI
4ba0: 4d 45 53 54 41 4d 50 3a 20 7b 0a 20 20 20 20 20  MESTAMP: {.     
4bb0: 20 20 20 75 38 20 62 20 3d 20 70 5b 30 5d 3b 0a     u8 b = p[0];.
4bc0: 20 20 20 20 20 20 20 20 69 66 28 20 62 20 26 20          if( b & 
4bd0: 30 78 30 31 20 29 7b 20 20 20 20 20 2f 2a 20 30  0x01 ){     /* 0
4be0: 78 30 31 20 2d 3e 20 6d 6f 64 74 69 6d 65 20 69  x01 -> modtime i
4bf0: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 20  s present */.   
4c00: 20 20 20 20 20 20 20 2a 70 6d 54 69 6d 65 20 3d         *pmTime =
4c10: 20 7a 69 70 66 69 6c 65 47 65 74 55 33 32 28 26   zipfileGetU32(&
4c20: 70 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  p[1]);.         
4c30: 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20   ret = 1;.      
4c40: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
4c50: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
4c60: 0a 0a 20 20 20 20 70 20 2b 3d 20 6e 42 79 74 65  ..    p += nByte
4c70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4c80: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  et;.}../*.** Con
4c90: 76 65 72 74 20 74 68 65 20 73 74 61 6e 64 61 72  vert the standar
4ca0: 64 20 4d 53 2d 44 4f 53 20 74 69 6d 65 73 74 61  d MS-DOS timesta
4cb0: 6d 70 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  mp stored in the
4cc0: 20 6d 54 69 6d 65 20 61 6e 64 20 6d 44 61 74 65   mTime and mDate
4cd0: 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20 74 68  .** fields of th
4ce0: 65 20 43 44 53 20 73 74 72 75 63 74 75 72 65 20  e CDS structure 
4cf0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
4d00: 6c 79 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 61  ly argument to a
4d10: 20 33 32 2d 62 69 74 0a 2a 2a 20 55 4e 49 58 20   32-bit.** UNIX 
4d20: 73 65 63 6f 6e 64 73 2d 73 69 6e 63 65 2d 74 68  seconds-since-th
4d30: 65 2d 65 70 6f 63 68 20 74 69 6d 65 73 74 61 6d  e-epoch timestam
4d40: 70 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  p. Return the re
4d50: 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 22 53 74 61  sult..**.** "Sta
4d60: 6e 64 61 72 64 22 20 4d 53 2d 44 4f 53 20 74 69  ndard" MS-DOS ti
4d70: 6d 65 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  me format:.**.**
4d80: 20 20 20 46 69 6c 65 20 6d 6f 64 69 66 69 63 61     File modifica
4d90: 74 69 6f 6e 20 74 69 6d 65 3a 0a 2a 2a 20 20 20  tion time:.**   
4da0: 20 20 42 69 74 73 20 30 30 2d 30 34 3a 20 73 65    Bits 00-04: se
4db0: 63 6f 6e 64 73 20 64 69 76 69 64 65 64 20 62 79  conds divided by
4dc0: 20 32 0a 2a 2a 20 20 20 20 20 42 69 74 73 20 30   2.**     Bits 0
4dd0: 35 2d 31 30 3a 20 6d 69 6e 75 74 65 0a 2a 2a 20  5-10: minute.** 
4de0: 20 20 20 20 42 69 74 73 20 31 31 2d 31 35 3a 20      Bits 11-15: 
4df0: 68 6f 75 72 0a 2a 2a 20 20 20 46 69 6c 65 20 6d  hour.**   File m
4e00: 6f 64 69 66 69 63 61 74 69 6f 6e 20 64 61 74 65  odification date
4e10: 3a 0a 2a 2a 20 20 20 20 20 42 69 74 73 20 30 30  :.**     Bits 00
4e20: 2d 30 34 3a 20 64 61 79 0a 2a 2a 20 20 20 20 20  -04: day.**     
4e30: 42 69 74 73 20 30 35 2d 30 38 3a 20 6d 6f 6e 74  Bits 05-08: mont
4e40: 68 20 28 31 2d 31 32 29 0a 2a 2a 20 20 20 20 20  h (1-12).**     
4e50: 42 69 74 73 20 30 39 2d 31 35 3a 20 79 65 61 72  Bits 09-15: year
4e60: 73 20 66 72 6f 6d 20 31 39 38 30 20 0a 2a 2a 0a  s from 1980 .**.
4e70: 2a 2a 20 68 74 74 70 73 3a 2f 2f 6d 73 64 6e 2e  ** https://msdn.
4e80: 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 65 6e  microsoft.com/en
4e90: 2d 75 73 2f 6c 69 62 72 61 72 79 2f 39 6b 6b 66  -us/library/9kkf
4ea0: 39 74 61 68 2e 61 73 70 78 0a 2a 2f 0a 73 74 61  9tah.aspx.*/.sta
4eb0: 74 69 63 20 75 33 32 20 7a 69 70 66 69 6c 65 4d  tic u32 zipfileM
4ec0: 74 69 6d 65 28 5a 69 70 66 69 6c 65 43 44 53 20  time(ZipfileCDS 
4ed0: 2a 70 43 44 53 29 7b 0a 20 20 69 6e 74 20 59 20  *pCDS){.  int Y 
4ee0: 3d 20 28 31 39 38 30 20 2b 20 28 28 70 43 44 53  = (1980 + ((pCDS
4ef0: 2d 3e 6d 44 61 74 65 20 3e 3e 20 39 29 20 26 20  ->mDate >> 9) & 
4f00: 30 78 37 46 29 29 3b 0a 20 20 69 6e 74 20 4d 20  0x7F));.  int M 
4f10: 3d 20 28 28 70 43 44 53 2d 3e 6d 44 61 74 65 20  = ((pCDS->mDate 
4f20: 3e 3e 20 35 29 20 26 20 30 78 30 46 29 3b 0a 20  >> 5) & 0x0F);. 
4f30: 20 69 6e 74 20 44 20 3d 20 28 70 43 44 53 2d 3e   int D = (pCDS->
4f40: 6d 44 61 74 65 20 26 20 30 78 31 46 29 3b 0a 20  mDate & 0x1F);. 
4f50: 20 69 6e 74 20 42 20 3d 20 2d 31 33 3b 0a 0a 20   int B = -13;.. 
4f60: 20 69 6e 74 20 73 65 63 20 3d 20 28 70 43 44 53   int sec = (pCDS
4f70: 2d 3e 6d 54 69 6d 65 20 26 20 30 78 31 46 29 2a  ->mTime & 0x1F)*
4f80: 32 3b 0a 20 20 69 6e 74 20 6d 69 6e 20 3d 20 28  2;.  int min = (
4f90: 70 43 44 53 2d 3e 6d 54 69 6d 65 20 3e 3e 20 35  pCDS->mTime >> 5
4fa0: 29 20 26 20 30 78 33 46 3b 0a 20 20 69 6e 74 20  ) & 0x3F;.  int 
4fb0: 68 72 20 3d 20 28 70 43 44 53 2d 3e 6d 54 69 6d  hr = (pCDS->mTim
4fc0: 65 20 3e 3e 20 31 31 29 20 26 20 30 78 31 46 3b  e >> 11) & 0x1F;
4fd0: 0a 20 20 69 36 34 20 4a 44 3b 0a 0a 20 20 2f 2a  .  i64 JD;..  /*
4fe0: 20 4a 44 20 3d 20 49 4e 54 28 33 36 35 2e 32 35   JD = INT(365.25
4ff0: 20 2a 20 28 59 2b 34 37 31 36 29 29 20 2b 20 49   * (Y+4716)) + I
5000: 4e 54 28 33 30 2e 36 30 30 31 20 2a 20 28 4d 2b  NT(30.6001 * (M+
5010: 31 29 29 20 2b 20 44 20 2b 20 42 20 2d 20 31 35  1)) + D + B - 15
5020: 32 34 2e 35 20 2a 2f 0a 0a 20 20 2f 2a 20 43 61  24.5 */..  /* Ca
5030: 6c 63 75 6c 61 74 65 20 74 68 65 20 4a 44 20 69  lculate the JD i
5040: 6e 20 73 65 63 6f 6e 64 73 20 66 6f 72 20 6e 6f  n seconds for no
5050: 6f 6e 20 6f 6e 20 74 68 65 20 64 61 79 20 69 6e  on on the day in
5060: 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 69   question */.  i
5070: 66 28 20 4d 3c 33 20 29 7b 0a 20 20 20 20 59 20  f( M<3 ){.    Y 
5080: 3d 20 59 2d 31 3b 0a 20 20 20 20 4d 20 3d 20 4d  = Y-1;.    M = M
5090: 2b 31 32 3b 0a 20 20 7d 0a 20 20 4a 44 20 3d 20  +12;.  }.  JD = 
50a0: 28 69 36 34 29 28 32 34 2a 36 30 2a 36 30 29 20  (i64)(24*60*60) 
50b0: 2a 20 28 0a 20 20 20 20 20 20 28 69 6e 74 29 28  * (.      (int)(
50c0: 33 36 35 2e 32 35 20 2a 20 28 59 20 2b 20 34 37  365.25 * (Y + 47
50d0: 31 36 29 29 0a 20 20 20 20 2b 20 28 69 6e 74 29  16)).    + (int)
50e0: 28 33 30 2e 36 30 30 31 20 2a 20 28 4d 20 2b 20  (30.6001 * (M + 
50f0: 31 29 29 0a 20 20 20 20 2b 20 44 20 2b 20 42 20  1)).    + D + B 
5100: 2d 20 31 35 32 34 0a 20 20 29 3b 0a 0a 20 20 2f  - 1524.  );..  /
5110: 2a 20 43 6f 72 72 65 63 74 20 74 68 65 20 4a 44  * Correct the JD
5120: 20 66 6f 72 20 74 68 65 20 74 69 6d 65 20 77 69   for the time wi
5130: 74 68 69 6e 20 74 68 65 20 64 61 79 20 2a 2f 0a  thin the day */.
5140: 20 20 4a 44 20 2b 3d 20 28 68 72 2d 31 32 29 20    JD += (hr-12) 
5150: 2a 20 33 36 30 30 20 2b 20 6d 69 6e 20 2a 20 36  * 3600 + min * 6
5160: 30 20 2b 20 73 65 63 3b 0a 0a 20 20 2f 2a 20 43  0 + sec;..  /* C
5170: 6f 6e 76 65 72 74 20 4a 44 20 74 6f 20 75 6e 69  onvert JD to uni
5180: 78 20 74 69 6d 65 73 74 61 6d 70 20 28 74 68 65  x timestamp (the
5190: 20 4a 44 20 65 70 6f 63 68 20 69 73 20 32 34 34   JD epoch is 244
51a0: 30 35 38 37 2e 35 29 20 2a 2f 0a 20 20 72 65 74  0587.5) */.  ret
51b0: 75 72 6e 20 28 75 33 32 29 28 4a 44 20 2d 20 28  urn (u32)(JD - (
51c0: 69 36 34 29 28 32 34 34 30 35 38 37 35 29 20 2a  i64)(24405875) *
51d0: 20 32 34 2a 36 30 2a 36 29 3b 0a 7d 0a 0a 2f 2a   24*60*6);.}../*
51e0: 0a 2a 2a 20 54 68 65 20 6f 70 70 6f 73 69 74 65  .** The opposite
51f0: 20 6f 66 20 7a 69 70 66 69 6c 65 4d 74 69 6d 65   of zipfileMtime
5200: 28 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  (). This functio
5210: 6e 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20  n populates the 
5220: 6d 54 69 6d 65 20 61 6e 64 0a 2a 2a 20 6d 44 61  mTime and.** mDa
5230: 74 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  te fields of the
5240: 20 43 44 53 20 73 74 72 75 63 74 75 72 65 20 70   CDS structure p
5250: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
5260: 73 74 20 61 72 67 75 6d 65 6e 74 20 61 63 63 6f  st argument acco
5270: 72 64 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20  rding.** to the 
5280: 55 4e 49 58 20 74 69 6d 65 73 74 61 6d 70 20 76  UNIX timestamp v
5290: 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
52a0: 68 65 20 73 65 63 6f 6e 64 2e 0a 2a 2f 0a 73 74  he second..*/.st
52b0: 61 74 69 63 20 76 6f 69 64 20 7a 69 70 66 69 6c  atic void zipfil
52c0: 65 4d 74 69 6d 65 54 6f 44 6f 73 28 5a 69 70 66  eMtimeToDos(Zipf
52d0: 69 6c 65 43 44 53 20 2a 70 43 64 73 2c 20 75 33  ileCDS *pCds, u3
52e0: 32 20 6d 55 6e 69 78 54 69 6d 65 29 7b 0a 20 20  2 mUnixTime){.  
52f0: 2f 2a 20 43 6f 6e 76 65 72 74 20 75 6e 69 78 20  /* Convert unix 
5300: 74 69 6d 65 73 74 61 6d 70 20 74 6f 20 4a 44 20  timestamp to JD 
5310: 28 32 34 34 30 35 38 38 20 69 73 20 6e 6f 6f 6e  (2440588 is noon
5320: 20 6f 6e 20 31 2f 31 2f 31 39 37 30 29 20 2a 2f   on 1/1/1970) */
5330: 0a 20 20 69 36 34 20 4a 44 20 3d 20 28 69 36 34  .  i64 JD = (i64
5340: 29 32 34 34 30 35 38 38 20 2b 20 6d 55 6e 69 78  )2440588 + mUnix
5350: 54 69 6d 65 20 2f 20 28 32 34 2a 36 30 2a 36 30  Time / (24*60*60
5360: 29 3b 0a 0a 20 20 69 6e 74 20 41 2c 20 42 2c 20  );..  int A, B, 
5370: 43 2c 20 44 2c 20 45 3b 0a 20 20 69 6e 74 20 79  C, D, E;.  int y
5380: 72 2c 20 6d 6f 6e 2c 20 64 61 79 3b 0a 20 20 69  r, mon, day;.  i
5390: 6e 74 20 68 72 2c 20 6d 69 6e 2c 20 73 65 63 3b  nt hr, min, sec;
53a0: 0a 0a 20 20 41 20 3d 20 28 69 6e 74 29 28 28 4a  ..  A = (int)((J
53b0: 44 20 2d 20 31 38 36 37 32 31 36 2e 32 35 29 2f  D - 1867216.25)/
53c0: 33 36 35 32 34 2e 32 35 29 3b 0a 20 20 41 20 3d  36524.25);.  A =
53d0: 20 28 69 6e 74 29 28 4a 44 20 2b 20 31 20 2b 20   (int)(JD + 1 + 
53e0: 41 20 2d 20 28 41 2f 34 29 29 3b 0a 20 20 42 20  A - (A/4));.  B 
53f0: 3d 20 41 20 2b 20 31 35 32 34 3b 0a 20 20 43 20  = A + 1524;.  C 
5400: 3d 20 28 69 6e 74 29 28 28 42 20 2d 20 31 32 32  = (int)((B - 122
5410: 2e 31 29 2f 33 36 35 2e 32 35 29 3b 0a 20 20 44  .1)/365.25);.  D
5420: 20 3d 20 28 33 36 35 32 35 2a 28 43 26 33 32 37   = (36525*(C&327
5430: 36 37 29 29 2f 31 30 30 3b 0a 20 20 45 20 3d 20  67))/100;.  E = 
5440: 28 69 6e 74 29 28 28 42 2d 44 29 2f 33 30 2e 36  (int)((B-D)/30.6
5450: 30 30 31 29 3b 0a 0a 20 20 64 61 79 20 3d 20 42  001);..  day = B
5460: 20 2d 20 44 20 2d 20 28 69 6e 74 29 28 33 30 2e   - D - (int)(30.
5470: 36 30 30 31 2a 45 29 3b 0a 20 20 6d 6f 6e 20 3d  6001*E);.  mon =
5480: 20 28 45 3c 31 34 20 3f 20 45 2d 31 20 3a 20 45   (E<14 ? E-1 : E
5490: 2d 31 33 29 3b 0a 20 20 79 72 20 3d 20 6d 6f 6e  -13);.  yr = mon
54a0: 3e 32 20 3f 20 43 2d 34 37 31 36 20 3a 20 43 2d  >2 ? C-4716 : C-
54b0: 34 37 31 35 3b 0a 0a 20 20 68 72 20 3d 20 28 6d  4715;..  hr = (m
54c0: 55 6e 69 78 54 69 6d 65 20 25 20 28 32 34 2a 36  UnixTime % (24*6
54d0: 30 2a 36 30 29 29 20 2f 20 28 36 30 2a 36 30 29  0*60)) / (60*60)
54e0: 3b 0a 20 20 6d 69 6e 20 3d 20 28 6d 55 6e 69 78  ;.  min = (mUnix
54f0: 54 69 6d 65 20 25 20 28 36 30 2a 36 30 29 29 20  Time % (60*60)) 
5500: 2f 20 36 30 3b 0a 20 20 73 65 63 20 3d 20 28 6d  / 60;.  sec = (m
5510: 55 6e 69 78 54 69 6d 65 20 25 20 36 30 29 3b 0a  UnixTime % 60);.
5520: 0a 20 20 69 66 28 20 79 72 3e 3d 31 39 38 30 20  .  if( yr>=1980 
5530: 29 7b 0a 20 20 20 20 70 43 64 73 2d 3e 6d 44 61  ){.    pCds->mDa
5540: 74 65 20 3d 20 28 75 31 36 29 28 64 61 79 20 2b  te = (u16)(day +
5550: 20 28 6d 6f 6e 20 3c 3c 20 35 29 20 2b 20 28 28   (mon << 5) + ((
5560: 79 72 2d 31 39 38 30 29 20 3c 3c 20 39 29 29 3b  yr-1980) << 9));
5570: 0a 20 20 20 20 70 43 64 73 2d 3e 6d 54 69 6d 65  .    pCds->mTime
5580: 20 3d 20 28 75 31 36 29 28 73 65 63 2f 32 20 2b   = (u16)(sec/2 +
5590: 20 28 6d 69 6e 3c 3c 35 29 20 2b 20 28 68 72 3c   (min<<5) + (hr<
55a0: 3c 31 31 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  <11));.  }else{.
55b0: 20 20 20 20 70 43 64 73 2d 3e 6d 44 61 74 65 20      pCds->mDate 
55c0: 3d 20 70 43 64 73 2d 3e 6d 54 69 6d 65 20 3d 20  = pCds->mTime = 
55d0: 30 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  0;.  }..  assert
55e0: 28 20 6d 55 6e 69 78 54 69 6d 65 3c 33 31 35 35  ( mUnixTime<3155
55f0: 30 37 36 30 30 20 0a 20 20 20 20 20 20 20 7c 7c  07600 .       ||
5600: 20 6d 55 6e 69 78 54 69 6d 65 3d 3d 7a 69 70 66   mUnixTime==zipf
5610: 69 6c 65 4d 74 69 6d 65 28 70 43 64 73 29 20 0a  ileMtime(pCds) .
5620: 20 20 20 20 20 20 20 7c 7c 20 28 28 6d 55 6e 69         || ((mUni
5630: 78 54 69 6d 65 20 25 20 32 29 20 26 26 20 6d 55  xTime % 2) && mU
5640: 6e 69 78 54 69 6d 65 2d 31 3d 3d 7a 69 70 66 69  nixTime-1==zipfi
5650: 6c 65 4d 74 69 6d 65 28 70 43 64 73 29 29 20 0a  leMtime(pCds)) .
5660: 20 20 20 20 20 20 20 2f 2a 20 7c 7c 20 28 6d 55         /* || (mU
5670: 6e 69 78 54 69 6d 65 20 25 20 32 29 20 2a 2f 0a  nixTime % 2) */.
5680: 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66    );.}../*.** If
5690: 20 61 42 6c 6f 62 20 69 73 20 6e 6f 74 20 4e 55   aBlob is not NU
56a0: 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  LL, then it is a
56b0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
56c0: 66 66 65 72 20 28 6e 42 6c 6f 62 20 62 79 74 65  ffer (nBlob byte
56d0: 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 29 20 63 6f  s in.** size) co
56e0: 6e 74 61 69 6e 69 6e 67 20 61 6e 20 65 6e 74 69  ntaining an enti
56f0: 72 65 20 7a 69 70 20 61 72 63 68 69 76 65 20 69  re zip archive i
5700: 6d 61 67 65 2e 20 4f 72 2c 20 69 66 20 61 42 6c  mage. Or, if aBl
5710: 6f 62 20 69 73 20 4e 55 4c 4c 2c 0a 2a 2a 20 74  ob is NULL,.** t
5720: 68 65 6e 20 70 46 69 6c 65 20 69 73 20 61 20 66  hen pFile is a f
5730: 69 6c 65 2d 68 61 6e 64 6c 65 20 6f 70 65 6e 20  ile-handle open 
5740: 6f 6e 20 61 20 7a 69 70 20 66 69 6c 65 2e 20 49  on a zip file. I
5750: 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 74  n either case, t
5760: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
5770: 63 72 65 61 74 65 73 20 61 20 5a 69 70 66 69 6c  creates a Zipfil
5780: 65 45 6e 74 72 79 20 6f 62 6a 65 63 74 20 62 61  eEntry object ba
5790: 73 65 64 20 6f 6e 20 74 68 65 20 7a 69 70 20 61  sed on the zip a
57a0: 72 63 68 69 76 65 20 65 6e 74 72 79 0a 2a 2a 20  rchive entry.** 
57b0: 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 43 44  for which the CD
57c0: 53 20 72 65 63 6f 72 64 20 69 73 20 61 74 20 6f  S record is at o
57d0: 66 66 73 65 74 20 69 4f 66 66 2e 0a 2a 2a 0a 2a  ffset iOff..**.*
57e0: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
57f0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
5800: 74 75 72 6e 65 64 20 61 6e 64 20 28 2a 70 70 45  turned and (*ppE
5810: 6e 74 72 79 29 20 73 65 74 20 74 6f 20 70 6f 69  ntry) set to poi
5820: 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77  nt to.** the new
5830: 20 6f 62 6a 65 63 74 2e 20 4f 74 68 65 72 77 69   object. Otherwi
5840: 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  se, an SQLite er
5850: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
5860: 72 6e 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  rned and the.** 
5870: 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 28  final value of (
5880: 2a 70 70 45 6e 74 72 79 29 20 75 6e 64 65 66 69  *ppEntry) undefi
5890: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
58a0: 6e 74 20 7a 69 70 66 69 6c 65 47 65 74 45 6e 74  nt zipfileGetEnt
58b0: 72 79 28 0a 20 20 5a 69 70 66 69 6c 65 54 61 62  ry(.  ZipfileTab
58c0: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
58d0: 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 61        /* Store a
58e0: 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
58f0: 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
5900: 20 75 38 20 2a 61 42 6c 6f 62 2c 20 20 20 20 20   u8 *aBlob,     
5910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
5920: 69 6e 74 65 72 20 74 6f 20 69 6e 2d 6d 65 6d 6f  inter to in-memo
5930: 72 79 20 66 69 6c 65 20 69 6d 61 67 65 20 2a 2f  ry file image */
5940: 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 2c 20 20 20  .  int nBlob,   
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5960: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 42     /* Size of aB
5970: 6c 6f 62 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a  lob[] in bytes *
5980: 2f 0a 20 20 46 49 4c 45 20 2a 70 46 69 6c 65 2c  /.  FILE *pFile,
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59a0: 20 20 20 20 2f 2a 20 49 66 20 61 42 6c 6f 62 3d      /* If aBlob=
59b0: 3d 30 2c 20 72 65 61 64 20 66 72 6f 6d 20 74 68  =0, read from th
59c0: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  is file */.  i64
59d0: 20 69 4f 66 66 2c 20 20 20 20 20 20 20 20 20 20   iOff,          
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
59f0: 4f 66 66 73 65 74 20 6f 66 20 43 44 53 20 72 65  Offset of CDS re
5a00: 63 6f 72 64 20 2a 2f 0a 20 20 5a 69 70 66 69 6c  cord */.  Zipfil
5a10: 65 45 6e 74 72 79 20 2a 2a 70 70 45 6e 74 72 79  eEntry **ppEntry
5a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
5a30: 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77  : Pointer to new
5a40: 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
5a50: 75 38 20 2a 61 52 65 61 64 3b 0a 20 20 63 68 61  u8 *aRead;.  cha
5a60: 72 20 2a 2a 70 7a 45 72 72 20 3d 20 26 70 54 61  r **pzErr = &pTa
5a70: 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 3b  b->base.zErrMsg;
5a80: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
5a90: 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 61 42  TE_OK;..  if( aB
5aa0: 6c 6f 62 3d 3d 30 20 29 7b 0a 20 20 20 20 61 52  lob==0 ){.    aR
5ab0: 65 61 64 20 3d 20 70 54 61 62 2d 3e 61 42 75 66  ead = pTab->aBuf
5ac0: 66 65 72 3b 0a 20 20 20 20 72 63 20 3d 20 7a 69  fer;.    rc = zi
5ad0: 70 66 69 6c 65 52 65 61 64 44 61 74 61 28 70 46  pfileReadData(pF
5ae0: 69 6c 65 2c 20 61 52 65 61 64 2c 20 5a 49 50 46  ile, aRead, ZIPF
5af0: 49 4c 45 5f 43 44 53 5f 46 49 58 45 44 5f 53 5a  ILE_CDS_FIXED_SZ
5b00: 2c 20 69 4f 66 66 2c 20 70 7a 45 72 72 29 3b 0a  , iOff, pzErr);.
5b10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 52 65    }else{.    aRe
5b20: 61 64 20 3d 20 28 75 38 2a 29 26 61 42 6c 6f 62  ad = (u8*)&aBlob
5b30: 5b 69 4f 66 66 5d 3b 0a 20 20 7d 0a 0a 20 20 69  [iOff];.  }..  i
5b40: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5b50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
5b60: 69 6e 74 36 34 20 6e 41 6c 6c 6f 63 3b 0a 20 20  int64 nAlloc;.  
5b70: 20 20 5a 69 70 66 69 6c 65 45 6e 74 72 79 20 2a    ZipfileEntry *
5b80: 70 4e 65 77 3b 0a 0a 20 20 20 20 69 6e 74 20 6e  pNew;..    int n
5b90: 46 69 6c 65 20 3d 20 7a 69 70 66 69 6c 65 47 65  File = zipfileGe
5ba0: 74 55 31 36 28 26 61 52 65 61 64 5b 5a 49 50 46  tU16(&aRead[ZIPF
5bb0: 49 4c 45 5f 43 44 53 5f 4e 46 49 4c 45 5f 4f 46  ILE_CDS_NFILE_OF
5bc0: 46 5d 29 3b 0a 20 20 20 20 69 6e 74 20 6e 45 78  F]);.    int nEx
5bd0: 74 72 61 20 3d 20 7a 69 70 66 69 6c 65 47 65 74  tra = zipfileGet
5be0: 55 31 36 28 26 61 52 65 61 64 5b 5a 49 50 46 49  U16(&aRead[ZIPFI
5bf0: 4c 45 5f 43 44 53 5f 4e 46 49 4c 45 5f 4f 46 46  LE_CDS_NFILE_OFF
5c00: 2b 32 5d 29 3b 0a 20 20 20 20 6e 45 78 74 72 61  +2]);.    nExtra
5c10: 20 2b 3d 20 7a 69 70 66 69 6c 65 47 65 74 55 31   += zipfileGetU1
5c20: 36 28 26 61 52 65 61 64 5b 5a 49 50 46 49 4c 45  6(&aRead[ZIPFILE
5c30: 5f 43 44 53 5f 4e 46 49 4c 45 5f 4f 46 46 2b 34  _CDS_NFILE_OFF+4
5c40: 5d 29 3b 0a 0a 20 20 20 20 6e 41 6c 6c 6f 63 20  ]);..    nAlloc 
5c50: 3d 20 73 69 7a 65 6f 66 28 5a 69 70 66 69 6c 65  = sizeof(Zipfile
5c60: 45 6e 74 72 79 29 20 2b 20 6e 45 78 74 72 61 3b  Entry) + nExtra;
5c70: 0a 20 20 20 20 69 66 28 20 61 42 6c 6f 62 20 29  .    if( aBlob )
5c80: 7b 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b  {.      nAlloc +
5c90: 3d 20 7a 69 70 66 69 6c 65 47 65 74 55 33 32 28  = zipfileGetU32(
5ca0: 26 61 52 65 61 64 5b 5a 49 50 46 49 4c 45 5f 43  &aRead[ZIPFILE_C
5cb0: 44 53 5f 53 5a 43 4f 4d 50 52 45 53 53 45 44 5f  DS_SZCOMPRESSED_
5cc0: 4f 46 46 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  OFF]);.    }..  
5cd0: 20 20 70 4e 65 77 20 3d 20 28 5a 69 70 66 69 6c    pNew = (Zipfil
5ce0: 65 45 6e 74 72 79 2a 29 73 71 6c 69 74 65 33 5f  eEntry*)sqlite3_
5cf0: 6d 61 6c 6c 6f 63 36 34 28 6e 41 6c 6c 6f 63 29  malloc64(nAlloc)
5d00: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
5d10: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
5d20: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5d30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
5d40: 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
5d50: 69 7a 65 6f 66 28 5a 69 70 66 69 6c 65 45 6e 74  izeof(ZipfileEnt
5d60: 72 79 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ry));.      rc =
5d70: 20 7a 69 70 66 69 6c 65 52 65 61 64 43 44 53 28   zipfileReadCDS(
5d80: 61 52 65 61 64 2c 20 26 70 4e 65 77 2d 3e 63 64  aRead, &pNew->cd
5d90: 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
5da0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
5db0: 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20         *pzErr = 
5dc0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
5dd0: 22 66 61 69 6c 65 64 20 74 6f 20 72 65 61 64 20  "failed to read 
5de0: 43 44 53 20 61 74 20 6f 66 66 73 65 74 20 25 6c  CDS at offset %l
5df0: 6c 64 22 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20  ld", iOff);.    
5e00: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 42 6c 6f    }else if( aBlo
5e10: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
5e20: 72 63 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64  rc = zipfileRead
5e30: 44 61 74 61 28 0a 20 20 20 20 20 20 20 20 20 20  Data(.          
5e40: 20 20 70 46 69 6c 65 2c 20 61 52 65 61 64 2c 20    pFile, aRead, 
5e50: 6e 45 78 74 72 61 2b 6e 46 69 6c 65 2c 20 69 4f  nExtra+nFile, iO
5e60: 66 66 2b 5a 49 50 46 49 4c 45 5f 43 44 53 5f 46  ff+ZIPFILE_CDS_F
5e70: 49 58 45 44 5f 53 5a 2c 20 70 7a 45 72 72 0a 20  IXED_SZ, pzErr. 
5e80: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
5e90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
5ea0: 52 65 61 64 20 3d 20 28 75 38 2a 29 26 61 42 6c  Read = (u8*)&aBl
5eb0: 6f 62 5b 69 4f 66 66 20 2b 20 5a 49 50 46 49 4c  ob[iOff + ZIPFIL
5ec0: 45 5f 43 44 53 5f 46 49 58 45 44 5f 53 5a 5d 3b  E_CDS_FIXED_SZ];
5ed0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
5ee0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
5ef0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
5f00: 33 32 20 2a 70 74 20 3d 20 26 70 4e 65 77 2d 3e  32 *pt = &pNew->
5f10: 6d 55 6e 69 78 54 69 6d 65 3b 0a 20 20 20 20 20  mUnixTime;.     
5f20: 20 70 4e 65 77 2d 3e 63 64 73 2e 7a 46 69 6c 65   pNew->cds.zFile
5f30: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
5f40: 74 66 28 22 25 2e 2a 73 22 2c 20 6e 46 69 6c 65  tf("%.*s", nFile
5f50: 2c 20 61 52 65 61 64 29 3b 20 0a 20 20 20 20 20  , aRead); .     
5f60: 20 70 4e 65 77 2d 3e 61 45 78 74 72 61 20 3d 20   pNew->aExtra = 
5f70: 28 75 38 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  (u8*)&pNew[1];. 
5f80: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77       memcpy(pNew
5f90: 2d 3e 61 45 78 74 72 61 2c 20 26 61 52 65 61 64  ->aExtra, &aRead
5fa0: 5b 6e 46 69 6c 65 5d 2c 20 6e 45 78 74 72 61 29  [nFile], nExtra)
5fb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
5fc0: 2d 3e 63 64 73 2e 7a 46 69 6c 65 3d 3d 30 20 29  ->cds.zFile==0 )
5fd0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
5fe0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5ff0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d     }else if( 0==
6000: 7a 69 70 66 69 6c 65 53 63 61 6e 45 78 74 72 61  zipfileScanExtra
6010: 28 26 61 52 65 61 64 5b 6e 46 69 6c 65 5d 2c 20  (&aRead[nFile], 
6020: 70 4e 65 77 2d 3e 63 64 73 2e 6e 45 78 74 72 61  pNew->cds.nExtra
6030: 2c 20 70 74 29 20 29 7b 0a 20 20 20 20 20 20 20  , pt) ){.       
6040: 20 70 4e 65 77 2d 3e 6d 55 6e 69 78 54 69 6d 65   pNew->mUnixTime
6050: 20 3d 20 7a 69 70 66 69 6c 65 4d 74 69 6d 65 28   = zipfileMtime(
6060: 26 70 4e 65 77 2d 3e 63 64 73 29 3b 0a 20 20 20  &pNew->cds);.   
6070: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
6080: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6090: 4b 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69  K ){.      stati
60a0: 63 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a 46 69  c const int szFi
60b0: 78 20 3d 20 5a 49 50 46 49 4c 45 5f 4c 46 48 5f  x = ZIPFILE_LFH_
60c0: 46 49 58 45 44 5f 53 5a 3b 0a 20 20 20 20 20 20  FIXED_SZ;.      
60d0: 5a 69 70 66 69 6c 65 4c 46 48 20 6c 66 68 3b 0a  ZipfileLFH lfh;.
60e0: 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 20        if( pFile 
60f0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
6100: 7a 69 70 66 69 6c 65 52 65 61 64 44 61 74 61 28  zipfileReadData(
6110: 70 46 69 6c 65 2c 20 61 52 65 61 64 2c 20 73 7a  pFile, aRead, sz
6120: 46 69 78 2c 20 70 4e 65 77 2d 3e 63 64 73 2e 69  Fix, pNew->cds.i
6130: 4f 66 66 73 65 74 2c 20 70 7a 45 72 72 29 3b 0a  Offset, pzErr);.
6140: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6150: 20 20 20 20 20 61 52 65 61 64 20 3d 20 28 75 38       aRead = (u8
6160: 2a 29 26 61 42 6c 6f 62 5b 70 4e 65 77 2d 3e 63  *)&aBlob[pNew->c
6170: 64 73 2e 69 4f 66 66 73 65 74 5d 3b 0a 20 20 20  ds.iOffset];.   
6180: 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d     }..      rc =
6190: 20 7a 69 70 66 69 6c 65 52 65 61 64 4c 46 48 28   zipfileReadLFH(
61a0: 61 52 65 61 64 2c 20 26 6c 66 68 29 3b 0a 20 20  aRead, &lfh);.  
61b0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
61c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
61d0: 20 70 4e 65 77 2d 3e 69 44 61 74 61 4f 66 66 20   pNew->iDataOff 
61e0: 3d 20 20 70 4e 65 77 2d 3e 63 64 73 2e 69 4f 66  =  pNew->cds.iOf
61f0: 66 73 65 74 20 2b 20 5a 49 50 46 49 4c 45 5f 4c  fset + ZIPFILE_L
6200: 46 48 5f 46 49 58 45 44 5f 53 5a 3b 0a 20 20 20  FH_FIXED_SZ;.   
6210: 20 20 20 20 20 70 4e 65 77 2d 3e 69 44 61 74 61       pNew->iData
6220: 4f 66 66 20 2b 3d 20 6c 66 68 2e 6e 46 69 6c 65  Off += lfh.nFile
6230: 20 2b 20 6c 66 68 2e 6e 45 78 74 72 61 3b 0a 20   + lfh.nExtra;. 
6240: 20 20 20 20 20 20 20 69 66 28 20 61 42 6c 6f 62         if( aBlob
6250: 20 26 26 20 70 4e 65 77 2d 3e 63 64 73 2e 73 7a   && pNew->cds.sz
6260: 43 6f 6d 70 72 65 73 73 65 64 20 29 7b 0a 20 20  Compressed ){.  
6270: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 44          pNew->aD
6280: 61 74 61 20 3d 20 26 70 4e 65 77 2d 3e 61 45 78  ata = &pNew->aEx
6290: 74 72 61 5b 6e 45 78 74 72 61 5d 3b 0a 20 20 20  tra[nExtra];.   
62a0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e         memcpy(pN
62b0: 65 77 2d 3e 61 44 61 74 61 2c 20 26 61 42 6c 6f  ew->aData, &aBlo
62c0: 62 5b 70 4e 65 77 2d 3e 69 44 61 74 61 4f 66 66  b[pNew->iDataOff
62d0: 5d 2c 20 70 4e 65 77 2d 3e 63 64 73 2e 73 7a 43  ], pNew->cds.szC
62e0: 6f 6d 70 72 65 73 73 65 64 29 3b 0a 20 20 20 20  ompressed);.    
62f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
6300: 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  e{.        *pzEr
6310: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
6320: 6e 74 66 28 22 66 61 69 6c 65 64 20 74 6f 20 72  ntf("failed to r
6330: 65 61 64 20 4c 46 48 20 61 74 20 6f 66 66 73 65  ead LFH at offse
6340: 74 20 25 64 22 2c 20 0a 20 20 20 20 20 20 20 20  t %d", .        
6350: 20 20 20 20 28 69 6e 74 29 70 4e 65 77 2d 3e 63      (int)pNew->c
6360: 64 73 2e 69 4f 66 66 73 65 74 0a 20 20 20 20 20  ds.iOffset.     
6370: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
6380: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21    }..    if( rc!
6390: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
63a0: 20 20 20 20 7a 69 70 66 69 6c 65 45 6e 74 72 79      zipfileEntry
63b0: 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  Free(pNew);.    
63c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70  }else{.      *pp
63d0: 45 6e 74 72 79 20 3d 20 70 4e 65 77 3b 0a 20 20  Entry = pNew;.  
63e0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
63f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
6400: 64 76 61 6e 63 65 20 61 6e 20 5a 69 70 66 69 6c  dvance an Zipfil
6410: 65 43 73 72 20 74 6f 20 69 74 73 20 6e 65 78 74  eCsr to its next
6420: 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 0a   row of output..
6430: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 69  */.static int zi
6440: 70 66 69 6c 65 4e 65 78 74 28 73 71 6c 69 74 65  pfileNext(sqlite
6450: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
6460: 75 72 29 7b 0a 20 20 5a 69 70 66 69 6c 65 43 73  ur){.  ZipfileCs
6470: 72 20 2a 70 43 73 72 20 3d 20 28 5a 69 70 66 69  r *pCsr = (Zipfi
6480: 6c 65 43 73 72 2a 29 63 75 72 3b 0a 20 20 69 6e  leCsr*)cur;.  in
6490: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
64a0: 3b 0a 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 70  ;..  if( pCsr->p
64b0: 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 36 34 20  File ){.    i64 
64c0: 69 45 6f 66 20 3d 20 70 43 73 72 2d 3e 65 6f 63  iEof = pCsr->eoc
64d0: 64 2e 69 4f 66 66 73 65 74 20 2b 20 70 43 73 72  d.iOffset + pCsr
64e0: 2d 3e 65 6f 63 64 2e 6e 53 69 7a 65 3b 0a 20 20  ->eocd.nSize;.  
64f0: 20 20 7a 69 70 66 69 6c 65 45 6e 74 72 79 46 72    zipfileEntryFr
6500: 65 65 28 70 43 73 72 2d 3e 70 43 75 72 72 65 6e  ee(pCsr->pCurren
6510: 74 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70 43  t);.    pCsr->pC
6520: 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  urrent = 0;.    
6530: 69 66 28 20 70 43 73 72 2d 3e 69 4e 65 78 74 4f  if( pCsr->iNextO
6540: 66 66 3e 3d 69 45 6f 66 20 29 7b 0a 20 20 20 20  ff>=iEof ){.    
6550: 20 20 70 43 73 72 2d 3e 62 45 6f 66 20 3d 20 31    pCsr->bEof = 1
6560: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6570: 20 20 20 5a 69 70 66 69 6c 65 45 6e 74 72 79 20     ZipfileEntry 
6580: 2a 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 5a 69  *p = 0;.      Zi
6590: 70 66 69 6c 65 54 61 62 20 2a 70 54 61 62 20 3d  pfileTab *pTab =
65a0: 20 28 5a 69 70 66 69 6c 65 54 61 62 2a 29 28 63   (ZipfileTab*)(c
65b0: 75 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 20 20  ur->pVtab);.    
65c0: 20 20 72 63 20 3d 20 7a 69 70 66 69 6c 65 47 65    rc = zipfileGe
65d0: 74 45 6e 74 72 79 28 70 54 61 62 2c 20 30 2c 20  tEntry(pTab, 0, 
65e0: 30 2c 20 70 43 73 72 2d 3e 70 46 69 6c 65 2c 20  0, pCsr->pFile, 
65f0: 70 43 73 72 2d 3e 69 4e 65 78 74 4f 66 66 2c 20  pCsr->iNextOff, 
6600: 26 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  &p);.      if( r
6610: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6620: 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 69 4e          pCsr->iN
6630: 65 78 74 4f 66 66 20 2b 3d 20 5a 49 50 46 49 4c  extOff += ZIPFIL
6640: 45 5f 43 44 53 5f 46 49 58 45 44 5f 53 5a 3b 0a  E_CDS_FIXED_SZ;.
6650: 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 69 4e          pCsr->iN
6660: 65 78 74 4f 66 66 20 2b 3d 20 28 69 6e 74 29 70  extOff += (int)p
6670: 2d 3e 63 64 73 2e 6e 45 78 74 72 61 20 2b 20 70  ->cds.nExtra + p
6680: 2d 3e 63 64 73 2e 6e 46 69 6c 65 20 2b 20 70 2d  ->cds.nFile + p-
6690: 3e 63 64 73 2e 6e 43 6f 6d 6d 65 6e 74 3b 0a 20  >cds.nComment;. 
66a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 73       }.      pCs
66b0: 72 2d 3e 70 43 75 72 72 65 6e 74 20 3d 20 70 3b  r->pCurrent = p;
66c0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
66d0: 20 20 20 20 69 66 28 20 21 70 43 73 72 2d 3e 62      if( !pCsr->b
66e0: 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 70 43  Noop ){.      pC
66f0: 73 72 2d 3e 70 43 75 72 72 65 6e 74 20 3d 20 70  sr->pCurrent = p
6700: 43 73 72 2d 3e 70 43 75 72 72 65 6e 74 2d 3e 70  Csr->pCurrent->p
6710: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
6720: 69 66 28 20 70 43 73 72 2d 3e 70 43 75 72 72 65  if( pCsr->pCurre
6730: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  nt==0 ){.      p
6740: 43 73 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20  Csr->bEof = 1;. 
6750: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 73 72     }.  }..  pCsr
6760: 2d 3e 62 4e 6f 6f 70 20 3d 20 30 3b 0a 20 20 72  ->bNoop = 0;.  r
6770: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
6780: 74 69 63 20 76 6f 69 64 20 7a 69 70 66 69 6c 65  tic void zipfile
6790: 46 72 65 65 28 76 6f 69 64 20 2a 70 29 20 7b 20  Free(void *p) { 
67a0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
67b0: 70 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75  p); .}../*.** Bu
67c0: 66 66 65 72 20 61 49 6e 20 28 73 69 7a 65 20 6e  ffer aIn (size n
67d0: 49 6e 20 62 79 74 65 73 29 20 63 6f 6e 74 61 69  In bytes) contai
67e0: 6e 73 20 63 6f 6d 70 72 65 73 73 65 64 20 64 61  ns compressed da
67f0: 74 61 2e 20 55 6e 63 6f 6d 70 72 65 73 73 65 64  ta. Uncompressed
6800: 2c 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 69 73  , the.** size is
6810: 20 6e 4f 75 74 20 62 79 74 65 73 2e 20 54 68 69   nOut bytes. Thi
6820: 73 20 66 75 6e 63 74 69 6f 6e 20 75 6e 63 6f 6d  s function uncom
6830: 70 72 65 73 73 65 73 20 74 68 65 20 64 61 74 61  presses the data
6840: 20 61 6e 64 20 73 65 74 73 20 74 68 65 0a 2a 2a   and sets the.**
6850: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
6860: 20 63 6f 6e 74 65 78 74 20 70 43 74 78 20 74 6f   context pCtx to
6870: 20 74 68 65 20 72 65 73 75 6c 74 20 28 61 20 62   the result (a b
6880: 6c 6f 62 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  lob)..**.** If a
6890: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
68a0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
68b0: 20 6c 65 66 74 20 69 6e 20 70 43 74 78 20 69 6e   left in pCtx in
68c0: 73 74 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  stead..*/.static
68d0: 20 76 6f 69 64 20 7a 69 70 66 69 6c 65 49 6e 66   void zipfileInf
68e0: 6c 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  late(.  sqlite3_
68f0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20  context *pCtx,  
6900: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
6910: 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
6920: 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e 2c    const u8 *aIn,
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6940: 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 65 64 20    /* Compressed 
6950: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 49  data */.  int nI
6960: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
6970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
6980: 65 20 6f 66 20 62 75 66 66 65 72 20 61 49 6e 5b  e of buffer aIn[
6990: 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  ] in bytes */.  
69a0: 69 6e 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20  int nOut        
69b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69c0: 2f 2a 20 45 78 70 65 63 74 65 64 20 6f 75 74 70  /* Expected outp
69d0: 75 74 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20  ut size */.){.  
69e0: 75 38 20 2a 61 52 65 73 20 3d 20 73 71 6c 69 74  u8 *aRes = sqlit
69f0: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4f 75 74 29 3b  e3_malloc(nOut);
6a00: 0a 20 20 69 66 28 20 61 52 65 73 3d 3d 30 20 29  .  if( aRes==0 )
6a10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
6a20: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
6a30: 28 70 43 74 78 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCtx);.  }else{
6a40: 0a 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20  .    int err;.  
6a50: 20 20 7a 5f 73 74 72 65 61 6d 20 73 74 72 3b 0a    z_stream str;.
6a60: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 74 72 2c      memset(&str,
6a70: 20 30 2c 20 73 69 7a 65 6f 66 28 73 74 72 29 29   0, sizeof(str))
6a80: 3b 0a 0a 20 20 20 20 73 74 72 2e 6e 65 78 74 5f  ;..    str.next_
6a90: 69 6e 20 3d 20 28 42 79 74 65 2a 29 61 49 6e 3b  in = (Byte*)aIn;
6aa0: 0a 20 20 20 20 73 74 72 2e 61 76 61 69 6c 5f 69  .    str.avail_i
6ab0: 6e 20 3d 20 6e 49 6e 3b 0a 20 20 20 20 73 74 72  n = nIn;.    str
6ac0: 2e 6e 65 78 74 5f 6f 75 74 20 3d 20 28 42 79 74  .next_out = (Byt
6ad0: 65 2a 29 61 52 65 73 3b 0a 20 20 20 20 73 74 72  e*)aRes;.    str
6ae0: 2e 61 76 61 69 6c 5f 6f 75 74 20 3d 20 6e 4f 75  .avail_out = nOu
6af0: 74 3b 0a 0a 20 20 20 20 65 72 72 20 3d 20 69 6e  t;..    err = in
6b00: 66 6c 61 74 65 49 6e 69 74 32 28 26 73 74 72 2c  flateInit2(&str,
6b10: 20 2d 31 35 29 3b 0a 20 20 20 20 69 66 28 20 65   -15);.    if( e
6b20: 72 72 21 3d 5a 5f 4f 4b 20 29 7b 0a 20 20 20 20  rr!=Z_OK ){.    
6b30: 20 20 7a 69 70 66 69 6c 65 43 74 78 45 72 72 6f    zipfileCtxErro
6b40: 72 4d 73 67 28 70 43 74 78 2c 20 22 69 6e 66 6c  rMsg(pCtx, "infl
6b50: 61 74 65 49 6e 69 74 32 28 29 20 66 61 69 6c 65  ateInit2() faile
6b60: 64 20 28 25 64 29 22 2c 20 65 72 72 29 3b 0a 20  d (%d)", err);. 
6b70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6b80: 65 72 72 20 3d 20 69 6e 66 6c 61 74 65 28 26 73  err = inflate(&s
6b90: 74 72 2c 20 5a 5f 4e 4f 5f 46 4c 55 53 48 29 3b  tr, Z_NO_FLUSH);
6ba0: 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 21 3d  .      if( err!=
6bb0: 5a 5f 53 54 52 45 41 4d 5f 45 4e 44 20 29 7b 0a  Z_STREAM_END ){.
6bc0: 20 20 20 20 20 20 20 20 7a 69 70 66 69 6c 65 43          zipfileC
6bd0: 74 78 45 72 72 6f 72 4d 73 67 28 70 43 74 78 2c  txErrorMsg(pCtx,
6be0: 20 22 69 6e 66 6c 61 74 65 28 29 20 66 61 69 6c   "inflate() fail
6bf0: 65 64 20 28 25 64 29 22 2c 20 65 72 72 29 3b 0a  ed (%d)", err);.
6c00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6c10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
6c20: 75 6c 74 5f 62 6c 6f 62 28 70 43 74 78 2c 20 61  ult_blob(pCtx, a
6c30: 52 65 73 2c 20 6e 4f 75 74 2c 20 7a 69 70 66 69  Res, nOut, zipfi
6c40: 6c 65 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20  leFree);.       
6c50: 20 61 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20   aRes = 0;.     
6c60: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
6c70: 69 74 65 33 5f 66 72 65 65 28 61 52 65 73 29 3b  ite3_free(aRes);
6c80: 0a 20 20 20 20 69 6e 66 6c 61 74 65 45 6e 64 28  .    inflateEnd(
6c90: 26 73 74 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  &str);.  }.}../*
6ca0: 0a 2a 2a 20 42 75 66 66 65 72 20 61 49 6e 20 28  .** Buffer aIn (
6cb0: 73 69 7a 65 20 6e 49 6e 20 62 79 74 65 73 29 20  size nIn bytes) 
6cc0: 63 6f 6e 74 61 69 6e 73 20 75 6e 63 6f 6d 70 72  contains uncompr
6cd0: 65 73 73 65 64 20 64 61 74 61 2e 20 54 68 69 73  essed data. This
6ce0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d   function.** com
6cf0: 70 72 65 73 73 65 73 20 69 74 20 61 6e 64 20 73  presses it and s
6d00: 65 74 73 20 28 2a 70 70 4f 75 74 29 20 74 6f 20  ets (*ppOut) to 
6d10: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
6d20: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
6d30: 0a 2a 2a 20 63 6f 6d 70 72 65 73 73 65 64 20 64  .** compressed d
6d40: 61 74 61 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ata. The caller 
6d50: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
6d60: 6f 72 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61  or eventually ca
6d70: 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
6d80: 5f 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65 61  _free() to relea
6d90: 73 65 20 62 75 66 66 65 72 20 28 2a 70 70 4f 75  se buffer (*ppOu
6da0: 74 29 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72  t). Before retur
6db0: 6e 69 6e 67 2c 20 28 2a 70 6e 4f 75 74 29 20 0a  ning, (*pnOut) .
6dc0: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
6dd0: 20 73 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   size of buffer 
6de0: 28 2a 70 70 4f 75 74 29 20 69 6e 20 62 79 74 65  (*ppOut) in byte
6df0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65  s..**.** If no e
6e00: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
6e10: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
6e20: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ed. Otherwise, a
6e30: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a  n SQLite error.*
6e40: 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  * code is return
6e50: 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ed and an error 
6e60: 6d 65 73 73 61 67 65 20 6c 65 66 74 20 69 6e 20  message left in 
6e70: 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 68 61  virtual-table ha
6e80: 6e 64 6c 65 0a 2a 2a 20 70 54 61 62 2e 20 54 68  ndle.** pTab. Th
6e90: 65 20 76 61 6c 75 65 73 20 6f 66 20 28 2a 70 70  e values of (*pp
6ea0: 4f 75 74 29 20 61 6e 64 20 28 2a 70 6e 4f 75 74  Out) and (*pnOut
6eb0: 29 20 61 72 65 20 6c 65 66 74 20 75 6e 63 68 61  ) are left uncha
6ec0: 6e 67 65 64 20 69 6e 20 74 68 69 73 0a 2a 2a 20  nged in this.** 
6ed0: 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
6ee0: 69 6e 74 20 7a 69 70 66 69 6c 65 44 65 66 6c 61  int zipfileDefla
6ef0: 74 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  te(.  const u8 *
6f00: 61 49 6e 2c 20 69 6e 74 20 6e 49 6e 2c 20 20 20  aIn, int nIn,   
6f10: 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 2a        /* Input *
6f20: 2f 0a 20 20 75 38 20 2a 2a 70 70 4f 75 74 2c 20  /.  u8 **ppOut, 
6f30: 69 6e 74 20 2a 70 6e 4f 75 74 2c 20 20 20 20 20  int *pnOut,     
6f40: 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 2a 2f      /* Output */
6f50: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20  .  char **pzErr 
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f70: 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72     /* OUT: Error
6f80: 20 6d 65 73 73 61 67 65 20 2a 2f 0a 29 7b 0a 20   message */.){. 
6f90: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
6fa0: 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  _OK;.  sqlite3_i
6fb0: 6e 74 36 34 20 6e 41 6c 6c 6f 63 3b 0a 20 20 7a  nt64 nAlloc;.  z
6fc0: 5f 73 74 72 65 61 6d 20 73 74 72 3b 0a 20 20 75  _stream str;.  u
6fd0: 38 20 2a 61 4f 75 74 3b 0a 0a 20 20 6d 65 6d 73  8 *aOut;..  mems
6fe0: 65 74 28 26 73 74 72 2c 20 30 2c 20 73 69 7a 65  et(&str, 0, size
6ff0: 6f 66 28 73 74 72 29 29 3b 0a 20 20 73 74 72 2e  of(str));.  str.
7000: 6e 65 78 74 5f 69 6e 20 3d 20 28 42 79 74 65 66  next_in = (Bytef
7010: 2a 29 61 49 6e 3b 0a 20 20 73 74 72 2e 61 76 61  *)aIn;.  str.ava
7020: 69 6c 5f 69 6e 20 3d 20 6e 49 6e 3b 0a 20 20 64  il_in = nIn;.  d
7030: 65 66 6c 61 74 65 49 6e 69 74 32 28 26 73 74 72  eflateInit2(&str
7040: 2c 20 39 2c 20 5a 5f 44 45 46 4c 41 54 45 44 2c  , 9, Z_DEFLATED,
7050: 20 2d 31 35 2c 20 38 2c 20 5a 5f 44 45 46 41 55   -15, 8, Z_DEFAU
7060: 4c 54 5f 53 54 52 41 54 45 47 59 29 3b 0a 0a 20  LT_STRATEGY);.. 
7070: 20 6e 41 6c 6c 6f 63 20 3d 20 64 65 66 6c 61 74   nAlloc = deflat
7080: 65 42 6f 75 6e 64 28 26 73 74 72 2c 20 6e 49 6e  eBound(&str, nIn
7090: 29 3b 0a 20 20 61 4f 75 74 20 3d 20 28 75 38 2a  );.  aOut = (u8*
70a0: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36  )sqlite3_malloc6
70b0: 34 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20 69 66 28  4(nAlloc);.  if(
70c0: 20 61 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20   aOut==0 ){.    
70d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
70e0: 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
70f0: 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 73 74 72  int res;.    str
7100: 2e 6e 65 78 74 5f 6f 75 74 20 3d 20 61 4f 75 74  .next_out = aOut
7110: 3b 0a 20 20 20 20 73 74 72 2e 61 76 61 69 6c 5f  ;.    str.avail_
7120: 6f 75 74 20 3d 20 6e 41 6c 6c 6f 63 3b 0a 20 20  out = nAlloc;.  
7130: 20 20 64 65 66 6c 61 74 65 49 6e 69 74 32 28 26    deflateInit2(&
7140: 73 74 72 2c 20 39 2c 20 5a 5f 44 45 46 4c 41 54  str, 9, Z_DEFLAT
7150: 45 44 2c 20 2d 31 35 2c 20 38 2c 20 5a 5f 44 45  ED, -15, 8, Z_DE
7160: 46 41 55 4c 54 5f 53 54 52 41 54 45 47 59 29 3b  FAULT_STRATEGY);
7170: 0a 20 20 20 20 72 65 73 20 3d 20 64 65 66 6c 61  .    res = defla
7180: 74 65 28 26 73 74 72 2c 20 5a 5f 46 49 4e 49 53  te(&str, Z_FINIS
7190: 48 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3d  H);.    if( res=
71a0: 3d 5a 5f 53 54 52 45 41 4d 5f 45 4e 44 20 29 7b  =Z_STREAM_END ){
71b0: 0a 20 20 20 20 20 20 2a 70 70 4f 75 74 20 3d 20  .      *ppOut = 
71c0: 61 4f 75 74 3b 0a 20 20 20 20 20 20 2a 70 6e 4f  aOut;.      *pnO
71d0: 75 74 20 3d 20 28 69 6e 74 29 73 74 72 2e 74 6f  ut = (int)str.to
71e0: 74 61 6c 5f 6f 75 74 3b 0a 20 20 20 20 7d 65 6c  tal_out;.    }el
71f0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
7200: 33 5f 66 72 65 65 28 61 4f 75 74 29 3b 0a 20 20  3_free(aOut);.  
7210: 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
7220: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69  ite3_mprintf("zi
7230: 70 66 69 6c 65 3a 20 64 65 66 6c 61 74 65 28 29  pfile: deflate()
7240: 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20   error");.      
7250: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
7260: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  R;.    }.    def
7270: 6c 61 74 65 45 6e 64 28 26 73 74 72 29 3b 0a 20  lateEnd(&str);. 
7280: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
7290: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
72a0: 6e 20 76 61 6c 75 65 73 20 6f 66 20 63 6f 6c 75  n values of colu
72b0: 6d 6e 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20  mns for the row 
72c0: 61 74 20 77 68 69 63 68 20 74 68 65 20 73 65 72  at which the ser
72d0: 69 65 73 5f 63 75 72 73 6f 72 0a 2a 2a 20 69 73  ies_cursor.** is
72e0: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
72f0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
7300: 6e 74 20 7a 69 70 66 69 6c 65 43 6f 6c 75 6d 6e  nt zipfileColumn
7310: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  (.  sqlite3_vtab
7320: 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 20 20  _cursor *cur,   
7330: 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 2a 2f  /* The cursor */
7340: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
7350: 78 74 20 2a 63 74 78 2c 20 20 20 20 20 20 20 2f  xt *ctx,       /
7360: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
7370: 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 73 75   to sqlite3_resu
7380: 6c 74 5f 2e 2e 2e 28 29 20 2a 2f 0a 20 20 69 6e  lt_...() */.  in
7390: 74 20 69 20 20 20 20 20 20 20 20 20 20 20 20 20  t i             
73a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69            /* Whi
73b0: 63 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 74  ch column to ret
73c0: 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20 5a 69 70 66  urn */.){.  Zipf
73d0: 69 6c 65 43 73 72 20 2a 70 43 73 72 20 3d 20 28  ileCsr *pCsr = (
73e0: 5a 69 70 66 69 6c 65 43 73 72 2a 29 63 75 72 3b  ZipfileCsr*)cur;
73f0: 0a 20 20 5a 69 70 66 69 6c 65 43 44 53 20 2a 70  .  ZipfileCDS *p
7400: 43 44 53 20 3d 20 26 70 43 73 72 2d 3e 70 43 75  CDS = &pCsr->pCu
7410: 72 72 65 6e 74 2d 3e 63 64 73 3b 0a 20 20 69 6e  rrent->cds;.  in
7420: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
7430: 3b 0a 20 20 73 77 69 74 63 68 28 20 69 20 29 7b  ;.  switch( i ){
7440: 0a 20 20 20 20 63 61 73 65 20 30 3a 20 20 20 2f  .    case 0:   /
7450: 2a 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  * name */.      
7460: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
7470: 65 78 74 28 63 74 78 2c 20 70 43 44 53 2d 3e 7a  ext(ctx, pCDS->z
7480: 46 69 6c 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  File, -1, SQLITE
7490: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
74a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
74b0: 73 65 20 31 3a 20 20 20 2f 2a 20 6d 6f 64 65 20  se 1:   /* mode 
74c0: 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  */.      /* TODO
74d0: 3a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  : Whether or not
74e0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
74f0: 73 20 63 6f 72 72 65 63 74 20 73 75 72 65 6c 79  s correct surely
7500: 20 64 65 70 65 6e 64 73 20 6f 6e 0a 20 20 20 20   depends on.    
7510: 20 20 2a 2a 20 74 68 65 20 70 6c 61 74 66 6f 72    ** the platfor
7520: 6d 20 6f 6e 20 77 68 69 63 68 20 74 68 65 20 61  m on which the a
7530: 72 63 68 69 76 65 20 77 61 73 20 63 72 65 61 74  rchive was creat
7540: 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73 71  ed.  */.      sq
7550: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
7560: 28 63 74 78 2c 20 70 43 44 53 2d 3e 69 45 78 74  (ctx, pCDS->iExt
7570: 65 72 6e 61 6c 41 74 74 72 20 3e 3e 20 31 36 29  ernalAttr >> 16)
7580: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7590: 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20     case 2: { /* 
75a0: 6d 74 69 6d 65 20 2a 2f 0a 20 20 20 20 20 20 73  mtime */.      s
75b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
75c0: 74 36 34 28 63 74 78 2c 20 70 43 73 72 2d 3e 70  t64(ctx, pCsr->p
75d0: 43 75 72 72 65 6e 74 2d 3e 6d 55 6e 69 78 54 69  Current->mUnixTi
75e0: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
75f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
7600: 20 33 3a 20 7b 20 2f 2a 20 73 7a 20 2a 2f 0a 20   3: { /* sz */. 
7610: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
7620: 5f 76 74 61 62 5f 6e 6f 63 68 61 6e 67 65 28 63  _vtab_nochange(c
7630: 74 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tx)==0 ){.      
7640: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7650: 5f 69 6e 74 36 34 28 63 74 78 2c 20 70 43 44 53  _int64(ctx, pCDS
7660: 2d 3e 73 7a 55 6e 63 6f 6d 70 72 65 73 73 65 64  ->szUncompressed
7670: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7680: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7690: 20 20 63 61 73 65 20 34 3a 20 20 20 2f 2a 20 72    case 4:   /* r
76a0: 61 77 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20  awdata */.      
76b0: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 74 61 62  if( sqlite3_vtab
76c0: 5f 6e 6f 63 68 61 6e 67 65 28 63 74 78 29 20 29  _nochange(ctx) )
76d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
76e0: 20 35 3a 20 7b 20 2f 2a 20 64 61 74 61 20 2a 2f   5: { /* data */
76f0: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 34 20  .      if( i==4 
7700: 7c 7c 20 70 43 44 53 2d 3e 69 43 6f 6d 70 72 65  || pCDS->iCompre
7710: 73 73 69 6f 6e 3d 3d 30 20 7c 7c 20 70 43 44 53  ssion==0 || pCDS
7720: 2d 3e 69 43 6f 6d 70 72 65 73 73 69 6f 6e 3d 3d  ->iCompression==
7730: 38 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  8 ){.        int
7740: 20 73 7a 20 3d 20 70 43 44 53 2d 3e 73 7a 43 6f   sz = pCDS->szCo
7750: 6d 70 72 65 73 73 65 64 3b 0a 20 20 20 20 20 20  mpressed;.      
7760: 20 20 69 6e 74 20 73 7a 46 69 6e 61 6c 20 3d 20    int szFinal = 
7770: 70 43 44 53 2d 3e 73 7a 55 6e 63 6f 6d 70 72 65  pCDS->szUncompre
7780: 73 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66  ssed;.        if
7790: 28 20 73 7a 46 69 6e 61 6c 3e 30 20 29 7b 0a 20  ( szFinal>0 ){. 
77a0: 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 42 75           u8 *aBu
77b0: 66 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  f;.          u8 
77c0: 2a 61 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  *aFree = 0;.    
77d0: 20 20 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e        if( pCsr->
77e0: 70 43 75 72 72 65 6e 74 2d 3e 61 44 61 74 61 20  pCurrent->aData 
77f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
7800: 42 75 66 20 3d 20 70 43 73 72 2d 3e 70 43 75 72  Buf = pCsr->pCur
7810: 72 65 6e 74 2d 3e 61 44 61 74 61 3b 0a 20 20 20  rent->aData;.   
7820: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7830: 20 20 20 20 20 20 20 20 20 20 61 42 75 66 20 3d            aBuf =
7840: 20 61 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33   aFree = sqlite3
7850: 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a 29 3b 0a 20  _malloc64(sz);. 
7860: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
7870: 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Buf==0 ){.      
7880: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
7890: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
78a0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45              FILE
78c0: 20 2a 70 46 69 6c 65 20 3d 20 70 43 73 72 2d 3e   *pFile = pCsr->
78d0: 70 46 69 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  pFile;.         
78e0: 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 3d 3d       if( pFile==
78f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
7900: 20 20 20 20 20 70 46 69 6c 65 20 3d 20 28 28 5a       pFile = ((Z
7910: 69 70 66 69 6c 65 54 61 62 2a 29 28 70 43 73 72  ipfileTab*)(pCsr
7920: 2d 3e 62 61 73 65 2e 70 56 74 61 62 29 29 2d 3e  ->base.pVtab))->
7930: 70 57 72 69 74 65 46 64 3b 0a 20 20 20 20 20 20  pWriteFd;.      
7940: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7950: 20 20 20 20 20 20 20 20 72 63 20 3d 20 7a 69 70          rc = zip
7960: 66 69 6c 65 52 65 61 64 44 61 74 61 28 70 46 69  fileReadData(pFi
7970: 6c 65 2c 20 61 42 75 66 2c 20 73 7a 2c 20 70 43  le, aBuf, sz, pC
7980: 73 72 2d 3e 70 43 75 72 72 65 6e 74 2d 3e 69 44  sr->pCurrent->iD
7990: 61 74 61 4f 66 66 2c 0a 20 20 20 20 20 20 20 20  ataOff,.        
79a0: 20 20 20 20 20 20 20 20 20 20 26 70 43 73 72 2d            &pCsr-
79b0: 3e 62 61 73 65 2e 70 56 74 61 62 2d 3e 7a 45 72  >base.pVtab->zEr
79c0: 72 4d 73 67 0a 20 20 20 20 20 20 20 20 20 20 20  rMsg.           
79d0: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
79e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
79f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
7a00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7a10: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
7a20: 3d 3d 35 20 26 26 20 70 43 44 53 2d 3e 69 43 6f  ==5 && pCDS->iCo
7a30: 6d 70 72 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20  mpression ){.   
7a40: 20 20 20 20 20 20 20 20 20 20 20 7a 69 70 66 69             zipfi
7a50: 6c 65 49 6e 66 6c 61 74 65 28 63 74 78 2c 20 61  leInflate(ctx, a
7a60: 42 75 66 2c 20 73 7a 2c 20 73 7a 46 69 6e 61 6c  Buf, sz, szFinal
7a70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
7a80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7a90: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
7aa0: 6c 74 5f 62 6c 6f 62 28 63 74 78 2c 20 61 42 75  lt_blob(ctx, aBu
7ab0: 66 2c 20 73 7a 2c 20 53 51 4c 49 54 45 5f 54 52  f, sz, SQLITE_TR
7ac0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
7ad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7ae0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
7af0: 6c 69 74 65 33 5f 66 72 65 65 28 61 46 72 65 65  lite3_free(aFree
7b00: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
7b10: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  {.          /* F
7b20: 69 67 75 72 65 20 6f 75 74 20 69 66 20 74 68 69  igure out if thi
7b30: 73 20 69 73 20 61 20 64 69 72 65 63 74 6f 72 79  s is a directory
7b40: 20 6f 72 20 61 20 7a 65 72 6f 2d 73 69 7a 65 64   or a zero-sized
7b50: 20 66 69 6c 65 2e 20 43 6f 6e 73 69 64 65 72 0a   file. Consider.
7b60: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
7b70: 74 6f 20 62 65 20 61 20 64 69 72 65 63 74 6f 72  to be a director
7b80: 79 20 65 69 74 68 65 72 20 69 66 20 74 68 65 20  y either if the 
7b90: 6d 6f 64 65 20 73 75 67 67 65 73 74 73 20 73 6f  mode suggests so
7ba0: 2c 20 6f 72 20 69 66 0a 20 20 20 20 20 20 20 20  , or if.        
7bb0: 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 63    ** the final c
7bc0: 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65 20  haracter in the 
7bd0: 6e 61 6d 65 20 69 73 20 27 2f 27 2e 20 20 2a 2f  name is '/'.  */
7be0: 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 6d  .          u32 m
7bf0: 6f 64 65 20 3d 20 70 43 44 53 2d 3e 69 45 78 74  ode = pCDS->iExt
7c00: 65 72 6e 61 6c 41 74 74 72 20 3e 3e 20 31 36 3b  ernalAttr >> 16;
7c10: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
7c20: 28 6d 6f 64 65 20 26 20 53 5f 49 46 44 49 52 29  (mode & S_IFDIR)
7c30: 20 26 26 20 70 43 44 53 2d 3e 7a 46 69 6c 65 5b   && pCDS->zFile[
7c40: 70 43 44 53 2d 3e 6e 46 69 6c 65 2d 31 5d 21 3d  pCDS->nFile-1]!=
7c50: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '/' ){.         
7c60: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7c70: 74 5f 62 6c 6f 62 28 63 74 78 2c 20 22 22 2c 20  t_blob(ctx, "", 
7c80: 30 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  0, SQLITE_STATIC
7c90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
7ca0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7cb0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7cc0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
7cd0: 20 20 2f 2a 20 6d 65 74 68 6f 64 20 2a 2f 0a 20    /* method */. 
7ce0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
7cf0: 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 44  ult_int(ctx, pCD
7d00: 53 2d 3e 69 43 6f 6d 70 72 65 73 73 69 6f 6e 29  S->iCompression)
7d10: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7d20: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 2f 2a 20     default:  /* 
7d30: 7a 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  z */.      asser
7d40: 74 28 20 69 3d 3d 37 20 29 3b 0a 20 20 20 20 20  t( i==7 );.     
7d50: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7d60: 69 6e 74 36 34 28 63 74 78 2c 20 70 43 73 72 2d  int64(ctx, pCsr-
7d70: 3e 69 49 64 29 3b 0a 20 20 20 20 20 20 62 72 65  >iId);.      bre
7d80: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ak;.  }..  retur
7d90: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
7da0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
7db0: 65 20 63 75 72 73 6f 72 20 69 73 20 61 74 20 45  e cursor is at E
7dc0: 4f 46 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OF..*/.static in
7dd0: 74 20 7a 69 70 66 69 6c 65 45 6f 66 28 73 71 6c  t zipfileEof(sql
7de0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
7df0: 20 2a 63 75 72 29 7b 0a 20 20 5a 69 70 66 69 6c   *cur){.  Zipfil
7e00: 65 43 73 72 20 2a 70 43 73 72 20 3d 20 28 5a 69  eCsr *pCsr = (Zi
7e10: 70 66 69 6c 65 43 73 72 2a 29 63 75 72 3b 0a 20  pfileCsr*)cur;. 
7e20: 20 72 65 74 75 72 6e 20 70 43 73 72 2d 3e 62 45   return pCsr->bE
7e30: 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  of;.}../*.** If 
7e40: 61 42 6c 6f 62 20 69 73 20 6e 6f 74 20 4e 55 4c  aBlob is not NUL
7e50: 4c 2c 20 74 68 65 6e 20 69 74 20 70 6f 69 6e 74  L, then it point
7e60: 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6e 42  s to a buffer nB
7e70: 6c 6f 62 20 62 79 74 65 73 20 69 6e 20 73 69 7a  lob bytes in siz
7e80: 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  e.** containing 
7e90: 61 6e 20 65 6e 74 69 72 65 20 7a 69 70 20 61 72  an entire zip ar
7ea0: 63 68 69 76 65 20 69 6d 61 67 65 2e 20 4f 72 2c  chive image. Or,
7eb0: 20 69 66 20 61 42 6c 6f 62 20 69 73 20 4e 55 4c   if aBlob is NUL
7ec0: 4c 2c 20 74 68 65 6e 20 70 46 69 6c 65 0a 2a 2a  L, then pFile.**
7ed0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
7ee0: 6f 20 62 65 20 61 20 66 69 6c 65 2d 68 61 6e 64  o be a file-hand
7ef0: 6c 65 20 6f 70 65 6e 20 6f 6e 20 61 20 7a 69 70  le open on a zip
7f00: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
7f10: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
7f20: 70 74 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  pts to locate th
7f30: 65 20 45 4f 43 44 20 72 65 63 6f 72 64 20 77 69  e EOCD record wi
7f40: 74 68 69 6e 20 74 68 65 20 7a 69 70 20 61 72 63  thin the zip arc
7f50: 68 69 76 65 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  hive.** and popu
7f60: 6c 61 74 65 20 2a 70 45 4f 43 44 20 77 69 74 68  late *pEOCD with
7f70: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
7f80: 64 65 63 6f 64 69 6e 67 20 69 74 2e 20 53 51 4c  decoding it. SQL
7f90: 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74  ITE_OK is.** ret
7fa0: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
7fb0: 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ful. Otherwise, 
7fc0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
7fd0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
7fe0: 20 61 6e 64 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69   and.** an Engli
7ff0: 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f  sh language erro
8000: 72 20 6d 65 73 73 61 67 65 20 6d 61 79 20 62 65  r message may be
8010: 20 6c 65 66 74 20 69 6e 20 76 69 72 74 75 61 6c   left in virtual
8020: 2d 74 61 62 6c 65 20 70 54 61 62 2e 0a 2a 2f 0a  -table pTab..*/.
8030: 73 74 61 74 69 63 20 69 6e 74 20 7a 69 70 66 69  static int zipfi
8040: 6c 65 52 65 61 64 45 4f 43 44 28 0a 20 20 5a 69  leReadEOCD(.  Zi
8050: 70 66 69 6c 65 54 61 62 20 2a 70 54 61 62 2c 20  pfileTab *pTab, 
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8070: 20 52 65 74 75 72 6e 20 65 72 72 6f 72 73 20 68   Return errors h
8080: 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  ere */.  const u
8090: 38 20 2a 61 42 6c 6f 62 2c 20 20 20 20 20 20 20  8 *aBlob,       
80a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
80b0: 74 65 72 20 74 6f 20 69 6e 2d 6d 65 6d 6f 72 79  ter to in-memory
80c0: 20 66 69 6c 65 20 69 6d 61 67 65 20 2a 2f 0a 20   file image */. 
80d0: 20 69 6e 74 20 6e 42 6c 6f 62 2c 20 20 20 20 20   int nBlob,     
80e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80f0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 42 6c 6f   /* Size of aBlo
8100: 62 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  b[] in bytes */.
8110: 20 20 46 49 4c 45 20 2a 70 46 69 6c 65 2c 20 20    FILE *pFile,  
8120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8130: 20 20 2f 2a 20 52 65 61 64 20 66 72 6f 6d 20 74    /* Read from t
8140: 68 69 73 20 66 69 6c 65 20 69 66 20 61 42 6c 6f  his file if aBlo
8150: 62 3d 3d 30 20 2a 2f 0a 20 20 5a 69 70 66 69 6c  b==0 */.  Zipfil
8160: 65 45 4f 43 44 20 2a 70 45 4f 43 44 20 20 20 20  eEOCD *pEOCD    
8170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
8180: 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ect to populate 
8190: 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 61 52 65 61  */.){.  u8 *aRea
81a0: 64 20 3d 20 70 54 61 62 2d 3e 61 42 75 66 66 65  d = pTab->aBuffe
81b0: 72 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f  r;      /* Tempo
81c0: 72 61 72 79 20 62 75 66 66 65 72 20 2a 2f 0a 20  rary buffer */. 
81d0: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
81e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81f0: 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 72 65 61   /* Bytes to rea
8200: 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20  d from file */. 
8210: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
8220: 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 61 42 6c 6f  _OK;..  if( aBlo
8230: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20  b==0 ){.    i64 
8240: 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  iOff;           
8250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
8260: 73 65 74 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  set to read from
8270: 20 2a 2f 0a 20 20 20 20 69 36 34 20 73 7a 46 69   */.    i64 szFi
8280: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
8290: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
82a0: 69 7a 65 20 6f 66 20 66 69 6c 65 20 69 6e 20 62  ize of file in b
82b0: 79 74 65 73 20 2a 2f 0a 20 20 20 20 66 73 65 65  ytes */.    fsee
82c0: 6b 28 70 46 69 6c 65 2c 20 30 2c 20 53 45 45 4b  k(pFile, 0, SEEK
82d0: 5f 45 4e 44 29 3b 0a 20 20 20 20 73 7a 46 69 6c  _END);.    szFil
82e0: 65 20 3d 20 28 69 36 34 29 66 74 65 6c 6c 28 70  e = (i64)ftell(p
82f0: 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 73  File);.    if( s
8300: 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zFile==0 ){.    
8310: 20 20 6d 65 6d 73 65 74 28 70 45 4f 43 44 2c 20    memset(pEOCD, 
8320: 30 2c 20 73 69 7a 65 6f 66 28 5a 69 70 66 69 6c  0, sizeof(Zipfil
8330: 65 45 4f 43 44 29 29 3b 0a 20 20 20 20 20 20 72  eEOCD));.      r
8340: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8350: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 52 65 61 64  .    }.    nRead
8360: 20 3d 20 28 69 6e 74 29 28 4d 49 4e 28 73 7a 46   = (int)(MIN(szF
8370: 69 6c 65 2c 20 5a 49 50 46 49 4c 45 5f 42 55 46  ile, ZIPFILE_BUF
8380: 46 45 52 5f 53 49 5a 45 29 29 3b 0a 20 20 20 20  FER_SIZE));.    
8390: 69 4f 66 66 20 3d 20 73 7a 46 69 6c 65 20 2d 20  iOff = szFile - 
83a0: 6e 52 65 61 64 3b 0a 20 20 20 20 72 63 20 3d 20  nRead;.    rc = 
83b0: 7a 69 70 66 69 6c 65 52 65 61 64 44 61 74 61 28  zipfileReadData(
83c0: 70 46 69 6c 65 2c 20 61 52 65 61 64 2c 20 6e 52  pFile, aRead, nR
83d0: 65 61 64 2c 20 69 4f 66 66 2c 20 26 70 54 61 62  ead, iOff, &pTab
83e0: 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 29 3b  ->base.zErrMsg);
83f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52  .  }else{.    nR
8400: 65 61 64 20 3d 20 28 69 6e 74 29 28 4d 49 4e 28  ead = (int)(MIN(
8410: 6e 42 6c 6f 62 2c 20 5a 49 50 46 49 4c 45 5f 42  nBlob, ZIPFILE_B
8420: 55 46 46 45 52 5f 53 49 5a 45 29 29 3b 0a 20 20  UFFER_SIZE));.  
8430: 20 20 61 52 65 61 64 20 3d 20 28 75 38 2a 29 26    aRead = (u8*)&
8440: 61 42 6c 6f 62 5b 6e 42 6c 6f 62 2d 6e 52 65 61  aBlob[nBlob-nRea
8450: 64 5d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  d];.  }..  if( r
8460: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8470: 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
8480: 2f 2a 20 53 63 61 6e 20 62 61 63 6b 77 61 72 64  /* Scan backward
8490: 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 74 68  s looking for th
84a0: 65 20 73 69 67 6e 61 74 75 72 65 20 62 79 74 65  e signature byte
84b0: 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6e  s */.    for(i=n
84c0: 52 65 61 64 2d 32 30 3b 20 69 3e 3d 30 3b 20 69  Read-20; i>=0; i
84d0: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  --){.      if( a
84e0: 52 65 61 64 5b 69 5d 3d 3d 30 78 35 30 20 26 26  Read[i]==0x50 &&
84f0: 20 61 52 65 61 64 5b 69 2b 31 5d 3d 3d 30 78 34   aRead[i+1]==0x4
8500: 62 20 0a 20 20 20 20 20 20 20 26 26 20 61 52 65  b .       && aRe
8510: 61 64 5b 69 2b 32 5d 3d 3d 30 78 30 35 20 26 26  ad[i+2]==0x05 &&
8520: 20 61 52 65 61 64 5b 69 2b 33 5d 3d 3d 30 78 30   aRead[i+3]==0x0
8530: 36 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  6 .      ){.    
8540: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8550: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
8560: 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 54   i<0 ){.      pT
8570: 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67  ab->base.zErrMsg
8580: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
8590: 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 63  tf(.          "c
85a0: 61 6e 6e 6f 74 20 66 69 6e 64 20 65 6e 64 20 6f  annot find end o
85b0: 66 20 63 65 6e 74 72 61 6c 20 64 69 72 65 63 74  f central direct
85c0: 6f 72 79 20 72 65 63 6f 72 64 22 0a 20 20 20 20  ory record".    
85d0: 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72    );.      retur
85e0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
85f0: 20 20 20 20 7d 0a 0a 20 20 20 20 61 52 65 61 64      }..    aRead
8600: 20 2b 3d 20 69 2b 34 3b 0a 20 20 20 20 70 45 4f   += i+4;.    pEO
8610: 43 44 2d 3e 69 44 69 73 6b 20 3d 20 7a 69 70 66  CD->iDisk = zipf
8620: 69 6c 65 52 65 61 64 31 36 28 61 52 65 61 64 29  ileRead16(aRead)
8630: 3b 0a 20 20 20 20 70 45 4f 43 44 2d 3e 69 46 69  ;.    pEOCD->iFi
8640: 72 73 74 44 69 73 6b 20 3d 20 7a 69 70 66 69 6c  rstDisk = zipfil
8650: 65 52 65 61 64 31 36 28 61 52 65 61 64 29 3b 0a  eRead16(aRead);.
8660: 20 20 20 20 70 45 4f 43 44 2d 3e 6e 45 6e 74 72      pEOCD->nEntr
8670: 79 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 31  y = zipfileRead1
8680: 36 28 61 52 65 61 64 29 3b 0a 20 20 20 20 70 45  6(aRead);.    pE
8690: 4f 43 44 2d 3e 6e 45 6e 74 72 79 54 6f 74 61 6c  OCD->nEntryTotal
86a0: 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 31 36   = zipfileRead16
86b0: 28 61 52 65 61 64 29 3b 0a 20 20 20 20 70 45 4f  (aRead);.    pEO
86c0: 43 44 2d 3e 6e 53 69 7a 65 20 3d 20 7a 69 70 66  CD->nSize = zipf
86d0: 69 6c 65 52 65 61 64 33 32 28 61 52 65 61 64 29  ileRead32(aRead)
86e0: 3b 0a 20 20 20 20 70 45 4f 43 44 2d 3e 69 4f 66  ;.    pEOCD->iOf
86f0: 66 73 65 74 20 3d 20 7a 69 70 66 69 6c 65 52 65  fset = zipfileRe
8700: 61 64 33 32 28 61 52 65 61 64 29 3b 0a 20 20 7d  ad32(aRead);.  }
8710: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
8720: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 62 6a 65  ../*.** Add obje
8730: 63 74 20 70 4e 65 77 20 74 6f 20 74 68 65 20 6c  ct pNew to the l
8740: 69 6e 6b 65 64 20 6c 69 73 74 20 74 68 61 74 20  inked list that 
8750: 62 65 67 69 6e 73 20 61 74 20 5a 69 70 66 69 6c  begins at Zipfil
8760: 65 54 61 62 2e 70 46 69 72 73 74 45 6e 74 72 79  eTab.pFirstEntry
8770: 20 0a 2a 2a 20 61 6e 64 20 65 6e 64 73 20 77 69   .** and ends wi
8780: 74 68 20 70 4c 61 73 74 45 6e 74 72 79 2e 20 49  th pLastEntry. I
8790: 66 20 61 72 67 75 6d 65 6e 74 20 70 42 65 66 6f  f argument pBefo
87a0: 72 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  re is NULL, then
87b0: 20 70 4e 65 77 20 69 73 20 61 64 64 65 64 0a 2a   pNew is added.*
87c0: 2a 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  * to the end of 
87d0: 74 68 65 20 6c 69 73 74 2e 20 4f 74 68 65 72 77  the list. Otherw
87e0: 69 73 65 2c 20 69 74 20 69 73 20 61 64 64 65 64  ise, it is added
87f0: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 69 6d 6d   to the list imm
8800: 65 64 69 61 74 65 6c 79 0a 2a 2a 20 62 65 66 6f  ediately.** befo
8810: 72 65 20 70 42 65 66 6f 72 65 20 28 77 68 69 63  re pBefore (whic
8820: 68 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  h is guaranteed 
8830: 74 6f 20 62 65 20 61 20 70 61 72 74 20 6f 66 20  to be a part of 
8840: 73 61 69 64 20 6c 69 73 74 29 2e 0a 2a 2f 0a 73  said list)..*/.s
8850: 74 61 74 69 63 20 76 6f 69 64 20 7a 69 70 66 69  tatic void zipfi
8860: 6c 65 41 64 64 45 6e 74 72 79 28 0a 20 20 5a 69  leAddEntry(.  Zi
8870: 70 66 69 6c 65 54 61 62 20 2a 70 54 61 62 2c 20  pfileTab *pTab, 
8880: 0a 20 20 5a 69 70 66 69 6c 65 45 6e 74 72 79 20  .  ZipfileEntry 
8890: 2a 70 42 65 66 6f 72 65 2c 20 0a 20 20 5a 69 70  *pBefore, .  Zip
88a0: 66 69 6c 65 45 6e 74 72 79 20 2a 70 4e 65 77 0a  fileEntry *pNew.
88b0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 28 70 54  ){.  assert( (pT
88c0: 61 62 2d 3e 70 46 69 72 73 74 45 6e 74 72 79 3d  ab->pFirstEntry=
88d0: 3d 30 29 3d 3d 28 70 54 61 62 2d 3e 70 4c 61 73  =0)==(pTab->pLas
88e0: 74 45 6e 74 72 79 3d 3d 30 29 20 29 3b 0a 20 20  tEntry==0) );.  
88f0: 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4e  assert( pNew->pN
8900: 65 78 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ext==0 );.  if( 
8910: 70 42 65 66 6f 72 65 3d 3d 30 20 29 7b 0a 20 20  pBefore==0 ){.  
8920: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 46 69 72    if( pTab->pFir
8930: 73 74 45 6e 74 72 79 3d 3d 30 20 29 7b 0a 20 20  stEntry==0 ){.  
8940: 20 20 20 20 70 54 61 62 2d 3e 70 46 69 72 73 74      pTab->pFirst
8950: 45 6e 74 72 79 20 3d 20 70 54 61 62 2d 3e 70 4c  Entry = pTab->pL
8960: 61 73 74 45 6e 74 72 79 20 3d 20 70 4e 65 77 3b  astEntry = pNew;
8970: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8980: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
8990: 70 4c 61 73 74 45 6e 74 72 79 2d 3e 70 4e 65 78  pLastEntry->pNex
89a0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54  t==0 );.      pT
89b0: 61 62 2d 3e 70 4c 61 73 74 45 6e 74 72 79 2d 3e  ab->pLastEntry->
89c0: 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
89d0: 20 20 20 20 70 54 61 62 2d 3e 70 4c 61 73 74 45      pTab->pLastE
89e0: 6e 74 72 79 20 3d 20 70 4e 65 77 3b 0a 20 20 20  ntry = pNew;.   
89f0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
8a00: 5a 69 70 66 69 6c 65 45 6e 74 72 79 20 2a 2a 70  ZipfileEntry **p
8a10: 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 70  p;.    for(pp=&p
8a20: 54 61 62 2d 3e 70 46 69 72 73 74 45 6e 74 72 79  Tab->pFirstEntry
8a30: 3b 20 2a 70 70 21 3d 70 42 65 66 6f 72 65 3b 20  ; *pp!=pBefore; 
8a40: 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78  pp=&((*pp)->pNex
8a50: 74 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  t));.    pNew->p
8a60: 4e 65 78 74 20 3d 20 70 42 65 66 6f 72 65 3b 0a  Next = pBefore;.
8a70: 20 20 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a      *pp = pNew;.
8a80: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e    }.}..static in
8a90: 74 20 7a 69 70 66 69 6c 65 4c 6f 61 64 44 69 72  t zipfileLoadDir
8aa0: 65 63 74 6f 72 79 28 5a 69 70 66 69 6c 65 54 61  ectory(ZipfileTa
8ab0: 62 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 75  b *pTab, const u
8ac0: 38 20 2a 61 42 6c 6f 62 2c 20 69 6e 74 20 6e 42  8 *aBlob, int nB
8ad0: 6c 6f 62 29 7b 0a 20 20 5a 69 70 66 69 6c 65 45  lob){.  ZipfileE
8ae0: 4f 43 44 20 65 6f 63 64 3b 0a 20 20 69 6e 74 20  OCD eocd;.  int 
8af0: 72 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  rc;.  int i;.  i
8b00: 36 34 20 69 4f 66 66 3b 0a 0a 20 20 72 63 20 3d  64 iOff;..  rc =
8b10: 20 7a 69 70 66 69 6c 65 52 65 61 64 45 4f 43 44   zipfileReadEOCD
8b20: 28 70 54 61 62 2c 20 61 42 6c 6f 62 2c 20 6e 42  (pTab, aBlob, nB
8b30: 6c 6f 62 2c 20 70 54 61 62 2d 3e 70 57 72 69 74  lob, pTab->pWrit
8b40: 65 46 64 2c 20 26 65 6f 63 64 29 3b 0a 20 20 69  eFd, &eocd);.  i
8b50: 4f 66 66 20 3d 20 65 6f 63 64 2e 69 4f 66 66 73  Off = eocd.iOffs
8b60: 65 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72  et;.  for(i=0; r
8b70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
8b80: 69 3c 65 6f 63 64 2e 6e 45 6e 74 72 79 3b 20 69  i<eocd.nEntry; i
8b90: 2b 2b 29 7b 0a 20 20 20 20 5a 69 70 66 69 6c 65  ++){.    Zipfile
8ba0: 45 6e 74 72 79 20 2a 70 4e 65 77 20 3d 20 30 3b  Entry *pNew = 0;
8bb0: 0a 20 20 20 20 72 63 20 3d 20 7a 69 70 66 69 6c  .    rc = zipfil
8bc0: 65 47 65 74 45 6e 74 72 79 28 70 54 61 62 2c 20  eGetEntry(pTab, 
8bd0: 61 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 70 54  aBlob, nBlob, pT
8be0: 61 62 2d 3e 70 57 72 69 74 65 46 64 2c 20 69 4f  ab->pWriteFd, iO
8bf0: 66 66 2c 20 26 70 4e 65 77 29 3b 0a 0a 20 20 20  ff, &pNew);..   
8c00: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8c10: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 7a 69 70 66  OK ){.      zipf
8c20: 69 6c 65 41 64 64 45 6e 74 72 79 28 70 54 61 62  ileAddEntry(pTab
8c30: 2c 20 30 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  , 0, pNew);.    
8c40: 20 20 69 4f 66 66 20 2b 3d 20 5a 49 50 46 49 4c    iOff += ZIPFIL
8c50: 45 5f 43 44 53 5f 46 49 58 45 44 5f 53 5a 3b 0a  E_CDS_FIXED_SZ;.
8c60: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 28 69        iOff += (i
8c70: 6e 74 29 70 4e 65 77 2d 3e 63 64 73 2e 6e 45 78  nt)pNew->cds.nEx
8c80: 74 72 61 20 2b 20 70 4e 65 77 2d 3e 63 64 73 2e  tra + pNew->cds.
8c90: 6e 46 69 6c 65 20 2b 20 70 4e 65 77 2d 3e 63 64  nFile + pNew->cd
8ca0: 73 2e 6e 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20  s.nComment;.    
8cb0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
8cc0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 46 69 6c  c;.}../*.** xFil
8cd0: 74 65 72 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  ter callback..*/
8ce0: 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 69 70 66  .static int zipf
8cf0: 69 6c 65 46 69 6c 74 65 72 28 0a 20 20 73 71 6c  ileFilter(.  sql
8d00: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
8d10: 20 2a 63 75 72 2c 20 0a 20 20 69 6e 74 20 69 64   *cur, .  int id
8d20: 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72  xNum, const char
8d30: 20 2a 69 64 78 53 74 72 2c 0a 20 20 69 6e 74 20   *idxStr,.  int 
8d40: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
8d50: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
8d60: 5a 69 70 66 69 6c 65 54 61 62 20 2a 70 54 61 62  ZipfileTab *pTab
8d70: 20 3d 20 28 5a 69 70 66 69 6c 65 54 61 62 2a 29   = (ZipfileTab*)
8d80: 63 75 72 2d 3e 70 56 74 61 62 3b 0a 20 20 5a 69  cur->pVtab;.  Zi
8d90: 70 66 69 6c 65 43 73 72 20 2a 70 43 73 72 20 3d  pfileCsr *pCsr =
8da0: 20 28 5a 69 70 66 69 6c 65 43 73 72 2a 29 63 75   (ZipfileCsr*)cu
8db0: 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  r;.  const char 
8dc0: 2a 7a 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20  *zFile = 0;     
8dd0: 20 20 20 20 20 2f 2a 20 5a 69 70 20 66 69 6c 65       /* Zip file
8de0: 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 69 6e   to scan */.  in
8df0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
8e00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8e10: 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
8e20: 20 20 69 6e 74 20 62 49 6e 4d 65 6d 6f 72 79 20    int bInMemory 
8e30: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8e40: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 6e    /* True for an
8e50: 20 69 6e 2d 6d 65 6d 6f 72 79 20 7a 69 70 66 69   in-memory zipfi
8e60: 6c 65 20 2a 2f 0a 0a 20 20 7a 69 70 66 69 6c 65  le */..  zipfile
8e70: 52 65 73 65 74 43 75 72 73 6f 72 28 70 43 73 72  ResetCursor(pCsr
8e80: 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  );..  if( pTab->
8e90: 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 7a 46 69  zFile ){.    zFi
8ea0: 6c 65 20 3d 20 70 54 61 62 2d 3e 7a 46 69 6c 65  le = pTab->zFile
8eb0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64  ;.  }else if( id
8ec0: 78 4e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  xNum==0 ){.    z
8ed0: 69 70 66 69 6c 65 43 75 72 73 6f 72 45 72 72 28  ipfileCursorErr(
8ee0: 70 43 73 72 2c 20 22 7a 69 70 66 69 6c 65 28 29  pCsr, "zipfile()
8ef0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 71 75 69 72   function requir
8f00: 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 22 29  es an argument")
8f10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
8f20: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  ITE_ERROR;.  }el
8f30: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  se if( sqlite3_v
8f40: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
8f50: 5d 29 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  ])==SQLITE_BLOB 
8f60: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20  ){.    const u8 
8f70: 2a 61 42 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20  *aBlob = (const 
8f80: 75 38 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  u8*)sqlite3_valu
8f90: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b  e_blob(argv[0]);
8fa0: 0a 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d  .    int nBlob =
8fb0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
8fc0: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
8fd0: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
8fe0: 3e 70 46 69 72 73 74 45 6e 74 72 79 3d 3d 30 20  >pFirstEntry==0 
8ff0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 7a 69 70 66  );.    rc = zipf
9000: 69 6c 65 4c 6f 61 64 44 69 72 65 63 74 6f 72 79  ileLoadDirectory
9010: 28 70 54 61 62 2c 20 61 42 6c 6f 62 2c 20 6e 42  (pTab, aBlob, nB
9020: 6c 6f 62 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e  lob);.    pCsr->
9030: 70 46 72 65 65 45 6e 74 72 79 20 3d 20 70 54 61  pFreeEntry = pTa
9040: 62 2d 3e 70 46 69 72 73 74 45 6e 74 72 79 3b 0a  b->pFirstEntry;.
9050: 20 20 20 20 70 54 61 62 2d 3e 70 46 69 72 73 74      pTab->pFirst
9060: 45 6e 74 72 79 20 3d 20 70 54 61 62 2d 3e 70 4c  Entry = pTab->pL
9070: 61 73 74 45 6e 74 72 79 20 3d 20 30 3b 0a 20 20  astEntry = 0;.  
9080: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9090: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
90a0: 0a 20 20 20 20 62 49 6e 4d 65 6d 6f 72 79 20 3d  .    bInMemory =
90b0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
90c0: 20 7a 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20   zFile = (const 
90d0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
90e0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
90f0: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 30 3d  );.  }..  if( 0=
9100: 3d 70 54 61 62 2d 3e 70 57 72 69 74 65 46 64 20  =pTab->pWriteFd 
9110: 26 26 20 30 3d 3d 62 49 6e 4d 65 6d 6f 72 79 20  && 0==bInMemory 
9120: 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e 70 46 69  ){.    pCsr->pFi
9130: 6c 65 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65  le = fopen(zFile
9140: 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28  , "rb");.    if(
9150: 20 70 43 73 72 2d 3e 70 46 69 6c 65 3d 3d 30 20   pCsr->pFile==0 
9160: 29 7b 0a 20 20 20 20 20 20 7a 69 70 66 69 6c 65  ){.      zipfile
9170: 43 75 72 73 6f 72 45 72 72 28 70 43 73 72 2c 20  CursorErr(pCsr, 
9180: 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c  "cannot open fil
9190: 65 3a 20 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a  e: %s", zFile);.
91a0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
91b0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  E_ERROR;.    }el
91c0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a  se{.      rc = z
91d0: 69 70 66 69 6c 65 52 65 61 64 45 4f 43 44 28 70  ipfileReadEOCD(p
91e0: 54 61 62 2c 20 30 2c 20 30 2c 20 70 43 73 72 2d  Tab, 0, 0, pCsr-
91f0: 3e 70 46 69 6c 65 2c 20 26 70 43 73 72 2d 3e 65  >pFile, &pCsr->e
9200: 6f 63 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ocd);.      if( 
9210: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9220: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 73  .        if( pCs
9230: 72 2d 3e 65 6f 63 64 2e 6e 45 6e 74 72 79 3d 3d  r->eocd.nEntry==
9240: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
9250: 43 73 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20  Csr->bEof = 1;. 
9260: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9270: 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 69 4e          pCsr->iN
9280: 65 78 74 4f 66 66 20 3d 20 70 43 73 72 2d 3e 65  extOff = pCsr->e
9290: 6f 63 64 2e 69 4f 66 66 73 65 74 3b 0a 20 20 20  ocd.iOffset;.   
92a0: 20 20 20 20 20 20 20 72 63 20 3d 20 7a 69 70 66         rc = zipf
92b0: 69 6c 65 4e 65 78 74 28 63 75 72 29 3b 0a 20 20  ileNext(cur);.  
92c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
92d0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
92e0: 20 20 20 70 43 73 72 2d 3e 62 4e 6f 6f 70 20 3d     pCsr->bNoop =
92f0: 20 31 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70 43   1;.    pCsr->pC
9300: 75 72 72 65 6e 74 20 3d 20 70 43 73 72 2d 3e 70  urrent = pCsr->p
9310: 46 72 65 65 45 6e 74 72 79 20 3f 20 70 43 73 72  FreeEntry ? pCsr
9320: 2d 3e 70 46 72 65 65 45 6e 74 72 79 20 3a 20 70  ->pFreeEntry : p
9330: 54 61 62 2d 3e 70 46 69 72 73 74 45 6e 74 72 79  Tab->pFirstEntry
9340: 3b 0a 20 20 20 20 72 63 20 3d 20 7a 69 70 66 69  ;.    rc = zipfi
9350: 6c 65 4e 65 78 74 28 63 75 72 29 3b 0a 20 20 7d  leNext(cur);.  }
9360: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
9370: 0a 0a 2f 2a 0a 2a 2a 20 78 42 65 73 74 49 6e 64  ../*.** xBestInd
9380: 65 78 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  ex callback..*/.
9390: 73 74 61 74 69 63 20 69 6e 74 20 7a 69 70 66 69  static int zipfi
93a0: 6c 65 42 65 73 74 49 6e 64 65 78 28 0a 20 20 73  leBestIndex(.  s
93b0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62  qlite3_vtab *tab
93c0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ,.  sqlite3_inde
93d0: 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
93e0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
93f0: 6e 74 20 69 64 78 20 3d 20 2d 31 3b 0a 20 20 69  nt idx = -1;.  i
9400: 6e 74 20 75 6e 75 73 61 62 6c 65 20 3d 20 30 3b  nt unusable = 0;
9410: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
9420: 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
9430: 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
9440: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c  const struct sql
9450: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
9460: 72 61 69 6e 74 20 2a 70 43 6f 6e 73 20 3d 20 26  raint *pCons = &
9470: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
9480: 72 61 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66  raint[i];.    if
9490: 28 20 70 43 6f 6e 73 2d 3e 69 43 6f 6c 75 6d 6e  ( pCons->iColumn
94a0: 21 3d 5a 49 50 46 49 4c 45 5f 46 5f 43 4f 4c 55  !=ZIPFILE_F_COLU
94b0: 4d 4e 5f 49 44 58 20 29 20 63 6f 6e 74 69 6e 75  MN_IDX ) continu
94c0: 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73  e;.    if( pCons
94d0: 2d 3e 75 73 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ->usable==0 ){. 
94e0: 20 20 20 20 20 75 6e 75 73 61 62 6c 65 20 3d 20       unusable = 
94f0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
9500: 20 70 43 6f 6e 73 2d 3e 6f 70 3d 3d 53 51 4c 49   pCons->op==SQLI
9510: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
9520: 49 4e 54 5f 45 51 20 29 7b 0a 20 20 20 20 20 20  INT_EQ ){.      
9530: 69 64 78 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20  idx = i;.    }. 
9540: 20 7d 0a 20 20 69 66 28 20 69 64 78 3e 3d 30 20   }.  if( idx>=0 
9550: 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  ){.    pIdxInfo-
9560: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
9570: 65 5b 69 64 78 5d 2e 61 72 67 76 49 6e 64 65 78  e[idx].argvIndex
9580: 20 3d 20 31 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 1;.    pIdxIn
9590: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
95a0: 73 61 67 65 5b 69 64 78 5d 2e 6f 6d 69 74 20 3d  sage[idx].omit =
95b0: 20 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   1;.    pIdxInfo
95c0: 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
95d0: 3d 20 31 30 30 30 2e 30 3b 0a 20 20 20 20 70 49  = 1000.0;.    pI
95e0: 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
95f0: 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
9600: 75 6e 75 73 61 62 6c 65 20 29 7b 0a 20 20 20 20  unusable ){.    
9610: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9620: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 7d 0a 20 20  NSTRAINT;.  }.  
9630: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9640: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 5a 69 70 66  ;.}..static Zipf
9650: 69 6c 65 45 6e 74 72 79 20 2a 7a 69 70 66 69 6c  ileEntry *zipfil
9660: 65 4e 65 77 45 6e 74 72 79 28 63 6f 6e 73 74 20  eNewEntry(const 
9670: 63 68 61 72 20 2a 7a 50 61 74 68 29 7b 0a 20 20  char *zPath){.  
9680: 5a 69 70 66 69 6c 65 45 6e 74 72 79 20 2a 70 4e  ZipfileEntry *pN
9690: 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  ew;.  pNew = sql
96a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
96b0: 6f 66 28 5a 69 70 66 69 6c 65 45 6e 74 72 79 29  of(ZipfileEntry)
96c0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  );.  if( pNew ){
96d0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77  .    memset(pNew
96e0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 5a 69 70 66  , 0, sizeof(Zipf
96f0: 69 6c 65 45 6e 74 72 79 29 29 3b 0a 20 20 20 20  ileEntry));.    
9700: 70 4e 65 77 2d 3e 63 64 73 2e 7a 46 69 6c 65 20  pNew->cds.zFile 
9710: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
9720: 66 28 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a  f("%s", zPath);.
9730: 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 63 64      if( pNew->cd
9740: 73 2e 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  s.zFile==0 ){.  
9750: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9760: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e  (pNew);.      pN
9770: 65 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ew = 0;.    }.  
9780: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
9790: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .}..static int z
97a0: 69 70 66 69 6c 65 53 65 72 69 61 6c 69 7a 65 4c  ipfileSerializeL
97b0: 46 48 28 5a 69 70 66 69 6c 65 45 6e 74 72 79 20  FH(ZipfileEntry 
97c0: 2a 70 45 6e 74 72 79 2c 20 75 38 20 2a 61 42 75  *pEntry, u8 *aBu
97d0: 66 29 7b 0a 20 20 5a 69 70 66 69 6c 65 43 44 53  f){.  ZipfileCDS
97e0: 20 2a 70 43 64 73 20 3d 20 26 70 45 6e 74 72 79   *pCds = &pEntry
97f0: 2d 3e 63 64 73 3b 0a 20 20 75 38 20 2a 61 20 3d  ->cds;.  u8 *a =
9800: 20 61 42 75 66 3b 0a 0a 20 20 70 43 64 73 2d 3e   aBuf;..  pCds->
9810: 6e 45 78 74 72 61 20 3d 20 39 3b 0a 0a 20 20 2f  nExtra = 9;..  /
9820: 2a 20 57 72 69 74 65 20 74 68 65 20 4c 46 48 20  * Write the LFH 
9830: 69 74 73 65 6c 66 20 2a 2f 0a 20 20 7a 69 70 66  itself */.  zipf
9840: 69 6c 65 57 72 69 74 65 33 32 28 61 2c 20 5a 49  ileWrite32(a, ZI
9850: 50 46 49 4c 45 5f 53 49 47 4e 41 54 55 52 45 5f  PFILE_SIGNATURE_
9860: 4c 46 48 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57  LFH);.  zipfileW
9870: 72 69 74 65 31 36 28 61 2c 20 70 43 64 73 2d 3e  rite16(a, pCds->
9880: 69 56 65 72 73 69 6f 6e 45 78 74 72 61 63 74 29  iVersionExtract)
9890: 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65  ;.  zipfileWrite
98a0: 31 36 28 61 2c 20 70 43 64 73 2d 3e 66 6c 61 67  16(a, pCds->flag
98b0: 73 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72 69  s);.  zipfileWri
98c0: 74 65 31 36 28 61 2c 20 70 43 64 73 2d 3e 69 43  te16(a, pCds->iC
98d0: 6f 6d 70 72 65 73 73 69 6f 6e 29 3b 0a 20 20 7a  ompression);.  z
98e0: 69 70 66 69 6c 65 57 72 69 74 65 31 36 28 61 2c  ipfileWrite16(a,
98f0: 20 70 43 64 73 2d 3e 6d 54 69 6d 65 29 3b 0a 20   pCds->mTime);. 
9900: 20 7a 69 70 66 69 6c 65 57 72 69 74 65 31 36 28   zipfileWrite16(
9910: 61 2c 20 70 43 64 73 2d 3e 6d 44 61 74 65 29 3b  a, pCds->mDate);
9920: 0a 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65 33  .  zipfileWrite3
9930: 32 28 61 2c 20 70 43 64 73 2d 3e 63 72 63 33 32  2(a, pCds->crc32
9940: 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72 69 74  );.  zipfileWrit
9950: 65 33 32 28 61 2c 20 70 43 64 73 2d 3e 73 7a 43  e32(a, pCds->szC
9960: 6f 6d 70 72 65 73 73 65 64 29 3b 0a 20 20 7a 69  ompressed);.  zi
9970: 70 66 69 6c 65 57 72 69 74 65 33 32 28 61 2c 20  pfileWrite32(a, 
9980: 70 43 64 73 2d 3e 73 7a 55 6e 63 6f 6d 70 72 65  pCds->szUncompre
9990: 73 73 65 64 29 3b 0a 20 20 7a 69 70 66 69 6c 65  ssed);.  zipfile
99a0: 57 72 69 74 65 31 36 28 61 2c 20 28 75 31 36 29  Write16(a, (u16)
99b0: 70 43 64 73 2d 3e 6e 46 69 6c 65 29 3b 0a 20 20  pCds->nFile);.  
99c0: 7a 69 70 66 69 6c 65 57 72 69 74 65 31 36 28 61  zipfileWrite16(a
99d0: 2c 20 70 43 64 73 2d 3e 6e 45 78 74 72 61 29 3b  , pCds->nExtra);
99e0: 0a 20 20 61 73 73 65 72 74 28 20 61 3d 3d 26 61  .  assert( a==&a
99f0: 42 75 66 5b 5a 49 50 46 49 4c 45 5f 4c 46 48 5f  Buf[ZIPFILE_LFH_
9a00: 46 49 58 45 44 5f 53 5a 5d 20 29 3b 0a 0a 20 20  FIXED_SZ] );..  
9a10: 2f 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65 20  /* Add the file 
9a20: 6e 61 6d 65 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  name */.  memcpy
9a30: 28 61 2c 20 70 43 64 73 2d 3e 7a 46 69 6c 65 2c  (a, pCds->zFile,
9a40: 20 28 69 6e 74 29 70 43 64 73 2d 3e 6e 46 69 6c   (int)pCds->nFil
9a50: 65 29 3b 0a 20 20 61 20 2b 3d 20 28 69 6e 74 29  e);.  a += (int)
9a60: 70 43 64 73 2d 3e 6e 46 69 6c 65 3b 0a 0a 20 20  pCds->nFile;..  
9a70: 2f 2a 20 54 68 65 20 22 65 78 74 72 61 22 20 64  /* The "extra" d
9a80: 61 74 61 20 2a 2f 0a 20 20 7a 69 70 66 69 6c 65  ata */.  zipfile
9a90: 57 72 69 74 65 31 36 28 61 2c 20 5a 49 50 46 49  Write16(a, ZIPFI
9aa0: 4c 45 5f 45 58 54 52 41 5f 54 49 4d 45 53 54 41  LE_EXTRA_TIMESTA
9ab0: 4d 50 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72  MP);.  zipfileWr
9ac0: 69 74 65 31 36 28 61 2c 20 35 29 3b 0a 20 20 2a  ite16(a, 5);.  *
9ad0: 61 2b 2b 20 3d 20 30 78 30 31 3b 0a 20 20 7a 69  a++ = 0x01;.  zi
9ae0: 70 66 69 6c 65 57 72 69 74 65 33 32 28 61 2c 20  pfileWrite32(a, 
9af0: 70 45 6e 74 72 79 2d 3e 6d 55 6e 69 78 54 69 6d  pEntry->mUnixTim
9b00: 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 2d  e);..  return a-
9b10: 61 42 75 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  aBuf;.}..static 
9b20: 69 6e 74 20 7a 69 70 66 69 6c 65 41 70 70 65 6e  int zipfileAppen
9b30: 64 45 6e 74 72 79 28 0a 20 20 5a 69 70 66 69 6c  dEntry(.  Zipfil
9b40: 65 54 61 62 20 2a 70 54 61 62 2c 0a 20 20 5a 69  eTab *pTab,.  Zi
9b50: 70 66 69 6c 65 45 6e 74 72 79 20 2a 70 45 6e 74  pfileEntry *pEnt
9b60: 72 79 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ry,.  const u8 *
9b70: 70 44 61 74 61 2c 0a 20 20 69 6e 74 20 6e 44 61  pData,.  int nDa
9b80: 74 61 0a 29 7b 0a 20 20 75 38 20 2a 61 42 75 66  ta.){.  u8 *aBuf
9b90: 20 3d 20 70 54 61 62 2d 3e 61 42 75 66 66 65 72   = pTab->aBuffer
9ba0: 3b 0a 20 20 69 6e 74 20 6e 42 75 66 3b 0a 20 20  ;.  int nBuf;.  
9bb0: 69 6e 74 20 72 63 3b 0a 0a 20 20 6e 42 75 66 20  int rc;..  nBuf 
9bc0: 3d 20 7a 69 70 66 69 6c 65 53 65 72 69 61 6c 69  = zipfileSeriali
9bd0: 7a 65 4c 46 48 28 70 45 6e 74 72 79 2c 20 61 42  zeLFH(pEntry, aB
9be0: 75 66 29 3b 0a 20 20 72 63 20 3d 20 7a 69 70 66  uf);.  rc = zipf
9bf0: 69 6c 65 41 70 70 65 6e 64 44 61 74 61 28 70 54  ileAppendData(pT
9c00: 61 62 2c 20 61 42 75 66 2c 20 6e 42 75 66 29 3b  ab, aBuf, nBuf);
9c10: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
9c20: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 45 6e 74  E_OK ){.    pEnt
9c30: 72 79 2d 3e 69 44 61 74 61 4f 66 66 20 3d 20 70  ry->iDataOff = p
9c40: 54 61 62 2d 3e 73 7a 43 75 72 72 65 6e 74 3b 0a  Tab->szCurrent;.
9c50: 20 20 20 20 72 63 20 3d 20 7a 69 70 66 69 6c 65      rc = zipfile
9c60: 41 70 70 65 6e 64 44 61 74 61 28 70 54 61 62 2c  AppendData(pTab,
9c70: 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a   pData, nData);.
9c80: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
9c90: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
9ca0: 7a 69 70 66 69 6c 65 47 65 74 4d 6f 64 65 28 0a  zipfileGetMode(.
9cb0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
9cc0: 2a 70 56 61 6c 2c 20 0a 20 20 69 6e 74 20 62 49  *pVal, .  int bI
9cd0: 73 44 69 72 2c 20 20 20 20 20 20 20 20 20 20 20  sDir,           
9ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
9cf0: 74 72 75 65 2c 20 64 65 66 61 75 6c 74 20 74 6f  true, default to
9d00: 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20   directory */.  
9d10: 75 33 32 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20  u32 *pMode,     
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d30: 2f 2a 20 4f 55 54 3a 20 4d 6f 64 65 20 76 61 6c  /* OUT: Mode val
9d40: 75 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  ue */.  char **p
9d50: 7a 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20  zErr            
9d60: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
9d70: 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f  Error message */
9d80: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
9d90: 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61   *z = (const cha
9da0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
9db0: 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 75  _text(pVal);.  u
9dc0: 33 32 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 69  32 mode = 0;.  i
9dd0: 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  f( z==0 ){.    m
9de0: 6f 64 65 20 3d 20 28 62 49 73 44 69 72 20 3f 20  ode = (bIsDir ? 
9df0: 28 53 5f 49 46 44 49 52 20 2b 20 30 37 35 35 29  (S_IFDIR + 0755)
9e00: 20 3a 20 28 53 5f 49 46 52 45 47 20 2b 20 30 36   : (S_IFREG + 06
9e10: 34 34 29 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  44));.  }else if
9e20: 28 20 7a 5b 30 5d 3e 3d 27 30 27 20 26 26 20 7a  ( z[0]>='0' && z
9e30: 5b 30 5d 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20  [0]<='9' ){.    
9e40: 6d 6f 64 65 20 3d 20 28 75 6e 73 69 67 6e 65 64  mode = (unsigned
9e50: 20 69 6e 74 29 73 71 6c 69 74 65 33 5f 76 61 6c   int)sqlite3_val
9e60: 75 65 5f 69 6e 74 28 70 56 61 6c 29 3b 0a 20 20  ue_int(pVal);.  
9e70: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
9e80: 20 63 68 61 72 20 7a 54 65 6d 70 6c 61 74 65 5b   char zTemplate[
9e90: 31 31 5d 20 3d 20 22 2d 72 77 78 72 77 78 72 77  11] = "-rwxrwxrw
9ea0: 78 22 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  x";.    int i;. 
9eb0: 20 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 29     if( strlen(z)
9ec0: 21 3d 31 30 20 29 20 67 6f 74 6f 20 70 61 72 73  !=10 ) goto pars
9ed0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 73 77 69  e_error;.    swi
9ee0: 74 63 68 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20  tch( z[0] ){.   
9ef0: 20 20 20 63 61 73 65 20 27 2d 27 3a 20 6d 6f 64     case '-': mod
9f00: 65 20 7c 3d 20 53 5f 49 46 52 45 47 3b 20 62 72  e |= S_IFREG; br
9f10: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9f20: 27 64 27 3a 20 6d 6f 64 65 20 7c 3d 20 53 5f 49  'd': mode |= S_I
9f30: 46 44 49 52 3b 20 62 72 65 61 6b 3b 0a 20 20 20  FDIR; break;.   
9f40: 20 20 20 63 61 73 65 20 27 6c 27 3a 20 6d 6f 64     case 'l': mod
9f50: 65 20 7c 3d 20 53 5f 49 46 4c 4e 4b 3b 20 62 72  e |= S_IFLNK; br
9f60: 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75  eak;.      defau
9f70: 6c 74 3a 20 67 6f 74 6f 20 70 61 72 73 65 5f 65  lt: goto parse_e
9f80: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
9f90: 66 6f 72 28 69 3d 31 3b 20 69 3c 31 30 3b 20 69  for(i=1; i<10; i
9fa0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ++){.      if( z
9fb0: 5b 69 5d 3d 3d 7a 54 65 6d 70 6c 61 74 65 5b 69  [i]==zTemplate[i
9fc0: 5d 20 29 20 6d 6f 64 65 20 7c 3d 20 31 20 3c 3c  ] ) mode |= 1 <<
9fd0: 20 28 39 2d 69 29 3b 0a 20 20 20 20 20 20 65 6c   (9-i);.      el
9fe0: 73 65 20 69 66 28 20 7a 5b 69 5d 21 3d 27 2d 27  se if( z[i]!='-'
9ff0: 20 29 20 67 6f 74 6f 20 70 61 72 73 65 5f 65 72   ) goto parse_er
a000: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
a010: 20 69 66 28 20 28 28 6d 6f 64 65 20 26 20 53 5f   if( ((mode & S_
a020: 49 46 44 49 52 29 3d 3d 30 29 3d 3d 62 49 73 44  IFDIR)==0)==bIsD
a030: 69 72 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ir ){.    /* The
a040: 20 22 6d 6f 64 65 22 20 61 74 74 72 69 62 75 74   "mode" attribut
a050: 65 20 69 73 20 61 20 64 69 72 65 63 74 6f 72 79  e is a directory
a060: 2c 20 62 75 74 20 64 61 74 61 20 68 61 73 20 62  , but data has b
a070: 65 65 6e 20 73 70 65 63 69 66 69 65 64 2e 0a 20  een specified.. 
a080: 20 20 20 2a 2a 20 4f 72 20 76 69 63 65 2d 76 65     ** Or vice-ve
a090: 72 73 61 20 2d 20 6e 6f 20 64 61 74 61 20 62 75  rsa - no data bu
a0a0: 74 20 22 6d 6f 64 65 22 20 69 73 20 61 20 66 69  t "mode" is a fi
a0b0: 6c 65 20 6f 72 20 73 79 6d 6c 69 6e 6b 2e 20 20  le or symlink.  
a0c0: 2a 2f 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20  */.    *pzErr = 
a0d0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
a0e0: 22 7a 69 70 66 69 6c 65 3a 20 6d 6f 64 65 20 64  "zipfile: mode d
a0f0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 64 61  oes not match da
a100: 74 61 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ta");.    return
a110: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
a120: 4e 54 3b 0a 20 20 7d 0a 20 20 2a 70 4d 6f 64 65  NT;.  }.  *pMode
a130: 20 3d 20 6d 6f 64 65 3b 0a 20 20 72 65 74 75 72   = mode;.  retur
a140: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 70  n SQLITE_OK;.. p
a150: 61 72 73 65 5f 65 72 72 6f 72 3a 0a 20 20 2a 70  arse_error:.  *p
a160: 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zErr = sqlite3_m
a170: 70 72 69 6e 74 66 28 22 7a 69 70 66 69 6c 65 3a  printf("zipfile:
a180: 20 70 61 72 73 65 20 65 72 72 6f 72 20 69 6e 20   parse error in 
a190: 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20  mode: %s", z);. 
a1a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
a1b0: 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  RROR;.}../*.** B
a1c0: 6f 74 68 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  oth (const char*
a1d0: 29 20 61 72 67 75 6d 65 6e 74 73 20 70 6f 69 6e  ) arguments poin
a1e0: 74 20 74 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  t to nul-termina
a1f0: 74 65 64 20 73 74 72 69 6e 67 73 2e 20 41 72 67  ted strings. Arg
a200: 75 6d 65 6e 74 0a 2a 2a 20 6e 42 20 69 73 20 74  ument.** nB is t
a210: 68 65 20 76 61 6c 75 65 20 6f 66 20 73 74 72 6c  he value of strl
a220: 65 6e 28 7a 42 29 2e 20 54 68 69 73 20 66 75 6e  en(zB). This fun
a230: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 30 20  ction returns 0 
a240: 69 66 20 74 68 65 20 73 74 72 69 6e 67 73 20 61  if the strings a
a250: 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c  re.** identical,
a260: 20 69 67 6e 6f 72 69 6e 67 20 61 6e 79 20 74 72   ignoring any tr
a270: 61 69 6c 69 6e 67 20 27 2f 27 20 63 68 61 72 61  ailing '/' chara
a280: 63 74 65 72 20 69 6e 20 65 69 74 68 65 72 20 70  cter in either p
a290: 61 74 68 2e 20 20 2a 2f 0a 73 74 61 74 69 63 20  ath.  */.static 
a2a0: 69 6e 74 20 7a 69 70 66 69 6c 65 43 6f 6d 70 61  int zipfileCompa
a2b0: 72 65 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61  rePath(const cha
a2c0: 72 20 2a 7a 41 2c 20 63 6f 6e 73 74 20 63 68 61  r *zA, const cha
a2d0: 72 20 2a 7a 42 2c 20 69 6e 74 20 6e 42 29 7b 0a  r *zB, int nB){.
a2e0: 20 20 69 6e 74 20 6e 41 20 3d 20 28 69 6e 74 29    int nA = (int)
a2f0: 73 74 72 6c 65 6e 28 7a 41 29 3b 0a 20 20 69 66  strlen(zA);.  if
a300: 28 20 7a 41 5b 6e 41 2d 31 5d 3d 3d 27 2f 27 20  ( zA[nA-1]=='/' 
a310: 29 20 6e 41 2d 2d 3b 0a 20 20 69 66 28 20 7a 42  ) nA--;.  if( zB
a320: 5b 6e 42 2d 31 5d 3d 3d 27 2f 27 20 29 20 6e 42  [nB-1]=='/' ) nB
a330: 2d 2d 3b 0a 20 20 69 66 28 20 6e 41 3d 3d 6e 42  --;.  if( nA==nB
a340: 20 26 26 20 6d 65 6d 63 6d 70 28 7a 41 2c 20 7a   && memcmp(zA, z
a350: 42 2c 20 6e 41 29 3d 3d 30 20 29 20 72 65 74 75  B, nA)==0 ) retu
a360: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31  rn 0;.  return 1
a370: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
a380: 7a 69 70 66 69 6c 65 42 65 67 69 6e 28 73 71 6c  zipfileBegin(sql
a390: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
a3a0: 29 7b 0a 20 20 5a 69 70 66 69 6c 65 54 61 62 20  ){.  ZipfileTab 
a3b0: 2a 70 54 61 62 20 3d 20 28 5a 69 70 66 69 6c 65  *pTab = (Zipfile
a3c0: 54 61 62 2a 29 70 56 74 61 62 3b 0a 20 20 69 6e  Tab*)pVtab;.  in
a3d0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
a3e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
a3f0: 62 2d 3e 70 57 72 69 74 65 46 64 3d 3d 30 20 29  b->pWriteFd==0 )
a400: 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 77  ;..  /* Open a w
a410: 72 69 74 65 20 66 64 20 6f 6e 20 74 68 65 20 66  rite fd on the f
a420: 69 6c 65 2e 20 41 6c 73 6f 20 6c 6f 61 64 20 74  ile. Also load t
a430: 68 65 20 65 6e 74 69 72 65 20 63 65 6e 74 72 61  he entire centra
a440: 6c 20 64 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a  l directory.  **
a450: 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20   structure into 
a460: 6d 65 6d 6f 72 79 2e 20 44 75 72 69 6e 67 20 74  memory. During t
a470: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  he transaction a
a480: 6e 79 20 6e 65 77 20 66 69 6c 65 20 64 61 74 61  ny new file data
a490: 20 69 73 20 0a 20 20 2a 2a 20 61 70 70 65 6e 64   is .  ** append
a4a0: 65 64 20 74 6f 20 74 68 65 20 61 72 63 68 69 76  ed to the archiv
a4b0: 65 20 66 69 6c 65 2c 20 62 75 74 20 74 68 65 20  e file, but the 
a4c0: 63 65 6e 74 72 61 6c 20 64 69 72 65 63 74 6f 72  central director
a4d0: 79 20 69 73 20 61 63 63 75 6d 75 6c 61 74 65 64  y is accumulated
a4e0: 0a 20 20 2a 2a 20 69 6e 20 6d 61 69 6e 2d 6d 65  .  ** in main-me
a4f0: 6d 6f 72 79 20 75 6e 74 69 6c 20 74 68 65 20 74  mory until the t
a500: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
a510: 6d 6d 69 74 74 65 64 2e 20 20 2a 2f 0a 20 20 70  mmitted.  */.  p
a520: 54 61 62 2d 3e 70 57 72 69 74 65 46 64 20 3d 20  Tab->pWriteFd = 
a530: 66 6f 70 65 6e 28 70 54 61 62 2d 3e 7a 46 69 6c  fopen(pTab->zFil
a540: 65 2c 20 22 61 62 2b 22 29 3b 0a 20 20 69 66 28  e, "ab+");.  if(
a550: 20 70 54 61 62 2d 3e 70 57 72 69 74 65 46 64 3d   pTab->pWriteFd=
a560: 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  =0 ){.    pTab->
a570: 62 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73  base.zErrMsg = s
a580: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
a590: 20 20 20 20 20 20 20 20 22 7a 69 70 66 69 6c 65          "zipfile
a5a0: 3a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  : failed to open
a5b0: 20 66 69 6c 65 20 25 73 20 66 6f 72 20 77 72 69   file %s for wri
a5c0: 74 69 6e 67 22 2c 20 70 54 61 62 2d 3e 7a 46 69  ting", pTab->zFi
a5d0: 6c 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  le.        );.  
a5e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
a5f0: 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ROR;.  }else{.  
a600: 20 20 66 73 65 65 6b 28 70 54 61 62 2d 3e 70 57    fseek(pTab->pW
a610: 72 69 74 65 46 64 2c 20 30 2c 20 53 45 45 4b 5f  riteFd, 0, SEEK_
a620: 45 4e 44 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  END);.    pTab->
a630: 73 7a 43 75 72 72 65 6e 74 20 3d 20 70 54 61 62  szCurrent = pTab
a640: 2d 3e 73 7a 4f 72 69 67 20 3d 20 28 69 36 34 29  ->szOrig = (i64)
a650: 66 74 65 6c 6c 28 70 54 61 62 2d 3e 70 57 72 69  ftell(pTab->pWri
a660: 74 65 46 64 29 3b 0a 20 20 20 20 72 63 20 3d 20  teFd);.    rc = 
a670: 7a 69 70 66 69 6c 65 4c 6f 61 64 44 69 72 65 63  zipfileLoadDirec
a680: 74 6f 72 79 28 70 54 61 62 2c 20 30 2c 20 30 29  tory(pTab, 0, 0)
a690: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  ;.  }..  if( rc!
a6a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a6b0: 20 20 7a 69 70 66 69 6c 65 43 6c 65 61 6e 75 70    zipfileCleanup
a6c0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 54 61 62  Transaction(pTab
a6d0: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
a6e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
a6f0: 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
a700: 20 74 69 6d 65 20 61 73 20 61 20 33 32 2d 62 69   time as a 32-bi
a710: 74 20 74 69 6d 65 73 74 61 6d 70 20 69 6e 20 55  t timestamp in U
a720: 4e 49 58 20 65 70 6f 63 68 20 66 6f 72 6d 61 74  NIX epoch format
a730: 20 28 6c 69 6b 65 0a 2a 2a 20 74 69 6d 65 28 32   (like.** time(2
a740: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  ))..*/.static u3
a750: 32 20 7a 69 70 66 69 6c 65 54 69 6d 65 28 76 6f  2 zipfileTime(vo
a760: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  id){.  sqlite3_v
a770: 66 73 20 2a 70 56 66 73 20 3d 20 73 71 6c 69 74  fs *pVfs = sqlit
a780: 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
a790: 20 20 75 33 32 20 72 65 74 3b 0a 20 20 69 66 28    u32 ret;.  if(
a7a0: 20 70 56 66 73 2d 3e 69 56 65 72 73 69 6f 6e 3e   pVfs->iVersion>
a7b0: 3d 32 20 26 26 20 70 56 66 73 2d 3e 78 43 75 72  =2 && pVfs->xCur
a7c0: 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 29 7b  rentTimeInt64 ){
a7d0: 0a 20 20 20 20 69 36 34 20 6d 73 3b 0a 20 20 20  .    i64 ms;.   
a7e0: 20 70 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54   pVfs->xCurrentT
a7f0: 69 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26  imeInt64(pVfs, &
a800: 6d 73 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 28  ms);.    ret = (
a810: 75 33 32 29 28 28 6d 73 2f 31 30 30 30 29 20 2d  u32)((ms/1000) -
a820: 20 28 28 69 36 34 29 32 34 34 30 35 38 37 35 20   ((i64)24405875 
a830: 2a 20 38 36 34 30 29 29 3b 0a 20 20 7d 65 6c 73  * 8640));.  }els
a840: 65 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 64 61  e{.    double da
a850: 79 3b 0a 20 20 20 20 70 56 66 73 2d 3e 78 43 75  y;.    pVfs->xCu
a860: 72 72 65 6e 74 54 69 6d 65 28 70 56 66 73 2c 20  rrentTime(pVfs, 
a870: 26 64 61 79 29 3b 0a 20 20 20 20 72 65 74 20 3d  &day);.    ret =
a880: 20 28 75 33 32 29 28 28 64 61 79 20 2d 20 32 34   (u32)((day - 24
a890: 34 30 35 38 37 2e 35 29 20 2a 20 38 36 34 30 30  40587.5) * 86400
a8a0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
a8b0: 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ret;.}../*.** Re
a8c0: 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 74 69  turn a 32-bit ti
a8d0: 6d 65 73 74 61 6d 70 20 69 6e 20 55 4e 49 58 20  mestamp in UNIX 
a8e0: 65 70 6f 63 68 20 66 6f 72 6d 61 74 2e 0a 2a 2a  epoch format..**
a8f0: 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65  .** If the value
a900: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
a910: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  nly argument is 
a920: 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61  either NULL or a
a930: 6e 20 53 51 4c 20 4e 55 4c 4c 2c 0a 2a 2a 20 72  n SQL NULL,.** r
a940: 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
a950: 74 20 74 69 6d 65 2e 20 4f 74 68 65 72 77 69 73  t time. Otherwis
a960: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 76 61  e, return the va
a970: 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 28 2a  lue stored in (*
a980: 70 56 61 6c 29 0a 2a 2a 20 63 61 73 74 20 74 6f  pVal).** cast to
a990: 20 61 20 33 32 2d 62 69 74 20 75 6e 73 69 67 6e   a 32-bit unsign
a9a0: 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73  ed integer..*/.s
a9b0: 74 61 74 69 63 20 75 33 32 20 7a 69 70 66 69 6c  tatic u32 zipfil
a9c0: 65 47 65 74 54 69 6d 65 28 73 71 6c 69 74 65 33  eGetTime(sqlite3
a9d0: 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29 7b 0a 20  _value *pVal){. 
a9e0: 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 7c 7c 20   if( pVal==0 || 
a9f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
aa00: 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45  pe(pVal)==SQLITE
aa10: 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74  _NULL ){.    ret
aa20: 75 72 6e 20 7a 69 70 66 69 6c 65 54 69 6d 65 28  urn zipfileTime(
aa30: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
aa40: 28 75 33 32 29 73 71 6c 69 74 65 33 5f 76 61 6c  (u32)sqlite3_val
aa50: 75 65 5f 69 6e 74 36 34 28 70 56 61 6c 29 3b 0a  ue_int64(pVal);.
aa60: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  }../*.** Unless 
aa70: 69 74 20 69 73 20 4e 55 4c 4c 2c 20 65 6e 74 72  it is NULL, entr
aa80: 79 20 70 4f 6c 64 20 69 73 20 63 75 72 72 65 6e  y pOld is curren
aa90: 74 6c 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  tly part of the 
aaa0: 70 54 61 62 2d 3e 70 46 69 72 73 74 45 6e 74 72  pTab->pFirstEntr
aab0: 79 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74  y.** linked list
aac0: 2e 20 20 52 65 6d 6f 76 65 20 69 74 20 66 72 6f  .  Remove it fro
aad0: 6d 20 74 68 65 20 6c 69 73 74 20 61 6e 64 20 66  m the list and f
aae0: 72 65 65 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a  ree the object..
aaf0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
ab00: 69 70 66 69 6c 65 52 65 6d 6f 76 65 45 6e 74 72  ipfileRemoveEntr
ab10: 79 46 72 6f 6d 4c 69 73 74 28 5a 69 70 66 69 6c  yFromList(Zipfil
ab20: 65 54 61 62 20 2a 70 54 61 62 2c 20 5a 69 70 66  eTab *pTab, Zipf
ab30: 69 6c 65 45 6e 74 72 79 20 2a 70 4f 6c 64 29 7b  ileEntry *pOld){
ab40: 0a 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20  .  if( pOld ){. 
ab50: 20 20 20 5a 69 70 66 69 6c 65 45 6e 74 72 79 20     ZipfileEntry 
ab60: 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70  **pp;.    for(pp
ab70: 3d 26 70 54 61 62 2d 3e 70 46 69 72 73 74 45 6e  =&pTab->pFirstEn
ab80: 74 72 79 3b 20 28 2a 70 70 29 21 3d 70 4f 6c 64  try; (*pp)!=pOld
ab90: 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e  ; pp=&((*pp)->pN
aba0: 65 78 74 29 29 3b 0a 20 20 20 20 2a 70 70 20 3d  ext));.    *pp =
abb0: 20 28 2a 70 70 29 2d 3e 70 4e 65 78 74 3b 0a 20   (*pp)->pNext;. 
abc0: 20 20 20 7a 69 70 66 69 6c 65 45 6e 74 72 79 46     zipfileEntryF
abd0: 72 65 65 28 70 4f 6c 64 29 3b 0a 20 20 7d 0a 7d  ree(pOld);.  }.}
abe0: 0a 0a 2f 2a 0a 2a 2a 20 78 55 70 64 61 74 65 20  ../*.** xUpdate 
abf0: 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69  method..*/.stati
ac00: 63 20 69 6e 74 20 7a 69 70 66 69 6c 65 55 70 64  c int zipfileUpd
ac10: 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ate(.  sqlite3_v
ac20: 74 61 62 20 2a 70 56 74 61 62 2c 20 0a 20 20 69  tab *pVtab, .  i
ac30: 6e 74 20 6e 56 61 6c 2c 20 0a 20 20 73 71 6c 69  nt nVal, .  sqli
ac40: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
ac50: 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74  l, .  sqlite_int
ac60: 36 34 20 2a 70 52 6f 77 69 64 0a 29 7b 0a 20 20  64 *pRowid.){.  
ac70: 5a 69 70 66 69 6c 65 54 61 62 20 2a 70 54 61 62  ZipfileTab *pTab
ac80: 20 3d 20 28 5a 69 70 66 69 6c 65 54 61 62 2a 29   = (ZipfileTab*)
ac90: 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20  pVtab;.  int rc 
aca0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
acb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
acc0: 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 5a 69 70  rn Code */.  Zip
acd0: 66 69 6c 65 45 6e 74 72 79 20 2a 70 4e 65 77 20  fileEntry *pNew 
ace0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
acf0: 4e 65 77 20 69 6e 2d 6d 65 6d 6f 72 79 20 43 44  New in-memory CD
ad00: 53 20 65 6e 74 72 79 20 2a 2f 0a 0a 20 20 75 33  S entry */..  u3
ad10: 32 20 6d 6f 64 65 20 3d 20 30 3b 20 20 20 20 20  2 mode = 0;     
ad20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ad30: 20 4d 6f 64 65 20 66 6f 72 20 6e 65 77 20 65 6e   Mode for new en
ad40: 74 72 79 20 2a 2f 0a 20 20 75 33 32 20 6d 54 69  try */.  u32 mTi
ad50: 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  me = 0;         
ad60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 69           /* Modi
ad70: 66 69 63 61 74 69 6f 6e 20 74 69 6d 65 20 66 6f  fication time fo
ad80: 72 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20  r new entry */. 
ad90: 20 69 36 34 20 73 7a 20 3d 20 30 3b 20 20 20 20   i64 sz = 0;    
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adb0: 20 2f 2a 20 55 6e 63 6f 6d 70 72 65 73 73 65 64   /* Uncompressed
adc0: 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   size */.  const
add0: 20 63 68 61 72 20 2a 7a 50 61 74 68 20 3d 20 30   char *zPath = 0
ade0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ;          /* Pa
adf0: 74 68 20 66 6f 72 20 6e 65 77 20 65 6e 74 72 79  th for new entry
ae00: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 20   */.  int nPath 
ae10: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
ae20: 20 20 20 20 20 20 2f 2a 20 73 74 72 6c 65 6e 28        /* strlen(
ae30: 7a 50 61 74 68 29 20 2a 2f 0a 20 20 63 6f 6e 73  zPath) */.  cons
ae40: 74 20 75 38 20 2a 70 44 61 74 61 20 3d 20 30 3b  t u8 *pData = 0;
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
ae60: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
ae70: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6e 74   containing cont
ae80: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61  ent */.  int nDa
ae90: 74 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ta = 0;         
aea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
aeb0: 20 6f 66 20 70 44 61 74 61 20 62 75 66 66 65 72   of pData buffer
aec0: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
aed0: 6e 74 20 69 4d 65 74 68 6f 64 20 3d 20 30 3b 20  nt iMethod = 0; 
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aef0: 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 6d 65  * Compression me
af00: 74 68 6f 64 20 66 6f 72 20 6e 65 77 20 65 6e 74  thod for new ent
af10: 72 79 20 2a 2f 0a 20 20 75 38 20 2a 70 46 72 65  ry */.  u8 *pFre
af20: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
af30: 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20          /* Free 
af40: 74 68 69 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  this */.  char *
af50: 7a 46 72 65 65 20 3d 20 30 3b 20 20 20 20 20 20  zFree = 0;      
af60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 73            /* Als
af70: 6f 20 66 72 65 65 20 74 68 69 73 20 2a 2f 0a 20  o free this */. 
af80: 20 5a 69 70 66 69 6c 65 45 6e 74 72 79 20 2a 70   ZipfileEntry *p
af90: 4f 6c 64 20 3d 20 30 3b 0a 20 20 5a 69 70 66 69  Old = 0;.  Zipfi
afa0: 6c 65 45 6e 74 72 79 20 2a 70 4f 6c 64 32 20 3d  leEntry *pOld2 =
afb0: 20 30 3b 0a 20 20 69 6e 74 20 62 55 70 64 61 74   0;.  int bUpdat
afc0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
afd0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
afe0: 72 20 61 6e 20 75 70 64 61 74 65 20 74 68 61 74  r an update that
aff0: 20 6d 6f 64 69 66 69 65 73 20 22 6e 61 6d 65 22   modifies "name"
b000: 20 2a 2f 0a 20 20 69 6e 74 20 62 49 73 44 69 72   */.  int bIsDir
b010: 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 43 72 63   = 0;.  u32 iCrc
b020: 33 32 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  32 = 0;..  if( p
b030: 54 61 62 2d 3e 70 57 72 69 74 65 46 64 3d 3d 30  Tab->pWriteFd==0
b040: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 7a 69 70   ){.    rc = zip
b050: 66 69 6c 65 42 65 67 69 6e 28 70 56 74 61 62 29  fileBegin(pVtab)
b060: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
b070: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
b080: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   rc;.  }..  /* I
b090: 66 20 74 68 69 73 20 69 73 20 61 20 44 45 4c 45  f this is a DELE
b0a0: 54 45 20 6f 72 20 55 50 44 41 54 45 2c 20 66 69  TE or UPDATE, fi
b0b0: 6e 64 20 74 68 65 20 61 72 63 68 69 76 65 20 65  nd the archive e
b0c0: 6e 74 72 79 20 74 6f 20 64 65 6c 65 74 65 2e 20  ntry to delete. 
b0d0: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
b0e0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
b0f0: 6c 5b 30 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55  l[0])!=SQLITE_NU
b100: 4c 4c 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  LL ){.    const 
b110: 63 68 61 72 20 2a 7a 44 65 6c 65 74 65 20 3d 20  char *zDelete = 
b120: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
b130: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
b140: 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20 69  apVal[0]);.    i
b150: 6e 74 20 6e 44 65 6c 65 74 65 20 3d 20 28 69 6e  nt nDelete = (in
b160: 74 29 73 74 72 6c 65 6e 28 7a 44 65 6c 65 74 65  t)strlen(zDelete
b170: 29 3b 0a 20 20 20 20 69 66 28 20 6e 56 61 6c 3e  );.    if( nVal>
b180: 31 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  1 ){.      const
b190: 20 63 68 61 72 20 2a 7a 55 70 64 61 74 65 20 3d   char *zUpdate =
b1a0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
b1b0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
b1c0: 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20  (apVal[1]);.    
b1d0: 20 20 69 66 28 20 7a 55 70 64 61 74 65 20 26 26    if( zUpdate &&
b1e0: 20 7a 69 70 66 69 6c 65 43 6f 6d 70 61 72 65 50   zipfileCompareP
b1f0: 61 74 68 28 7a 55 70 64 61 74 65 2c 20 7a 44 65  ath(zUpdate, zDe
b200: 6c 65 74 65 2c 20 6e 44 65 6c 65 74 65 29 21 3d  lete, nDelete)!=
b210: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 55 70  0 ){.        bUp
b220: 64 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  date = 1;.      
b230: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  }.    }.    for(
b240: 70 4f 6c 64 3d 70 54 61 62 2d 3e 70 46 69 72 73  pOld=pTab->pFirs
b250: 74 45 6e 74 72 79 3b 20 31 3b 20 70 4f 6c 64 3d  tEntry; 1; pOld=
b260: 70 4f 6c 64 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pOld->pNext){.  
b270: 20 20 20 20 69 66 28 20 7a 69 70 66 69 6c 65 43      if( zipfileC
b280: 6f 6d 70 61 72 65 50 61 74 68 28 70 4f 6c 64 2d  omparePath(pOld-
b290: 3e 63 64 73 2e 7a 46 69 6c 65 2c 20 7a 44 65 6c  >cds.zFile, zDel
b2a0: 65 74 65 2c 20 6e 44 65 6c 65 74 65 29 3d 3d 30  ete, nDelete)==0
b2b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
b2c0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
b2d0: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 70   assert( pOld->p
b2e0: 4e 65 78 74 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Next );.    }.  
b2f0: 7d 0a 0a 20 20 69 66 28 20 6e 56 61 6c 3e 31 20  }..  if( nVal>1 
b300: 29 7b 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ){.    /* Check 
b310: 74 68 61 74 20 22 73 7a 22 20 61 6e 64 20 22 72  that "sz" and "r
b320: 61 77 64 61 74 61 22 20 61 72 65 20 62 6f 74 68  awdata" are both
b330: 20 4e 55 4c 4c 3a 20 2a 2f 0a 20 20 20 20 69 66   NULL: */.    if
b340: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
b350: 74 79 70 65 28 61 70 56 61 6c 5b 35 5d 29 21 3d  type(apVal[5])!=
b360: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
b370: 20 20 20 20 20 7a 69 70 66 69 6c 65 54 61 62 6c       zipfileTabl
b380: 65 45 72 72 28 70 54 61 62 2c 20 22 73 7a 20 6d  eErr(pTab, "sz m
b390: 75 73 74 20 62 65 20 4e 55 4c 4c 22 29 3b 0a 20  ust be NULL");. 
b3a0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
b3b0: 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
b3c0: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
b3d0: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70  e3_value_type(ap
b3e0: 56 61 6c 5b 36 5d 29 21 3d 53 51 4c 49 54 45 5f  Val[6])!=SQLITE_
b3f0: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 7a 69  NULL ){.      zi
b400: 70 66 69 6c 65 54 61 62 6c 65 45 72 72 28 70 54  pfileTableErr(pT
b410: 61 62 2c 20 22 72 61 77 64 61 74 61 20 6d 75 73  ab, "rawdata mus
b420: 74 20 62 65 20 4e 55 4c 4c 22 29 3b 20 0a 20 20  t be NULL"); .  
b430: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
b440: 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20  CONSTRAINT;.    
b450: 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
b460: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b470: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
b480: 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 37  lue_type(apVal[7
b490: 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])==SQLITE_NULL 
b4a0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 64 61  ){.        /* da
b4b0: 74 61 3d 4e 55 4c 4c 2e 20 41 20 64 69 72 65 63  ta=NULL. A direc
b4c0: 74 6f 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  tory */.        
b4d0: 62 49 73 44 69 72 20 3d 20 31 3b 0a 20 20 20 20  bIsDir = 1;.    
b4e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b4f0: 20 2f 2a 20 56 61 6c 75 65 20 73 70 65 63 69 66   /* Value specif
b500: 69 65 64 20 66 6f 72 20 22 64 61 74 61 22 2c 20  ied for "data", 
b510: 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 22 6d 65  and possibly "me
b520: 74 68 6f 64 22 2e 20 54 68 69 73 20 6d 75 73 74  thod". This must
b530: 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   be.        ** a
b540: 20 72 65 67 75 6c 61 72 20 66 69 6c 65 20 6f 72   regular file or
b550: 20 61 20 73 79 6d 6c 69 6e 6b 2e 20 2a 2f 0a 20   a symlink. */. 
b560: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20         const u8 
b570: 2a 61 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  *aIn = sqlite3_v
b580: 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b  alue_blob(apVal[
b590: 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  7]);.        int
b5a0: 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76   nIn = sqlite3_v
b5b0: 61 6c 75 65 5f 62 79 74 65 73 28 61 70 56 61 6c  alue_bytes(apVal
b5c0: 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  [7]);.        in
b5d0: 74 20 62 41 75 74 6f 20 3d 20 73 71 6c 69 74 65  t bAuto = sqlite
b5e0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56  3_value_type(apV
b5f0: 61 6c 5b 38 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  al[8])==SQLITE_N
b600: 55 4c 4c 3b 0a 0a 20 20 20 20 20 20 20 20 69 4d  ULL;..        iM
b610: 65 74 68 6f 64 20 3d 20 73 71 6c 69 74 65 33 5f  ethod = sqlite3_
b620: 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
b630: 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 20  8]);.        sz 
b640: 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20 70  = nIn;.        p
b650: 44 61 74 61 20 3d 20 61 49 6e 3b 0a 20 20 20 20  Data = aIn;.    
b660: 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 49 6e 3b      nData = nIn;
b670: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4d 65  .        if( iMe
b680: 74 68 6f 64 21 3d 30 20 26 26 20 69 4d 65 74 68  thod!=0 && iMeth
b690: 6f 64 21 3d 38 20 29 7b 0a 20 20 20 20 20 20 20  od!=8 ){.       
b6a0: 20 20 20 7a 69 70 66 69 6c 65 54 61 62 6c 65 45     zipfileTableE
b6b0: 72 72 28 70 54 61 62 2c 20 22 75 6e 6b 6e 6f 77  rr(pTab, "unknow
b6c0: 6e 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 6d 65  n compression me
b6d0: 74 68 6f 64 3a 20 25 64 22 2c 20 69 4d 65 74 68  thod: %d", iMeth
b6e0: 6f 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  od);.          r
b6f0: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
b700: 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 7d  RAINT;.        }
b710: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
b720: 69 66 28 20 62 41 75 74 6f 20 7c 7c 20 69 4d 65  if( bAuto || iMe
b730: 74 68 6f 64 20 29 7b 0a 20 20 20 20 20 20 20 20  thod ){.        
b740: 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20      int nCmp;.  
b750: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 7a            rc = z
b760: 69 70 66 69 6c 65 44 65 66 6c 61 74 65 28 61 49  ipfileDeflate(aI
b770: 6e 2c 20 6e 49 6e 2c 20 26 70 46 72 65 65 2c 20  n, nIn, &pFree, 
b780: 26 6e 43 6d 70 2c 20 26 70 54 61 62 2d 3e 62 61  &nCmp, &pTab->ba
b790: 73 65 2e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  se.zErrMsg);.   
b7a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
b7b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
b7d0: 69 4d 65 74 68 6f 64 20 7c 7c 20 6e 43 6d 70 3c  iMethod || nCmp<
b7e0: 6e 49 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nIn ){.         
b7f0: 20 20 20 20 20 20 20 69 4d 65 74 68 6f 64 20 3d         iMethod =
b800: 20 38 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   8;.            
b810: 20 20 20 20 70 44 61 74 61 20 3d 20 70 46 72 65      pData = pFre
b820: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
b830: 20 20 20 6e 44 61 74 61 20 3d 20 6e 43 6d 70 3b     nData = nCmp;
b840: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
b850: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
b860: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b870: 20 20 20 20 20 69 43 72 63 33 32 20 3d 20 63 72       iCrc32 = cr
b880: 63 33 32 28 30 2c 20 61 49 6e 2c 20 6e 49 6e 29  c32(0, aIn, nIn)
b890: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b8a0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
b8b0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b8c0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a   ){.      rc = z
b8d0: 69 70 66 69 6c 65 47 65 74 4d 6f 64 65 28 61 70  ipfileGetMode(ap
b8e0: 56 61 6c 5b 33 5d 2c 20 62 49 73 44 69 72 2c 20  Val[3], bIsDir, 
b8f0: 26 6d 6f 64 65 2c 20 26 70 54 61 62 2d 3e 62 61  &mode, &pTab->ba
b900: 73 65 2e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  se.zErrMsg);.   
b910: 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
b920: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b930: 20 20 20 7a 50 61 74 68 20 3d 20 28 63 6f 6e 73     zPath = (cons
b940: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
b950: 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
b960: 5b 32 5d 29 3b 0a 20 20 20 20 20 20 6e 50 61 74  [2]);.      nPat
b970: 68 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  h = (int)strlen(
b980: 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 6d 54  zPath);.      mT
b990: 69 6d 65 20 3d 20 7a 69 70 66 69 6c 65 47 65 74  ime = zipfileGet
b9a0: 54 69 6d 65 28 61 70 56 61 6c 5b 34 5d 29 3b 0a  Time(apVal[4]);.
b9b0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
b9c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
b9d0: 62 49 73 44 69 72 20 29 7b 0a 20 20 20 20 20 20  bIsDir ){.      
b9e0: 2f 2a 20 46 6f 72 20 61 20 64 69 72 65 63 74 6f  /* For a directo
b9f0: 72 79 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74  ry, check that t
ba00: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
ba10: 72 20 69 6e 20 74 68 65 20 70 61 74 68 20 69 73  r in the path is
ba20: 20 61 0a 20 20 20 20 20 20 2a 2a 20 27 2f 27 2e   a.      ** '/'.
ba30: 20 54 68 69 73 20 61 70 70 65 61 72 73 20 74 6f   This appears to
ba40: 20 62 65 20 72 65 71 75 69 72 65 64 20 66 6f 72   be required for
ba50: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
ba60: 69 74 68 20 69 6e 66 6f 2d 7a 69 70 0a 20 20 20  ith info-zip.   
ba70: 20 20 20 2a 2a 20 28 74 68 65 20 75 6e 7a 69 70     ** (the unzip
ba80: 20 63 6f 6d 6d 61 6e 64 20 6f 6e 20 75 6e 69 78   command on unix
ba90: 29 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63  ). It does not c
baa0: 72 65 61 74 65 20 64 69 72 65 63 74 6f 72 69 65  reate directorie
bab0: 73 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  s.      ** other
bac0: 77 69 73 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  wise.  */.      
bad0: 69 66 28 20 7a 50 61 74 68 5b 6e 50 61 74 68 2d  if( zPath[nPath-
bae0: 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  1]!='/' ){.     
baf0: 20 20 20 7a 46 72 65 65 20 3d 20 73 71 6c 69 74     zFree = sqlit
bb00: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f 22  e3_mprintf("%s/"
bb10: 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  , zPath);.      
bb20: 20 20 69 66 28 20 7a 46 72 65 65 3d 3d 30 20 29    if( zFree==0 )
bb30: 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  { rc = SQLITE_NO
bb40: 4d 45 4d 3b 20 7d 0a 20 20 20 20 20 20 20 20 7a  MEM; }.        z
bb50: 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68  Path = (const ch
bb60: 61 72 2a 29 7a 46 72 65 65 3b 0a 20 20 20 20 20  ar*)zFree;.     
bb70: 20 20 20 6e 50 61 74 68 2b 2b 3b 0a 20 20 20 20     nPath++;.    
bb80: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
bb90: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 77 65 27  * Check that we'
bba0: 72 65 20 6e 6f 74 20 69 6e 73 65 72 74 69 6e 67  re not inserting
bbb0: 20 61 20 64 75 70 6c 69 63 61 74 65 20 65 6e 74   a duplicate ent
bbc0: 72 79 20 2d 4f 52 2d 20 75 70 64 61 74 69 6e 67  ry -OR- updating
bbd0: 20 61 6e 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79   an.    ** entry
bbe0: 20 77 69 74 68 20 61 20 70 61 74 68 2c 20 74 68   with a path, th
bbf0: 65 72 65 62 79 20 6d 61 6b 69 6e 67 20 69 74 20  ereby making it 
bc00: 69 6e 74 6f 20 61 20 64 75 70 6c 69 63 61 74 65  into a duplicate
bc10: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 4f  . */.    if( (pO
bc20: 6c 64 3d 3d 30 20 7c 7c 20 62 55 70 64 61 74 65  ld==0 || bUpdate
bc30: 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ) && rc==SQLITE_
bc40: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 5a 69 70 66  OK ){.      Zipf
bc50: 69 6c 65 45 6e 74 72 79 20 2a 70 3b 0a 20 20 20  ileEntry *p;.   
bc60: 20 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70     for(p=pTab->p
bc70: 46 69 72 73 74 45 6e 74 72 79 3b 20 70 3b 20 70  FirstEntry; p; p
bc80: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
bc90: 20 20 20 20 69 66 28 20 7a 69 70 66 69 6c 65 43      if( zipfileC
bca0: 6f 6d 70 61 72 65 50 61 74 68 28 70 2d 3e 63 64  omparePath(p->cd
bcb0: 73 2e 7a 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20  s.zFile, zPath, 
bcc0: 6e 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20  nPath)==0 ){.   
bcd0: 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73         switch( s
bce0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 6f 6e 5f 63  qlite3_vtab_on_c
bcf0: 6f 6e 66 6c 69 63 74 28 70 54 61 62 2d 3e 64 62  onflict(pTab->db
bd00: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
bd10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 47 4e   case SQLITE_IGN
bd20: 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ORE: {.         
bd30: 20 20 20 20 20 67 6f 74 6f 20 7a 69 70 66 69 6c       goto zipfil
bd40: 65 5f 75 70 64 61 74 65 5f 64 6f 6e 65 3b 0a 20  e_update_done;. 
bd50: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
bd60: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
bd70: 4c 49 54 45 5f 52 45 50 4c 41 43 45 3a 20 7b 0a  LITE_REPLACE: {.
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
bd90: 6c 64 32 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ld2 = p;.       
bda0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bdb0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
bdc0: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
bdd0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
bde0: 20 7a 69 70 66 69 6c 65 54 61 62 6c 65 45 72 72   zipfileTableErr
bdf0: 28 70 54 61 62 2c 20 22 64 75 70 6c 69 63 61 74  (pTab, "duplicat
be00: 65 20 6e 61 6d 65 3a 20 5c 22 25 73 5c 22 22 2c  e name: \"%s\"",
be10: 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20   zPath);.       
be20: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
be30: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
be50: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
be60: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
be70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
be80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
be90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
bea0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
beb0: 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  .      /* Create
bec0: 20 74 68 65 20 6e 65 77 20 43 44 53 20 72 65 63   the new CDS rec
bed0: 6f 72 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e  ord. */.      pN
bee0: 65 77 20 3d 20 7a 69 70 66 69 6c 65 4e 65 77 45  ew = zipfileNewE
bef0: 6e 74 72 79 28 7a 50 61 74 68 29 3b 0a 20 20 20  ntry(zPath);.   
bf00: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
bf10: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
bf20: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
bf30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bf40: 20 20 70 4e 65 77 2d 3e 63 64 73 2e 69 56 65 72    pNew->cds.iVer
bf50: 73 69 6f 6e 4d 61 64 65 42 79 20 3d 20 5a 49 50  sionMadeBy = ZIP
bf60: 46 49 4c 45 5f 4e 45 57 45 4e 54 52 59 5f 4d 41  FILE_NEWENTRY_MA
bf70: 44 45 42 59 3b 0a 20 20 20 20 20 20 20 20 70 4e  DEBY;.        pN
bf80: 65 77 2d 3e 63 64 73 2e 69 56 65 72 73 69 6f 6e  ew->cds.iVersion
bf90: 45 78 74 72 61 63 74 20 3d 20 5a 49 50 46 49 4c  Extract = ZIPFIL
bfa0: 45 5f 4e 45 57 45 4e 54 52 59 5f 52 45 51 55 49  E_NEWENTRY_REQUI
bfb0: 52 45 44 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  RED;.        pNe
bfc0: 77 2d 3e 63 64 73 2e 66 6c 61 67 73 20 3d 20 5a  w->cds.flags = Z
bfd0: 49 50 46 49 4c 45 5f 4e 45 57 45 4e 54 52 59 5f  IPFILE_NEWENTRY_
bfe0: 46 4c 41 47 53 3b 0a 20 20 20 20 20 20 20 20 70  FLAGS;.        p
bff0: 4e 65 77 2d 3e 63 64 73 2e 69 43 6f 6d 70 72 65  New->cds.iCompre
c000: 73 73 69 6f 6e 20 3d 20 28 75 31 36 29 69 4d 65  ssion = (u16)iMe
c010: 74 68 6f 64 3b 0a 20 20 20 20 20 20 20 20 7a 69  thod;.        zi
c020: 70 66 69 6c 65 4d 74 69 6d 65 54 6f 44 6f 73 28  pfileMtimeToDos(
c030: 26 70 4e 65 77 2d 3e 63 64 73 2c 20 6d 54 69 6d  &pNew->cds, mTim
c040: 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  e);.        pNew
c050: 2d 3e 63 64 73 2e 63 72 63 33 32 20 3d 20 69 43  ->cds.crc32 = iC
c060: 72 63 33 32 3b 0a 20 20 20 20 20 20 20 20 70 4e  rc32;.        pN
c070: 65 77 2d 3e 63 64 73 2e 73 7a 43 6f 6d 70 72 65  ew->cds.szCompre
c080: 73 73 65 64 20 3d 20 6e 44 61 74 61 3b 0a 20 20  ssed = nData;.  
c090: 20 20 20 20 20 20 70 4e 65 77 2d 3e 63 64 73 2e        pNew->cds.
c0a0: 73 7a 55 6e 63 6f 6d 70 72 65 73 73 65 64 20 3d  szUncompressed =
c0b0: 20 28 75 33 32 29 73 7a 3b 0a 20 20 20 20 20 20   (u32)sz;.      
c0c0: 20 20 70 4e 65 77 2d 3e 63 64 73 2e 69 45 78 74    pNew->cds.iExt
c0d0: 65 72 6e 61 6c 41 74 74 72 20 3d 20 28 6d 6f 64  ernalAttr = (mod
c0e0: 65 3c 3c 31 36 29 3b 0a 20 20 20 20 20 20 20 20  e<<16);.        
c0f0: 70 4e 65 77 2d 3e 63 64 73 2e 69 4f 66 66 73 65  pNew->cds.iOffse
c100: 74 20 3d 20 28 75 33 32 29 70 54 61 62 2d 3e 73  t = (u32)pTab->s
c110: 7a 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20  zCurrent;.      
c120: 20 20 70 4e 65 77 2d 3e 63 64 73 2e 6e 46 69 6c    pNew->cds.nFil
c130: 65 20 3d 20 28 75 31 36 29 6e 50 61 74 68 3b 0a  e = (u16)nPath;.
c140: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6d 55          pNew->mU
c150: 6e 69 78 54 69 6d 65 20 3d 20 28 75 33 32 29 6d  nixTime = (u32)m
c160: 54 69 6d 65 3b 0a 20 20 20 20 20 20 20 20 72 63  Time;.        rc
c170: 20 3d 20 7a 69 70 66 69 6c 65 41 70 70 65 6e 64   = zipfileAppend
c180: 45 6e 74 72 79 28 70 54 61 62 2c 20 70 4e 65 77  Entry(pTab, pNew
c190: 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b  , pData, nData);
c1a0: 0a 20 20 20 20 20 20 20 20 7a 69 70 66 69 6c 65  .        zipfile
c1b0: 41 64 64 45 6e 74 72 79 28 70 54 61 62 2c 20 70  AddEntry(pTab, p
c1c0: 4f 6c 64 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  Old, pNew);.    
c1d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
c1e0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c1f0: 4f 4b 20 26 26 20 28 70 4f 6c 64 20 7c 7c 20 70  OK && (pOld || p
c200: 4f 6c 64 32 29 20 29 7b 0a 20 20 20 20 5a 69 70  Old2) ){.    Zip
c210: 66 69 6c 65 43 73 72 20 2a 70 43 73 72 3b 0a 20  fileCsr *pCsr;. 
c220: 20 20 20 66 6f 72 28 70 43 73 72 3d 70 54 61 62     for(pCsr=pTab
c230: 2d 3e 70 43 73 72 4c 69 73 74 3b 20 70 43 73 72  ->pCsrList; pCsr
c240: 3b 20 70 43 73 72 3d 70 43 73 72 2d 3e 70 43 73  ; pCsr=pCsr->pCs
c250: 72 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  rNext){.      if
c260: 28 20 70 43 73 72 2d 3e 70 43 75 72 72 65 6e 74  ( pCsr->pCurrent
c270: 20 26 26 20 28 70 43 73 72 2d 3e 70 43 75 72 72   && (pCsr->pCurr
c280: 65 6e 74 3d 3d 70 4f 6c 64 20 7c 7c 20 70 43 73  ent==pOld || pCs
c290: 72 2d 3e 70 43 75 72 72 65 6e 74 3d 3d 70 4f 6c  r->pCurrent==pOl
c2a0: 64 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  d2) ){.        p
c2b0: 43 73 72 2d 3e 70 43 75 72 72 65 6e 74 20 3d 20  Csr->pCurrent = 
c2c0: 70 43 73 72 2d 3e 70 43 75 72 72 65 6e 74 2d 3e  pCsr->pCurrent->
c2d0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70  pNext;.        p
c2e0: 43 73 72 2d 3e 62 4e 6f 6f 70 20 3d 20 31 3b 0a  Csr->bNoop = 1;.
c2f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
c300: 20 20 20 7a 69 70 66 69 6c 65 52 65 6d 6f 76 65     zipfileRemove
c310: 45 6e 74 72 79 46 72 6f 6d 4c 69 73 74 28 70 54  EntryFromList(pT
c320: 61 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7a  ab, pOld);.    z
c330: 69 70 66 69 6c 65 52 65 6d 6f 76 65 45 6e 74 72  ipfileRemoveEntr
c340: 79 46 72 6f 6d 4c 69 73 74 28 70 54 61 62 2c 20  yFromList(pTab, 
c350: 70 4f 6c 64 32 29 3b 0a 20 20 7d 0a 0a 7a 69 70  pOld2);.  }..zip
c360: 66 69 6c 65 5f 75 70 64 61 74 65 5f 64 6f 6e 65  file_update_done
c370: 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
c380: 28 70 46 72 65 65 29 3b 0a 20 20 73 71 6c 69 74  (pFree);.  sqlit
c390: 65 33 5f 66 72 65 65 28 7a 46 72 65 65 29 3b 0a  e3_free(zFree);.
c3a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c3b0: 73 74 61 74 69 63 20 69 6e 74 20 7a 69 70 66 69  static int zipfi
c3c0: 6c 65 53 65 72 69 61 6c 69 7a 65 45 4f 43 44 28  leSerializeEOCD(
c3d0: 5a 69 70 66 69 6c 65 45 4f 43 44 20 2a 70 2c 20  ZipfileEOCD *p, 
c3e0: 75 38 20 2a 61 42 75 66 29 7b 0a 20 20 75 38 20  u8 *aBuf){.  u8 
c3f0: 2a 61 20 3d 20 61 42 75 66 3b 0a 20 20 7a 69 70  *a = aBuf;.  zip
c400: 66 69 6c 65 57 72 69 74 65 33 32 28 61 2c 20 5a  fileWrite32(a, Z
c410: 49 50 46 49 4c 45 5f 53 49 47 4e 41 54 55 52 45  IPFILE_SIGNATURE
c420: 5f 45 4f 43 44 29 3b 0a 20 20 7a 69 70 66 69 6c  _EOCD);.  zipfil
c430: 65 57 72 69 74 65 31 36 28 61 2c 20 70 2d 3e 69  eWrite16(a, p->i
c440: 44 69 73 6b 29 3b 0a 20 20 7a 69 70 66 69 6c 65  Disk);.  zipfile
c450: 57 72 69 74 65 31 36 28 61 2c 20 70 2d 3e 69 46  Write16(a, p->iF
c460: 69 72 73 74 44 69 73 6b 29 3b 0a 20 20 7a 69 70  irstDisk);.  zip
c470: 66 69 6c 65 57 72 69 74 65 31 36 28 61 2c 20 70  fileWrite16(a, p
c480: 2d 3e 6e 45 6e 74 72 79 29 3b 0a 20 20 7a 69 70  ->nEntry);.  zip
c490: 66 69 6c 65 57 72 69 74 65 31 36 28 61 2c 20 70  fileWrite16(a, p
c4a0: 2d 3e 6e 45 6e 74 72 79 54 6f 74 61 6c 29 3b 0a  ->nEntryTotal);.
c4b0: 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65 33 32    zipfileWrite32
c4c0: 28 61 2c 20 70 2d 3e 6e 53 69 7a 65 29 3b 0a 20  (a, p->nSize);. 
c4d0: 20 7a 69 70 66 69 6c 65 57 72 69 74 65 33 32 28   zipfileWrite32(
c4e0: 61 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a  a, p->iOffset);.
c4f0: 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65 31 36    zipfileWrite16
c500: 28 61 2c 20 30 29 3b 20 20 20 20 20 20 20 20 2f  (a, 0);        /
c510: 2a 20 53 69 7a 65 20 6f 66 20 74 72 61 69 6c 69  * Size of traili
c520: 6e 67 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 62 79  ng comment in by
c530: 74 65 73 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20  tes*/..  return 
c540: 61 2d 61 42 75 66 3b 0a 7d 0a 0a 73 74 61 74 69  a-aBuf;.}..stati
c550: 63 20 69 6e 74 20 7a 69 70 66 69 6c 65 41 70 70  c int zipfileApp
c560: 65 6e 64 45 4f 43 44 28 5a 69 70 66 69 6c 65 54  endEOCD(ZipfileT
c570: 61 62 20 2a 70 54 61 62 2c 20 5a 69 70 66 69 6c  ab *pTab, Zipfil
c580: 65 45 4f 43 44 20 2a 70 29 7b 0a 20 20 69 6e 74  eEOCD *p){.  int
c590: 20 6e 42 75 66 20 3d 20 7a 69 70 66 69 6c 65 53   nBuf = zipfileS
c5a0: 65 72 69 61 6c 69 7a 65 45 4f 43 44 28 70 2c 20  erializeEOCD(p, 
c5b0: 70 54 61 62 2d 3e 61 42 75 66 66 65 72 29 3b 0a  pTab->aBuffer);.
c5c0: 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3d 3d    assert( nBuf==
c5d0: 5a 49 50 46 49 4c 45 5f 45 4f 43 44 5f 46 49 58  ZIPFILE_EOCD_FIX
c5e0: 45 44 5f 53 5a 20 29 3b 0a 20 20 72 65 74 75 72  ED_SZ );.  retur
c5f0: 6e 20 7a 69 70 66 69 6c 65 41 70 70 65 6e 64 44  n zipfileAppendD
c600: 61 74 61 28 70 54 61 62 2c 20 70 54 61 62 2d 3e  ata(pTab, pTab->
c610: 61 42 75 66 66 65 72 2c 20 6e 42 75 66 29 3b 0a  aBuffer, nBuf);.
c620: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61 6c 69  }../*.** Seriali
c630: 7a 65 20 74 68 65 20 43 44 53 20 73 74 72 75 63  ze the CDS struc
c640: 74 75 72 65 20 69 6e 74 6f 20 62 75 66 66 65 72  ture into buffer
c650: 20 61 42 75 66 5b 5d 2e 20 52 65 74 75 72 6e 20   aBuf[]. Return 
c660: 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
c670: 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a   bytes written..
c680: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 69  */.static int zi
c690: 70 66 69 6c 65 53 65 72 69 61 6c 69 7a 65 43 44  pfileSerializeCD
c6a0: 53 28 5a 69 70 66 69 6c 65 45 6e 74 72 79 20 2a  S(ZipfileEntry *
c6b0: 70 45 6e 74 72 79 2c 20 75 38 20 2a 61 42 75 66  pEntry, u8 *aBuf
c6c0: 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20 61 42 75  ){.  u8 *a = aBu
c6d0: 66 3b 0a 20 20 5a 69 70 66 69 6c 65 43 44 53 20  f;.  ZipfileCDS 
c6e0: 2a 70 43 44 53 20 3d 20 26 70 45 6e 74 72 79 2d  *pCDS = &pEntry-
c6f0: 3e 63 64 73 3b 0a 0a 20 20 69 66 28 20 70 45 6e  >cds;..  if( pEn
c700: 74 72 79 2d 3e 61 45 78 74 72 61 3d 3d 30 20 29  try->aExtra==0 )
c710: 7b 0a 20 20 20 20 70 43 44 53 2d 3e 6e 45 78 74  {.    pCDS->nExt
c720: 72 61 20 3d 20 39 3b 0a 20 20 7d 0a 0a 20 20 7a  ra = 9;.  }..  z
c730: 69 70 66 69 6c 65 57 72 69 74 65 33 32 28 61 2c  ipfileWrite32(a,
c740: 20 5a 49 50 46 49 4c 45 5f 53 49 47 4e 41 54 55   ZIPFILE_SIGNATU
c750: 52 45 5f 43 44 53 29 3b 0a 20 20 7a 69 70 66 69  RE_CDS);.  zipfi
c760: 6c 65 57 72 69 74 65 31 36 28 61 2c 20 70 43 44  leWrite16(a, pCD
c770: 53 2d 3e 69 56 65 72 73 69 6f 6e 4d 61 64 65 42  S->iVersionMadeB
c780: 79 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72 69  y);.  zipfileWri
c790: 74 65 31 36 28 61 2c 20 70 43 44 53 2d 3e 69 56  te16(a, pCDS->iV
c7a0: 65 72 73 69 6f 6e 45 78 74 72 61 63 74 29 3b 0a  ersionExtract);.
c7b0: 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65 31 36    zipfileWrite16
c7c0: 28 61 2c 20 70 43 44 53 2d 3e 66 6c 61 67 73 29  (a, pCDS->flags)
c7d0: 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65  ;.  zipfileWrite
c7e0: 31 36 28 61 2c 20 70 43 44 53 2d 3e 69 43 6f 6d  16(a, pCDS->iCom
c7f0: 70 72 65 73 73 69 6f 6e 29 3b 0a 20 20 7a 69 70  pression);.  zip
c800: 66 69 6c 65 57 72 69 74 65 31 36 28 61 2c 20 70  fileWrite16(a, p
c810: 43 44 53 2d 3e 6d 54 69 6d 65 29 3b 0a 20 20 7a  CDS->mTime);.  z
c820: 69 70 66 69 6c 65 57 72 69 74 65 31 36 28 61 2c  ipfileWrite16(a,
c830: 20 70 43 44 53 2d 3e 6d 44 61 74 65 29 3b 0a 20   pCDS->mDate);. 
c840: 20 7a 69 70 66 69 6c 65 57 72 69 74 65 33 32 28   zipfileWrite32(
c850: 61 2c 20 70 43 44 53 2d 3e 63 72 63 33 32 29 3b  a, pCDS->crc32);
c860: 0a 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65 33  .  zipfileWrite3
c870: 32 28 61 2c 20 70 43 44 53 2d 3e 73 7a 43 6f 6d  2(a, pCDS->szCom
c880: 70 72 65 73 73 65 64 29 3b 0a 20 20 7a 69 70 66  pressed);.  zipf
c890: 69 6c 65 57 72 69 74 65 33 32 28 61 2c 20 70 43  ileWrite32(a, pC
c8a0: 44 53 2d 3e 73 7a 55 6e 63 6f 6d 70 72 65 73 73  DS->szUncompress
c8b0: 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ed);.  assert( a
c8c0: 3d 3d 26 61 42 75 66 5b 5a 49 50 46 49 4c 45 5f  ==&aBuf[ZIPFILE_
c8d0: 43 44 53 5f 4e 46 49 4c 45 5f 4f 46 46 5d 20 29  CDS_NFILE_OFF] )
c8e0: 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65  ;.  zipfileWrite
c8f0: 31 36 28 61 2c 20 70 43 44 53 2d 3e 6e 46 69 6c  16(a, pCDS->nFil
c900: 65 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72 69  e);.  zipfileWri
c910: 74 65 31 36 28 61 2c 20 70 43 44 53 2d 3e 6e 45  te16(a, pCDS->nE
c920: 78 74 72 61 29 3b 0a 20 20 7a 69 70 66 69 6c 65  xtra);.  zipfile
c930: 57 72 69 74 65 31 36 28 61 2c 20 70 43 44 53 2d  Write16(a, pCDS-
c940: 3e 6e 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 7a 69  >nComment);.  zi
c950: 70 66 69 6c 65 57 72 69 74 65 31 36 28 61 2c 20  pfileWrite16(a, 
c960: 70 43 44 53 2d 3e 69 44 69 73 6b 53 74 61 72 74  pCDS->iDiskStart
c970: 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72 69 74  );.  zipfileWrit
c980: 65 31 36 28 61 2c 20 70 43 44 53 2d 3e 69 49 6e  e16(a, pCDS->iIn
c990: 74 65 72 6e 61 6c 41 74 74 72 29 3b 0a 20 20 7a  ternalAttr);.  z
c9a0: 69 70 66 69 6c 65 57 72 69 74 65 33 32 28 61 2c  ipfileWrite32(a,
c9b0: 20 70 43 44 53 2d 3e 69 45 78 74 65 72 6e 61 6c   pCDS->iExternal
c9c0: 41 74 74 72 29 3b 0a 20 20 7a 69 70 66 69 6c 65  Attr);.  zipfile
c9d0: 57 72 69 74 65 33 32 28 61 2c 20 70 43 44 53 2d  Write32(a, pCDS-
c9e0: 3e 69 4f 66 66 73 65 74 29 3b 0a 0a 20 20 6d 65  >iOffset);..  me
c9f0: 6d 63 70 79 28 61 2c 20 70 43 44 53 2d 3e 7a 46  mcpy(a, pCDS->zF
ca00: 69 6c 65 2c 20 70 43 44 53 2d 3e 6e 46 69 6c 65  ile, pCDS->nFile
ca10: 29 3b 0a 20 20 61 20 2b 3d 20 70 43 44 53 2d 3e  );.  a += pCDS->
ca20: 6e 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 70 45  nFile;..  if( pE
ca30: 6e 74 72 79 2d 3e 61 45 78 74 72 61 20 29 7b 0a  ntry->aExtra ){.
ca40: 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74      int n = (int
ca50: 29 70 43 44 53 2d 3e 6e 45 78 74 72 61 20 2b 20  )pCDS->nExtra + 
ca60: 28 69 6e 74 29 70 43 44 53 2d 3e 6e 43 6f 6d 6d  (int)pCDS->nComm
ca70: 65 6e 74 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ent;.    memcpy(
ca80: 61 2c 20 70 45 6e 74 72 79 2d 3e 61 45 78 74 72  a, pEntry->aExtr
ca90: 61 2c 20 6e 29 3b 0a 20 20 20 20 61 20 2b 3d 20  a, n);.    a += 
caa0: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
cab0: 61 73 73 65 72 74 28 20 70 43 44 53 2d 3e 6e 45  assert( pCDS->nE
cac0: 78 74 72 61 3d 3d 39 20 29 3b 0a 20 20 20 20 7a  xtra==9 );.    z
cad0: 69 70 66 69 6c 65 57 72 69 74 65 31 36 28 61 2c  ipfileWrite16(a,
cae0: 20 5a 49 50 46 49 4c 45 5f 45 58 54 52 41 5f 54   ZIPFILE_EXTRA_T
caf0: 49 4d 45 53 54 41 4d 50 29 3b 0a 20 20 20 20 7a  IMESTAMP);.    z
cb00: 69 70 66 69 6c 65 57 72 69 74 65 31 36 28 61 2c  ipfileWrite16(a,
cb10: 20 35 29 3b 0a 20 20 20 20 2a 61 2b 2b 20 3d 20   5);.    *a++ = 
cb20: 30 78 30 31 3b 0a 20 20 20 20 7a 69 70 66 69 6c  0x01;.    zipfil
cb30: 65 57 72 69 74 65 33 32 28 61 2c 20 70 45 6e 74  eWrite32(a, pEnt
cb40: 72 79 2d 3e 6d 55 6e 69 78 54 69 6d 65 29 3b 0a  ry->mUnixTime);.
cb50: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 2d    }..  return a-
cb60: 61 42 75 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  aBuf;.}..static 
cb70: 69 6e 74 20 7a 69 70 66 69 6c 65 43 6f 6d 6d 69  int zipfileCommi
cb80: 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  t(sqlite3_vtab *
cb90: 70 56 74 61 62 29 7b 0a 20 20 5a 69 70 66 69 6c  pVtab){.  Zipfil
cba0: 65 54 61 62 20 2a 70 54 61 62 20 3d 20 28 5a 69  eTab *pTab = (Zi
cbb0: 70 66 69 6c 65 54 61 62 2a 29 70 56 74 61 62 3b  pfileTab*)pVtab;
cbc0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
cbd0: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 54 61  TE_OK;.  if( pTa
cbe0: 62 2d 3e 70 57 72 69 74 65 46 64 20 29 7b 0a 20  b->pWriteFd ){. 
cbf0: 20 20 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d     i64 iOffset =
cc00: 20 70 54 61 62 2d 3e 73 7a 43 75 72 72 65 6e 74   pTab->szCurrent
cc10: 3b 0a 20 20 20 20 5a 69 70 66 69 6c 65 45 6e 74  ;.    ZipfileEnt
cc20: 72 79 20 2a 70 3b 0a 20 20 20 20 5a 69 70 66 69  ry *p;.    Zipfi
cc30: 6c 65 45 4f 43 44 20 65 6f 63 64 3b 0a 20 20 20  leEOCD eocd;.   
cc40: 20 69 6e 74 20 6e 45 6e 74 72 79 20 3d 20 30 3b   int nEntry = 0;
cc50: 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f  ..    /* Write o
cc60: 75 74 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 2a  ut all entries *
cc70: 2f 0a 20 20 20 20 66 6f 72 28 70 3d 70 54 61 62  /.    for(p=pTab
cc80: 2d 3e 70 46 69 72 73 74 45 6e 74 72 79 3b 20 72  ->pFirstEntry; r
cc90: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
cca0: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
ccb0: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 7a 69        int n = zi
ccc0: 70 66 69 6c 65 53 65 72 69 61 6c 69 7a 65 43 44  pfileSerializeCD
ccd0: 53 28 70 2c 20 70 54 61 62 2d 3e 61 42 75 66 66  S(p, pTab->aBuff
cce0: 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
ccf0: 7a 69 70 66 69 6c 65 41 70 70 65 6e 64 44 61 74  zipfileAppendDat
cd00: 61 28 70 54 61 62 2c 20 70 54 61 62 2d 3e 61 42  a(pTab, pTab->aB
cd10: 75 66 66 65 72 2c 20 6e 29 3b 0a 20 20 20 20 20  uffer, n);.     
cd20: 20 6e 45 6e 74 72 79 2b 2b 3b 0a 20 20 20 20 7d   nEntry++;.    }
cd30: 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f  ..    /* Write o
cd40: 75 74 20 74 68 65 20 45 4f 43 44 20 72 65 63 6f  ut the EOCD reco
cd50: 72 64 20 2a 2f 0a 20 20 20 20 65 6f 63 64 2e 69  rd */.    eocd.i
cd60: 44 69 73 6b 20 3d 20 30 3b 0a 20 20 20 20 65 6f  Disk = 0;.    eo
cd70: 63 64 2e 69 46 69 72 73 74 44 69 73 6b 20 3d 20  cd.iFirstDisk = 
cd80: 30 3b 0a 20 20 20 20 65 6f 63 64 2e 6e 45 6e 74  0;.    eocd.nEnt
cd90: 72 79 20 3d 20 28 75 31 36 29 6e 45 6e 74 72 79  ry = (u16)nEntry
cda0: 3b 0a 20 20 20 20 65 6f 63 64 2e 6e 45 6e 74 72  ;.    eocd.nEntr
cdb0: 79 54 6f 74 61 6c 20 3d 20 28 75 31 36 29 6e 45  yTotal = (u16)nE
cdc0: 6e 74 72 79 3b 0a 20 20 20 20 65 6f 63 64 2e 6e  ntry;.    eocd.n
cdd0: 53 69 7a 65 20 3d 20 28 75 33 32 29 28 70 54 61  Size = (u32)(pTa
cde0: 62 2d 3e 73 7a 43 75 72 72 65 6e 74 20 2d 20 69  b->szCurrent - i
cdf0: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 65 6f 63  Offset);.    eoc
ce00: 64 2e 69 4f 66 66 73 65 74 20 3d 20 28 75 33 32  d.iOffset = (u32
ce10: 29 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 72 63  )iOffset;.    rc
ce20: 20 3d 20 7a 69 70 66 69 6c 65 41 70 70 65 6e 64   = zipfileAppend
ce30: 45 4f 43 44 28 70 54 61 62 2c 20 26 65 6f 63 64  EOCD(pTab, &eocd
ce40: 29 3b 0a 0a 20 20 20 20 7a 69 70 66 69 6c 65 43  );..    zipfileC
ce50: 6c 65 61 6e 75 70 54 72 61 6e 73 61 63 74 69 6f  leanupTransactio
ce60: 6e 28 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 72  n(pTab);.  }.  r
ce70: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
ce80: 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c 65 52  tic int zipfileR
ce90: 6f 6c 6c 62 61 63 6b 28 73 71 6c 69 74 65 33 5f  ollback(sqlite3_
cea0: 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
ceb0: 72 65 74 75 72 6e 20 7a 69 70 66 69 6c 65 43 6f  return zipfileCo
cec0: 6d 6d 69 74 28 70 56 74 61 62 29 3b 0a 7d 0a 0a  mmit(pVtab);.}..
ced0: 73 74 61 74 69 63 20 5a 69 70 66 69 6c 65 43 73  static ZipfileCs
cee0: 72 20 2a 7a 69 70 66 69 6c 65 46 69 6e 64 43 75  r *zipfileFindCu
cef0: 72 73 6f 72 28 5a 69 70 66 69 6c 65 54 61 62 20  rsor(ZipfileTab 
cf00: 2a 70 54 61 62 2c 20 69 36 34 20 69 49 64 29 7b  *pTab, i64 iId){
cf10: 0a 20 20 5a 69 70 66 69 6c 65 43 73 72 20 2a 70  .  ZipfileCsr *p
cf20: 43 73 72 3b 0a 20 20 66 6f 72 28 70 43 73 72 3d  Csr;.  for(pCsr=
cf30: 70 54 61 62 2d 3e 70 43 73 72 4c 69 73 74 3b 20  pTab->pCsrList; 
cf40: 70 43 73 72 3b 20 70 43 73 72 3d 70 43 73 72 2d  pCsr; pCsr=pCsr-
cf50: 3e 70 43 73 72 4e 65 78 74 29 7b 0a 20 20 20 20  >pCsrNext){.    
cf60: 69 66 28 20 69 49 64 3d 3d 70 43 73 72 2d 3e 69  if( iId==pCsr->i
cf70: 49 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  Id ) break;.  }.
cf80: 20 20 72 65 74 75 72 6e 20 70 43 73 72 3b 0a 7d    return pCsr;.}
cf90: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 69  ..static void zi
cfa0: 70 66 69 6c 65 46 75 6e 63 74 69 6f 6e 43 64 73  pfileFunctionCds
cfb0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
cfc0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
cfd0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
cfe0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
cff0: 0a 29 7b 0a 20 20 5a 69 70 66 69 6c 65 43 73 72  .){.  ZipfileCsr
d000: 20 2a 70 43 73 72 3b 0a 20 20 5a 69 70 66 69 6c   *pCsr;.  Zipfil
d010: 65 54 61 62 20 2a 70 54 61 62 20 3d 20 28 5a 69  eTab *pTab = (Zi
d020: 70 66 69 6c 65 54 61 62 2a 29 73 71 6c 69 74 65  pfileTab*)sqlite
d030: 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74  3_user_data(cont
d040: 65 78 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ext);.  assert( 
d050: 61 72 67 63 3e 30 20 29 3b 0a 0a 20 20 70 43 73  argc>0 );..  pCs
d060: 72 20 3d 20 7a 69 70 66 69 6c 65 46 69 6e 64 43  r = zipfileFindC
d070: 75 72 73 6f 72 28 70 54 61 62 2c 20 73 71 6c 69  ursor(pTab, sqli
d080: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
d090: 61 72 67 76 5b 30 5d 29 29 3b 0a 20 20 69 66 28  argv[0]));.  if(
d0a0: 20 70 43 73 72 20 29 7b 0a 20 20 20 20 5a 69 70   pCsr ){.    Zip
d0b0: 66 69 6c 65 43 44 53 20 2a 70 20 3d 20 26 70 43  fileCDS *p = &pC
d0c0: 73 72 2d 3e 70 43 75 72 72 65 6e 74 2d 3e 63 64  sr->pCurrent->cd
d0d0: 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 65  s;.    char *zRe
d0e0: 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  s = sqlite3_mpri
d0f0: 6e 74 66 28 22 7b 22 0a 20 20 20 20 20 20 20 20  ntf("{".        
d100: 22 5c 22 76 65 72 73 69 6f 6e 2d 6d 61 64 65 2d  "\"version-made-
d110: 62 79 5c 22 20 3a 20 25 75 2c 20 22 0a 20 20 20  by\" : %u, ".   
d120: 20 20 20 20 20 22 5c 22 76 65 72 73 69 6f 6e 2d       "\"version-
d130: 74 6f 2d 65 78 74 72 61 63 74 5c 22 20 3a 20 25  to-extract\" : %
d140: 75 2c 20 22 0a 20 20 20 20 20 20 20 20 22 5c 22  u, ".        "\"
d150: 66 6c 61 67 73 5c 22 20 3a 20 25 75 2c 20 22 0a  flags\" : %u, ".
d160: 20 20 20 20 20 20 20 20 22 5c 22 63 6f 6d 70 72          "\"compr
d170: 65 73 73 69 6f 6e 5c 22 20 3a 20 25 75 2c 20 22  ession\" : %u, "
d180: 0a 20 20 20 20 20 20 20 20 22 5c 22 74 69 6d 65  .        "\"time
d190: 5c 22 20 3a 20 25 75 2c 20 22 0a 20 20 20 20 20  \" : %u, ".     
d1a0: 20 20 20 22 5c 22 64 61 74 65 5c 22 20 3a 20 25     "\"date\" : %
d1b0: 75 2c 20 22 0a 20 20 20 20 20 20 20 20 22 5c 22  u, ".        "\"
d1c0: 63 72 63 33 32 5c 22 20 3a 20 25 75 2c 20 22 0a  crc32\" : %u, ".
d1d0: 20 20 20 20 20 20 20 20 22 5c 22 63 6f 6d 70 72          "\"compr
d1e0: 65 73 73 65 64 2d 73 69 7a 65 5c 22 20 3a 20 25  essed-size\" : %
d1f0: 75 2c 20 22 0a 20 20 20 20 20 20 20 20 22 5c 22  u, ".        "\"
d200: 75 6e 63 6f 6d 70 72 65 73 73 65 64 2d 73 69 7a  uncompressed-siz
d210: 65 5c 22 20 3a 20 25 75 2c 20 22 0a 20 20 20 20  e\" : %u, ".    
d220: 20 20 20 20 22 5c 22 66 69 6c 65 2d 6e 61 6d 65      "\"file-name
d230: 2d 6c 65 6e 67 74 68 5c 22 20 3a 20 25 75 2c 20  -length\" : %u, 
d240: 22 0a 20 20 20 20 20 20 20 20 22 5c 22 65 78 74  ".        "\"ext
d250: 72 61 2d 66 69 65 6c 64 2d 6c 65 6e 67 74 68 5c  ra-field-length\
d260: 22 20 3a 20 25 75 2c 20 22 0a 20 20 20 20 20 20  " : %u, ".      
d270: 20 20 22 5c 22 66 69 6c 65 2d 63 6f 6d 6d 65 6e    "\"file-commen
d280: 74 2d 6c 65 6e 67 74 68 5c 22 20 3a 20 25 75 2c  t-length\" : %u,
d290: 20 22 0a 20 20 20 20 20 20 20 20 22 5c 22 64 69   ".        "\"di
d2a0: 73 6b 2d 6e 75 6d 62 65 72 2d 73 74 61 72 74 5c  sk-number-start\
d2b0: 22 20 3a 20 25 75 2c 20 22 0a 20 20 20 20 20 20  " : %u, ".      
d2c0: 20 20 22 5c 22 69 6e 74 65 72 6e 61 6c 2d 61 74    "\"internal-at
d2d0: 74 72 5c 22 20 3a 20 25 75 2c 20 22 0a 20 20 20  tr\" : %u, ".   
d2e0: 20 20 20 20 20 22 5c 22 65 78 74 65 72 6e 61 6c       "\"external
d2f0: 2d 61 74 74 72 5c 22 20 3a 20 25 75 2c 20 22 0a  -attr\" : %u, ".
d300: 20 20 20 20 20 20 20 20 22 5c 22 6f 66 66 73 65          "\"offse
d310: 74 5c 22 20 3a 20 25 75 20 7d 22 2c 0a 20 20 20  t\" : %u }",.   
d320: 20 20 20 20 20 28 75 33 32 29 70 2d 3e 69 56 65       (u32)p->iVe
d330: 72 73 69 6f 6e 4d 61 64 65 42 79 2c 20 28 75 33  rsionMadeBy, (u3
d340: 32 29 70 2d 3e 69 56 65 72 73 69 6f 6e 45 78 74  2)p->iVersionExt
d350: 72 61 63 74 2c 0a 20 20 20 20 20 20 20 20 28 75  ract,.        (u
d360: 33 32 29 70 2d 3e 66 6c 61 67 73 2c 20 28 75 33  32)p->flags, (u3
d370: 32 29 70 2d 3e 69 43 6f 6d 70 72 65 73 73 69 6f  2)p->iCompressio
d380: 6e 2c 0a 20 20 20 20 20 20 20 20 28 75 33 32 29  n,.        (u32)
d390: 70 2d 3e 6d 54 69 6d 65 2c 20 28 75 33 32 29 70  p->mTime, (u32)p
d3a0: 2d 3e 6d 44 61 74 65 2c 0a 20 20 20 20 20 20 20  ->mDate,.       
d3b0: 20 28 75 33 32 29 70 2d 3e 63 72 63 33 32 2c 20   (u32)p->crc32, 
d3c0: 28 75 33 32 29 70 2d 3e 73 7a 43 6f 6d 70 72 65  (u32)p->szCompre
d3d0: 73 73 65 64 2c 0a 20 20 20 20 20 20 20 20 28 75  ssed,.        (u
d3e0: 33 32 29 70 2d 3e 73 7a 55 6e 63 6f 6d 70 72 65  32)p->szUncompre
d3f0: 73 73 65 64 2c 20 28 75 33 32 29 70 2d 3e 6e 46  ssed, (u32)p->nF
d400: 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 28 75 33  ile,.        (u3
d410: 32 29 70 2d 3e 6e 45 78 74 72 61 2c 20 28 75 33  2)p->nExtra, (u3
d420: 32 29 70 2d 3e 6e 43 6f 6d 6d 65 6e 74 2c 0a 20  2)p->nComment,. 
d430: 20 20 20 20 20 20 20 28 75 33 32 29 70 2d 3e 69         (u32)p->i
d440: 44 69 73 6b 53 74 61 72 74 2c 20 28 75 33 32 29  DiskStart, (u32)
d450: 70 2d 3e 69 49 6e 74 65 72 6e 61 6c 41 74 74 72  p->iInternalAttr
d460: 2c 0a 20 20 20 20 20 20 20 20 28 75 33 32 29 70  ,.        (u32)p
d470: 2d 3e 69 45 78 74 65 72 6e 61 6c 41 74 74 72 2c  ->iExternalAttr,
d480: 20 28 75 33 32 29 70 2d 3e 69 4f 66 66 73 65 74   (u32)p->iOffset
d490: 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28  .    );..    if(
d4a0: 20 7a 52 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20   zRes==0 ){.    
d4b0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
d4c0: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e  _error_nomem(con
d4d0: 74 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  text);.    }else
d4e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
d4f0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
d500: 65 78 74 2c 20 7a 52 65 73 2c 20 2d 31 2c 20 53  ext, zRes, -1, S
d510: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
d520: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
d530: 66 72 65 65 28 7a 52 65 73 29 3b 0a 20 20 20 20  free(zRes);.    
d540: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78  }.  }.}../*.** x
d550: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20 6d 65 74  FindFunction met
d560: 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
d570: 6e 74 20 7a 69 70 66 69 6c 65 46 69 6e 64 46 75  nt zipfileFindFu
d580: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
d590: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 20  3_vtab *pVtab,  
d5a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
d5b0: 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
d5c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  e */.  int nArg,
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d5f0: 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   of SQL function
d600: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
d610: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
d620: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
d630: 2f 2a 20 4e 61 6d 65 20 6f 66 20 53 51 4c 20 66  /* Name of SQL f
d640: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
d650: 64 20 28 2a 2a 70 78 46 75 6e 63 29 28 73 71 6c  d (**pxFunc)(sql
d660: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
d670: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
d680: 2a 29 2c 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75  *), /* OUT: Resu
d690: 6c 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70  lt */.  void **p
d6a0: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
d6b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
d6c0: 55 73 65 72 20 64 61 74 61 20 66 6f 72 20 2a 70  User data for *p
d6d0: 78 46 75 6e 63 20 2a 2f 0a 29 7b 0a 20 20 69 66  xFunc */.){.  if
d6e0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
d6f0: 70 28 22 7a 69 70 66 69 6c 65 5f 63 64 73 22 2c  p("zipfile_cds",
d700: 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20   zName)==0 ){.  
d710: 20 20 2a 70 78 46 75 6e 63 20 3d 20 7a 69 70 66    *pxFunc = zipf
d720: 69 6c 65 46 75 6e 63 74 69 6f 6e 43 64 73 3b 0a  ileFunctionCds;.
d730: 20 20 20 20 2a 70 70 41 72 67 20 3d 20 28 76 6f      *ppArg = (vo
d740: 69 64 2a 29 70 56 74 61 62 3b 0a 20 20 20 20 72  id*)pVtab;.    r
d750: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
d760: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 74 79 70 65  eturn 0;.}..type
d770: 64 65 66 20 73 74 72 75 63 74 20 5a 69 70 66 69  def struct Zipfi
d780: 6c 65 42 75 66 66 65 72 20 5a 69 70 66 69 6c 65  leBuffer Zipfile
d790: 42 75 66 66 65 72 3b 0a 73 74 72 75 63 74 20 5a  Buffer;.struct Z
d7a0: 69 70 66 69 6c 65 42 75 66 66 65 72 20 7b 0a 20  ipfileBuffer {. 
d7b0: 20 75 38 20 2a 61 3b 20 20 20 20 20 20 20 20 20   u8 *a;         
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
d7e0: 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  uffer */.  int n
d7f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
d810: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 69 6e 20  ze of buffer in 
d820: 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  bytes */.  int n
d830: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20  Alloc;          
d840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
d850: 74 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20  te allocated at 
d860: 61 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64  a[] */.};..typed
d870: 65 66 20 73 74 72 75 63 74 20 5a 69 70 66 69 6c  ef struct Zipfil
d880: 65 43 74 78 20 5a 69 70 66 69 6c 65 43 74 78 3b  eCtx ZipfileCtx;
d890: 0a 73 74 72 75 63 74 20 5a 69 70 66 69 6c 65 43  .struct ZipfileC
d8a0: 74 78 20 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72  tx {.  int nEntr
d8b0: 79 3b 0a 20 20 5a 69 70 66 69 6c 65 42 75 66 66  y;.  ZipfileBuff
d8c0: 65 72 20 62 6f 64 79 3b 0a 20 20 5a 69 70 66 69  er body;.  Zipfi
d8d0: 6c 65 42 75 66 66 65 72 20 63 64 73 3b 0a 7d 3b  leBuffer cds;.};
d8e0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 69 70  ..static int zip
d8f0: 66 69 6c 65 42 75 66 66 65 72 47 72 6f 77 28 5a  fileBufferGrow(Z
d900: 69 70 66 69 6c 65 42 75 66 66 65 72 20 2a 70 42  ipfileBuffer *pB
d910: 75 66 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a  uf, int nByte){.
d920: 20 20 69 66 28 20 70 42 75 66 2d 3e 6e 2b 6e 42    if( pBuf->n+nB
d930: 79 74 65 3e 70 42 75 66 2d 3e 6e 41 6c 6c 6f 63  yte>pBuf->nAlloc
d940: 20 29 7b 0a 20 20 20 20 75 38 20 2a 61 4e 65 77   ){.    u8 *aNew
d950: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  ;.    sqlite3_in
d960: 74 36 34 20 6e 4e 65 77 20 3d 20 70 42 75 66 2d  t64 nNew = pBuf-
d970: 3e 6e 20 3f 20 70 42 75 66 2d 3e 6e 2a 32 20 3a  >n ? pBuf->n*2 :
d980: 20 35 31 32 3b 0a 20 20 20 20 69 6e 74 20 6e 52   512;.    int nR
d990: 65 71 20 3d 20 70 42 75 66 2d 3e 6e 20 2b 20 6e  eq = pBuf->n + n
d9a0: 42 79 74 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65  Byte;..    while
d9b0: 28 20 6e 4e 65 77 3c 6e 52 65 71 20 29 20 6e 4e  ( nNew<nReq ) nN
d9c0: 65 77 20 3d 20 6e 4e 65 77 2a 32 3b 0a 20 20 20  ew = nNew*2;.   
d9d0: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   aNew = sqlite3_
d9e0: 72 65 61 6c 6c 6f 63 36 34 28 70 42 75 66 2d 3e  realloc64(pBuf->
d9f0: 61 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66  a, nNew);.    if
da00: 28 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( aNew==0 ) retu
da10: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
da20: 0a 20 20 20 20 70 42 75 66 2d 3e 61 20 3d 20 61  .    pBuf->a = a
da30: 4e 65 77 3b 0a 20 20 20 20 70 42 75 66 2d 3e 6e  New;.    pBuf->n
da40: 41 6c 6c 6f 63 20 3d 20 28 69 6e 74 29 6e 4e 65  Alloc = (int)nNe
da50: 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  w;.  }.  return 
da60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
da70: 0a 2a 2a 20 78 53 74 65 70 28 29 20 63 61 6c 6c  .** xStep() call
da80: 62 61 63 6b 20 66 6f 72 20 74 68 65 20 7a 69 70  back for the zip
da90: 66 69 6c 65 28 29 20 61 67 67 72 65 67 61 74 65  file() aggregate
daa0: 2e 20 54 68 69 73 20 63 61 6e 20 62 65 20 63 61  . This can be ca
dab0: 6c 6c 65 64 20 69 6e 0a 2a 2a 20 61 6e 79 20 6f  lled in.** any o
dac0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
dad0: 77 61 79 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  ways:.**.**   SE
dae0: 4c 45 43 54 20 7a 69 70 66 69 6c 65 28 6e 61 6d  LECT zipfile(nam
daf0: 65 2c 64 61 74 61 29 20 2e 2e 2e 0a 2a 2a 20 20  e,data) ....**  
db00: 20 53 45 4c 45 43 54 20 7a 69 70 66 69 6c 65 28   SELECT zipfile(
db10: 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65 2c  name,mode,mtime,
db20: 64 61 74 61 29 20 2e 2e 2e 0a 2a 2a 20 20 20 53  data) ....**   S
db30: 45 4c 45 43 54 20 7a 69 70 66 69 6c 65 28 6e 61  ELECT zipfile(na
db40: 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65 2c 64 61  me,mode,mtime,da
db50: 74 61 2c 6d 65 74 68 6f 64 29 20 2e 2e 2e 0a 2a  ta,method) ....*
db60: 2f 0a 76 6f 69 64 20 7a 69 70 66 69 6c 65 53 74  /.void zipfileSt
db70: 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ep(sqlite3_conte
db80: 78 74 20 2a 70 43 74 78 2c 20 69 6e 74 20 6e 56  xt *pCtx, int nV
db90: 61 6c 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  al, sqlite3_valu
dba0: 65 20 2a 2a 61 70 56 61 6c 29 7b 0a 20 20 5a 69  e **apVal){.  Zi
dbb0: 70 66 69 6c 65 43 74 78 20 2a 70 3b 20 20 20 20  pfileCtx *p;    
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dbd0: 20 41 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   Aggregate funct
dbe0: 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ion context */. 
dbf0: 20 5a 69 70 66 69 6c 65 45 6e 74 72 79 20 65 3b   ZipfileEntry e;
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 20 2f 2a 20 4e 65 77 20 65 6e 74 72 79 20 74 6f   /* New entry to
dc20: 20 61 64 64 20 74 6f 20 7a 69 70 20 61 72 63 68   add to zip arch
dc30: 69 76 65 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65  ive */..  sqlite
dc40: 33 5f 76 61 6c 75 65 20 2a 70 4e 61 6d 65 20 3d  3_value *pName =
dc50: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   0;.  sqlite3_va
dc60: 6c 75 65 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a  lue *pMode = 0;.
dc70: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
dc80: 2a 70 4d 74 69 6d 65 20 3d 20 30 3b 0a 20 20 73  *pMtime = 0;.  s
dc90: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 44  qlite3_value *pD
dca0: 61 74 61 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ata = 0;.  sqlit
dcb0: 65 33 5f 76 61 6c 75 65 20 2a 70 4d 65 74 68 6f  e3_value *pMetho
dcc0: 64 20 3d 20 30 3b 0a 0a 20 20 69 6e 74 20 62 49  d = 0;..  int bI
dcd0: 73 44 69 72 20 3d 20 30 3b 0a 20 20 75 33 32 20  sDir = 0;.  u32 
dce0: 6d 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  mode;.  int rc =
dcf0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68   SQLITE_OK;.  ch
dd00: 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 0a 20  ar *zErr = 0;.. 
dd10: 20 69 6e 74 20 69 4d 65 74 68 6f 64 20 3d 20 2d   int iMethod = -
dd20: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
dd30: 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20   /* Compression 
dd40: 6d 65 74 68 6f 64 20 74 6f 20 75 73 65 20 28 30  method to use (0
dd50: 20 6f 72 20 38 29 20 2a 2f 0a 0a 20 20 63 6f 6e   or 8) */..  con
dd60: 73 74 20 75 38 20 2a 61 44 61 74 61 20 3d 20 30  st u8 *aData = 0
dd70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
dd80: 50 6f 73 73 69 62 6c 79 20 63 6f 6d 70 72 65 73  Possibly compres
dd90: 73 65 64 20 64 61 74 61 20 66 6f 72 20 6e 65 77  sed data for new
dda0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20   entry */.  int 
ddb0: 6e 44 61 74 61 20 3d 20 30 3b 20 20 20 20 20 20  nData = 0;      
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
ddd0: 69 7a 65 20 6f 66 20 61 44 61 74 61 5b 5d 20 69  ize of aData[] i
dde0: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
ddf0: 20 73 7a 55 6e 63 6f 6d 70 72 65 73 73 65 64 20   szUncompressed 
de00: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
de10: 53 69 7a 65 20 6f 66 20 64 61 74 61 20 62 65 66  Size of data bef
de20: 6f 72 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20  ore compression 
de30: 2a 2f 0a 20 20 75 38 20 2a 61 46 72 65 65 20 3d  */.  u8 *aFree =
de40: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
de50: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68 69       /* Free thi
de60: 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
de70: 6e 67 20 2a 2f 0a 20 20 75 33 32 20 69 43 72 63  ng */.  u32 iCrc
de80: 33 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  32 = 0;         
de90: 20 20 20 20 20 20 20 20 2f 2a 20 63 72 63 33 32          /* crc32
dea0: 20 6f 66 20 75 6e 63 6f 6d 70 72 65 73 73 65 64   of uncompressed
deb0: 20 64 61 74 61 20 2a 2f 0a 0a 20 20 63 68 61 72   data */..  char
dec0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *zName = 0;    
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
dee0: 61 74 68 20 28 6e 61 6d 65 29 20 6f 66 20 6e 65  ath (name) of ne
def0: 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74  w entry */.  int
df00: 20 6e 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20   nName = 0;     
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
df20: 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e  Size of zName in
df30: 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
df40: 20 2a 7a 46 72 65 65 20 3d 20 30 3b 20 20 20 20   *zFree = 0;    
df50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
df60: 72 65 65 20 74 68 69 73 20 62 65 66 6f 72 65 20  ree this before 
df70: 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 20 20 69  returning */.  i
df80: 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 6d 65 6d  nt nByte;..  mem
df90: 73 65 74 28 26 65 2c 20 30 2c 20 73 69 7a 65 6f  set(&e, 0, sizeo
dfa0: 66 28 65 29 29 3b 0a 20 20 70 20 3d 20 28 5a 69  f(e));.  p = (Zi
dfb0: 70 66 69 6c 65 43 74 78 2a 29 73 71 6c 69 74 65  pfileCtx*)sqlite
dfc0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
dfd0: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
dfe0: 28 5a 69 70 66 69 6c 65 43 74 78 29 29 3b 0a 20  (ZipfileCtx));. 
dff0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
e000: 72 6e 3b 0a 0a 20 20 2f 2a 20 4d 61 72 74 69 61  rn;..  /* Martia
e010: 6c 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  l the arguments 
e020: 69 6e 74 6f 20 73 74 61 63 6b 20 76 61 72 69 61  into stack varia
e030: 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 6e 56  bles */.  if( nV
e040: 61 6c 21 3d 32 20 26 26 20 6e 56 61 6c 21 3d 34  al!=2 && nVal!=4
e050: 20 26 26 20 6e 56 61 6c 21 3d 35 20 29 7b 0a 20   && nVal!=5 ){. 
e060: 20 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65     zErr = sqlite
e070: 33 5f 6d 70 72 69 6e 74 66 28 22 77 72 6f 6e 67  3_mprintf("wrong
e080: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
e090: 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e  ents to function
e0a0: 20 7a 69 70 66 69 6c 65 28 29 22 29 3b 0a 20 20   zipfile()");.  
e0b0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
e0c0: 52 4f 52 3b 0a 20 20 20 20 67 6f 74 6f 20 7a 69  ROR;.    goto zi
e0d0: 70 66 69 6c 65 5f 73 74 65 70 5f 6f 75 74 3b 0a  pfile_step_out;.
e0e0: 20 20 7d 0a 20 20 70 4e 61 6d 65 20 3d 20 61 70    }.  pName = ap
e0f0: 56 61 6c 5b 30 5d 3b 0a 20 20 69 66 28 20 6e 56  Val[0];.  if( nV
e100: 61 6c 3d 3d 32 20 29 7b 0a 20 20 20 20 70 44 61  al==2 ){.    pDa
e110: 74 61 20 3d 20 61 70 56 61 6c 5b 31 5d 3b 0a 20  ta = apVal[1];. 
e120: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4d 6f 64   }else{.    pMod
e130: 65 20 3d 20 61 70 56 61 6c 5b 31 5d 3b 0a 20 20  e = apVal[1];.  
e140: 20 20 70 4d 74 69 6d 65 20 3d 20 61 70 56 61 6c    pMtime = apVal
e150: 5b 32 5d 3b 0a 20 20 20 20 70 44 61 74 61 20 3d  [2];.    pData =
e160: 20 61 70 56 61 6c 5b 33 5d 3b 0a 20 20 20 20 69   apVal[3];.    i
e170: 66 28 20 6e 56 61 6c 3d 3d 35 20 29 7b 0a 20 20  f( nVal==5 ){.  
e180: 20 20 20 20 70 4d 65 74 68 6f 64 20 3d 20 61 70      pMethod = ap
e190: 56 61 6c 5b 34 5d 3b 0a 20 20 20 20 7d 0a 20 20  Val[4];.    }.  
e1a0: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  }..  /* Check th
e1b0: 61 74 20 74 68 65 20 27 6e 61 6d 65 27 20 70 61  at the 'name' pa
e1c0: 72 61 6d 65 74 65 72 20 6c 6f 6f 6b 73 20 6f 6b  rameter looks ok
e1d0: 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 28  . */.  zName = (
e1e0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
e1f0: 6c 75 65 5f 74 65 78 74 28 70 4e 61 6d 65 29 3b  lue_text(pName);
e200: 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  nName = sqlit
e210: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70  e3_value_bytes(p
e220: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
e230: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 45 72  me==0 ){.    zEr
e240: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
e250: 6e 74 66 28 22 66 69 72 73 74 20 61 72 67 75 6d  ntf("first argum
e260: 65 6e 74 20 74 6f 20 7a 69 70 66 69 6c 65 28 29  ent to zipfile()
e270: 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 4e 55 4c   must be non-NUL
e280: 4c 22 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  L");.    rc = SQ
e290: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
e2a0: 67 6f 74 6f 20 7a 69 70 66 69 6c 65 5f 73 74 65  goto zipfile_ste
e2b0: 70 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  p_out;.  }..  /*
e2c0: 20 49 6e 73 70 65 63 74 20 74 68 65 20 27 6d 65   Inspect the 'me
e2d0: 74 68 6f 64 27 20 70 61 72 61 6d 65 74 65 72 2e  thod' parameter.
e2e0: 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 65 69   This must be ei
e2f0: 74 68 65 72 20 30 20 28 73 74 6f 72 65 29 2c 20  ther 0 (store), 
e300: 38 20 28 75 73 65 0a 20 20 2a 2a 20 64 65 66 6c  8 (use.  ** defl
e310: 61 74 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e 29  ate compression)
e320: 20 6f 72 20 4e 55 4c 4c 20 28 63 68 6f 6f 73 65   or NULL (choose
e330: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 29 2e   automatically).
e340: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 65 74 68    */.  if( pMeth
e350: 6f 64 20 26 26 20 53 51 4c 49 54 45 5f 4e 55 4c  od && SQLITE_NUL
e360: 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L!=sqlite3_value
e370: 5f 74 79 70 65 28 70 4d 65 74 68 6f 64 29 20 29  _type(pMethod) )
e380: 7b 0a 20 20 20 20 69 4d 65 74 68 6f 64 20 3d 20  {.    iMethod = 
e390: 28 69 6e 74 29 73 71 6c 69 74 65 33 5f 76 61 6c  (int)sqlite3_val
e3a0: 75 65 5f 69 6e 74 36 34 28 70 4d 65 74 68 6f 64  ue_int64(pMethod
e3b0: 29 3b 0a 20 20 20 20 69 66 28 20 69 4d 65 74 68  );.    if( iMeth
e3c0: 6f 64 21 3d 30 20 26 26 20 69 4d 65 74 68 6f 64  od!=0 && iMethod
e3d0: 21 3d 38 20 29 7b 0a 20 20 20 20 20 20 7a 45 72  !=8 ){.      zEr
e3e0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
e3f0: 6e 74 66 28 22 69 6c 6c 65 67 61 6c 20 6d 65 74  ntf("illegal met
e400: 68 6f 64 20 76 61 6c 75 65 3a 20 25 64 22 2c 20  hod value: %d", 
e410: 69 4d 65 74 68 6f 64 29 3b 0a 20 20 20 20 20 20  iMethod);.      
e420: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
e430: 52 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 7a 69  R;.      goto zi
e440: 70 66 69 6c 65 5f 73 74 65 70 5f 6f 75 74 3b 0a  pfile_step_out;.
e450: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
e460: 4e 6f 77 20 69 6e 73 70 65 63 74 20 74 68 65 20  Now inspect the 
e470: 64 61 74 61 2e 20 49 66 20 74 68 69 73 20 69 73  data. If this is
e480: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20   NULL, then the 
e490: 6e 65 77 20 65 6e 74 72 79 20 6d 75 73 74 20 62  new entry must b
e4a0: 65 20 61 0a 20 20 2a 2a 20 64 69 72 65 63 74 6f  e a.  ** directo
e4b0: 72 79 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  ry.  Otherwise, 
e4c0: 66 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  figure out wheth
e4d0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 64 61  er or not the da
e4e0: 74 61 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 62  ta should.  ** b
e4f0: 65 20 64 65 66 6c 61 74 65 64 20 6f 72 20 73 69  e deflated or si
e500: 6d 70 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 74  mply stored in t
e510: 68 65 20 7a 69 70 20 61 72 63 68 69 76 65 2e 20  he zip archive. 
e520: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
e530: 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 44 61 74  _value_type(pDat
e540: 61 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  a)==SQLITE_NULL 
e550: 29 7b 0a 20 20 20 20 62 49 73 44 69 72 20 3d 20  ){.    bIsDir = 
e560: 31 3b 0a 20 20 20 20 69 4d 65 74 68 6f 64 20 3d  1;.    iMethod =
e570: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
e580: 20 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33   aData = sqlite3
e590: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 44 61 74  _value_blob(pDat
e5a0: 61 29 3b 0a 20 20 20 20 73 7a 55 6e 63 6f 6d 70  a);.    szUncomp
e5b0: 72 65 73 73 65 64 20 3d 20 6e 44 61 74 61 20 3d  ressed = nData =
e5c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
e5d0: 79 74 65 73 28 70 44 61 74 61 29 3b 0a 20 20 20  ytes(pData);.   
e5e0: 20 69 43 72 63 33 32 20 3d 20 63 72 63 33 32 28   iCrc32 = crc32(
e5f0: 30 2c 20 61 44 61 74 61 2c 20 6e 44 61 74 61 29  0, aData, nData)
e600: 3b 0a 20 20 20 20 69 66 28 20 69 4d 65 74 68 6f  ;.    if( iMetho
e610: 64 3c 30 20 7c 7c 20 69 4d 65 74 68 6f 64 3d 3d  d<0 || iMethod==
e620: 38 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  8 ){.      int n
e630: 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Out = 0;.      r
e640: 63 20 3d 20 7a 69 70 66 69 6c 65 44 65 66 6c 61  c = zipfileDefla
e650: 74 65 28 61 44 61 74 61 2c 20 6e 44 61 74 61 2c  te(aData, nData,
e660: 20 26 61 46 72 65 65 2c 20 26 6e 4f 75 74 2c 20   &aFree, &nOut, 
e670: 26 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66  &zErr);.      if
e680: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e690: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
e6a0: 7a 69 70 66 69 6c 65 5f 73 74 65 70 5f 6f 75 74  zipfile_step_out
e6b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e6c0: 69 66 28 20 69 4d 65 74 68 6f 64 3d 3d 38 20 7c  if( iMethod==8 |
e6d0: 7c 20 6e 4f 75 74 3c 6e 44 61 74 61 20 29 7b 0a  | nOut<nData ){.
e6e0: 20 20 20 20 20 20 20 20 61 44 61 74 61 20 3d 20          aData = 
e6f0: 61 46 72 65 65 3b 0a 20 20 20 20 20 20 20 20 6e  aFree;.        n
e700: 44 61 74 61 20 3d 20 6e 4f 75 74 3b 0a 20 20 20  Data = nOut;.   
e710: 20 20 20 20 20 69 4d 65 74 68 6f 64 20 3d 20 38       iMethod = 8
e720: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e730: 20 20 20 20 20 20 20 69 4d 65 74 68 6f 64 20 3d         iMethod =
e740: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
e750: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 63 6f  }.  }..  /* Deco
e760: 64 65 20 74 68 65 20 22 6d 6f 64 65 22 20 61 72  de the "mode" ar
e770: 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 72 63 20  gument. */.  rc 
e780: 3d 20 7a 69 70 66 69 6c 65 47 65 74 4d 6f 64 65  = zipfileGetMode
e790: 28 70 4d 6f 64 65 2c 20 62 49 73 44 69 72 2c 20  (pMode, bIsDir, 
e7a0: 26 6d 6f 64 65 2c 20 26 7a 45 72 72 29 3b 0a 20  &mode, &zErr);. 
e7b0: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 7a   if( rc ) goto z
e7c0: 69 70 66 69 6c 65 5f 73 74 65 70 5f 6f 75 74 3b  ipfile_step_out;
e7d0: 0a 0a 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68  ..  /* Decode th
e7e0: 65 20 22 6d 74 69 6d 65 22 20 61 72 67 75 6d 65  e "mtime" argume
e7f0: 6e 74 2e 20 2a 2f 0a 20 20 65 2e 6d 55 6e 69 78  nt. */.  e.mUnix
e800: 54 69 6d 65 20 3d 20 7a 69 70 66 69 6c 65 47 65  Time = zipfileGe
e810: 74 54 69 6d 65 28 70 4d 74 69 6d 65 29 3b 0a 0a  tTime(pMtime);..
e820: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
e830: 61 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  a directory entr
e840: 79 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  y, ensure that t
e850: 68 65 72 65 20 69 73 20 65 78 61 63 74 6c 79 20  here is exactly 
e860: 6f 6e 65 20 27 2f 27 0a 20 20 2a 2a 20 61 74 20  one '/'.  ** at 
e870: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
e880: 61 74 68 2e 20 4f 72 2c 20 69 66 20 74 68 69 73  ath. Or, if this
e890: 20 69 73 20 6e 6f 74 20 61 20 64 69 72 65 63 74   is not a direct
e8a0: 6f 72 79 20 61 6e 64 20 74 68 65 20 70 61 74 68  ory and the path
e8b0: 0a 20 20 2a 2a 20 65 6e 64 73 20 69 6e 20 27 2f  .  ** ends in '/
e8c0: 27 20 69 74 20 69 73 20 61 6e 20 65 72 72 6f 72  ' it is an error
e8d0: 2e 20 2a 2f 0a 20 20 69 66 28 20 62 49 73 44 69  . */.  if( bIsDi
e8e0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  r==0 ){.    if( 
e8f0: 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2d 31 5d 3d 3d  zName[nName-1]==
e900: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 7a 45 72  '/' ){.      zEr
e910: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
e920: 6e 74 66 28 22 6e 6f 6e 2d 64 69 72 65 63 74 6f  ntf("non-directo
e930: 72 79 20 6e 61 6d 65 20 6d 75 73 74 20 6e 6f 74  ry name must not
e940: 20 65 6e 64 20 77 69 74 68 20 2f 22 29 3b 0a 20   end with /");. 
e950: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e960: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 67 6f  _ERROR;.      go
e970: 74 6f 20 7a 69 70 66 69 6c 65 5f 73 74 65 70 5f  to zipfile_step_
e980: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  out;.    }.  }el
e990: 73 65 7b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  se{.    if( zNam
e9a0: 65 5b 6e 4e 61 6d 65 2d 31 5d 21 3d 27 2f 27 20  e[nName-1]!='/' 
e9b0: 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ){.      zName =
e9c0: 20 7a 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33   zFree = sqlite3
e9d0: 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f 22 2c 20  _mprintf("%s/", 
e9e0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6e 4e  zName);.      nN
e9f0: 61 6d 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ame++;.      if(
ea00: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
ea10: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
ea20: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
ea30: 67 6f 74 6f 20 7a 69 70 66 69 6c 65 5f 73 74 65  goto zipfile_ste
ea40: 70 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  p_out;.      }. 
ea50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ea60: 77 68 69 6c 65 28 20 6e 4e 61 6d 65 3e 31 20 26  while( nName>1 &
ea70: 26 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2d 32 5d  & zName[nName-2]
ea80: 3d 3d 27 2f 27 20 29 20 6e 4e 61 6d 65 2d 2d 3b  =='/' ) nName--;
ea90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
eaa0: 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20 5a 69   Assemble the Zi
eab0: 70 66 69 6c 65 45 6e 74 72 79 20 6f 62 6a 65 63  pfileEntry objec
eac0: 74 20 66 6f 72 20 74 68 65 20 6e 65 77 20 7a 69  t for the new zi
ead0: 70 20 61 72 63 68 69 76 65 20 65 6e 74 72 79 20  p archive entry 
eae0: 2a 2f 0a 20 20 65 2e 63 64 73 2e 69 56 65 72 73  */.  e.cds.iVers
eaf0: 69 6f 6e 4d 61 64 65 42 79 20 3d 20 5a 49 50 46  ionMadeBy = ZIPF
eb00: 49 4c 45 5f 4e 45 57 45 4e 54 52 59 5f 4d 41 44  ILE_NEWENTRY_MAD
eb10: 45 42 59 3b 0a 20 20 65 2e 63 64 73 2e 69 56 65  EBY;.  e.cds.iVe
eb20: 72 73 69 6f 6e 45 78 74 72 61 63 74 20 3d 20 5a  rsionExtract = Z
eb30: 49 50 46 49 4c 45 5f 4e 45 57 45 4e 54 52 59 5f  IPFILE_NEWENTRY_
eb40: 52 45 51 55 49 52 45 44 3b 0a 20 20 65 2e 63 64  REQUIRED;.  e.cd
eb50: 73 2e 66 6c 61 67 73 20 3d 20 5a 49 50 46 49 4c  s.flags = ZIPFIL
eb60: 45 5f 4e 45 57 45 4e 54 52 59 5f 46 4c 41 47 53  E_NEWENTRY_FLAGS
eb70: 3b 0a 20 20 65 2e 63 64 73 2e 69 43 6f 6d 70 72  ;.  e.cds.iCompr
eb80: 65 73 73 69 6f 6e 20 3d 20 28 75 31 36 29 69 4d  ession = (u16)iM
eb90: 65 74 68 6f 64 3b 0a 20 20 7a 69 70 66 69 6c 65  ethod;.  zipfile
eba0: 4d 74 69 6d 65 54 6f 44 6f 73 28 26 65 2e 63 64  MtimeToDos(&e.cd
ebb0: 73 2c 20 28 75 33 32 29 65 2e 6d 55 6e 69 78 54  s, (u32)e.mUnixT
ebc0: 69 6d 65 29 3b 0a 20 20 65 2e 63 64 73 2e 63 72  ime);.  e.cds.cr
ebd0: 63 33 32 20 3d 20 69 43 72 63 33 32 3b 0a 20 20  c32 = iCrc32;.  
ebe0: 65 2e 63 64 73 2e 73 7a 43 6f 6d 70 72 65 73 73  e.cds.szCompress
ebf0: 65 64 20 3d 20 6e 44 61 74 61 3b 0a 20 20 65 2e  ed = nData;.  e.
ec00: 63 64 73 2e 73 7a 55 6e 63 6f 6d 70 72 65 73 73  cds.szUncompress
ec10: 65 64 20 3d 20 73 7a 55 6e 63 6f 6d 70 72 65 73  ed = szUncompres
ec20: 73 65 64 3b 0a 20 20 65 2e 63 64 73 2e 69 45 78  sed;.  e.cds.iEx
ec30: 74 65 72 6e 61 6c 41 74 74 72 20 3d 20 28 6d 6f  ternalAttr = (mo
ec40: 64 65 3c 3c 31 36 29 3b 0a 20 20 65 2e 63 64 73  de<<16);.  e.cds
ec50: 2e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 62 6f  .iOffset = p->bo
ec60: 64 79 2e 6e 3b 0a 20 20 65 2e 63 64 73 2e 6e 46  dy.n;.  e.cds.nF
ec70: 69 6c 65 20 3d 20 28 75 31 36 29 6e 4e 61 6d 65  ile = (u16)nName
ec80: 3b 0a 20 20 65 2e 63 64 73 2e 7a 46 69 6c 65 20  ;.  e.cds.zFile 
ec90: 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 41  = zName;..  /* A
eca0: 70 70 65 6e 64 20 74 68 65 20 4c 46 48 20 74 6f  ppend the LFH to
ecb0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
ecc0: 20 6e 65 77 20 61 72 63 68 69 76 65 20 2a 2f 0a   new archive */.
ecd0: 20 20 6e 42 79 74 65 20 3d 20 5a 49 50 46 49 4c    nByte = ZIPFIL
ece0: 45 5f 4c 46 48 5f 46 49 58 45 44 5f 53 5a 20 2b  E_LFH_FIXED_SZ +
ecf0: 20 65 2e 63 64 73 2e 6e 46 69 6c 65 20 2b 20 39   e.cds.nFile + 9
ed00: 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20 7a 69  ;.  if( (rc = zi
ed10: 70 66 69 6c 65 42 75 66 66 65 72 47 72 6f 77 28  pfileBufferGrow(
ed20: 26 70 2d 3e 62 6f 64 79 2c 20 6e 42 79 74 65 29  &p->body, nByte)
ed30: 29 20 29 20 67 6f 74 6f 20 7a 69 70 66 69 6c 65  ) ) goto zipfile
ed40: 5f 73 74 65 70 5f 6f 75 74 3b 0a 20 20 70 2d 3e  _step_out;.  p->
ed50: 62 6f 64 79 2e 6e 20 2b 3d 20 7a 69 70 66 69 6c  body.n += zipfil
ed60: 65 53 65 72 69 61 6c 69 7a 65 4c 46 48 28 26 65  eSerializeLFH(&e
ed70: 2c 20 26 70 2d 3e 62 6f 64 79 2e 61 5b 70 2d 3e  , &p->body.a[p->
ed80: 62 6f 64 79 2e 6e 5d 29 3b 0a 0a 20 20 2f 2a 20  body.n]);..  /* 
ed90: 41 70 70 65 6e 64 20 74 68 65 20 64 61 74 61 20  Append the data 
eda0: 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74  to the body of t
edb0: 68 65 20 6e 65 77 20 61 72 63 68 69 76 65 20 2a  he new archive *
edc0: 2f 0a 20 20 69 66 28 20 6e 44 61 74 61 3e 30 20  /.  if( nData>0 
edd0: 29 7b 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d  ){.    if( (rc =
ede0: 20 7a 69 70 66 69 6c 65 42 75 66 66 65 72 47 72   zipfileBufferGr
edf0: 6f 77 28 26 70 2d 3e 62 6f 64 79 2c 20 6e 44 61  ow(&p->body, nDa
ee00: 74 61 29 29 20 29 20 67 6f 74 6f 20 7a 69 70 66  ta)) ) goto zipf
ee10: 69 6c 65 5f 73 74 65 70 5f 6f 75 74 3b 0a 20 20  ile_step_out;.  
ee20: 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 62 6f 64    memcpy(&p->bod
ee30: 79 2e 61 5b 70 2d 3e 62 6f 64 79 2e 6e 5d 2c 20  y.a[p->body.n], 
ee40: 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20  aData, nData);. 
ee50: 20 20 20 70 2d 3e 62 6f 64 79 2e 6e 20 2b 3d 20     p->body.n += 
ee60: 6e 44 61 74 61 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nData;.  }..  /*
ee70: 20 41 70 70 65 6e 64 20 74 68 65 20 43 44 53 20   Append the CDS 
ee80: 72 65 63 6f 72 64 20 74 6f 20 74 68 65 20 64 69  record to the di
ee90: 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 6e  rectory of the n
eea0: 65 77 20 61 72 63 68 69 76 65 20 2a 2f 0a 20 20  ew archive */.  
eeb0: 6e 42 79 74 65 20 3d 20 5a 49 50 46 49 4c 45 5f  nByte = ZIPFILE_
eec0: 43 44 53 5f 46 49 58 45 44 5f 53 5a 20 2b 20 65  CDS_FIXED_SZ + e
eed0: 2e 63 64 73 2e 6e 46 69 6c 65 20 2b 20 39 3b 0a  .cds.nFile + 9;.
eee0: 20 20 69 66 28 20 28 72 63 20 3d 20 7a 69 70 66    if( (rc = zipf
eef0: 69 6c 65 42 75 66 66 65 72 47 72 6f 77 28 26 70  ileBufferGrow(&p
ef00: 2d 3e 63 64 73 2c 20 6e 42 79 74 65 29 29 20 29  ->cds, nByte)) )
ef10: 20 67 6f 74 6f 20 7a 69 70 66 69 6c 65 5f 73 74   goto zipfile_st
ef20: 65 70 5f 6f 75 74 3b 0a 20 20 70 2d 3e 63 64 73  ep_out;.  p->cds
ef30: 2e 6e 20 2b 3d 20 7a 69 70 66 69 6c 65 53 65 72  .n += zipfileSer
ef40: 69 61 6c 69 7a 65 43 44 53 28 26 65 2c 20 26 70  ializeCDS(&e, &p
ef50: 2d 3e 63 64 73 2e 61 5b 70 2d 3e 63 64 73 2e 6e  ->cds.a[p->cds.n
ef60: 5d 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  ]);..  /* Increm
ef70: 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ent the count of
ef80: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
ef90: 61 72 63 68 69 76 65 20 2a 2f 0a 20 20 70 2d 3e  archive */.  p->
efa0: 6e 45 6e 74 72 79 2b 2b 3b 0a 0a 20 7a 69 70 66  nEntry++;.. zipf
efb0: 69 6c 65 5f 73 74 65 70 5f 6f 75 74 3a 0a 20 20  ile_step_out:.  
efc0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 46 72  sqlite3_free(aFr
efd0: 65 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ee);.  sqlite3_f
efe0: 72 65 65 28 7a 46 72 65 65 29 3b 0a 20 20 69 66  ree(zFree);.  if
eff0: 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20  ( rc ){.    if( 
f000: 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71  zErr ){.      sq
f010: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
f020: 6f 72 28 70 43 74 78 2c 20 7a 45 72 72 2c 20 2d  or(pCtx, zErr, -
f030: 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
f040: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
f050: 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70  ult_error_code(p
f060: 43 74 78 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a  Ctx, rc);.    }.
f070: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
f080: 65 65 28 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a  ee(zErr);.}../*.
f090: 2a 2a 20 78 46 69 6e 61 6c 69 7a 65 28 29 20 63  ** xFinalize() c
f0a0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 7a 69 70 66  allback for zipf
f0b0: 69 6c 65 20 61 67 67 72 65 67 61 74 65 20 66 75  ile aggregate fu
f0c0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
f0d0: 7a 69 70 66 69 6c 65 46 69 6e 61 6c 28 73 71 6c  zipfileFinal(sql
f0e0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
f0f0: 74 78 29 7b 0a 20 20 5a 69 70 66 69 6c 65 43 74  tx){.  ZipfileCt
f100: 78 20 2a 70 3b 0a 20 20 5a 69 70 66 69 6c 65 45  x *p;.  ZipfileE
f110: 4f 43 44 20 65 6f 63 64 3b 0a 20 20 73 71 6c 69  OCD eocd;.  sqli
f120: 74 65 33 5f 69 6e 74 36 34 20 6e 5a 69 70 3b 0a  te3_int64 nZip;.
f130: 20 20 75 38 20 2a 61 5a 69 70 3b 0a 0a 20 20 70    u8 *aZip;..  p
f140: 20 3d 20 28 5a 69 70 66 69 6c 65 43 74 78 2a 29   = (ZipfileCtx*)
f150: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
f160: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
f170: 73 69 7a 65 6f 66 28 5a 69 70 66 69 6c 65 43 74  sizeof(ZipfileCt
f180: 78 29 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  x));.  if( p==0 
f190: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
f1a0: 70 2d 3e 6e 45 6e 74 72 79 3e 30 20 29 7b 0a 20  p->nEntry>0 ){. 
f1b0: 20 20 20 6d 65 6d 73 65 74 28 26 65 6f 63 64 2c     memset(&eocd,
f1c0: 20 30 2c 20 73 69 7a 65 6f 66 28 65 6f 63 64 29   0, sizeof(eocd)
f1d0: 29 3b 0a 20 20 20 20 65 6f 63 64 2e 6e 45 6e 74  );.    eocd.nEnt
f1e0: 72 79 20 3d 20 28 75 31 36 29 70 2d 3e 6e 45 6e  ry = (u16)p->nEn
f1f0: 74 72 79 3b 0a 20 20 20 20 65 6f 63 64 2e 6e 45  try;.    eocd.nE
f200: 6e 74 72 79 54 6f 74 61 6c 20 3d 20 28 75 31 36  ntryTotal = (u16
f210: 29 70 2d 3e 6e 45 6e 74 72 79 3b 0a 20 20 20 20  )p->nEntry;.    
f220: 65 6f 63 64 2e 6e 53 69 7a 65 20 3d 20 70 2d 3e  eocd.nSize = p->
f230: 63 64 73 2e 6e 3b 0a 20 20 20 20 65 6f 63 64 2e  cds.n;.    eocd.
f240: 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 62 6f 64  iOffset = p->bod
f250: 79 2e 6e 3b 0a 0a 20 20 20 20 6e 5a 69 70 20 3d  y.n;..    nZip =
f260: 20 70 2d 3e 62 6f 64 79 2e 6e 20 2b 20 70 2d 3e   p->body.n + p->
f270: 63 64 73 2e 6e 20 2b 20 5a 49 50 46 49 4c 45 5f  cds.n + ZIPFILE_
f280: 45 4f 43 44 5f 46 49 58 45 44 5f 53 5a 3b 0a 20  EOCD_FIXED_SZ;. 
f290: 20 20 20 61 5a 69 70 20 3d 20 28 75 38 2a 29 73     aZip = (u8*)s
f2a0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
f2b0: 6e 5a 69 70 29 3b 0a 20 20 20 20 69 66 28 20 61  nZip);.    if( a
f2c0: 5a 69 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Zip==0 ){.      
f2d0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
f2e0: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29  rror_nomem(pCtx)
f2f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f300: 20 20 20 6d 65 6d 63 70 79 28 61 5a 69 70 2c 20     memcpy(aZip, 
f310: 70 2d 3e 62 6f 64 79 2e 61 2c 20 70 2d 3e 62 6f  p->body.a, p->bo
f320: 64 79 2e 6e 29 3b 0a 20 20 20 20 20 20 6d 65 6d  dy.n);.      mem
f330: 63 70 79 28 26 61 5a 69 70 5b 70 2d 3e 62 6f 64  cpy(&aZip[p->bod
f340: 79 2e 6e 5d 2c 20 70 2d 3e 63 64 73 2e 61 2c 20  y.n], p->cds.a, 
f350: 70 2d 3e 63 64 73 2e 6e 29 3b 0a 20 20 20 20 20  p->cds.n);.     
f360: 20 7a 69 70 66 69 6c 65 53 65 72 69 61 6c 69 7a   zipfileSerializ
f370: 65 45 4f 43 44 28 26 65 6f 63 64 2c 20 26 61 5a  eEOCD(&eocd, &aZ
f380: 69 70 5b 70 2d 3e 62 6f 64 79 2e 6e 20 2b 20 70  ip[p->body.n + p
f390: 2d 3e 63 64 73 2e 6e 5d 29 3b 0a 20 20 20 20 20  ->cds.n]);.     
f3a0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
f3b0: 62 6c 6f 62 28 70 43 74 78 2c 20 61 5a 69 70 2c  blob(pCtx, aZip,
f3c0: 20 28 69 6e 74 29 6e 5a 69 70 2c 20 7a 69 70 66   (int)nZip, zipf
f3d0: 69 6c 65 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a  ileFree);.    }.
f3e0: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
f3f0: 72 65 65 28 70 2d 3e 62 6f 64 79 2e 61 29 3b 0a  ree(p->body.a);.
f400: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
f410: 2d 3e 63 64 73 2e 61 29 3b 0a 7d 0a 0a 0a 2f 2a  ->cds.a);.}.../*
f420: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65  .** Register the
f430: 20 22 7a 69 70 66 69 6c 65 22 20 76 69 72 74 75   "zipfile" virtu
f440: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
f450: 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c 65 52  tic int zipfileR
f460: 65 67 69 73 74 65 72 28 73 71 6c 69 74 65 33 20  egister(sqlite3 
f470: 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 73  *db){.  static s
f480: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 7a 69  qlite3_module zi
f490: 70 66 69 6c 65 4d 6f 64 75 6c 65 20 3d 20 7b 0a  pfileModule = {.
f4a0: 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20      1,          
f4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f4c0: 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
f4d0: 20 20 7a 69 70 66 69 6c 65 43 6f 6e 6e 65 63 74    zipfileConnect
f4e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
f4f0: 78 43 72 65 61 74 65 20 2a 2f 0a 20 20 20 20 7a  xCreate */.    z
f500: 69 70 66 69 6c 65 43 6f 6e 6e 65 63 74 2c 20 20  ipfileConnect,  
f510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
f520: 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 7a 69 70  nnect */.    zip
f530: 66 69 6c 65 42 65 73 74 49 6e 64 65 78 2c 20 20  fileBestIndex,  
f540: 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65 73 74          /* xBest
f550: 49 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7a 69 70  Index */.    zip
f560: 66 69 6c 65 44 69 73 63 6f 6e 6e 65 63 74 2c 20  fileDisconnect, 
f570: 20 20 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63          /* xDisc
f580: 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 7a 69  onnect */.    zi
f590: 70 66 69 6c 65 44 69 73 63 6f 6e 6e 65 63 74 2c  pfileDisconnect,
f5a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73           /* xDes
f5b0: 74 72 6f 79 20 2a 2f 0a 20 20 20 20 7a 69 70 66  troy */.    zipf
f5c0: 69 6c 65 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  ileOpen,        
f5d0: 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
f5e0: 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20  - open a cursor 
f5f0: 2a 2f 0a 20 20 20 20 7a 69 70 66 69 6c 65 43 6c  */.    zipfileCl
f600: 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
f610: 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c    /* xClose - cl
f620: 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  ose a cursor */.
f630: 20 20 20 20 7a 69 70 66 69 6c 65 46 69 6c 74 65      zipfileFilte
f640: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
f650: 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66  * xFilter - conf
f660: 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74  igure scan const
f670: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 7a 69  raints */.    zi
f680: 70 66 69 6c 65 4e 65 78 74 2c 20 20 20 20 20 20  pfileNext,      
f690: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78           /* xNex
f6a0: 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75  t - advance a cu
f6b0: 72 73 6f 72 20 2a 2f 0a 20 20 20 20 7a 69 70 66  rsor */.    zipf
f6c0: 69 6c 65 45 6f 66 2c 20 20 20 20 20 20 20 20 20  ileEof,         
f6d0: 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d         /* xEof -
f6e0: 20 63 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f   check for end o
f6f0: 66 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 7a 69  f scan */.    zi
f700: 70 66 69 6c 65 43 6f 6c 75 6d 6e 2c 20 20 20 20  pfileColumn,    
f710: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c           /* xCol
f720: 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20  umn - read data 
f730: 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f750: 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65    /* xRowid - re
f760: 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 7a  ad data */.    z
f770: 69 70 66 69 6c 65 55 70 64 61 74 65 2c 20 20 20  ipfileUpdate,   
f780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70            /* xUp
f790: 64 61 74 65 20 2a 2f 0a 20 20 20 20 7a 69 70 66  date */.    zipf
f7a0: 69 6c 65 42 65 67 69 6e 2c 20 20 20 20 20 20 20  ileBegin,       
f7b0: 20 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e         /* xBegin
f7c0: 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7e0: 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20     /* xSync */. 
f7f0: 20 20 20 7a 69 70 66 69 6c 65 43 6f 6d 6d 69 74     zipfileCommit
f800: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
f810: 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20 20 20   xCommit */.    
f820: 7a 69 70 66 69 6c 65 52 6f 6c 6c 62 61 63 6b 2c  zipfileRollback,
f830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
f840: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20 7a  ollback */.    z
f850: 69 70 66 69 6c 65 46 69 6e 64 46 75 6e 63 74 69  ipfileFindFuncti
f860: 6f 6e 2c 20 20 20 20 20 20 20 2f 2a 20 78 46 69  on,       /* xFi
f870: 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 20 20  ndMethod */.    
f880: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
f890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
f8a0: 65 6e 61 6d 65 20 2a 2f 0a 20 20 7d 3b 0a 0a 20  ename */.  };.. 
f8b0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
f8c0: 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28  3_create_module(
f8d0: 64 62 2c 20 22 7a 69 70 66 69 6c 65 22 20 20 2c  db, "zipfile"  ,
f8e0: 20 26 7a 69 70 66 69 6c 65 4d 6f 64 75 6c 65 2c   &zipfileModule,
f8f0: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
f900: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
f910: 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64  sqlite3_overload
f920: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 7a  _function(db, "z
f930: 69 70 66 69 6c 65 5f 63 64 73 22 2c 20 2d 31 29  ipfile_cds", -1)
f940: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
f950: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
f960: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
f970: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 7a  _function(db, "z
f980: 69 70 66 69 6c 65 22 2c 20 2d 31 2c 20 53 51 4c  ipfile", -1, SQL
f990: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20  ITE_UTF8, 0, 0, 
f9a0: 0a 20 20 20 20 20 20 20 20 7a 69 70 66 69 6c 65  .        zipfile
f9b0: 53 74 65 70 2c 20 7a 69 70 66 69 6c 65 46 69 6e  Step, zipfileFin
f9c0: 61 6c 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20  al.    );.  }.  
f9d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c  return rc;.}.#el
f9e0: 73 65 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51  se         /* SQ
f9f0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
fa00: 4c 54 41 42 4c 45 20 2a 2f 0a 23 20 64 65 66 69  LTABLE */.# defi
fa10: 6e 65 20 7a 69 70 66 69 6c 65 52 65 67 69 73 74  ne zipfileRegist
fa20: 65 72 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  er(x) SQLITE_OK.
fa30: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 5f  #endif..#ifdef _
fa40: 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63  WIN32.__declspec
fa50: 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64  (dllexport).#end
fa60: 69 66 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 7a  if.int sqlite3_z
fa70: 69 70 66 69 6c 65 5f 69 6e 69 74 28 0a 20 20 73  ipfile_init(.  s
fa80: 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63  qlite3 *db, .  c
fa90: 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20  har **pzErrMsg, 
faa0: 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
fab0: 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70  _api_routines *p
fac0: 41 70 69 0a 29 7b 0a 20 20 53 51 4c 49 54 45 5f  Api.){.  SQLITE_
fad0: 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32 28  EXTENSION_INIT2(
fae0: 70 41 70 69 29 3b 0a 20 20 28 76 6f 69 64 29 70  pApi);.  (void)p
faf0: 7a 45 72 72 4d 73 67 3b 20 20 2f 2a 20 55 6e 75  zErrMsg;  /* Unu
fb00: 73 65 64 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  sed parameter */
fb10: 0a 20 20 72 65 74 75 72 6e 20 7a 69 70 66 69 6c  .  return zipfil
fb20: 65 52 65 67 69 73 74 65 72 28 64 62 29 3b 0a 7d  eRegister(db);.}
fb30: 0a                                               .