/ Hex Artifact Content
Login

Artifact 0d12ad852af1732c9a4bd0be9f28886b049e0591a871e3246a5347d2cea15430:


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 2f 0a 23 69 6e 63 6c  ****.**.*/.#incl
0180: 75 64 65 20 22 73 71 6c 69 74 65 33 65 78 74 2e  ude "sqlite3ext.
0190: 68 22 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e 53  h".SQLITE_EXTENS
01a0: 49 4f 4e 5f 49 4e 49 54 31 0a 23 69 6e 63 6c 75  ION_INIT1.#inclu
01b0: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
01c0: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e  clude <string.h>
01d0: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
01e0: 74 2e 68 3e 0a 0a 23 69 6e 63 6c 75 64 65 20 3c  t.h>..#include <
01f0: 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e  sys/types.h>.#in
0200: 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e  clude <sys/stat.
0210: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e  h>.#include <fcn
0220: 74 6c 2e 68 3e 0a 23 69 66 20 21 64 65 66 69 6e  tl.h>.#if !defin
0230: 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64  ed(_WIN32) && !d
0240: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 20  efined(WIN32).# 
0250: 20 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64   include <unistd
0260: 2e 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  .h>.#  include <
0270: 64 69 72 65 6e 74 2e 68 3e 0a 23 20 20 69 6e 63  dirent.h>.#  inc
0280: 6c 75 64 65 20 3c 75 74 69 6d 65 2e 68 3e 0a 23  lude <utime.h>.#
0290: 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64 65 20  else.#  include 
02a0: 3c 69 6f 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69  <io.h>.#endif.#i
02b0: 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a  nclude <time.h>.
02c0: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
02d0: 68 3e 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 7a 6c  h>..#include <zl
02e0: 69 62 2e 68 3e 0a 0a 23 69 66 6e 64 65 66 20 53  ib.h>..#ifndef S
02f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
0300: 41 4c 54 41 42 4c 45 0a 0a 23 69 66 6e 64 65 66  ALTABLE..#ifndef
0310: 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41   SQLITE_AMALGAMA
0320: 54 49 4f 4e 0a 74 79 70 65 64 65 66 20 73 71 6c  TION.typedef sql
0330: 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34 3b 0a  ite3_int64 i64;.
0340: 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64  typedef unsigned
0350: 20 63 68 61 72 20 75 38 3b 0a 74 79 70 65 64 65   char u8;.typede
0360: 66 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74  f unsigned short
0370: 20 75 31 36 3b 0a 74 79 70 65 64 65 66 20 75 6e   u16;.typedef un
0380: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 75 33 32 3b  signed long u32;
0390: 0a 23 64 65 66 69 6e 65 20 4d 49 4e 28 61 2c 62  .#define MIN(a,b
03a0: 29 20 28 28 61 29 3c 28 62 29 20 3f 20 28 61 29  ) ((a)<(b) ? (a)
03b0: 20 3a 20 28 62 29 29 0a 23 65 6e 64 69 66 0a 0a   : (b)).#endif..
03c0: 23 64 65 66 69 6e 65 20 5a 49 50 46 49 4c 45 5f  #define ZIPFILE_
03d0: 53 43 48 45 4d 41 20 22 43 52 45 41 54 45 20 54  SCHEMA "CREATE T
03e0: 41 42 4c 45 20 79 28 22 20 20 20 20 20 20 20 20  ABLE y("        
03f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0400: 20 20 20 20 20 20 5c 0a 20 20 22 6e 61 6d 65 2c        \.  "name,
0410: 20 20 20 20 20 20 2f 2a 20 30 3a 20 4e 61 6d 65        /* 0: Name
0420: 20 6f 66 20 66 69 6c 65 20 69 6e 20 7a 69 70 20   of file in zip 
0430: 61 72 63 68 69 76 65 20 2a 2f 22 20 20 20 20 20  archive */"     
0440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
0450: 20 20 22 6d 6f 64 65 2c 20 20 20 20 20 20 2f 2a    "mode,      /*
0460: 20 31 3a 20 50 4f 53 49 58 20 6d 6f 64 65 20 66   1: POSIX mode f
0470: 6f 72 20 66 69 6c 65 20 2a 2f 22 20 20 20 20 20  or file */"     
0480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0490: 20 20 20 20 20 20 5c 0a 20 20 22 6d 74 69 6d 65        \.  "mtime
04a0: 2c 20 20 20 20 20 2f 2a 20 32 3a 20 4c 61 73 74  ,     /* 2: Last
04b0: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 74 69   modification ti
04c0: 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
04d0: 6e 63 65 20 65 70 6f 63 68 20 2a 2f 22 20 5c 0a  nce epoch */" \.
04e0: 20 20 22 73 7a 2c 20 20 20 20 20 20 20 20 2f 2a    "sz,        /*
04f0: 20 33 3a 20 53 69 7a 65 20 6f 66 20 6f 62 6a 65   3: Size of obje
0500: 63 74 20 2a 2f 22 20 20 20 20 20 20 20 20 20 20  ct */"          
0510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0520: 20 20 20 20 20 20 5c 0a 20 20 22 72 61 77 64 61        \.  "rawda
0530: 74 61 2c 20 20 20 2f 2a 20 34 3a 20 52 61 77 20  ta,   /* 4: Raw 
0540: 64 61 74 61 20 2a 2f 22 20 20 20 20 20 20 20 20  data */"        
0550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
0570: 20 20 22 64 61 74 61 2c 20 20 20 20 20 20 2f 2a    "data,      /*
0580: 20 35 3a 20 55 6e 63 6f 6d 70 72 65 73 73 65 64   5: Uncompressed
0590: 20 64 61 74 61 20 2a 2f 22 20 20 20 20 20 20 20   data */"       
05a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05b0: 20 20 20 20 20 20 5c 0a 20 20 22 6d 65 74 68 6f        \.  "metho
05c0: 64 2c 20 20 20 20 2f 2a 20 36 3a 20 43 6f 6d 70  d,    /* 6: Comp
05d0: 72 65 73 73 69 6f 6e 20 6d 65 74 68 6f 64 20 28  ression method (
05e0: 69 6e 74 65 67 65 72 29 20 2a 2f 22 20 20 20 20  integer) */"    
05f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
0600: 20 20 22 66 69 6c 65 20 48 49 44 44 45 4e 20 20    "file HIDDEN  
0610: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 7a 69 70 20   /* Name of zip 
0620: 66 69 6c 65 20 2a 2f 22 20 20 20 20 20 20 20 20  file */"        
0630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0640: 20 20 20 20 20 20 5c 0a 22 29 3b 22 0a 0a 23 64        \.");"..#d
0650: 65 66 69 6e 65 20 5a 49 50 46 49 4c 45 5f 46 5f  efine ZIPFILE_F_
0660: 43 4f 4c 55 4d 4e 5f 49 44 58 20 37 20 20 20 20  COLUMN_IDX 7    
0670: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
0680: 6d 6e 20 22 66 22 20 69 6e 20 74 68 65 20 61 62  mn "f" in the ab
0690: 6f 76 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 5a  ove */.#define Z
06a0: 49 50 46 49 4c 45 5f 42 55 46 46 45 52 5f 53 49  IPFILE_BUFFER_SI
06b0: 5a 45 20 28 36 34 2a 31 30 32 34 29 0a 0a 0a 2f  ZE (64*1024).../
06c0: 2a 0a 2a 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65  *.** Magic numbe
06d0: 72 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  rs used to read 
06e0: 61 6e 64 20 77 72 69 74 65 20 7a 69 70 20 66 69  and write zip fi
06f0: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 5a 49 50 46 49  les..**.** ZIPFI
0700: 4c 45 5f 4e 45 57 45 4e 54 52 59 5f 4d 41 44 45  LE_NEWENTRY_MADE
0710: 42 59 3a 0a 2a 2a 20 20 20 55 73 65 20 74 68 69  BY:.**   Use thi
0720: 73 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  s value for the 
0730: 22 76 65 72 73 69 6f 6e 2d 6d 61 64 65 2d 62 79  "version-made-by
0740: 22 20 66 69 65 6c 64 20 69 6e 20 6e 65 77 20 7a  " field in new z
0750: 69 70 20 66 69 6c 65 0a 2a 2a 20 20 20 65 6e 74  ip file.**   ent
0760: 72 69 65 73 2e 20 54 68 65 20 75 70 70 65 72 20  ries. The upper 
0770: 62 79 74 65 20 69 6e 64 69 63 61 74 65 73 20 22  byte indicates "
0780: 75 6e 69 78 22 2c 20 61 6e 64 20 74 68 65 20 6c  unix", and the l
0790: 6f 77 65 72 20 62 79 74 65 20 0a 2a 2a 20 20 20  ower byte .**   
07a0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
07b0: 68 65 20 7a 69 70 20 66 69 6c 65 20 6d 61 74 63  he zip file matc
07c0: 68 65 73 20 70 6b 7a 69 70 20 73 70 65 63 69 66  hes pkzip specif
07d0: 69 63 61 74 69 6f 6e 20 33 2e 30 2e 20 0a 2a 2a  ication 3.0. .**
07e0: 20 20 20 54 68 69 73 20 69 73 20 77 68 61 74 20     This is what 
07f0: 69 6e 66 6f 2d 7a 69 70 20 73 65 65 6d 73 20 74  info-zip seems t
0800: 6f 20 64 6f 2e 0a 2a 2a 0a 2a 2a 20 5a 49 50 46  o do..**.** ZIPF
0810: 49 4c 45 5f 4e 45 57 45 4e 54 52 59 5f 52 45 51  ILE_NEWENTRY_REQ
0820: 55 49 52 45 44 3a 0a 2a 2a 20 20 20 56 61 6c 75  UIRED:.**   Valu
0830: 65 20 66 6f 72 20 22 76 65 72 73 69 6f 6e 2d 72  e for "version-r
0840: 65 71 75 69 72 65 64 2d 74 6f 2d 65 78 74 72 61  equired-to-extra
0850: 63 74 22 20 66 69 65 6c 64 20 6f 66 20 6e 65 77  ct" field of new
0860: 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 20 20 20 56   entries..**   V
0870: 65 72 73 69 6f 6e 20 32 2e 30 20 69 73 20 72 65  ersion 2.0 is re
0880: 71 75 69 72 65 64 20 74 6f 20 73 75 70 70 6f 72  quired to suppor
0890: 74 20 66 6f 6c 64 65 72 73 20 61 6e 64 20 64 65  t folders and de
08a0: 66 6c 61 74 65 20 63 6f 6d 70 72 65 73 73 69 6f  flate compressio
08b0: 6e 2e 0a 2a 2a 0a 2a 2a 20 5a 49 50 46 49 4c 45  n..**.** ZIPFILE
08c0: 5f 4e 45 57 45 4e 54 52 59 5f 46 4c 41 47 53 3a  _NEWENTRY_FLAGS:
08d0: 0a 2a 2a 20 20 20 56 61 6c 75 65 20 66 6f 72 20  .**   Value for 
08e0: 22 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65  "general-purpose
08f0: 2d 62 69 74 2d 66 6c 61 67 73 22 20 66 69 65 6c  -bit-flags" fiel
0900: 64 20 6f 66 20 6e 65 77 20 65 6e 74 72 69 65 73  d of new entries
0910: 2e 20 42 69 74 0a 2a 2a 20 20 20 31 31 20 6d 65  . Bit.**   11 me
0920: 61 6e 73 20 22 75 74 66 2d 38 20 66 69 6c 65 6e  ans "utf-8 filen
0930: 61 6d 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 22  ame and comment"
0940: 2e 0a 2a 2a 0a 2a 2a 20 5a 49 50 46 49 4c 45 5f  ..**.** ZIPFILE_
0950: 53 49 47 4e 41 54 55 52 45 5f 43 44 53 3a 0a 2a  SIGNATURE_CDS:.*
0960: 2a 20 20 20 46 69 72 73 74 20 34 20 62 79 74 65  *   First 4 byte
0970: 73 20 6f 66 20 61 20 76 61 6c 69 64 20 43 44 53  s of a valid CDS
0980: 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 5a   record..**.** Z
0990: 49 50 46 49 4c 45 5f 53 49 47 4e 41 54 55 52 45  IPFILE_SIGNATURE
09a0: 5f 4c 46 48 3a 0a 2a 2a 20 20 20 46 69 72 73 74  _LFH:.**   First
09b0: 20 34 20 62 79 74 65 73 20 6f 66 20 61 20 76 61   4 bytes of a va
09c0: 6c 69 64 20 4c 46 48 20 72 65 63 6f 72 64 2e 0a  lid LFH record..
09d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 5a 49 50 46 49  */.#define ZIPFI
09e0: 4c 45 5f 45 58 54 52 41 5f 54 49 4d 45 53 54 41  LE_EXTRA_TIMESTA
09f0: 4d 50 20 20 20 30 78 35 34 35 35 0a 23 64 65 66  MP   0x5455.#def
0a00: 69 6e 65 20 5a 49 50 46 49 4c 45 5f 4e 45 57 45  ine ZIPFILE_NEWE
0a10: 4e 54 52 59 5f 4d 41 44 45 42 59 20 20 20 28 28  NTRY_MADEBY   ((
0a20: 33 3c 3c 38 29 20 2b 20 33 30 29 0a 23 64 65 66  3<<8) + 30).#def
0a30: 69 6e 65 20 5a 49 50 46 49 4c 45 5f 4e 45 57 45  ine ZIPFILE_NEWE
0a40: 4e 54 52 59 5f 52 45 51 55 49 52 45 44 20 32 30  NTRY_REQUIRED 20
0a50: 0a 23 64 65 66 69 6e 65 20 5a 49 50 46 49 4c 45  .#define ZIPFILE
0a60: 5f 4e 45 57 45 4e 54 52 59 5f 46 4c 41 47 53 20  _NEWENTRY_FLAGS 
0a70: 20 20 20 30 78 38 30 30 0a 23 64 65 66 69 6e 65     0x800.#define
0a80: 20 5a 49 50 46 49 4c 45 5f 53 49 47 4e 41 54 55   ZIPFILE_SIGNATU
0a90: 52 45 5f 43 44 53 20 20 20 20 20 30 78 30 32 30  RE_CDS     0x020
0aa0: 31 34 62 35 30 0a 23 64 65 66 69 6e 65 20 5a 49  14b50.#define ZI
0ab0: 50 46 49 4c 45 5f 53 49 47 4e 41 54 55 52 45 5f  PFILE_SIGNATURE_
0ac0: 4c 46 48 20 20 20 20 20 30 78 30 34 30 33 34 62  LFH     0x04034b
0ad0: 35 30 0a 23 64 65 66 69 6e 65 20 5a 49 50 46 49  50.#define ZIPFI
0ae0: 4c 45 5f 53 49 47 4e 41 54 55 52 45 5f 45 4f 43  LE_SIGNATURE_EOC
0af0: 44 20 20 20 20 30 78 30 36 30 35 34 62 35 30 0a  D    0x06054b50.
0b00: 23 64 65 66 69 6e 65 20 5a 49 50 46 49 4c 45 5f  #define ZIPFILE_
0b10: 4c 46 48 5f 46 49 58 45 44 5f 53 5a 20 20 20 20  LFH_FIXED_SZ    
0b20: 20 20 33 30 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20    30../*.** Set 
0b30: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
0b40: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 63  e contained in c
0b50: 6f 6e 74 65 78 74 20 63 74 78 20 74 6f 20 74 68  ontext ctx to th
0b60: 65 20 72 65 73 75 6c 74 73 20 6f 66 0a 2a 2a 20  e results of.** 
0b70: 76 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 2e 2e  vprintf(zFmt, ..
0b80: 2e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .)..*/.static vo
0b90: 69 64 20 7a 69 70 66 69 6c 65 43 74 78 45 72 72  id zipfileCtxErr
0ba0: 6f 72 4d 73 67 28 73 71 6c 69 74 65 33 5f 63 6f  orMsg(sqlite3_co
0bb0: 6e 74 65 78 74 20 2a 63 74 78 2c 20 63 6f 6e 73  ntext *ctx, cons
0bc0: 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e  t char *zFmt, ..
0bd0: 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67  .){.  char *zMsg
0be0: 20 3d 20 30 3b 0a 20 20 76 61 5f 6c 69 73 74 20   = 0;.  va_list 
0bf0: 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
0c00: 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a 4d 73 67  p, zFmt);.  zMsg
0c10: 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
0c20: 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20  ntf(zFmt, ap);. 
0c30: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
0c40: 65 72 72 6f 72 28 63 74 78 2c 20 7a 4d 73 67 2c  error(ctx, zMsg,
0c50: 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   -1);.  sqlite3_
0c60: 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20 20 76 61  free(zMsg);.  va
0c70: 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 0a 2f 2a  _end(ap);.}.../*
0c80: 0a 2a 2a 2a 20 34 2e 33 2e 31 36 20 20 45 6e 64  .*** 4.3.16  End
0c90: 20 6f 66 20 63 65 6e 74 72 61 6c 20 64 69 72 65   of central dire
0ca0: 63 74 6f 72 79 20 72 65 63 6f 72 64 3a 0a 2a 2a  ctory record:.**
0cb0: 2a 0a 2a 2a 2a 20 20 20 65 6e 64 20 6f 66 20 63  *.***   end of c
0cc0: 65 6e 74 72 61 6c 20 64 69 72 20 73 69 67 6e 61  entral dir signa
0cd0: 74 75 72 65 20 20 20 20 34 20 62 79 74 65 73 20  ture    4 bytes 
0ce0: 20 28 30 78 30 36 30 35 34 62 35 30 29 0a 2a 2a   (0x06054b50).**
0cf0: 2a 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  *   number of th
0d00: 69 73 20 64 69 73 6b 20 20 20 20 20 20 20 20 20  is disk         
0d10: 20 20 20 20 32 20 62 79 74 65 73 0a 2a 2a 2a 20      2 bytes.*** 
0d20: 20 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20    number of the 
0d30: 64 69 73 6b 20 77 69 74 68 20 74 68 65 0a 2a 2a  disk with the.**
0d40: 2a 20 20 20 73 74 61 72 74 20 6f 66 20 74 68 65  *   start of the
0d50: 20 63 65 6e 74 72 61 6c 20 64 69 72 65 63 74 6f   central directo
0d60: 72 79 20 20 32 20 62 79 74 65 73 0a 2a 2a 2a 20  ry  2 bytes.*** 
0d70: 20 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f    total number o
0d80: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
0d90: 0a 2a 2a 2a 20 20 20 63 65 6e 74 72 61 6c 20 64  .***   central d
0da0: 69 72 65 63 74 6f 72 79 20 6f 6e 20 74 68 69 73  irectory on this
0db0: 20 64 69 73 6b 20 20 32 20 62 79 74 65 73 0a 2a   disk  2 bytes.*
0dc0: 2a 2a 20 20 20 74 6f 74 61 6c 20 6e 75 6d 62 65  **   total numbe
0dd0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 0a  r of entries in.
0de0: 2a 2a 2a 20 20 20 74 68 65 20 63 65 6e 74 72 61  ***   the centra
0df0: 6c 20 64 69 72 65 63 74 6f 72 79 20 20 20 20 20  l directory     
0e00: 20 20 20 20 20 20 32 20 62 79 74 65 73 0a 2a 2a        2 bytes.**
0e10: 2a 20 20 20 73 69 7a 65 20 6f 66 20 74 68 65 20  *   size of the 
0e20: 63 65 6e 74 72 61 6c 20 64 69 72 65 63 74 6f 72  central director
0e30: 79 20 20 20 34 20 62 79 74 65 73 0a 2a 2a 2a 20  y   4 bytes.*** 
0e40: 20 20 6f 66 66 73 65 74 20 6f 66 20 73 74 61 72    offset of star
0e50: 74 20 6f 66 20 63 65 6e 74 72 61 6c 0a 2a 2a 2a  t of central.***
0e60: 20 20 20 64 69 72 65 63 74 6f 72 79 20 77 69 74     directory wit
0e70: 68 20 72 65 73 70 65 63 74 20 74 6f 0a 2a 2a 2a  h respect to.***
0e80: 20 20 20 74 68 65 20 73 74 61 72 74 69 6e 67 20     the starting 
0e90: 64 69 73 6b 20 6e 75 6d 62 65 72 20 20 20 20 20  disk number     
0ea0: 20 20 20 34 20 62 79 74 65 73 0a 2a 2a 2a 20 20     4 bytes.***  
0eb0: 20 2e 5a 49 50 20 66 69 6c 65 20 63 6f 6d 6d 65   .ZIP file comme
0ec0: 6e 74 20 6c 65 6e 67 74 68 20 20 20 20 20 20 20  nt length       
0ed0: 20 32 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20 2e   2 bytes.***   .
0ee0: 5a 49 50 20 66 69 6c 65 20 63 6f 6d 6d 65 6e 74  ZIP file comment
0ef0: 20 20 20 20 20 20 20 28 76 61 72 69 61 62 6c 65         (variable
0f00: 20 73 69 7a 65 29 0a 2a 2f 0a 74 79 70 65 64 65   size).*/.typede
0f10: 66 20 73 74 72 75 63 74 20 5a 69 70 66 69 6c 65  f struct Zipfile
0f20: 45 4f 43 44 20 5a 69 70 66 69 6c 65 45 4f 43 44  EOCD ZipfileEOCD
0f30: 3b 0a 73 74 72 75 63 74 20 5a 69 70 66 69 6c 65  ;.struct Zipfile
0f40: 45 4f 43 44 20 7b 0a 20 20 75 31 36 20 69 44 69  EOCD {.  u16 iDi
0f50: 73 6b 3b 0a 20 20 75 31 36 20 69 46 69 72 73 74  sk;.  u16 iFirst
0f60: 44 69 73 6b 3b 0a 20 20 75 31 36 20 6e 45 6e 74  Disk;.  u16 nEnt
0f70: 72 79 3b 0a 20 20 75 31 36 20 6e 45 6e 74 72 79  ry;.  u16 nEntry
0f80: 54 6f 74 61 6c 3b 0a 20 20 75 33 32 20 6e 53 69  Total;.  u32 nSi
0f90: 7a 65 3b 0a 20 20 75 33 32 20 69 4f 66 66 73 65  ze;.  u32 iOffse
0fa0: 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 2a 20 34 2e  t;.};../*.*** 4.
0fb0: 33 2e 31 32 20 20 43 65 6e 74 72 61 6c 20 64 69  3.12  Central di
0fc0: 72 65 63 74 6f 72 79 20 73 74 72 75 63 74 75 72  rectory structur
0fd0: 65 3a 0a 2a 2a 2a 0a 2a 2a 2a 20 2e 2e 2e 0a 2a  e:.***.*** ....*
0fe0: 2a 2a 0a 2a 2a 2a 20 20 20 63 65 6e 74 72 61 6c  **.***   central
0ff0: 20 66 69 6c 65 20 68 65 61 64 65 72 20 73 69 67   file header sig
1000: 6e 61 74 75 72 65 20 20 20 34 20 62 79 74 65 73  nature   4 bytes
1010: 20 20 28 30 78 30 32 30 31 34 62 35 30 29 0a 2a    (0x02014b50).*
1020: 2a 2a 20 20 20 76 65 72 73 69 6f 6e 20 6d 61 64  **   version mad
1030: 65 20 62 79 20 20 20 20 20 20 20 20 20 20 20 20  e by            
1040: 20 20 20 20 20 32 20 62 79 74 65 73 0a 2a 2a 2a       2 bytes.***
1050: 20 20 20 76 65 72 73 69 6f 6e 20 6e 65 65 64 65     version neede
1060: 64 20 74 6f 20 65 78 74 72 61 63 74 20 20 20 20  d to extract    
1070: 20 20 20 32 20 62 79 74 65 73 0a 2a 2a 2a 20 20     2 bytes.***  
1080: 20 67 65 6e 65 72 61 6c 20 70 75 72 70 6f 73 65   general purpose
1090: 20 62 69 74 20 66 6c 61 67 20 20 20 20 20 20 20   bit flag       
10a0: 20 32 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20 63   2 bytes.***   c
10b0: 6f 6d 70 72 65 73 73 69 6f 6e 20 6d 65 74 68 6f  ompression metho
10c0: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32  d              2
10d0: 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20 6c 61 73   bytes.***   las
10e0: 74 20 6d 6f 64 20 66 69 6c 65 20 74 69 6d 65 20  t mod file time 
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 62               2 b
1100: 79 74 65 73 0a 2a 2a 2a 20 20 20 6c 61 73 74 20  ytes.***   last 
1110: 6d 6f 64 20 66 69 6c 65 20 64 61 74 65 20 20 20  mod file date   
1120: 20 20 20 20 20 20 20 20 20 20 20 32 20 62 79 74             2 byt
1130: 65 73 0a 2a 2a 2a 20 20 20 63 72 63 2d 33 32 20  es.***   crc-32 
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1150: 20 20 20 20 20 20 20 20 20 34 20 62 79 74 65 73           4 bytes
1160: 0a 2a 2a 2a 20 20 20 63 6f 6d 70 72 65 73 73 65  .***   compresse
1170: 64 20 73 69 7a 65 20 20 20 20 20 20 20 20 20 20  d size          
1180: 20 20 20 20 20 20 20 34 20 62 79 74 65 73 0a 2a         4 bytes.*
1190: 2a 2a 20 20 20 75 6e 63 6f 6d 70 72 65 73 73 65  **   uncompresse
11a0: 64 20 73 69 7a 65 20 20 20 20 20 20 20 20 20 20  d size          
11b0: 20 20 20 20 20 34 20 62 79 74 65 73 0a 2a 2a 2a       4 bytes.***
11c0: 20 20 20 66 69 6c 65 20 6e 61 6d 65 20 6c 65 6e     file name len
11d0: 67 74 68 20 20 20 20 20 20 20 20 20 20 20 20 20  gth             
11e0: 20 20 20 32 20 62 79 74 65 73 0a 2a 2a 2a 20 20     2 bytes.***  
11f0: 20 65 78 74 72 61 20 66 69 65 6c 64 20 6c 65 6e   extra field len
1200: 67 74 68 20 20 20 20 20 20 20 20 20 20 20 20 20  gth             
1210: 20 32 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20 66   2 bytes.***   f
1220: 69 6c 65 20 63 6f 6d 6d 65 6e 74 20 6c 65 6e 67  ile comment leng
1230: 74 68 20 20 20 20 20 20 20 20 20 20 20 20 20 32  th             2
1240: 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20 64 69 73   bytes.***   dis
1250: 6b 20 6e 75 6d 62 65 72 20 73 74 61 72 74 20 20  k number start  
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 62               2 b
1270: 79 74 65 73 0a 2a 2a 2a 20 20 20 69 6e 74 65 72  ytes.***   inter
1280: 6e 61 6c 20 66 69 6c 65 20 61 74 74 72 69 62 75  nal file attribu
1290: 74 65 73 20 20 20 20 20 20 20 20 32 20 62 79 74  tes        2 byt
12a0: 65 73 0a 2a 2a 2a 20 20 20 65 78 74 65 72 6e 61  es.***   externa
12b0: 6c 20 66 69 6c 65 20 61 74 74 72 69 62 75 74 65  l file attribute
12c0: 73 20 20 20 20 20 20 20 20 34 20 62 79 74 65 73  s        4 bytes
12d0: 0a 2a 2a 2a 20 20 20 72 65 6c 61 74 69 76 65 20  .***   relative 
12e0: 6f 66 66 73 65 74 20 6f 66 20 6c 6f 63 61 6c 20  offset of local 
12f0: 68 65 61 64 65 72 20 34 20 62 79 74 65 73 0a 2a  header 4 bytes.*
1300: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1310: 20 5a 69 70 66 69 6c 65 43 44 53 20 5a 69 70 66   ZipfileCDS Zipf
1320: 69 6c 65 43 44 53 3b 0a 73 74 72 75 63 74 20 5a  ileCDS;.struct Z
1330: 69 70 66 69 6c 65 43 44 53 20 7b 0a 20 20 75 31  ipfileCDS {.  u1
1340: 36 20 69 56 65 72 73 69 6f 6e 4d 61 64 65 42 79  6 iVersionMadeBy
1350: 3b 0a 20 20 75 31 36 20 69 56 65 72 73 69 6f 6e  ;.  u16 iVersion
1360: 45 78 74 72 61 63 74 3b 0a 20 20 75 31 36 20 66  Extract;.  u16 f
1370: 6c 61 67 73 3b 0a 20 20 75 31 36 20 69 43 6f 6d  lags;.  u16 iCom
1380: 70 72 65 73 73 69 6f 6e 3b 0a 20 20 75 31 36 20  pression;.  u16 
1390: 6d 54 69 6d 65 3b 0a 20 20 75 31 36 20 6d 44 61  mTime;.  u16 mDa
13a0: 74 65 3b 0a 20 20 75 33 32 20 63 72 63 33 32 3b  te;.  u32 crc32;
13b0: 0a 20 20 75 33 32 20 73 7a 43 6f 6d 70 72 65 73  .  u32 szCompres
13c0: 73 65 64 3b 0a 20 20 75 33 32 20 73 7a 55 6e 63  sed;.  u32 szUnc
13d0: 6f 6d 70 72 65 73 73 65 64 3b 0a 20 20 75 31 36  ompressed;.  u16
13e0: 20 6e 46 69 6c 65 3b 0a 20 20 75 31 36 20 6e 45   nFile;.  u16 nE
13f0: 78 74 72 61 3b 0a 20 20 75 31 36 20 6e 43 6f 6d  xtra;.  u16 nCom
1400: 6d 65 6e 74 3b 0a 20 20 75 31 36 20 69 44 69 73  ment;.  u16 iDis
1410: 6b 53 74 61 72 74 3b 0a 20 20 75 31 36 20 69 49  kStart;.  u16 iI
1420: 6e 74 65 72 6e 61 6c 41 74 74 72 3b 0a 20 20 75  nternalAttr;.  u
1430: 33 32 20 69 45 78 74 65 72 6e 61 6c 41 74 74 72  32 iExternalAttr
1440: 3b 0a 20 20 75 33 32 20 69 4f 66 66 73 65 74 3b  ;.  u32 iOffset;
1450: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20  .  char *zFile; 
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1470: 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 28     /* Filename (
1480: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
1490: 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 2a 20  ) */.};../*.*** 
14a0: 34 2e 33 2e 37 20 20 4c 6f 63 61 6c 20 66 69 6c  4.3.7  Local fil
14b0: 65 20 68 65 61 64 65 72 3a 0a 2a 2a 2a 0a 2a 2a  e header:.***.**
14c0: 2a 20 20 20 6c 6f 63 61 6c 20 66 69 6c 65 20 68  *   local file h
14d0: 65 61 64 65 72 20 73 69 67 6e 61 74 75 72 65 20  eader signature 
14e0: 20 20 20 20 34 20 62 79 74 65 73 20 20 28 30 78      4 bytes  (0x
14f0: 30 34 30 33 34 62 35 30 29 0a 2a 2a 2a 20 20 20  04034b50).***   
1500: 76 65 72 73 69 6f 6e 20 6e 65 65 64 65 64 20 74  version needed t
1510: 6f 20 65 78 74 72 61 63 74 20 20 20 20 20 20 20  o extract       
1520: 32 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20 67 65  2 bytes.***   ge
1530: 6e 65 72 61 6c 20 70 75 72 70 6f 73 65 20 62 69  neral purpose bi
1540: 74 20 66 6c 61 67 20 20 20 20 20 20 20 20 32 20  t flag        2 
1550: 62 79 74 65 73 0a 2a 2a 2a 20 20 20 63 6f 6d 70  bytes.***   comp
1560: 72 65 73 73 69 6f 6e 20 6d 65 74 68 6f 64 20 20  ression method  
1570: 20 20 20 20 20 20 20 20 20 20 20 20 32 20 62 79              2 by
1580: 74 65 73 0a 2a 2a 2a 20 20 20 6c 61 73 74 20 6d  tes.***   last m
1590: 6f 64 20 66 69 6c 65 20 74 69 6d 65 20 20 20 20  od file time    
15a0: 20 20 20 20 20 20 20 20 20 20 32 20 62 79 74 65            2 byte
15b0: 73 0a 2a 2a 2a 20 20 20 6c 61 73 74 20 6d 6f 64  s.***   last mod
15c0: 20 66 69 6c 65 20 64 61 74 65 20 20 20 20 20 20   file date      
15d0: 20 20 20 20 20 20 20 20 32 20 62 79 74 65 73 0a          2 bytes.
15e0: 2a 2a 2a 20 20 20 63 72 63 2d 33 32 20 20 20 20  ***   crc-32    
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 34 20 62 79 74 65 73 0a 2a 2a        4 bytes.**
1610: 2a 20 20 20 63 6f 6d 70 72 65 73 73 65 64 20 73  *   compressed s
1620: 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
1630: 20 20 20 20 34 20 62 79 74 65 73 0a 2a 2a 2a 20      4 bytes.*** 
1640: 20 20 75 6e 63 6f 6d 70 72 65 73 73 65 64 20 73    uncompressed s
1650: 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
1660: 20 20 34 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20    4 bytes.***   
1670: 66 69 6c 65 20 6e 61 6d 65 20 6c 65 6e 67 74 68  file name length
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 32 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20 65 78  2 bytes.***   ex
16a0: 74 72 61 20 66 69 65 6c 64 20 6c 65 6e 67 74 68  tra field length
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
16c0: 62 79 74 65 73 0a 2a 2a 2a 20 20 20 0a 2a 2f 0a  bytes.***   .*/.
16d0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 5a  typedef struct Z
16e0: 69 70 66 69 6c 65 4c 46 48 20 5a 69 70 66 69 6c  ipfileLFH Zipfil
16f0: 65 4c 46 48 3b 0a 73 74 72 75 63 74 20 5a 69 70  eLFH;.struct Zip
1700: 66 69 6c 65 4c 46 48 20 7b 0a 20 20 75 31 36 20  fileLFH {.  u16 
1710: 69 56 65 72 73 69 6f 6e 45 78 74 72 61 63 74 3b  iVersionExtract;
1720: 0a 20 20 75 31 36 20 66 6c 61 67 73 3b 0a 20 20  .  u16 flags;.  
1730: 75 31 36 20 69 43 6f 6d 70 72 65 73 73 69 6f 6e  u16 iCompression
1740: 3b 0a 20 20 75 31 36 20 6d 54 69 6d 65 3b 0a 20  ;.  u16 mTime;. 
1750: 20 75 31 36 20 6d 44 61 74 65 3b 0a 20 20 75 33   u16 mDate;.  u3
1760: 32 20 63 72 63 33 32 3b 0a 20 20 75 33 32 20 73  2 crc32;.  u32 s
1770: 7a 43 6f 6d 70 72 65 73 73 65 64 3b 0a 20 20 75  zCompressed;.  u
1780: 33 32 20 73 7a 55 6e 63 6f 6d 70 72 65 73 73 65  32 szUncompresse
1790: 64 3b 0a 20 20 75 31 36 20 6e 46 69 6c 65 3b 0a  d;.  u16 nFile;.
17a0: 20 20 75 31 36 20 6e 45 78 74 72 61 3b 0a 7d 3b    u16 nExtra;.};
17b0: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
17c0: 20 5a 69 70 66 69 6c 65 45 6e 74 72 79 20 5a 69   ZipfileEntry Zi
17d0: 70 66 69 6c 65 45 6e 74 72 79 3b 0a 73 74 72 75  pfileEntry;.stru
17e0: 63 74 20 5a 69 70 66 69 6c 65 45 6e 74 72 79 20  ct ZipfileEntry 
17f0: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 3b  {.  char *zPath;
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1810: 2a 20 50 61 74 68 20 6f 66 20 7a 69 70 66 69 6c  * Path of zipfil
1820: 65 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 36 34  e entry */.  i64
1830: 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20   iRowid;        
1840: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
1850: 20 66 6f 72 20 74 68 69 73 20 76 61 6c 75 65 20   for this value 
1860: 69 66 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20  if queried */.  
1870: 75 38 20 2a 61 43 64 73 45 6e 74 72 79 3b 20 20  u8 *aCdsEntry;  
1880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
1890: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
18a0: 65 6e 74 69 72 65 20 43 44 53 20 65 6e 74 72 79  entire CDS entry
18b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 64 73 45 6e   */.  int nCdsEn
18c0: 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  try;            
18d0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
18e0: 65 72 20 61 43 64 73 45 6e 74 72 79 5b 5d 20 69  er aCdsEntry[] i
18f0: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
1900: 20 62 44 65 6c 65 74 65 64 3b 20 20 20 20 20 20   bDeleted;      
1910: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1920: 69 66 20 65 6e 74 72 79 20 68 61 73 20 62 65 65  if entry has bee
1930: 6e 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 5a  n deleted */.  Z
1940: 69 70 66 69 6c 65 45 6e 74 72 79 20 2a 70 4e 65  ipfileEntry *pNe
1950: 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  xt;       /* Nex
1960: 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 6e 2d  t element in in-
1970: 6d 65 6d 6f 72 79 20 43 44 53 20 2a 2f 0a 7d 3b  memory CDS */.};
1980: 0a 0a 2f 2a 20 0a 2a 2a 20 43 75 72 73 6f 72 20  ../* .** Cursor 
1990: 74 79 70 65 20 66 6f 72 20 72 65 63 75 72 73 69  type for recursi
19a0: 76 65 6c 79 20 69 74 65 72 61 74 69 6e 67 20 74  vely iterating t
19b0: 68 72 6f 75 67 68 20 61 20 64 69 72 65 63 74 6f  hrough a directo
19c0: 72 79 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ry structure..*/
19d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
19e0: 5a 69 70 66 69 6c 65 43 73 72 20 5a 69 70 66 69  ZipfileCsr Zipfi
19f0: 6c 65 43 73 72 3b 0a 73 74 72 75 63 74 20 5a 69  leCsr;.struct Zi
1a00: 70 66 69 6c 65 43 73 72 20 7b 0a 20 20 73 71 6c  pfileCsr {.  sql
1a10: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
1a20: 20 62 61 73 65 3b 20 20 2f 2a 20 42 61 73 65 20   base;  /* Base 
1a30: 63 6c 61 73 73 20 2d 20 6d 75 73 74 20 62 65 20  class - must be 
1a40: 66 69 72 73 74 20 2a 2f 0a 20 20 69 6e 74 20 62  first */.  int b
1a50: 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Eof;            
1a60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 68        /* True wh
1a70: 65 6e 20 61 74 20 45 4f 46 20 2a 2f 0a 0a 20 20  en at EOF */..  
1a80: 2f 2a 20 55 73 65 64 20 6f 75 74 73 69 64 65 20  /* Used outside 
1a90: 6f 66 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  of write transac
1aa0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 46 49 4c 45 20  tions */.  FILE 
1ab0: 2a 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  *pFile;         
1ac0: 20 20 20 20 20 20 2f 2a 20 5a 69 70 20 66 69 6c        /* Zip fil
1ad0: 65 20 2a 2f 0a 20 20 69 36 34 20 69 4e 65 78 74  e */.  i64 iNext
1ae0: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
1af0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6e    /* Offset of n
1b00: 65 78 74 20 72 65 63 6f 72 64 20 69 6e 20 63 65  ext record in ce
1b10: 6e 74 72 61 6c 20 64 69 72 65 63 74 6f 72 79 20  ntral directory 
1b20: 2a 2f 0a 20 20 5a 69 70 66 69 6c 65 45 4f 43 44  */.  ZipfileEOCD
1b30: 20 65 6f 63 64 3b 20 20 20 20 20 20 20 20 20 20   eocd;          
1b40: 2f 2a 20 50 61 72 73 65 20 6f 66 20 63 65 6e 74  /* Parse of cent
1b50: 72 61 6c 20 64 69 72 65 63 74 6f 72 79 20 72 65  ral directory re
1b60: 63 6f 72 64 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73  cord */..  /* Us
1b70: 65 64 20 69 6e 73 69 64 65 20 77 72 69 74 65 20  ed inside write 
1b80: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 2a 2f 0a  transactions */.
1b90: 20 20 5a 69 70 66 69 6c 65 45 6e 74 72 79 20 2a    ZipfileEntry *
1ba0: 70 43 75 72 72 65 6e 74 3b 0a 0a 20 20 5a 69 70  pCurrent;..  Zip
1bb0: 66 69 6c 65 43 44 53 20 63 64 73 3b 20 20 20 20  fileCDS cds;    
1bc0: 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6e 74 72          /* Centr
1bd0: 61 6c 20 44 69 72 65 63 74 6f 72 79 20 53 74 72  al Directory Str
1be0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 5a 69 70 66  ucture */.  Zipf
1bf0: 69 6c 65 4c 46 48 20 6c 66 68 3b 20 20 20 20 20  ileLFH lfh;     
1c00: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20         /* Local 
1c10: 46 69 6c 65 20 48 65 61 64 65 72 20 66 6f 72 20  File Header for 
1c20: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f  current entry */
1c30: 0a 20 20 69 36 34 20 69 44 61 74 61 4f 66 66 3b  .  i64 iDataOff;
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c50: 20 4f 66 66 73 65 74 20 69 6e 20 7a 69 70 66 69   Offset in zipfi
1c60: 6c 65 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20  le to data */.  
1c70: 75 33 32 20 6d 54 69 6d 65 3b 20 20 20 20 20 20  u32 mTime;      
1c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
1c90: 74 65 6e 64 65 64 20 6d 74 69 6d 65 20 76 61 6c  tended mtime val
1ca0: 75 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ue */.  int flag
1cb0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1cc0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 62 79 74 65     /* Flags byte
1cd0: 20 28 73 65 65 20 62 65 6c 6f 77 20 66 6f 72 20   (see below for 
1ce0: 62 69 74 73 29 20 2a 2f 0a 20 20 5a 69 70 66 69  bits) */.  Zipfi
1cf0: 6c 65 43 73 72 20 2a 70 43 73 72 4e 65 78 74 3b  leCsr *pCsrNext;
1d00: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 63 75        /* Next cu
1d10: 72 73 6f 72 20 6f 6e 20 73 61 6d 65 20 76 69 72  rsor on same vir
1d20: 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b  tual table */.};
1d30: 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 66  ../*.** Values f
1d40: 6f 72 20 5a 69 70 66 69 6c 65 43 73 72 2e 66 6c  or ZipfileCsr.fl
1d50: 61 67 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ags..*/.#define 
1d60: 5a 49 50 46 49 4c 45 5f 4d 54 49 4d 45 5f 56 41  ZIPFILE_MTIME_VA
1d70: 4c 49 44 20 30 78 30 30 30 31 0a 0a 74 79 70 65  LID 0x0001..type
1d80: 64 65 66 20 73 74 72 75 63 74 20 5a 69 70 66 69  def struct Zipfi
1d90: 6c 65 54 61 62 20 5a 69 70 66 69 6c 65 54 61 62  leTab ZipfileTab
1da0: 3b 0a 73 74 72 75 63 74 20 5a 69 70 66 69 6c 65  ;.struct Zipfile
1db0: 54 61 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Tab {.  sqlite3_
1dc0: 76 74 61 62 20 62 61 73 65 3b 20 20 20 20 20 20  vtab base;      
1dd0: 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73     /* Base class
1de0: 20 2d 20 6d 75 73 74 20 62 65 20 66 69 72 73 74   - must be first
1df0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
1e00: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1e10: 20 2f 2a 20 5a 69 70 20 66 69 6c 65 20 74 68 69   /* Zip file thi
1e20: 73 20 74 61 62 6c 65 20 61 63 63 65 73 73 65 73  s table accesses
1e30: 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a   (may be NULL) *
1e40: 2f 0a 20 20 75 38 20 2a 61 42 75 66 66 65 72 3b  /.  u8 *aBuffer;
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e60: 2a 20 54 65 6d 70 6f 72 61 72 79 20 62 75 66 66  * Temporary buff
1e70: 65 72 20 75 73 65 64 20 66 6f 72 20 76 61 72 69  er used for vari
1e80: 6f 75 73 20 74 61 73 6b 73 20 2a 2f 0a 0a 20 20  ous tasks */..  
1e90: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1ea0: 20 61 72 65 20 75 73 65 64 20 62 79 20 77 72 69   are used by wri
1eb0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
1ec0: 6f 6e 6c 79 20 2a 2f 0a 20 20 5a 69 70 66 69 6c  only */.  Zipfil
1ed0: 65 43 73 72 20 2a 70 43 73 72 4c 69 73 74 3b 20  eCsr *pCsrList; 
1ee0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1ef0: 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 5a 69 70  cursors */.  Zip
1f00: 66 69 6c 65 45 6e 74 72 79 20 2a 70 46 69 72 73  fileEntry *pFirs
1f10: 74 45 6e 74 72 79 3b 20 2f 2a 20 4c 69 6e 6b 65  tEntry; /* Linke
1f20: 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 66 69  d list of all fi
1f30: 6c 65 73 20 28 69 66 20 70 57 72 69 74 65 46 64  les (if pWriteFd
1f40: 21 3d 30 29 20 2a 2f 0a 20 20 5a 69 70 66 69 6c  !=0) */.  Zipfil
1f50: 65 45 6e 74 72 79 20 2a 70 4c 61 73 74 45 6e 74  eEntry *pLastEnt
1f60: 72 79 3b 20 20 2f 2a 20 4c 61 73 74 20 65 6c 65  ry;  /* Last ele
1f70: 6d 65 6e 74 20 69 6e 20 70 46 69 72 73 74 45 6e  ment in pFirstEn
1f80: 74 72 79 20 6c 69 73 74 20 2a 2f 0a 20 20 46 49  try list */.  FI
1f90: 4c 45 20 2a 70 57 72 69 74 65 46 64 3b 20 20 20  LE *pWriteFd;   
1fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1fb0: 20 68 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20   handle open on 
1fc0: 7a 69 70 20 61 72 63 68 69 76 65 20 2a 2f 0a 20  zip archive */. 
1fd0: 20 69 36 34 20 73 7a 43 75 72 72 65 6e 74 3b 20   i64 szCurrent; 
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1ff0: 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 7a  urrent size of z
2000: 69 70 20 61 72 63 68 69 76 65 20 2a 2f 0a 20 20  ip archive */.  
2010: 69 36 34 20 73 7a 4f 72 69 67 3b 20 20 20 20 20  i64 szOrig;     
2020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2030: 7a 65 20 6f 66 20 61 72 63 68 69 76 65 20 61 74  ze of archive at
2040: 20 73 74 61 72 74 20 6f 66 20 74 72 61 6e 73 61   start of transa
2050: 63 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 73 74 61  ction */.};..sta
2060: 74 69 63 20 76 6f 69 64 20 7a 69 70 66 69 6c 65  tic void zipfile
2070: 44 65 71 75 6f 74 65 28 63 68 61 72 20 2a 7a 49  Dequote(char *zI
2080: 6e 29 7b 0a 20 20 63 68 61 72 20 71 20 3d 20 7a  n){.  char q = z
2090: 49 6e 5b 30 5d 3b 0a 20 20 69 66 28 20 71 3d 3d  In[0];.  if( q==
20a0: 27 22 27 20 7c 7c 20 71 3d 3d 27 5c 27 27 20 7c  '"' || q=='\'' |
20b0: 7c 20 71 3d 3d 27 60 27 20 7c 7c 20 71 3d 3d 27  | q=='`' || q=='
20c0: 5b 27 20 29 7b 0a 20 20 20 20 63 68 61 72 20 63  [' ){.    char c
20d0: 3b 0a 20 20 20 20 69 6e 74 20 69 49 6e 20 3d 20  ;.    int iIn = 
20e0: 31 3b 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20  1;.    int iOut 
20f0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 71 3d 3d  = 0;.    if( q==
2100: 27 5b 27 20 29 20 71 20 3d 20 27 5d 27 3b 0a 20  '[' ) q = ']';. 
2110: 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a     while( (c = z
2120: 49 6e 5b 69 49 6e 2b 2b 5d 29 20 29 7b 0a 20 20  In[iIn++]) ){.  
2130: 20 20 20 20 69 66 28 20 63 3d 3d 71 20 29 7b 0a      if( c==q ){.
2140: 20 20 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b          if( zIn[
2150: 69 49 6e 2b 2b 5d 21 3d 71 20 29 20 62 72 65 61  iIn++]!=q ) brea
2160: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2170: 20 7a 49 6e 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63   zIn[iOut++] = c
2180: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e 5b  ;.    }.    zIn[
2190: 69 4f 75 74 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  iOut] = '\0';.  
21a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
21b0: 72 75 63 74 20 61 20 6e 65 77 20 5a 69 70 66 69  ruct a new Zipfi
21c0: 6c 65 54 61 62 20 76 69 72 74 75 61 6c 20 74 61  leTab virtual ta
21d0: 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 0a  ble object..** .
21e0: 2a 2a 20 20 20 61 72 67 76 5b 30 5d 20 20 20 2d  **   argv[0]   -
21f0: 3e 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 20 28  > module name  (
2200: 22 7a 69 70 66 69 6c 65 22 29 0a 2a 2a 20 20 20  "zipfile").**   
2210: 61 72 67 76 5b 31 5d 20 20 20 2d 3e 20 64 61 74  argv[1]   -> dat
2220: 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a 20 20 20  abase name.**   
2230: 61 72 67 76 5b 32 5d 20 20 20 2d 3e 20 74 61 62  argv[2]   -> tab
2240: 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67  le name.**   arg
2250: 76 5b 2e 2e 2e 5d 20 2d 3e 20 22 63 6f 6c 75 6d  v[...] -> "colum
2260: 6e 20 6e 61 6d 65 22 20 61 6e 64 20 6f 74 68 65  n name" and othe
2270: 72 20 6d 6f 64 75 6c 65 20 61 72 67 75 6d 65 6e  r module argumen
2280: 74 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 61  t fields..*/.sta
2290: 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c 65 43  tic int zipfileC
22a0: 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c 69 74 65  onnect(.  sqlite
22b0: 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70  3 *db,.  void *p
22c0: 41 75 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  Aux,.  int argc,
22d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e   const char *con
22e0: 73 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74  st*argv,.  sqlit
22f0: 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62  e3_vtab **ppVtab
2300: 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ,.  char **pzErr
2310: 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  .){.  int nByte 
2320: 3d 20 73 69 7a 65 6f 66 28 5a 69 70 66 69 6c 65  = sizeof(Zipfile
2330: 54 61 62 29 20 2b 20 5a 49 50 46 49 4c 45 5f 42  Tab) + ZIPFILE_B
2340: 55 46 46 45 52 5f 53 49 5a 45 3b 0a 20 20 69 6e  UFFER_SIZE;.  in
2350: 74 20 6e 46 69 6c 65 20 3d 20 30 3b 0a 20 20 63  t nFile = 0;.  c
2360: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2370: 20 3d 20 30 3b 0a 20 20 5a 69 70 66 69 6c 65 54   = 0;.  ZipfileT
2380: 61 62 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  ab *pNew = 0;.  
2390: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 61  int rc;..  if( a
23a0: 72 67 63 3e 33 20 29 7b 0a 20 20 20 20 7a 46 69  rgc>3 ){.    zFi
23b0: 6c 65 20 3d 20 61 72 67 76 5b 33 5d 3b 0a 20 20  le = argv[3];.  
23c0: 20 20 6e 46 69 6c 65 20 3d 20 28 69 6e 74 29 73    nFile = (int)s
23d0: 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 3b 0a  trlen(zFile)+1;.
23e0: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
23f0: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
2400: 28 64 62 2c 20 5a 49 50 46 49 4c 45 5f 53 43 48  (db, ZIPFILE_SCH
2410: 45 4d 41 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  EMA);.  if( rc==
2420: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2430: 20 70 4e 65 77 20 3d 20 28 5a 69 70 66 69 6c 65   pNew = (Zipfile
2440: 54 61 62 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  Tab*)sqlite3_mal
2450: 6c 6f 63 28 6e 42 79 74 65 2b 6e 46 69 6c 65 29  loc(nByte+nFile)
2460: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
2470: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2480: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d  E_NOMEM;.    mem
2490: 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 6e 42 79  set(pNew, 0, nBy
24a0: 74 65 2b 6e 46 69 6c 65 29 3b 0a 20 20 20 20 70  te+nFile);.    p
24b0: 4e 65 77 2d 3e 61 42 75 66 66 65 72 20 3d 20 28  New->aBuffer = (
24c0: 75 38 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  u8*)&pNew[1];.  
24d0: 20 20 69 66 28 20 7a 46 69 6c 65 20 29 7b 0a 20    if( zFile ){. 
24e0: 20 20 20 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65       pNew->zFile
24f0: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 2d   = (char*)&pNew-
2500: 3e 61 42 75 66 66 65 72 5b 5a 49 50 46 49 4c 45  >aBuffer[ZIPFILE
2510: 5f 42 55 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 20  _BUFFER_SIZE];. 
2520: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77       memcpy(pNew
2530: 2d 3e 7a 46 69 6c 65 2c 20 7a 46 69 6c 65 2c 20  ->zFile, zFile, 
2540: 6e 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7a 69  nFile);.      zi
2550: 70 66 69 6c 65 44 65 71 75 6f 74 65 28 70 4e 65  pfileDequote(pNe
2560: 77 2d 3e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d  w->zFile);.    }
2570: 0a 20 20 7d 0a 20 20 2a 70 70 56 74 61 62 20 3d  .  }.  *ppVtab =
2580: 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 29   (sqlite3_vtab*)
2590: 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 72  pNew;.  return r
25a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
25b0: 20 6d 65 74 68 6f 64 20 69 73 20 74 68 65 20 64   method is the d
25c0: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 7a 69  estructor for zi
25d0: 70 66 69 6c 65 20 76 74 61 62 20 6f 62 6a 65 63  pfile vtab objec
25e0: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ts..*/.static in
25f0: 74 20 7a 69 70 66 69 6c 65 44 69 73 63 6f 6e 6e  t zipfileDisconn
2600: 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ect(sqlite3_vtab
2610: 20 2a 70 56 74 61 62 29 7b 0a 20 20 73 71 6c 69   *pVtab){.  sqli
2620: 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 29 3b  te3_free(pVtab);
2630: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2640: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
2650: 6e 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61 20  nstructor for a 
2660: 6e 65 77 20 5a 69 70 66 69 6c 65 43 73 72 20 6f  new ZipfileCsr o
2670: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
2680: 20 69 6e 74 20 7a 69 70 66 69 6c 65 4f 70 65 6e   int zipfileOpen
2690: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70  (sqlite3_vtab *p
26a0: 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  , sqlite3_vtab_c
26b0: 75 72 73 6f 72 20 2a 2a 70 70 43 73 72 29 7b 0a  ursor **ppCsr){.
26c0: 20 20 5a 69 70 66 69 6c 65 43 73 72 20 2a 70 43    ZipfileCsr *pC
26d0: 73 72 3b 0a 20 20 70 43 73 72 20 3d 20 73 71 6c  sr;.  pCsr = sql
26e0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
26f0: 6f 66 28 2a 70 43 73 72 29 29 3b 0a 20 20 2a 70  of(*pCsr));.  *p
2700: 70 43 73 72 20 3d 20 28 73 71 6c 69 74 65 33 5f  pCsr = (sqlite3_
2710: 76 74 61 62 5f 63 75 72 73 6f 72 2a 29 70 43 73  vtab_cursor*)pCs
2720: 72 3b 0a 20 20 69 66 28 20 70 43 73 72 3d 3d 30  r;.  if( pCsr==0
2730: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2740: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
2750: 0a 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2c 20  .  memset(pCsr, 
2760: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 73 72 29  0, sizeof(*pCsr)
2770: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2780: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2790: 52 65 73 65 74 20 61 20 63 75 72 73 6f 72 20 62  Reset a cursor b
27a0: 61 63 6b 20 74 6f 20 74 68 65 20 73 74 61 74 65  ack to the state
27b0: 20 69 74 20 77 61 73 20 69 6e 20 77 68 65 6e 20   it was in when 
27c0: 66 69 72 73 74 20 72 65 74 75 72 6e 65 64 0a 2a  first returned.*
27d0: 2a 20 62 79 20 7a 69 70 66 69 6c 65 4f 70 65 6e  * by zipfileOpen
27e0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
27f0: 69 64 20 7a 69 70 66 69 6c 65 52 65 73 65 74 43  id zipfileResetC
2800: 75 72 73 6f 72 28 5a 69 70 66 69 6c 65 43 73 72  ursor(ZipfileCsr
2810: 20 2a 70 43 73 72 29 7b 0a 20 20 5a 69 70 66 69   *pCsr){.  Zipfi
2820: 6c 65 54 61 62 20 2a 70 54 61 62 20 3d 20 28 5a  leTab *pTab = (Z
2830: 69 70 66 69 6c 65 54 61 62 2a 29 28 70 43 73 72  ipfileTab*)(pCsr
2840: 2d 3e 62 61 73 65 2e 70 56 74 61 62 29 3b 0a 20  ->base.pVtab);. 
2850: 20 5a 69 70 66 69 6c 65 43 73 72 20 2a 2a 70 70   ZipfileCsr **pp
2860: 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  ;..  /* Remove t
2870: 68 69 73 20 63 75 72 73 6f 72 20 66 72 6f 6d 20  his cursor from 
2880: 74 68 65 20 5a 69 70 66 69 6c 65 54 61 62 2e 70  the ZipfileTab.p
2890: 43 73 72 4c 69 73 74 20 6c 69 73 74 2e 20 2a 2f  CsrList list. */
28a0: 0a 20 20 66 6f 72 28 70 70 3d 26 70 54 61 62 2d  .  for(pp=&pTab-
28b0: 3e 70 43 73 72 4c 69 73 74 3b 20 2a 70 70 3b 20  >pCsrList; *pp; 
28c0: 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 43 73 72  pp=&((*pp)->pCsr
28d0: 4e 65 78 74 29 29 7b 0a 20 20 20 20 69 66 28 20  Next)){.    if( 
28e0: 2a 70 70 3d 3d 70 43 73 72 20 29 20 2a 70 70 20  *pp==pCsr ) *pp 
28f0: 3d 20 70 43 73 72 2d 3e 70 43 73 72 4e 65 78 74  = pCsr->pCsrNext
2900: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
2910: 5f 66 72 65 65 28 70 43 73 72 2d 3e 63 64 73 2e  _free(pCsr->cds.
2920: 7a 46 69 6c 65 29 3b 0a 20 20 70 43 73 72 2d 3e  zFile);.  pCsr->
2930: 63 64 73 2e 7a 46 69 6c 65 20 3d 20 30 3b 0a 20  cds.zFile = 0;. 
2940: 20 70 43 73 72 2d 3e 62 45 6f 66 20 3d 20 30 3b   pCsr->bEof = 0;
2950: 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 70 46 69  .  if( pCsr->pFi
2960: 6c 65 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65  le ){.    fclose
2970: 28 70 43 73 72 2d 3e 70 46 69 6c 65 29 3b 0a 20  (pCsr->pFile);. 
2980: 20 20 20 70 43 73 72 2d 3e 70 46 69 6c 65 20 3d     pCsr->pFile =
2990: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
29a0: 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   Destructor for 
29b0: 61 6e 20 5a 69 70 66 69 6c 65 43 73 72 2e 0a 2a  an ZipfileCsr..*
29c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 69 70  /.static int zip
29d0: 66 69 6c 65 43 6c 6f 73 65 28 73 71 6c 69 74 65  fileClose(sqlite
29e0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
29f0: 75 72 29 7b 0a 20 20 5a 69 70 66 69 6c 65 43 73  ur){.  ZipfileCs
2a00: 72 20 2a 70 43 73 72 20 3d 20 28 5a 69 70 66 69  r *pCsr = (Zipfi
2a10: 6c 65 43 73 72 2a 29 63 75 72 3b 0a 20 20 7a 69  leCsr*)cur;.  zi
2a20: 70 66 69 6c 65 52 65 73 65 74 43 75 72 73 6f 72  pfileResetCursor
2a30: 28 70 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65  (pCsr);.  sqlite
2a40: 33 5f 66 72 65 65 28 70 43 73 72 29 3b 0a 20 20  3_free(pCsr);.  
2a50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
2a70: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
2a80: 20 66 6f 72 20 74 68 65 20 76 69 72 74 75 61 6c   for the virtual
2a90: 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   table associate
2aa0: 64 20 77 69 74 68 20 63 75 72 73 6f 72 0a 2a 2a  d with cursor.**
2ab0: 20 70 43 73 72 20 74 6f 20 74 68 65 20 72 65 73   pCsr to the res
2ac0: 75 6c 74 73 20 6f 66 20 76 70 72 69 6e 74 66 28  ults of vprintf(
2ad0: 7a 46 6d 74 2c 20 2e 2e 2e 29 2e 0a 2a 2f 0a 73  zFmt, ...)..*/.s
2ae0: 74 61 74 69 63 20 76 6f 69 64 20 7a 69 70 66 69  tatic void zipfi
2af0: 6c 65 53 65 74 45 72 72 6d 73 67 28 5a 69 70 66  leSetErrmsg(Zipf
2b00: 69 6c 65 43 73 72 20 2a 70 43 73 72 2c 20 63 6f  ileCsr *pCsr, co
2b10: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
2b20: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
2b30: 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
2b40: 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 70 43 73 72  p, zFmt);.  pCsr
2b50: 2d 3e 62 61 73 65 2e 70 56 74 61 62 2d 3e 7a 45  ->base.pVtab->zE
2b60: 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
2b70: 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61  vmprintf(zFmt, a
2b80: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
2b90: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
2ba0: 7a 69 70 66 69 6c 65 52 65 61 64 44 61 74 61 28  zipfileReadData(
2bb0: 0a 20 20 46 49 4c 45 20 2a 70 46 69 6c 65 2c 20  .  FILE *pFile, 
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd0: 20 20 20 2f 2a 20 52 65 61 64 20 66 72 6f 6d 20     /* Read from 
2be0: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75  this file */.  u
2bf0: 38 20 2a 61 52 65 61 64 2c 20 20 20 20 20 20 20  8 *aRead,       
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c10: 2a 20 52 65 61 64 20 69 6e 74 6f 20 74 68 69 73  * Read into this
2c20: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
2c30: 20 6e 52 65 61 64 2c 20 20 20 20 20 20 20 20 20   nRead,         
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c50: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2c60: 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 36 34  to read */.  i64
2c70: 20 69 4f 66 66 2c 20 20 20 20 20 20 20 20 20 20   iOff,          
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c90: 4f 66 66 73 65 74 20 74 6f 20 72 65 61 64 20 66  Offset to read f
2ca0: 72 6f 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  rom */.  char **
2cb0: 70 7a 45 72 72 6d 73 67 20 20 20 20 20 20 20 20  pzErrmsg        
2cc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2cd0: 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28   Error message (
2ce0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
2cf0: 6c 6f 63 29 20 2a 2f 0a 29 7b 0a 20 20 73 69 7a  loc) */.){.  siz
2d00: 65 5f 74 20 6e 3b 0a 20 20 66 73 65 65 6b 28 70  e_t n;.  fseek(p
2d10: 46 69 6c 65 2c 20 28 6c 6f 6e 67 29 69 4f 66 66  File, (long)iOff
2d20: 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 6e  , SEEK_SET);.  n
2d30: 20 3d 20 66 72 65 61 64 28 61 52 65 61 64 2c 20   = fread(aRead, 
2d40: 31 2c 20 6e 52 65 61 64 2c 20 70 46 69 6c 65 29  1, nRead, pFile)
2d50: 3b 0a 20 20 69 66 28 20 28 69 6e 74 29 6e 21 3d  ;.  if( (int)n!=
2d60: 6e 52 65 61 64 20 29 7b 0a 20 20 20 20 2a 70 7a  nRead ){.    *pz
2d70: 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
2d80: 5f 6d 70 72 69 6e 74 66 28 22 65 72 72 6f 72 20  _mprintf("error 
2d90: 69 6e 20 66 72 65 61 64 28 29 22 29 3b 0a 20 20  in fread()");.  
2da0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2db0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
2dc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2dd0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 69 70  ..static int zip
2de0: 66 69 6c 65 41 70 70 65 6e 64 44 61 74 61 28 0a  fileAppendData(.
2df0: 20 20 5a 69 70 66 69 6c 65 54 61 62 20 2a 70 54    ZipfileTab *pT
2e00: 61 62 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ab,.  const u8 *
2e10: 61 57 72 69 74 65 2c 0a 20 20 69 6e 74 20 6e 57  aWrite,.  int nW
2e20: 72 69 74 65 0a 29 7b 0a 20 20 73 69 7a 65 5f 74  rite.){.  size_t
2e30: 20 6e 3b 0a 20 20 66 73 65 65 6b 28 70 54 61 62   n;.  fseek(pTab
2e40: 2d 3e 70 57 72 69 74 65 46 64 2c 20 28 6c 6f 6e  ->pWriteFd, (lon
2e50: 67 29 70 54 61 62 2d 3e 73 7a 43 75 72 72 65 6e  g)pTab->szCurren
2e60: 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
2e70: 6e 20 3d 20 66 77 72 69 74 65 28 61 57 72 69 74  n = fwrite(aWrit
2e80: 65 2c 20 31 2c 20 6e 57 72 69 74 65 2c 20 70 54  e, 1, nWrite, pT
2e90: 61 62 2d 3e 70 57 72 69 74 65 46 64 29 3b 0a 20  ab->pWriteFd);. 
2ea0: 20 69 66 28 20 28 69 6e 74 29 6e 21 3d 6e 57 72   if( (int)n!=nWr
2eb0: 69 74 65 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  ite ){.    pTab-
2ec0: 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20  >base.zErrMsg = 
2ed0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2ee0: 22 65 72 72 6f 72 20 69 6e 20 66 77 72 69 74 65  "error in fwrite
2ef0: 28 29 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ()");.    return
2f00: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2f10: 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 43 75 72   }.  pTab->szCur
2f20: 72 65 6e 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a  rent += nWrite;.
2f30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f40: 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 31  OK;.}..static u1
2f50: 36 20 7a 69 70 66 69 6c 65 47 65 74 55 31 36 28  6 zipfileGetU16(
2f60: 63 6f 6e 73 74 20 75 38 20 2a 61 42 75 66 29 7b  const u8 *aBuf){
2f70: 0a 20 20 72 65 74 75 72 6e 20 28 61 42 75 66 5b  .  return (aBuf[
2f80: 31 5d 20 3c 3c 20 38 29 20 2b 20 61 42 75 66 5b  1] << 8) + aBuf[
2f90: 30 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32  0];.}.static u32
2fa0: 20 7a 69 70 66 69 6c 65 47 65 74 55 33 32 28 63   zipfileGetU32(c
2fb0: 6f 6e 73 74 20 75 38 20 2a 61 42 75 66 29 7b 0a  onst u8 *aBuf){.
2fc0: 20 20 72 65 74 75 72 6e 20 28 28 75 33 32 29 28    return ((u32)(
2fd0: 61 42 75 66 5b 33 5d 29 20 3c 3c 20 32 34 29 0a  aBuf[3]) << 24).
2fe0: 20 20 20 20 20 20 20 2b 20 28 28 75 33 32 29 28         + ((u32)(
2ff0: 61 42 75 66 5b 32 5d 29 20 3c 3c 20 31 36 29 0a  aBuf[2]) << 16).
3000: 20 20 20 20 20 20 20 2b 20 28 28 75 33 32 29 28         + ((u32)(
3010: 61 42 75 66 5b 31 5d 29 20 3c 3c 20 20 38 29 0a  aBuf[1]) <<  8).
3020: 20 20 20 20 20 20 20 2b 20 28 28 75 33 32 29 28         + ((u32)(
3030: 61 42 75 66 5b 30 5d 29 20 3c 3c 20 20 30 29 3b  aBuf[0]) <<  0);
3040: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
3050: 7a 69 70 66 69 6c 65 50 75 74 55 31 36 28 75 38  zipfilePutU16(u8
3060: 20 2a 61 42 75 66 2c 20 75 31 36 20 76 61 6c 29   *aBuf, u16 val)
3070: 7b 0a 20 20 61 42 75 66 5b 30 5d 20 3d 20 76 61  {.  aBuf[0] = va
3080: 6c 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75 66  l & 0xFF;.  aBuf
3090: 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26  [1] = (val>>8) &
30a0: 20 30 78 46 46 3b 0a 7d 0a 73 74 61 74 69 63 20   0xFF;.}.static 
30b0: 76 6f 69 64 20 7a 69 70 66 69 6c 65 50 75 74 55  void zipfilePutU
30c0: 33 32 28 75 38 20 2a 61 42 75 66 2c 20 75 33 32  32(u8 *aBuf, u32
30d0: 20 76 61 6c 29 7b 0a 20 20 61 42 75 66 5b 30 5d   val){.  aBuf[0]
30e0: 20 3d 20 76 61 6c 20 26 20 30 78 46 46 3b 0a 20   = val & 0xFF;. 
30f0: 20 61 42 75 66 5b 31 5d 20 3d 20 28 76 61 6c 3e   aBuf[1] = (val>
3100: 3e 38 29 20 26 20 30 78 46 46 3b 0a 20 20 61 42  >8) & 0xFF;.  aB
3110: 75 66 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 31 36  uf[2] = (val>>16
3120: 29 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75 66  ) & 0xFF;.  aBuf
3130: 5b 33 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20  [3] = (val>>24) 
3140: 26 20 30 78 46 46 3b 0a 7d 0a 0a 23 64 65 66 69  & 0xFF;.}..#defi
3150: 6e 65 20 7a 69 70 66 69 6c 65 52 65 61 64 33 32  ne zipfileRead32
3160: 28 61 42 75 66 29 20 28 20 61 42 75 66 2b 3d 34  (aBuf) ( aBuf+=4
3170: 2c 20 7a 69 70 66 69 6c 65 47 65 74 55 33 32 28  , zipfileGetU32(
3180: 61 42 75 66 2d 34 29 20 29 0a 23 64 65 66 69 6e  aBuf-4) ).#defin
3190: 65 20 7a 69 70 66 69 6c 65 52 65 61 64 31 36 28  e zipfileRead16(
31a0: 61 42 75 66 29 20 28 20 61 42 75 66 2b 3d 32 2c  aBuf) ( aBuf+=2,
31b0: 20 7a 69 70 66 69 6c 65 47 65 74 55 31 36 28 61   zipfileGetU16(a
31c0: 42 75 66 2d 32 29 20 29 0a 0a 23 64 65 66 69 6e  Buf-2) )..#defin
31d0: 65 20 7a 69 70 66 69 6c 65 57 72 69 74 65 33 32  e zipfileWrite32
31e0: 28 61 42 75 66 2c 76 61 6c 29 20 7b 20 7a 69 70  (aBuf,val) { zip
31f0: 66 69 6c 65 50 75 74 55 33 32 28 61 42 75 66 2c  filePutU32(aBuf,
3200: 76 61 6c 29 3b 20 61 42 75 66 2b 3d 34 3b 20 7d  val); aBuf+=4; }
3210: 0a 23 64 65 66 69 6e 65 20 7a 69 70 66 69 6c 65  .#define zipfile
3220: 57 72 69 74 65 31 36 28 61 42 75 66 2c 76 61 6c  Write16(aBuf,val
3230: 29 20 7b 20 7a 69 70 66 69 6c 65 50 75 74 55 31  ) { zipfilePutU1
3240: 36 28 61 42 75 66 2c 76 61 6c 29 3b 20 61 42 75  6(aBuf,val); aBu
3250: 66 2b 3d 32 3b 20 7d 0a 0a 73 74 61 74 69 63 20  f+=2; }..static 
3260: 75 38 2a 20 7a 69 70 66 69 6c 65 43 73 72 42 75  u8* zipfileCsrBu
3270: 66 66 65 72 28 5a 69 70 66 69 6c 65 43 73 72 20  ffer(ZipfileCsr 
3280: 2a 70 43 73 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCsr){.  return
3290: 20 28 28 5a 69 70 66 69 6c 65 54 61 62 2a 29 28   ((ZipfileTab*)(
32a0: 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  pCsr->base.pVtab
32b0: 29 29 2d 3e 61 42 75 66 66 65 72 3b 0a 7d 0a 0a  ))->aBuffer;.}..
32c0: 2f 2a 0a 2a 2a 20 4d 61 67 69 63 20 6e 75 6d 62  /*.** Magic numb
32d0: 65 72 73 20 75 73 65 64 20 74 6f 20 72 65 61 64  ers used to read
32e0: 20 43 44 53 20 72 65 63 6f 72 64 73 2e 0a 2a 2f   CDS records..*/
32f0: 0a 23 64 65 66 69 6e 65 20 5a 49 50 46 49 4c 45  .#define ZIPFILE
3300: 5f 43 44 53 5f 46 49 58 45 44 5f 53 5a 20 20 34  _CDS_FIXED_SZ  4
3310: 36 0a 23 64 65 66 69 6e 65 20 5a 49 50 46 49 4c  6.#define ZIPFIL
3320: 45 5f 43 44 53 5f 4e 46 49 4c 45 5f 4f 46 46 20  E_CDS_NFILE_OFF 
3330: 32 38 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  28..static int z
3340: 69 70 66 69 6c 65 52 65 61 64 43 44 53 28 5a 69  ipfileReadCDS(Zi
3350: 70 66 69 6c 65 43 73 72 20 2a 70 43 73 72 29 7b  pfileCsr *pCsr){
3360: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20  .  char **pzErr 
3370: 3d 20 26 70 43 73 72 2d 3e 62 61 73 65 2e 70 56  = &pCsr->base.pV
3380: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20  tab->zErrMsg;.  
3390: 75 38 20 2a 61 52 65 61 64 3b 0a 20 20 69 6e 74  u8 *aRead;.  int
33a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33b0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
33c0: 28 70 43 73 72 2d 3e 63 64 73 2e 7a 46 69 6c 65  (pCsr->cds.zFile
33d0: 29 3b 0a 20 20 70 43 73 72 2d 3e 63 64 73 2e 7a  );.  pCsr->cds.z
33e0: 46 69 6c 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28  File = 0;..  if(
33f0: 20 70 43 73 72 2d 3e 70 43 75 72 72 65 6e 74 3d   pCsr->pCurrent=
3400: 3d 30 20 29 7b 0a 20 20 20 20 61 52 65 61 64 20  =0 ){.    aRead 
3410: 3d 20 7a 69 70 66 69 6c 65 43 73 72 42 75 66 66  = zipfileCsrBuff
3420: 65 72 28 70 43 73 72 29 3b 0a 20 20 20 20 72 63  er(pCsr);.    rc
3430: 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 44 61   = zipfileReadDa
3440: 74 61 28 0a 20 20 20 20 20 20 20 20 70 43 73 72  ta(.        pCsr
3450: 2d 3e 70 46 69 6c 65 2c 20 61 52 65 61 64 2c 20  ->pFile, aRead, 
3460: 5a 49 50 46 49 4c 45 5f 43 44 53 5f 46 49 58 45  ZIPFILE_CDS_FIXE
3470: 44 5f 53 5a 2c 20 70 43 73 72 2d 3e 69 4e 65 78  D_SZ, pCsr->iNex
3480: 74 4f 66 66 2c 20 70 7a 45 72 72 0a 20 20 20 20  tOff, pzErr.    
3490: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
34a0: 61 52 65 61 64 20 3d 20 70 43 73 72 2d 3e 70 43  aRead = pCsr->pC
34b0: 75 72 72 65 6e 74 2d 3e 61 43 64 73 45 6e 74 72  urrent->aCdsEntr
34c0: 79 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  y;.  }..  if( rc
34d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
34e0: 20 20 20 75 33 32 20 73 69 67 20 3d 20 7a 69 70     u32 sig = zip
34f0: 66 69 6c 65 52 65 61 64 33 32 28 61 52 65 61 64  fileRead32(aRead
3500: 29 3b 0a 20 20 20 20 69 66 28 20 73 69 67 21 3d  );.    if( sig!=
3510: 5a 49 50 46 49 4c 45 5f 53 49 47 4e 41 54 55 52  ZIPFILE_SIGNATUR
3520: 45 5f 43 44 53 20 29 7b 0a 20 20 20 20 20 20 61  E_CDS ){.      a
3530: 73 73 65 72 74 28 20 70 43 73 72 2d 3e 70 43 75  ssert( pCsr->pCu
3540: 72 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20  rrent==0 );.    
3550: 20 20 7a 69 70 66 69 6c 65 53 65 74 45 72 72 6d    zipfileSetErrm
3560: 73 67 28 70 43 73 72 2c 22 66 61 69 6c 65 64 20  sg(pCsr,"failed 
3570: 74 6f 20 72 65 61 64 20 43 44 53 20 61 74 20 6f  to read CDS at o
3580: 66 66 73 65 74 20 25 6c 6c 64 22 2c 70 43 73 72  ffset %lld",pCsr
3590: 2d 3e 69 4e 65 78 74 4f 66 66 29 3b 0a 20 20 20  ->iNextOff);.   
35a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
35b0: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RROR;.    }else{
35c0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 52 65 61 64  .      int nRead
35d0: 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 63 64  ;.      pCsr->cd
35e0: 73 2e 69 56 65 72 73 69 6f 6e 4d 61 64 65 42 79  s.iVersionMadeBy
35f0: 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 31 36   = zipfileRead16
3600: 28 61 52 65 61 64 29 3b 0a 20 20 20 20 20 20 70  (aRead);.      p
3610: 43 73 72 2d 3e 63 64 73 2e 69 56 65 72 73 69 6f  Csr->cds.iVersio
3620: 6e 45 78 74 72 61 63 74 20 3d 20 7a 69 70 66 69  nExtract = zipfi
3630: 6c 65 52 65 61 64 31 36 28 61 52 65 61 64 29 3b  leRead16(aRead);
3640: 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 63 64 73  .      pCsr->cds
3650: 2e 66 6c 61 67 73 20 3d 20 7a 69 70 66 69 6c 65  .flags = zipfile
3660: 52 65 61 64 31 36 28 61 52 65 61 64 29 3b 0a 20  Read16(aRead);. 
3670: 20 20 20 20 20 70 43 73 72 2d 3e 63 64 73 2e 69       pCsr->cds.i
3680: 43 6f 6d 70 72 65 73 73 69 6f 6e 20 3d 20 7a 69  Compression = zi
3690: 70 66 69 6c 65 52 65 61 64 31 36 28 61 52 65 61  pfileRead16(aRea
36a0: 64 29 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e  d);.      pCsr->
36b0: 63 64 73 2e 6d 54 69 6d 65 20 3d 20 7a 69 70 66  cds.mTime = zipf
36c0: 69 6c 65 52 65 61 64 31 36 28 61 52 65 61 64 29  ileRead16(aRead)
36d0: 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 63 64  ;.      pCsr->cd
36e0: 73 2e 6d 44 61 74 65 20 3d 20 7a 69 70 66 69 6c  s.mDate = zipfil
36f0: 65 52 65 61 64 31 36 28 61 52 65 61 64 29 3b 0a  eRead16(aRead);.
3700: 20 20 20 20 20 20 70 43 73 72 2d 3e 63 64 73 2e        pCsr->cds.
3710: 63 72 63 33 32 20 3d 20 7a 69 70 66 69 6c 65 52  crc32 = zipfileR
3720: 65 61 64 33 32 28 61 52 65 61 64 29 3b 0a 20 20  ead32(aRead);.  
3730: 20 20 20 20 70 43 73 72 2d 3e 63 64 73 2e 73 7a      pCsr->cds.sz
3740: 43 6f 6d 70 72 65 73 73 65 64 20 3d 20 7a 69 70  Compressed = zip
3750: 66 69 6c 65 52 65 61 64 33 32 28 61 52 65 61 64  fileRead32(aRead
3760: 29 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 63  );.      pCsr->c
3770: 64 73 2e 73 7a 55 6e 63 6f 6d 70 72 65 73 73 65  ds.szUncompresse
3780: 64 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 33  d = zipfileRead3
3790: 32 28 61 52 65 61 64 29 3b 0a 20 20 20 20 20 20  2(aRead);.      
37a0: 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 70 43  assert( pCsr->pC
37b0: 75 72 72 65 6e 74 20 0a 20 20 20 20 20 20 20 20  urrent .        
37c0: 20 20 20 7c 7c 20 61 52 65 61 64 3d 3d 7a 69 70     || aRead==zip
37d0: 66 69 6c 65 43 73 72 42 75 66 66 65 72 28 70 43  fileCsrBuffer(pC
37e0: 73 72 29 2b 5a 49 50 46 49 4c 45 5f 43 44 53 5f  sr)+ZIPFILE_CDS_
37f0: 4e 46 49 4c 45 5f 4f 46 46 20 0a 20 20 20 20 20  NFILE_OFF .     
3800: 20 29 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e   );.      pCsr->
3810: 63 64 73 2e 6e 46 69 6c 65 20 3d 20 7a 69 70 66  cds.nFile = zipf
3820: 69 6c 65 52 65 61 64 31 36 28 61 52 65 61 64 29  ileRead16(aRead)
3830: 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 63 64  ;.      pCsr->cd
3840: 73 2e 6e 45 78 74 72 61 20 3d 20 7a 69 70 66 69  s.nExtra = zipfi
3850: 6c 65 52 65 61 64 31 36 28 61 52 65 61 64 29 3b  leRead16(aRead);
3860: 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 63 64 73  .      pCsr->cds
3870: 2e 6e 43 6f 6d 6d 65 6e 74 20 3d 20 7a 69 70 66  .nComment = zipf
3880: 69 6c 65 52 65 61 64 31 36 28 61 52 65 61 64 29  ileRead16(aRead)
3890: 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 63 64  ;.      pCsr->cd
38a0: 73 2e 69 44 69 73 6b 53 74 61 72 74 20 3d 20 7a  s.iDiskStart = z
38b0: 69 70 66 69 6c 65 52 65 61 64 31 36 28 61 52 65  ipfileRead16(aRe
38c0: 61 64 29 3b 0a 20 20 20 20 20 20 70 43 73 72 2d  ad);.      pCsr-
38d0: 3e 63 64 73 2e 69 49 6e 74 65 72 6e 61 6c 41 74  >cds.iInternalAt
38e0: 74 72 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64  tr = zipfileRead
38f0: 31 36 28 61 52 65 61 64 29 3b 0a 20 20 20 20 20  16(aRead);.     
3900: 20 70 43 73 72 2d 3e 63 64 73 2e 69 45 78 74 65   pCsr->cds.iExte
3910: 72 6e 61 6c 41 74 74 72 20 3d 20 7a 69 70 66 69  rnalAttr = zipfi
3920: 6c 65 52 65 61 64 33 32 28 61 52 65 61 64 29 3b  leRead32(aRead);
3930: 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 63 64 73  .      pCsr->cds
3940: 2e 69 4f 66 66 73 65 74 20 3d 20 7a 69 70 66 69  .iOffset = zipfi
3950: 6c 65 52 65 61 64 33 32 28 61 52 65 61 64 29 3b  leRead32(aRead);
3960: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3970: 43 73 72 2d 3e 70 43 75 72 72 65 6e 74 20 0a 20  Csr->pCurrent . 
3980: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 61 52 65            || aRe
3990: 61 64 3d 3d 7a 69 70 66 69 6c 65 43 73 72 42 75  ad==zipfileCsrBu
39a0: 66 66 65 72 28 70 43 73 72 29 2b 5a 49 50 46 49  ffer(pCsr)+ZIPFI
39b0: 4c 45 5f 43 44 53 5f 46 49 58 45 44 5f 53 5a 0a  LE_CDS_FIXED_SZ.
39c0: 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20        );..      
39d0: 69 66 28 20 70 43 73 72 2d 3e 70 43 75 72 72 65  if( pCsr->pCurre
39e0: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  nt==0 ){.       
39f0: 20 6e 52 65 61 64 20 3d 20 70 43 73 72 2d 3e 63   nRead = pCsr->c
3a00: 64 73 2e 6e 46 69 6c 65 20 2b 20 70 43 73 72 2d  ds.nFile + pCsr-
3a10: 3e 63 64 73 2e 6e 45 78 74 72 61 3b 0a 20 20 20  >cds.nExtra;.   
3a20: 20 20 20 20 20 61 52 65 61 64 20 3d 20 7a 69 70       aRead = zip
3a30: 66 69 6c 65 43 73 72 42 75 66 66 65 72 28 70 43  fileCsrBuffer(pC
3a40: 73 72 29 3b 0a 20 20 20 20 20 20 20 20 70 43 73  sr);.        pCs
3a50: 72 2d 3e 69 4e 65 78 74 4f 66 66 20 2b 3d 20 5a  r->iNextOff += Z
3a60: 49 50 46 49 4c 45 5f 43 44 53 5f 46 49 58 45 44  IPFILE_CDS_FIXED
3a70: 5f 53 5a 3b 0a 20 20 20 20 20 20 20 20 72 63 20  _SZ;.        rc 
3a80: 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 44 61 74  = zipfileReadDat
3a90: 61 28 70 43 73 72 2d 3e 70 46 69 6c 65 2c 20 61  a(pCsr->pFile, a
3aa0: 52 65 61 64 2c 20 6e 52 65 61 64 2c 20 70 43 73  Read, nRead, pCs
3ab0: 72 2d 3e 69 4e 65 78 74 4f 66 66 2c 20 70 7a 45  r->iNextOff, pzE
3ac0: 72 72 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rr);.      }..  
3ad0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
3ae0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
3af0: 20 70 43 73 72 2d 3e 63 64 73 2e 7a 46 69 6c 65   pCsr->cds.zFile
3b00: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
3b10: 74 66 28 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29  tf("%.*s", (int)
3b20: 70 43 73 72 2d 3e 63 64 73 2e 6e 46 69 6c 65 2c  pCsr->cds.nFile,
3b30: 20 61 52 65 61 64 29 3b 0a 20 20 20 20 20 20 20   aRead);.       
3b40: 20 70 43 73 72 2d 3e 69 4e 65 78 74 4f 66 66 20   pCsr->iNextOff 
3b50: 2b 3d 20 70 43 73 72 2d 3e 63 64 73 2e 6e 46 69  += pCsr->cds.nFi
3b60: 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72  le;.        pCsr
3b70: 2d 3e 69 4e 65 78 74 4f 66 66 20 2b 3d 20 70 43  ->iNextOff += pC
3b80: 73 72 2d 3e 63 64 73 2e 6e 45 78 74 72 61 3b 0a  sr->cds.nExtra;.
3b90: 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 69 4e          pCsr->iN
3ba0: 65 78 74 4f 66 66 20 2b 3d 20 70 43 73 72 2d 3e  extOff += pCsr->
3bb0: 63 64 73 2e 6e 43 6f 6d 6d 65 6e 74 3b 0a 20 20  cds.nComment;.  
3bc0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
3bd0: 53 63 61 6e 20 74 68 65 20 63 64 73 2e 6e 45 78  Scan the cds.nEx
3be0: 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78  tra bytes of "ex
3bf0: 74 72 61 22 20 66 69 65 6c 64 73 20 66 6f 72 20  tra" fields for 
3c00: 61 6e 79 20 74 68 61 74 20 63 61 6e 0a 20 20 20  any that can.   
3c10: 20 20 20 2a 2a 20 62 65 20 69 6e 74 65 72 70 72     ** be interpr
3c20: 65 74 65 64 2e 20 54 68 65 20 67 65 6e 65 72 61  eted. The genera
3c30: 6c 20 66 6f 72 6d 61 74 20 6f 66 20 61 6e 20 65  l format of an e
3c40: 78 74 72 61 20 66 69 65 6c 64 20 69 73 3a 0a 20  xtra field is:. 
3c50: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
3c60: 20 20 20 48 65 61 64 65 72 20 49 44 20 20 20 20     Header ID    
3c70: 32 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a  2 bytes.      **
3c80: 20 20 20 44 61 74 61 20 53 69 7a 65 20 20 20 20     Data Size    
3c90: 32 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a  2 bytes.      **
3ca0: 20 20 20 44 61 74 61 20 20 20 20 20 20 20 20 20     Data         
3cb0: 4e 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a  N bytes.      **
3cc0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
3cd0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3ce0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  K ){.        u8 
3cf0: 2a 70 20 3d 20 26 61 52 65 61 64 5b 70 43 73 72  *p = &aRead[pCsr
3d00: 2d 3e 63 64 73 2e 6e 46 69 6c 65 5d 3b 0a 20 20  ->cds.nFile];.  
3d10: 20 20 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d        u8 *pEnd =
3d20: 20 26 70 5b 70 43 73 72 2d 3e 63 64 73 2e 6e 45   &p[pCsr->cds.nE
3d30: 78 74 72 61 5d 3b 0a 0a 20 20 20 20 20 20 20 20  xtra];..        
3d40: 77 68 69 6c 65 28 20 70 3c 70 45 6e 64 20 29 7b  while( p<pEnd ){
3d50: 0a 20 20 20 20 20 20 20 20 20 20 75 31 36 20 69  .          u16 i
3d60: 64 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 31  d = zipfileRead1
3d70: 36 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  6(p);.          
3d80: 75 31 36 20 6e 42 79 74 65 20 3d 20 7a 69 70 66  u16 nByte = zipf
3d90: 69 6c 65 52 65 61 64 31 36 28 70 29 3b 0a 0a 20  ileRead16(p);.. 
3da0: 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28           switch(
3db0: 20 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20   id ){.         
3dc0: 20 20 20 63 61 73 65 20 5a 49 50 46 49 4c 45 5f     case ZIPFILE_
3dd0: 45 58 54 52 41 5f 54 49 4d 45 53 54 41 4d 50 3a  EXTRA_TIMESTAMP:
3de0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
3df0: 20 75 38 20 62 20 3d 20 70 5b 30 5d 3b 0a 20 20   u8 b = p[0];.  
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
3e10: 62 20 26 20 30 78 30 31 20 29 7b 20 20 20 20 20  b & 0x01 ){     
3e20: 2f 2a 20 30 78 30 31 20 2d 3e 20 6d 6f 64 74 69  /* 0x01 -> modti
3e30: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  me is present */
3e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3e50: 20 70 43 73 72 2d 3e 6d 54 69 6d 65 20 3d 20 7a   pCsr->mTime = z
3e60: 69 70 66 69 6c 65 47 65 74 55 33 32 28 26 70 5b  ipfileGetU32(&p[
3e70: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1]);.           
3e80: 20 20 20 20 20 70 43 73 72 2d 3e 66 6c 61 67 73       pCsr->flags
3e90: 20 7c 3d 20 5a 49 50 46 49 4c 45 5f 4d 54 49 4d   |= ZIPFILE_MTIM
3ea0: 45 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  E_VALID;.       
3eb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3ec0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3ed0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3ee0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
3ef0: 20 20 20 70 20 2b 3d 20 6e 42 79 74 65 3b 0a 20     p += nByte;. 
3f00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
3f10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
3f20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
3f30: 69 63 20 46 49 4c 45 20 2a 7a 69 70 66 69 6c 65  ic FILE *zipfile
3f40: 47 65 74 46 64 28 5a 69 70 66 69 6c 65 43 73 72  GetFd(ZipfileCsr
3f50: 20 2a 70 43 73 72 29 7b 0a 20 20 69 66 28 20 70   *pCsr){.  if( p
3f60: 43 73 72 2d 3e 70 46 69 6c 65 20 29 20 72 65 74  Csr->pFile ) ret
3f70: 75 72 6e 20 70 43 73 72 2d 3e 70 46 69 6c 65 3b  urn pCsr->pFile;
3f80: 0a 20 20 72 65 74 75 72 6e 20 28 28 5a 69 70 66  .  return ((Zipf
3f90: 69 6c 65 54 61 62 2a 29 28 70 43 73 72 2d 3e 62  ileTab*)(pCsr->b
3fa0: 61 73 65 2e 70 56 74 61 62 29 29 2d 3e 70 57 72  ase.pVtab))->pWr
3fb0: 69 74 65 46 64 3b 0a 7d 0a 0a 73 74 61 74 69 63  iteFd;.}..static
3fc0: 20 69 6e 74 20 7a 69 70 66 69 6c 65 52 65 61 64   int zipfileRead
3fd0: 4c 46 48 28 5a 69 70 66 69 6c 65 43 73 72 20 2a  LFH(ZipfileCsr *
3fe0: 70 43 73 72 29 7b 0a 20 20 46 49 4c 45 20 2a 70  pCsr){.  FILE *p
3ff0: 46 69 6c 65 20 3d 20 7a 69 70 66 69 6c 65 47 65  File = zipfileGe
4000: 74 46 64 28 70 43 73 72 29 3b 0a 20 20 63 68 61  tFd(pCsr);.  cha
4010: 72 20 2a 2a 70 7a 45 72 72 20 3d 20 26 70 43 73  r **pzErr = &pCs
4020: 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 2d 3e 7a  r->base.pVtab->z
4030: 45 72 72 4d 73 67 3b 0a 20 20 73 74 61 74 69 63  ErrMsg;.  static
4040: 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a 46 69 78   const int szFix
4050: 20 3d 20 5a 49 50 46 49 4c 45 5f 4c 46 48 5f 46   = ZIPFILE_LFH_F
4060: 49 58 45 44 5f 53 5a 3b 0a 20 20 75 38 20 2a 61  IXED_SZ;.  u8 *a
4070: 52 65 61 64 20 3d 20 7a 69 70 66 69 6c 65 43 73  Read = zipfileCs
4080: 72 42 75 66 66 65 72 28 70 43 73 72 29 3b 0a 20  rBuffer(pCsr);. 
4090: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
40a0: 20 7a 69 70 66 69 6c 65 52 65 61 64 44 61 74 61   zipfileReadData
40b0: 28 70 46 69 6c 65 2c 20 61 52 65 61 64 2c 20 73  (pFile, aRead, s
40c0: 7a 46 69 78 2c 20 70 43 73 72 2d 3e 63 64 73 2e  zFix, pCsr->cds.
40d0: 69 4f 66 66 73 65 74 2c 20 70 7a 45 72 72 29 3b  iOffset, pzErr);
40e0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
40f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 33 32 20  E_OK ){.    u32 
4100: 73 69 67 20 3d 20 7a 69 70 66 69 6c 65 52 65 61  sig = zipfileRea
4110: 64 33 32 28 61 52 65 61 64 29 3b 0a 20 20 20 20  d32(aRead);.    
4120: 69 66 28 20 73 69 67 21 3d 5a 49 50 46 49 4c 45  if( sig!=ZIPFILE
4130: 5f 53 49 47 4e 41 54 55 52 45 5f 4c 46 48 20 29  _SIGNATURE_LFH )
4140: 7b 0a 20 20 20 20 20 20 7a 69 70 66 69 6c 65 53  {.      zipfileS
4150: 65 74 45 72 72 6d 73 67 28 70 43 73 72 2c 20 22  etErrmsg(pCsr, "
4160: 66 61 69 6c 65 64 20 74 6f 20 72 65 61 64 20 4c  failed to read L
4170: 46 48 20 61 74 20 6f 66 66 73 65 74 20 25 64 22  FH at offset %d"
4180: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e  , .          (in
4190: 74 29 70 43 73 72 2d 3e 63 64 73 2e 69 4f 66 66  t)pCsr->cds.iOff
41a0: 73 65 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  set.      );.   
41b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
41c0: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RROR;.    }else{
41d0: 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 6c 66 68  .      pCsr->lfh
41e0: 2e 69 56 65 72 73 69 6f 6e 45 78 74 72 61 63 74  .iVersionExtract
41f0: 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 31 36   = zipfileRead16
4200: 28 61 52 65 61 64 29 3b 0a 20 20 20 20 20 20 70  (aRead);.      p
4210: 43 73 72 2d 3e 6c 66 68 2e 66 6c 61 67 73 20 3d  Csr->lfh.flags =
4220: 20 7a 69 70 66 69 6c 65 52 65 61 64 31 36 28 61   zipfileRead16(a
4230: 52 65 61 64 29 3b 0a 20 20 20 20 20 20 70 43 73  Read);.      pCs
4240: 72 2d 3e 6c 66 68 2e 69 43 6f 6d 70 72 65 73 73  r->lfh.iCompress
4250: 69 6f 6e 20 3d 20 7a 69 70 66 69 6c 65 52 65 61  ion = zipfileRea
4260: 64 31 36 28 61 52 65 61 64 29 3b 0a 20 20 20 20  d16(aRead);.    
4270: 20 20 70 43 73 72 2d 3e 6c 66 68 2e 6d 54 69 6d    pCsr->lfh.mTim
4280: 65 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 31  e = zipfileRead1
4290: 36 28 61 52 65 61 64 29 3b 0a 20 20 20 20 20 20  6(aRead);.      
42a0: 70 43 73 72 2d 3e 6c 66 68 2e 6d 44 61 74 65 20  pCsr->lfh.mDate 
42b0: 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 31 36 28  = zipfileRead16(
42c0: 61 52 65 61 64 29 3b 0a 20 20 20 20 20 20 70 43  aRead);.      pC
42d0: 73 72 2d 3e 6c 66 68 2e 63 72 63 33 32 20 3d 20  sr->lfh.crc32 = 
42e0: 7a 69 70 66 69 6c 65 52 65 61 64 33 32 28 61 52  zipfileRead32(aR
42f0: 65 61 64 29 3b 0a 20 20 20 20 20 20 70 43 73 72  ead);.      pCsr
4300: 2d 3e 6c 66 68 2e 73 7a 43 6f 6d 70 72 65 73 73  ->lfh.szCompress
4310: 65 64 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64  ed = zipfileRead
4320: 33 32 28 61 52 65 61 64 29 3b 0a 20 20 20 20 20  32(aRead);.     
4330: 20 70 43 73 72 2d 3e 6c 66 68 2e 73 7a 55 6e 63   pCsr->lfh.szUnc
4340: 6f 6d 70 72 65 73 73 65 64 20 3d 20 7a 69 70 66  ompressed = zipf
4350: 69 6c 65 52 65 61 64 33 32 28 61 52 65 61 64 29  ileRead32(aRead)
4360: 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 6c 66  ;.      pCsr->lf
4370: 68 2e 6e 46 69 6c 65 20 3d 20 7a 69 70 66 69 6c  h.nFile = zipfil
4380: 65 52 65 61 64 31 36 28 61 52 65 61 64 29 3b 0a  eRead16(aRead);.
4390: 20 20 20 20 20 20 70 43 73 72 2d 3e 6c 66 68 2e        pCsr->lfh.
43a0: 6e 45 78 74 72 61 20 3d 20 7a 69 70 66 69 6c 65  nExtra = zipfile
43b0: 52 65 61 64 31 36 28 61 52 65 61 64 29 3b 0a 20  Read16(aRead);. 
43c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 61 52 65       assert( aRe
43d0: 61 64 3d 3d 7a 69 70 66 69 6c 65 43 73 72 42 75  ad==zipfileCsrBu
43e0: 66 66 65 72 28 70 43 73 72 29 2b 73 7a 46 69 78  ffer(pCsr)+szFix
43f0: 20 29 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e   );.      pCsr->
4400: 69 44 61 74 61 4f 66 66 20 3d 20 70 43 73 72 2d  iDataOff = pCsr-
4410: 3e 63 64 73 2e 69 4f 66 66 73 65 74 2b 73 7a 46  >cds.iOffset+szF
4420: 69 78 2b 70 43 73 72 2d 3e 6c 66 68 2e 6e 46 69  ix+pCsr->lfh.nFi
4430: 6c 65 2b 70 43 73 72 2d 3e 6c 66 68 2e 6e 45 78  le+pCsr->lfh.nEx
4440: 74 72 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  tra;.    }.  }..
4450: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4460: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 61  ./*.** Advance a
4470: 6e 20 5a 69 70 66 69 6c 65 43 73 72 20 74 6f 20  n ZipfileCsr to 
4480: 69 74 73 20 6e 65 78 74 20 72 6f 77 20 6f 66 20  its next row of 
4490: 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69  output..*/.stati
44a0: 63 20 69 6e 74 20 7a 69 70 66 69 6c 65 4e 65 78  c int zipfileNex
44b0: 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  t(sqlite3_vtab_c
44c0: 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 5a  ursor *cur){.  Z
44d0: 69 70 66 69 6c 65 43 73 72 20 2a 70 43 73 72 20  ipfileCsr *pCsr 
44e0: 3d 20 28 5a 69 70 66 69 6c 65 43 73 72 2a 29 63  = (ZipfileCsr*)c
44f0: 75 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ur;.  int rc = S
4500: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 43 73 72  QLITE_OK;.  pCsr
4510: 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 0a 20 20  ->flags = 0;..  
4520: 69 66 28 20 70 43 73 72 2d 3e 70 43 75 72 72 65  if( pCsr->pCurre
4530: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34  nt==0 ){.    i64
4540: 20 69 45 6f 66 20 3d 20 70 43 73 72 2d 3e 65 6f   iEof = pCsr->eo
4550: 63 64 2e 69 4f 66 66 73 65 74 20 2b 20 70 43 73  cd.iOffset + pCs
4560: 72 2d 3e 65 6f 63 64 2e 6e 53 69 7a 65 3b 0a 20  r->eocd.nSize;. 
4570: 20 20 20 69 66 28 20 70 43 73 72 2d 3e 69 4e 65     if( pCsr->iNe
4580: 78 74 4f 66 66 3e 3d 69 45 6f 66 20 29 7b 0a 20  xtOff>=iEof ){. 
4590: 20 20 20 20 20 70 43 73 72 2d 3e 62 45 6f 66 20       pCsr->bEof 
45a0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
45b0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
45c0: 70 43 73 72 2d 3e 70 46 69 6c 65 3d 3d 30 20 29  pCsr->pFile==0 )
45d0: 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
45e0: 20 70 43 73 72 2d 3e 70 43 75 72 72 65 6e 74 20   pCsr->pCurrent 
45f0: 3d 20 70 43 73 72 2d 3e 70 43 75 72 72 65 6e 74  = pCsr->pCurrent
4600: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 77 68  ->pNext;.    }wh
4610: 69 6c 65 28 20 70 43 73 72 2d 3e 70 43 75 72 72  ile( pCsr->pCurr
4620: 65 6e 74 20 26 26 20 70 43 73 72 2d 3e 70 43 75  ent && pCsr->pCu
4630: 72 72 65 6e 74 2d 3e 62 44 65 6c 65 74 65 64 20  rrent->bDeleted 
4640: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 73 72 2d  );.    if( pCsr-
4650: 3e 70 43 75 72 72 65 6e 74 3d 3d 30 20 29 7b 0a  >pCurrent==0 ){.
4660: 20 20 20 20 20 20 70 43 73 72 2d 3e 62 45 6f 66        pCsr->bEof
4670: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
4680: 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 62 45 6f  .  if( pCsr->bEo
4690: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  f==0 ){.    rc =
46a0: 20 7a 69 70 66 69 6c 65 52 65 61 64 43 44 53 28   zipfileReadCDS(
46b0: 70 43 73 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCsr);.    if( r
46c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
46d0: 20 20 20 20 20 20 72 63 20 3d 20 7a 69 70 66 69        rc = zipfi
46e0: 6c 65 52 65 61 64 4c 46 48 28 70 43 73 72 29 3b  leReadLFH(pCsr);
46f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
4700: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
4710: 2a 20 22 53 74 61 6e 64 61 72 64 22 20 4d 53 2d  * "Standard" MS-
4720: 44 4f 53 20 74 69 6d 65 20 66 6f 72 6d 61 74 3a  DOS time format:
4730: 0a 2a 2a 0a 2a 2a 20 20 20 46 69 6c 65 20 6d 6f  .**.**   File mo
4740: 64 69 66 69 63 61 74 69 6f 6e 20 74 69 6d 65 3a  dification time:
4750: 0a 2a 2a 20 20 20 20 20 42 69 74 73 20 30 30 2d  .**     Bits 00-
4760: 30 34 3a 20 73 65 63 6f 6e 64 73 20 64 69 76 69  04: seconds divi
4770: 64 65 64 20 62 79 20 32 0a 2a 2a 20 20 20 20 20  ded by 2.**     
4780: 42 69 74 73 20 30 35 2d 31 30 3a 20 6d 69 6e 75  Bits 05-10: minu
4790: 74 65 0a 2a 2a 20 20 20 20 20 42 69 74 73 20 31  te.**     Bits 1
47a0: 31 2d 31 35 3a 20 68 6f 75 72 0a 2a 2a 20 20 20  1-15: hour.**   
47b0: 46 69 6c 65 20 6d 6f 64 69 66 69 63 61 74 69 6f  File modificatio
47c0: 6e 20 64 61 74 65 3a 0a 2a 2a 20 20 20 20 20 42  n date:.**     B
47d0: 69 74 73 20 30 30 2d 30 34 3a 20 64 61 79 0a 2a  its 00-04: day.*
47e0: 2a 20 20 20 20 20 42 69 74 73 20 30 35 2d 30 38  *     Bits 05-08
47f0: 3a 20 6d 6f 6e 74 68 20 28 31 2d 31 32 29 0a 2a  : month (1-12).*
4800: 2a 20 20 20 20 20 42 69 74 73 20 30 39 2d 31 35  *     Bits 09-15
4810: 3a 20 79 65 61 72 73 20 66 72 6f 6d 20 31 39 38  : years from 198
4820: 30 20 0a 2a 2f 0a 73 74 61 74 69 63 20 74 69 6d  0 .*/.static tim
4830: 65 5f 74 20 7a 69 70 66 69 6c 65 4d 74 69 6d 65  e_t zipfileMtime
4840: 28 5a 69 70 66 69 6c 65 43 73 72 20 2a 70 43 73  (ZipfileCsr *pCs
4850: 72 29 7b 0a 20 20 73 74 72 75 63 74 20 74 6d 20  r){.  struct tm 
4860: 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 74 2c 20  t;.  memset(&t, 
4870: 30 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20  0, sizeof(t));. 
4880: 20 74 2e 74 6d 5f 73 65 63 20 3d 20 28 70 43 73   t.tm_sec = (pCs
4890: 72 2d 3e 63 64 73 2e 6d 54 69 6d 65 20 26 20 30  r->cds.mTime & 0
48a0: 78 31 46 29 2a 32 3b 0a 20 20 74 2e 74 6d 5f 6d  x1F)*2;.  t.tm_m
48b0: 69 6e 20 3d 20 28 70 43 73 72 2d 3e 63 64 73 2e  in = (pCsr->cds.
48c0: 6d 54 69 6d 65 20 3e 3e 20 35 29 20 26 20 30 78  mTime >> 5) & 0x
48d0: 32 46 3b 0a 20 20 74 2e 74 6d 5f 68 6f 75 72 20  2F;.  t.tm_hour 
48e0: 3d 20 28 70 43 73 72 2d 3e 63 64 73 2e 6d 54 69  = (pCsr->cds.mTi
48f0: 6d 65 20 3e 3e 20 31 31 29 20 26 20 30 78 31 46  me >> 11) & 0x1F
4900: 3b 0a 0a 20 20 74 2e 74 6d 5f 6d 64 61 79 20 3d  ;..  t.tm_mday =
4910: 20 28 70 43 73 72 2d 3e 63 64 73 2e 6d 44 61 74   (pCsr->cds.mDat
4920: 65 20 26 20 30 78 31 46 29 3b 0a 20 20 74 2e 74  e & 0x1F);.  t.t
4930: 6d 5f 6d 6f 6e 20 3d 20 28 28 70 43 73 72 2d 3e  m_mon = ((pCsr->
4940: 63 64 73 2e 6d 44 61 74 65 20 3e 3e 20 35 29 20  cds.mDate >> 5) 
4950: 26 20 30 78 30 46 29 20 2d 20 31 3b 0a 20 20 74  & 0x0F) - 1;.  t
4960: 2e 74 6d 5f 79 65 61 72 20 3d 20 38 30 20 2b 20  .tm_year = 80 + 
4970: 28 28 70 43 73 72 2d 3e 63 64 73 2e 6d 44 61 74  ((pCsr->cds.mDat
4980: 65 20 3e 3e 20 39 29 20 26 20 30 78 37 46 29 3b  e >> 9) & 0x7F);
4990: 0a 0a 20 20 72 65 74 75 72 6e 20 6d 6b 74 69 6d  ..  return mktim
49a0: 65 28 26 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  e(&t);.}..static
49b0: 20 76 6f 69 64 20 7a 69 70 66 69 6c 65 4d 74 69   void zipfileMti
49c0: 6d 65 54 6f 44 6f 73 28 5a 69 70 66 69 6c 65 43  meToDos(ZipfileC
49d0: 44 53 20 2a 70 43 64 73 2c 20 75 33 32 20 6d 54  DS *pCds, u32 mT
49e0: 69 6d 65 29 7b 0a 20 20 74 69 6d 65 5f 74 20 74  ime){.  time_t t
49f0: 20 3d 20 28 74 69 6d 65 5f 74 29 6d 54 69 6d 65   = (time_t)mTime
4a00: 3b 0a 20 20 73 74 72 75 63 74 20 74 6d 20 72 65  ;.  struct tm re
4a10: 73 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  s;..#if !defined
4a20: 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66  (_WIN32) && !def
4a30: 69 6e 65 64 28 57 49 4e 33 32 29 0a 20 20 6c 6f  ined(WIN32).  lo
4a40: 63 61 6c 74 69 6d 65 5f 72 28 26 74 2c 20 26 72  caltime_r(&t, &r
4a50: 65 73 29 3b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d  es);.#else.  mem
4a60: 63 70 79 28 26 72 65 73 2c 20 6c 6f 63 61 6c 74  cpy(&res, localt
4a70: 69 6d 65 28 26 74 29 2c 20 73 69 7a 65 6f 66 28  ime(&t), sizeof(
4a80: 73 74 72 75 63 74 20 74 6d 29 29 3b 0a 23 65 6e  struct tm));.#en
4a90: 64 69 66 0a 0a 20 20 70 43 64 73 2d 3e 6d 54 69  dif..  pCds->mTi
4aa0: 6d 65 20 3d 20 28 75 31 36 29 28 0a 20 20 20 20  me = (u16)(.    
4ab0: 28 72 65 73 2e 74 6d 5f 73 65 63 20 2f 20 32 29  (res.tm_sec / 2)
4ac0: 20 2b 20 0a 20 20 20 20 28 72 65 73 2e 74 6d 5f   + .    (res.tm_
4ad0: 6d 69 6e 20 3c 3c 20 35 29 20 2b 0a 20 20 20 20  min << 5) +.    
4ae0: 28 72 65 73 2e 74 6d 5f 68 6f 75 72 20 3c 3c 20  (res.tm_hour << 
4af0: 31 31 29 29 3b 0a 0a 20 20 70 43 64 73 2d 3e 6d  11));..  pCds->m
4b00: 44 61 74 65 20 3d 20 28 75 31 36 29 28 0a 20 20  Date = (u16)(.  
4b10: 20 20 28 72 65 73 2e 74 6d 5f 6d 64 61 79 2d 31    (res.tm_mday-1
4b20: 29 20 2b 0a 20 20 20 20 28 28 72 65 73 2e 74 6d  ) +.    ((res.tm
4b30: 5f 6d 6f 6e 2b 31 29 20 3c 3c 20 35 29 20 2b 0a  _mon+1) << 5) +.
4b40: 20 20 20 20 28 28 72 65 73 2e 74 6d 5f 79 65 61      ((res.tm_yea
4b50: 72 2d 38 30 29 20 3c 3c 20 39 29 29 3b 0a 7d 0a  r-80) << 9));.}.
4b60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 69 70  .static void zip
4b70: 66 69 6c 65 49 6e 66 6c 61 74 65 28 0a 20 20 73  fileInflate(.  s
4b80: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
4b90: 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f  pCtx,          /
4ba0: 2a 20 53 74 6f 72 65 20 65 72 72 6f 72 20 68 65  * Store error he
4bb0: 72 65 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  re, if any */.  
4bc0: 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e 2c 20 20  const u8 *aIn,  
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4be0: 2f 2a 20 43 6f 6d 70 72 65 73 73 65 64 20 64 61  /* Compressed da
4bf0: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 2c  ta */.  int nIn,
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c10: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
4c20: 6f 66 20 62 75 66 66 65 72 20 61 49 6e 5b 5d 20  of buffer aIn[] 
4c30: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
4c40: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4c60: 20 45 78 70 65 63 74 65 64 20 6f 75 74 70 75 74   Expected output
4c70: 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 75 38   size */.){.  u8
4c80: 20 2a 61 52 65 73 20 3d 20 73 71 6c 69 74 65 33   *aRes = sqlite3
4c90: 5f 6d 61 6c 6c 6f 63 28 6e 4f 75 74 29 3b 0a 20  _malloc(nOut);. 
4ca0: 20 69 66 28 20 61 52 65 73 3d 3d 30 20 29 7b 0a   if( aRes==0 ){.
4cb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
4cc0: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70  lt_error_nomem(p
4cd0: 43 74 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Ctx);.  }else{. 
4ce0: 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20     int err;.    
4cf0: 7a 5f 73 74 72 65 61 6d 20 73 74 72 3b 0a 20 20  z_stream str;.  
4d00: 20 20 6d 65 6d 73 65 74 28 26 73 74 72 2c 20 30    memset(&str, 0
4d10: 2c 20 73 69 7a 65 6f 66 28 73 74 72 29 29 3b 0a  , sizeof(str));.
4d20: 0a 20 20 20 20 73 74 72 2e 6e 65 78 74 5f 69 6e  .    str.next_in
4d30: 20 3d 20 28 42 79 74 65 2a 29 61 49 6e 3b 0a 20   = (Byte*)aIn;. 
4d40: 20 20 20 73 74 72 2e 61 76 61 69 6c 5f 69 6e 20     str.avail_in 
4d50: 3d 20 6e 49 6e 3b 0a 20 20 20 20 73 74 72 2e 6e  = nIn;.    str.n
4d60: 65 78 74 5f 6f 75 74 20 3d 20 28 42 79 74 65 2a  ext_out = (Byte*
4d70: 29 61 52 65 73 3b 0a 20 20 20 20 73 74 72 2e 61  )aRes;.    str.a
4d80: 76 61 69 6c 5f 6f 75 74 20 3d 20 6e 4f 75 74 3b  vail_out = nOut;
4d90: 0a 0a 20 20 20 20 65 72 72 20 3d 20 69 6e 66 6c  ..    err = infl
4da0: 61 74 65 49 6e 69 74 32 28 26 73 74 72 2c 20 2d  ateInit2(&str, -
4db0: 31 35 29 3b 0a 20 20 20 20 69 66 28 20 65 72 72  15);.    if( err
4dc0: 21 3d 5a 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  !=Z_OK ){.      
4dd0: 7a 69 70 66 69 6c 65 43 74 78 45 72 72 6f 72 4d  zipfileCtxErrorM
4de0: 73 67 28 70 43 74 78 2c 20 22 69 6e 66 6c 61 74  sg(pCtx, "inflat
4df0: 65 49 6e 69 74 32 28 29 20 66 61 69 6c 65 64 20  eInit2() failed 
4e00: 28 25 64 29 22 2c 20 65 72 72 29 3b 0a 20 20 20  (%d)", err);.   
4e10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 72   }else{.      er
4e20: 72 20 3d 20 69 6e 66 6c 61 74 65 28 26 73 74 72  r = inflate(&str
4e30: 2c 20 5a 5f 4e 4f 5f 46 4c 55 53 48 29 3b 0a 20  , Z_NO_FLUSH);. 
4e40: 20 20 20 20 20 69 66 28 20 65 72 72 21 3d 5a 5f       if( err!=Z_
4e50: 53 54 52 45 41 4d 5f 45 4e 44 20 29 7b 0a 20 20  STREAM_END ){.  
4e60: 20 20 20 20 20 20 7a 69 70 66 69 6c 65 43 74 78        zipfileCtx
4e70: 45 72 72 6f 72 4d 73 67 28 70 43 74 78 2c 20 22  ErrorMsg(pCtx, "
4e80: 69 6e 66 6c 61 74 65 28 29 20 66 61 69 6c 65 64  inflate() failed
4e90: 20 28 25 64 29 22 2c 20 65 72 72 29 3b 0a 20 20   (%d)", err);.  
4ea0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4eb0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4ec0: 74 5f 62 6c 6f 62 28 70 43 74 78 2c 20 61 52 65  t_blob(pCtx, aRe
4ed0: 73 2c 20 6e 4f 75 74 2c 20 53 51 4c 49 54 45 5f  s, nOut, SQLITE_
4ee0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
4ef0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
4f00: 6c 69 74 65 33 5f 66 72 65 65 28 61 52 65 73 29  lite3_free(aRes)
4f10: 3b 0a 20 20 20 20 69 6e 66 6c 61 74 65 45 6e 64  ;.    inflateEnd
4f20: 28 26 73 74 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  (&str);.  }.}..s
4f30: 74 61 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c  tatic int zipfil
4f40: 65 44 65 66 6c 61 74 65 28 0a 20 20 5a 69 70 66  eDeflate(.  Zipf
4f50: 69 6c 65 54 61 62 20 2a 70 54 61 62 2c 20 20 20  ileTab *pTab,   
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4f70: 65 74 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  et error message
4f80: 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
4f90: 20 75 38 20 2a 61 49 6e 2c 20 69 6e 74 20 6e 49   u8 *aIn, int nI
4fa0: 6e 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  n,         /* In
4fb0: 70 75 74 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70  put */.  u8 **pp
4fc0: 4f 75 74 2c 20 69 6e 74 20 2a 70 6e 4f 75 74 20  Out, int *pnOut 
4fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
4fe0: 75 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ut */.){.  int n
4ff0: 41 6c 6c 6f 63 20 3d 20 28 69 6e 74 29 63 6f 6d  Alloc = (int)com
5000: 70 72 65 73 73 42 6f 75 6e 64 28 6e 49 6e 29 3b  pressBound(nIn);
5010: 0a 20 20 75 38 20 2a 61 4f 75 74 3b 0a 20 20 69  .  u8 *aOut;.  i
5020: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5030: 4b 3b 0a 0a 20 20 61 4f 75 74 20 3d 20 28 75 38  K;..  aOut = (u8
5040: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
5050: 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20 69 66 28 20  (nAlloc);.  if( 
5060: 61 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  aOut==0 ){.    r
5070: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
5080: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
5090: 6e 74 20 72 65 73 3b 0a 20 20 20 20 7a 5f 73 74  nt res;.    z_st
50a0: 72 65 61 6d 20 73 74 72 3b 0a 20 20 20 20 6d 65  ream str;.    me
50b0: 6d 73 65 74 28 26 73 74 72 2c 20 30 2c 20 73 69  mset(&str, 0, si
50c0: 7a 65 6f 66 28 73 74 72 29 29 3b 0a 20 20 20 20  zeof(str));.    
50d0: 73 74 72 2e 6e 65 78 74 5f 69 6e 20 3d 20 28 7a  str.next_in = (z
50e0: 5f 63 6f 6e 73 74 20 42 79 74 65 66 2a 29 61 49  _const Bytef*)aI
50f0: 6e 3b 0a 20 20 20 20 73 74 72 2e 61 76 61 69 6c  n;.    str.avail
5100: 5f 69 6e 20 3d 20 6e 49 6e 3b 0a 20 20 20 20 73  _in = nIn;.    s
5110: 74 72 2e 6e 65 78 74 5f 6f 75 74 20 3d 20 61 4f  tr.next_out = aO
5120: 75 74 3b 0a 20 20 20 20 73 74 72 2e 61 76 61 69  ut;.    str.avai
5130: 6c 5f 6f 75 74 20 3d 20 6e 41 6c 6c 6f 63 3b 0a  l_out = nAlloc;.
5140: 0a 20 20 20 20 64 65 66 6c 61 74 65 49 6e 69 74  .    deflateInit
5150: 32 28 26 73 74 72 2c 20 39 2c 20 5a 5f 44 45 46  2(&str, 9, Z_DEF
5160: 4c 41 54 45 44 2c 20 2d 31 35 2c 20 38 2c 20 5a  LATED, -15, 8, Z
5170: 5f 44 45 46 41 55 4c 54 5f 53 54 52 41 54 45 47  _DEFAULT_STRATEG
5180: 59 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 64 65  Y);.    res = de
5190: 66 6c 61 74 65 28 26 73 74 72 2c 20 5a 5f 46 49  flate(&str, Z_FI
51a0: 4e 49 53 48 29 3b 0a 0a 20 20 20 20 69 66 28 20  NISH);..    if( 
51b0: 72 65 73 3d 3d 5a 5f 53 54 52 45 41 4d 5f 45 4e  res==Z_STREAM_EN
51c0: 44 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f 75  D ){.      *ppOu
51d0: 74 20 3d 20 61 4f 75 74 3b 0a 20 20 20 20 20 20  t = aOut;.      
51e0: 2a 70 6e 4f 75 74 20 3d 20 28 69 6e 74 29 73 74  *pnOut = (int)st
51f0: 72 2e 74 6f 74 61 6c 5f 6f 75 74 3b 0a 20 20 20  r.total_out;.   
5200: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
5210: 6c 69 74 65 33 5f 66 72 65 65 28 61 4f 75 74 29  lite3_free(aOut)
5220: 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 62 61  ;.      pTab->ba
5230: 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  se.zErrMsg = sql
5240: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69  ite3_mprintf("zi
5250: 70 66 69 6c 65 3a 20 64 65 66 6c 61 74 65 28 29  pfile: deflate()
5260: 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20   error");.      
5270: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
5280: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  R;.    }.    def
5290: 6c 61 74 65 45 6e 64 28 26 73 74 72 29 3b 0a 20  lateEnd(&str);. 
52a0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
52b0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
52c0: 6e 20 76 61 6c 75 65 73 20 6f 66 20 63 6f 6c 75  n values of colu
52d0: 6d 6e 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20  mns for the row 
52e0: 61 74 20 77 68 69 63 68 20 74 68 65 20 73 65 72  at which the ser
52f0: 69 65 73 5f 63 75 72 73 6f 72 0a 2a 2a 20 69 73  ies_cursor.** is
5300: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
5310: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
5320: 6e 74 20 7a 69 70 66 69 6c 65 43 6f 6c 75 6d 6e  nt zipfileColumn
5330: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  (.  sqlite3_vtab
5340: 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 20 20  _cursor *cur,   
5350: 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 2a 2f  /* The cursor */
5360: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
5370: 78 74 20 2a 63 74 78 2c 20 20 20 20 20 20 20 2f  xt *ctx,       /
5380: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
5390: 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 73 75   to sqlite3_resu
53a0: 6c 74 5f 2e 2e 2e 28 29 20 2a 2f 0a 20 20 69 6e  lt_...() */.  in
53b0: 74 20 69 20 20 20 20 20 20 20 20 20 20 20 20 20  t i             
53c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69            /* Whi
53d0: 63 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 74  ch column to ret
53e0: 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20 5a 69 70 66  urn */.){.  Zipf
53f0: 69 6c 65 43 73 72 20 2a 70 43 73 72 20 3d 20 28  ileCsr *pCsr = (
5400: 5a 69 70 66 69 6c 65 43 73 72 2a 29 63 75 72 3b  ZipfileCsr*)cur;
5410: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
5420: 54 45 5f 4f 4b 3b 0a 20 20 73 77 69 74 63 68 28  TE_OK;.  switch(
5430: 20 69 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30   i ){.    case 0
5440: 3a 20 20 20 2f 2a 20 6e 61 6d 65 20 2a 2f 0a 20  :   /* name */. 
5450: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
5460: 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 70 43  ult_text(ctx, pC
5470: 73 72 2d 3e 63 64 73 2e 7a 46 69 6c 65 2c 20 2d  sr->cds.zFile, -
5480: 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
5490: 45 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ENT);.      brea
54a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 31 3a 20 20  k;.    case 1:  
54b0: 20 2f 2a 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20   /* mode */.    
54c0: 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 65 74 68    /* TODO: Wheth
54d0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 66 6f  er or not the fo
54e0: 6c 6c 6f 77 69 6e 67 20 69 73 20 63 6f 72 72 65  llowing is corre
54f0: 63 74 20 73 75 72 65 6c 79 20 64 65 70 65 6e 64  ct surely depend
5500: 73 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  s on.      ** th
5510: 65 20 70 6c 61 74 66 6f 72 6d 20 6f 6e 20 77 68  e platform on wh
5520: 69 63 68 20 74 68 65 20 61 72 63 68 69 76 65 20  ich the archive 
5530: 77 61 73 20 63 72 65 61 74 65 64 2e 20 20 2a 2f  was created.  */
5540: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
5550: 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70  esult_int(ctx, p
5560: 43 73 72 2d 3e 63 64 73 2e 69 45 78 74 65 72 6e  Csr->cds.iExtern
5570: 61 6c 41 74 74 72 20 3e 3e 20 31 36 29 3b 0a 20  alAttr >> 16);. 
5580: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5590: 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 6d 74 69  case 2: { /* mti
55a0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  me */.      if( 
55b0: 70 43 73 72 2d 3e 66 6c 61 67 73 20 26 20 5a 49  pCsr->flags & ZI
55c0: 50 46 49 4c 45 5f 4d 54 49 4d 45 5f 56 41 4c 49  PFILE_MTIME_VALI
55d0: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D ){.        sql
55e0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
55f0: 34 28 63 74 78 2c 20 70 43 73 72 2d 3e 6d 54 69  4(ctx, pCsr->mTi
5600: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
5610: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5620: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
5630: 74 78 2c 20 7a 69 70 66 69 6c 65 4d 74 69 6d 65  tx, zipfileMtime
5640: 28 70 43 73 72 29 29 3b 0a 20 20 20 20 20 20 7d  (pCsr));.      }
5650: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5660: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20    }.    case 3: 
5670: 7b 20 2f 2a 20 73 7a 20 2a 2f 0a 20 20 20 20 20  { /* sz */.     
5680: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5690: 69 6e 74 36 34 28 63 74 78 2c 20 70 43 73 72 2d  int64(ctx, pCsr-
56a0: 3e 63 64 73 2e 73 7a 55 6e 63 6f 6d 70 72 65 73  >cds.szUncompres
56b0: 73 65 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61  sed);.      brea
56c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
56d0: 65 20 34 3a 20 20 20 2f 2a 20 72 61 77 64 61 74  e 4:   /* rawdat
56e0: 61 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 35 3a  a */.    case 5:
56f0: 20 7b 20 2f 2a 20 64 61 74 61 20 2a 2f 0a 20 20   { /* data */.  
5700: 20 20 20 20 69 66 28 20 69 3d 3d 34 20 7c 7c 20      if( i==4 || 
5710: 70 43 73 72 2d 3e 63 64 73 2e 69 43 6f 6d 70 72  pCsr->cds.iCompr
5720: 65 73 73 69 6f 6e 3d 3d 30 20 7c 7c 20 70 43 73  ession==0 || pCs
5730: 72 2d 3e 63 64 73 2e 69 43 6f 6d 70 72 65 73 73  r->cds.iCompress
5740: 69 6f 6e 3d 3d 38 20 29 7b 0a 20 20 20 20 20 20  ion==8 ){.      
5750: 20 20 69 6e 74 20 73 7a 20 3d 20 70 43 73 72 2d    int sz = pCsr-
5760: 3e 63 64 73 2e 73 7a 43 6f 6d 70 72 65 73 73 65  >cds.szCompresse
5770: 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  d;.        if( s
5780: 7a 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  z>0 ){.         
5790: 20 75 38 20 2a 61 42 75 66 20 3d 20 73 71 6c 69   u8 *aBuf = sqli
57a0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a 29 3b 0a  te3_malloc(sz);.
57b0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 42            if( aB
57c0: 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  uf==0 ){.       
57d0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
57e0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
57f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5800: 20 20 20 20 20 46 49 4c 45 20 2a 70 46 69 6c 65       FILE *pFile
5810: 20 3d 20 7a 69 70 66 69 6c 65 47 65 74 46 64 28   = zipfileGetFd(
5820: 70 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 20  pCsr);.         
5830: 20 20 20 72 63 20 3d 20 7a 69 70 66 69 6c 65 52     rc = zipfileR
5840: 65 61 64 44 61 74 61 28 70 46 69 6c 65 2c 20 61  eadData(pFile, a
5850: 42 75 66 2c 20 73 7a 2c 20 70 43 73 72 2d 3e 69  Buf, sz, pCsr->i
5860: 44 61 74 61 4f 66 66 2c 0a 20 20 20 20 20 20 20  DataOff,.       
5870: 20 20 20 20 20 20 20 20 20 26 70 43 73 72 2d 3e           &pCsr->
5880: 62 61 73 65 2e 70 56 74 61 62 2d 3e 7a 45 72 72  base.pVtab->zErr
5890: 4d 73 67 0a 20 20 20 20 20 20 20 20 20 20 20 20  Msg.            
58a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
58b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
58c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
58d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3d            if( i=
58e0: 3d 35 20 26 26 20 70 43 73 72 2d 3e 63 64 73 2e  =5 && pCsr->cds.
58f0: 69 43 6f 6d 70 72 65 73 73 69 6f 6e 20 29 7b 0a  iCompression ){.
5900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 69                zi
5910: 70 66 69 6c 65 49 6e 66 6c 61 74 65 28 63 74 78  pfileInflate(ctx
5920: 2c 20 61 42 75 66 2c 20 73 7a 2c 20 70 43 73 72  , aBuf, sz, pCsr
5930: 2d 3e 63 64 73 2e 73 7a 55 6e 63 6f 6d 70 72 65  ->cds.szUncompre
5940: 73 73 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ssed);.         
5950: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5960: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
5970: 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 74 78 2c  result_blob(ctx,
5980: 20 61 42 75 66 2c 20 73 7a 2c 20 53 51 4c 49 54   aBuf, sz, SQLIT
5990: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
59a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
59b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
59c0: 66 72 65 65 28 61 42 75 66 29 3b 0a 20 20 20 20  free(aBuf);.    
59d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
59e0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
59f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5a00: 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 6d 65   case 6:   /* me
5a10: 74 68 6f 64 20 2a 2f 0a 20 20 20 20 20 20 73 71  thod */.      sq
5a20: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
5a30: 28 63 74 78 2c 20 70 43 73 72 2d 3e 63 64 73 2e  (ctx, pCsr->cds.
5a40: 69 43 6f 6d 70 72 65 73 73 69 6f 6e 29 3b 0a 20  iCompression);. 
5a50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
5a60: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5a70: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
5a80: 74 75 72 6e 20 74 68 65 20 72 6f 77 69 64 20 66  turn the rowid f
5a90: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  or the current r
5aa0: 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ow..*/.static in
5ab0: 74 20 7a 69 70 66 69 6c 65 52 6f 77 69 64 28 73  t zipfileRowid(s
5ac0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
5ad0: 6f 72 20 2a 63 75 72 2c 20 73 71 6c 69 74 65 5f  or *cur, sqlite_
5ae0: 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 29 7b 0a  int64 *pRowid){.
5af0: 20 20 5a 69 70 66 69 6c 65 43 73 72 20 2a 70 43    ZipfileCsr *pC
5b00: 73 72 20 3d 20 28 5a 69 70 66 69 6c 65 43 73 72  sr = (ZipfileCsr
5b10: 2a 29 63 75 72 3b 0a 20 20 69 66 28 20 70 43 73  *)cur;.  if( pCs
5b20: 72 2d 3e 70 43 75 72 72 65 6e 74 20 29 7b 0a 20  r->pCurrent ){. 
5b30: 20 20 20 2a 70 52 6f 77 69 64 20 3d 20 70 43 73     *pRowid = pCs
5b40: 72 2d 3e 70 43 75 72 72 65 6e 74 2d 3e 69 52 6f  r->pCurrent->iRo
5b50: 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  wid;.  }else{.  
5b60: 20 20 2a 70 52 6f 77 69 64 20 3d 20 70 43 73 72    *pRowid = pCsr
5b70: 2d 3e 63 64 73 2e 69 4f 66 66 73 65 74 3b 0a 20  ->cds.iOffset;. 
5b80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
5b90: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5ba0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
5bb0: 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 62 65  he cursor has be
5bc0: 65 6e 20 6d 6f 76 65 64 20 6f 66 66 20 6f 66 20  en moved off of 
5bd0: 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 77 20  the last.** row 
5be0: 6f 66 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74  of output..*/.st
5bf0: 61 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c 65  atic int zipfile
5c00: 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62  Eof(sqlite3_vtab
5c10: 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20  _cursor *cur){. 
5c20: 20 5a 69 70 66 69 6c 65 43 73 72 20 2a 70 43 73   ZipfileCsr *pCs
5c30: 72 20 3d 20 28 5a 69 70 66 69 6c 65 43 73 72 2a  r = (ZipfileCsr*
5c40: 29 63 75 72 3b 0a 20 20 72 65 74 75 72 6e 20 70  )cur;.  return p
5c50: 43 73 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a  Csr->bEof;.}../*
5c60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .*/.static int z
5c70: 69 70 66 69 6c 65 52 65 61 64 45 4f 43 44 28 0a  ipfileReadEOCD(.
5c80: 20 20 5a 69 70 66 69 6c 65 54 61 62 20 2a 70 54    ZipfileTab *pT
5c90: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
5ca0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 65 72 72 6f    /* Return erro
5cb0: 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 46 49 4c  rs here */.  FIL
5cc0: 45 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  E *pFile,       
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5ce0: 52 65 61 64 20 66 72 6f 6d 20 74 68 69 73 20 66  Read from this f
5cf0: 69 6c 65 20 2a 2f 0a 20 20 5a 69 70 66 69 6c 65  ile */.  Zipfile
5d00: 45 4f 43 44 20 2a 70 45 4f 43 44 20 20 20 20 20  EOCD *pEOCD     
5d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
5d20: 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a  ct to populate *
5d30: 2f 0a 29 7b 0a 20 20 75 38 20 2a 61 52 65 61 64  /.){.  u8 *aRead
5d40: 20 3d 20 70 54 61 62 2d 3e 61 42 75 66 66 65 72   = pTab->aBuffer
5d50: 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72  ;      /* Tempor
5d60: 61 72 79 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  ary buffer */.  
5d70: 69 36 34 20 73 7a 46 69 6c 65 3b 20 20 20 20 20  i64 szFile;     
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
5da0: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
5db0: 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20  /.  int nRead;  
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dd0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
5de0: 72 65 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a  read from file *
5df0: 2f 0a 20 20 69 36 34 20 69 4f 66 66 3b 20 20 20  /.  i64 iOff;   
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e10: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
5e20: 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
5e30: 69 6e 74 20 72 63 3b 0a 0a 20 20 66 73 65 65 6b  int rc;..  fseek
5e40: 28 70 46 69 6c 65 2c 20 30 2c 20 53 45 45 4b 5f  (pFile, 0, SEEK_
5e50: 45 4e 44 29 3b 0a 20 20 73 7a 46 69 6c 65 20 3d  END);.  szFile =
5e60: 20 28 69 36 34 29 66 74 65 6c 6c 28 70 46 69 6c   (i64)ftell(pFil
5e70: 65 29 3b 0a 20 20 69 66 28 20 73 7a 46 69 6c 65  e);.  if( szFile
5e80: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
5e90: 6e 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a  n SQLITE_EMPTY;.
5ea0: 20 20 7d 0a 20 20 6e 52 65 61 64 20 3d 20 28 69    }.  nRead = (i
5eb0: 6e 74 29 28 4d 49 4e 28 73 7a 46 69 6c 65 2c 20  nt)(MIN(szFile, 
5ec0: 5a 49 50 46 49 4c 45 5f 42 55 46 46 45 52 5f 53  ZIPFILE_BUFFER_S
5ed0: 49 5a 45 29 29 3b 0a 20 20 69 4f 66 66 20 3d 20  IZE));.  iOff = 
5ee0: 73 7a 46 69 6c 65 20 2d 20 6e 52 65 61 64 3b 0a  szFile - nRead;.
5ef0: 0a 20 20 72 63 20 3d 20 7a 69 70 66 69 6c 65 52  .  rc = zipfileR
5f00: 65 61 64 44 61 74 61 28 70 46 69 6c 65 2c 20 61  eadData(pFile, a
5f10: 52 65 61 64 2c 20 6e 52 65 61 64 2c 20 69 4f 66  Read, nRead, iOf
5f20: 66 2c 20 26 70 54 61 62 2d 3e 62 61 73 65 2e 7a  f, &pTab->base.z
5f30: 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72  ErrMsg);.  if( r
5f40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5f50: 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
5f60: 2f 2a 20 53 63 61 6e 20 62 61 63 6b 77 61 72 64  /* Scan backward
5f70: 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 74 68  s looking for th
5f80: 65 20 73 69 67 6e 61 74 75 72 65 20 62 79 74 65  e signature byte
5f90: 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6e  s */.    for(i=n
5fa0: 52 65 61 64 2d 32 30 3b 20 69 3e 3d 30 3b 20 69  Read-20; i>=0; i
5fb0: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  --){.      if( a
5fc0: 52 65 61 64 5b 69 5d 3d 3d 30 78 35 30 20 26 26  Read[i]==0x50 &&
5fd0: 20 61 52 65 61 64 5b 69 2b 31 5d 3d 3d 30 78 34   aRead[i+1]==0x4
5fe0: 62 20 0a 20 20 20 20 20 20 20 26 26 20 61 52 65  b .       && aRe
5ff0: 61 64 5b 69 2b 32 5d 3d 3d 30 78 30 35 20 26 26  ad[i+2]==0x05 &&
6000: 20 61 52 65 61 64 5b 69 2b 33 5d 3d 3d 30 78 30   aRead[i+3]==0x0
6010: 36 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  6 .      ){.    
6020: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6030: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
6040: 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 54   i<0 ){.      pT
6050: 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67  ab->base.zErrMsg
6060: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
6070: 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 63  tf(.          "c
6080: 61 6e 6e 6f 74 20 66 69 6e 64 20 65 6e 64 20 6f  annot find end o
6090: 66 20 63 65 6e 74 72 61 6c 20 64 69 72 65 63 74  f central direct
60a0: 6f 72 79 20 72 65 63 6f 72 64 22 0a 20 20 20 20  ory record".    
60b0: 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72    );.      retur
60c0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
60d0: 20 20 20 20 7d 0a 0a 20 20 20 20 61 52 65 61 64      }..    aRead
60e0: 20 2b 3d 20 69 2b 34 3b 0a 20 20 20 20 70 45 4f   += i+4;.    pEO
60f0: 43 44 2d 3e 69 44 69 73 6b 20 3d 20 7a 69 70 66  CD->iDisk = zipf
6100: 69 6c 65 52 65 61 64 31 36 28 61 52 65 61 64 29  ileRead16(aRead)
6110: 3b 0a 20 20 20 20 70 45 4f 43 44 2d 3e 69 46 69  ;.    pEOCD->iFi
6120: 72 73 74 44 69 73 6b 20 3d 20 7a 69 70 66 69 6c  rstDisk = zipfil
6130: 65 52 65 61 64 31 36 28 61 52 65 61 64 29 3b 0a  eRead16(aRead);.
6140: 20 20 20 20 70 45 4f 43 44 2d 3e 6e 45 6e 74 72      pEOCD->nEntr
6150: 79 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 31  y = zipfileRead1
6160: 36 28 61 52 65 61 64 29 3b 0a 20 20 20 20 70 45  6(aRead);.    pE
6170: 4f 43 44 2d 3e 6e 45 6e 74 72 79 54 6f 74 61 6c  OCD->nEntryTotal
6180: 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 31 36   = zipfileRead16
6190: 28 61 52 65 61 64 29 3b 0a 20 20 20 20 70 45 4f  (aRead);.    pEO
61a0: 43 44 2d 3e 6e 53 69 7a 65 20 3d 20 7a 69 70 66  CD->nSize = zipf
61b0: 69 6c 65 52 65 61 64 33 32 28 61 52 65 61 64 29  ileRead32(aRead)
61c0: 3b 0a 20 20 20 20 70 45 4f 43 44 2d 3e 69 4f 66  ;.    pEOCD->iOf
61d0: 66 73 65 74 20 3d 20 7a 69 70 66 69 6c 65 52 65  fset = zipfileRe
61e0: 61 64 33 32 28 61 52 65 61 64 29 3b 0a 0a 23 69  ad32(aRead);..#i
61f0: 66 20 30 0a 20 20 20 20 70 72 69 6e 74 66 28 22  f 0.    printf("
6200: 69 44 69 73 6b 3d 25 64 20 20 69 46 69 72 73 74  iDisk=%d  iFirst
6210: 44 69 73 6b 3d 25 64 20 20 6e 45 6e 74 72 79 3d  Disk=%d  nEntry=
6220: 25 64 20 20 22 0a 20 20 20 20 20 20 20 20 20 20  %d  ".          
6230: 20 22 6e 45 6e 74 72 79 54 6f 74 61 6c 3d 25 64   "nEntryTotal=%d
6240: 20 20 6e 53 69 7a 65 3d 25 64 20 20 69 4f 66 66    nSize=%d  iOff
6250: 73 65 74 3d 25 64 22 2c 20 0a 20 20 20 20 20 20  set=%d", .      
6260: 20 20 20 20 20 28 69 6e 74 29 70 45 4f 43 44 2d       (int)pEOCD-
6270: 3e 69 44 69 73 6b 2c 20 28 69 6e 74 29 70 45 4f  >iDisk, (int)pEO
6280: 43 44 2d 3e 69 46 69 72 73 74 44 69 73 6b 2c 20  CD->iFirstDisk, 
6290: 28 69 6e 74 29 70 45 4f 43 44 2d 3e 6e 45 6e 74  (int)pEOCD->nEnt
62a0: 72 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  ry,.           (
62b0: 69 6e 74 29 70 45 4f 43 44 2d 3e 6e 45 6e 74 72  int)pEOCD->nEntr
62c0: 79 54 6f 74 61 6c 2c 20 28 69 6e 74 29 70 45 4f  yTotal, (int)pEO
62d0: 43 44 2d 3e 6e 53 69 7a 65 2c 20 28 69 6e 74 29  CD->nSize, (int)
62e0: 70 45 4f 43 44 2d 3e 69 4f 66 66 73 65 74 0a 20  pEOCD->iOffset. 
62f0: 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d     );.#endif.  }
6300: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
6310: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78  E_OK;.}../*.** x
6320: 46 69 6c 74 65 72 20 63 61 6c 6c 62 61 63 6b 2e  Filter callback.
6330: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .*/.static int z
6340: 69 70 66 69 6c 65 46 69 6c 74 65 72 28 0a 20 20  ipfileFilter(.  
6350: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
6360: 73 6f 72 20 2a 63 75 72 2c 20 0a 20 20 69 6e 74  sor *cur, .  int
6370: 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63   idxNum, const c
6380: 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20 69  har *idxStr,.  i
6390: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
63a0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
63b0: 0a 20 20 5a 69 70 66 69 6c 65 54 61 62 20 2a 70  .  ZipfileTab *p
63c0: 54 61 62 20 3d 20 28 5a 69 70 66 69 6c 65 54 61  Tab = (ZipfileTa
63d0: 62 2a 29 63 75 72 2d 3e 70 56 74 61 62 3b 0a 20  b*)cur->pVtab;. 
63e0: 20 5a 69 70 66 69 6c 65 43 73 72 20 2a 70 43 73   ZipfileCsr *pCs
63f0: 72 20 3d 20 28 5a 69 70 66 69 6c 65 43 73 72 2a  r = (ZipfileCsr*
6400: 29 63 75 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68  )cur;.  const ch
6410: 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20  ar *zFile;      
6420: 20 20 20 20 20 20 20 20 2f 2a 20 5a 69 70 20 66          /* Zip f
6430: 69 6c 65 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20  ile to scan */. 
6440: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
6450: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
6460: 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
6470: 2a 2f 0a 0a 20 20 7a 69 70 66 69 6c 65 52 65 73  */..  zipfileRes
6480: 65 74 43 75 72 73 6f 72 28 70 43 73 72 29 3b 0a  etCursor(pCsr);.
6490: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 7a 46 69  .  if( pTab->zFi
64a0: 6c 65 20 29 7b 0a 20 20 20 20 7a 46 69 6c 65 20  le ){.    zFile 
64b0: 3d 20 70 54 61 62 2d 3e 7a 46 69 6c 65 3b 0a 20  = pTab->zFile;. 
64c0: 20 7d 65 6c 73 65 20 69 66 28 20 69 64 78 4e 75   }else if( idxNu
64d0: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45  m==0 ){.    /* E
64e0: 72 72 6f 72 2e 20 54 68 69 73 20 69 73 20 61 6e  rror. This is an
64f0: 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75   eponymous virtu
6500: 61 6c 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  al table and the
6510: 20 75 73 65 72 20 68 61 73 20 6e 6f 74 20 0a 20   user has not . 
6520: 20 20 20 2a 2a 20 73 75 70 70 6c 69 65 64 20 61     ** supplied a
6530: 20 66 69 6c 65 20 6e 61 6d 65 2e 20 2a 2f 0a 20   file name. */. 
6540: 20 20 20 7a 69 70 66 69 6c 65 53 65 74 45 72 72     zipfileSetErr
6550: 6d 73 67 28 70 43 73 72 2c 20 22 74 61 62 6c 65  msg(pCsr, "table
6560: 20 66 75 6e 63 74 69 6f 6e 20 7a 69 70 66 69 6c   function zipfil
6570: 65 28 29 20 72 65 71 75 69 72 65 73 20 61 6e 20  e() requires an 
6580: 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20  argument");.    
6590: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
65a0: 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ROR;.  }else{.  
65b0: 20 20 7a 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74    zFile = (const
65c0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
65d0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
65e0: 5d 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  ]);.  }..  if( p
65f0: 54 61 62 2d 3e 70 57 72 69 74 65 46 64 3d 3d 30  Tab->pWriteFd==0
6600: 20 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e 70 46   ){.    pCsr->pF
6610: 69 6c 65 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c  ile = fopen(zFil
6620: 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66  e, "rb");.    if
6630: 28 20 70 43 73 72 2d 3e 70 46 69 6c 65 3d 3d 30  ( pCsr->pFile==0
6640: 20 29 7b 0a 20 20 20 20 20 20 7a 69 70 66 69 6c   ){.      zipfil
6650: 65 53 65 74 45 72 72 6d 73 67 28 70 43 73 72 2c  eSetErrmsg(pCsr,
6660: 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69   "cannot open fi
6670: 6c 65 3a 20 25 73 22 2c 20 7a 46 69 6c 65 29 3b  le: %s", zFile);
6680: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
6690: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  TE_ERROR;.    }e
66a0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
66b0: 7a 69 70 66 69 6c 65 52 65 61 64 45 4f 43 44 28  zipfileReadEOCD(
66c0: 70 54 61 62 2c 20 70 43 73 72 2d 3e 70 46 69 6c  pTab, pCsr->pFil
66d0: 65 2c 20 26 70 43 73 72 2d 3e 65 6f 63 64 29 3b  e, &pCsr->eocd);
66e0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
66f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6700: 20 20 20 20 70 43 73 72 2d 3e 69 4e 65 78 74 4f      pCsr->iNextO
6710: 66 66 20 3d 20 70 43 73 72 2d 3e 65 6f 63 64 2e  ff = pCsr->eocd.
6720: 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  iOffset;.       
6730: 20 72 63 20 3d 20 7a 69 70 66 69 6c 65 4e 65 78   rc = zipfileNex
6740: 74 28 63 75 72 29 3b 0a 20 20 20 20 20 20 7d 65  t(cur);.      }e
6750: 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
6760: 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20  TE_EMPTY ){.    
6770: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6780: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72  OK;.        pCsr
6790: 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20  ->bEof = 1;.    
67a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
67b0: 65 7b 0a 20 20 20 20 5a 69 70 66 69 6c 65 45 6e  e{.    ZipfileEn
67c0: 74 72 79 20 65 3b 0a 20 20 20 20 6d 65 6d 73 65  try e;.    memse
67d0: 74 28 26 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&e, 0, sizeof(
67e0: 65 29 29 3b 0a 20 20 20 20 65 2e 70 4e 65 78 74  e));.    e.pNext
67f0: 20 3d 20 70 54 61 62 2d 3e 70 46 69 72 73 74 45   = pTab->pFirstE
6800: 6e 74 72 79 3b 0a 20 20 20 20 70 43 73 72 2d 3e  ntry;.    pCsr->
6810: 70 43 75 72 72 65 6e 74 20 3d 20 26 65 3b 0a 20  pCurrent = &e;. 
6820: 20 20 20 72 63 20 3d 20 7a 69 70 66 69 6c 65 4e     rc = zipfileN
6830: 65 78 74 28 63 75 72 29 3b 0a 20 20 20 20 61 73  ext(cur);.    as
6840: 73 65 72 74 28 20 70 43 73 72 2d 3e 70 43 75 72  sert( pCsr->pCur
6850: 72 65 6e 74 21 3d 26 65 20 29 3b 0a 20 20 7d 0a  rent!=&e );.  }.
6860: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6870: 0a 2f 2a 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65  ./*.** xBestInde
6880: 78 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  x callback..*/.s
6890: 74 61 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c  tatic int zipfil
68a0: 65 42 65 73 74 49 6e 64 65 78 28 0a 20 20 73 71  eBestIndex(.  sq
68b0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c  lite3_vtab *tab,
68c0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
68d0: 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 0a  _info *pIdxInfo.
68e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66  ){.  int i;..  f
68f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e  or(i=0; i<pIdxIn
6900: 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
6910: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
6920: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
6930: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
6940: 20 2a 70 43 6f 6e 73 20 3d 20 26 70 49 64 78 49   *pCons = &pIdxI
6950: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
6960: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  [i];.    if( pCo
6970: 6e 73 2d 3e 75 73 61 62 6c 65 3d 3d 30 20 29 20  ns->usable==0 ) 
6980: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
6990: 28 20 70 43 6f 6e 73 2d 3e 6f 70 21 3d 53 51 4c  ( pCons->op!=SQL
69a0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
69b0: 41 49 4e 54 5f 45 51 20 29 20 63 6f 6e 74 69 6e  AINT_EQ ) contin
69c0: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  ue;.    if( pCon
69d0: 73 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 5a 49 50 46  s->iColumn!=ZIPF
69e0: 49 4c 45 5f 46 5f 43 4f 4c 55 4d 4e 5f 49 44 58  ILE_F_COLUMN_IDX
69f0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6a00: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69   break;.  }..  i
6a10: 66 28 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  f( i<pIdxInfo->n
6a20: 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20  Constraint ){.  
6a30: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
6a40: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
6a50: 61 72 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20  argvIndex = 1;. 
6a60: 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f     pIdxInfo->aCo
6a70: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
6a80: 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 70  .omit = 1;.    p
6a90: 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
6aa0: 65 64 43 6f 73 74 20 3d 20 31 30 30 30 2e 30 3b  edCost = 1000.0;
6ab0: 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
6ac0: 64 78 4e 75 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c  dxNum = 1;.  }el
6ad0: 73 65 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f  se{.    pIdxInfo
6ae0: 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
6af0: 3d 20 28 64 6f 75 62 6c 65 29 28 28 28 73 71 6c  = (double)(((sql
6b00: 69 74 65 33 5f 69 6e 74 36 34 29 31 29 20 3c 3c  ite3_int64)1) <<
6b10: 20 35 30 29 3b 0a 20 20 20 20 70 49 64 78 49 6e   50);.    pIdxIn
6b20: 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a  fo->idxNum = 0;.
6b30: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
6b40: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6b50: 2a 20 41 64 64 20 6f 62 6a 65 63 74 20 70 4e 65  * Add object pNe
6b60: 77 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  w to the end of 
6b70: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
6b80: 74 68 61 74 20 62 65 67 69 6e 73 20 61 74 0a 2a  that begins at.*
6b90: 2a 20 5a 69 70 66 69 6c 65 54 61 62 2e 70 46 69  * ZipfileTab.pFi
6ba0: 72 73 74 45 6e 74 72 79 20 61 6e 64 20 65 6e 64  rstEntry and end
6bb0: 73 20 77 69 74 68 20 70 4c 61 73 74 45 6e 74 72  s with pLastEntr
6bc0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
6bd0: 64 20 7a 69 70 66 69 6c 65 41 64 64 45 6e 74 72  d zipfileAddEntr
6be0: 79 28 5a 69 70 66 69 6c 65 54 61 62 20 2a 70 54  y(ZipfileTab *pT
6bf0: 61 62 2c 20 5a 69 70 66 69 6c 65 45 6e 74 72 79  ab, ZipfileEntry
6c00: 20 2a 70 4e 65 77 29 7b 0a 20 20 61 73 73 65 72   *pNew){.  asser
6c10: 74 28 20 28 70 54 61 62 2d 3e 70 46 69 72 73 74  t( (pTab->pFirst
6c20: 45 6e 74 72 79 3d 3d 30 29 3d 3d 28 70 54 61 62  Entry==0)==(pTab
6c30: 2d 3e 70 4c 61 73 74 45 6e 74 72 79 3d 3d 30 29  ->pLastEntry==0)
6c40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e   );.  assert( pN
6c50: 65 77 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a  ew->pNext==0 );.
6c60: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 46 69 72    if( pTab->pFir
6c70: 73 74 45 6e 74 72 79 3d 3d 30 20 29 7b 0a 20 20  stEntry==0 ){.  
6c80: 20 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64 20 3d    pNew->iRowid =
6c90: 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70 46   1;.    pTab->pF
6ca0: 69 72 73 74 45 6e 74 72 79 20 3d 20 70 54 61 62  irstEntry = pTab
6cb0: 2d 3e 70 4c 61 73 74 45 6e 74 72 79 20 3d 20 70  ->pLastEntry = p
6cc0: 4e 65 77 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  New;.  }else{.  
6cd0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
6ce0: 70 4c 61 73 74 45 6e 74 72 79 2d 3e 70 4e 65 78  pLastEntry->pNex
6cf0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77  t==0 );.    pNew
6d00: 2d 3e 69 52 6f 77 69 64 20 3d 20 70 54 61 62 2d  ->iRowid = pTab-
6d10: 3e 70 4c 61 73 74 45 6e 74 72 79 2d 3e 69 52 6f  >pLastEntry->iRo
6d20: 77 69 64 2b 31 3b 0a 20 20 20 20 70 54 61 62 2d  wid+1;.    pTab-
6d30: 3e 70 4c 61 73 74 45 6e 74 72 79 2d 3e 70 4e 65  >pLastEntry->pNe
6d40: 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70  xt = pNew;.    p
6d50: 54 61 62 2d 3e 70 4c 61 73 74 45 6e 74 72 79 20  Tab->pLastEntry 
6d60: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 73  = pNew;.  }.}..s
6d70: 74 61 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c  tatic int zipfil
6d80: 65 4c 6f 61 64 44 69 72 65 63 74 6f 72 79 28 5a  eLoadDirectory(Z
6d90: 69 70 66 69 6c 65 54 61 62 20 2a 70 54 61 62 29  ipfileTab *pTab)
6da0: 7b 0a 20 20 5a 69 70 66 69 6c 65 45 4f 43 44 20  {.  ZipfileEOCD 
6db0: 65 6f 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  eocd;.  int rc;.
6dc0: 0a 20 20 72 63 20 3d 20 7a 69 70 66 69 6c 65 52  .  rc = zipfileR
6dd0: 65 61 64 45 4f 43 44 28 70 54 61 62 2c 20 70 54  eadEOCD(pTab, pT
6de0: 61 62 2d 3e 70 57 72 69 74 65 46 64 2c 20 26 65  ab->pWriteFd, &e
6df0: 6f 63 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ocd);.  if( rc==
6e00: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6e10: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
6e20: 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 75 38  iOff = 0;.    u8
6e30: 20 2a 61 42 75 66 20 3d 20 73 71 6c 69 74 65 33   *aBuf = sqlite3
6e40: 5f 6d 61 6c 6c 6f 63 28 65 6f 63 64 2e 6e 53 69  _malloc(eocd.nSi
6e50: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 61 42 75  ze);.    if( aBu
6e60: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  f==0 ){.      rc
6e70: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
6e80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6e90: 20 20 72 63 20 3d 20 7a 69 70 66 69 6c 65 52 65    rc = zipfileRe
6ea0: 61 64 44 61 74 61 28 0a 20 20 20 20 20 20 20 20  adData(.        
6eb0: 20 20 70 54 61 62 2d 3e 70 57 72 69 74 65 46 64    pTab->pWriteFd
6ec0: 2c 20 61 42 75 66 2c 20 65 6f 63 64 2e 6e 53 69  , aBuf, eocd.nSi
6ed0: 7a 65 2c 20 65 6f 63 64 2e 69 4f 66 66 73 65 74  ze, eocd.iOffset
6ee0: 2c 20 26 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45  , &pTab->base.zE
6ef0: 72 72 4d 73 67 0a 20 20 20 20 20 20 29 3b 0a 20  rrMsg.      );. 
6f00: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
6f10: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
6f20: 20 26 26 20 69 3c 65 6f 63 64 2e 6e 45 6e 74 72   && i<eocd.nEntr
6f30: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  y; i++){.      u
6f40: 31 36 20 6e 46 69 6c 65 3b 0a 20 20 20 20 20 20  16 nFile;.      
6f50: 75 31 36 20 6e 45 78 74 72 61 3b 0a 20 20 20 20  u16 nExtra;.    
6f60: 20 20 75 31 36 20 6e 43 6f 6d 6d 65 6e 74 3b 0a    u16 nComment;.
6f70: 20 20 20 20 20 20 5a 69 70 66 69 6c 65 45 6e 74        ZipfileEnt
6f80: 72 79 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  ry *pNew;.      
6f90: 75 38 20 2a 61 52 65 63 20 3d 20 26 61 42 75 66  u8 *aRec = &aBuf
6fa0: 5b 69 4f 66 66 5d 3b 0a 0a 20 20 20 20 20 20 6e  [iOff];..      n
6fb0: 46 69 6c 65 20 3d 20 7a 69 70 66 69 6c 65 47 65  File = zipfileGe
6fc0: 74 55 31 36 28 26 61 52 65 63 5b 5a 49 50 46 49  tU16(&aRec[ZIPFI
6fd0: 4c 45 5f 43 44 53 5f 4e 46 49 4c 45 5f 4f 46 46  LE_CDS_NFILE_OFF
6fe0: 5d 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  ]);.      nExtra
6ff0: 20 3d 20 7a 69 70 66 69 6c 65 47 65 74 55 31 36   = zipfileGetU16
7000: 28 26 61 52 65 63 5b 5a 49 50 46 49 4c 45 5f 43  (&aRec[ZIPFILE_C
7010: 44 53 5f 4e 46 49 4c 45 5f 4f 46 46 2b 32 5d 29  DS_NFILE_OFF+2])
7020: 3b 0a 20 20 20 20 20 20 6e 43 6f 6d 6d 65 6e 74  ;.      nComment
7030: 20 3d 20 7a 69 70 66 69 6c 65 47 65 74 55 31 36   = zipfileGetU16
7040: 28 26 61 52 65 63 5b 5a 49 50 46 49 4c 45 5f 43  (&aRec[ZIPFILE_C
7050: 44 53 5f 4e 46 49 4c 45 5f 4f 46 46 2b 34 5d 29  DS_NFILE_OFF+4])
7060: 3b 0a 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ;..      pNew = 
7070: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 0a  sqlite3_malloc(.
7080: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
7090: 28 5a 69 70 66 69 6c 65 45 6e 74 72 79 29 20 0a  (ZipfileEntry) .
70a0: 20 20 20 20 20 20 20 20 2b 20 6e 46 69 6c 65 2b          + nFile+
70b0: 31 20 0a 20 20 20 20 20 20 20 20 2b 20 5a 49 50  1 .        + ZIP
70c0: 46 49 4c 45 5f 43 44 53 5f 46 49 58 45 44 5f 53  FILE_CDS_FIXED_S
70d0: 5a 2b 6e 46 69 6c 65 2b 6e 45 78 74 72 61 2b 6e  Z+nFile+nExtra+n
70e0: 43 6f 6d 6d 65 6e 74 0a 20 20 20 20 20 20 29 3b  Comment.      );
70f0: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d  .      if( pNew=
7100: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
7110: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
7120: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7130: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65        memset(pNe
7140: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 5a 69 70  w, 0, sizeof(Zip
7150: 66 69 6c 65 45 6e 74 72 79 29 29 3b 0a 20 20 20  fileEntry));.   
7160: 20 20 20 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68       pNew->zPath
7170: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
7180: 31 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  1];.        memc
7190: 70 79 28 70 4e 65 77 2d 3e 7a 50 61 74 68 2c 20  py(pNew->zPath, 
71a0: 26 61 52 65 63 5b 5a 49 50 46 49 4c 45 5f 43 44  &aRec[ZIPFILE_CD
71b0: 53 5f 46 49 58 45 44 5f 53 5a 5d 2c 20 6e 46 69  S_FIXED_SZ], nFi
71c0: 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  le);.        pNe
71d0: 77 2d 3e 7a 50 61 74 68 5b 6e 46 69 6c 65 5d 20  w->zPath[nFile] 
71e0: 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
71f0: 70 4e 65 77 2d 3e 61 43 64 73 45 6e 74 72 79 20  pNew->aCdsEntry 
7200: 3d 20 28 75 38 2a 29 26 70 4e 65 77 2d 3e 7a 50  = (u8*)&pNew->zP
7210: 61 74 68 5b 6e 46 69 6c 65 2b 31 5d 3b 0a 20 20  ath[nFile+1];.  
7220: 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 43 64 73        pNew->nCds
7230: 45 6e 74 72 79 20 3d 20 5a 49 50 46 49 4c 45 5f  Entry = ZIPFILE_
7240: 43 44 53 5f 46 49 58 45 44 5f 53 5a 2b 6e 46 69  CDS_FIXED_SZ+nFi
7250: 6c 65 2b 6e 45 78 74 72 61 2b 6e 43 6f 6d 6d 65  le+nExtra+nComme
7260: 6e 74 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  nt;.        memc
7270: 70 79 28 70 4e 65 77 2d 3e 61 43 64 73 45 6e 74  py(pNew->aCdsEnt
7280: 72 79 2c 20 61 52 65 63 2c 20 70 4e 65 77 2d 3e  ry, aRec, pNew->
7290: 6e 43 64 73 45 6e 74 72 79 29 3b 0a 20 20 20 20  nCdsEntry);.    
72a0: 20 20 20 20 7a 69 70 66 69 6c 65 41 64 64 45 6e      zipfileAddEn
72b0: 74 72 79 28 70 54 61 62 2c 20 70 4e 65 77 29 3b  try(pTab, pNew);
72c0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
72d0: 69 4f 66 66 20 2b 3d 20 5a 49 50 46 49 4c 45 5f  iOff += ZIPFILE_
72e0: 43 44 53 5f 46 49 58 45 44 5f 53 5a 2b 6e 46 69  CDS_FIXED_SZ+nFi
72f0: 6c 65 2b 6e 45 78 74 72 61 2b 6e 43 6f 6d 6d 65  le+nExtra+nComme
7300: 6e 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  nt;.    }..    s
7310: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 42 75 66  qlite3_free(aBuf
7320: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  );.  }else if( r
7330: 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59 20  c==SQLITE_EMPTY 
7340: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
7350: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65  TE_OK;.  }..  re
7360: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
7370: 69 63 20 5a 69 70 66 69 6c 65 45 6e 74 72 79 20  ic ZipfileEntry 
7380: 2a 7a 69 70 66 69 6c 65 4e 65 77 45 6e 74 72 79  *zipfileNewEntry
7390: 28 0a 20 20 5a 69 70 66 69 6c 65 43 44 53 20 2a  (.  ZipfileCDS *
73a0: 70 43 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  pCds,           
73b0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 66 6f      /* Values fo
73c0: 72 20 66 69 78 65 64 20 73 69 7a 65 20 70 61 72  r fixed size par
73d0: 74 20 6f 66 20 43 44 53 20 2a 2f 0a 20 20 63 6f  t of CDS */.  co
73e0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7400: 20 50 61 74 68 20 66 6f 72 20 6e 65 77 20 65 6e   Path for new en
7410: 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  try */.  int nPa
7420: 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
7430: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 74 72 6c           /* strl
7440: 65 6e 28 7a 50 61 74 68 29 20 2a 2f 0a 20 20 75  en(zPath) */.  u
7450: 33 32 20 6d 54 69 6d 65 20 20 20 20 20 20 20 20  32 mTime        
7460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7470: 2a 20 4d 6f 64 69 66 69 63 61 74 69 6f 6e 20 74  * Modification t
7480: 69 6d 65 20 28 6f 72 20 30 29 20 2a 2f 0a 29 7b  ime (or 0) */.){
7490: 0a 20 20 75 38 20 2a 61 57 72 69 74 65 3b 0a 20  .  u8 *aWrite;. 
74a0: 20 5a 69 70 66 69 6c 65 45 6e 74 72 79 20 2a 70   ZipfileEntry *p
74b0: 4e 65 77 3b 0a 20 20 70 43 64 73 2d 3e 6e 46 69  New;.  pCds->nFi
74c0: 6c 65 20 3d 20 28 75 31 36 29 6e 50 61 74 68 3b  le = (u16)nPath;
74d0: 0a 20 20 70 43 64 73 2d 3e 6e 45 78 74 72 61 20  .  pCds->nExtra 
74e0: 3d 20 6d 54 69 6d 65 20 3f 20 39 20 3a 20 30 3b  = mTime ? 9 : 0;
74f0: 0a 20 20 70 4e 65 77 20 3d 20 28 5a 69 70 66 69  .  pNew = (Zipfi
7500: 6c 65 45 6e 74 72 79 2a 29 73 71 6c 69 74 65 33  leEntry*)sqlite3
7510: 5f 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 73 69 7a  _malloc(.    siz
7520: 65 6f 66 28 5a 69 70 66 69 6c 65 45 6e 74 72 79  eof(ZipfileEntry
7530: 29 20 2b 20 0a 20 20 20 20 6e 50 61 74 68 2b 31  ) + .    nPath+1
7540: 20 2b 20 0a 20 20 20 20 5a 49 50 46 49 4c 45 5f   + .    ZIPFILE_
7550: 43 44 53 5f 46 49 58 45 44 5f 53 5a 20 2b 20 6e  CDS_FIXED_SZ + n
7560: 50 61 74 68 20 2b 20 70 43 64 73 2d 3e 6e 45 78  Path + pCds->nEx
7570: 74 72 61 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  tra.  );..  if( 
7580: 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d 73  pNew ){.    mems
7590: 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
75a0: 6f 66 28 5a 69 70 66 69 6c 65 45 6e 74 72 79 29  of(ZipfileEntry)
75b0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 50 61  );.    pNew->zPa
75c0: 74 68 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  th = (char*)&pNe
75d0: 77 5b 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  w[1];.    pNew->
75e0: 61 43 64 73 45 6e 74 72 79 20 3d 20 28 75 38 2a  aCdsEntry = (u8*
75f0: 29 26 70 4e 65 77 2d 3e 7a 50 61 74 68 5b 6e 50  )&pNew->zPath[nP
7600: 61 74 68 2b 31 5d 3b 0a 20 20 20 20 70 4e 65 77  ath+1];.    pNew
7610: 2d 3e 6e 43 64 73 45 6e 74 72 79 20 3d 20 5a 49  ->nCdsEntry = ZI
7620: 50 46 49 4c 45 5f 43 44 53 5f 46 49 58 45 44 5f  PFILE_CDS_FIXED_
7630: 53 5a 20 2b 20 6e 50 61 74 68 20 2b 20 70 43 64  SZ + nPath + pCd
7640: 73 2d 3e 6e 45 78 74 72 61 3b 0a 20 20 20 20 6d  s->nExtra;.    m
7650: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 50 61 74  emcpy(pNew->zPat
7660: 68 2c 20 7a 50 61 74 68 2c 20 6e 50 61 74 68 2b  h, zPath, nPath+
7670: 31 29 3b 0a 0a 20 20 20 20 61 57 72 69 74 65 20  1);..    aWrite 
7680: 3d 20 70 4e 65 77 2d 3e 61 43 64 73 45 6e 74 72  = pNew->aCdsEntr
7690: 79 3b 0a 20 20 20 20 7a 69 70 66 69 6c 65 57 72  y;.    zipfileWr
76a0: 69 74 65 33 32 28 61 57 72 69 74 65 2c 20 5a 49  ite32(aWrite, ZI
76b0: 50 46 49 4c 45 5f 53 49 47 4e 41 54 55 52 45 5f  PFILE_SIGNATURE_
76c0: 43 44 53 29 3b 0a 20 20 20 20 7a 69 70 66 69 6c  CDS);.    zipfil
76d0: 65 57 72 69 74 65 31 36 28 61 57 72 69 74 65 2c  eWrite16(aWrite,
76e0: 20 70 43 64 73 2d 3e 69 56 65 72 73 69 6f 6e 4d   pCds->iVersionM
76f0: 61 64 65 42 79 29 3b 0a 20 20 20 20 7a 69 70 66  adeBy);.    zipf
7700: 69 6c 65 57 72 69 74 65 31 36 28 61 57 72 69 74  ileWrite16(aWrit
7710: 65 2c 20 70 43 64 73 2d 3e 69 56 65 72 73 69 6f  e, pCds->iVersio
7720: 6e 45 78 74 72 61 63 74 29 3b 0a 20 20 20 20 7a  nExtract);.    z
7730: 69 70 66 69 6c 65 57 72 69 74 65 31 36 28 61 57  ipfileWrite16(aW
7740: 72 69 74 65 2c 20 70 43 64 73 2d 3e 66 6c 61 67  rite, pCds->flag
7750: 73 29 3b 0a 20 20 20 20 7a 69 70 66 69 6c 65 57  s);.    zipfileW
7760: 72 69 74 65 31 36 28 61 57 72 69 74 65 2c 20 70  rite16(aWrite, p
7770: 43 64 73 2d 3e 69 43 6f 6d 70 72 65 73 73 69 6f  Cds->iCompressio
7780: 6e 29 3b 0a 20 20 20 20 7a 69 70 66 69 6c 65 57  n);.    zipfileW
7790: 72 69 74 65 31 36 28 61 57 72 69 74 65 2c 20 70  rite16(aWrite, p
77a0: 43 64 73 2d 3e 6d 54 69 6d 65 29 3b 0a 20 20 20  Cds->mTime);.   
77b0: 20 7a 69 70 66 69 6c 65 57 72 69 74 65 31 36 28   zipfileWrite16(
77c0: 61 57 72 69 74 65 2c 20 70 43 64 73 2d 3e 6d 44  aWrite, pCds->mD
77d0: 61 74 65 29 3b 0a 20 20 20 20 7a 69 70 66 69 6c  ate);.    zipfil
77e0: 65 57 72 69 74 65 33 32 28 61 57 72 69 74 65 2c  eWrite32(aWrite,
77f0: 20 70 43 64 73 2d 3e 63 72 63 33 32 29 3b 0a 20   pCds->crc32);. 
7800: 20 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65 33     zipfileWrite3
7810: 32 28 61 57 72 69 74 65 2c 20 70 43 64 73 2d 3e  2(aWrite, pCds->
7820: 73 7a 43 6f 6d 70 72 65 73 73 65 64 29 3b 0a 20  szCompressed);. 
7830: 20 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65 33     zipfileWrite3
7840: 32 28 61 57 72 69 74 65 2c 20 70 43 64 73 2d 3e  2(aWrite, pCds->
7850: 73 7a 55 6e 63 6f 6d 70 72 65 73 73 65 64 29 3b  szUncompressed);
7860: 0a 20 20 20 20 7a 69 70 66 69 6c 65 57 72 69 74  .    zipfileWrit
7870: 65 31 36 28 61 57 72 69 74 65 2c 20 70 43 64 73  e16(aWrite, pCds
7880: 2d 3e 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 69  ->nFile);.    zi
7890: 70 66 69 6c 65 57 72 69 74 65 31 36 28 61 57 72  pfileWrite16(aWr
78a0: 69 74 65 2c 20 70 43 64 73 2d 3e 6e 45 78 74 72  ite, pCds->nExtr
78b0: 61 29 3b 0a 20 20 20 20 7a 69 70 66 69 6c 65 57  a);.    zipfileW
78c0: 72 69 74 65 31 36 28 61 57 72 69 74 65 2c 20 70  rite16(aWrite, p
78d0: 43 64 73 2d 3e 6e 43 6f 6d 6d 65 6e 74 29 3b 20  Cds->nComment); 
78e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 64       assert( pCd
78f0: 73 2d 3e 6e 43 6f 6d 6d 65 6e 74 3d 3d 30 20 29  s->nComment==0 )
7900: 3b 0a 20 20 20 20 7a 69 70 66 69 6c 65 57 72 69  ;.    zipfileWri
7910: 74 65 31 36 28 61 57 72 69 74 65 2c 20 70 43 64  te16(aWrite, pCd
7920: 73 2d 3e 69 44 69 73 6b 53 74 61 72 74 29 3b 0a  s->iDiskStart);.
7930: 20 20 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65      zipfileWrite
7940: 31 36 28 61 57 72 69 74 65 2c 20 70 43 64 73 2d  16(aWrite, pCds-
7950: 3e 69 49 6e 74 65 72 6e 61 6c 41 74 74 72 29 3b  >iInternalAttr);
7960: 0a 20 20 20 20 7a 69 70 66 69 6c 65 57 72 69 74  .    zipfileWrit
7970: 65 33 32 28 61 57 72 69 74 65 2c 20 70 43 64 73  e32(aWrite, pCds
7980: 2d 3e 69 45 78 74 65 72 6e 61 6c 41 74 74 72 29  ->iExternalAttr)
7990: 3b 0a 20 20 20 20 7a 69 70 66 69 6c 65 57 72 69  ;.    zipfileWri
79a0: 74 65 33 32 28 61 57 72 69 74 65 2c 20 70 43 64  te32(aWrite, pCd
79b0: 73 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  s->iOffset);.   
79c0: 20 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3d   assert( aWrite=
79d0: 3d 26 70 4e 65 77 2d 3e 61 43 64 73 45 6e 74 72  =&pNew->aCdsEntr
79e0: 79 5b 5a 49 50 46 49 4c 45 5f 43 44 53 5f 46 49  y[ZIPFILE_CDS_FI
79f0: 58 45 44 5f 53 5a 5d 20 29 3b 0a 20 20 20 20 6d  XED_SZ] );.    m
7a00: 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 7a 50  emcpy(aWrite, zP
7a10: 61 74 68 2c 20 6e 50 61 74 68 29 3b 0a 20 20 20  ath, nPath);.   
7a20: 20 69 66 28 20 70 43 64 73 2d 3e 6e 45 78 74 72   if( pCds->nExtr
7a30: 61 20 29 7b 0a 20 20 20 20 20 20 61 57 72 69 74  a ){.      aWrit
7a40: 65 20 2b 3d 20 6e 50 61 74 68 3b 0a 20 20 20 20  e += nPath;.    
7a50: 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65 31 36    zipfileWrite16
7a60: 28 61 57 72 69 74 65 2c 20 5a 49 50 46 49 4c 45  (aWrite, ZIPFILE
7a70: 5f 45 58 54 52 41 5f 54 49 4d 45 53 54 41 4d 50  _EXTRA_TIMESTAMP
7a80: 29 3b 0a 20 20 20 20 20 20 7a 69 70 66 69 6c 65  );.      zipfile
7a90: 57 72 69 74 65 31 36 28 61 57 72 69 74 65 2c 20  Write16(aWrite, 
7aa0: 35 29 3b 0a 20 20 20 20 20 20 2a 61 57 72 69 74  5);.      *aWrit
7ab0: 65 2b 2b 20 3d 20 30 78 30 31 3b 0a 20 20 20 20  e++ = 0x01;.    
7ac0: 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65 33 32    zipfileWrite32
7ad0: 28 61 57 72 69 74 65 2c 20 6d 54 69 6d 65 29 3b  (aWrite, mTime);
7ae0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
7af0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 73 74  turn pNew;.}..st
7b00: 61 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c 65  atic int zipfile
7b10: 41 70 70 65 6e 64 45 6e 74 72 79 28 0a 20 20 5a  AppendEntry(.  Z
7b20: 69 70 66 69 6c 65 54 61 62 20 2a 70 54 61 62 2c  ipfileTab *pTab,
7b30: 0a 20 20 5a 69 70 66 69 6c 65 43 44 53 20 2a 70  .  ZipfileCDS *p
7b40: 43 64 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Cds,.  const cha
7b50: 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
7b60: 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 66         /* Path f
7b70: 6f 72 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  or new entry */.
7b80: 20 20 69 6e 74 20 6e 50 61 74 68 2c 20 20 20 20    int nPath,    
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ba0: 20 20 2f 2a 20 73 74 72 6c 65 6e 28 7a 50 61 74    /* strlen(zPat
7bb0: 68 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  h) */.  const u8
7bc0: 20 2a 70 44 61 74 61 2c 0a 20 20 69 6e 74 20 6e   *pData,.  int n
7bd0: 44 61 74 61 2c 0a 20 20 75 33 32 20 6d 54 69 6d  Data,.  u32 mTim
7be0: 65 0a 29 7b 0a 20 20 75 38 20 2a 61 42 75 66 20  e.){.  u8 *aBuf 
7bf0: 3d 20 70 54 61 62 2d 3e 61 42 75 66 66 65 72 3b  = pTab->aBuffer;
7c00: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 7a 69  .  int rc;..  zi
7c10: 70 66 69 6c 65 57 72 69 74 65 33 32 28 61 42 75  pfileWrite32(aBu
7c20: 66 2c 20 5a 49 50 46 49 4c 45 5f 53 49 47 4e 41  f, ZIPFILE_SIGNA
7c30: 54 55 52 45 5f 4c 46 48 29 3b 0a 20 20 7a 69 70  TURE_LFH);.  zip
7c40: 66 69 6c 65 57 72 69 74 65 31 36 28 61 42 75 66  fileWrite16(aBuf
7c50: 2c 20 70 43 64 73 2d 3e 69 56 65 72 73 69 6f 6e  , pCds->iVersion
7c60: 45 78 74 72 61 63 74 29 3b 0a 20 20 7a 69 70 66  Extract);.  zipf
7c70: 69 6c 65 57 72 69 74 65 31 36 28 61 42 75 66 2c  ileWrite16(aBuf,
7c80: 20 70 43 64 73 2d 3e 66 6c 61 67 73 29 3b 0a 20   pCds->flags);. 
7c90: 20 7a 69 70 66 69 6c 65 57 72 69 74 65 31 36 28   zipfileWrite16(
7ca0: 61 42 75 66 2c 20 70 43 64 73 2d 3e 69 43 6f 6d  aBuf, pCds->iCom
7cb0: 70 72 65 73 73 69 6f 6e 29 3b 0a 20 20 7a 69 70  pression);.  zip
7cc0: 66 69 6c 65 57 72 69 74 65 31 36 28 61 42 75 66  fileWrite16(aBuf
7cd0: 2c 20 70 43 64 73 2d 3e 6d 54 69 6d 65 29 3b 0a  , pCds->mTime);.
7ce0: 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65 31 36    zipfileWrite16
7cf0: 28 61 42 75 66 2c 20 70 43 64 73 2d 3e 6d 44 61  (aBuf, pCds->mDa
7d00: 74 65 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72  te);.  zipfileWr
7d10: 69 74 65 33 32 28 61 42 75 66 2c 20 70 43 64 73  ite32(aBuf, pCds
7d20: 2d 3e 63 72 63 33 32 29 3b 0a 20 20 7a 69 70 66  ->crc32);.  zipf
7d30: 69 6c 65 57 72 69 74 65 33 32 28 61 42 75 66 2c  ileWrite32(aBuf,
7d40: 20 70 43 64 73 2d 3e 73 7a 43 6f 6d 70 72 65 73   pCds->szCompres
7d50: 73 65 64 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57  sed);.  zipfileW
7d60: 72 69 74 65 33 32 28 61 42 75 66 2c 20 70 43 64  rite32(aBuf, pCd
7d70: 73 2d 3e 73 7a 55 6e 63 6f 6d 70 72 65 73 73 65  s->szUncompresse
7d80: 64 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72 69  d);.  zipfileWri
7d90: 74 65 31 36 28 61 42 75 66 2c 20 28 75 31 36 29  te16(aBuf, (u16)
7da0: 6e 50 61 74 68 29 3b 0a 20 20 7a 69 70 66 69 6c  nPath);.  zipfil
7db0: 65 57 72 69 74 65 31 36 28 61 42 75 66 2c 20 70  eWrite16(aBuf, p
7dc0: 43 64 73 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  Cds->nExtra);.  
7dd0: 61 73 73 65 72 74 28 20 61 42 75 66 3d 3d 26 70  assert( aBuf==&p
7de0: 54 61 62 2d 3e 61 42 75 66 66 65 72 5b 5a 49 50  Tab->aBuffer[ZIP
7df0: 46 49 4c 45 5f 4c 46 48 5f 46 49 58 45 44 5f 53  FILE_LFH_FIXED_S
7e00: 5a 5d 20 29 3b 0a 20 20 72 63 20 3d 20 7a 69 70  Z] );.  rc = zip
7e10: 66 69 6c 65 41 70 70 65 6e 64 44 61 74 61 28 70  fileAppendData(p
7e20: 54 61 62 2c 20 70 54 61 62 2d 3e 61 42 75 66 66  Tab, pTab->aBuff
7e30: 65 72 2c 20 28 69 6e 74 29 28 61 42 75 66 20 2d  er, (int)(aBuf -
7e40: 20 70 54 61 62 2d 3e 61 42 75 66 66 65 72 29 29   pTab->aBuffer))
7e50: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
7e60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
7e70: 3d 20 7a 69 70 66 69 6c 65 41 70 70 65 6e 64 44  = zipfileAppendD
7e80: 61 74 61 28 70 54 61 62 2c 20 28 63 6f 6e 73 74  ata(pTab, (const
7e90: 20 75 38 2a 29 7a 50 61 74 68 2c 20 6e 50 61 74   u8*)zPath, nPat
7ea0: 68 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  h);.  }..  if( r
7eb0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
7ec0: 70 43 64 73 2d 3e 6e 45 78 74 72 61 20 29 7b 0a  pCds->nExtra ){.
7ed0: 20 20 20 20 61 42 75 66 20 3d 20 70 54 61 62 2d      aBuf = pTab-
7ee0: 3e 61 42 75 66 66 65 72 3b 0a 20 20 20 20 7a 69  >aBuffer;.    zi
7ef0: 70 66 69 6c 65 57 72 69 74 65 31 36 28 61 42 75  pfileWrite16(aBu
7f00: 66 2c 20 5a 49 50 46 49 4c 45 5f 45 58 54 52 41  f, ZIPFILE_EXTRA
7f10: 5f 54 49 4d 45 53 54 41 4d 50 29 3b 0a 20 20 20  _TIMESTAMP);.   
7f20: 20 7a 69 70 66 69 6c 65 57 72 69 74 65 31 36 28   zipfileWrite16(
7f30: 61 42 75 66 2c 20 35 29 3b 0a 20 20 20 20 2a 61  aBuf, 5);.    *a
7f40: 42 75 66 2b 2b 20 3d 20 30 78 30 31 3b 0a 20 20  Buf++ = 0x01;.  
7f50: 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65 33 32    zipfileWrite32
7f60: 28 61 42 75 66 2c 20 6d 54 69 6d 65 29 3b 0a 20  (aBuf, mTime);. 
7f70: 20 20 20 72 63 20 3d 20 7a 69 70 66 69 6c 65 41     rc = zipfileA
7f80: 70 70 65 6e 64 44 61 74 61 28 70 54 61 62 2c 20  ppendData(pTab, 
7f90: 70 54 61 62 2d 3e 61 42 75 66 66 65 72 2c 20 39  pTab->aBuffer, 9
7fa0: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
7fb0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7fc0: 20 20 20 72 63 20 3d 20 7a 69 70 66 69 6c 65 41     rc = zipfileA
7fd0: 70 70 65 6e 64 44 61 74 61 28 70 54 61 62 2c 20  ppendData(pTab, 
7fe0: 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20  pData, nData);. 
7ff0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
8000: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .}..static int z
8010: 69 70 66 69 6c 65 47 65 74 4d 6f 64 65 28 0a 20  ipfileGetMode(. 
8020: 20 5a 69 70 66 69 6c 65 54 61 62 20 2a 70 54 61   ZipfileTab *pTa
8030: 62 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  b, .  sqlite3_va
8040: 6c 75 65 20 2a 70 56 61 6c 2c 20 0a 20 20 75 33  lue *pVal, .  u3
8050: 32 20 64 65 66 61 75 6c 74 4d 6f 64 65 2c 20 20  2 defaultMode,  
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8070: 20 56 61 6c 75 65 20 74 6f 20 75 73 65 20 69 66   Value to use if
8080: 20 70 56 61 6c 20 49 53 20 4e 55 4c 4c 20 2a 2f   pVal IS NULL */
8090: 0a 20 20 75 33 32 20 2a 70 4d 6f 64 65 0a 29 7b  .  u32 *pMode.){
80a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
80b0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
80c0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
80d0: 78 74 28 70 56 61 6c 29 3b 0a 20 20 75 33 32 20  xt(pVal);.  u32 
80e0: 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  mode = 0;.  if( 
80f0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65  z==0 ){.    mode
8100: 20 3d 20 64 65 66 61 75 6c 74 4d 6f 64 65 3b 0a   = defaultMode;.
8110: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d    }else if( z[0]
8120: 3e 3d 30 20 26 26 20 7a 5b 30 5d 3c 3d 39 20 29  >=0 && z[0]<=9 )
8130: 7b 0a 20 20 20 20 6d 6f 64 65 20 3d 20 28 75 6e  {.    mode = (un
8140: 73 69 67 6e 65 64 20 69 6e 74 29 73 71 6c 69 74  signed int)sqlit
8150: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56 61  e3_value_int(pVa
8160: 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
8170: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 54 65 6d   const char zTem
8180: 70 6c 61 74 65 5b 31 31 5d 20 3d 20 22 2d 72 77  plate[11] = "-rw
8190: 78 72 77 78 72 77 78 22 3b 0a 20 20 20 20 69 6e  xrwxrwx";.    in
81a0: 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73 74 72  t i;.    if( str
81b0: 6c 65 6e 28 7a 29 21 3d 31 30 20 29 20 67 6f 74  len(z)!=10 ) got
81c0: 6f 20 70 61 72 73 65 5f 65 72 72 6f 72 3b 0a 20  o parse_error;. 
81d0: 20 20 20 73 77 69 74 63 68 28 20 7a 5b 30 5d 20     switch( z[0] 
81e0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 27 2d  ){.      case '-
81f0: 27 3a 20 6d 6f 64 65 20 7c 3d 20 53 5f 49 46 52  ': mode |= S_IFR
8200: 45 47 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  EG; break;.     
8210: 20 63 61 73 65 20 27 64 27 3a 20 6d 6f 64 65 20   case 'd': mode 
8220: 7c 3d 20 53 5f 49 46 44 49 52 3b 20 62 72 65 61  |= S_IFDIR; brea
8230: 6b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  k;.#if !defined(
8240: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
8250: 6e 65 64 28 57 49 4e 33 32 29 0a 20 20 20 20 20  ned(WIN32).     
8260: 20 63 61 73 65 20 27 6c 27 3a 20 6d 6f 64 65 20   case 'l': mode 
8270: 7c 3d 20 53 5f 49 46 4c 4e 4b 3b 20 62 72 65 61  |= S_IFLNK; brea
8280: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  k;.#endif.      
8290: 64 65 66 61 75 6c 74 3a 20 67 6f 74 6f 20 70 61  default: goto pa
82a0: 72 73 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  rse_error;.    }
82b0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
82c0: 31 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  10; i++){.      
82d0: 69 66 28 20 7a 5b 69 5d 3d 3d 7a 54 65 6d 70 6c  if( z[i]==zTempl
82e0: 61 74 65 5b 69 5d 20 29 20 6d 6f 64 65 20 7c 3d  ate[i] ) mode |=
82f0: 20 31 20 3c 3c 20 28 39 2d 69 29 3b 0a 20 20 20   1 << (9-i);.   
8300: 20 20 20 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d     else if( z[i]
8310: 21 3d 27 2d 27 20 29 20 67 6f 74 6f 20 70 61 72  !='-' ) goto par
8320: 73 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  se_error;.    }.
8330: 20 20 7d 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 6d    }.  *pMode = m
8340: 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ode;.  return SQ
8350: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 70 61 72 73 65  LITE_OK;.. parse
8360: 5f 65 72 72 6f 72 3a 0a 20 20 70 54 61 62 2d 3e  _error:.  pTab->
8370: 62 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73  base.zErrMsg = s
8380: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
8390: 7a 69 70 66 69 6c 65 3a 20 70 61 72 73 65 20 65  zipfile: parse e
83a0: 72 72 6f 72 20 69 6e 20 6d 6f 64 65 3a 20 25 73  rror in mode: %s
83b0: 22 2c 20 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ", z);.  return 
83c0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a  SQLITE_ERROR;.}.
83d0: 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 28 63 6f 6e  ./*.** Both (con
83e0: 73 74 20 63 68 61 72 2a 29 20 61 72 67 75 6d 65  st char*) argume
83f0: 6e 74 73 20 70 6f 69 6e 74 20 74 6f 20 6e 75 6c  nts point to nul
8400: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
8410: 6e 67 73 2e 20 41 72 67 75 6d 65 6e 74 0a 2a 2a  ngs. Argument.**
8420: 20 6e 42 20 69 73 20 74 68 65 20 76 61 6c 75 65   nB is the value
8430: 20 6f 66 20 73 74 72 6c 65 6e 28 7a 42 29 2e 20   of strlen(zB). 
8440: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
8450: 74 75 72 6e 73 20 30 20 69 66 20 74 68 65 20 73  turns 0 if the s
8460: 74 72 69 6e 67 73 20 61 72 65 0a 2a 2a 20 69 64  trings are.** id
8470: 65 6e 74 69 63 61 6c 2c 20 69 67 6e 6f 72 69 6e  entical, ignorin
8480: 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 27  g any trailing '
8490: 2f 27 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  /' character in 
84a0: 65 69 74 68 65 72 20 70 61 74 68 2e 20 20 2a 2f  either path.  */
84b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 69 70 66  .static int zipf
84c0: 69 6c 65 43 6f 6d 70 61 72 65 50 61 74 68 28 63  ileComparePath(c
84d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 63  onst char *zA, c
84e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 2c 20 69  onst char *zB, i
84f0: 6e 74 20 6e 42 29 7b 0a 20 20 69 6e 74 20 6e 41  nt nB){.  int nA
8500: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
8510: 41 29 3b 0a 20 20 69 66 28 20 7a 41 5b 6e 41 2d  A);.  if( zA[nA-
8520: 31 5d 3d 3d 27 2f 27 20 29 20 6e 41 2d 2d 3b 0a  1]=='/' ) nA--;.
8530: 20 20 69 66 28 20 7a 42 5b 6e 42 2d 31 5d 3d 3d    if( zB[nB-1]==
8540: 27 2f 27 20 29 20 6e 42 2d 2d 3b 0a 20 20 69 66  '/' ) nB--;.  if
8550: 28 20 6e 41 3d 3d 6e 42 20 26 26 20 6d 65 6d 63  ( nA==nB && memc
8560: 6d 70 28 7a 41 2c 20 7a 42 2c 20 6e 41 29 3d 3d  mp(zA, zB, nA)==
8570: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
8580: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
8590: 2a 2a 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f  ** xUpdate metho
85a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
85b0: 20 7a 69 70 66 69 6c 65 55 70 64 61 74 65 28 0a   zipfileUpdate(.
85c0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
85d0: 70 56 74 61 62 2c 20 0a 20 20 69 6e 74 20 6e 56  pVtab, .  int nV
85e0: 61 6c 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  al, .  sqlite3_v
85f0: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 0a 20  alue **apVal, . 
8600: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
8610: 52 6f 77 69 64 0a 29 7b 0a 20 20 5a 69 70 66 69  Rowid.){.  Zipfi
8620: 6c 65 54 61 62 20 2a 70 54 61 62 20 3d 20 28 5a  leTab *pTab = (Z
8630: 69 70 66 69 6c 65 54 61 62 2a 29 70 56 74 61 62  ipfileTab*)pVtab
8640: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
8650: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
8660: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
8670: 64 65 20 2a 2f 0a 20 20 5a 69 70 66 69 6c 65 45  de */.  ZipfileE
8680: 6e 74 72 79 20 2a 70 4e 65 77 20 3d 20 30 3b 20  ntry *pNew = 0; 
8690: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 69          /* New i
86a0: 6e 2d 6d 65 6d 6f 72 79 20 43 44 53 20 65 6e 74  n-memory CDS ent
86b0: 72 79 20 2a 2f 0a 0a 20 20 75 33 32 20 6d 6f 64  ry */..  u32 mod
86c0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
86d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 65           /* Mode
86e0: 20 66 6f 72 20 6e 65 77 20 65 6e 74 72 79 20 2a   for new entry *
86f0: 2f 0a 20 20 69 36 34 20 6d 54 69 6d 65 20 3d 20  /.  i64 mTime = 
8700: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
8710: 20 20 20 20 2f 2a 20 4d 6f 64 69 66 69 63 61 74      /* Modificat
8720: 69 6f 6e 20 74 69 6d 65 20 66 6f 72 20 6e 65 77  ion time for new
8730: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 36 34 20   entry */.  i64 
8740: 73 7a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sz = 0;         
8750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
8760: 6e 63 6f 6d 70 72 65 73 73 65 64 20 73 69 7a 65  ncompressed size
8770: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
8780: 20 2a 7a 50 61 74 68 20 3d 20 30 3b 20 20 20 20   *zPath = 0;    
8790: 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 66 6f        /* Path fo
87a0: 72 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20  r new entry */. 
87b0: 20 69 6e 74 20 6e 50 61 74 68 20 3d 20 30 3b 20   int nPath = 0; 
87c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87d0: 20 2f 2a 20 73 74 72 6c 65 6e 28 7a 50 61 74 68   /* strlen(zPath
87e0: 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  ) */.  const u8 
87f0: 2a 70 44 61 74 61 20 3d 20 30 3b 20 20 20 20 20  *pData = 0;     
8800: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
8810: 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74  r to buffer cont
8820: 61 69 6e 69 6e 67 20 63 6f 6e 74 65 6e 74 20 2a  aining content *
8830: 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 20 3d 20  /.  int nData = 
8840: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
8850: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70      /* Size of p
8860: 44 61 74 61 20 62 75 66 66 65 72 20 69 6e 20 62  Data buffer in b
8870: 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  ytes */.  int iM
8880: 65 74 68 6f 64 20 3d 20 30 3b 20 20 20 20 20 20  ethod = 0;      
8890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
88a0: 70 72 65 73 73 69 6f 6e 20 6d 65 74 68 6f 64 20  pression method 
88b0: 66 6f 72 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  for new entry */
88c0: 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30  .  u8 *pFree = 0
88d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
88e0: 20 20 20 2f 2a 20 46 72 65 65 20 74 68 69 73 20     /* Free this 
88f0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 72 65 65  */.  char *zFree
8900: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
8910: 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 66 72 65       /* Also fre
8920: 65 20 74 68 69 73 20 2a 2f 0a 20 20 5a 69 70 66  e this */.  Zipf
8930: 69 6c 65 43 44 53 20 63 64 73 3b 20 20 20 20 20  ileCDS cds;     
8940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8950: 65 77 20 43 65 6e 74 72 61 6c 20 44 69 72 65 63  ew Central Direc
8960: 74 6f 72 79 20 53 74 72 75 63 74 75 72 65 20 65  tory Structure e
8970: 6e 74 72 79 20 2a 2f 0a 0a 20 20 69 6e 74 20 62  ntry */..  int b
8980: 49 73 44 69 72 20 3d 20 30 3b 0a 0a 20 20 69 6e  IsDir = 0;..  in
8990: 74 20 6d 4e 75 6c 6c 3b 0a 0a 20 20 61 73 73 65  t mNull;..  asse
89a0: 72 74 28 20 70 54 61 62 2d 3e 7a 46 69 6c 65 20  rt( pTab->zFile 
89b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
89c0: 62 2d 3e 70 57 72 69 74 65 46 64 20 29 3b 0a 0a  b->pWriteFd );..
89d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
89e0: 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 30  lue_type(apVal[0
89f0: 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])!=SQLITE_NULL 
8a00: 29 7b 0a 20 20 20 20 69 66 28 20 6e 56 61 6c 3e  ){.    if( nVal>
8a10: 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1 ){.      retur
8a20: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
8a30: 49 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  INT;.    }else{.
8a40: 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 65 74        i64 iDelet
8a50: 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
8a60: 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d  e_int64(apVal[0]
8a70: 29 3b 0a 20 20 20 20 20 20 5a 69 70 66 69 6c 65  );.      Zipfile
8a80: 45 6e 74 72 79 20 2a 70 3b 0a 20 20 20 20 20 20  Entry *p;.      
8a90: 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70 46 69 72  for(p=pTab->pFir
8aa0: 73 74 45 6e 74 72 79 3b 20 70 3b 20 70 3d 70 2d  stEntry; p; p=p-
8ab0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
8ac0: 20 69 66 28 20 70 2d 3e 69 52 6f 77 69 64 3d 3d   if( p->iRowid==
8ad0: 69 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  iDelete ){.     
8ae0: 20 20 20 20 20 70 2d 3e 62 44 65 6c 65 74 65 64       p->bDeleted
8af0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
8b00: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
8b10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
8b20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8b30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d 4e  .    }.  }..  mN
8b40: 75 6c 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 76  ull = (sqlite3_v
8b50: 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b  alue_type(apVal[
8b60: 35 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  5])==SQLITE_NULL
8b70: 20 3f 20 30 78 30 20 3a 20 30 78 38 29 20 20 2f   ? 0x0 : 0x8)  /
8b80: 2a 20 73 7a 20 2a 2f 0a 20 20 20 20 20 20 20 20  * sz */.        
8b90: 2b 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  + (sqlite3_value
8ba0: 5f 74 79 70 65 28 61 70 56 61 6c 5b 36 5d 29 3d  _type(apVal[6])=
8bb0: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 3f 20 30  =SQLITE_NULL ? 0
8bc0: 78 30 20 3a 20 30 78 34 29 20 20 2f 2a 20 72 61  x0 : 0x4)  /* ra
8bd0: 77 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 20  wdata */.       
8be0: 20 2b 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75   + (sqlite3_valu
8bf0: 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 37 5d 29  e_type(apVal[7])
8c00: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 3f 20  ==SQLITE_NULL ? 
8c10: 30 78 30 20 3a 20 30 78 32 29 20 20 2f 2a 20 64  0x0 : 0x2)  /* d
8c20: 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20 2b  ata */.        +
8c30: 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
8c40: 74 79 70 65 28 61 70 56 61 6c 5b 38 5d 29 3d 3d  type(apVal[8])==
8c50: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 3f 20 30 78  SQLITE_NULL ? 0x
8c60: 30 20 3a 20 30 78 31 29 3b 20 2f 2a 20 6d 65 74  0 : 0x1); /* met
8c70: 68 6f 64 20 2a 2f 0a 20 20 69 66 28 20 6d 4e 75  hod */.  if( mNu
8c80: 6c 6c 3d 3d 30 78 30 30 20 29 7b 20 20 20 20 20  ll==0x00 ){     
8c90: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 6f 75 72  .    /* All four
8ca0: 20 61 72 65 20 4e 55 4c 4c 20 2d 20 74 68 69 73   are NULL - this
8cb0: 20 6d 75 73 74 20 62 65 20 61 20 64 69 72 65 63   must be a direc
8cc0: 74 6f 72 79 20 2a 2f 0a 20 20 20 20 62 49 73 44  tory */.    bIsD
8cd0: 69 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 65 6c  ir = 1;.  }.  el
8ce0: 73 65 20 69 66 28 20 6d 4e 75 6c 6c 3d 3d 30 78  se if( mNull==0x
8cf0: 32 20 7c 7c 20 6d 4e 75 6c 6c 3d 3d 30 78 33 20  2 || mNull==0x3 
8d00: 29 7b 0a 20 20 20 20 2f 2a 20 56 61 6c 75 65 20  ){.    /* Value 
8d10: 73 70 65 63 69 66 69 65 64 20 66 6f 72 20 22 64  specified for "d
8d20: 61 74 61 22 2c 20 61 6e 64 20 70 6f 73 73 69 62  ata", and possib
8d30: 6c 79 20 22 6d 65 74 68 6f 64 22 2e 20 54 68 69  ly "method". Thi
8d40: 73 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a  s must be.    **
8d50: 20 61 20 72 65 67 75 6c 61 72 20 66 69 6c 65 20   a regular file 
8d60: 6f 72 20 61 20 73 79 6d 6c 69 6e 6b 2e 20 2a 2f  or a symlink. */
8d70: 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  .    const u8 *a
8d80: 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  In = sqlite3_val
8d90: 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 37 5d  ue_blob(apVal[7]
8da0: 29 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d  );.    int nIn =
8db0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
8dc0: 79 74 65 73 28 61 70 56 61 6c 5b 37 5d 29 3b 0a  ytes(apVal[7]);.
8dd0: 20 20 20 20 69 6e 74 20 62 41 75 74 6f 20 3d 20      int bAuto = 
8de0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
8df0: 70 65 28 61 70 56 61 6c 5b 38 5d 29 3d 3d 53 51  pe(apVal[8])==SQ
8e00: 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20 0a  LITE_NULL;.    .
8e10: 20 20 20 20 69 4d 65 74 68 6f 64 20 3d 20 73 71      iMethod = sq
8e20: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
8e30: 61 70 56 61 6c 5b 38 5d 29 3b 0a 20 20 20 20 73  apVal[8]);.    s
8e40: 7a 20 3d 20 6e 49 6e 3b 0a 20 20 20 20 69 66 28  z = nIn;.    if(
8e50: 20 69 4d 65 74 68 6f 64 21 3d 30 20 26 26 20 69   iMethod!=0 && i
8e60: 4d 65 74 68 6f 64 21 3d 38 20 29 7b 0a 20 20 20  Method!=8 ){.   
8e70: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
8e80: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d  ONSTRAINT;.    }
8e90: 65 6c 73 65 20 69 66 28 20 62 41 75 74 6f 20 7c  else if( bAuto |
8ea0: 7c 20 69 4d 65 74 68 6f 64 20 29 7b 0a 20 20 20  | iMethod ){.   
8eb0: 20 20 20 72 63 20 3d 20 7a 69 70 66 69 6c 65 44     rc = zipfileD
8ec0: 65 66 6c 61 74 65 28 70 54 61 62 2c 20 61 49 6e  eflate(pTab, aIn
8ed0: 2c 20 6e 49 6e 2c 20 26 70 46 72 65 65 2c 20 26  , nIn, &pFree, &
8ee0: 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66  nData);.      if
8ef0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8f00: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
8f10: 4d 65 74 68 6f 64 20 7c 7c 20 6e 44 61 74 61 3c  Method || nData<
8f20: 6e 49 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nIn ){.         
8f30: 20 69 4d 65 74 68 6f 64 20 3d 20 38 3b 0a 20 20   iMethod = 8;.  
8f40: 20 20 20 20 20 20 20 20 70 44 61 74 61 20 3d 20          pData = 
8f50: 70 46 72 65 65 3b 0a 20 20 20 20 20 20 20 20 7d  pFree;.        }
8f60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
8f70: 70 44 61 74 61 20 3d 20 61 49 6e 3b 0a 20 20 20  pData = aIn;.   
8f80: 20 20 20 20 20 20 20 6e 44 61 74 61 20 3d 20 6e         nData = n
8f90: 49 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  In;.        }.  
8fa0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8fb0: 20 20 65 6c 73 65 20 69 66 28 20 6d 4e 75 6c 6c    else if( mNull
8fc0: 3d 3d 30 78 30 44 20 29 7b 0a 20 20 20 20 2f 2a  ==0x0D ){.    /*
8fd0: 20 56 61 6c 75 65 73 20 73 70 65 63 69 66 69 65   Values specifie
8fe0: 64 20 66 6f 72 20 22 73 7a 22 2c 20 22 72 61 77  d for "sz", "raw
8ff0: 64 61 74 61 22 20 61 6e 64 20 22 6d 65 74 68 6f  data" and "metho
9000: 64 22 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  d". In other wor
9010: 64 73 2c 0a 20 20 20 20 2a 2a 20 70 72 65 2d 63  ds,.    ** pre-c
9020: 6f 6d 70 72 65 73 73 65 64 20 64 61 74 61 20 69  ompressed data i
9030: 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  s being inserted
9040: 2e 20 20 2a 2f 0a 20 20 20 20 70 44 61 74 61 20  .  */.    pData 
9050: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
9060: 62 6c 6f 62 28 61 70 56 61 6c 5b 36 5d 29 3b 0a  blob(apVal[6]);.
9070: 20 20 20 20 6e 44 61 74 61 20 3d 20 73 71 6c 69      nData = sqli
9080: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
9090: 61 70 56 61 6c 5b 36 5d 29 3b 0a 20 20 20 20 73  apVal[6]);.    s
90a0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
90b0: 65 5f 69 6e 74 28 61 70 56 61 6c 5b 35 5d 29 3b  e_int(apVal[5]);
90c0: 0a 20 20 20 20 69 4d 65 74 68 6f 64 20 3d 20 73  .    iMethod = s
90d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
90e0: 28 61 70 56 61 6c 5b 38 5d 29 3b 0a 20 20 20 20  (apVal[8]);.    
90f0: 69 66 28 20 69 4d 65 74 68 6f 64 3c 30 20 7c 7c  if( iMethod<0 ||
9100: 20 69 4d 65 74 68 6f 64 3e 36 35 35 33 35 20 29   iMethod>65535 )
9110: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 62 61  {.      pTab->ba
9120: 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  se.zErrMsg = sql
9130: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
9140: 20 20 20 20 20 20 20 20 22 7a 69 70 66 69 6c 65          "zipfile
9150: 3a 20 69 6e 76 61 6c 69 64 20 63 6f 6d 70 72 65  : invalid compre
9160: 73 73 69 6f 6e 20 6d 65 74 68 6f 64 3a 20 25 64  ssion method: %d
9170: 22 2c 20 69 4d 65 74 68 6f 64 0a 20 20 20 20 20  ", iMethod.     
9180: 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   );.      rc = S
9190: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
91a0: 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20   }.  }.  else{. 
91b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
91c0: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 7d 0a 0a  ONSTRAINT;.  }..
91d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
91e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
91f0: 7a 69 70 66 69 6c 65 47 65 74 4d 6f 64 65 28 70  zipfileGetMode(p
9200: 54 61 62 2c 20 61 70 56 61 6c 5b 33 5d 2c 20 0a  Tab, apVal[3], .
9210: 20 20 20 20 20 20 20 20 28 62 49 73 44 69 72 20          (bIsDir 
9220: 3f 20 28 53 5f 49 46 44 49 52 20 2b 20 30 37 35  ? (S_IFDIR + 075
9230: 35 29 20 3a 20 28 53 5f 49 46 52 45 47 20 2b 20  5) : (S_IFREG + 
9240: 30 36 34 34 29 29 2c 20 26 6d 6f 64 65 0a 20 20  0644)), &mode.  
9250: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d    );.    if( rc=
9260: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 62  =SQLITE_OK && (b
9270: 49 73 44 69 72 20 3d 3d 20 28 28 6d 6f 64 65 20  IsDir == ((mode 
9280: 26 20 53 5f 49 46 44 49 52 29 3d 3d 30 29 29 20  & S_IFDIR)==0)) 
9290: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
92a0: 22 6d 6f 64 65 22 20 61 74 74 72 69 62 75 74 65  "mode" attribute
92b0: 20 69 73 20 61 20 64 69 72 65 63 74 6f 72 79 2c   is a directory,
92c0: 20 62 75 74 20 64 61 74 61 20 68 61 73 20 62 65   but data has be
92d0: 65 6e 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20  en specified..  
92e0: 20 20 20 20 2a 2a 20 4f 72 20 76 69 63 65 2d 76      ** Or vice-v
92f0: 65 72 73 61 20 2d 20 6e 6f 20 64 61 74 61 20 62  ersa - no data b
9300: 75 74 20 22 6d 6f 64 65 22 20 69 73 20 61 20 66  ut "mode" is a f
9310: 69 6c 65 20 6f 72 20 73 79 6d 6c 69 6e 6b 2e 20  ile or symlink. 
9320: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
9330: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
9340: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
9350: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9360: 20 29 7b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20   ){.    zPath = 
9370: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
9380: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
9390: 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 20 20 6e  apVal[2]);.    n
93a0: 50 61 74 68 20 3d 20 28 69 6e 74 29 73 74 72 6c  Path = (int)strl
93b0: 65 6e 28 7a 50 61 74 68 29 3b 0a 20 20 20 20 69  en(zPath);.    i
93c0: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
93d0: 5f 74 79 70 65 28 61 70 56 61 6c 5b 34 5d 29 3d  _type(apVal[4])=
93e0: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a  =SQLITE_NULL ){.
93f0: 20 20 20 20 20 20 6d 54 69 6d 65 20 3d 20 28 73        mTime = (s
9400: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 74 69 6d  qlite3_int64)tim
9410: 65 28 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(0);.    }else{
9420: 0a 20 20 20 20 20 20 6d 54 69 6d 65 20 3d 20 73  .      mTime = s
9430: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
9440: 36 34 28 61 70 56 61 6c 5b 34 5d 29 3b 0a 20 20  64(apVal[4]);.  
9450: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
9460: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
9470: 62 49 73 44 69 72 20 29 7b 0a 20 20 20 20 2f 2a  bIsDir ){.    /*
9480: 20 46 6f 72 20 61 20 64 69 72 65 63 74 6f 72 79   For a directory
9490: 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
94a0: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
94b0: 69 6e 20 74 68 65 20 70 61 74 68 20 69 73 20 61  in the path is a
94c0: 0a 20 20 20 20 2a 2a 20 27 2f 27 2e 20 54 68 69  .    ** '/'. Thi
94d0: 73 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  s appears to be 
94e0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
94f0: 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
9500: 69 6e 66 6f 2d 7a 69 70 0a 20 20 20 20 2a 2a 20  info-zip.    ** 
9510: 28 74 68 65 20 75 6e 7a 69 70 20 63 6f 6d 6d 61  (the unzip comma
9520: 6e 64 20 6f 6e 20 75 6e 69 78 29 2e 20 49 74 20  nd on unix). It 
9530: 64 6f 65 73 20 6e 6f 74 20 63 72 65 61 74 65 20  does not create 
9540: 64 69 72 65 63 74 6f 72 69 65 73 0a 20 20 20 20  directories.    
9550: 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 20 20 2a  ** otherwise.  *
9560: 2f 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 5b  /.    if( zPath[
9570: 6e 50 61 74 68 2d 31 5d 21 3d 27 2f 27 20 29 7b  nPath-1]!='/' ){
9580: 0a 20 20 20 20 20 20 7a 46 72 65 65 20 3d 20 73  .      zFree = s
9590: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
95a0: 25 73 2f 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  %s/", zPath);.  
95b0: 20 20 20 20 69 66 28 20 7a 46 72 65 65 3d 3d 30      if( zFree==0
95c0: 20 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f   ){ rc = SQLITE_
95d0: 4e 4f 4d 45 4d 3b 20 7d 0a 20 20 20 20 20 20 7a  NOMEM; }.      z
95e0: 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68  Path = (const ch
95f0: 61 72 2a 29 7a 46 72 65 65 3b 0a 20 20 20 20 20  ar*)zFree;.     
9600: 20 6e 50 61 74 68 2b 2b 3b 0a 20 20 20 20 7d 0a   nPath++;.    }.
9610: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
9620: 74 68 61 74 20 77 65 27 72 65 20 6e 6f 74 20 69  that we're not i
9630: 6e 73 65 72 74 69 6e 67 20 61 20 64 75 70 6c 69  nserting a dupli
9640: 63 61 74 65 20 65 6e 74 72 79 20 2a 2f 0a 20 20  cate entry */.  
9650: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9660: 4b 20 29 7b 0a 20 20 20 20 5a 69 70 66 69 6c 65  K ){.    Zipfile
9670: 45 6e 74 72 79 20 2a 70 3b 0a 20 20 20 20 66 6f  Entry *p;.    fo
9680: 72 28 70 3d 70 54 61 62 2d 3e 70 46 69 72 73 74  r(p=pTab->pFirst
9690: 45 6e 74 72 79 3b 20 70 3b 20 70 3d 70 2d 3e 70  Entry; p; p=p->p
96a0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
96b0: 20 7a 69 70 66 69 6c 65 43 6f 6d 70 61 72 65 50   zipfileCompareP
96c0: 61 74 68 28 70 2d 3e 7a 50 61 74 68 2c 20 7a 50  ath(p->zPath, zP
96d0: 61 74 68 2c 20 6e 50 61 74 68 29 3d 3d 30 20 29  ath, nPath)==0 )
96e0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
96f0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
9700: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9710: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9720: 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
9730: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
9740: 2a 20 43 72 65 61 74 65 20 74 68 65 20 6e 65 77  * Create the new
9750: 20 43 44 53 20 72 65 63 6f 72 64 2e 20 2a 2f 0a   CDS record. */.
9760: 20 20 20 20 6d 65 6d 73 65 74 28 26 63 64 73 2c      memset(&cds,
9770: 20 30 2c 20 73 69 7a 65 6f 66 28 63 64 73 29 29   0, sizeof(cds))
9780: 3b 0a 20 20 20 20 63 64 73 2e 69 56 65 72 73 69  ;.    cds.iVersi
9790: 6f 6e 4d 61 64 65 42 79 20 3d 20 5a 49 50 46 49  onMadeBy = ZIPFI
97a0: 4c 45 5f 4e 45 57 45 4e 54 52 59 5f 4d 41 44 45  LE_NEWENTRY_MADE
97b0: 42 59 3b 0a 20 20 20 20 63 64 73 2e 69 56 65 72  BY;.    cds.iVer
97c0: 73 69 6f 6e 45 78 74 72 61 63 74 20 3d 20 5a 49  sionExtract = ZI
97d0: 50 46 49 4c 45 5f 4e 45 57 45 4e 54 52 59 5f 52  PFILE_NEWENTRY_R
97e0: 45 51 55 49 52 45 44 3b 0a 20 20 20 20 63 64 73  EQUIRED;.    cds
97f0: 2e 66 6c 61 67 73 20 3d 20 5a 49 50 46 49 4c 45  .flags = ZIPFILE
9800: 5f 4e 45 57 45 4e 54 52 59 5f 46 4c 41 47 53 3b  _NEWENTRY_FLAGS;
9810: 0a 20 20 20 20 63 64 73 2e 69 43 6f 6d 70 72 65  .    cds.iCompre
9820: 73 73 69 6f 6e 20 3d 20 28 75 31 36 29 69 4d 65  ssion = (u16)iMe
9830: 74 68 6f 64 3b 0a 20 20 20 20 7a 69 70 66 69 6c  thod;.    zipfil
9840: 65 4d 74 69 6d 65 54 6f 44 6f 73 28 26 63 64 73  eMtimeToDos(&cds
9850: 2c 20 28 75 33 32 29 6d 54 69 6d 65 29 3b 0a 20  , (u32)mTime);. 
9860: 20 20 20 63 64 73 2e 63 72 63 33 32 20 3d 20 63     cds.crc32 = c
9870: 72 63 33 32 28 30 2c 20 70 44 61 74 61 2c 20 6e  rc32(0, pData, n
9880: 44 61 74 61 29 3b 0a 20 20 20 20 63 64 73 2e 73  Data);.    cds.s
9890: 7a 43 6f 6d 70 72 65 73 73 65 64 20 3d 20 6e 44  zCompressed = nD
98a0: 61 74 61 3b 0a 20 20 20 20 63 64 73 2e 73 7a 55  ata;.    cds.szU
98b0: 6e 63 6f 6d 70 72 65 73 73 65 64 20 3d 20 28 75  ncompressed = (u
98c0: 33 32 29 73 7a 3b 0a 20 20 20 20 63 64 73 2e 69  32)sz;.    cds.i
98d0: 45 78 74 65 72 6e 61 6c 41 74 74 72 20 3d 20 28  ExternalAttr = (
98e0: 6d 6f 64 65 3c 3c 31 36 29 3b 0a 20 20 20 20 63  mode<<16);.    c
98f0: 64 73 2e 69 4f 66 66 73 65 74 20 3d 20 28 75 33  ds.iOffset = (u3
9900: 32 29 70 54 61 62 2d 3e 73 7a 43 75 72 72 65 6e  2)pTab->szCurren
9910: 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 7a 69  t;.    pNew = zi
9920: 70 66 69 6c 65 4e 65 77 45 6e 74 72 79 28 26 63  pfileNewEntry(&c
9930: 64 73 2c 20 7a 50 61 74 68 2c 20 6e 50 61 74 68  ds, zPath, nPath
9940: 2c 20 28 75 33 32 29 6d 54 69 6d 65 29 3b 0a 20  , (u32)mTime);. 
9950: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
9960: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
9970: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
9980: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 69 70 66  else{.      zipf
9990: 69 6c 65 41 64 64 45 6e 74 72 79 28 70 54 61 62  ileAddEntry(pTab
99a0: 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 20  , pNew);.    }. 
99b0: 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20   }..  /* Append 
99c0: 74 68 65 20 6e 65 77 20 68 65 61 64 65 72 2b 66  the new header+f
99d0: 69 6c 65 20 74 6f 20 74 68 65 20 61 72 63 68 69  ile to the archi
99e0: 76 65 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  ve */.  if( rc==
99f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9a00: 20 72 63 20 3d 20 7a 69 70 66 69 6c 65 41 70 70   rc = zipfileApp
9a10: 65 6e 64 45 6e 74 72 79 28 70 54 61 62 2c 20 26  endEntry(pTab, &
9a20: 63 64 73 2c 20 7a 50 61 74 68 2c 20 6e 50 61 74  cds, zPath, nPat
9a30: 68 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c  h, pData, nData,
9a40: 20 28 75 33 32 29 6d 54 69 6d 65 29 3b 0a 20 20   (u32)mTime);.  
9a50: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  }..  sqlite3_fre
9a60: 65 28 70 46 72 65 65 29 3b 0a 20 20 73 71 6c 69  e(pFree);.  sqli
9a70: 74 65 33 5f 66 72 65 65 28 7a 46 72 65 65 29 3b  te3_free(zFree);
9a80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9a90: 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 69 70 66  .static int zipf
9aa0: 69 6c 65 41 70 70 65 6e 64 45 4f 43 44 28 5a 69  ileAppendEOCD(Zi
9ab0: 70 66 69 6c 65 54 61 62 20 2a 70 54 61 62 2c 20  pfileTab *pTab, 
9ac0: 5a 69 70 66 69 6c 65 45 4f 43 44 20 2a 70 29 7b  ZipfileEOCD *p){
9ad0: 0a 20 20 75 38 20 2a 61 42 75 66 20 3d 20 70 54  .  u8 *aBuf = pT
9ae0: 61 62 2d 3e 61 42 75 66 66 65 72 3b 0a 0a 20 20  ab->aBuffer;..  
9af0: 7a 69 70 66 69 6c 65 57 72 69 74 65 33 32 28 61  zipfileWrite32(a
9b00: 42 75 66 2c 20 5a 49 50 46 49 4c 45 5f 53 49 47  Buf, ZIPFILE_SIG
9b10: 4e 41 54 55 52 45 5f 45 4f 43 44 29 3b 0a 20 20  NATURE_EOCD);.  
9b20: 7a 69 70 66 69 6c 65 57 72 69 74 65 31 36 28 61  zipfileWrite16(a
9b30: 42 75 66 2c 20 70 2d 3e 69 44 69 73 6b 29 3b 0a  Buf, p->iDisk);.
9b40: 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65 31 36    zipfileWrite16
9b50: 28 61 42 75 66 2c 20 70 2d 3e 69 46 69 72 73 74  (aBuf, p->iFirst
9b60: 44 69 73 6b 29 3b 0a 20 20 7a 69 70 66 69 6c 65  Disk);.  zipfile
9b70: 57 72 69 74 65 31 36 28 61 42 75 66 2c 20 70 2d  Write16(aBuf, p-
9b80: 3e 6e 45 6e 74 72 79 29 3b 0a 20 20 7a 69 70 66  >nEntry);.  zipf
9b90: 69 6c 65 57 72 69 74 65 31 36 28 61 42 75 66 2c  ileWrite16(aBuf,
9ba0: 20 70 2d 3e 6e 45 6e 74 72 79 54 6f 74 61 6c 29   p->nEntryTotal)
9bb0: 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65  ;.  zipfileWrite
9bc0: 33 32 28 61 42 75 66 2c 20 70 2d 3e 6e 53 69 7a  32(aBuf, p->nSiz
9bd0: 65 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72 69  e);.  zipfileWri
9be0: 74 65 33 32 28 61 42 75 66 2c 20 70 2d 3e 69 4f  te32(aBuf, p->iO
9bf0: 66 66 73 65 74 29 3b 0a 20 20 7a 69 70 66 69 6c  ffset);.  zipfil
9c00: 65 57 72 69 74 65 31 36 28 61 42 75 66 2c 20 30  eWrite16(aBuf, 0
9c10: 29 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  );        /* Siz
9c20: 65 20 6f 66 20 74 72 61 69 6c 69 6e 67 20 63 6f  e of trailing co
9c30: 6d 6d 65 6e 74 20 69 6e 20 62 79 74 65 73 2a 2f  mment in bytes*/
9c40: 0a 0a 20 20 61 73 73 65 72 74 28 20 28 61 42 75  ..  assert( (aBu
9c50: 66 2d 70 54 61 62 2d 3e 61 42 75 66 66 65 72 29  f-pTab->aBuffer)
9c60: 3d 3d 32 32 20 29 3b 0a 20 20 72 65 74 75 72 6e  ==22 );.  return
9c70: 20 7a 69 70 66 69 6c 65 41 70 70 65 6e 64 44 61   zipfileAppendDa
9c80: 74 61 28 70 54 61 62 2c 20 70 54 61 62 2d 3e 61  ta(pTab, pTab->a
9c90: 42 75 66 66 65 72 2c 20 28 69 6e 74 29 28 61 42  Buffer, (int)(aB
9ca0: 75 66 20 2d 20 70 54 61 62 2d 3e 61 42 75 66 66  uf - pTab->aBuff
9cb0: 65 72 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  er));.}..static 
9cc0: 76 6f 69 64 20 7a 69 70 66 69 6c 65 43 6c 65 61  void zipfileClea
9cd0: 6e 75 70 54 72 61 6e 73 61 63 74 69 6f 6e 28 5a  nupTransaction(Z
9ce0: 69 70 66 69 6c 65 54 61 62 20 2a 70 54 61 62 29  ipfileTab *pTab)
9cf0: 7b 0a 20 20 5a 69 70 66 69 6c 65 45 6e 74 72 79  {.  ZipfileEntry
9d00: 20 2a 70 45 6e 74 72 79 3b 0a 20 20 5a 69 70 66   *pEntry;.  Zipf
9d10: 69 6c 65 45 6e 74 72 79 20 2a 70 4e 65 78 74 3b  ileEntry *pNext;
9d20: 0a 0a 20 20 66 6f 72 28 70 45 6e 74 72 79 3d 70  ..  for(pEntry=p
9d30: 54 61 62 2d 3e 70 46 69 72 73 74 45 6e 74 72 79  Tab->pFirstEntry
9d40: 3b 20 70 45 6e 74 72 79 3b 20 70 45 6e 74 72 79  ; pEntry; pEntry
9d50: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
9d60: 78 74 20 3d 20 70 45 6e 74 72 79 2d 3e 70 4e 65  xt = pEntry->pNe
9d70: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
9d80: 66 72 65 65 28 70 45 6e 74 72 79 29 3b 0a 20 20  free(pEntry);.  
9d90: 7d 0a 20 20 70 54 61 62 2d 3e 70 46 69 72 73 74  }.  pTab->pFirst
9da0: 45 6e 74 72 79 20 3d 20 30 3b 0a 20 20 70 54 61  Entry = 0;.  pTa
9db0: 62 2d 3e 70 4c 61 73 74 45 6e 74 72 79 20 3d 20  b->pLastEntry = 
9dc0: 30 3b 0a 20 20 66 63 6c 6f 73 65 28 70 54 61 62  0;.  fclose(pTab
9dd0: 2d 3e 70 57 72 69 74 65 46 64 29 3b 0a 20 20 70  ->pWriteFd);.  p
9de0: 54 61 62 2d 3e 70 57 72 69 74 65 46 64 20 3d 20  Tab->pWriteFd = 
9df0: 30 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 43 75 72  0;.  pTab->szCur
9e00: 72 65 6e 74 20 3d 20 30 3b 0a 20 20 70 54 61 62  rent = 0;.  pTab
9e10: 2d 3e 73 7a 4f 72 69 67 20 3d 20 30 3b 0a 7d 0a  ->szOrig = 0;.}.
9e20: 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 69 70 66  .static int zipf
9e30: 69 6c 65 42 65 67 69 6e 28 73 71 6c 69 74 65 33  ileBegin(sqlite3
9e40: 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20  _vtab *pVtab){. 
9e50: 20 5a 69 70 66 69 6c 65 54 61 62 20 2a 70 54 61   ZipfileTab *pTa
9e60: 62 20 3d 20 28 5a 69 70 66 69 6c 65 54 61 62 2a  b = (ZipfileTab*
9e70: 29 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63  )pVtab;.  int rc
9e80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
9e90: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70   assert( pTab->p
9ea0: 57 72 69 74 65 46 64 3d 3d 30 20 29 3b 0a 0a 20  WriteFd==0 );.. 
9eb0: 20 2f 2a 20 54 68 69 73 20 74 61 62 6c 65 20 69   /* This table i
9ec0: 73 20 6f 6e 6c 79 20 77 72 69 74 61 62 6c 65 20  s only writable 
9ed0: 69 66 20 61 20 64 65 66 61 75 6c 74 20 61 72 63  if a default arc
9ee0: 68 69 76 65 20 70 61 74 68 20 77 61 73 20 73 70  hive path was sp
9ef0: 65 63 69 66 69 65 64 20 0a 20 20 2a 2a 20 61 73  ecified .  ** as
9f00: 20 70 61 72 74 20 6f 66 20 74 68 65 20 43 52 45   part of the CRE
9f10: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
9f20: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a  E statement. */.
9f30: 20 20 69 66 28 20 70 54 61 62 2d 3e 7a 46 69 6c    if( pTab->zFil
9f40: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62  e==0 ){.    pTab
9f50: 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d  ->base.zErrMsg =
9f60: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9f70: 28 0a 20 20 20 20 20 20 20 20 22 7a 69 70 66 69  (.        "zipfi
9f80: 6c 65 3a 20 77 72 69 74 69 6e 67 20 72 65 71 75  le: writing requ
9f90: 69 72 65 73 20 61 20 64 65 66 61 75 6c 74 20 61  ires a default a
9fa0: 72 63 68 69 76 65 22 0a 20 20 20 20 29 3b 0a 20  rchive".    );. 
9fb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9fc0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
9fd0: 2a 20 4f 70 65 6e 20 61 20 77 72 69 74 65 20 66  * Open a write f
9fe0: 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 41  d on the file. A
9ff0: 6c 73 6f 20 6c 6f 61 64 20 74 68 65 20 65 6e 74  lso load the ent
a000: 69 72 65 20 63 65 6e 74 72 61 6c 20 64 69 72 65  ire central dire
a010: 63 74 6f 72 79 0a 20 20 2a 2a 20 73 74 72 75 63  ctory.  ** struc
a020: 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  ture into memory
a030: 2e 20 44 75 72 69 6e 67 20 74 68 65 20 74 72 61  . During the tra
a040: 6e 73 61 63 74 69 6f 6e 20 61 6e 79 20 6e 65 77  nsaction any new
a050: 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 0a 20   file data is . 
a060: 20 2a 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20   ** appended to 
a070: 74 68 65 20 61 72 63 68 69 76 65 20 66 69 6c 65  the archive file
a080: 2c 20 62 75 74 20 74 68 65 20 63 65 6e 74 72 61  , but the centra
a090: 6c 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 61  l directory is a
a0a0: 63 63 75 6d 75 6c 61 74 65 64 0a 20 20 2a 2a 20  ccumulated.  ** 
a0b0: 69 6e 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 75  in main-memory u
a0c0: 6e 74 69 6c 20 74 68 65 20 74 72 61 6e 73 61 63  ntil the transac
a0d0: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
a0e0: 64 2e 20 20 2a 2f 0a 20 20 70 54 61 62 2d 3e 70  d.  */.  pTab->p
a0f0: 57 72 69 74 65 46 64 20 3d 20 66 6f 70 65 6e 28  WriteFd = fopen(
a100: 70 54 61 62 2d 3e 7a 46 69 6c 65 2c 20 22 61 62  pTab->zFile, "ab
a110: 2b 22 29 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  +");.  if( pTab-
a120: 3e 70 57 72 69 74 65 46 64 3d 3d 30 20 29 7b 0a  >pWriteFd==0 ){.
a130: 20 20 20 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a      pTab->base.z
a140: 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
a150: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
a160: 20 20 22 7a 69 70 66 69 6c 65 3a 20 66 61 69 6c    "zipfile: fail
a170: 65 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20  ed to open file 
a180: 25 73 20 66 6f 72 20 77 72 69 74 69 6e 67 22 2c  %s for writing",
a190: 20 70 54 61 62 2d 3e 7a 46 69 6c 65 0a 20 20 20   pTab->zFile.   
a1a0: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   );.    rc = SQL
a1b0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  ITE_ERROR;.  }el
a1c0: 73 65 7b 0a 20 20 20 20 66 73 65 65 6b 28 70 54  se{.    fseek(pT
a1d0: 61 62 2d 3e 70 57 72 69 74 65 46 64 2c 20 30 2c  ab->pWriteFd, 0,
a1e0: 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 20 20   SEEK_END);.    
a1f0: 70 54 61 62 2d 3e 73 7a 43 75 72 72 65 6e 74 20  pTab->szCurrent 
a200: 3d 20 70 54 61 62 2d 3e 73 7a 4f 72 69 67 20 3d  = pTab->szOrig =
a210: 20 28 69 36 34 29 66 74 65 6c 6c 28 70 54 61 62   (i64)ftell(pTab
a220: 2d 3e 70 57 72 69 74 65 46 64 29 3b 0a 20 20 20  ->pWriteFd);.   
a230: 20 72 63 20 3d 20 7a 69 70 66 69 6c 65 4c 6f 61   rc = zipfileLoa
a240: 64 44 69 72 65 63 74 6f 72 79 28 70 54 61 62 29  dDirectory(pTab)
a250: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  ;.  }..  if( rc!
a260: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a270: 20 20 7a 69 70 66 69 6c 65 43 6c 65 61 6e 75 70    zipfileCleanup
a280: 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 54 61 62  Transaction(pTab
a290: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
a2a0: 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
a2b0: 6e 74 20 7a 69 70 66 69 6c 65 43 6f 6d 6d 69 74  nt zipfileCommit
a2c0: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70  (sqlite3_vtab *p
a2d0: 56 74 61 62 29 7b 0a 20 20 5a 69 70 66 69 6c 65  Vtab){.  Zipfile
a2e0: 54 61 62 20 2a 70 54 61 62 20 3d 20 28 5a 69 70  Tab *pTab = (Zip
a2f0: 66 69 6c 65 54 61 62 2a 29 70 56 74 61 62 3b 0a  fileTab*)pVtab;.
a300: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
a310: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 54 61 62  E_OK;.  if( pTab
a320: 2d 3e 70 57 72 69 74 65 46 64 20 29 7b 0a 20 20  ->pWriteFd ){.  
a330: 20 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20    i64 iOffset = 
a340: 70 54 61 62 2d 3e 73 7a 43 75 72 72 65 6e 74 3b  pTab->szCurrent;
a350: 0a 20 20 20 20 5a 69 70 66 69 6c 65 45 6e 74 72  .    ZipfileEntr
a360: 79 20 2a 70 3b 0a 20 20 20 20 5a 69 70 66 69 6c  y *p;.    Zipfil
a370: 65 45 4f 43 44 20 65 6f 63 64 3b 0a 20 20 20 20  eEOCD eocd;.    
a380: 69 6e 74 20 6e 45 6e 74 72 79 20 3d 20 30 3b 0a  int nEntry = 0;.
a390: 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75  .    /* Write ou
a3a0: 74 20 61 6c 6c 20 75 6e 64 65 6c 65 74 65 64 20  t all undeleted 
a3b0: 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 20 20 66  entries */.    f
a3c0: 6f 72 28 70 3d 70 54 61 62 2d 3e 70 46 69 72 73  or(p=pTab->pFirs
a3d0: 74 45 6e 74 72 79 3b 20 72 63 3d 3d 53 51 4c 49  tEntry; rc==SQLI
a3e0: 54 45 5f 4f 4b 20 26 26 20 70 3b 20 70 3d 70 2d  TE_OK && p; p=p-
a3f0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
a400: 66 28 20 70 2d 3e 62 44 65 6c 65 74 65 64 20 29  f( p->bDeleted )
a410: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
a420: 20 72 63 20 3d 20 7a 69 70 66 69 6c 65 41 70 70   rc = zipfileApp
a430: 65 6e 64 44 61 74 61 28 70 54 61 62 2c 20 70 2d  endData(pTab, p-
a440: 3e 61 43 64 73 45 6e 74 72 79 2c 20 70 2d 3e 6e  >aCdsEntry, p->n
a450: 43 64 73 45 6e 74 72 79 29 3b 0a 20 20 20 20 20  CdsEntry);.     
a460: 20 6e 45 6e 74 72 79 2b 2b 3b 0a 20 20 20 20 7d   nEntry++;.    }
a470: 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f  ..    /* Write o
a480: 75 74 20 74 68 65 20 45 4f 43 44 20 72 65 63 6f  ut the EOCD reco
a490: 72 64 20 2a 2f 0a 20 20 20 20 65 6f 63 64 2e 69  rd */.    eocd.i
a4a0: 44 69 73 6b 20 3d 20 30 3b 0a 20 20 20 20 65 6f  Disk = 0;.    eo
a4b0: 63 64 2e 69 46 69 72 73 74 44 69 73 6b 20 3d 20  cd.iFirstDisk = 
a4c0: 30 3b 0a 20 20 20 20 65 6f 63 64 2e 6e 45 6e 74  0;.    eocd.nEnt
a4d0: 72 79 20 3d 20 28 75 31 36 29 6e 45 6e 74 72 79  ry = (u16)nEntry
a4e0: 3b 0a 20 20 20 20 65 6f 63 64 2e 6e 45 6e 74 72  ;.    eocd.nEntr
a4f0: 79 54 6f 74 61 6c 20 3d 20 28 75 31 36 29 6e 45  yTotal = (u16)nE
a500: 6e 74 72 79 3b 0a 20 20 20 20 65 6f 63 64 2e 6e  ntry;.    eocd.n
a510: 53 69 7a 65 20 3d 20 28 75 33 32 29 28 70 54 61  Size = (u32)(pTa
a520: 62 2d 3e 73 7a 43 75 72 72 65 6e 74 20 2d 20 69  b->szCurrent - i
a530: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 65 6f 63  Offset);.    eoc
a540: 64 2e 69 4f 66 66 73 65 74 20 3d 20 28 75 33 32  d.iOffset = (u32
a550: 29 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 72 63  )iOffset;.    rc
a560: 20 3d 20 7a 69 70 66 69 6c 65 41 70 70 65 6e 64   = zipfileAppend
a570: 45 4f 43 44 28 70 54 61 62 2c 20 26 65 6f 63 64  EOCD(pTab, &eocd
a580: 29 3b 0a 0a 20 20 20 20 7a 69 70 66 69 6c 65 43  );..    zipfileC
a590: 6c 65 61 6e 75 70 54 72 61 6e 73 61 63 74 69 6f  leanupTransactio
a5a0: 6e 28 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 72  n(pTab);.  }.  r
a5b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
a5c0: 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c 65 52  tic int zipfileR
a5d0: 6f 6c 6c 62 61 63 6b 28 73 71 6c 69 74 65 33 5f  ollback(sqlite3_
a5e0: 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
a5f0: 72 65 74 75 72 6e 20 7a 69 70 66 69 6c 65 43 6f  return zipfileCo
a600: 6d 6d 69 74 28 70 56 74 61 62 29 3b 0a 7d 0a 0a  mmit(pVtab);.}..
a610: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74  /*.** Register t
a620: 68 65 20 22 7a 69 70 66 69 6c 65 22 20 76 69 72  he "zipfile" vir
a630: 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  tual table..*/.s
a640: 74 61 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c  tatic int zipfil
a650: 65 52 65 67 69 73 74 65 72 28 73 71 6c 69 74 65  eRegister(sqlite
a660: 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63  3 *db){.  static
a670: 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
a680: 7a 69 70 66 69 6c 65 4d 6f 64 75 6c 65 20 3d 20  zipfileModule = 
a690: 7b 0a 20 20 20 20 31 2c 20 20 20 20 20 20 20 20  {.    1,        
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6b0: 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
a6c0: 20 20 20 20 7a 69 70 66 69 6c 65 43 6f 6e 6e 65      zipfileConne
a6d0: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ct,            /
a6e0: 2a 20 78 43 72 65 61 74 65 20 2a 2f 0a 20 20 20  * xCreate */.   
a6f0: 20 7a 69 70 66 69 6c 65 43 6f 6e 6e 65 63 74 2c   zipfileConnect,
a700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
a710: 43 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 7a  Connect */.    z
a720: 69 70 66 69 6c 65 42 65 73 74 49 6e 64 65 78 2c  ipfileBestIndex,
a730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65            /* xBe
a740: 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7a  stIndex */.    z
a750: 69 70 66 69 6c 65 44 69 73 63 6f 6e 6e 65 63 74  ipfileDisconnect
a760: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 69  ,         /* xDi
a770: 73 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20  sconnect */.    
a780: 7a 69 70 66 69 6c 65 44 69 73 63 6f 6e 6e 65 63  zipfileDisconnec
a790: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  t,         /* xD
a7a0: 65 73 74 72 6f 79 20 2a 2f 0a 20 20 20 20 7a 69  estroy */.    zi
a7b0: 70 66 69 6c 65 4f 70 65 6e 2c 20 20 20 20 20 20  pfileOpen,      
a7c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
a7d0: 6e 20 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f  n - open a curso
a7e0: 72 20 2a 2f 0a 20 20 20 20 7a 69 70 66 69 6c 65  r */.    zipfile
a7f0: 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
a800: 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20      /* xClose - 
a810: 63 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a  close a cursor *
a820: 2f 0a 20 20 20 20 7a 69 70 66 69 6c 65 46 69 6c  /.    zipfileFil
a830: 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
a840: 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f   /* xFilter - co
a850: 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e  nfigure scan con
a860: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
a870: 7a 69 70 66 69 6c 65 4e 65 78 74 2c 20 20 20 20  zipfileNext,    
a880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e             /* xN
a890: 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20  ext - advance a 
a8a0: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 7a 69  cursor */.    zi
a8b0: 70 66 69 6c 65 45 6f 66 2c 20 20 20 20 20 20 20  pfileEof,       
a8c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66           /* xEof
a8d0: 20 2d 20 63 68 65 63 6b 20 66 6f 72 20 65 6e 64   - check for end
a8e0: 20 6f 66 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20   of scan */.    
a8f0: 7a 69 70 66 69 6c 65 43 6f 6c 75 6d 6e 2c 20 20  zipfileColumn,  
a900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
a910: 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74  olumn - read dat
a920: 61 20 2a 2f 0a 20 20 20 20 7a 69 70 66 69 6c 65  a */.    zipfile
a930: 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20  Rowid,          
a940: 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20      /* xRowid - 
a950: 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 20  read data */.   
a960: 20 7a 69 70 66 69 6c 65 55 70 64 61 74 65 2c 20   zipfileUpdate, 
a970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
a980: 55 70 64 61 74 65 20 2a 2f 0a 20 20 20 20 7a 69  Update */.    zi
a990: 70 66 69 6c 65 42 65 67 69 6e 2c 20 20 20 20 20  pfileBegin,     
a9a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65 67           /* xBeg
a9b0: 69 6e 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  in */.    0,    
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9d0: 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f       /* xSync */
a9e0: 0a 20 20 20 20 7a 69 70 66 69 6c 65 43 6f 6d 6d  .    zipfileComm
a9f0: 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  it,             
aa00: 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20  /* xCommit */.  
aa10: 20 20 7a 69 70 66 69 6c 65 52 6f 6c 6c 62 61 63    zipfileRollbac
aa20: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  k,           /* 
aa30: 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 20  xRollback */.   
aa40: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
aa60: 46 69 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20  FindMethod */.  
aa70: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
aa90: 78 52 65 6e 61 6d 65 20 2a 2f 0a 20 20 7d 3b 0a  xRename */.  };.
aaa0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
aab0: 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c  te3_create_modul
aac0: 65 28 64 62 2c 20 22 7a 69 70 66 69 6c 65 22 20  e(db, "zipfile" 
aad0: 20 2c 20 26 7a 69 70 66 69 6c 65 4d 6f 64 75 6c   , &zipfileModul
aae0: 65 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  e, 0);.  return 
aaf0: 72 63 3b 0a 7d 0a 23 65 6c 73 65 20 20 20 20 20  rc;.}.#else     
ab00: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d      /* SQLITE_OM
ab10: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
ab20: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 7a 69 70 66  */.# define zipf
ab30: 69 6c 65 52 65 67 69 73 74 65 72 28 78 29 20 53  ileRegister(x) S
ab40: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
ab50: 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f  .#ifdef _WIN32._
ab60: 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70  _declspec(dllexp
ab70: 6f 72 74 29 0a 23 65 6e 64 69 66 0a 69 6e 74 20  ort).#endif.int 
ab80: 73 71 6c 69 74 65 33 5f 7a 69 70 66 69 6c 65 5f  sqlite3_zipfile_
ab90: 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65 33 20  init(.  sqlite3 
aba0: 2a 64 62 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70  *db, .  char **p
abb0: 7a 45 72 72 4d 73 67 2c 20 0a 20 20 63 6f 6e 73  zErrMsg, .  cons
abc0: 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
abd0: 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a  utines *pApi.){.
abe0: 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49    SQLITE_EXTENSI
abf0: 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 3b 0a  ON_INIT2(pApi);.
ac00: 20 20 28 76 6f 69 64 29 70 7a 45 72 72 4d 73 67    (void)pzErrMsg
ac10: 3b 20 20 2f 2a 20 55 6e 75 73 65 64 20 70 61 72  ;  /* Unused par
ac20: 61 6d 65 74 65 72 20 2a 2f 0a 20 20 72 65 74 75  ameter */.  retu
ac30: 72 6e 20 7a 69 70 66 69 6c 65 52 65 67 69 73 74  rn zipfileRegist
ac40: 65 72 28 64 62 29 3b 0a 7d 0a                    er(db);.}.