/ Hex Artifact Content
Login

Artifact f7f8e69ea2e3ae35d12504d4a217d4428877d10c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 41 70 72 69 6c  /*.** 2008 April
0010: 20 31 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75   10.**.** The au
0020: 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63  thor disclaims c
0030: 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73  opyright to this
0040: 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49   source code.  I
0050: 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20  n place of.** a 
0060: 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65  legal notice, he
0070: 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67  re is a blessing
0080: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79  :.**.**    May y
0090: 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e  ou do good and n
00a0: 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d  ot evil..**    M
00b0: 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67  ay you find forg
00c0: 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72  iveness for your
00d0: 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65  self and forgive
00e0: 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d   others..**    M
00f0: 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65  ay you share fre
0100: 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e  ely, never takin
0110: 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20  g more than you 
0120: 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  give..**.*******
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 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
0180: 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  is file contains
0190: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
01a0: 69 6f 6e 20 6f 66 20 61 6e 20 53 51 4c 69 74 65  ion of an SQLite
01b0: 20 76 66 73 20 77 72 61 70 70 65 72 20 74 68 61   vfs wrapper tha
01c0: 74 0a 2a 2a 20 61 64 64 73 20 69 6e 73 74 72 75  t.** adds instru
01d0: 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20 61 6c 6c  mentation to all
01e0: 20 76 66 73 20 61 6e 64 20 66 69 6c 65 20 6d 65   vfs and file me
01f0: 74 68 6f 64 73 2e 20 43 20 61 6e 64 20 54 63 6c  thods. C and Tcl
0200: 20 69 6e 74 65 72 66 61 63 65 73 0a 2a 2a 20 61   interfaces.** a
0210: 72 65 20 70 72 6f 76 69 64 65 64 20 74 6f 20 63  re provided to c
0220: 6f 6e 74 72 6f 6c 20 74 68 65 20 69 6e 73 74 72  ontrol the instr
0230: 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 0a  umentation..*/..
0240: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c  /*.** This modul
0250: 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20  e contains code 
0260: 66 6f 72 20 61 20 77 72 61 70 70 65 72 20 56 46  for a wrapper VF
0270: 53 20 74 68 61 74 20 63 61 75 73 65 73 20 61 20  S that causes a 
0280: 6c 6f 67 20 6f 66 0a 2a 2a 20 61 6c 6c 20 28 77  log of.** all (w
0290: 65 6c 6c 2c 20 74 65 63 68 6e 69 63 61 6c 6c 79  ell, technically
02a0: 20 22 6d 6f 73 74 22 29 20 56 46 53 20 63 61 6c   "most") VFS cal
02b0: 6c 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ls to be written
02c0: 20 69 6e 74 6f 20 61 20 6e 6f 6d 69 6e 61 74 65   into a nominate
02d0: 64 0a 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73  d.** file on dis
02e0: 6b 2e 20 54 68 65 20 6c 6f 67 20 69 73 20 73 74  k. The log is st
02f0: 6f 72 65 64 20 69 6e 20 61 20 63 6f 6d 70 72 65  ored in a compre
0300: 73 73 65 64 20 62 69 6e 61 72 79 20 66 6f 72 6d  ssed binary form
0310: 61 74 20 74 6f 20 0a 2a 2a 20 72 65 64 75 63 65  at to .** reduce
0320: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 49   the amount of I
0330: 4f 20 6f 76 65 72 68 65 61 64 20 69 6e 74 72 6f  O overhead intro
0340: 64 75 63 65 64 20 69 6e 74 6f 20 74 68 65 20 61  duced into the a
0350: 70 70 6c 69 63 61 74 69 6f 6e 0a 2a 2a 20 62 79  pplication.** by
0360: 20 6c 6f 67 67 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   logging..**.** 
0370: 54 68 65 20 62 69 6e 61 72 79 20 6c 6f 67 20 66  The binary log f
0380: 69 6c 65 73 20 61 72 65 20 72 65 61 64 20 75 73  iles are read us
0390: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 74 61  ing a virtual ta
03a0: 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ble implementati
03b0: 6f 6e 0a 2a 2a 20 61 6c 73 6f 20 63 6f 6e 74 61  on.** also conta
03c0: 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c  ined in this fil
03d0: 65 2e 20 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 49  e. .**.** CREATI
03e0: 4e 47 20 4c 4f 47 20 46 49 4c 45 53 3a 0a 2a 2a  NG LOG FILES:.**
03f0: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 73 71  .**       int sq
0400: 6c 69 74 65 33 5f 76 66 73 6c 6f 67 5f 6e 65 77  lite3_vfslog_new
0410: 28 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e  (.**         con
0420: 73 74 20 63 68 61 72 20 2a 7a 56 66 73 2c 20 20  st char *zVfs,  
0430: 20 20 20 20 20 20 20 20 2f 2f 20 4e 61 6d 65 20          // Name 
0440: 6f 66 20 6e 65 77 20 56 46 53 0a 2a 2a 20 20 20  of new VFS.**   
0450: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
0460: 20 2a 7a 50 61 72 65 6e 74 56 66 73 2c 20 20 20   *zParentVfs,   
0470: 20 2f 2f 20 4e 61 6d 65 20 6f 66 20 70 61 72 65   // Name of pare
0480: 6e 74 20 56 46 53 20 28 6f 72 20 4e 55 4c 4c 29  nt VFS (or NULL)
0490: 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73  .**         cons
04a0: 74 20 63 68 61 72 20 2a 7a 4c 6f 67 20 20 20 20  t char *zLog    
04b0: 20 20 20 20 20 20 20 2f 2f 20 4e 61 6d 65 20 6f         // Name o
04c0: 66 20 6c 6f 67 20 66 69 6c 65 20 74 6f 20 77 72  f log file to wr
04d0: 69 74 65 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ite to.**       
04e0: 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69  );.**.**       i
04f0: 6e 74 20 73 71 6c 69 74 65 33 5f 76 66 73 6c 6f  nt sqlite3_vfslo
0500: 67 5f 66 69 6e 61 6c 69 7a 65 28 63 6f 6e 73 74  g_finalize(const
0510: 20 63 68 61 72 20 2a 7a 56 66 73 29 3b 0a 2a 2a   char *zVfs);.**
0520: 0a 2a 2a 20 41 4e 4e 4f 54 41 54 49 4e 47 20 4c  .** ANNOTATING L
0530: 4f 47 20 46 49 4c 45 53 3a 0a 2a 2a 0a 2a 2a 20  OG FILES:.**.** 
0540: 20 20 54 6f 20 77 72 69 74 65 20 61 6e 20 61 72    To write an ar
0550: 62 69 74 72 61 72 79 20 6d 65 73 73 61 67 65 20  bitrary message 
0560: 69 6e 74 6f 20 61 20 6c 6f 67 20 66 69 6c 65 3a  into a log file:
0570: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74  .**.**       int
0580: 20 73 71 6c 69 74 65 33 5f 76 66 73 6c 6f 67 5f   sqlite3_vfslog_
0590: 61 6e 6e 6f 74 61 74 65 28 63 6f 6e 73 74 20 63  annotate(const c
05a0: 68 61 72 20 2a 7a 56 66 73 2c 20 63 6f 6e 73 74  har *zVfs, const
05b0: 20 63 68 61 72 20 2a 7a 4d 73 67 29 3b 0a 2a 2a   char *zMsg);.**
05c0: 0a 2a 2a 20 52 45 41 44 49 4e 47 20 4c 4f 47 20  .** READING LOG 
05d0: 46 49 4c 45 53 3a 0a 2a 2a 0a 2a 2a 20 20 20 4c  FILES:.**.**   L
05e0: 6f 67 20 66 69 6c 65 73 20 61 72 65 20 72 65 61  og files are rea
05f0: 64 20 75 73 69 6e 67 20 74 68 65 20 22 76 66 73  d using the "vfs
0600: 6c 6f 67 22 20 76 69 72 74 75 61 6c 20 74 61 62  log" virtual tab
0610: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
0620: 6e 0a 2a 2a 20 20 20 69 6e 20 74 68 69 73 20 66  n.**   in this f
0630: 69 6c 65 2e 20 54 6f 20 72 65 67 69 73 74 65 72  ile. To register
0640: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
0650: 6c 65 20 77 69 74 68 20 53 51 4c 69 74 65 2c 20  le with SQLite, 
0660: 75 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  use:.**.**      
0670: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 76 66 73   int sqlite3_vfs
0680: 6c 6f 67 5f 72 65 67 69 73 74 65 72 28 73 71 6c  log_register(sql
0690: 69 74 65 33 20 2a 64 62 29 3b 0a 2a 2a 0a 2a 2a  ite3 *db);.**.**
06a0: 20 20 20 54 68 65 6e 2c 20 69 66 20 74 68 65 20     Then, if the 
06b0: 6c 6f 67 20 66 69 6c 65 20 69 73 20 6e 61 6d 65  log file is name
06c0: 64 20 22 76 66 73 2e 6c 6f 67 22 2c 20 74 68 65  d "vfs.log", the
06d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 63   following SQL c
06e0: 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  ommand:.**.**   
06f0: 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
0700: 41 4c 20 54 41 42 4c 45 20 76 20 55 53 49 4e 47  AL TABLE v USING
0710: 20 76 66 73 6c 6f 67 28 27 76 66 73 2e 6c 6f 67   vfslog('vfs.log
0720: 27 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 63 72 65 61  ');.**.**   crea
0730: 74 65 73 20 61 20 76 69 72 74 75 61 6c 20 74 61  tes a virtual ta
0740: 62 6c 65 20 77 69 74 68 20 36 20 63 6f 6c 75 6d  ble with 6 colum
0750: 6e 73 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ns, as follows:.
0760: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 43 52 45 41  **.**       CREA
0770: 54 45 20 54 41 42 4c 45 20 76 28 0a 2a 2a 20 20  TE TABLE v(.**  
0780: 20 20 20 20 20 20 20 65 76 65 6e 74 20 20 20 20         event    
0790: 54 45 58 54 2c 20 20 20 20 20 20 20 20 20 20 20  TEXT,           
07a0: 20 20 2f 2f 20 22 78 4f 70 65 6e 22 2c 20 22 78    // "xOpen", "x
07b0: 52 65 61 64 22 20 65 74 63 2e 0a 2a 2a 20 20 20  Read" etc..**   
07c0: 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 54        file     T
07d0: 45 58 54 2c 20 20 20 20 20 20 20 20 20 20 20 20  EXT,            
07e0: 20 2f 2f 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   // Name of file
07f0: 20 74 68 69 73 20 63 61 6c 6c 20 61 70 70 6c 69   this call appli
0800: 65 73 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  es to.**        
0810: 20 63 6c 69 63 6b 73 20 20 20 49 4e 54 45 47 45   clicks   INTEGE
0820: 52 2c 20 20 20 20 20 20 20 20 20 20 2f 2f 20 54  R,          // T
0830: 69 6d 65 20 73 70 65 6e 74 20 69 6e 20 63 61 6c  ime spent in cal
0840: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 63 20  l.**         rc 
0850: 20 20 20 20 20 20 49 4e 54 45 47 45 52 2c 20 20        INTEGER,  
0860: 20 20 20 20 20 20 20 20 2f 2f 20 52 65 74 75 72          // Retur
0870: 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 20 20 20  n value.**      
0880: 20 20 20 73 69 7a 65 20 20 20 20 20 49 4e 54 45     size     INTE
0890: 47 45 52 2c 20 20 20 20 20 20 20 20 20 20 2f 2f  GER,          //
08a0: 20 42 79 74 65 73 20 72 65 61 64 20 6f 72 20 77   Bytes read or w
08b0: 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20 20 20 20  ritten.**       
08c0: 20 20 6f 66 66 73 65 74 20 20 20 49 4e 54 45 47    offset   INTEG
08d0: 45 52 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  ER           // 
08e0: 46 69 6c 65 20 6f 66 66 73 65 74 20 72 65 61 64  File offset read
08f0: 20 6f 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20   or written.**  
0900: 20 20 20 20 20 29 3b 0a 2a 2f 0a 0a 23 69 6e 63       );.*/..#inc
0910: 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22  lude "sqlite3.h"
0920: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0930: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61  g.h>.#include <a
0940: 73 73 65 72 74 2e 68 3e 0a 0a 0a 2f 2a 0a 2a 2a  ssert.h>.../*.**
0950: 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d   Maximum pathnam
0960: 65 20 6c 65 6e 67 74 68 20 73 75 70 70 6f 72 74  e length support
0970: 65 64 20 62 79 20 74 68 65 20 76 66 73 6c 6f 67  ed by the vfslog
0980: 20 62 61 63 6b 65 6e 64 2e 0a 2a 2f 0a 23 64 65   backend..*/.#de
0990: 66 69 6e 65 20 49 4e 53 54 5f 4d 41 58 5f 50 41  fine INST_MAX_PA
09a0: 54 48 4e 41 4d 45 20 35 31 32 0a 0a 23 64 65 66  THNAME 512..#def
09b0: 69 6e 65 20 4f 53 5f 41 43 43 45 53 53 20 20 20  ine OS_ACCESS   
09c0: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
09d0: 6e 65 20 4f 53 5f 43 48 45 43 4b 52 45 53 45 52  ne OS_CHECKRESER
09e0: 56 45 44 4c 4f 43 4b 20 32 0a 23 64 65 66 69 6e  VEDLOCK 2.#defin
09f0: 65 20 4f 53 5f 43 4c 4f 53 45 20 20 20 20 20 20  e OS_CLOSE      
0a00: 20 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65         3.#define
0a10: 20 4f 53 5f 43 55 52 52 45 4e 54 54 49 4d 45 20   OS_CURRENTTIME 
0a20: 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20        4.#define 
0a30: 4f 53 5f 44 45 4c 45 54 45 20 20 20 20 20 20 20  OS_DELETE       
0a40: 20 20 20 20 20 35 0a 23 64 65 66 69 6e 65 20 4f       5.#define O
0a50: 53 5f 44 45 56 43 48 41 52 20 20 20 20 20 20 20  S_DEVCHAR       
0a60: 20 20 20 20 36 0a 23 64 65 66 69 6e 65 20 4f 53      6.#define OS
0a70: 5f 46 49 4c 45 43 4f 4e 54 52 4f 4c 20 20 20 20  _FILECONTROL    
0a80: 20 20 20 37 0a 23 64 65 66 69 6e 65 20 4f 53 5f     7.#define OS_
0a90: 46 49 4c 45 53 49 5a 45 20 20 20 20 20 20 20 20  FILESIZE        
0aa0: 20 20 38 0a 23 64 65 66 69 6e 65 20 4f 53 5f 46    8.#define OS_F
0ab0: 55 4c 4c 50 41 54 48 4e 41 4d 45 20 20 20 20 20  ULLPATHNAME     
0ac0: 20 39 0a 23 64 65 66 69 6e 65 20 4f 53 5f 4c 4f   9.#define OS_LO
0ad0: 43 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  CK              
0ae0: 31 31 0a 23 64 65 66 69 6e 65 20 4f 53 5f 4f 50  11.#define OS_OP
0af0: 45 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EN              
0b00: 31 32 0a 23 64 65 66 69 6e 65 20 4f 53 5f 52 41  12.#define OS_RA
0b10: 4e 44 4f 4d 4e 45 53 53 20 20 20 20 20 20 20 20  NDOMNESS        
0b20: 31 33 0a 23 64 65 66 69 6e 65 20 4f 53 5f 52 45  13.#define OS_RE
0b30: 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20  AD              
0b40: 31 34 20 0a 23 64 65 66 69 6e 65 20 4f 53 5f 53  14 .#define OS_S
0b50: 45 43 54 4f 52 53 49 5a 45 20 20 20 20 20 20 20  ECTORSIZE       
0b60: 20 31 35 0a 23 64 65 66 69 6e 65 20 4f 53 5f 53   15.#define OS_S
0b70: 4c 45 45 50 20 20 20 20 20 20 20 20 20 20 20 20  LEEP            
0b80: 20 31 36 0a 23 64 65 66 69 6e 65 20 4f 53 5f 53   16.#define OS_S
0b90: 59 4e 43 20 20 20 20 20 20 20 20 20 20 20 20 20  YNC             
0ba0: 20 31 37 0a 23 64 65 66 69 6e 65 20 4f 53 5f 54   17.#define OS_T
0bb0: 52 55 4e 43 41 54 45 20 20 20 20 20 20 20 20 20  RUNCATE         
0bc0: 20 31 38 0a 23 64 65 66 69 6e 65 20 4f 53 5f 55   18.#define OS_U
0bd0: 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20  NLOCK           
0be0: 20 31 39 0a 23 64 65 66 69 6e 65 20 4f 53 5f 57   19.#define OS_W
0bf0: 52 49 54 45 20 20 20 20 20 20 20 20 20 20 20 20  RITE            
0c00: 20 32 30 0a 23 64 65 66 69 6e 65 20 4f 53 5f 53   20.#define OS_S
0c10: 48 4d 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  HMOPEN          
0c20: 20 32 31 0a 23 64 65 66 69 6e 65 20 4f 53 5f 53   21.#define OS_S
0c30: 48 4d 43 4c 4f 53 45 20 20 20 20 20 20 20 20 20  HMCLOSE         
0c40: 20 32 32 0a 23 64 65 66 69 6e 65 20 4f 53 5f 53   22.#define OS_S
0c50: 48 4d 47 45 54 20 20 20 20 20 20 20 20 20 20 20  HMGET           
0c60: 20 32 33 0a 23 64 65 66 69 6e 65 20 4f 53 5f 53   23.#define OS_S
0c70: 48 4d 52 45 4c 45 41 53 45 20 20 20 20 20 20 20  HMRELEASE       
0c80: 20 32 34 0a 23 64 65 66 69 6e 65 20 4f 53 5f 53   24.#define OS_S
0c90: 48 4d 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20  HMLOCK          
0ca0: 20 32 35 0a 23 64 65 66 69 6e 65 20 4f 53 5f 53   25.#define OS_S
0cb0: 48 4d 53 49 5a 45 20 20 20 20 20 20 20 20 20 20  HMSIZE          
0cc0: 20 32 36 0a 23 64 65 66 69 6e 65 20 4f 53 5f 41   26.#define OS_A
0cd0: 4e 4e 4f 54 41 54 45 20 20 20 20 20 20 20 20 20  NNOTATE         
0ce0: 20 32 37 0a 0a 23 64 65 66 69 6e 65 20 4f 53 5f   27..#define OS_
0cf0: 4e 55 4d 45 56 45 4e 54 53 20 20 20 20 20 20 20  NUMEVENTS       
0d00: 20 20 32 38 0a 0a 23 64 65 66 69 6e 65 20 56 46    28..#define VF
0d10: 53 4c 4f 47 5f 42 55 46 46 45 52 53 49 5a 45 20  SLOG_BUFFERSIZE 
0d20: 38 31 39 32 0a 0a 74 79 70 65 64 65 66 20 73 74  8192..typedef st
0d30: 72 75 63 74 20 56 66 73 6c 6f 67 56 66 73 20 56  ruct VfslogVfs V
0d40: 66 73 6c 6f 67 56 66 73 3b 0a 74 79 70 65 64 65  fslogVfs;.typede
0d50: 66 20 73 74 72 75 63 74 20 56 66 73 6c 6f 67 46  f struct VfslogF
0d60: 69 6c 65 20 56 66 73 6c 6f 67 46 69 6c 65 3b 0a  ile VfslogFile;.
0d70: 0a 73 74 72 75 63 74 20 56 66 73 6c 6f 67 56 66  .struct VfslogVf
0d80: 73 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s {.  sqlite3_vf
0d90: 73 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 20  s base;         
0da0: 20 20 20 20 20 20 2f 2a 20 56 46 53 20 6d 65 74        /* VFS met
0db0: 68 6f 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  hods */.  sqlite
0dc0: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
0dd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
0de0: 65 6e 74 20 56 46 53 20 2a 2f 0a 20 20 69 6e 74  ent VFS */.  int
0df0: 20 69 4e 65 78 74 46 69 6c 65 49 64 3b 20 20 20   iNextFileId;   
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0e10: 4e 65 78 74 20 66 69 6c 65 20 69 64 20 2a 2f 0a  Next file id */.
0e20: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
0e30: 70 4c 6f 67 3b 20 20 20 20 20 20 20 20 20 20 20  pLog;           
0e40: 20 20 2f 2a 20 4c 6f 67 20 66 69 6c 65 20 68 61    /* Log file ha
0e50: 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ndle */.  sqlite
0e60: 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74 3b  3_int64 iOffset;
0e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67            /* Log
0e80: 20 66 69 6c 65 20 6f 66 66 73 65 74 20 6f 66 20   file offset of 
0e90: 73 74 61 72 74 20 6f 66 20 77 72 69 74 65 20 62  start of write b
0ea0: 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  uffer */.  int n
0eb0: 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Buf;            
0ec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
0ed0: 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 62 79  mber of valid by
0ee0: 74 65 73 20 69 6e 20 61 42 75 66 5b 5d 20 2a 2f  tes in aBuf[] */
0ef0: 0a 20 20 63 68 61 72 20 61 42 75 66 5b 56 46 53  .  char aBuf[VFS
0f00: 4c 4f 47 5f 42 55 46 46 45 52 53 49 5a 45 5d 3b  LOG_BUFFERSIZE];
0f10: 20 20 20 2f 2a 20 57 72 69 74 65 20 62 75 66 66     /* Write buff
0f20: 65 72 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74  er */.};..struct
0f30: 20 56 66 73 6c 6f 67 46 69 6c 65 20 7b 0a 20 20   VfslogFile {.  
0f40: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 62 61 73  sqlite3_file bas
0f50: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
0f60: 2f 2a 20 49 4f 20 6d 65 74 68 6f 64 73 20 2a 2f  /* IO methods */
0f70: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
0f80: 2a 70 52 65 61 6c 3b 20 20 20 20 20 20 20 20 20  *pReal;         
0f90: 20 20 20 2f 2a 20 55 6e 64 65 72 6c 79 69 6e 67     /* Underlying
0fa0: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   file handle */.
0fb0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
0fc0: 56 66 73 6c 6f 67 3b 20 20 20 20 20 20 20 20 20  Vfslog;         
0fd0: 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
0fe0: 56 73 66 6c 6f 67 56 66 73 20 6f 62 6a 65 63 74  VsflogVfs object
0ff0: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 6c 65 49   */.  int iFileI
1000: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1010: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 69 64        /* File id
1020: 20 6e 75 6d 62 65 72 20 2a 2f 0a 7d 3b 0a 0a 23   number */.};..#
1030: 64 65 66 69 6e 65 20 52 45 41 4c 56 46 53 28 70  define REALVFS(p
1040: 29 20 28 28 28 56 66 73 6c 6f 67 56 66 73 20 2a  ) (((VfslogVfs *
1050: 29 28 70 29 29 2d 3e 70 56 66 73 29 0a 0a 0a 0a  )(p))->pVfs)....
1060: 2f 2a 0a 2a 2a 20 4d 65 74 68 6f 64 20 64 65 63  /*.** Method dec
1070: 6c 61 72 61 74 69 6f 6e 73 20 66 6f 72 20 76 66  larations for vf
1080: 73 6c 6f 67 5f 66 69 6c 65 2e 0a 2a 2f 0a 73 74  slog_file..*/.st
1090: 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 43  atic int vfslogC
10a0: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
10b0: 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  e*);.static int 
10c0: 76 66 73 6c 6f 67 52 65 61 64 28 73 71 6c 69 74  vfslogRead(sqlit
10d0: 65 33 5f 66 69 6c 65 2a 2c 20 76 6f 69 64 2a 2c  e3_file*, void*,
10e0: 20 69 6e 74 20 69 41 6d 74 2c 20 73 71 6c 69 74   int iAmt, sqlit
10f0: 65 33 5f 69 6e 74 36 34 20 69 4f 66 73 74 29 3b  e3_int64 iOfst);
1100: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c  .static int vfsl
1110: 6f 67 57 72 69 74 65 28 73 71 6c 69 74 65 33 5f  ogWrite(sqlite3_
1120: 66 69 6c 65 2a 2c 63 6f 6e 73 74 20 76 6f 69 64  file*,const void
1130: 2a 2c 69 6e 74 20 69 41 6d 74 2c 20 73 71 6c 69  *,int iAmt, sqli
1140: 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 73 74 29  te3_int64 iOfst)
1150: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73  ;.static int vfs
1160: 6c 6f 67 54 72 75 6e 63 61 74 65 28 73 71 6c 69  logTruncate(sqli
1170: 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69 74  te3_file*, sqlit
1180: 65 33 5f 69 6e 74 36 34 20 73 69 7a 65 29 3b 0a  e3_int64 size);.
1190: 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f  static int vfslo
11a0: 67 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  gSync(sqlite3_fi
11b0: 6c 65 2a 2c 20 69 6e 74 20 66 6c 61 67 73 29 3b  le*, int flags);
11c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c  .static int vfsl
11d0: 6f 67 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  ogFileSize(sqlit
11e0: 65 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69 74 65  e3_file*, sqlite
11f0: 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 3b  3_int64 *pSize);
1200: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c  .static int vfsl
1210: 6f 67 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ogLock(sqlite3_f
1220: 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74  ile*, int);.stat
1230: 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 55 6e 6c  ic int vfslogUnl
1240: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
1250: 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
1260: 69 6e 74 20 76 66 73 6c 6f 67 43 68 65 63 6b 52  int vfslogCheckR
1270: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
1280: 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 2a  te3_file*, int *
1290: 70 52 65 73 4f 75 74 29 3b 0a 73 74 61 74 69 63  pResOut);.static
12a0: 20 69 6e 74 20 76 66 73 6c 6f 67 46 69 6c 65 43   int vfslogFileC
12b0: 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
12c0: 69 6c 65 2a 2c 20 69 6e 74 20 6f 70 2c 20 76 6f  ile*, int op, vo
12d0: 69 64 20 2a 70 41 72 67 29 3b 0a 73 74 61 74 69  id *pArg);.stati
12e0: 63 20 69 6e 74 20 76 66 73 6c 6f 67 53 65 63 74  c int vfslogSect
12f0: 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
1300: 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  ile*);.static in
1310: 74 20 76 66 73 6c 6f 67 44 65 76 69 63 65 43 68  t vfslogDeviceCh
1320: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
1330: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 0a 73  lite3_file*);..s
1340: 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67  tatic int vfslog
1350: 53 68 6d 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  ShmOpen(sqlite3_
1360: 66 69 6c 65 20 2a 70 46 69 6c 65 29 3b 0a 73 74  file *pFile);.st
1370: 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 53  atic int vfslogS
1380: 68 6d 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  hmSize(sqlite3_f
1390: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
13a0: 72 65 71 53 69 7a 65 2c 20 69 6e 74 20 2a 70 4e  reqSize, int *pN
13b0: 65 77 53 69 7a 65 29 3b 0a 73 74 61 74 69 63 20  ewSize);.static 
13c0: 69 6e 74 20 76 66 73 6c 6f 67 53 68 6d 47 65 74  int vfslogShmGet
13d0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
13e0: 46 69 6c 65 2c 20 69 6e 74 20 72 65 71 2c 20 69  File, int req, i
13f0: 6e 74 20 2a 70 53 69 7a 65 2c 20 76 6f 69 64 20  nt *pSize, void 
1400: 2a 2a 70 70 29 3b 0a 73 74 61 74 69 63 20 69 6e  **pp);.static in
1410: 74 20 76 66 73 6c 6f 67 53 68 6d 52 65 6c 65 61  t vfslogShmRelea
1420: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
1430: 2a 70 46 69 6c 65 29 3b 0a 73 74 61 74 69 63 20  *pFile);.static 
1440: 69 6e 74 20 76 66 73 6c 6f 67 53 68 6d 4c 6f 63  int vfslogShmLoc
1450: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
1460: 70 46 69 6c 65 2c 20 69 6e 74 20 64 65 73 69 72  pFile, int desir
1470: 65 64 4c 6f 63 6b 2c 20 69 6e 74 20 2a 67 6f 74  edLock, int *got
1480: 4c 6f 63 6b 29 3b 0a 73 74 61 74 69 63 20 69 6e  Lock);.static in
1490: 74 20 76 66 73 6c 6f 67 53 68 6d 43 6c 6f 73 65  t vfslogShmClose
14a0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
14b0: 46 69 6c 65 2c 20 69 6e 74 20 64 65 6c 65 74 65  File, int delete
14c0: 46 6c 61 67 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 65  Flag);../*.** Me
14d0: 74 68 6f 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  thod declaration
14e0: 73 20 66 6f 72 20 76 66 73 6c 6f 67 5f 76 66 73  s for vfslog_vfs
14f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1500: 76 66 73 6c 6f 67 4f 70 65 6e 28 73 71 6c 69 74  vfslogOpen(sqlit
1510: 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63  e3_vfs*, const c
1520: 68 61 72 20 2a 2c 20 73 71 6c 69 74 65 33 5f 66  har *, sqlite3_f
1530: 69 6c 65 2a 2c 20 69 6e 74 20 2c 20 69 6e 74 20  ile*, int , int 
1540: 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 76  *);.static int v
1550: 66 73 6c 6f 67 44 65 6c 65 74 65 28 73 71 6c 69  fslogDelete(sqli
1560: 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20  te3_vfs*, const 
1570: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
1580: 20 73 79 6e 63 44 69 72 29 3b 0a 73 74 61 74 69   syncDir);.stati
1590: 63 20 69 6e 74 20 76 66 73 6c 6f 67 41 63 63 65  c int vfslogAcce
15a0: 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  ss(sqlite3_vfs*,
15b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
15c0: 6d 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69  me, int flags, i
15d0: 6e 74 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  nt *);.static in
15e0: 74 20 76 66 73 6c 6f 67 46 75 6c 6c 50 61 74 68  t vfslogFullPath
15f0: 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  name(sqlite3_vfs
1600: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  *, const char *z
1610: 4e 61 6d 65 2c 20 69 6e 74 2c 20 63 68 61 72 20  Name, int, char 
1620: 2a 7a 4f 75 74 29 3b 0a 73 74 61 74 69 63 20 76  *zOut);.static v
1630: 6f 69 64 20 2a 76 66 73 6c 6f 67 44 6c 4f 70 65  oid *vfslogDlOpe
1640: 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20  n(sqlite3_vfs*, 
1650: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1660: 65 6e 61 6d 65 29 3b 0a 73 74 61 74 69 63 20 76  ename);.static v
1670: 6f 69 64 20 76 66 73 6c 6f 67 44 6c 45 72 72 6f  oid vfslogDlErro
1680: 72 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20  r(sqlite3_vfs*, 
1690: 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72 20  int nByte, char 
16a0: 2a 7a 45 72 72 4d 73 67 29 3b 0a 73 74 61 74 69  *zErrMsg);.stati
16b0: 63 20 76 6f 69 64 20 28 2a 76 66 73 6c 6f 67 44  c void (*vfslogD
16c0: 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
16d0: 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 2c   *pVfs, void *p,
16e0: 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d   const char*zSym
16f0: 29 29 28 76 6f 69 64 29 3b 0a 73 74 61 74 69 63  ))(void);.static
1700: 20 76 6f 69 64 20 76 66 73 6c 6f 67 44 6c 43 6c   void vfslogDlCl
1710: 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a  ose(sqlite3_vfs*
1720: 2c 20 76 6f 69 64 2a 29 3b 0a 73 74 61 74 69 63  , void*);.static
1730: 20 69 6e 74 20 76 66 73 6c 6f 67 52 61 6e 64 6f   int vfslogRando
1740: 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
1750: 73 2a 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63  s*, int nByte, c
1760: 68 61 72 20 2a 7a 4f 75 74 29 3b 0a 73 74 61 74  har *zOut);.stat
1770: 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 53 6c 65  ic int vfslogSle
1780: 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  ep(sqlite3_vfs*,
1790: 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64   int microsecond
17a0: 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 76  s);.static int v
17b0: 66 73 6c 6f 67 43 75 72 72 65 6e 74 54 69 6d 65  fslogCurrentTime
17c0: 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 64  (sqlite3_vfs*, d
17d0: 6f 75 62 6c 65 2a 29 3b 0a 0a 73 74 61 74 69 63  ouble*);..static
17e0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 76 66 73   sqlite3_vfs vfs
17f0: 6c 6f 67 5f 76 66 73 20 3d 20 7b 0a 20 20 31 2c  log_vfs = {.  1,
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1820: 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 73   iVersion */.  s
1830: 69 7a 65 6f 66 28 56 66 73 6c 6f 67 46 69 6c 65  izeof(VfslogFile
1840: 29 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ),             /
1850: 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20  * szOsFile */.  
1860: 49 4e 53 54 5f 4d 41 58 5f 50 41 54 48 4e 41 4d  INST_MAX_PATHNAM
1870: 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E,              
1880: 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
1890: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
18c0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 30   /* zName */.  0
18f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1910: 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20  * pAppData */.  
1920: 76 66 73 6c 6f 67 4f 70 65 6e 2c 20 20 20 20 20  vfslogOpen,     
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1940: 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 76 66  /* xOpen */.  vf
1950: 73 6c 6f 67 44 65 6c 65 74 65 2c 20 20 20 20 20  slogDelete,     
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1970: 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 76 66   xDelete */.  vf
1980: 73 6c 6f 67 41 63 63 65 73 73 2c 20 20 20 20 20  slogAccess,     
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19a0: 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 76 66   xAccess */.  vf
19b0: 73 6c 6f 67 46 75 6c 6c 50 61 74 68 6e 61 6d 65  slogFullPathname
19c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
19d0: 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
19e0: 2f 0a 20 20 76 66 73 6c 6f 67 44 6c 4f 70 65 6e  /.  vfslogDlOpen
19f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a00: 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
1a10: 2f 0a 20 20 76 66 73 6c 6f 67 44 6c 45 72 72 6f  /.  vfslogDlErro
1a20: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
1a30: 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20      /* xDlError 
1a40: 2a 2f 0a 20 20 76 66 73 6c 6f 67 44 6c 53 79 6d  */.  vfslogDlSym
1a50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a60: 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
1a70: 2f 0a 20 20 76 66 73 6c 6f 67 44 6c 43 6c 6f 73  /.  vfslogDlClos
1a80: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1a90: 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20      /* xDlClose 
1aa0: 2a 2f 0a 20 20 76 66 73 6c 6f 67 52 61 6e 64 6f  */.  vfslogRando
1ab0: 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  mness,          
1ac0: 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
1ad0: 65 73 73 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 53  ess */.  vfslogS
1ae0: 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20  leep,           
1af0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
1b00: 65 70 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 43 75  ep */.  vfslogCu
1b10: 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
1b20: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72          /* xCurr
1b30: 65 6e 74 54 69 6d 65 20 2a 2f 0a 7d 3b 0a 0a 73  entTime */.};..s
1b40: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6f  tatic sqlite3_io
1b50: 5f 6d 65 74 68 6f 64 73 20 76 66 73 6c 6f 67 5f  _methods vfslog_
1b60: 69 6f 5f 6d 65 74 68 6f 64 73 20 3d 20 7b 0a 20  io_methods = {. 
1b70: 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   2,             
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
1ba0: 20 20 76 66 73 6c 6f 67 43 6c 6f 73 65 2c 20 20    vfslogClose,  
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20    /* xClose */. 
1bd0: 20 76 66 73 6c 6f 67 52 65 61 64 2c 20 20 20 20   vfslogRead,    
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 76   /* xRead */.  v
1c00: 66 73 6c 6f 67 57 72 69 74 65 2c 20 20 20 20 20  fslogWrite,     
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c20: 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 76 66  * xWrite */.  vf
1c30: 73 6c 6f 67 54 72 75 6e 63 61 74 65 2c 20 20 20  slogTruncate,   
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c50: 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20   xTruncate */.  
1c60: 76 66 73 6c 6f 67 53 79 6e 63 2c 20 20 20 20 20  vfslogSync,     
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c80: 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 76 66  /* xSync */.  vf
1c90: 73 6c 6f 67 46 69 6c 65 53 69 7a 65 2c 20 20 20  slogFileSize,   
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cb0: 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20   xFileSize */.  
1cc0: 76 66 73 6c 6f 67 4c 6f 63 6b 2c 20 20 20 20 20  vfslogLock,     
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 76 66  /* xLock */.  vf
1cf0: 73 6c 6f 67 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  slogUnlock,     
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d10: 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 76 66   xUnlock */.  vf
1d20: 73 6c 6f 67 43 68 65 63 6b 52 65 73 65 72 76 65  slogCheckReserve
1d30: 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 2f 2a  dLock,        /*
1d40: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
1d50: 6f 63 6b 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 46  ock */.  vfslogF
1d60: 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20  ileControl,     
1d70: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
1d80: 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 76 66  eControl */.  vf
1d90: 73 6c 6f 67 53 65 63 74 6f 72 53 69 7a 65 2c 20  slogSectorSize, 
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1db0: 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a   xSectorSize */.
1dc0: 20 20 76 66 73 6c 6f 67 44 65 76 69 63 65 43 68    vfslogDeviceCh
1dd0: 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20  aracteristics,  
1de0: 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72    /* xDeviceChar
1df0: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
1e00: 20 76 66 73 6c 6f 67 53 68 6d 4f 70 65 6e 2c 20   vfslogShmOpen, 
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 2f 2a 20 78 53 68 6d 4f 70 65 6e 20 2a 2f 0a   /* xShmOpen */.
1e30: 20 20 76 66 73 6c 6f 67 53 68 6d 53 69 7a 65 2c    vfslogShmSize,
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 2f 2a 20 78 53 68 6d 53 69 7a 65 20 2a 2f    /* xShmSize */
1e60: 0a 20 20 76 66 73 6c 6f 67 53 68 6d 47 65 74 2c  .  vfslogShmGet,
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e80: 20 20 20 2f 2a 20 78 53 68 6d 47 65 74 20 2a 2f     /* xShmGet */
1e90: 0a 20 20 76 66 73 6c 6f 67 53 68 6d 52 65 6c 65  .  vfslogShmRele
1ea0: 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ase,            
1eb0: 20 20 20 2f 2a 20 78 53 68 6d 52 65 6c 65 61 73     /* xShmReleas
1ec0: 65 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 53 68 6d  e */.  vfslogShm
1ed0: 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
1ee0: 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
1ef0: 63 6b 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 53 68  ck */.  vfslogSh
1f00: 6d 43 6c 6f 73 65 20 20 20 20 20 20 20 20 20 20  mClose          
1f10: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 43          /* xShmC
1f20: 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20  lose */.};..#if 
1f30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1f40: 53 5f 55 4e 49 58 29 20 26 26 20 21 64 65 66 69  S_UNIX) && !defi
1f50: 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 23  ned(NO_GETTOD).#
1f60: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d  include <sys/tim
1f70: 65 2e 68 3e 0a 73 74 61 74 69 63 20 73 71 6c 69  e.h>.static sqli
1f80: 74 65 33 5f 75 69 6e 74 36 34 20 76 66 73 6c 6f  te3_uint64 vfslo
1f90: 67 5f 74 69 6d 65 28 29 7b 0a 20 20 73 74 72 75  g_time(){.  stru
1fa0: 63 74 20 74 69 6d 65 76 61 6c 20 73 54 69 6d 65  ct timeval sTime
1fb0: 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79  ;.  gettimeofday
1fc0: 28 26 73 54 69 6d 65 2c 20 30 29 3b 0a 20 20 72  (&sTime, 0);.  r
1fd0: 65 74 75 72 6e 20 73 54 69 6d 65 2e 74 76 5f 75  eturn sTime.tv_u
1fe0: 73 65 63 20 2b 20 28 73 71 6c 69 74 65 33 5f 75  sec + (sqlite3_u
1ff0: 69 6e 74 36 34 29 73 54 69 6d 65 2e 74 76 5f 73  int64)sTime.tv_s
2000: 65 63 20 2a 20 31 30 30 30 30 30 30 3b 0a 7d 0a  ec * 1000000;.}.
2010: 23 65 6c 73 65 0a 73 74 61 74 69 63 20 73 71 6c  #else.static sql
2020: 69 74 65 33 5f 75 69 6e 74 36 34 20 76 66 73 6c  ite3_uint64 vfsl
2030: 6f 67 5f 74 69 6d 65 28 29 7b 0a 20 20 72 65 74  og_time(){.  ret
2040: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
2050: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 66 73  .static void vfs
2060: 6c 6f 67 5f 63 61 6c 6c 28 73 71 6c 69 74 65 33  log_call(sqlite3
2070: 5f 76 66 73 20 2a 2c 20 69 6e 74 2c 20 69 6e 74  _vfs *, int, int
2080: 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 2c  , int, int, int,
2090: 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 76 6f   int);.static vo
20a0: 69 64 20 76 66 73 6c 6f 67 5f 73 74 72 69 6e 67  id vfslog_string
20b0: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20  (sqlite3_vfs *, 
20c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a  const char *);..
20d0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 76  /*.** Close an v
20e0: 66 73 6c 6f 67 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  fslog-file..*/.s
20f0: 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67  tatic int vfslog
2100: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
2110: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 71  le *pFile){.  sq
2120: 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 74 3b 0a  lite3_uint64 t;.
2130: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2140: 45 5f 4f 4b 3b 0a 20 20 56 66 73 6c 6f 67 46 69  E_OK;.  VfslogFi
2150: 6c 65 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67 46  le *p = (VfslogF
2160: 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 0a 20 20  ile *)pFile;..  
2170: 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28  t = vfslog_time(
2180: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61  );.  if( p->pRea
2190: 6c 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  l->pMethods ){. 
21a0: 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c     rc = p->pReal
21b0: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43 6c 6f  ->pMethods->xClo
21c0: 73 65 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 20 20  se(p->pReal);.  
21d0: 7d 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74  }.  t = vfslog_t
21e0: 69 6d 65 28 29 20 2d 20 74 3b 0a 20 20 76 66 73  ime() - t;.  vfs
21f0: 6c 6f 67 5f 63 61 6c 6c 28 70 2d 3e 70 56 66 73  log_call(p->pVfs
2200: 6c 6f 67 2c 20 4f 53 5f 43 4c 4f 53 45 2c 20 70  log, OS_CLOSE, p
2210: 2d 3e 69 46 69 6c 65 49 64 2c 20 74 2c 20 72 63  ->iFileId, t, rc
2220: 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  , 0, 0);.  retur
2230: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
2240: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e  ead data from an
2250: 20 76 66 73 6c 6f 67 2d 66 69 6c 65 2e 0a 2a 2f   vfslog-file..*/
2260: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c  .static int vfsl
2270: 6f 67 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  ogRead(.  sqlite
2280: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a  3_file *pFile, .
2290: 20 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20    void *zBuf, . 
22a0: 20 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20 73 71   int iAmt, .  sq
22b0: 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f 66 73 74  lite_int64 iOfst
22c0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
22d0: 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 74  sqlite3_uint64 t
22e0: 3b 0a 20 20 56 66 73 6c 6f 67 46 69 6c 65 20 2a  ;.  VfslogFile *
22f0: 70 20 3d 20 28 56 66 73 6c 6f 67 46 69 6c 65 20  p = (VfslogFile 
2300: 2a 29 70 46 69 6c 65 3b 0a 20 20 74 20 3d 20 76  *)pFile;.  t = v
2310: 66 73 6c 6f 67 5f 74 69 6d 65 28 29 3b 0a 20 20  fslog_time();.  
2320: 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  rc = p->pReal->p
2330: 4d 65 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70  Methods->xRead(p
2340: 2d 3e 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69  ->pReal, zBuf, i
2350: 41 6d 74 2c 20 69 4f 66 73 74 29 3b 0a 20 20 74  Amt, iOfst);.  t
2360: 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29   = vfslog_time()
2370: 20 2d 20 74 3b 0a 20 20 76 66 73 6c 6f 67 5f 63   - t;.  vfslog_c
2380: 61 6c 6c 28 70 2d 3e 70 56 66 73 6c 6f 67 2c 20  all(p->pVfslog, 
2390: 4f 53 5f 52 45 41 44 2c 20 70 2d 3e 69 46 69 6c  OS_READ, p->iFil
23a0: 65 49 64 2c 20 74 2c 20 72 63 2c 20 69 41 6d 74  eId, t, rc, iAmt
23b0: 2c 20 28 69 6e 74 29 69 4f 66 73 74 29 3b 0a 20  , (int)iOfst);. 
23c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23d0: 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
23e0: 74 6f 20 61 6e 20 76 66 73 6c 6f 67 2d 66 69 6c  to an vfslog-fil
23f0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2400: 20 76 66 73 6c 6f 67 57 72 69 74 65 28 0a 20 20   vfslogWrite(.  
2410: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
2420: 69 6c 65 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  ile,.  const voi
2430: 64 20 2a 7a 2c 0a 20 20 69 6e 74 20 69 41 6d 74  d *z,.  int iAmt
2440: 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  ,.  sqlite_int64
2450: 20 69 4f 66 73 74 0a 29 7b 0a 20 20 69 6e 74 20   iOfst.){.  int 
2460: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75 69  rc;.  sqlite3_ui
2470: 6e 74 36 34 20 74 3b 0a 20 20 56 66 73 6c 6f 67  nt64 t;.  Vfslog
2480: 46 69 6c 65 20 2a 70 20 3d 20 28 56 66 73 6c 6f  File *p = (Vfslo
2490: 67 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  gFile *)pFile;. 
24a0: 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65   t = vfslog_time
24b0: 28 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 70 52  ();.  rc = p->pR
24c0: 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
24d0: 57 72 69 74 65 28 70 2d 3e 70 52 65 61 6c 2c 20  Write(p->pReal, 
24e0: 7a 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b  z, iAmt, iOfst);
24f0: 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69  .  t = vfslog_ti
2500: 6d 65 28 29 20 2d 20 74 3b 0a 20 20 76 66 73 6c  me() - t;.  vfsl
2510: 6f 67 5f 63 61 6c 6c 28 70 2d 3e 70 56 66 73 6c  og_call(p->pVfsl
2520: 6f 67 2c 20 4f 53 5f 57 52 49 54 45 2c 20 70 2d  og, OS_WRITE, p-
2530: 3e 69 46 69 6c 65 49 64 2c 20 74 2c 20 72 63 2c  >iFileId, t, rc,
2540: 20 69 41 6d 74 2c 20 28 69 6e 74 29 69 4f 66 73   iAmt, (int)iOfs
2550: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  t);.  return rc;
2560: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
2570: 74 65 20 61 6e 20 76 66 73 6c 6f 67 2d 66 69 6c  te an vfslog-fil
2580: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2590: 20 76 66 73 6c 6f 67 54 72 75 6e 63 61 74 65 28   vfslogTruncate(
25a0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
25b0: 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36  ile, sqlite_int6
25c0: 34 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  4 size){.  int r
25d0: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e  c;.  sqlite3_uin
25e0: 74 36 34 20 74 3b 0a 20 20 56 66 73 6c 6f 67 46  t64 t;.  VfslogF
25f0: 69 6c 65 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67  ile *p = (Vfslog
2600: 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  File *)pFile;.  
2610: 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28  t = vfslog_time(
2620: 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 70 52 65  );.  rc = p->pRe
2630: 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 54  al->pMethods->xT
2640: 72 75 6e 63 61 74 65 28 70 2d 3e 70 52 65 61 6c  runcate(p->pReal
2650: 2c 20 73 69 7a 65 29 3b 0a 20 20 74 20 3d 20 76  , size);.  t = v
2660: 66 73 6c 6f 67 5f 74 69 6d 65 28 29 20 2d 20 74  fslog_time() - t
2670: 3b 0a 20 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28  ;.  vfslog_call(
2680: 70 2d 3e 70 56 66 73 6c 6f 67 2c 20 4f 53 5f 54  p->pVfslog, OS_T
2690: 52 55 4e 43 41 54 45 2c 20 70 2d 3e 69 46 69 6c  RUNCATE, p->iFil
26a0: 65 49 64 2c 20 74 2c 20 72 63 2c 20 30 2c 20 28  eId, t, rc, 0, (
26b0: 69 6e 74 29 73 69 7a 65 29 3b 0a 20 20 72 65 74  int)size);.  ret
26c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26d0: 20 53 79 6e 63 20 61 6e 20 76 66 73 6c 6f 67 2d   Sync an vfslog-
26e0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
26f0: 69 6e 74 20 76 66 73 6c 6f 67 53 79 6e 63 28 73  int vfslogSync(s
2700: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
2710: 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  le, int flags){.
2720: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
2730: 74 65 33 5f 75 69 6e 74 36 34 20 74 3b 0a 20 20  te3_uint64 t;.  
2740: 56 66 73 6c 6f 67 46 69 6c 65 20 2a 70 20 3d 20  VfslogFile *p = 
2750: 28 56 66 73 6c 6f 67 46 69 6c 65 20 2a 29 70 46  (VfslogFile *)pF
2760: 69 6c 65 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f  ile;.  t = vfslo
2770: 67 5f 74 69 6d 65 28 29 3b 0a 20 20 72 63 20 3d  g_time();.  rc =
2780: 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68   p->pReal->pMeth
2790: 6f 64 73 2d 3e 78 53 79 6e 63 28 70 2d 3e 70 52  ods->xSync(p->pR
27a0: 65 61 6c 2c 20 66 6c 61 67 73 29 3b 0a 20 20 74  eal, flags);.  t
27b0: 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29   = vfslog_time()
27c0: 20 2d 20 74 3b 0a 20 20 76 66 73 6c 6f 67 5f 63   - t;.  vfslog_c
27d0: 61 6c 6c 28 70 2d 3e 70 56 66 73 6c 6f 67 2c 20  all(p->pVfslog, 
27e0: 4f 53 5f 53 59 4e 43 2c 20 70 2d 3e 69 46 69 6c  OS_SYNC, p->iFil
27f0: 65 49 64 2c 20 74 2c 20 72 63 2c 20 66 6c 61 67  eId, t, rc, flag
2800: 73 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  s, 0);.  return 
2810: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
2820: 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
2830: 66 69 6c 65 2d 73 69 7a 65 20 6f 66 20 61 6e 20  file-size of an 
2840: 76 66 73 6c 6f 67 2d 66 69 6c 65 2e 0a 2a 2f 0a  vfslog-file..*/.
2850: 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f  static int vfslo
2860: 67 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  gFileSize(sqlite
2870: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73  3_file *pFile, s
2880: 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 53 69  qlite_int64 *pSi
2890: 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ze){.  int rc;. 
28a0: 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20   sqlite3_uint64 
28b0: 74 3b 0a 20 20 56 66 73 6c 6f 67 46 69 6c 65 20  t;.  VfslogFile 
28c0: 2a 70 20 3d 20 28 56 66 73 6c 6f 67 46 69 6c 65  *p = (VfslogFile
28d0: 20 2a 29 70 46 69 6c 65 3b 0a 20 20 74 20 3d 20   *)pFile;.  t = 
28e0: 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29 3b 0a 20  vfslog_time();. 
28f0: 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e   rc = p->pReal->
2900: 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c 65 53  pMethods->xFileS
2910: 69 7a 65 28 70 2d 3e 70 52 65 61 6c 2c 20 70 53  ize(p->pReal, pS
2920: 69 7a 65 29 3b 0a 20 20 74 20 3d 20 76 66 73 6c  ize);.  t = vfsl
2930: 6f 67 5f 74 69 6d 65 28 29 20 2d 20 74 3b 0a 20  og_time() - t;. 
2940: 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70 2d 3e   vfslog_call(p->
2950: 70 56 66 73 6c 6f 67 2c 20 4f 53 5f 46 49 4c 45  pVfslog, OS_FILE
2960: 53 49 5a 45 2c 20 70 2d 3e 69 46 69 6c 65 49 64  SIZE, p->iFileId
2970: 2c 20 74 2c 20 72 63 2c 20 30 2c 20 28 69 6e 74  , t, rc, 0, (int
2980: 29 2a 70 53 69 7a 65 29 3b 0a 20 20 72 65 74 75  )*pSize);.  retu
2990: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29a0: 4c 6f 63 6b 20 61 6e 20 76 66 73 6c 6f 67 2d 66  Lock an vfslog-f
29b0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
29c0: 6e 74 20 76 66 73 6c 6f 67 4c 6f 63 6b 28 73 71  nt vfslogLock(sq
29d0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
29e0: 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  e, int eLock){. 
29f0: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
2a00: 65 33 5f 75 69 6e 74 36 34 20 74 3b 0a 20 20 56  e3_uint64 t;.  V
2a10: 66 73 6c 6f 67 46 69 6c 65 20 2a 70 20 3d 20 28  fslogFile *p = (
2a20: 56 66 73 6c 6f 67 46 69 6c 65 20 2a 29 70 46 69  VfslogFile *)pFi
2a30: 6c 65 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67  le;.  t = vfslog
2a40: 5f 74 69 6d 65 28 29 3b 0a 20 20 72 63 20 3d 20  _time();.  rc = 
2a50: 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
2a60: 64 73 2d 3e 78 4c 6f 63 6b 28 70 2d 3e 70 52 65  ds->xLock(p->pRe
2a70: 61 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 74 20  al, eLock);.  t 
2a80: 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29 20  = vfslog_time() 
2a90: 2d 20 74 3b 0a 20 20 76 66 73 6c 6f 67 5f 63 61  - t;.  vfslog_ca
2aa0: 6c 6c 28 70 2d 3e 70 56 66 73 6c 6f 67 2c 20 4f  ll(p->pVfslog, O
2ab0: 53 5f 4c 4f 43 4b 2c 20 70 2d 3e 69 46 69 6c 65  S_LOCK, p->iFile
2ac0: 49 64 2c 20 74 2c 20 72 63 2c 20 65 4c 6f 63 6b  Id, t, rc, eLock
2ad0: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  , 0);.  return r
2ae0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  c;.}../*.** Unlo
2af0: 63 6b 20 61 6e 20 76 66 73 6c 6f 67 2d 66 69 6c  ck an vfslog-fil
2b00: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2b10: 20 76 66 73 6c 6f 67 55 6e 6c 6f 63 6b 28 73 71   vfslogUnlock(sq
2b20: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
2b30: 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  e, int eLock){. 
2b40: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
2b50: 65 33 5f 75 69 6e 74 36 34 20 74 3b 0a 20 20 56  e3_uint64 t;.  V
2b60: 66 73 6c 6f 67 46 69 6c 65 20 2a 70 20 3d 20 28  fslogFile *p = (
2b70: 56 66 73 6c 6f 67 46 69 6c 65 20 2a 29 70 46 69  VfslogFile *)pFi
2b80: 6c 65 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67  le;.  t = vfslog
2b90: 5f 74 69 6d 65 28 29 3b 0a 20 20 72 63 20 3d 20  _time();.  rc = 
2ba0: 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
2bb0: 64 73 2d 3e 78 55 6e 6c 6f 63 6b 28 70 2d 3e 70  ds->xUnlock(p->p
2bc0: 52 65 61 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20  Real, eLock);.  
2bd0: 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28  t = vfslog_time(
2be0: 29 20 2d 20 74 3b 0a 20 20 76 66 73 6c 6f 67 5f  ) - t;.  vfslog_
2bf0: 63 61 6c 6c 28 70 2d 3e 70 56 66 73 6c 6f 67 2c  call(p->pVfslog,
2c00: 20 4f 53 5f 55 4e 4c 4f 43 4b 2c 20 70 2d 3e 69   OS_UNLOCK, p->i
2c10: 46 69 6c 65 49 64 2c 20 74 2c 20 72 63 2c 20 65  FileId, t, rc, e
2c20: 4c 6f 63 6b 2c 20 30 29 3b 0a 20 20 72 65 74 75  Lock, 0);.  retu
2c30: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2c40: 43 68 65 63 6b 20 69 66 20 61 6e 6f 74 68 65 72  Check if another
2c50: 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20 68 6f 6c   file-handle hol
2c60: 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
2c70: 63 6b 20 6f 6e 20 61 6e 20 76 66 73 6c 6f 67 2d  ck on an vfslog-
2c80: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
2c90: 69 6e 74 20 76 66 73 6c 6f 67 43 68 65 63 6b 52  int vfslogCheckR
2ca0: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
2cb0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
2cc0: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
2cd0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
2ce0: 74 65 33 5f 75 69 6e 74 36 34 20 74 3b 0a 20 20  te3_uint64 t;.  
2cf0: 56 66 73 6c 6f 67 46 69 6c 65 20 2a 70 20 3d 20  VfslogFile *p = 
2d00: 28 56 66 73 6c 6f 67 46 69 6c 65 20 2a 29 70 46  (VfslogFile *)pF
2d10: 69 6c 65 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f  ile;.  t = vfslo
2d20: 67 5f 74 69 6d 65 28 29 3b 0a 20 20 72 63 20 3d  g_time();.  rc =
2d30: 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68   p->pReal->pMeth
2d40: 6f 64 73 2d 3e 78 43 68 65 63 6b 52 65 73 65 72  ods->xCheckReser
2d50: 76 65 64 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c  vedLock(p->pReal
2d60: 2c 20 70 52 65 73 4f 75 74 29 3b 0a 20 20 74 20  , pResOut);.  t 
2d70: 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29 20  = vfslog_time() 
2d80: 2d 20 74 3b 0a 20 20 76 66 73 6c 6f 67 5f 63 61  - t;.  vfslog_ca
2d90: 6c 6c 28 70 2d 3e 70 56 66 73 6c 6f 67 2c 20 4f  ll(p->pVfslog, O
2da0: 53 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  S_CHECKRESERVEDL
2db0: 4f 43 4b 2c 20 70 2d 3e 69 46 69 6c 65 49 64 2c  OCK, p->iFileId,
2dc0: 20 74 2c 20 72 63 2c 20 2a 70 52 65 73 4f 75 74   t, rc, *pResOut
2dd0: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  , 0);.  return r
2de0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 65  c;.}../*.** File
2df0: 20 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 2e   control method.
2e00: 20 46 6f 72 20 63 75 73 74 6f 6d 20 6f 70 65 72   For custom oper
2e10: 61 74 69 6f 6e 73 20 6f 6e 20 61 6e 20 76 66 73  ations on an vfs
2e20: 6c 6f 67 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  log-file..*/.sta
2e30: 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 46 69  tic int vfslogFi
2e40: 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
2e50: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
2e60: 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
2e70: 67 29 7b 0a 20 20 56 66 73 6c 6f 67 46 69 6c 65  g){.  VfslogFile
2e80: 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67 46 69 6c   *p = (VfslogFil
2e90: 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74  e *)pFile;.  ret
2ea0: 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  urn p->pReal->pM
2eb0: 65 74 68 6f 64 73 2d 3e 78 46 69 6c 65 43 6f 6e  ethods->xFileCon
2ec0: 74 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20 6f  trol(p->pReal, o
2ed0: 70 2c 20 70 41 72 67 29 3b 0a 7d 0a 0a 2f 2a 0a  p, pArg);.}../*.
2ee0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
2ef0: 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 62 79 74  ctor-size in byt
2f00: 65 73 20 66 6f 72 20 61 6e 20 76 66 73 6c 6f 67  es for an vfslog
2f10: 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
2f20: 20 69 6e 74 20 76 66 73 6c 6f 67 53 65 63 74 6f   int vfslogSecto
2f30: 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
2f40: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
2f50: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
2f60: 75 69 6e 74 36 34 20 74 3b 0a 20 20 56 66 73 6c  uint64 t;.  Vfsl
2f70: 6f 67 46 69 6c 65 20 2a 70 20 3d 20 28 56 66 73  ogFile *p = (Vfs
2f80: 6c 6f 67 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  logFile *)pFile;
2f90: 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69  .  t = vfslog_ti
2fa0: 6d 65 28 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e  me();.  rc = p->
2fb0: 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
2fc0: 3e 78 53 65 63 74 6f 72 53 69 7a 65 28 70 2d 3e  >xSectorSize(p->
2fd0: 70 52 65 61 6c 29 3b 0a 20 20 74 20 3d 20 76 66  pReal);.  t = vf
2fe0: 73 6c 6f 67 5f 74 69 6d 65 28 29 20 2d 20 74 3b  slog_time() - t;
2ff0: 0a 20 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70  .  vfslog_call(p
3000: 2d 3e 70 56 66 73 6c 6f 67 2c 20 4f 53 5f 53 45  ->pVfslog, OS_SE
3010: 43 54 4f 52 53 49 5a 45 2c 20 70 2d 3e 69 46 69  CTORSIZE, p->iFi
3020: 6c 65 49 64 2c 20 74 2c 20 72 63 2c 20 30 2c 20  leId, t, rc, 0, 
3030: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  0);.  return rc;
3040: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3050: 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72   the device char
3060: 61 63 74 65 72 69 73 74 69 63 20 66 6c 61 67 73  acteristic flags
3070: 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 61 6e   supported by an
3080: 20 76 66 73 6c 6f 67 2d 66 69 6c 65 2e 0a 2a 2f   vfslog-file..*/
3090: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c  .static int vfsl
30a0: 6f 67 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ogDeviceCharacte
30b0: 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f  ristics(sqlite3_
30c0: 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
30d0: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
30e0: 33 5f 75 69 6e 74 36 34 20 74 3b 0a 20 20 56 66  3_uint64 t;.  Vf
30f0: 73 6c 6f 67 46 69 6c 65 20 2a 70 20 3d 20 28 56  slogFile *p = (V
3100: 66 73 6c 6f 67 46 69 6c 65 20 2a 29 70 46 69 6c  fslogFile *)pFil
3110: 65 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f  e;.  t = vfslog_
3120: 74 69 6d 65 28 29 3b 0a 20 20 72 63 20 3d 20 70  time();.  rc = p
3130: 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
3140: 73 2d 3e 78 44 65 76 69 63 65 43 68 61 72 61 63  s->xDeviceCharac
3150: 74 65 72 69 73 74 69 63 73 28 70 2d 3e 70 52 65  teristics(p->pRe
3160: 61 6c 29 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f  al);.  t = vfslo
3170: 67 5f 74 69 6d 65 28 29 20 2d 20 74 3b 0a 20 20  g_time() - t;.  
3180: 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70 2d 3e 70  vfslog_call(p->p
3190: 56 66 73 6c 6f 67 2c 20 4f 53 5f 44 45 56 43 48  Vfslog, OS_DEVCH
31a0: 41 52 2c 20 70 2d 3e 69 46 69 6c 65 49 64 2c 20  AR, p->iFileId, 
31b0: 74 2c 20 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20  t, rc, 0, 0);.  
31c0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
31d0: 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 53  atic int vfslogS
31e0: 68 6d 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 66  hmOpen(sqlite3_f
31f0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
3200: 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
3210: 5f 75 69 6e 74 36 34 20 74 3b 0a 20 20 56 66 73  _uint64 t;.  Vfs
3220: 6c 6f 67 46 69 6c 65 20 2a 70 20 3d 20 28 56 66  logFile *p = (Vf
3230: 73 6c 6f 67 46 69 6c 65 20 2a 29 70 46 69 6c 65  slogFile *)pFile
3240: 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74  ;.  t = vfslog_t
3250: 69 6d 65 28 29 3b 0a 20 20 72 63 20 3d 20 70 2d  ime();.  rc = p-
3260: 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
3270: 2d 3e 78 53 68 6d 4f 70 65 6e 28 70 2d 3e 70 52  ->xShmOpen(p->pR
3280: 65 61 6c 29 3b 0a 20 20 74 20 3d 20 76 66 73 6c  eal);.  t = vfsl
3290: 6f 67 5f 74 69 6d 65 28 29 20 2d 20 74 3b 0a 20  og_time() - t;. 
32a0: 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70 2d 3e   vfslog_call(p->
32b0: 70 56 66 73 6c 6f 67 2c 20 4f 53 5f 53 48 4d 4f  pVfslog, OS_SHMO
32c0: 50 45 4e 2c 20 70 2d 3e 69 46 69 6c 65 49 64 2c  PEN, p->iFileId,
32d0: 20 74 2c 20 72 63 2c 20 30 2c 20 30 29 3b 0a 20   t, rc, 0, 0);. 
32e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
32f0: 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 53  atic int vfslogS
3300: 68 6d 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  hmSize(sqlite3_f
3310: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
3320: 72 65 71 53 69 7a 65 2c 20 69 6e 74 20 2a 70 4e  reqSize, int *pN
3330: 65 77 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  ewSize){.  int r
3340: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e  c;.  sqlite3_uin
3350: 74 36 34 20 74 3b 0a 20 20 56 66 73 6c 6f 67 46  t64 t;.  VfslogF
3360: 69 6c 65 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67  ile *p = (Vfslog
3370: 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  File *)pFile;.  
3380: 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28  t = vfslog_time(
3390: 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 70 52 65  );.  rc = p->pRe
33a0: 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53  al->pMethods->xS
33b0: 68 6d 53 69 7a 65 28 70 2d 3e 70 52 65 61 6c 2c  hmSize(p->pReal,
33c0: 20 72 65 71 53 69 7a 65 2c 20 70 4e 65 77 53 69   reqSize, pNewSi
33d0: 7a 65 29 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f  ze);.  t = vfslo
33e0: 67 5f 74 69 6d 65 28 29 20 2d 20 74 3b 0a 20 20  g_time() - t;.  
33f0: 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70 2d 3e 70  vfslog_call(p->p
3400: 56 66 73 6c 6f 67 2c 20 4f 53 5f 53 48 4d 53 49  Vfslog, OS_SHMSI
3410: 5a 45 2c 20 70 2d 3e 69 46 69 6c 65 49 64 2c 20  ZE, p->iFileId, 
3420: 74 2c 20 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20  t, rc, 0, 0);.  
3430: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
3440: 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 53 68  tic int vfslogSh
3450: 6d 47 65 74 28 73 71 6c 69 74 65 33 5f 66 69 6c  mGet(sqlite3_fil
3460: 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 72 65  e *pFile, int re
3470: 71 2c 20 69 6e 74 20 2a 70 53 69 7a 65 2c 20 76  q, int *pSize, v
3480: 6f 69 64 20 2a 2a 70 70 29 7b 0a 20 20 69 6e 74  oid **pp){.  int
3490: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75   rc;.  sqlite3_u
34a0: 69 6e 74 36 34 20 74 3b 0a 20 20 56 66 73 6c 6f  int64 t;.  Vfslo
34b0: 67 46 69 6c 65 20 2a 70 20 3d 20 28 56 66 73 6c  gFile *p = (Vfsl
34c0: 6f 67 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  ogFile *)pFile;.
34d0: 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d    t = vfslog_tim
34e0: 65 28 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 70  e();.  rc = p->p
34f0: 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
3500: 78 53 68 6d 47 65 74 28 70 2d 3e 70 52 65 61 6c  xShmGet(p->pReal
3510: 2c 20 72 65 71 2c 20 70 53 69 7a 65 2c 20 70 70  , req, pSize, pp
3520: 29 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f  );.  t = vfslog_
3530: 74 69 6d 65 28 29 20 2d 20 74 3b 0a 20 20 76 66  time() - t;.  vf
3540: 73 6c 6f 67 5f 63 61 6c 6c 28 70 2d 3e 70 56 66  slog_call(p->pVf
3550: 73 6c 6f 67 2c 20 4f 53 5f 53 48 4d 47 45 54 2c  slog, OS_SHMGET,
3560: 20 70 2d 3e 69 46 69 6c 65 49 64 2c 20 74 2c 20   p->iFileId, t, 
3570: 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74  rc, 0, 0);.  ret
3580: 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
3590: 20 69 6e 74 20 76 66 73 6c 6f 67 53 68 6d 52 65   int vfslogShmRe
35a0: 6c 65 61 73 65 28 73 71 6c 69 74 65 33 5f 66 69  lease(sqlite3_fi
35b0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
35c0: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
35d0: 75 69 6e 74 36 34 20 74 3b 0a 20 20 56 66 73 6c  uint64 t;.  Vfsl
35e0: 6f 67 46 69 6c 65 20 2a 70 20 3d 20 28 56 66 73  ogFile *p = (Vfs
35f0: 6c 6f 67 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  logFile *)pFile;
3600: 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69  .  t = vfslog_ti
3610: 6d 65 28 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e  me();.  rc = p->
3620: 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
3630: 3e 78 53 68 6d 52 65 6c 65 61 73 65 28 70 2d 3e  >xShmRelease(p->
3640: 70 52 65 61 6c 29 3b 0a 20 20 74 20 3d 20 76 66  pReal);.  t = vf
3650: 73 6c 6f 67 5f 74 69 6d 65 28 29 20 2d 20 74 3b  slog_time() - t;
3660: 0a 20 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70  .  vfslog_call(p
3670: 2d 3e 70 56 66 73 6c 6f 67 2c 20 4f 53 5f 53 48  ->pVfslog, OS_SH
3680: 4d 52 45 4c 45 41 53 45 2c 20 70 2d 3e 69 46 69  MRELEASE, p->iFi
3690: 6c 65 49 64 2c 20 74 2c 20 72 63 2c 20 30 2c 20  leId, t, rc, 0, 
36a0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  0);.  return rc;
36b0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  .}.static int vf
36c0: 73 6c 6f 67 53 68 6d 4c 6f 63 6b 28 73 71 6c 69  slogShmLock(sqli
36d0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
36e0: 20 69 6e 74 20 64 65 73 69 72 65 64 4c 6f 63 6b   int desiredLock
36f0: 2c 20 69 6e 74 20 2a 67 6f 74 4c 6f 63 6b 29 7b  , int *gotLock){
3700: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
3710: 69 74 65 33 5f 75 69 6e 74 36 34 20 74 3b 0a 20  ite3_uint64 t;. 
3720: 20 56 66 73 6c 6f 67 46 69 6c 65 20 2a 70 20 3d   VfslogFile *p =
3730: 20 28 56 66 73 6c 6f 67 46 69 6c 65 20 2a 29 70   (VfslogFile *)p
3740: 46 69 6c 65 3b 0a 20 20 74 20 3d 20 76 66 73 6c  File;.  t = vfsl
3750: 6f 67 5f 74 69 6d 65 28 29 3b 0a 20 20 72 63 20  og_time();.  rc 
3760: 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74  = p->pReal->pMet
3770: 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 70  hods->xShmLock(p
3780: 2d 3e 70 52 65 61 6c 2c 20 64 65 73 69 72 65 64  ->pReal, desired
3790: 4c 6f 63 6b 2c 20 67 6f 74 4c 6f 63 6b 29 3b 0a  Lock, gotLock);.
37a0: 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d    t = vfslog_tim
37b0: 65 28 29 20 2d 20 74 3b 0a 20 20 76 66 73 6c 6f  e() - t;.  vfslo
37c0: 67 5f 63 61 6c 6c 28 70 2d 3e 70 56 66 73 6c 6f  g_call(p->pVfslo
37d0: 67 2c 20 4f 53 5f 53 48 4d 4c 4f 43 4b 2c 20 70  g, OS_SHMLOCK, p
37e0: 2d 3e 69 46 69 6c 65 49 64 2c 20 74 2c 20 72 63  ->iFileId, t, rc
37f0: 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  , 0, 0);.  retur
3800: 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69  n rc;.}.static i
3810: 6e 74 20 76 66 73 6c 6f 67 53 68 6d 43 6c 6f 73  nt vfslogShmClos
3820: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
3830: 70 46 69 6c 65 2c 20 69 6e 74 20 64 65 6c 65 74  pFile, int delet
3840: 65 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 72 63  eFlag){.  int rc
3850: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74  ;.  sqlite3_uint
3860: 36 34 20 74 3b 0a 20 20 56 66 73 6c 6f 67 46 69  64 t;.  VfslogFi
3870: 6c 65 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67 46  le *p = (VfslogF
3880: 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 74  ile *)pFile;.  t
3890: 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29   = vfslog_time()
38a0: 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61  ;.  rc = p->pRea
38b0: 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68  l->pMethods->xSh
38c0: 6d 43 6c 6f 73 65 28 70 2d 3e 70 52 65 61 6c 2c  mClose(p->pReal,
38d0: 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20   deleteFlag);.  
38e0: 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28  t = vfslog_time(
38f0: 29 20 2d 20 74 3b 0a 20 20 76 66 73 6c 6f 67 5f  ) - t;.  vfslog_
3900: 63 61 6c 6c 28 70 2d 3e 70 56 66 73 6c 6f 67 2c  call(p->pVfslog,
3910: 20 4f 53 5f 53 48 4d 43 4c 4f 53 45 2c 20 70 2d   OS_SHMCLOSE, p-
3920: 3e 69 46 69 6c 65 49 64 2c 20 74 2c 20 72 63 2c  >iFileId, t, rc,
3930: 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e   0, 0);.  return
3940: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f   rc;.}.../*.** O
3950: 70 65 6e 20 61 6e 20 76 66 73 6c 6f 67 20 66 69  pen an vfslog fi
3960: 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  le handle..*/.st
3970: 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 4f  atic int vfslogO
3980: 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
3990: 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73  fs *pVfs,.  cons
39a0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20  t char *zName,. 
39b0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
39c0: 46 69 6c 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67  File,.  int flag
39d0: 73 2c 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c  s,.  int *pOutFl
39e0: 61 67 73 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ags.){.  int rc;
39f0: 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36  .  sqlite3_uint6
3a00: 34 20 74 3b 0a 20 20 56 66 73 6c 6f 67 46 69 6c  4 t;.  VfslogFil
3a10: 65 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67 46 69  e *p = (VfslogFi
3a20: 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 56 66  le *)pFile;.  Vf
3a30: 73 6c 6f 67 56 66 73 20 2a 70 4c 6f 67 20 3d 20  slogVfs *pLog = 
3a40: 28 56 66 73 6c 6f 67 56 66 73 20 2a 29 70 56 66  (VfslogVfs *)pVf
3a50: 73 3b 0a 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65  s;..  pFile->pMe
3a60: 74 68 6f 64 73 20 3d 20 26 76 66 73 6c 6f 67 5f  thods = &vfslog_
3a70: 69 6f 5f 6d 65 74 68 6f 64 73 3b 0a 20 20 70 2d  io_methods;.  p-
3a80: 3e 70 52 65 61 6c 20 3d 20 28 73 71 6c 69 74 65  >pReal = (sqlite
3a90: 33 5f 66 69 6c 65 20 2a 29 26 70 5b 31 5d 3b 0a  3_file *)&p[1];.
3aa0: 20 20 70 2d 3e 70 56 66 73 6c 6f 67 20 3d 20 70    p->pVfslog = p
3ab0: 56 66 73 3b 0a 20 20 70 2d 3e 69 46 69 6c 65 49  Vfs;.  p->iFileI
3ac0: 64 20 3d 20 2b 2b 70 4c 6f 67 2d 3e 69 4e 65 78  d = ++pLog->iNex
3ad0: 74 46 69 6c 65 49 64 3b 0a 0a 20 20 74 20 3d 20  tFileId;..  t = 
3ae0: 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29 3b 0a 20  vfslog_time();. 
3af0: 20 72 63 20 3d 20 52 45 41 4c 56 46 53 28 70 56   rc = REALVFS(pV
3b00: 66 73 29 2d 3e 78 4f 70 65 6e 28 52 45 41 4c 56  fs)->xOpen(REALV
3b10: 46 53 28 70 56 66 73 29 2c 20 7a 4e 61 6d 65 2c  FS(pVfs), zName,
3b20: 20 70 2d 3e 70 52 65 61 6c 2c 20 66 6c 61 67 73   p->pReal, flags
3b30: 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20  , pOutFlags);.  
3b40: 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28  t = vfslog_time(
3b50: 29 20 2d 20 74 3b 0a 0a 20 20 76 66 73 6c 6f 67  ) - t;..  vfslog
3b60: 5f 63 61 6c 6c 28 70 56 66 73 2c 20 4f 53 5f 4f  _call(pVfs, OS_O
3b70: 50 45 4e 2c 20 70 2d 3e 69 46 69 6c 65 49 64 2c  PEN, p->iFileId,
3b80: 20 74 2c 20 72 63 2c 20 30 2c 20 30 29 3b 0a 20   t, rc, 0, 0);. 
3b90: 20 76 66 73 6c 6f 67 5f 73 74 72 69 6e 67 28 70   vfslog_string(p
3ba0: 56 66 73 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  Vfs, zName);.  r
3bb0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3bc0: 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69  ** Delete the fi
3bd0: 6c 65 20 6c 6f 63 61 74 65 64 20 61 74 20 7a 50  le located at zP
3be0: 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53  ath. If the dirS
3bf0: 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ync argument is 
3c00: 74 72 75 65 2c 0a 2a 2a 20 65 6e 73 75 72 65 20  true,.** ensure 
3c10: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
3c20: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 61 72  modifications ar
3c30: 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  e synced to disk
3c40: 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72   before.** retur
3c50: 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
3c60: 69 6e 74 20 76 66 73 6c 6f 67 44 65 6c 65 74 65  int vfslogDelete
3c70: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
3c80: 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fs, const char *
3c90: 7a 50 61 74 68 2c 20 69 6e 74 20 64 69 72 53 79  zPath, int dirSy
3ca0: 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nc){.  int rc;. 
3cb0: 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20   sqlite3_uint64 
3cc0: 74 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f  t;.  t = vfslog_
3cd0: 74 69 6d 65 28 29 3b 0a 20 20 72 63 20 3d 20 52  time();.  rc = R
3ce0: 45 41 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 44  EALVFS(pVfs)->xD
3cf0: 65 6c 65 74 65 28 52 45 41 4c 56 46 53 28 70 56  elete(REALVFS(pV
3d00: 66 73 29 2c 20 7a 50 61 74 68 2c 20 64 69 72 53  fs), zPath, dirS
3d10: 79 6e 63 29 3b 0a 20 20 74 20 3d 20 76 66 73 6c  ync);.  t = vfsl
3d20: 6f 67 5f 74 69 6d 65 28 29 20 2d 20 74 3b 0a 20  og_time() - t;. 
3d30: 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70 56 66   vfslog_call(pVf
3d40: 73 2c 20 4f 53 5f 44 45 4c 45 54 45 2c 20 30 2c  s, OS_DELETE, 0,
3d50: 20 74 2c 20 72 63 2c 20 64 69 72 53 79 6e 63 2c   t, rc, dirSync,
3d60: 20 30 29 3b 0a 20 20 76 66 73 6c 6f 67 5f 73 74   0);.  vfslog_st
3d70: 72 69 6e 67 28 70 56 66 73 2c 20 7a 50 61 74 68  ring(pVfs, zPath
3d80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
3d90: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 66 6f  }../*.** Test fo
3da0: 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  r access permiss
3db0: 69 6f 6e 73 2e 20 52 65 74 75 72 6e 20 74 72 75  ions. Return tru
3dc0: 65 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74  e if the request
3dd0: 65 64 20 70 65 72 6d 69 73 73 69 6f 6e 0a 2a 2a  ed permission.**
3de0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f   is available, o
3df0: 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
3e00: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
3e10: 20 76 66 73 6c 6f 67 41 63 63 65 73 73 28 0a 20   vfslogAccess(. 
3e20: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
3e30: 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  fs, .  const cha
3e40: 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74  r *zPath, .  int
3e50: 20 66 6c 61 67 73 2c 20 0a 20 20 69 6e 74 20 2a   flags, .  int *
3e60: 70 52 65 73 4f 75 74 0a 29 7b 0a 20 20 69 6e 74  pResOut.){.  int
3e70: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75   rc;.  sqlite3_u
3e80: 69 6e 74 36 34 20 74 3b 0a 20 20 74 20 3d 20 76  int64 t;.  t = v
3e90: 66 73 6c 6f 67 5f 74 69 6d 65 28 29 3b 0a 20 20  fslog_time();.  
3ea0: 72 63 20 3d 20 52 45 41 4c 56 46 53 28 70 56 66  rc = REALVFS(pVf
3eb0: 73 29 2d 3e 78 41 63 63 65 73 73 28 52 45 41 4c  s)->xAccess(REAL
3ec0: 56 46 53 28 70 56 66 73 29 2c 20 7a 50 61 74 68  VFS(pVfs), zPath
3ed0: 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f 75 74  , flags, pResOut
3ee0: 29 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f  );.  t = vfslog_
3ef0: 74 69 6d 65 28 29 20 2d 20 74 3b 0a 20 20 76 66  time() - t;.  vf
3f00: 73 6c 6f 67 5f 63 61 6c 6c 28 70 56 66 73 2c 20  slog_call(pVfs, 
3f10: 4f 53 5f 41 43 43 45 53 53 2c 20 30 2c 20 74 2c  OS_ACCESS, 0, t,
3f20: 20 72 63 2c 20 66 6c 61 67 73 2c 20 2a 70 52 65   rc, flags, *pRe
3f30: 73 4f 75 74 29 3b 0a 20 20 76 66 73 6c 6f 67 5f  sOut);.  vfslog_
3f40: 73 74 72 69 6e 67 28 70 56 66 73 2c 20 7a 50 61  string(pVfs, zPa
3f50: 74 68 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  th);.  return rc
3f60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c  ;.}../*.** Popul
3f70: 61 74 65 20 62 75 66 66 65 72 20 7a 4f 75 74 20  ate buffer zOut 
3f80: 77 69 74 68 20 74 68 65 20 66 75 6c 6c 20 63 61  with the full ca
3f90: 6e 6f 6e 69 63 61 6c 20 70 61 74 68 6e 61 6d 65  nonical pathname
3fa0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
3fb0: 2a 20 74 6f 20 74 68 65 20 70 61 74 68 6e 61 6d  * to the pathnam
3fc0: 65 20 69 6e 20 7a 50 61 74 68 2e 20 7a 4f 75 74  e in zPath. zOut
3fd0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
3fe0: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
3ff0: 66 65 72 0a 2a 2a 20 6f 66 20 61 74 20 6c 65 61  fer.** of at lea
4000: 73 74 20 28 49 4e 53 54 5f 4d 41 58 5f 50 41 54  st (INST_MAX_PAT
4010: 48 4e 41 4d 45 2b 31 29 20 62 79 74 65 73 2e 0a  HNAME+1) bytes..
4020: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  */.static int vf
4030: 73 6c 6f 67 46 75 6c 6c 50 61 74 68 6e 61 6d 65  slogFullPathname
4040: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
4050: 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20  *pVfs, .  const 
4060: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20  char *zPath, .  
4070: 69 6e 74 20 6e 4f 75 74 2c 20 0a 20 20 63 68 61  int nOut, .  cha
4080: 72 20 2a 7a 4f 75 74 0a 29 7b 0a 20 20 72 65 74  r *zOut.){.  ret
4090: 75 72 6e 20 52 45 41 4c 56 46 53 28 70 56 66 73  urn REALVFS(pVfs
40a0: 29 2d 3e 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  )->xFullPathname
40b0: 28 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20  (REALVFS(pVfs), 
40c0: 7a 50 61 74 68 2c 20 6e 4f 75 74 2c 20 7a 4f 75  zPath, nOut, zOu
40d0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  t);.}../*.** Ope
40e0: 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69  n the dynamic li
40f0: 62 72 61 72 79 20 6c 6f 63 61 74 65 64 20 61 74  brary located at
4100: 20 7a 50 61 74 68 20 61 6e 64 20 72 65 74 75 72   zPath and retur
4110: 6e 20 61 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  n a handle..*/.s
4120: 74 61 74 69 63 20 76 6f 69 64 20 2a 76 66 73 6c  tatic void *vfsl
4130: 6f 67 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  ogDlOpen(sqlite3
4140: 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73  _vfs *pVfs, cons
4150: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 29 7b 0a  t char *zPath){.
4160: 20 20 72 65 74 75 72 6e 20 52 45 41 4c 56 46 53    return REALVFS
4170: 28 70 56 66 73 29 2d 3e 78 44 6c 4f 70 65 6e 28  (pVfs)->xDlOpen(
4180: 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20 7a  REALVFS(pVfs), z
4190: 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Path);.}../*.** 
41a0: 50 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75 66  Populate the buf
41b0: 66 65 72 20 7a 45 72 72 4d 73 67 20 28 73 69 7a  fer zErrMsg (siz
41c0: 65 20 6e 42 79 74 65 20 62 79 74 65 73 29 20 77  e nByte bytes) w
41d0: 69 74 68 20 61 20 68 75 6d 61 6e 20 72 65 61 64  ith a human read
41e0: 61 62 6c 65 0a 2a 2a 20 75 74 66 2d 38 20 73 74  able.** utf-8 st
41f0: 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20  ring describing 
4200: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
4210: 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
4220: 64 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a  d associated .**
4230: 20 77 69 74 68 20 64 79 6e 61 6d 69 63 20 6c 69   with dynamic li
4240: 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  braries..*/.stat
4250: 69 63 20 76 6f 69 64 20 76 66 73 6c 6f 67 44 6c  ic void vfslogDl
4260: 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
4270: 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79  s *pVfs, int nBy
4280: 74 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  te, char *zErrMs
4290: 67 29 7b 0a 20 20 52 45 41 4c 56 46 53 28 70 56  g){.  REALVFS(pV
42a0: 66 73 29 2d 3e 78 44 6c 45 72 72 6f 72 28 52 45  fs)->xDlError(RE
42b0: 41 4c 56 46 53 28 70 56 66 73 29 2c 20 6e 42 79  ALVFS(pVfs), nBy
42c0: 74 65 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 7d 0a  te, zErrMsg);.}.
42d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
42e0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
42f0: 79 6d 62 6f 6c 20 7a 53 79 6d 62 6f 6c 20 69 6e  ymbol zSymbol in
4300: 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62   the dynamic lib
4310: 72 61 72 79 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f  rary pHandle..*/
4320: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 76  .static void (*v
4330: 66 73 6c 6f 67 44 6c 53 79 6d 28 73 71 6c 69 74  fslogDlSym(sqlit
4340: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
4350: 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  id *p, const cha
4360: 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b  r *zSym))(void){
4370: 0a 20 20 72 65 74 75 72 6e 20 52 45 41 4c 56 46  .  return REALVF
4380: 53 28 70 56 66 73 29 2d 3e 78 44 6c 53 79 6d 28  S(pVfs)->xDlSym(
4390: 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20 70  REALVFS(pVfs), p
43a0: 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , zSym);.}../*.*
43b0: 2a 20 43 6c 6f 73 65 20 74 68 65 20 64 79 6e 61  * Close the dyna
43c0: 6d 69 63 20 6c 69 62 72 61 72 79 20 68 61 6e 64  mic library hand
43d0: 6c 65 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  le pHandle..*/.s
43e0: 74 61 74 69 63 20 76 6f 69 64 20 76 66 73 6c 6f  tatic void vfslo
43f0: 67 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  gDlClose(sqlite3
4400: 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
4410: 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 52 45   *pHandle){.  RE
4420: 41 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 44 6c  ALVFS(pVfs)->xDl
4430: 43 6c 6f 73 65 28 52 45 41 4c 56 46 53 28 70 56  Close(REALVFS(pV
4440: 66 73 29 2c 20 70 48 61 6e 64 6c 65 29 3b 0a 7d  fs), pHandle);.}
4450: 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ../*.** Populate
4460: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
4470: 74 65 64 20 74 6f 20 62 79 20 7a 42 75 66 4f 75  ted to by zBufOu
4480: 74 20 77 69 74 68 20 6e 42 79 74 65 20 62 79 74  t with nByte byt
4490: 65 73 20 6f 66 20 0a 2a 2a 20 72 61 6e 64 6f 6d  es of .** random
44a0: 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
44b0: 20 69 6e 74 20 76 66 73 6c 6f 67 52 61 6e 64 6f   int vfslogRando
44c0: 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
44d0: 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79  s *pVfs, int nBy
44e0: 74 65 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  te, char *zBufOu
44f0: 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 45 41  t){.  return REA
4500: 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 52 61 6e  LVFS(pVfs)->xRan
4510: 64 6f 6d 6e 65 73 73 28 52 45 41 4c 56 46 53 28  domness(REALVFS(
4520: 70 56 66 73 29 2c 20 6e 42 79 74 65 2c 20 7a 42  pVfs), nByte, zB
4530: 75 66 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ufOut);.}../*.**
4540: 20 53 6c 65 65 70 20 66 6f 72 20 6e 4d 69 63 72   Sleep for nMicr
4550: 6f 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20  o microseconds. 
4560: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
4570: 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
4580: 73 20 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 73  s .** actually s
4590: 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lept..*/.static 
45a0: 69 6e 74 20 76 66 73 6c 6f 67 53 6c 65 65 70 28  int vfslogSleep(
45b0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
45c0: 73 2c 20 69 6e 74 20 6e 4d 69 63 72 6f 29 7b 0a  s, int nMicro){.
45d0: 20 20 72 65 74 75 72 6e 20 52 45 41 4c 56 46 53    return REALVFS
45e0: 28 70 56 66 73 29 2d 3e 78 53 6c 65 65 70 28 52  (pVfs)->xSleep(R
45f0: 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20 6e 4d  EALVFS(pVfs), nM
4600: 69 63 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  icro);.}../*.** 
4610: 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
4620: 6e 74 20 74 69 6d 65 20 61 73 20 61 20 4a 75 6c  nt time as a Jul
4630: 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
4640: 6e 20 2a 70 54 69 6d 65 4f 75 74 2e 0a 2a 2f 0a  n *pTimeOut..*/.
4650: 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f  static int vfslo
4660: 67 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  gCurrentTime(sql
4670: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
4680: 64 6f 75 62 6c 65 20 2a 70 54 69 6d 65 4f 75 74  double *pTimeOut
4690: 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 45 41 4c  ){.  return REAL
46a0: 56 46 53 28 70 56 66 73 29 2d 3e 78 43 75 72 72  VFS(pVfs)->xCurr
46b0: 65 6e 74 54 69 6d 65 28 52 45 41 4c 56 46 53 28  entTime(REALVFS(
46c0: 70 56 66 73 29 2c 20 70 54 69 6d 65 4f 75 74 29  pVfs), pTimeOut)
46d0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
46e0: 20 76 66 73 6c 6f 67 5f 66 6c 75 73 68 28 56 66   vfslog_flush(Vf
46f0: 73 6c 6f 67 56 66 73 20 2a 70 29 7b 0a 23 69 66  slogVfs *p){.#if
4700: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
4710: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
4720: 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
4730: 6e 64 69 6e 67 3b 0a 20 20 65 78 74 65 72 6e 20  nding;.  extern 
4740: 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
4750: 72 72 6f 72 5f 70 65 72 73 69 73 74 3b 0a 20 20  rror_persist;.  
4760: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
4770: 65 33 5f 64 69 73 6b 66 75 6c 6c 5f 70 65 6e 64  e3_diskfull_pend
4780: 69 6e 67 3b 0a 0a 20 20 69 6e 74 20 70 65 6e 64  ing;..  int pend
4790: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  ing = sqlite3_io
47a0: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
47b0: 20 20 69 6e 74 20 70 65 72 73 69 73 74 20 3d 20    int persist = 
47c0: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
47d0: 5f 70 65 72 73 69 73 74 3b 0a 20 20 69 6e 74 20  _persist;.  int 
47e0: 64 69 73 6b 66 75 6c 6c 20 3d 20 73 71 6c 69 74  diskfull = sqlit
47f0: 65 33 5f 64 69 73 6b 66 75 6c 6c 5f 70 65 6e 64  e3_diskfull_pend
4800: 69 6e 67 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ing;..  sqlite3_
4810: 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
4820: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
4830: 69 6f 5f 65 72 72 6f 72 5f 70 65 72 73 69 73 74  io_error_persist
4840: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
4850: 64 69 73 6b 66 75 6c 6c 5f 70 65 6e 64 69 6e 67  diskfull_pending
4860: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
4870: 69 66 28 20 70 2d 3e 6e 42 75 66 20 29 7b 0a 20  if( p->nBuf ){. 
4880: 20 20 20 70 2d 3e 70 4c 6f 67 2d 3e 70 4d 65 74     p->pLog->pMet
4890: 68 6f 64 73 2d 3e 78 57 72 69 74 65 28 70 2d 3e  hods->xWrite(p->
48a0: 70 4c 6f 67 2c 20 70 2d 3e 61 42 75 66 2c 20 70  pLog, p->aBuf, p
48b0: 2d 3e 6e 42 75 66 2c 20 70 2d 3e 69 4f 66 66 73  ->nBuf, p->iOffs
48c0: 65 74 29 3b 0a 20 20 20 20 70 2d 3e 69 4f 66 66  et);.    p->iOff
48d0: 73 65 74 20 2b 3d 20 70 2d 3e 6e 42 75 66 3b 0a  set += p->nBuf;.
48e0: 20 20 20 20 70 2d 3e 6e 42 75 66 20 3d 20 30 3b      p->nBuf = 0;
48f0: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
4900: 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
4910: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
4920: 69 6e 67 20 3d 20 70 65 6e 64 69 6e 67 3b 0a 20  ing = pending;. 
4930: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
4940: 72 5f 70 65 72 73 69 73 74 20 3d 20 70 65 72 73  r_persist = pers
4950: 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64  ist;.  sqlite3_d
4960: 69 73 6b 66 75 6c 6c 5f 70 65 6e 64 69 6e 67 20  iskfull_pending 
4970: 3d 20 64 69 73 6b 66 75 6c 6c 3b 0a 23 65 6e 64  = diskfull;.#end
4980: 69 66 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  if.}..static voi
4990: 64 20 70 75 74 33 32 62 69 74 73 28 75 6e 73 69  d put32bits(unsi
49a0: 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75 6e  gned char *p, un
49b0: 73 69 67 6e 65 64 20 69 6e 74 20 76 29 7b 0a 20  signed int v){. 
49c0: 20 70 5b 30 5d 20 3d 20 76 3e 3e 32 34 3b 0a 20   p[0] = v>>24;. 
49d0: 20 70 5b 31 5d 20 3d 20 76 3e 3e 31 36 3b 0a 20   p[1] = v>>16;. 
49e0: 20 70 5b 32 5d 20 3d 20 76 3e 3e 38 3b 0a 20 20   p[2] = v>>8;.  
49f0: 70 5b 33 5d 20 3d 20 76 3b 0a 7d 0a 0a 73 74 61  p[3] = v;.}..sta
4a00: 74 69 63 20 76 6f 69 64 20 76 66 73 6c 6f 67 5f  tic void vfslog_
4a10: 63 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f  call(.  sqlite3_
4a20: 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 69 6e 74  vfs *pVfs,.  int
4a30: 20 65 45 76 65 6e 74 2c 0a 20 20 69 6e 74 20 69   eEvent,.  int i
4a40: 46 69 6c 65 69 64 2c 0a 20 20 69 6e 74 20 6e 43  Fileid,.  int nC
4a50: 6c 69 63 6b 2c 0a 20 20 69 6e 74 20 72 65 74 75  lick,.  int retu
4a60: 72 6e 5f 63 6f 64 65 2c 0a 20 20 69 6e 74 20 73  rn_code,.  int s
4a70: 69 7a 65 2c 0a 20 20 69 6e 74 20 6f 66 66 73 65  ize,.  int offse
4a80: 74 0a 29 7b 0a 20 20 56 66 73 6c 6f 67 56 66 73  t.){.  VfslogVfs
4a90: 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67 56 66 73   *p = (VfslogVfs
4aa0: 20 2a 29 70 56 66 73 3b 0a 20 20 75 6e 73 69 67   *)pVfs;.  unsig
4ab0: 6e 65 64 20 63 68 61 72 20 2a 7a 52 65 63 3b 0a  ned char *zRec;.
4ac0: 20 20 69 66 28 20 28 32 34 2b 70 2d 3e 6e 42 75    if( (24+p->nBu
4ad0: 66 29 3e 73 69 7a 65 6f 66 28 70 2d 3e 61 42 75  f)>sizeof(p->aBu
4ae0: 66 29 20 29 7b 0a 20 20 20 20 76 66 73 6c 6f 67  f) ){.    vfslog
4af0: 5f 66 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a 20  _flush(p);.  }. 
4b00: 20 7a 52 65 63 20 3d 20 28 75 6e 73 69 67 6e 65   zRec = (unsigne
4b10: 64 20 63 68 61 72 20 2a 29 26 70 2d 3e 61 42 75  d char *)&p->aBu
4b20: 66 5b 70 2d 3e 6e 42 75 66 5d 3b 0a 20 20 70 75  f[p->nBuf];.  pu
4b30: 74 33 32 62 69 74 73 28 26 7a 52 65 63 5b 30 5d  t32bits(&zRec[0]
4b40: 2c 20 65 45 76 65 6e 74 29 3b 0a 20 20 70 75 74  , eEvent);.  put
4b50: 33 32 62 69 74 73 28 26 7a 52 65 63 5b 34 5d 2c  32bits(&zRec[4],
4b60: 20 69 46 69 6c 65 69 64 29 3b 0a 20 20 70 75 74   iFileid);.  put
4b70: 33 32 62 69 74 73 28 26 7a 52 65 63 5b 38 5d 2c  32bits(&zRec[8],
4b80: 20 6e 43 6c 69 63 6b 29 3b 0a 20 20 70 75 74 33   nClick);.  put3
4b90: 32 62 69 74 73 28 26 7a 52 65 63 5b 31 32 5d 2c  2bits(&zRec[12],
4ba0: 20 72 65 74 75 72 6e 5f 63 6f 64 65 29 3b 0a 20   return_code);. 
4bb0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 52 65 63   put32bits(&zRec
4bc0: 5b 31 36 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70  [16], size);.  p
4bd0: 75 74 33 32 62 69 74 73 28 26 7a 52 65 63 5b 32  ut32bits(&zRec[2
4be0: 30 5d 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 70  0], offset);.  p
4bf0: 2d 3e 6e 42 75 66 20 2b 3d 20 32 34 3b 0a 7d 0a  ->nBuf += 24;.}.
4c00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 66 73  .static void vfs
4c10: 6c 6f 67 5f 73 74 72 69 6e 67 28 73 71 6c 69 74  log_string(sqlit
4c20: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f  e3_vfs *pVfs, co
4c30: 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 29 7b  nst char *zStr){
4c40: 0a 20 20 56 66 73 6c 6f 67 56 66 73 20 2a 70 20  .  VfslogVfs *p 
4c50: 3d 20 28 56 66 73 6c 6f 67 56 66 73 20 2a 29 70  = (VfslogVfs *)p
4c60: 56 66 73 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  Vfs;.  unsigned 
4c70: 63 68 61 72 20 2a 7a 52 65 63 3b 0a 20 20 69 6e  char *zRec;.  in
4c80: 74 20 6e 53 74 72 20 3d 20 7a 53 74 72 20 3f 20  t nStr = zStr ? 
4c90: 73 74 72 6c 65 6e 28 7a 53 74 72 29 20 3a 20 30  strlen(zStr) : 0
4ca0: 3b 0a 20 20 69 66 28 20 28 34 2b 6e 53 74 72 2b  ;.  if( (4+nStr+
4cb0: 70 2d 3e 6e 42 75 66 29 3e 73 69 7a 65 6f 66 28  p->nBuf)>sizeof(
4cc0: 70 2d 3e 61 42 75 66 29 20 29 7b 0a 20 20 20 20  p->aBuf) ){.    
4cd0: 76 66 73 6c 6f 67 5f 66 6c 75 73 68 28 70 29 3b  vfslog_flush(p);
4ce0: 0a 20 20 7d 0a 20 20 7a 52 65 63 20 3d 20 28 75  .  }.  zRec = (u
4cf0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 26  nsigned char *)&
4d00: 70 2d 3e 61 42 75 66 5b 70 2d 3e 6e 42 75 66 5d  p->aBuf[p->nBuf]
4d10: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
4d20: 52 65 63 5b 30 5d 2c 20 6e 53 74 72 29 3b 0a 20  Rec[0], nStr);. 
4d30: 20 69 66 28 20 7a 53 74 72 20 29 7b 0a 20 20 20   if( zStr ){.   
4d40: 20 6d 65 6d 63 70 79 28 26 7a 52 65 63 5b 34 5d   memcpy(&zRec[4]
4d50: 2c 20 7a 53 74 72 2c 20 6e 53 74 72 29 3b 0a 20  , zStr, nStr);. 
4d60: 20 7d 0a 20 20 70 2d 3e 6e 42 75 66 20 2b 3d 20   }.  p->nBuf += 
4d70: 28 34 20 2b 20 6e 53 74 72 29 3b 0a 7d 0a 0a 73  (4 + nStr);.}..s
4d80: 74 61 74 69 63 20 76 6f 69 64 20 76 66 73 6c 6f  tatic void vfslo
4d90: 67 5f 66 69 6e 61 6c 69 7a 65 28 56 66 73 6c 6f  g_finalize(Vfslo
4da0: 67 56 66 73 20 2a 70 29 7b 0a 20 20 69 66 28 20  gVfs *p){.  if( 
4db0: 70 2d 3e 70 4c 6f 67 2d 3e 70 4d 65 74 68 6f 64  p->pLog->pMethod
4dc0: 73 20 29 7b 0a 20 20 20 20 76 66 73 6c 6f 67 5f  s ){.    vfslog_
4dd0: 66 6c 75 73 68 28 70 29 3b 0a 20 20 20 20 70 2d  flush(p);.    p-
4de0: 3e 70 4c 6f 67 2d 3e 70 4d 65 74 68 6f 64 73 2d  >pLog->pMethods-
4df0: 3e 78 43 6c 6f 73 65 28 70 2d 3e 70 4c 6f 67 29  >xClose(p->pLog)
4e00: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
4e10: 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 69 6e 74 20  free(p);.}..int 
4e20: 73 71 6c 69 74 65 33 5f 76 66 73 6c 6f 67 5f 66  sqlite3_vfslog_f
4e30: 69 6e 61 6c 69 7a 65 28 63 6f 6e 73 74 20 63 68  inalize(const ch
4e40: 61 72 20 2a 7a 56 66 73 29 7b 0a 20 20 73 71 6c  ar *zVfs){.  sql
4e50: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a  ite3_vfs *pVfs;.
4e60: 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33    pVfs = sqlite3
4e70: 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b  _vfs_find(zVfs);
4e80: 0a 20 20 69 66 28 20 21 70 56 66 73 20 7c 7c 20  .  if( !pVfs || 
4e90: 70 56 66 73 2d 3e 78 4f 70 65 6e 21 3d 76 66 73  pVfs->xOpen!=vfs
4ea0: 6c 6f 67 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  logOpen ){.    r
4eb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
4ec0: 4f 52 3b 0a 20 20 7d 20 0a 20 20 73 71 6c 69 74  OR;.  } .  sqlit
4ed0: 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65  e3_vfs_unregiste
4ee0: 72 28 70 56 66 73 29 3b 0a 20 20 76 66 73 6c 6f  r(pVfs);.  vfslo
4ef0: 67 5f 66 69 6e 61 6c 69 7a 65 28 28 56 66 73 6c  g_finalize((Vfsl
4f00: 6f 67 56 66 73 20 2a 29 70 56 66 73 29 3b 0a 20  ogVfs *)pVfs);. 
4f10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4f20: 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  K;.}..int sqlite
4f30: 33 5f 76 66 73 6c 6f 67 5f 6e 65 77 28 0a 20 20  3_vfslog_new(.  
4f40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
4f50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4f60: 2f 2a 20 4e 65 77 20 56 46 53 20 6e 61 6d 65 20  /* New VFS name 
4f70: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
4f80: 2a 7a 50 61 72 65 6e 74 56 66 73 2c 20 20 20 20  *zParentVfs,    
4f90: 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 56       /* Parent V
4fa0: 46 53 20 6e 61 6d 65 20 28 6f 72 20 4e 55 4c 4c  FS name (or NULL
4fb0: 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  ) */.  const cha
4fc0: 72 20 2a 7a 4c 6f 67 20 20 20 20 20 20 20 20 20  r *zLog         
4fd0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 66 69         /* Log fi
4fe0: 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20  le name */.){.  
4ff0: 56 66 73 6c 6f 67 56 66 73 20 2a 70 3b 0a 20 20  VfslogVfs *p;.  
5000: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 50 61  sqlite3_vfs *pPa
5010: 72 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 42 79 74  rent;.  int nByt
5020: 65 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a  e;.  int flags;.
5030: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
5040: 20 2a 7a 46 69 6c 65 3b 0a 20 20 69 6e 74 20 6e   *zFile;.  int n
5050: 56 66 73 3b 0a 0a 20 20 70 50 61 72 65 6e 74 20  Vfs;..  pParent 
5060: 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
5070: 6e 64 28 7a 50 61 72 65 6e 74 56 66 73 29 3b 0a  nd(zParentVfs);.
5080: 20 20 69 66 28 20 21 70 50 61 72 65 6e 74 20 29    if( !pParent )
5090: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
50a0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
50b0: 20 20 6e 56 66 73 20 3d 20 73 74 72 6c 65 6e 28    nVfs = strlen(
50c0: 7a 56 66 73 29 3b 0a 20 20 6e 42 79 74 65 20 3d  zVfs);.  nByte =
50d0: 20 73 69 7a 65 6f 66 28 56 66 73 6c 6f 67 56 66   sizeof(VfslogVf
50e0: 73 29 20 2b 20 70 50 61 72 65 6e 74 2d 3e 73 7a  s) + pParent->sz
50f0: 4f 73 46 69 6c 65 20 2b 20 6e 56 66 73 2b 31 2b  OsFile + nVfs+1+
5100: 70 50 61 72 65 6e 74 2d 3e 6d 78 50 61 74 68 6e  pParent->mxPathn
5110: 61 6d 65 2b 31 3b 0a 20 20 70 20 3d 20 28 56 66  ame+1;.  p = (Vf
5120: 73 6c 6f 67 56 66 73 20 2a 29 73 71 6c 69 74 65  slogVfs *)sqlite
5130: 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b  3_malloc(nByte);
5140: 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
5150: 6e 42 79 74 65 29 3b 0a 0a 20 20 70 2d 3e 70 56  nByte);..  p->pV
5160: 66 73 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20  fs = pParent;.  
5170: 70 2d 3e 70 4c 6f 67 20 3d 20 28 73 71 6c 69 74  p->pLog = (sqlit
5180: 65 33 5f 66 69 6c 65 20 2a 29 26 70 5b 31 5d 3b  e3_file *)&p[1];
5190: 0a 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 62 61  .  memcpy(&p->ba
51a0: 73 65 2c 20 26 76 66 73 6c 6f 67 5f 76 66 73 2c  se, &vfslog_vfs,
51b0: 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f   sizeof(sqlite3_
51c0: 76 66 73 29 29 3b 0a 20 20 70 2d 3e 62 61 73 65  vfs));.  p->base
51d0: 2e 7a 4e 61 6d 65 20 3d 20 26 28 28 63 68 61 72  .zName = &((char
51e0: 20 2a 29 70 2d 3e 70 4c 6f 67 29 5b 70 50 61 72   *)p->pLog)[pPar
51f0: 65 6e 74 2d 3e 73 7a 4f 73 46 69 6c 65 5d 3b 0a  ent->szOsFile];.
5200: 20 20 70 2d 3e 62 61 73 65 2e 73 7a 4f 73 46 69    p->base.szOsFi
5210: 6c 65 20 2b 3d 20 70 50 61 72 65 6e 74 2d 3e 73  le += pParent->s
5220: 7a 4f 73 46 69 6c 65 3b 0a 20 20 6d 65 6d 63 70  zOsFile;.  memcp
5230: 79 28 28 63 68 61 72 20 2a 29 70 2d 3e 62 61 73  y((char *)p->bas
5240: 65 2e 7a 4e 61 6d 65 2c 20 7a 56 66 73 2c 20 6e  e.zName, zVfs, n
5250: 56 66 73 29 3b 0a 0a 20 20 7a 46 69 6c 65 20 3d  Vfs);..  zFile =
5260: 20 28 63 68 61 72 20 2a 29 26 70 2d 3e 62 61 73   (char *)&p->bas
5270: 65 2e 7a 4e 61 6d 65 5b 6e 56 66 73 2b 31 5d 3b  e.zName[nVfs+1];
5280: 0a 20 20 70 50 61 72 65 6e 74 2d 3e 78 46 75 6c  .  pParent->xFul
5290: 6c 50 61 74 68 6e 61 6d 65 28 70 50 61 72 65 6e  lPathname(pParen
52a0: 74 2c 20 7a 4c 6f 67 2c 20 70 50 61 72 65 6e 74  t, zLog, pParent
52b0: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46  ->mxPathname, zF
52c0: 69 6c 65 29 3b 0a 0a 20 20 66 6c 61 67 73 20 3d  ile);..  flags =
52d0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
52e0: 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
52f0: 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45  EN_CREATE|SQLITE
5300: 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
5310: 52 4e 41 4c 3b 0a 20 20 70 50 61 72 65 6e 74 2d  RNAL;.  pParent-
5320: 3e 78 44 65 6c 65 74 65 28 70 50 61 72 65 6e 74  >xDelete(pParent
5330: 2c 20 7a 46 69 6c 65 2c 20 30 29 3b 0a 20 20 72  , zFile, 0);.  r
5340: 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 78 4f 70  c = pParent->xOp
5350: 65 6e 28 70 50 61 72 65 6e 74 2c 20 7a 46 69 6c  en(pParent, zFil
5360: 65 2c 20 70 2d 3e 70 4c 6f 67 2c 20 66 6c 61 67  e, p->pLog, flag
5370: 73 2c 20 26 66 6c 61 67 73 29 3b 0a 20 20 69 66  s, &flags);.  if
5380: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5390: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d  ){.    memcpy(p-
53a0: 3e 61 42 75 66 2c 20 22 73 71 6c 69 74 65 5f 6f  >aBuf, "sqlite_o
53b0: 73 74 72 61 63 65 31 2e 2e 2e 2e 2e 22 2c 20 32  strace1.....", 2
53c0: 30 29 3b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73  0);.    p->iOffs
53d0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e  et = 0;.    p->n
53e0: 42 75 66 20 3d 20 32 30 3b 0a 20 20 20 20 72 63  Buf = 20;.    rc
53f0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72   = sqlite3_vfs_r
5400: 65 67 69 73 74 65 72 28 28 73 71 6c 69 74 65 33  egister((sqlite3
5410: 5f 76 66 73 20 2a 29 70 2c 20 31 29 3b 0a 20 20  _vfs *)p, 1);.  
5420: 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  }.  if( rc ){.  
5430: 20 20 76 66 73 6c 6f 67 5f 66 69 6e 61 6c 69 7a    vfslog_finaliz
5440: 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
5450: 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71  rn rc;.}..int sq
5460: 6c 69 74 65 33 5f 76 66 73 6c 6f 67 5f 61 6e 6e  lite3_vfslog_ann
5470: 6f 74 61 74 65 28 63 6f 6e 73 74 20 63 68 61 72  otate(const char
5480: 20 2a 7a 56 66 73 2c 20 63 6f 6e 73 74 20 63 68   *zVfs, const ch
5490: 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 73 71 6c  ar *zMsg){.  sql
54a0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a  ite3_vfs *pVfs;.
54b0: 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33    pVfs = sqlite3
54c0: 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b  _vfs_find(zVfs);
54d0: 0a 20 20 69 66 28 20 21 70 56 66 73 20 7c 7c 20  .  if( !pVfs || 
54e0: 70 56 66 73 2d 3e 78 4f 70 65 6e 21 3d 76 66 73  pVfs->xOpen!=vfs
54f0: 6c 6f 67 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  logOpen ){.    r
5500: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
5510: 4f 52 3b 0a 20 20 7d 20 0a 20 20 76 66 73 6c 6f  OR;.  } .  vfslo
5520: 67 5f 63 61 6c 6c 28 70 56 66 73 2c 20 4f 53 5f  g_call(pVfs, OS_
5530: 41 4e 4e 4f 54 41 54 45 2c 20 30 2c 20 30 2c 20  ANNOTATE, 0, 0, 
5540: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 76 66 73 6c  0, 0, 0);.  vfsl
5550: 6f 67 5f 73 74 72 69 6e 67 28 70 56 66 73 2c 20  og_string(pVfs, 
5560: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
5570: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
5580: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
5590: 2a 76 66 73 6c 6f 67 5f 65 76 65 6e 74 6e 61 6d  *vfslog_eventnam
55a0: 65 28 69 6e 74 20 65 45 76 65 6e 74 29 7b 0a 20  e(int eEvent){. 
55b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 76   const char *zEv
55c0: 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 73 77 69 74  ent = 0;..  swit
55d0: 63 68 28 20 65 45 76 65 6e 74 20 29 7b 0a 20 20  ch( eEvent ){.  
55e0: 20 20 63 61 73 65 20 4f 53 5f 43 4c 4f 53 45 3a    case OS_CLOSE:
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 45 76               zEv
5600: 65 6e 74 20 3d 20 22 78 43 6c 6f 73 65 22 3b 20  ent = "xClose"; 
5610: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5620: 4f 53 5f 52 45 41 44 3a 20 20 20 20 20 20 20 20  OS_READ:        
5630: 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22        zEvent = "
5640: 78 52 65 61 64 22 3b 20 62 72 65 61 6b 3b 0a 20  xRead"; break;. 
5650: 20 20 20 63 61 73 65 20 4f 53 5f 57 52 49 54 45     case OS_WRITE
5660: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 45  :             zE
5670: 76 65 6e 74 20 3d 20 22 78 57 72 69 74 65 22 3b  vent = "xWrite";
5680: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5690: 20 4f 53 5f 54 52 55 4e 43 41 54 45 3a 20 20 20   OS_TRUNCATE:   
56a0: 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20         zEvent = 
56b0: 22 78 54 72 75 6e 63 61 74 65 22 3b 20 62 72 65  "xTruncate"; bre
56c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f  ak;.    case OS_
56d0: 53 59 4e 43 3a 20 20 20 20 20 20 20 20 20 20 20  SYNC:           
56e0: 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 53 79     zEvent = "xSy
56f0: 6e 63 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  nc"; break;.    
5700: 63 61 73 65 20 4f 53 5f 46 49 4c 45 53 49 5a 45  case OS_FILESIZE
5710: 3a 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e  :          zEven
5720: 74 20 3d 20 22 78 46 69 6c 65 73 69 7a 65 22 3b  t = "xFilesize";
5730: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5740: 20 4f 53 5f 4c 4f 43 4b 3a 20 20 20 20 20 20 20   OS_LOCK:       
5750: 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20         zEvent = 
5760: 22 78 4c 6f 63 6b 22 3b 20 62 72 65 61 6b 3b 0a  "xLock"; break;.
5770: 20 20 20 20 63 61 73 65 20 4f 53 5f 55 4e 4c 4f      case OS_UNLO
5780: 43 4b 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a  CK:            z
5790: 45 76 65 6e 74 20 3d 20 22 78 55 6e 6c 6f 63 6b  Event = "xUnlock
57a0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
57b0: 73 65 20 4f 53 5f 43 48 45 43 4b 52 45 53 45 52  se OS_CHECKRESER
57c0: 56 45 44 4c 4f 43 4b 3a 20 7a 45 76 65 6e 74 20  VEDLOCK: zEvent 
57d0: 3d 20 22 78 43 68 65 63 6b 52 65 73 4c 6f 63 6b  = "xCheckResLock
57e0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
57f0: 73 65 20 4f 53 5f 46 49 4c 45 43 4f 4e 54 52 4f  se OS_FILECONTRO
5800: 4c 3a 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20  L:       zEvent 
5810: 3d 20 22 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 22  = "xFileControl"
5820: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5830: 65 20 4f 53 5f 53 45 43 54 4f 52 53 49 5a 45 3a  e OS_SECTORSIZE:
5840: 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d          zEvent =
5850: 20 22 78 53 65 63 74 6f 72 53 69 7a 65 22 3b 20   "xSectorSize"; 
5860: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5870: 4f 53 5f 44 45 56 43 48 41 52 3a 20 20 20 20 20  OS_DEVCHAR:     
5880: 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22        zEvent = "
5890: 78 44 65 76 69 63 65 43 68 61 72 22 3b 20 62 72  xDeviceChar"; br
58a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53  eak;.    case OS
58b0: 5f 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20 20  _OPEN:          
58c0: 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 4f      zEvent = "xO
58d0: 70 65 6e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  pen"; break;.   
58e0: 20 63 61 73 65 20 4f 53 5f 44 45 4c 45 54 45 3a   case OS_DELETE:
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 45 76 65              zEve
5900: 6e 74 20 3d 20 22 78 44 65 6c 65 74 65 22 3b 20  nt = "xDelete"; 
5910: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5920: 4f 53 5f 41 43 43 45 53 53 3a 20 20 20 20 20 20  OS_ACCESS:      
5930: 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22        zEvent = "
5940: 78 41 63 63 65 73 73 22 3b 20 62 72 65 61 6b 3b  xAccess"; break;
5950: 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 46 55 4c  .    case OS_FUL
5960: 4c 50 41 54 48 4e 41 4d 45 3a 20 20 20 20 20 20  LPATHNAME:      
5970: 7a 45 76 65 6e 74 20 3d 20 22 78 46 75 6c 6c 50  zEvent = "xFullP
5980: 61 74 68 6e 61 6d 65 22 3b 20 62 72 65 61 6b 3b  athname"; break;
5990: 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 52 41 4e  .    case OS_RAN
59a0: 44 4f 4d 4e 45 53 53 3a 20 20 20 20 20 20 20 20  DOMNESS:        
59b0: 7a 45 76 65 6e 74 20 3d 20 22 78 52 61 6e 64 6f  zEvent = "xRando
59c0: 6d 6e 65 73 73 22 3b 20 62 72 65 61 6b 3b 0a 20  mness"; break;. 
59d0: 20 20 20 63 61 73 65 20 4f 53 5f 53 4c 45 45 50     case OS_SLEEP
59e0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 45  :             zE
59f0: 76 65 6e 74 20 3d 20 22 78 53 6c 65 65 70 22 3b  vent = "xSleep";
5a00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5a10: 20 4f 53 5f 43 55 52 52 45 4e 54 54 49 4d 45 3a   OS_CURRENTTIME:
5a20: 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20         zEvent = 
5a30: 22 78 43 75 72 72 65 6e 74 54 69 6d 65 22 3b 20  "xCurrentTime"; 
5a40: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
5a50: 20 4f 53 5f 53 48 4d 43 4c 4f 53 45 3a 20 20 20   OS_SHMCLOSE:   
5a60: 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20         zEvent = 
5a70: 22 78 53 68 6d 43 6c 6f 73 65 22 3b 20 62 72 65  "xShmClose"; bre
5a80: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f  ak;.    case OS_
5a90: 53 48 4d 4f 50 45 4e 3a 20 20 20 20 20 20 20 20  SHMOPEN:        
5aa0: 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 53 68     zEvent = "xSh
5ab0: 6d 4f 70 65 6e 22 3b 20 62 72 65 61 6b 3b 0a 20  mOpen"; break;. 
5ac0: 20 20 20 63 61 73 65 20 4f 53 5f 53 48 4d 47 45     case OS_SHMGE
5ad0: 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 45  T:            zE
5ae0: 76 65 6e 74 20 3d 20 22 78 53 68 6d 47 65 74 22  vent = "xShmGet"
5af0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5b00: 65 20 4f 53 5f 53 48 4d 53 49 5a 45 3a 20 20 20  e OS_SHMSIZE:   
5b10: 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d          zEvent =
5b20: 20 22 78 53 68 6d 53 69 7a 65 22 3b 20 62 72 65   "xShmSize"; bre
5b30: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f  ak;.    case OS_
5b40: 53 48 4d 52 45 4c 45 41 53 45 3a 20 20 20 20 20  SHMRELEASE:     
5b50: 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 53 68     zEvent = "xSh
5b60: 6d 52 65 6c 65 61 73 65 22 3b 20 62 72 65 61 6b  mRelease"; break
5b70: 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 53 48  ;.    case OS_SH
5b80: 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 20 20  MLOCK:          
5b90: 20 7a 45 76 65 6e 74 20 3d 20 22 78 53 68 6d 4c   zEvent = "xShmL
5ba0: 6f 63 6b 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20  ock"; break;..  
5bb0: 20 20 63 61 73 65 20 4f 53 5f 41 4e 4e 4f 54 41    case OS_ANNOTA
5bc0: 54 45 3a 20 20 20 20 20 20 20 20 20 20 7a 45 76  TE:          zEv
5bd0: 65 6e 74 20 3d 20 22 61 6e 6e 6f 74 61 74 69 6f  ent = "annotatio
5be0: 6e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a  n"; break;.  }..
5bf0: 20 20 72 65 74 75 72 6e 20 7a 45 76 65 6e 74 3b    return zEvent;
5c00: 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  .}..typedef stru
5c10: 63 74 20 56 66 73 6c 6f 67 56 74 61 62 20 56 66  ct VfslogVtab Vf
5c20: 73 6c 6f 67 56 74 61 62 3b 0a 74 79 70 65 64 65  slogVtab;.typede
5c30: 66 20 73 74 72 75 63 74 20 56 66 73 6c 6f 67 43  f struct VfslogC
5c40: 73 72 20 56 66 73 6c 6f 67 43 73 72 3b 0a 0a 2f  sr VfslogCsr;../
5c50: 2a 0a 2a 2a 20 56 69 72 74 75 61 6c 20 74 61 62  *.** Virtual tab
5c60: 6c 65 20 74 79 70 65 20 66 6f 72 20 74 68 65 20  le type for the 
5c70: 76 66 73 6c 6f 67 20 72 65 61 64 65 72 20 6d 6f  vfslog reader mo
5c80: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  dule..*/.struct 
5c90: 56 66 73 6c 6f 67 56 74 61 62 20 7b 0a 20 20 73  VfslogVtab {.  s
5ca0: 71 6c 69 74 65 33 5f 76 74 61 62 20 62 61 73 65  qlite3_vtab base
5cb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
5cc0: 2a 20 42 61 73 65 20 63 6c 61 73 73 20 2a 2f 0a  * Base class */.
5cd0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
5ce0: 70 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  pFd;            
5cf0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
5d00: 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 76 66 73  ptor open on vfs
5d10: 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71  log file */.  sq
5d20: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74  lite3_int64 nByt
5d30: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
5d40: 20 53 69 7a 65 20 6f 66 20 66 69 6c 65 20 69 6e   Size of file in
5d50: 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
5d60: 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20   *zFile;        
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
5d80: 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 70 46 64  ile name for pFd
5d90: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 56 69   */.};../*.** Vi
5da0: 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73  rtual table curs
5db0: 6f 72 20 74 79 70 65 20 66 6f 72 20 74 68 65 20  or type for the 
5dc0: 76 66 73 6c 6f 67 20 72 65 61 64 65 72 20 6d 6f  vfslog reader mo
5dd0: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  dule..*/.struct 
5de0: 56 66 73 6c 6f 67 43 73 72 20 7b 0a 20 20 73 71  VfslogCsr {.  sq
5df0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
5e00: 72 20 62 61 73 65 3b 20 20 20 20 20 20 20 2f 2a  r base;       /*
5e10: 20 42 61 73 65 20 63 6c 61 73 73 20 2a 2f 0a 20   Base class */. 
5e20: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
5e30: 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
5e40: 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69   /* Current rowi
5e50: 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  d. */.  sqlite3_
5e60: 69 6e 74 36 34 20 69 4f 66 66 73 65 74 3b 20 20  int64 iOffset;  
5e70: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
5e80: 74 20 6f 66 20 6e 65 78 74 20 72 65 63 6f 72 64  t of next record
5e90: 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68   in file */.  ch
5ea0: 61 72 20 2a 7a 54 72 61 6e 73 69 65 6e 74 3b 20  ar *zTransient; 
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ec0: 20 54 72 61 6e 73 69 65 6e 74 20 27 66 69 6c 65   Transient 'file
5ed0: 27 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e  ' string */.  in
5ee0: 74 20 6e 46 69 6c 65 3b 20 20 20 20 20 20 20 20  t nFile;        
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5f00: 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
5f10: 7a 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20 63 68 61  zFile[] */.  cha
5f20: 72 20 2a 2a 61 7a 46 69 6c 65 3b 20 20 20 20 20  r **azFile;     
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5f40: 46 69 6c 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a  File strings */.
5f50: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
5f60: 61 42 75 66 5b 31 30 32 34 5d 3b 20 20 20 20 20  aBuf[1024];     
5f70: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 66 73    /* Current vfs
5f80: 20 6c 6f 67 20 65 6e 74 72 79 20 28 72 65 61 64   log entry (read
5f90: 20 66 72 6f 6d 20 66 69 6c 65 29 20 2a 2f 0a 7d   from file) */.}
5fa0: 3b 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  ;..static unsign
5fb0: 65 64 20 69 6e 74 20 67 65 74 33 32 62 69 74 73  ed int get32bits
5fc0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
5fd0: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 5b  p){.  return (p[
5fe0: 30 5d 3c 3c 32 34 29 20 2b 20 28 70 5b 31 5d 3c  0]<<24) + (p[1]<
5ff0: 3c 31 36 29 20 2b 20 28 70 5b 32 5d 3c 3c 38 29  <16) + (p[2]<<8)
6000: 20 2b 20 70 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a   + p[3];.}../*.*
6010: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d  * The argument m
6020: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
6030: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
6040: 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
6050: 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 49 66 20  d string..** If 
6060: 74 68 65 20 73 74 72 69 6e 67 20 62 65 67 69 6e  the string begin
6070: 73 20 77 69 74 68 20 61 6e 20 53 51 4c 20 71 75  s with an SQL qu
6080: 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 69 74  ote character it
6090: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
60a0: 62 79 0a 2a 2a 20 74 68 65 20 64 65 71 75 6f 74  by.** the dequot
60b0: 65 64 20 76 65 72 73 69 6f 6e 2e 20 4f 74 68 65  ed version. Othe
60c0: 72 77 69 73 65 20 74 68 65 20 62 75 66 66 65 72  rwise the buffer
60d0: 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66   is left unmodif
60e0: 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ied..*/.static v
60f0: 6f 69 64 20 64 65 71 75 6f 74 65 28 63 68 61 72  oid dequote(char
6100: 20 2a 7a 29 7b 0a 20 20 63 68 61 72 20 71 75 6f   *z){.  char quo
6110: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
6120: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 6f 74 65          /* Quote
6130: 20 63 68 61 72 61 63 74 65 72 20 28 69 66 20 61   character (if a
6140: 6e 79 20 29 20 2a 2f 0a 20 20 71 75 6f 74 65 20  ny ) */.  quote 
6150: 3d 20 7a 5b 30 5d 3b 0a 20 20 69 66 28 20 71 75  = z[0];.  if( qu
6160: 6f 74 65 3d 3d 27 5b 27 20 7c 7c 20 71 75 6f 74  ote=='[' || quot
6170: 65 3d 3d 27 5c 27 27 20 7c 7c 20 71 75 6f 74 65  e=='\'' || quote
6180: 3d 3d 27 22 27 20 7c 7c 20 71 75 6f 74 65 3d 3d  =='"' || quote==
6190: 27 60 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  '`' ){.    int i
61a0: 49 6e 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  In = 1;         
61b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
61c0: 78 20 6f 66 20 6e 65 78 74 20 62 79 74 65 20 74  x of next byte t
61d0: 6f 20 72 65 61 64 20 66 72 6f 6d 20 69 6e 70 75  o read from inpu
61e0: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75  t */.    int iOu
61f0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
6200: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
6210: 6f 66 20 6e 65 78 74 20 62 79 74 65 20 74 6f 20  of next byte to 
6220: 77 72 69 74 65 20 74 6f 20 6f 75 74 70 75 74 20  write to output 
6230: 2a 2f 0a 20 20 20 20 69 66 28 20 71 75 6f 74 65  */.    if( quote
6240: 3d 3d 27 5b 27 20 29 20 71 75 6f 74 65 20 3d 20  =='[' ) quote = 
6250: 27 5d 27 3b 20 20 0a 20 20 20 20 77 68 69 6c 65  ']';  .    while
6260: 28 20 7a 5b 69 49 6e 5d 20 29 7b 0a 20 20 20 20  ( z[iIn] ){.    
6270: 20 20 69 66 28 20 7a 5b 69 49 6e 5d 3d 3d 71 75    if( z[iIn]==qu
6280: 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ote ){.        i
6290: 66 28 20 7a 5b 69 49 6e 2b 31 5d 21 3d 71 75 6f  f( z[iIn+1]!=quo
62a0: 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  te ) break;.    
62b0: 20 20 20 20 7a 5b 69 4f 75 74 2b 2b 5d 20 3d 20      z[iOut++] = 
62c0: 71 75 6f 74 65 3b 0a 20 20 20 20 20 20 20 20 69  quote;.        i
62d0: 49 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d  In += 2;.      }
62e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b  else{.        z[
62f0: 69 4f 75 74 2b 2b 5d 20 3d 20 7a 5b 69 49 6e 2b  iOut++] = z[iIn+
6300: 2b 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +];.      }.    
6310: 7d 0a 20 20 20 20 7a 5b 69 4f 75 74 5d 20 3d 20  }.    z[iOut] = 
6320: 27 5c 30 27 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  '\0';.  }.}../*.
6330: 2a 2a 20 43 6f 6e 6e 65 63 74 20 74 6f 20 6f 72  ** Connect to or
6340: 20 63 72 65 61 74 65 20 61 20 76 66 73 6c 6f 67   create a vfslog
6350: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
6360: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 6c  */.static int vl
6370: 6f 67 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c  ogConnect(.  sql
6380: 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64  ite3 *db,.  void
6390: 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72   *pAux,.  int ar
63a0: 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gc, const char *
63b0: 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71  const*argv,.  sq
63c0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56  lite3_vtab **ppV
63d0: 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  tab,.  char **pz
63e0: 45 72 72 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  Err.){.  sqlite3
63f0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
6400: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20           /* VFS 
6410: 75 73 65 64 20 74 6f 20 72 65 61 64 20 6c 6f 67  used to read log
6420: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66   file */.  int f
6430: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
6440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
6450: 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 70 56  ags passed to pV
6460: 66 73 2d 3e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  fs->xOpen() */. 
6470: 20 56 66 73 6c 6f 67 56 74 61 62 20 2a 70 3b 0a   VfslogVtab *p;.
6480: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
6490: 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a  nByte;.  char *z
64a0: 46 69 6c 65 3b 0a 0a 20 20 2a 70 70 56 74 61 62  File;..  *ppVtab
64b0: 20 3d 20 30 3b 0a 20 20 70 56 66 73 20 3d 20 73   = 0;.  pVfs = s
64c0: 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
64d0: 30 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69  0);.  nByte = si
64e0: 7a 65 6f 66 28 56 66 73 6c 6f 67 56 74 61 62 29  zeof(VfslogVtab)
64f0: 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c   + pVfs->szOsFil
6500: 65 20 2b 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e + pVfs->mxPath
6510: 6e 61 6d 65 3b 0a 20 20 70 20 3d 20 73 71 6c 69  name;.  p = sqli
6520: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65  te3_malloc(nByte
6530: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
6540: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6550: 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  MEM;.  memset(p,
6560: 20 30 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 70   0, nByte);..  p
6570: 2d 3e 70 46 64 20 3d 20 28 73 71 6c 69 74 65 33  ->pFd = (sqlite3
6580: 5f 66 69 6c 65 20 2a 29 26 70 5b 31 5d 3b 0a 20  _file *)&p[1];. 
6590: 20 70 2d 3e 7a 46 69 6c 65 20 3d 20 26 28 28 63   p->zFile = &((c
65a0: 68 61 72 20 2a 29 70 2d 3e 70 46 64 29 5b 70 56  har *)p->pFd)[pV
65b0: 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 5d 3b 0a 0a  fs->szOsFile];..
65c0: 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65    zFile = sqlite
65d0: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
65e0: 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20  argv[3]);.  if( 
65f0: 21 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 73 71  !zFile ){.    sq
6600: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
6610: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6620: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 64 65  _NOMEM;.  }.  de
6630: 71 75 6f 74 65 28 7a 46 69 6c 65 29 3b 0a 20 20  quote(zFile);.  
6640: 70 56 66 73 2d 3e 78 46 75 6c 6c 50 61 74 68 6e  pVfs->xFullPathn
6650: 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 2c  ame(pVfs, zFile,
6660: 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
6670: 65 2c 20 70 2d 3e 7a 46 69 6c 65 29 3b 0a 20 20  e, p->zFile);.  
6680: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69  sqlite3_free(zFi
6690: 6c 65 29 3b 0a 0a 20 20 66 6c 61 67 73 20 3d 20  le);..  flags = 
66a0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
66b0: 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
66c0: 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
66d0: 3b 0a 20 20 72 63 20 3d 20 70 56 66 73 2d 3e 78  ;.  rc = pVfs->x
66e0: 4f 70 65 6e 28 70 56 66 73 2c 20 70 2d 3e 7a 46  Open(pVfs, p->zF
66f0: 69 6c 65 2c 20 70 2d 3e 70 46 64 2c 20 66 6c 61  ile, p->pFd, fla
6700: 67 73 2c 20 26 66 6c 61 67 73 29 3b 0a 0a 20 20  gs, &flags);..  
6710: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6720: 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 70 46 64 2d  K ){.    p->pFd-
6730: 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c 65  >pMethods->xFile
6740: 53 69 7a 65 28 70 2d 3e 70 46 64 2c 20 26 70 2d  Size(p->pFd, &p-
6750: 3e 6e 42 79 74 65 29 3b 0a 20 20 20 20 73 71 6c  >nByte);.    sql
6760: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
6770: 62 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 22  b(db, .        "
6780: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78  CREATE TABLE xxx
6790: 28 65 76 65 6e 74 2c 20 66 69 6c 65 2c 20 63 6c  (event, file, cl
67a0: 69 63 6b 2c 20 72 63 2c 20 73 69 7a 65 2c 20 6f  ick, rc, size, o
67b0: 66 66 73 65 74 29 22 0a 20 20 20 20 29 3b 0a 20  ffset)".    );. 
67c0: 20 20 20 2a 70 70 56 74 61 62 20 3d 20 26 70 2d     *ppVtab = &p-
67d0: 3e 62 61 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  >base;.  }else{.
67e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
67f0: 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  (p);.  }..  retu
6800: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6810: 54 68 65 72 65 20 69 73 20 6e 6f 20 22 62 65 73  There is no "bes
6820: 74 2d 69 6e 64 65 78 22 2e 20 54 68 69 73 20 76  t-index". This v
6830: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 6c 77  irtual table alw
6840: 61 79 73 20 64 6f 65 73 20 61 20 6c 69 6e 65 61  ays does a linea
6850: 72 0a 2a 2a 20 73 63 61 6e 20 6f 66 20 74 68 65  r.** scan of the
6860: 20 62 69 6e 61 72 79 20 56 46 53 20 6c 6f 67 20   binary VFS log 
6870: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
6880: 69 6e 74 20 76 6c 6f 67 42 65 73 74 49 6e 64 65  int vlogBestInde
6890: 78 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  x(sqlite3_vtab *
68a0: 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64  tab, sqlite3_ind
68b0: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
68c0: 6f 29 7b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  o){.  pIdxInfo->
68d0: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
68e0: 31 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20 53  10.0;.  return S
68f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
6900: 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20 66 72  ** Disconnect fr
6910: 6f 6d 20 6f 72 20 64 65 73 74 72 6f 79 20 61 20  om or destroy a 
6920: 76 66 73 6c 6f 67 20 76 69 72 74 75 61 6c 20 74  vfslog virtual t
6930: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
6940: 69 6e 74 20 76 6c 6f 67 44 69 73 63 6f 6e 6e 65  int vlogDisconne
6950: 63 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  ct(sqlite3_vtab 
6960: 2a 70 56 74 61 62 29 7b 0a 20 20 56 66 73 6c 6f  *pVtab){.  Vfslo
6970: 67 56 74 61 62 20 2a 70 20 3d 20 28 56 66 73 6c  gVtab *p = (Vfsl
6980: 6f 67 56 74 61 62 20 2a 29 70 56 74 61 62 3b 0a  ogVtab *)pVtab;.
6990: 20 20 69 66 28 20 70 2d 3e 70 46 64 2d 3e 70 4d    if( p->pFd->pM
69a0: 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 70 2d  ethods ){.    p-
69b0: 3e 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  >pFd->pMethods->
69c0: 78 43 6c 6f 73 65 28 70 2d 3e 70 46 64 29 3b 0a  xClose(p->pFd);.
69d0: 20 20 20 20 70 2d 3e 70 46 64 2d 3e 70 4d 65 74      p->pFd->pMet
69e0: 68 6f 64 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  hods = 0;.  }.  
69f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
6a00: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6a10: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  _OK;.}../*.** Op
6a20: 65 6e 20 61 20 6e 65 77 20 76 66 73 6c 6f 67 20  en a new vfslog 
6a30: 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  cursor..*/.stati
6a40: 63 20 69 6e 74 20 76 6c 6f 67 4f 70 65 6e 28 73  c int vlogOpen(s
6a50: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54  qlite3_vtab *pVT
6a60: 61 62 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ab, sqlite3_vtab
6a70: 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73  _cursor **ppCurs
6a80: 6f 72 29 7b 0a 20 20 56 66 73 6c 6f 67 43 73 72  or){.  VfslogCsr
6a90: 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20 20 20   *pCsr;         
6aa0: 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20         /* Newly 
6ab0: 61 6c 6c 6f 63 61 74 65 64 20 63 75 72 73 6f 72  allocated cursor
6ac0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 70 43   object */..  pC
6ad0: 73 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  sr = sqlite3_mal
6ae0: 6c 6f 63 28 73 69 7a 65 6f 66 28 56 66 73 6c 6f  loc(sizeof(Vfslo
6af0: 67 43 73 72 29 29 3b 0a 20 20 69 66 28 20 21 70  gCsr));.  if( !p
6b00: 43 73 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c  Csr ) return SQL
6b10: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
6b20: 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69 7a  set(pCsr, 0, siz
6b30: 65 6f 66 28 56 66 73 6c 6f 67 43 73 72 29 29 3b  eof(VfslogCsr));
6b40: 0a 20 20 2a 70 70 43 75 72 73 6f 72 20 3d 20 26  .  *ppCursor = &
6b50: 70 43 73 72 2d 3e 62 61 73 65 3b 0a 20 20 72 65  pCsr->base;.  re
6b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
6b80: 20 76 66 73 6c 6f 67 20 63 75 72 73 6f 72 2e 0a   vfslog cursor..
6b90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 6c  */.static int vl
6ba0: 6f 67 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ogClose(sqlite3_
6bb0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75  vtab_cursor *pCu
6bc0: 72 73 6f 72 29 7b 0a 20 20 56 66 73 6c 6f 67 43  rsor){.  VfslogC
6bd0: 73 72 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67 43  sr *p = (VfslogC
6be0: 73 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20  sr *)pCursor;.  
6bf0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
6c00: 3b 20 69 3c 70 2d 3e 6e 46 69 6c 65 3b 20 69 2b  ; i<p->nFile; i+
6c10: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
6c20: 66 72 65 65 28 70 2d 3e 61 7a 46 69 6c 65 5b 69  free(p->azFile[i
6c30: 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ]);.  }.  sqlite
6c40: 33 5f 66 72 65 65 28 70 2d 3e 61 7a 46 69 6c 65  3_free(p->azFile
6c50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
6c60: 65 28 70 2d 3e 7a 54 72 61 6e 73 69 65 6e 74 29  e(p->zTransient)
6c70: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
6c80: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
6c90: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6ca0: 2a 20 4d 6f 76 65 20 61 20 76 66 73 6c 6f 67 20  * Move a vfslog 
6cb0: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
6cc0: 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  xt entry in the 
6cd0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
6ce0: 69 6e 74 20 76 6c 6f 67 4e 65 78 74 28 73 71 6c  int vlogNext(sql
6cf0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
6d00: 20 2a 70 43 75 72 73 6f 72 29 7b 0a 20 20 56 66   *pCursor){.  Vf
6d10: 73 6c 6f 67 43 73 72 20 2a 70 43 73 72 20 3d 20  slogCsr *pCsr = 
6d20: 28 56 66 73 6c 6f 67 43 73 72 20 2a 29 70 43 75  (VfslogCsr *)pCu
6d30: 72 73 6f 72 3b 0a 20 20 56 66 73 6c 6f 67 56 74  rsor;.  VfslogVt
6d40: 61 62 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67 56  ab *p = (VfslogV
6d50: 74 61 62 20 2a 29 70 43 75 72 73 6f 72 2d 3e 70  tab *)pCursor->p
6d60: 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Vtab;.  int rc =
6d70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
6d80: 74 20 6e 52 65 61 64 3b 0a 0a 20 20 73 71 6c 69  t nRead;..  sqli
6d90: 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 7a  te3_free(pCsr->z
6da0: 54 72 61 6e 73 69 65 6e 74 29 3b 0a 20 20 70 43  Transient);.  pC
6db0: 73 72 2d 3e 7a 54 72 61 6e 73 69 65 6e 74 20 3d  sr->zTransient =
6dc0: 20 30 3b 0a 0a 20 20 6e 52 65 61 64 20 3d 20 32   0;..  nRead = 2
6dd0: 34 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 69  4;.  if( pCsr->i
6de0: 4f 66 66 73 65 74 2b 6e 52 65 61 64 3c 3d 70 2d  Offset+nRead<=p-
6df0: 3e 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 69 6e  >nByte ){.    in
6e00: 74 20 65 45 76 65 6e 74 3b 0a 20 20 20 20 72 63  t eEvent;.    rc
6e10: 20 3d 20 70 2d 3e 70 46 64 2d 3e 70 4d 65 74 68   = p->pFd->pMeth
6e20: 6f 64 73 2d 3e 78 52 65 61 64 28 70 2d 3e 70 46  ods->xRead(p->pF
6e30: 64 2c 20 70 43 73 72 2d 3e 61 42 75 66 2c 20 6e  d, pCsr->aBuf, n
6e40: 52 65 61 64 2c 20 70 43 73 72 2d 3e 69 4f 66 66  Read, pCsr->iOff
6e50: 73 65 74 29 3b 0a 0a 20 20 20 20 65 45 76 65 6e  set);..    eEven
6e60: 74 20 3d 20 67 65 74 33 32 62 69 74 73 28 70 43  t = get32bits(pC
6e70: 73 72 2d 3e 61 42 75 66 29 3b 0a 20 20 20 20 69  sr->aBuf);.    i
6e80: 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  f( (rc==SQLITE_O
6e90: 4b 29 0a 20 20 20 20 20 26 26 20 28 65 45 76 65  K).     && (eEve
6ea0: 6e 74 3d 3d 4f 53 5f 4f 50 45 4e 20 7c 7c 20 65  nt==OS_OPEN || e
6eb0: 45 76 65 6e 74 3d 3d 4f 53 5f 44 45 4c 45 54 45  Event==OS_DELETE
6ec0: 20 7c 7c 20 65 45 76 65 6e 74 3d 3d 4f 53 5f 41   || eEvent==OS_A
6ed0: 43 43 45 53 53 29 20 0a 20 20 20 20 29 7b 0a 20  CCESS) .    ){. 
6ee0: 20 20 20 20 20 63 68 61 72 20 62 75 66 5b 34 5d       char buf[4]
6ef0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 2d 3e  ;.      rc = p->
6f00: 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  pFd->pMethods->x
6f10: 52 65 61 64 28 70 2d 3e 70 46 64 2c 20 62 75 66  Read(p->pFd, buf
6f20: 2c 20 34 2c 20 70 43 73 72 2d 3e 69 4f 66 66 73  , 4, pCsr->iOffs
6f30: 65 74 2b 6e 52 65 61 64 29 3b 0a 20 20 20 20 20  et+nRead);.     
6f40: 20 6e 52 65 61 64 20 2b 3d 20 34 3b 0a 20 20 20   nRead += 4;.   
6f50: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6f60: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
6f70: 69 6e 74 20 6e 53 74 72 20 3d 20 67 65 74 33 32  int nStr = get32
6f80: 62 69 74 73 28 28 75 6e 73 69 67 6e 65 64 20 63  bits((unsigned c
6f90: 68 61 72 20 2a 29 62 75 66 29 3b 0a 20 20 20 20  har *)buf);.    
6fa0: 20 20 20 20 63 68 61 72 20 2a 7a 53 74 72 20 3d      char *zStr =
6fb0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
6fc0: 6e 53 74 72 2b 31 29 3b 0a 20 20 20 20 20 20 20  nStr+1);.       
6fd0: 20 72 63 20 3d 20 70 2d 3e 70 46 64 2d 3e 70 4d   rc = p->pFd->pM
6fe0: 65 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70 2d  ethods->xRead(p-
6ff0: 3e 70 46 64 2c 20 7a 53 74 72 2c 20 6e 53 74 72  >pFd, zStr, nStr
7000: 2c 20 70 43 73 72 2d 3e 69 4f 66 66 73 65 74 2b  , pCsr->iOffset+
7010: 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 20 20  nRead);.        
7020: 7a 53 74 72 5b 6e 53 74 72 5d 20 3d 20 27 5c 30  zStr[nStr] = '\0
7030: 27 3b 0a 20 20 20 20 20 20 20 20 6e 52 65 61 64  ';.        nRead
7040: 20 2b 3d 20 6e 53 74 72 3b 0a 0a 20 20 20 20 20   += nStr;..     
7050: 20 20 20 69 66 28 20 65 45 76 65 6e 74 3d 3d 4f     if( eEvent==O
7060: 53 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20  S_OPEN ){.      
7070: 20 20 20 20 69 6e 74 20 69 46 69 6c 65 69 64 20      int iFileid 
7080: 3d 20 67 65 74 33 32 62 69 74 73 28 26 70 43 73  = get32bits(&pCs
7090: 72 2d 3e 61 42 75 66 5b 34 5d 29 3b 0a 20 20 20  r->aBuf[4]);.   
70a0: 20 20 20 20 20 20 20 69 66 28 20 69 46 69 6c 65         if( iFile
70b0: 69 64 3e 3d 70 43 73 72 2d 3e 6e 46 69 6c 65 20  id>=pCsr->nFile 
70c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
70d0: 6e 74 20 6e 4e 65 77 20 3d 20 73 69 7a 65 6f 66  nt nNew = sizeof
70e0: 28 70 43 73 72 2d 3e 61 7a 46 69 6c 65 5b 30 5d  (pCsr->azFile[0]
70f0: 29 2a 28 69 46 69 6c 65 69 64 2b 31 29 3b 0a 20  )*(iFileid+1);. 
7100: 20 20 20 20 20 20 20 20 20 20 20 70 43 73 72 2d             pCsr-
7110: 3e 61 7a 46 69 6c 65 20 3d 20 28 63 68 61 72 20  >azFile = (char 
7120: 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  **)sqlite3_reall
7130: 6f 63 28 70 43 73 72 2d 3e 61 7a 46 69 6c 65 2c  oc(pCsr->azFile,
7140: 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   nNew);.        
7150: 20 20 20 20 6e 4e 65 77 20 2d 3d 20 73 69 7a 65      nNew -= size
7160: 6f 66 28 70 43 73 72 2d 3e 61 7a 46 69 6c 65 5b  of(pCsr->azFile[
7170: 30 5d 29 2a 70 43 73 72 2d 3e 6e 46 69 6c 65 3b  0])*pCsr->nFile;
7180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
7190: 73 65 74 28 26 70 43 73 72 2d 3e 61 7a 46 69 6c  set(&pCsr->azFil
71a0: 65 5b 70 43 73 72 2d 3e 6e 46 69 6c 65 5d 2c 20  e[pCsr->nFile], 
71b0: 30 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20  0, nNew);.      
71c0: 20 20 20 20 20 20 70 43 73 72 2d 3e 6e 46 69 6c        pCsr->nFil
71d0: 65 20 3d 20 69 46 69 6c 65 69 64 2b 31 3b 0a 20  e = iFileid+1;. 
71e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
71f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
7200: 65 28 70 43 73 72 2d 3e 61 7a 46 69 6c 65 5b 69  e(pCsr->azFile[i
7210: 46 69 6c 65 69 64 5d 29 3b 0a 20 20 20 20 20 20  Fileid]);.      
7220: 20 20 20 20 70 43 73 72 2d 3e 61 7a 46 69 6c 65      pCsr->azFile
7230: 5b 69 46 69 6c 65 69 64 5d 20 3d 20 7a 53 74 72  [iFileid] = zStr
7240: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
7250: 0a 20 20 20 20 20 20 20 20 20 20 70 43 73 72 2d  .          pCsr-
7260: 3e 7a 54 72 61 6e 73 69 65 6e 74 20 3d 20 7a 53  >zTransient = zS
7270: 74 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  tr;.        }.  
7280: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7290: 0a 20 20 70 43 73 72 2d 3e 69 52 6f 77 69 64 20  .  pCsr->iRowid 
72a0: 2b 3d 20 31 3b 0a 20 20 70 43 73 72 2d 3e 69 4f  += 1;.  pCsr->iO
72b0: 66 66 73 65 74 20 2b 3d 20 6e 52 65 61 64 3b 0a  ffset += nRead;.
72c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
72d0: 73 74 61 74 69 63 20 69 6e 74 20 76 6c 6f 67 45  static int vlogE
72e0: 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  of(sqlite3_vtab_
72f0: 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 29  cursor *pCursor)
7300: 7b 0a 20 20 56 66 73 6c 6f 67 43 73 72 20 2a 70  {.  VfslogCsr *p
7310: 43 73 72 20 3d 20 28 56 66 73 6c 6f 67 43 73 72  Csr = (VfslogCsr
7320: 20 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 56 66   *)pCursor;.  Vf
7330: 73 6c 6f 67 56 74 61 62 20 2a 70 20 3d 20 28 56  slogVtab *p = (V
7340: 66 73 6c 6f 67 56 74 61 62 20 2a 29 70 43 75 72  fslogVtab *)pCur
7350: 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 72 65  sor->pVtab;.  re
7360: 74 75 72 6e 20 28 70 43 73 72 2d 3e 69 4f 66 66  turn (pCsr->iOff
7370: 73 65 74 3e 3d 70 2d 3e 6e 42 79 74 65 29 3b 0a  set>=p->nByte);.
7380: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 76 6c  }..static int vl
7390: 6f 67 46 69 6c 74 65 72 28 0a 20 20 73 71 6c 69  ogFilter(.  sqli
73a0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
73b0: 2a 70 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e 74  *pCursor, .  int
73c0: 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63   idxNum, const c
73d0: 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20 69  har *idxStr,.  i
73e0: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
73f0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
7400: 0a 20 20 56 66 73 6c 6f 67 43 73 72 20 2a 70 43  .  VfslogCsr *pC
7410: 73 72 20 3d 20 28 56 66 73 6c 6f 67 43 73 72 20  sr = (VfslogCsr 
7420: 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 70 43 73  *)pCursor;.  pCs
7430: 72 2d 3e 69 52 6f 77 69 64 20 3d 20 30 3b 0a 20  r->iRowid = 0;. 
7440: 20 70 43 73 72 2d 3e 69 4f 66 66 73 65 74 20 3d   pCsr->iOffset =
7450: 20 32 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 6c   20;.  return vl
7460: 6f 67 4e 65 78 74 28 70 43 75 72 73 6f 72 29 3b  ogNext(pCursor);
7470: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .}..static int v
7480: 6c 6f 67 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c  logColumn(.  sql
7490: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
74a0: 20 2a 70 43 75 72 73 6f 72 2c 20 0a 20 20 73 71   *pCursor, .  sq
74b0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
74c0: 74 78 2c 20 0a 20 20 69 6e 74 20 69 0a 29 7b 0a  tx, .  int i.){.
74d0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 76    unsigned int v
74e0: 61 6c 3b 0a 20 20 56 66 73 6c 6f 67 43 73 72 20  al;.  VfslogCsr 
74f0: 2a 70 43 73 72 20 3d 20 28 56 66 73 6c 6f 67 43  *pCsr = (VfslogC
7500: 73 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 0a 20  sr *)pCursor;.. 
7510: 20 61 73 73 65 72 74 28 20 69 3c 37 20 29 3b 0a   assert( i<7 );.
7520: 20 20 76 61 6c 20 3d 20 67 65 74 33 32 62 69 74    val = get32bit
7530: 73 28 26 70 43 73 72 2d 3e 61 42 75 66 5b 34 2a  s(&pCsr->aBuf[4*
7540: 69 5d 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  i]);..  switch( 
7550: 69 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a  i ){.    case 0:
7560: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
7570: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78  _result_text(ctx
7580: 2c 20 76 66 73 6c 6f 67 5f 65 76 65 6e 74 6e 61  , vfslog_eventna
7590: 6d 65 28 76 61 6c 29 2c 20 2d 31 2c 20 53 51 4c  me(val), -1, SQL
75a0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
75b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
75c0: 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20      case 1: {.  
75d0: 20 20 20 20 63 68 61 72 20 2a 7a 53 74 72 20 3d      char *zStr =
75e0: 20 70 43 73 72 2d 3e 7a 54 72 61 6e 73 69 65 6e   pCsr->zTransien
75f0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 76 61 6c  t;.      if( val
7600: 21 3d 30 20 26 26 20 76 61 6c 3c 70 43 73 72 2d  !=0 && val<pCsr-
7610: 3e 6e 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  >nFile ){.      
7620: 20 20 7a 53 74 72 20 3d 20 70 43 73 72 2d 3e 61    zStr = pCsr->a
7630: 7a 46 69 6c 65 5b 76 61 6c 5d 3b 0a 20 20 20 20  zFile[val];.    
7640: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
7650: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74  3_result_text(ct
7660: 78 2c 20 7a 53 74 72 2c 20 2d 31 2c 20 53 51 4c  x, zStr, -1, SQL
7670: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
7680: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7690: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a   }.    default:.
76a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
76b0: 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 76 61  sult_int(ctx, va
76c0: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
76d0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
76e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  QLITE_OK;.}..sta
76f0: 74 69 63 20 69 6e 74 20 76 6c 6f 67 52 6f 77 69  tic int vlogRowi
7700: 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  d(sqlite3_vtab_c
7710: 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20  ursor *pCursor, 
7720: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52  sqlite_int64 *pR
7730: 6f 77 69 64 29 7b 0a 20 20 56 66 73 6c 6f 67 43  owid){.  VfslogC
7740: 73 72 20 2a 70 43 73 72 20 3d 20 28 56 66 73 6c  sr *pCsr = (Vfsl
7750: 6f 67 43 73 72 20 2a 29 70 43 75 72 73 6f 72 3b  ogCsr *)pCursor;
7760: 0a 20 20 2a 70 52 6f 77 69 64 20 3d 20 70 43 73  .  *pRowid = pCs
7770: 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65 74  r->iRowid;.  ret
7780: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7790: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 76 66  ..int sqlite3_vf
77a0: 73 6c 6f 67 5f 72 65 67 69 73 74 65 72 28 73 71  slog_register(sq
77b0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74  lite3 *db){.  st
77c0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64  atic sqlite3_mod
77d0: 75 6c 65 20 76 66 73 6c 6f 67 5f 6d 6f 64 75 6c  ule vfslog_modul
77e0: 65 20 3d 20 7b 0a 20 20 20 20 30 2c 20 20 20 20  e = {.    0,    
77f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7800: 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
7810: 69 6f 6e 20 2a 2f 0a 20 20 20 20 76 6c 6f 67 43  ion */.    vlogC
7820: 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20  onnect,         
7830: 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74         /* xCreat
7840: 65 20 2a 2f 0a 20 20 20 20 76 6c 6f 67 43 6f 6e  e */.    vlogCon
7850: 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  nect,           
7860: 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74       /* xConnect
7870: 20 2a 2f 0a 20 20 20 20 76 6c 6f 67 42 65 73 74   */.    vlogBest
7880: 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20  Index,          
7890: 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65      /* xBestInde
78a0: 78 20 2a 2f 0a 20 20 20 20 76 6c 6f 67 44 69 73  x */.    vlogDis
78b0: 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20  connect,        
78c0: 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e       /* xDisconn
78d0: 65 63 74 20 2a 2f 0a 20 20 20 20 76 6c 6f 67 44  ect */.    vlogD
78e0: 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20  isconnect,      
78f0: 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73 74 72         /* xDestr
7900: 6f 79 20 2a 2f 0a 20 20 20 20 76 6c 6f 67 4f 70  oy */.    vlogOp
7910: 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
7920: 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d        /* xOpen -
7930: 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a   open a cursor *
7940: 2f 0a 20 20 20 20 76 6c 6f 67 43 6c 6f 73 65 2c  /.    vlogClose,
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7960: 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c    /* xClose - cl
7970: 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  ose a cursor */.
7980: 20 20 20 20 76 6c 6f 67 46 69 6c 74 65 72 2c 20      vlogFilter, 
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79a0: 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e  /* xFilter - con
79b0: 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73  figure scan cons
79c0: 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 76  traints */.    v
79d0: 6c 6f 67 4e 65 78 74 2c 20 20 20 20 20 20 20 20  logNext,        
79e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e             /* xN
79f0: 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20  ext - advance a 
7a00: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 76 6c  cursor */.    vl
7a10: 6f 67 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20  ogEof,          
7a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 45 6f            /* xEo
7a30: 66 20 2d 20 63 68 65 63 6b 20 66 6f 72 20 65 6e  f - check for en
7a40: 64 20 6f 66 20 73 63 61 6e 20 2a 2f 0a 20 20 20  d of scan */.   
7a50: 20 76 6c 6f 67 43 6f 6c 75 6d 6e 2c 20 20 20 20   vlogColumn,    
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7a70: 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64  xColumn - read d
7a80: 61 74 61 20 2a 2f 0a 20 20 20 20 76 6c 6f 67 52  ata */.    vlogR
7a90: 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  owid,           
7aa0: 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64         /* xRowid
7ab0: 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a   - read data */.
7ac0: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ae0: 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a    /* xUpdate */.
7af0: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b10: 20 20 2f 2a 20 78 42 65 67 69 6e 20 2a 2f 0a 20    /* xBegin */. 
7b20: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 20   /* xSync */.   
7b50: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
7b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7b70: 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20 20  * xCommit */.   
7b80: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7ba0: 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  * xRollback */. 
7bb0: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bd0: 20 2f 2a 20 78 46 69 6e 64 4d 65 74 68 6f 64 20   /* xFindMethod 
7be0: 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c00: 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20       /* xRename 
7c10: 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 73 71 6c 69 74  */.  };..  sqlit
7c20: 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65  e3_create_module
7c30: 28 64 62 2c 20 22 76 66 73 6c 6f 67 22 2c 20 26  (db, "vfslog", &
7c40: 76 66 73 6c 6f 67 5f 6d 6f 64 75 6c 65 2c 20 30  vfslog_module, 0
7c50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
7c60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a  TE_OK;.}.../****
7c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cb0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
7cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d00: 2a 2a 0a 2a 2a 20 54 63 6c 20 69 6e 74 65 72 66  **.** Tcl interf
7d10: 61 63 65 20 73 74 61 72 74 73 20 68 65 72 65 2e  ace starts here.
7d20: 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
7d30: 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
7d40: 20 64 65 66 69 6e 65 64 28 54 43 4c 53 48 29 0a   defined(TCLSH).
7d50: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 63 6c 2e 68  .#include <tcl.h
7d60: 3e 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  >..static int te
7d70: 73 74 5f 76 66 73 6c 6f 67 28 0a 20 20 76 6f 69  st_vfslog(.  voi
7d80: 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20  d *clientData,. 
7d90: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
7da0: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
7db0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
7dc0: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74  T objv[].){.  st
7dd0: 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 7b 20  ruct SqliteDb { 
7de0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 7d 3b 0a  sqlite3 *db; };.
7df0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
7e00: 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64   Tcl_CmdInfo cmd
7e10: 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Info;.  int rc =
7e20: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a   SQLITE_ERROR;..
7e30: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
7e40: 68 61 72 20 2a 73 74 72 73 5b 5d 20 3d 20 7b 20  har *strs[] = { 
7e50: 22 61 6e 6e 6f 74 61 74 65 22 2c 20 22 66 69 6e  "annotate", "fin
7e60: 61 6c 69 7a 65 22 2c 20 22 6e 65 77 22 2c 20 20  alize", "new",  
7e70: 22 72 65 67 69 73 74 65 72 22 2c 20 30 20 7d 3b  "register", 0 };
7e80: 0a 20 20 65 6e 75 6d 20 56 4c 5f 65 6e 75 6d 20  .  enum VL_enum 
7e90: 7b 20 56 4c 5f 41 4e 4e 4f 54 41 54 45 2c 20 56  { VL_ANNOTATE, V
7ea0: 4c 5f 46 49 4e 41 4c 49 5a 45 2c 20 56 4c 5f 4e  L_FINALIZE, VL_N
7eb0: 45 57 2c 20 56 4c 5f 52 45 47 49 53 54 45 52 20  EW, VL_REGISTER 
7ec0: 7d 3b 0a 20 20 69 6e 74 20 69 53 75 62 3b 0a 0a  };.  int iSub;..
7ed0: 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a    if( objc<2 ){.
7ee0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
7ef0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
7f00: 6f 62 6a 76 2c 20 22 53 55 42 2d 43 4f 4d 4d 41  objv, "SUB-COMMA
7f10: 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65  ND ...");.    re
7f20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7f30: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
7f40: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
7f50: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 73  terp, objv[1], s
7f60: 74 72 73 2c 20 22 73 75 62 2d 63 6f 6d 6d 61 6e  trs, "sub-comman
7f70: 64 22 2c 20 30 2c 20 26 69 53 75 62 29 20 29 7b  d", 0, &iSub) ){
7f80: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7f90: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77  ERROR;.  }..  sw
7fa0: 69 74 63 68 28 20 28 65 6e 75 6d 20 56 4c 5f 65  itch( (enum VL_e
7fb0: 6e 75 6d 29 69 53 75 62 20 29 7b 0a 20 20 20 20  num)iSub ){.    
7fc0: 63 61 73 65 20 56 4c 5f 41 4e 4e 4f 54 41 54 45  case VL_ANNOTATE
7fd0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  : {.      int rc
7fe0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56  ;.      char *zV
7ff0: 66 73 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  fs;.      char *
8000: 7a 4d 73 67 3b 0a 20 20 20 20 20 20 69 66 28 20  zMsg;.      if( 
8010: 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
8020: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
8030: 72 67 73 28 69 6e 74 65 72 70 2c 20 33 2c 20 6f  rgs(interp, 3, o
8040: 62 6a 76 2c 20 22 56 46 53 22 29 3b 0a 20 20 20  bjv, "VFS");.   
8050: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8060: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
8070: 20 20 20 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f       zVfs = Tcl_
8080: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
8090: 5d 29 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d  ]);.      zMsg =
80a0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
80b0: 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20 72  bjv[3]);.      r
80c0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 6c  c = sqlite3_vfsl
80d0: 6f 67 5f 61 6e 6e 6f 74 61 74 65 28 7a 56 66 73  og_annotate(zVfs
80e0: 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 69  , zMsg);.      i
80f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8100: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
8110: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8120: 65 72 70 2c 20 22 66 61 69 6c 65 64 22 2c 20 30  erp, "failed", 0
8130: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
8140: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8150: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
8160: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
8170: 20 56 4c 5f 46 49 4e 41 4c 49 5a 45 3a 20 7b 0a   VL_FINALIZE: {.
8180: 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
8190: 20 20 20 20 63 68 61 72 20 2a 7a 56 66 73 3b 0a      char *zVfs;.
81a0: 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
81b0: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  3 ){.        Tcl
81c0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
81d0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
81e0: 56 46 53 22 29 3b 0a 20 20 20 20 20 20 20 20 72  VFS");.        r
81f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8200: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
8210: 56 66 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Vfs = Tcl_GetStr
8220: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
8230: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8240: 5f 76 66 73 6c 6f 67 5f 66 69 6e 61 6c 69 7a 65  _vfslog_finalize
8250: 28 7a 56 66 73 29 3b 0a 20 20 20 20 20 20 69 66  (zVfs);.      if
8260: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8270: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
8280: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8290: 72 70 2c 20 22 66 61 69 6c 65 64 22 2c 20 30 29  rp, "failed", 0)
82a0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
82b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
82c0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
82d0: 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 63 61 73  .    };..    cas
82e0: 65 20 56 4c 5f 4e 45 57 3a 20 7b 0a 20 20 20 20  e VL_NEW: {.    
82f0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
8300: 63 68 61 72 20 2a 7a 56 66 73 3b 0a 20 20 20 20  char *zVfs;.    
8310: 20 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 3b    char *zParent;
8320: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f  .      char *zLo
8330: 67 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  g;.      if( obj
8340: 63 21 3d 35 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=5 ){.        
8350: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
8360: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
8370: 2c 20 22 56 46 53 20 50 41 52 45 4e 54 20 4c 4f  , "VFS PARENT LO
8380: 47 46 49 4c 45 22 29 3b 0a 20 20 20 20 20 20 20  GFILE");.       
8390: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
83a0: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
83b0: 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65 74 53   zVfs = Tcl_GetS
83c0: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
83d0: 20 20 20 20 20 20 7a 50 61 72 65 6e 74 20 3d 20        zParent = 
83e0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
83f0: 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20 7a 4c  jv[3]);.      zL
8400: 6f 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  og = Tcl_GetStri
8410: 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 20 20 20  ng(objv[4]);.   
8420: 20 20 20 69 66 28 20 2a 7a 50 61 72 65 6e 74 3d     if( *zParent=
8430: 3d 27 5c 30 27 20 29 20 7a 50 61 72 65 6e 74 20  ='\0' ) zParent 
8440: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
8450: 73 71 6c 69 74 65 33 5f 76 66 73 6c 6f 67 5f 6e  sqlite3_vfslog_n
8460: 65 77 28 7a 56 66 73 2c 20 7a 50 61 72 65 6e 74  ew(zVfs, zParent
8470: 2c 20 7a 4c 6f 67 29 3b 0a 20 20 20 20 20 20 69  , zLog);.      i
8480: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8490: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
84a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
84b0: 65 72 70 2c 20 22 66 61 69 6c 65 64 22 2c 20 30  erp, "failed", 0
84c0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
84d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
84e0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
84f0: 3b 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 63 61  ;.    };..    ca
8500: 73 65 20 56 4c 5f 52 45 47 49 53 54 45 52 3a 20  se VL_REGISTER: 
8510: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 44  {.      char *zD
8520: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  b;.      if( obj
8530: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=3 ){.        
8540: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
8550: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
8560: 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 20 20 20  , "DB");.       
8570: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8580: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
8590: 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
85a0: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
85b0: 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
85c0: 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65  CommandInfo(inte
85d0: 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66  rp, zDb, &cmdInf
85e0: 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62  o) ){.        db
85f0: 20 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c 69   = ((struct Sqli
8600: 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62  teDb*)cmdInfo.ob
8610: 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62  jClientData)->db
8620: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
8630: 71 6c 69 74 65 33 5f 76 66 73 6c 6f 67 5f 72 65  qlite3_vfslog_re
8640: 67 69 73 74 65 72 28 64 62 29 3b 0a 20 20 20 20  gister(db);.    
8650: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
8660: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8670: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
8680: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8690: 22 42 61 64 20 73 71 6c 69 74 65 33 20 68 61 6e  "Bad sqlite3 han
86a0: 64 6c 65 3a 20 22 2c 20 7a 44 62 2c 20 30 29 3b  dle: ", zDb, 0);
86b0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
86c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
86d0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
86e0: 20 20 20 20 7d 3b 0a 20 20 7d 0a 0a 20 20 72 65      };.  }..  re
86f0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
8700: 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 4f 73  int SqlitetestOs
8710: 69 6e 73 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  inst_Init(Tcl_In
8720: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
8730: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
8740: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 76  mmand(interp, "v
8750: 66 73 6c 6f 67 22 2c 20 74 65 73 74 5f 76 66 73  fslog", test_vfs
8760: 6c 6f 67 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65  log, 0, 0);.  re
8770: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
8780: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8790: 5f 54 45 53 54 20 2a 2f 0a 0a                    _TEST */..