/ Hex Artifact Content
Login

Artifact 1a8074514af1ad5154f010ce87776981558bcfd7:


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 52 45 41 44 49 4e 47 20 4c 4f 47 20  .** READING LOG 
0530: 46 49 4c 45 53 3a 0a 2a 2a 0a 2a 2a 20 20 20 4c  FILES:.**.**   L
0540: 6f 67 20 66 69 6c 65 73 20 61 72 65 20 72 65 61  og files are rea
0550: 64 20 75 73 69 6e 67 20 74 68 65 20 22 76 66 73  d using the "vfs
0560: 6c 6f 67 22 20 76 69 72 74 75 61 6c 20 74 61 62  log" virtual tab
0570: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
0580: 6e 0a 2a 2a 20 20 20 69 6e 20 74 68 69 73 20 66  n.**   in this f
0590: 69 6c 65 2e 20 54 6f 20 72 65 67 69 73 74 65 72  ile. To register
05a0: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
05b0: 6c 65 20 77 69 74 68 20 53 51 4c 69 74 65 2c 20  le with SQLite, 
05c0: 75 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  use:.**.**      
05d0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 76 66 73   int sqlite3_vfs
05e0: 6c 6f 67 5f 72 65 67 69 73 74 65 72 28 73 71 6c  log_register(sql
05f0: 69 74 65 33 20 2a 64 62 29 3b 0a 2a 2a 0a 2a 2a  ite3 *db);.**.**
0600: 20 20 20 54 68 65 6e 2c 20 69 66 20 74 68 65 20     Then, if the 
0610: 6c 6f 67 20 66 69 6c 65 20 69 73 20 6e 61 6d 65  log file is name
0620: 64 20 22 76 66 73 2e 6c 6f 67 22 2c 20 74 68 65  d "vfs.log", the
0630: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 63   following SQL c
0640: 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  ommand:.**.**   
0650: 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
0660: 41 4c 20 54 41 42 4c 45 20 76 20 55 53 49 4e 47  AL TABLE v USING
0670: 20 76 66 73 6c 6f 67 28 27 76 66 73 2e 6c 6f 67   vfslog('vfs.log
0680: 27 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 63 72 65 61  ');.**.**   crea
0690: 74 65 73 20 61 20 76 69 72 74 75 61 6c 20 74 61  tes a virtual ta
06a0: 62 6c 65 20 77 69 74 68 20 36 20 63 6f 6c 75 6d  ble with 6 colum
06b0: 6e 73 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ns, as follows:.
06c0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 43 52 45 41  **.**       CREA
06d0: 54 45 20 54 41 42 4c 45 20 76 28 0a 2a 2a 20 20  TE TABLE v(.**  
06e0: 20 20 20 20 20 20 20 65 76 65 6e 74 20 20 20 20         event    
06f0: 54 45 58 54 2c 20 20 20 20 20 20 20 20 20 20 20  TEXT,           
0700: 20 20 2f 2f 20 22 78 4f 70 65 6e 22 2c 20 22 78    // "xOpen", "x
0710: 52 65 61 64 22 20 65 74 63 2e 0a 2a 2a 20 20 20  Read" etc..**   
0720: 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 54        file     T
0730: 45 58 54 2c 20 20 20 20 20 20 20 20 20 20 20 20  EXT,            
0740: 20 2f 2f 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   // Name of file
0750: 20 74 68 69 73 20 63 61 6c 6c 20 61 70 70 6c 69   this call appli
0760: 65 73 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  es to.**        
0770: 20 63 6c 69 63 6b 73 20 20 20 49 4e 54 45 47 45   clicks   INTEGE
0780: 52 2c 20 20 20 20 20 20 20 20 20 20 2f 2f 20 54  R,          // T
0790: 69 6d 65 20 73 70 65 6e 74 20 69 6e 20 63 61 6c  ime spent in cal
07a0: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 63 20  l.**         rc 
07b0: 20 20 20 20 20 20 49 4e 54 45 47 45 52 2c 20 20        INTEGER,  
07c0: 20 20 20 20 20 20 20 20 2f 2f 20 52 65 74 75 72          // Retur
07d0: 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 20 20 20  n value.**      
07e0: 20 20 20 73 69 7a 65 20 20 20 20 20 49 4e 54 45     size     INTE
07f0: 47 45 52 2c 20 20 20 20 20 20 20 20 20 20 2f 2f  GER,          //
0800: 20 42 79 74 65 73 20 72 65 61 64 20 6f 72 20 77   Bytes read or w
0810: 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20 20 20 20  ritten.**       
0820: 20 20 6f 66 66 73 65 74 20 20 20 49 4e 54 45 47    offset   INTEG
0830: 45 52 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  ER           // 
0840: 46 69 6c 65 20 6f 66 66 73 65 74 20 72 65 61 64  File offset read
0850: 20 6f 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20   or written.**  
0860: 20 20 20 20 20 29 3b 0a 2a 2a 0a 2a 2f 0a 0a 23       );.**.*/..#
0870: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
0880: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h".#include <st
0890: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
08a0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a 20   <assert.h>../* 
08b0: 0a 2a 2a 20 68 77 74 69 6d 65 2e 68 20 63 6f 6e  .** hwtime.h con
08c0: 74 61 69 6e 73 20 69 6e 6c 69 6e 65 20 61 73 73  tains inline ass
08d0: 65 6d 62 6c 65 72 20 63 6f 64 65 20 66 6f 72 20  embler code for 
08e0: 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 0a 2a 2a  implementing .**
08f0: 20 68 69 67 68 2d 70 65 72 66 6f 72 6d 61 6e 63   high-performanc
0900: 65 20 74 69 6d 69 6e 67 20 72 6f 75 74 69 6e 65  e timing routine
0910: 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  s..*/.#include "
0920: 68 77 74 69 6d 65 2e 68 22 0a 0a 0a 2f 2a 0a 2a  hwtime.h".../*.*
0930: 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e 61  * Maximum pathna
0940: 6d 65 20 6c 65 6e 67 74 68 20 73 75 70 70 6f 72  me length suppor
0950: 74 65 64 20 62 79 20 74 68 65 20 76 66 73 6c 6f  ted by the vfslo
0960: 67 20 62 61 63 6b 65 6e 64 2e 0a 2a 2f 0a 23 64  g backend..*/.#d
0970: 65 66 69 6e 65 20 49 4e 53 54 5f 4d 41 58 5f 50  efine INST_MAX_P
0980: 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a 0a 23 64  ATHNAME 512...#d
0990: 65 66 69 6e 65 20 4f 53 5f 41 43 43 45 53 53 20  efine OS_ACCESS 
09a0: 20 20 20 20 20 20 20 20 20 20 20 31 0a 23 64 65             1.#de
09b0: 66 69 6e 65 20 4f 53 5f 43 48 45 43 4b 52 45 53  fine OS_CHECKRES
09c0: 45 52 56 45 44 4c 4f 43 4b 20 32 0a 23 64 65 66  ERVEDLOCK 2.#def
09d0: 69 6e 65 20 4f 53 5f 43 4c 4f 53 45 20 20 20 20  ine OS_CLOSE    
09e0: 20 20 20 20 20 20 20 20 20 33 0a 23 64 65 66 69           3.#defi
09f0: 6e 65 20 4f 53 5f 43 55 52 52 45 4e 54 54 49 4d  ne OS_CURRENTTIM
0a00: 45 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e  E       4.#defin
0a10: 65 20 4f 53 5f 44 45 4c 45 54 45 20 20 20 20 20  e OS_DELETE     
0a20: 20 20 20 20 20 20 20 35 0a 23 64 65 66 69 6e 65         5.#define
0a30: 20 4f 53 5f 44 45 56 43 48 41 52 20 20 20 20 20   OS_DEVCHAR     
0a40: 20 20 20 20 20 20 36 0a 23 64 65 66 69 6e 65 20        6.#define 
0a50: 4f 53 5f 46 49 4c 45 43 4f 4e 54 52 4f 4c 20 20  OS_FILECONTROL  
0a60: 20 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20 4f       7.#define O
0a70: 53 5f 46 49 4c 45 53 49 5a 45 20 20 20 20 20 20  S_FILESIZE      
0a80: 20 20 20 20 38 0a 23 64 65 66 69 6e 65 20 4f 53      8.#define OS
0a90: 5f 46 55 4c 4c 50 41 54 48 4e 41 4d 45 20 20 20  _FULLPATHNAME   
0aa0: 20 20 20 39 0a 23 64 65 66 69 6e 65 20 4f 53 5f     9.#define OS_
0ab0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  LOCK            
0ac0: 20 20 31 31 0a 23 64 65 66 69 6e 65 20 4f 53 5f    11.#define OS_
0ad0: 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20 20  OPEN            
0ae0: 20 20 31 32 0a 23 64 65 66 69 6e 65 20 4f 53 5f    12.#define OS_
0af0: 52 41 4e 44 4f 4d 4e 45 53 53 20 20 20 20 20 20  RANDOMNESS      
0b00: 20 20 31 33 0a 23 64 65 66 69 6e 65 20 4f 53 5f    13.#define OS_
0b10: 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20  READ            
0b20: 20 20 31 34 20 0a 23 64 65 66 69 6e 65 20 4f 53    14 .#define OS
0b30: 5f 53 45 43 54 4f 52 53 49 5a 45 20 20 20 20 20  _SECTORSIZE     
0b40: 20 20 20 31 35 0a 23 64 65 66 69 6e 65 20 4f 53     15.#define OS
0b50: 5f 53 4c 45 45 50 20 20 20 20 20 20 20 20 20 20  _SLEEP          
0b60: 20 20 20 31 36 0a 23 64 65 66 69 6e 65 20 4f 53     16.#define OS
0b70: 5f 53 59 4e 43 20 20 20 20 20 20 20 20 20 20 20  _SYNC           
0b80: 20 20 20 31 37 0a 23 64 65 66 69 6e 65 20 4f 53     17.#define OS
0b90: 5f 54 52 55 4e 43 41 54 45 20 20 20 20 20 20 20  _TRUNCATE       
0ba0: 20 20 20 31 38 0a 23 64 65 66 69 6e 65 20 4f 53     18.#define OS
0bb0: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 20  _UNLOCK         
0bc0: 20 20 20 31 39 0a 23 64 65 66 69 6e 65 20 4f 53     19.#define OS
0bd0: 5f 57 52 49 54 45 20 20 20 20 20 20 20 20 20 20  _WRITE          
0be0: 20 20 20 32 30 0a 0a 23 64 65 66 69 6e 65 20 4f     20..#define O
0bf0: 53 5f 4e 55 4d 45 56 45 4e 54 53 20 20 20 20 20  S_NUMEVENTS     
0c00: 20 20 20 20 32 31 0a 0a 23 64 65 66 69 6e 65 20      21..#define 
0c10: 42 49 4e 41 52 59 4c 4f 47 5f 53 54 52 49 4e 47  BINARYLOG_STRING
0c20: 20 20 20 20 20 33 30 0a 23 64 65 66 69 6e 65 20       30.#define 
0c30: 42 49 4e 41 52 59 4c 4f 47 5f 4d 41 52 4b 45 52  BINARYLOG_MARKER
0c40: 20 20 20 20 20 33 31 0a 0a 23 64 65 66 69 6e 65       31..#define
0c50: 20 42 49 4e 41 52 59 4c 4f 47 5f 50 52 45 50 41   BINARYLOG_PREPA
0c60: 52 45 5f 56 32 20 36 34 0a 23 64 65 66 69 6e 65  RE_V2 64.#define
0c70: 20 42 49 4e 41 52 59 4c 4f 47 5f 53 54 45 50 20   BINARYLOG_STEP 
0c80: 20 20 20 20 20 20 36 35 0a 23 64 65 66 69 6e 65        65.#define
0c90: 20 42 49 4e 41 52 59 4c 4f 47 5f 46 49 4e 41 4c   BINARYLOG_FINAL
0ca0: 49 5a 45 20 20 20 36 36 0a 0a 0a 23 64 65 66 69  IZE   66...#defi
0cb0: 6e 65 20 56 46 53 4c 4f 47 5f 42 55 46 46 45 52  ne VFSLOG_BUFFER
0cc0: 53 49 5a 45 20 38 31 39 32 0a 0a 74 79 70 65 64  SIZE 8192..typed
0cd0: 65 66 20 73 74 72 75 63 74 20 56 66 73 6c 6f 67  ef struct Vfslog
0ce0: 56 66 73 20 56 66 73 6c 6f 67 56 66 73 3b 0a 74  Vfs VfslogVfs;.t
0cf0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56 66  ypedef struct Vf
0d00: 73 6c 6f 67 46 69 6c 65 20 56 66 73 6c 6f 67 46  slogFile VfslogF
0d10: 69 6c 65 3b 0a 0a 73 74 72 75 63 74 20 56 66 73  ile;..struct Vfs
0d20: 6c 6f 67 56 66 73 20 7b 0a 20 20 73 71 6c 69 74  logVfs {.  sqlit
0d30: 65 33 5f 76 66 73 20 62 61 73 65 3b 20 20 20 20  e3_vfs base;    
0d40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
0d50: 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 20 20 73  S methods */.  s
0d60: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
0d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
0d80: 2a 20 50 61 72 65 6e 74 20 56 46 53 20 2a 2f 0a  * Parent VFS */.
0d90: 20 20 69 6e 74 20 69 4e 65 78 74 46 69 6c 65 49    int iNextFileI
0da0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
0db0: 20 20 2f 2a 20 4e 65 78 74 20 66 69 6c 65 20 69    /* Next file i
0dc0: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
0dd0: 69 6c 65 20 2a 70 4c 6f 67 3b 20 20 20 20 20 20  ile *pLog;      
0de0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 66 69         /* Log fi
0df0: 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73  le handle */.  s
0e00: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66  qlite3_int64 iOf
0e10: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f  fset;          /
0e20: 2a 20 4c 6f 67 20 66 69 6c 65 20 6f 66 66 73 65  * Log file offse
0e30: 74 20 6f 66 20 73 74 61 72 74 20 6f 66 20 77 72  t of start of wr
0e40: 69 74 65 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  ite buffer */.  
0e50: 69 6e 74 20 6e 42 75 66 3b 20 20 20 20 20 20 20  int nBuf;       
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
0e80: 69 64 20 62 79 74 65 73 20 69 6e 20 61 42 75 66  id bytes in aBuf
0e90: 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 61 42 75  [] */.  char aBu
0ea0: 66 5b 56 46 53 4c 4f 47 5f 42 55 46 46 45 52 53  f[VFSLOG_BUFFERS
0eb0: 49 5a 45 5d 3b 20 20 20 2f 2a 20 57 72 69 74 65  IZE];   /* Write
0ec0: 20 62 75 66 66 65 72 20 2a 2f 0a 7d 3b 0a 0a 73   buffer */.};..s
0ed0: 74 72 75 63 74 20 56 66 73 6c 6f 67 46 69 6c 65  truct VfslogFile
0ee0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c   {.  sqlite3_fil
0ef0: 65 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 20  e base;         
0f00: 20 20 20 20 20 2f 2a 20 49 4f 20 6d 65 74 68 6f       /* IO metho
0f10: 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ds */.  sqlite3_
0f20: 66 69 6c 65 20 2a 70 52 65 61 6c 3b 20 20 20 20  file *pReal;    
0f30: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 64 65 72          /* Under
0f40: 6c 79 69 6e 67 20 66 69 6c 65 20 68 61 6e 64 6c  lying file handl
0f50: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
0f60: 66 73 20 2a 70 56 66 73 6c 6f 67 3b 20 20 20 20  fs *pVfslog;    
0f70: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
0f80: 61 74 65 64 20 56 73 66 6c 6f 67 56 66 73 20 6f  ated VsflogVfs o
0f90: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
0fa0: 46 69 6c 65 49 64 3b 20 20 20 20 20 20 20 20 20  FileId;         
0fb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
0fc0: 6c 65 20 69 64 20 6e 75 6d 62 65 72 20 2a 2f 0a  le id number */.
0fd0: 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 52 45 41 4c  };..#define REAL
0fe0: 56 46 53 28 70 29 20 28 28 28 56 66 73 6c 6f 67  VFS(p) (((Vfslog
0ff0: 56 66 73 20 2a 29 28 70 29 29 2d 3e 70 56 66 73  Vfs *)(p))->pVfs
1000: 29 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 65 74 68 6f  )..../*.** Metho
1010: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 66  d declarations f
1020: 6f 72 20 76 66 73 6c 6f 67 5f 66 69 6c 65 2e 0a  or vfslog_file..
1030: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  */.static int vf
1040: 73 6c 6f 67 43 6c 6f 73 65 28 73 71 6c 69 74 65  slogClose(sqlite
1050: 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63  3_file*);.static
1060: 20 69 6e 74 20 76 66 73 6c 6f 67 52 65 61 64 28   int vfslogRead(
1070: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 76  sqlite3_file*, v
1080: 6f 69 64 2a 2c 20 69 6e 74 20 69 41 6d 74 2c 20  oid*, int iAmt, 
1090: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
10a0: 66 73 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  fst);.static int
10b0: 20 76 66 73 6c 6f 67 57 72 69 74 65 28 73 71 6c   vfslogWrite(sql
10c0: 69 74 65 33 5f 66 69 6c 65 2a 2c 63 6f 6e 73 74  ite3_file*,const
10d0: 20 76 6f 69 64 2a 2c 69 6e 74 20 69 41 6d 74 2c   void*,int iAmt,
10e0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
10f0: 4f 66 73 74 29 3b 0a 73 74 61 74 69 63 20 69 6e  Ofst);.static in
1100: 74 20 76 66 73 6c 6f 67 54 72 75 6e 63 61 74 65  t vfslogTruncate
1110: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
1120: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 69  sqlite3_int64 si
1130: 7a 65 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  ze);.static int 
1140: 76 66 73 6c 6f 67 53 79 6e 63 28 73 71 6c 69 74  vfslogSync(sqlit
1150: 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 66 6c  e3_file*, int fl
1160: 61 67 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  ags);.static int
1170: 20 76 66 73 6c 6f 67 46 69 6c 65 53 69 7a 65 28   vfslogFileSize(
1180: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 73  sqlite3_file*, s
1190: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53  qlite3_int64 *pS
11a0: 69 7a 65 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  ize);.static int
11b0: 20 76 66 73 6c 6f 67 4c 6f 63 6b 28 73 71 6c 69   vfslogLock(sqli
11c0: 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b  te3_file*, int);
11d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c  .static int vfsl
11e0: 6f 67 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ogUnlock(sqlite3
11f0: 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74  _file*, int);.st
1200: 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 43  atic int vfslogC
1210: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1220: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
1230: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 3b 0a 73  int *pResOut);.s
1240: 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67  tatic int vfslog
1250: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
1260: 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 6f  te3_file*, int o
1270: 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 3b 0a  p, void *pArg);.
1280: 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f  static int vfslo
1290: 67 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  gSectorSize(sqli
12a0: 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74  te3_file*);.stat
12b0: 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 44 65 76  ic int vfslogDev
12c0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
12d0: 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  cs(sqlite3_file*
12e0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 65 74 68 6f 64  );../*.** Method
12f0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f   declarations fo
1300: 72 20 76 66 73 6c 6f 67 5f 76 66 73 2e 0a 2a 2f  r vfslog_vfs..*/
1310: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c  .static int vfsl
1320: 6f 67 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  ogOpen(sqlite3_v
1330: 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  fs*, const char 
1340: 2a 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  *, sqlite3_file*
1350: 2c 20 69 6e 74 20 2c 20 69 6e 74 20 2a 29 3b 0a  , int , int *);.
1360: 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f  static int vfslo
1370: 67 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f  gDelete(sqlite3_
1380: 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  vfs*, const char
1390: 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 73 79 6e   *zName, int syn
13a0: 63 44 69 72 29 3b 0a 73 74 61 74 69 63 20 69 6e  cDir);.static in
13b0: 74 20 76 66 73 6c 6f 67 41 63 63 65 73 73 28 73  t vfslogAccess(s
13c0: 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e  qlite3_vfs*, con
13d0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
13e0: 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 2a  int flags, int *
13f0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  );.static int vf
1400: 73 6c 6f 67 46 75 6c 6c 50 61 74 68 6e 61 6d 65  slogFullPathname
1410: 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63  (sqlite3_vfs*, c
1420: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1430: 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 7a 4f 75  , int, char *zOu
1440: 74 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  t);.static void 
1450: 2a 76 66 73 6c 6f 67 44 6c 4f 70 65 6e 28 73 71  *vfslogDlOpen(sq
1460: 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73  lite3_vfs*, cons
1470: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1480: 65 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  e);.static void 
1490: 76 66 73 6c 6f 67 44 6c 45 72 72 6f 72 28 73 71  vfslogDlError(sq
14a0: 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74 20  lite3_vfs*, int 
14b0: 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 45 72  nByte, char *zEr
14c0: 72 4d 73 67 29 3b 0a 73 74 61 74 69 63 20 76 6f  rMsg);.static vo
14d0: 69 64 20 28 2a 76 66 73 6c 6f 67 44 6c 53 79 6d  id (*vfslogDlSym
14e0: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
14f0: 66 73 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e  fs, void *p, con
1500: 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76  st char*zSym))(v
1510: 6f 69 64 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  oid);.static voi
1520: 64 20 76 66 73 6c 6f 67 44 6c 43 6c 6f 73 65 28  d vfslogDlClose(
1530: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 76 6f  sqlite3_vfs*, vo
1540: 69 64 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  id*);.static int
1550: 20 76 66 73 6c 6f 67 52 61 6e 64 6f 6d 6e 65 73   vfslogRandomnes
1560: 73 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20  s(sqlite3_vfs*, 
1570: 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72 20  int nByte, char 
1580: 2a 7a 4f 75 74 29 3b 0a 73 74 61 74 69 63 20 69  *zOut);.static i
1590: 6e 74 20 76 66 73 6c 6f 67 53 6c 65 65 70 28 73  nt vfslogSleep(s
15a0: 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74  qlite3_vfs*, int
15b0: 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a   microseconds);.
15c0: 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f  static int vfslo
15d0: 67 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  gCurrentTime(sql
15e0: 69 74 65 33 5f 76 66 73 2a 2c 20 64 6f 75 62 6c  ite3_vfs*, doubl
15f0: 65 2a 29 3b 0a 0a 73 74 61 74 69 63 20 73 71 6c  e*);..static sql
1600: 69 74 65 33 5f 76 66 73 20 76 66 73 6c 6f 67 5f  ite3_vfs vfslog_
1610: 76 66 73 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20  vfs = {.  1,    
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1630: 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
1640: 0a 20 20 73 69 7a 65 6f 66 28 56 66 73 6c 6f 67  .  sizeof(Vfslog
1650: 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a  File),     /* sz
1660: 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 49 4e 53 54  OsFile */.  INST
1670: 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 20  _MAX_PATHNAME,  
1680: 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d      /* mxPathnam
1690: 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  e */.  0,       
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16b0: 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 30 2c 20  * pNext */.  0, 
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f       /* zName */
16e0: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
16f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41             /* pA
1700: 70 70 44 61 74 61 20 2a 2f 0a 20 20 76 66 73 6c  ppData */.  vfsl
1710: 6f 67 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  ogOpen,         
1720: 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
1730: 2f 0a 20 20 76 66 73 6c 6f 67 44 65 6c 65 74 65  /.  vfslogDelete
1740: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1750: 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 76 66   xDelete */.  vf
1760: 73 6c 6f 67 41 63 63 65 73 73 2c 20 20 20 20 20  slogAccess,     
1770: 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65          /* xAcce
1780: 73 73 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 46 75  ss */.  vfslogFu
1790: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
17a0: 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61    /* xFullPathna
17b0: 6d 65 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 44 6c  me */.  vfslogDl
17c0: 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
17d0: 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a    /* xDlOpen */.
17e0: 20 20 76 66 73 6c 6f 67 44 6c 45 72 72 6f 72 2c    vfslogDlError,
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1800: 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 76 66 73  DlError */.  vfs
1810: 6c 6f 67 44 6c 53 79 6d 2c 20 20 20 20 20 20 20  logDlSym,       
1820: 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d         /* xDlSym
1830: 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 44 6c 43 6c   */.  vfslogDlCl
1840: 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
1850: 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20  /* xDlClose */. 
1860: 20 76 66 73 6c 6f 67 52 61 6e 64 6f 6d 6e 65 73   vfslogRandomnes
1870: 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52  s,         /* xR
1880: 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 76  andomness */.  v
1890: 66 73 6c 6f 67 53 6c 65 65 70 2c 20 20 20 20 20  fslogSleep,     
18a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
18b0: 65 70 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 43 75  ep */.  vfslogCu
18c0: 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
18d0: 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
18e0: 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  e */.};..static 
18f0: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1900: 64 73 20 76 66 73 6c 6f 67 5f 69 6f 5f 6d 65 74  ds vfslog_io_met
1910: 68 6f 64 73 20 3d 20 7b 0a 20 20 31 2c 20 20 20  hods = {.  1,   
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1930: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
1940: 73 69 6f 6e 20 2a 2f 0a 20 20 76 66 73 6c 6f 67  sion */.  vfslog
1950: 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
1960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1970: 43 6c 6f 73 65 20 2a 2f 0a 20 20 76 66 73 6c 6f  Close */.  vfslo
1980: 67 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20  gRead,          
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19a0: 78 52 65 61 64 20 2a 2f 0a 20 20 76 66 73 6c 6f  xRead */.  vfslo
19b0: 67 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  gWrite,         
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19d0: 78 57 72 69 74 65 20 2a 2f 0a 20 20 76 66 73 6c  xWrite */.  vfsl
19e0: 6f 67 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20  ogTruncate,     
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a00: 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20   xTruncate */.  
1a10: 76 66 73 6c 6f 67 53 79 6e 63 2c 20 20 20 20 20  vfslogSync,     
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20    /* xSync */.  
1a40: 76 66 73 6c 6f 67 46 69 6c 65 53 69 7a 65 2c 20  vfslogFileSize, 
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
1a70: 2f 0a 20 20 76 66 73 6c 6f 67 4c 6f 63 6b 2c 20  /.  vfslogLock, 
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
1aa0: 2f 0a 20 20 76 66 73 6c 6f 67 55 6e 6c 6f 63 6b  /.  vfslogUnlock
1ab0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ac0: 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
1ad0: 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 43 68 65 63   */.  vfslogChec
1ae0: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
1af0: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63          /* xChec
1b00: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f  kReservedLock */
1b10: 0a 20 20 76 66 73 6c 6f 67 46 69 6c 65 43 6f 6e  .  vfslogFileCon
1b20: 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
1b30: 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
1b40: 74 72 6f 6c 20 2a 2f 0a 20 20 76 66 73 6c 6f 67  trol */.  vfslog
1b50: 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20  SectorSize,     
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1b70: 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20  SectorSize */.  
1b80: 76 66 73 6c 6f 67 44 65 76 69 63 65 43 68 61 72  vfslogDeviceChar
1b90: 61 63 74 65 72 69 73 74 69 63 73 20 20 20 20 20  acteristics     
1ba0: 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72    /* xDeviceChar
1bb0: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 7d  acteristics */.}
1bc0: 3b 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  ;..static sqlite
1bd0: 33 5f 75 69 6e 74 36 34 20 76 66 73 6c 6f 67 5f  3_uint64 vfslog_
1be0: 74 69 6d 65 28 29 7b 0a 20 20 72 65 74 75 72 6e  time(){.  return
1bf0: 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28 29   sqlite3Hwtime()
1c00: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1c10: 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 73 71 6c   vfslog_call(sql
1c20: 69 74 65 33 5f 76 66 73 20 2a 2c 20 69 6e 74 2c  ite3_vfs *, int,
1c30: 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 2c 20   int, int, int, 
1c40: 69 6e 74 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  int, int);.stati
1c50: 63 20 76 6f 69 64 20 76 66 73 6c 6f 67 5f 73 74  c void vfslog_st
1c60: 72 69 6e 67 28 73 71 6c 69 74 65 33 5f 76 66 73  ring(sqlite3_vfs
1c70: 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   *, const char *
1c80: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  );../*.** Close 
1c90: 61 6e 20 76 66 73 6c 6f 67 2d 66 69 6c 65 2e 0a  an vfslog-file..
1ca0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  */.static int vf
1cb0: 73 6c 6f 67 43 6c 6f 73 65 28 73 71 6c 69 74 65  slogClose(sqlite
1cc0: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
1cd0: 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34    sqlite3_uint64
1ce0: 20 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   t;.  int rc = S
1cf0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 56 66 73 6c  QLITE_OK;.  Vfsl
1d00: 6f 67 46 69 6c 65 20 2a 70 20 3d 20 28 56 66 73  ogFile *p = (Vfs
1d10: 6c 6f 67 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  logFile *)pFile;
1d20: 0a 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74  ..  t = vfslog_t
1d30: 69 6d 65 28 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ime();.  if( p->
1d40: 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 20  pReal->pMethods 
1d50: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 70  ){.    rc = p->p
1d60: 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
1d70: 78 43 6c 6f 73 65 28 70 2d 3e 70 52 65 61 6c 29  xClose(p->pReal)
1d80: 3b 0a 20 20 7d 0a 20 20 74 20 3d 20 76 66 73 6c  ;.  }.  t = vfsl
1d90: 6f 67 5f 74 69 6d 65 28 29 20 2d 20 74 3b 0a 20  og_time() - t;. 
1da0: 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70 2d 3e   vfslog_call(p->
1db0: 70 56 66 73 6c 6f 67 2c 20 4f 53 5f 43 4c 4f 53  pVfslog, OS_CLOS
1dc0: 45 2c 20 70 2d 3e 69 46 69 6c 65 49 64 2c 20 74  E, p->iFileId, t
1dd0: 2c 20 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20 72  , rc, 0, 0);.  r
1de0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1df0: 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
1e00: 6d 20 61 6e 20 76 66 73 6c 6f 67 2d 66 69 6c 65  m an vfslog-file
1e10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e20: 76 66 73 6c 6f 67 52 65 61 64 28 0a 20 20 73 71  vfslogRead(.  sq
1e30: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
1e40: 65 2c 20 0a 20 20 76 6f 69 64 20 2a 7a 42 75 66  e, .  void *zBuf
1e50: 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74 2c 20 0a  , .  int iAmt, .
1e60: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
1e70: 4f 66 73 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Ofst.){.  int rc
1e80: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74  ;.  sqlite3_uint
1e90: 36 34 20 74 3b 0a 20 20 56 66 73 6c 6f 67 46 69  64 t;.  VfslogFi
1ea0: 6c 65 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67 46  le *p = (VfslogF
1eb0: 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 74  ile *)pFile;.  t
1ec0: 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29   = vfslog_time()
1ed0: 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61  ;.  rc = p->pRea
1ee0: 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52 65  l->pMethods->xRe
1ef0: 61 64 28 70 2d 3e 70 52 65 61 6c 2c 20 7a 42 75  ad(p->pReal, zBu
1f00: 66 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b  f, iAmt, iOfst);
1f10: 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69  .  t = vfslog_ti
1f20: 6d 65 28 29 20 2d 20 74 3b 0a 20 20 76 66 73 6c  me() - t;.  vfsl
1f30: 6f 67 5f 63 61 6c 6c 28 70 2d 3e 70 56 66 73 6c  og_call(p->pVfsl
1f40: 6f 67 2c 20 4f 53 5f 52 45 41 44 2c 20 70 2d 3e  og, OS_READ, p->
1f50: 69 46 69 6c 65 49 64 2c 20 74 2c 20 72 63 2c 20  iFileId, t, rc, 
1f60: 69 41 6d 74 2c 20 28 69 6e 74 29 69 4f 66 73 74  iAmt, (int)iOfst
1f70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1f80: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  }../*.** Write d
1f90: 61 74 61 20 74 6f 20 61 6e 20 76 66 73 6c 6f 67  ata to an vfslog
1fa0: 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
1fb0: 20 69 6e 74 20 76 66 73 6c 6f 67 57 72 69 74 65   int vfslogWrite
1fc0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1fd0: 20 2a 70 46 69 6c 65 2c 0a 20 20 63 6f 6e 73 74   *pFile,.  const
1fe0: 20 76 6f 69 64 20 2a 7a 2c 0a 20 20 69 6e 74 20   void *z,.  int 
1ff0: 69 41 6d 74 2c 0a 20 20 73 71 6c 69 74 65 5f 69  iAmt,.  sqlite_i
2000: 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a 20 20  nt64 iOfst.){.  
2010: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
2020: 33 5f 75 69 6e 74 36 34 20 74 3b 0a 20 20 56 66  3_uint64 t;.  Vf
2030: 73 6c 6f 67 46 69 6c 65 20 2a 70 20 3d 20 28 56  slogFile *p = (V
2040: 66 73 6c 6f 67 46 69 6c 65 20 2a 29 70 46 69 6c  fslogFile *)pFil
2050: 65 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f  e;.  t = vfslog_
2060: 74 69 6d 65 28 29 3b 0a 20 20 72 63 20 3d 20 70  time();.  rc = p
2070: 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
2080: 73 2d 3e 78 57 72 69 74 65 28 70 2d 3e 70 52 65  s->xWrite(p->pRe
2090: 61 6c 2c 20 7a 2c 20 69 41 6d 74 2c 20 69 4f 66  al, z, iAmt, iOf
20a0: 73 74 29 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f  st);.  t = vfslo
20b0: 67 5f 74 69 6d 65 28 29 20 2d 20 74 3b 0a 20 20  g_time() - t;.  
20c0: 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70 2d 3e 70  vfslog_call(p->p
20d0: 56 66 73 6c 6f 67 2c 20 4f 53 5f 57 52 49 54 45  Vfslog, OS_WRITE
20e0: 2c 20 70 2d 3e 69 46 69 6c 65 49 64 2c 20 74 2c  , p->iFileId, t,
20f0: 20 72 63 2c 20 69 41 6d 74 2c 20 28 69 6e 74 29   rc, iAmt, (int)
2100: 69 4f 66 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  iOfst);.  return
2110: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
2120: 75 6e 63 61 74 65 20 61 6e 20 76 66 73 6c 6f 67  uncate an vfslog
2130: 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
2140: 20 69 6e 74 20 76 66 73 6c 6f 67 54 72 75 6e 63   int vfslogTrunc
2150: 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ate(sqlite3_file
2160: 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f   *pFile, sqlite_
2170: 69 6e 74 36 34 20 73 69 7a 65 29 7b 0a 20 20 69  int64 size){.  i
2180: 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
2190: 5f 75 69 6e 74 36 34 20 74 3b 0a 20 20 56 66 73  _uint64 t;.  Vfs
21a0: 6c 6f 67 46 69 6c 65 20 2a 70 20 3d 20 28 56 66  logFile *p = (Vf
21b0: 73 6c 6f 67 46 69 6c 65 20 2a 29 70 46 69 6c 65  slogFile *)pFile
21c0: 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74  ;.  t = vfslog_t
21d0: 69 6d 65 28 29 3b 0a 20 20 72 63 20 3d 20 70 2d  ime();.  rc = p-
21e0: 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
21f0: 2d 3e 78 54 72 75 6e 63 61 74 65 28 70 2d 3e 70  ->xTruncate(p->p
2200: 52 65 61 6c 2c 20 73 69 7a 65 29 3b 0a 20 20 74  Real, size);.  t
2210: 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29   = vfslog_time()
2220: 20 2d 20 74 3b 0a 20 20 76 66 73 6c 6f 67 5f 63   - t;.  vfslog_c
2230: 61 6c 6c 28 70 2d 3e 70 56 66 73 6c 6f 67 2c 20  all(p->pVfslog, 
2240: 4f 53 5f 54 52 55 4e 43 41 54 45 2c 20 70 2d 3e  OS_TRUNCATE, p->
2250: 69 46 69 6c 65 49 64 2c 20 74 2c 20 72 63 2c 20  iFileId, t, rc, 
2260: 30 2c 20 28 69 6e 74 29 73 69 7a 65 29 3b 0a 20  0, (int)size);. 
2270: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2280: 2a 0a 2a 2a 20 53 79 6e 63 20 61 6e 20 76 66 73  *.** Sync an vfs
2290: 6c 6f 67 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  log-file..*/.sta
22a0: 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 53 79  tic int vfslogSy
22b0: 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nc(sqlite3_file 
22c0: 2a 70 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67  *pFile, int flag
22d0: 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
22e0: 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 74  sqlite3_uint64 t
22f0: 3b 0a 20 20 56 66 73 6c 6f 67 46 69 6c 65 20 2a  ;.  VfslogFile *
2300: 70 20 3d 20 28 56 66 73 6c 6f 67 46 69 6c 65 20  p = (VfslogFile 
2310: 2a 29 70 46 69 6c 65 3b 0a 20 20 74 20 3d 20 76  *)pFile;.  t = v
2320: 66 73 6c 6f 67 5f 74 69 6d 65 28 29 3b 0a 20 20  fslog_time();.  
2330: 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  rc = p->pReal->p
2340: 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28 70  Methods->xSync(p
2350: 2d 3e 70 52 65 61 6c 2c 20 66 6c 61 67 73 29 3b  ->pReal, flags);
2360: 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69  .  t = vfslog_ti
2370: 6d 65 28 29 20 2d 20 74 3b 0a 20 20 76 66 73 6c  me() - t;.  vfsl
2380: 6f 67 5f 63 61 6c 6c 28 70 2d 3e 70 56 66 73 6c  og_call(p->pVfsl
2390: 6f 67 2c 20 4f 53 5f 53 59 4e 43 2c 20 70 2d 3e  og, OS_SYNC, p->
23a0: 69 46 69 6c 65 49 64 2c 20 74 2c 20 72 63 2c 20  iFileId, t, rc, 
23b0: 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 72 65 74  flags, 0);.  ret
23c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23d0: 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
23e0: 65 6e 74 20 66 69 6c 65 2d 73 69 7a 65 20 6f 66  ent file-size of
23f0: 20 61 6e 20 76 66 73 6c 6f 67 2d 66 69 6c 65 2e   an vfslog-file.
2400: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
2410: 66 73 6c 6f 67 46 69 6c 65 53 69 7a 65 28 73 71  fslogFileSize(sq
2420: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
2430: 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  e, sqlite_int64 
2440: 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  *pSize){.  int r
2450: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e  c;.  sqlite3_uin
2460: 74 36 34 20 74 3b 0a 20 20 56 66 73 6c 6f 67 46  t64 t;.  VfslogF
2470: 69 6c 65 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67  ile *p = (Vfslog
2480: 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  File *)pFile;.  
2490: 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28  t = vfslog_time(
24a0: 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 70 52 65  );.  rc = p->pRe
24b0: 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46  al->pMethods->xF
24c0: 69 6c 65 53 69 7a 65 28 70 2d 3e 70 52 65 61 6c  ileSize(p->pReal
24d0: 2c 20 70 53 69 7a 65 29 3b 0a 20 20 74 20 3d 20  , pSize);.  t = 
24e0: 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29 20 2d 20  vfslog_time() - 
24f0: 74 3b 0a 20 20 76 66 73 6c 6f 67 5f 63 61 6c 6c  t;.  vfslog_call
2500: 28 70 2d 3e 70 56 66 73 6c 6f 67 2c 20 4f 53 5f  (p->pVfslog, OS_
2510: 46 49 4c 45 53 49 5a 45 2c 20 70 2d 3e 69 46 69  FILESIZE, p->iFi
2520: 6c 65 49 64 2c 20 74 2c 20 72 63 2c 20 30 2c 20  leId, t, rc, 0, 
2530: 28 69 6e 74 29 2a 70 53 69 7a 65 29 3b 0a 20 20  (int)*pSize);.  
2540: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2550: 0a 2a 2a 20 4c 6f 63 6b 20 61 6e 20 76 66 73 6c  .** Lock an vfsl
2560: 6f 67 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  og-file..*/.stat
2570: 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 4c 6f 63  ic int vfslogLoc
2580: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
2590: 70 46 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b  pFile, int eLock
25a0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
25b0: 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 74 3b  qlite3_uint64 t;
25c0: 0a 20 20 56 66 73 6c 6f 67 46 69 6c 65 20 2a 70  .  VfslogFile *p
25d0: 20 3d 20 28 56 66 73 6c 6f 67 46 69 6c 65 20 2a   = (VfslogFile *
25e0: 29 70 46 69 6c 65 3b 0a 20 20 74 20 3d 20 76 66  )pFile;.  t = vf
25f0: 73 6c 6f 67 5f 74 69 6d 65 28 29 3b 0a 20 20 72  slog_time();.  r
2600: 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  c = p->pReal->pM
2610: 65 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b 28 70 2d  ethods->xLock(p-
2620: 3e 70 52 65 61 6c 2c 20 65 4c 6f 63 6b 29 3b 0a  >pReal, eLock);.
2630: 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d    t = vfslog_tim
2640: 65 28 29 20 2d 20 74 3b 0a 20 20 76 66 73 6c 6f  e() - t;.  vfslo
2650: 67 5f 63 61 6c 6c 28 70 2d 3e 70 56 66 73 6c 6f  g_call(p->pVfslo
2660: 67 2c 20 4f 53 5f 4c 4f 43 4b 2c 20 70 2d 3e 69  g, OS_LOCK, p->i
2670: 46 69 6c 65 49 64 2c 20 74 2c 20 72 63 2c 20 65  FileId, t, rc, e
2680: 4c 6f 63 6b 2c 20 30 29 3b 0a 20 20 72 65 74 75  Lock, 0);.  retu
2690: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
26a0: 55 6e 6c 6f 63 6b 20 61 6e 20 76 66 73 6c 6f 67  Unlock an vfslog
26b0: 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
26c0: 20 69 6e 74 20 76 66 73 6c 6f 67 55 6e 6c 6f 63   int vfslogUnloc
26d0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
26e0: 70 46 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b  pFile, int eLock
26f0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
2700: 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 74 3b  qlite3_uint64 t;
2710: 0a 20 20 56 66 73 6c 6f 67 46 69 6c 65 20 2a 70  .  VfslogFile *p
2720: 20 3d 20 28 56 66 73 6c 6f 67 46 69 6c 65 20 2a   = (VfslogFile *
2730: 29 70 46 69 6c 65 3b 0a 20 20 74 20 3d 20 76 66  )pFile;.  t = vf
2740: 73 6c 6f 67 5f 74 69 6d 65 28 29 3b 0a 20 20 72  slog_time();.  r
2750: 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  c = p->pReal->pM
2760: 65 74 68 6f 64 73 2d 3e 78 55 6e 6c 6f 63 6b 28  ethods->xUnlock(
2770: 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f 63 6b 29  p->pReal, eLock)
2780: 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74  ;.  t = vfslog_t
2790: 69 6d 65 28 29 20 2d 20 74 3b 0a 20 20 76 66 73  ime() - t;.  vfs
27a0: 6c 6f 67 5f 63 61 6c 6c 28 70 2d 3e 70 56 66 73  log_call(p->pVfs
27b0: 6c 6f 67 2c 20 4f 53 5f 55 4e 4c 4f 43 4b 2c 20  log, OS_UNLOCK, 
27c0: 70 2d 3e 69 46 69 6c 65 49 64 2c 20 74 2c 20 72  p->iFileId, t, r
27d0: 63 2c 20 65 4c 6f 63 6b 2c 20 30 29 3b 0a 20 20  c, eLock, 0);.  
27e0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27f0: 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 6f  .** Check if ano
2800: 74 68 65 72 20 66 69 6c 65 2d 68 61 6e 64 6c 65  ther file-handle
2810: 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
2820: 44 20 6c 6f 63 6b 20 6f 6e 20 61 6e 20 76 66 73  D lock on an vfs
2830: 6c 6f 67 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  log-file..*/.sta
2840: 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 43 68  tic int vfslogCh
2850: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
2860: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
2870: 69 6c 65 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  ile, int *pResOu
2880: 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
2890: 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 74  sqlite3_uint64 t
28a0: 3b 0a 20 20 56 66 73 6c 6f 67 46 69 6c 65 20 2a  ;.  VfslogFile *
28b0: 70 20 3d 20 28 56 66 73 6c 6f 67 46 69 6c 65 20  p = (VfslogFile 
28c0: 2a 29 70 46 69 6c 65 3b 0a 20 20 74 20 3d 20 76  *)pFile;.  t = v
28d0: 66 73 6c 6f 67 5f 74 69 6d 65 28 29 3b 0a 20 20  fslog_time();.  
28e0: 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  rc = p->pReal->p
28f0: 4d 65 74 68 6f 64 73 2d 3e 78 43 68 65 63 6b 52  Methods->xCheckR
2900: 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 2d 3e 70  eservedLock(p->p
2910: 52 65 61 6c 2c 20 70 52 65 73 4f 75 74 29 3b 0a  Real, pResOut);.
2920: 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d    t = vfslog_tim
2930: 65 28 29 20 2d 20 74 3b 0a 20 20 76 66 73 6c 6f  e() - t;.  vfslo
2940: 67 5f 63 61 6c 6c 28 70 2d 3e 70 56 66 73 6c 6f  g_call(p->pVfslo
2950: 67 2c 20 4f 53 5f 43 48 45 43 4b 52 45 53 45 52  g, OS_CHECKRESER
2960: 56 45 44 4c 4f 43 4b 2c 20 70 2d 3e 69 46 69 6c  VEDLOCK, p->iFil
2970: 65 49 64 2c 20 74 2c 20 72 63 2c 20 2a 70 52 65  eId, t, rc, *pRe
2980: 73 4f 75 74 2c 20 30 29 3b 0a 20 20 72 65 74 75  sOut, 0);.  retu
2990: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29a0: 46 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 6d 65 74  File control met
29b0: 68 6f 64 2e 20 46 6f 72 20 63 75 73 74 6f 6d 20  hod. For custom 
29c0: 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 61 6e  operations on an
29d0: 20 76 66 73 6c 6f 67 2d 66 69 6c 65 2e 0a 2a 2f   vfslog-file..*/
29e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c  .static int vfsl
29f0: 6f 67 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  ogFileControl(sq
2a00: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
2a10: 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  e, int op, void 
2a20: 2a 70 41 72 67 29 7b 0a 20 20 56 66 73 6c 6f 67  *pArg){.  Vfslog
2a30: 46 69 6c 65 20 2a 70 20 3d 20 28 56 66 73 6c 6f  File *p = (Vfslo
2a40: 67 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  gFile *)pFile;. 
2a50: 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c   return p->pReal
2a60: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c  ->pMethods->xFil
2a70: 65 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61  eControl(p->pRea
2a80: 6c 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 7d 0a  l, op, pArg);.}.
2a90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2aa0: 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e  e sector-size in
2ab0: 20 62 79 74 65 73 20 66 6f 72 20 61 6e 20 76 66   bytes for an vf
2ac0: 73 6c 6f 67 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  slog-file..*/.st
2ad0: 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 53  atic int vfslogS
2ae0: 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
2af0: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
2b00: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
2b10: 74 65 33 5f 75 69 6e 74 36 34 20 74 3b 0a 20 20  te3_uint64 t;.  
2b20: 56 66 73 6c 6f 67 46 69 6c 65 20 2a 70 20 3d 20  VfslogFile *p = 
2b30: 28 56 66 73 6c 6f 67 46 69 6c 65 20 2a 29 70 46  (VfslogFile *)pF
2b40: 69 6c 65 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f  ile;.  t = vfslo
2b50: 67 5f 74 69 6d 65 28 29 3b 0a 20 20 72 63 20 3d  g_time();.  rc =
2b60: 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68   p->pReal->pMeth
2b70: 6f 64 73 2d 3e 78 53 65 63 74 6f 72 53 69 7a 65  ods->xSectorSize
2b80: 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 20 20 74 20  (p->pReal);.  t 
2b90: 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29 20  = vfslog_time() 
2ba0: 2d 20 74 3b 0a 20 20 76 66 73 6c 6f 67 5f 63 61  - t;.  vfslog_ca
2bb0: 6c 6c 28 70 2d 3e 70 56 66 73 6c 6f 67 2c 20 4f  ll(p->pVfslog, O
2bc0: 53 5f 53 45 43 54 4f 52 53 49 5a 45 2c 20 70 2d  S_SECTORSIZE, p-
2bd0: 3e 69 46 69 6c 65 49 64 2c 20 74 2c 20 72 63 2c  >iFileId, t, rc,
2be0: 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e   0, 0);.  return
2bf0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
2c00: 74 75 72 6e 20 74 68 65 20 64 65 76 69 63 65 20  turn the device 
2c10: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20 66  characteristic f
2c20: 6c 61 67 73 20 73 75 70 70 6f 72 74 65 64 20 62  lags supported b
2c30: 79 20 61 6e 20 76 66 73 6c 6f 67 2d 66 69 6c 65  y an vfslog-file
2c40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c50: 76 66 73 6c 6f 67 44 65 76 69 63 65 43 68 61 72  vfslogDeviceChar
2c60: 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
2c70: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  te3_file *pFile)
2c80: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
2c90: 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 74 3b 0a  lite3_uint64 t;.
2ca0: 20 20 56 66 73 6c 6f 67 46 69 6c 65 20 2a 70 20    VfslogFile *p 
2cb0: 3d 20 28 56 66 73 6c 6f 67 46 69 6c 65 20 2a 29  = (VfslogFile *)
2cc0: 70 46 69 6c 65 3b 0a 20 20 74 20 3d 20 76 66 73  pFile;.  t = vfs
2cd0: 6c 6f 67 5f 74 69 6d 65 28 29 3b 0a 20 20 72 63  log_time();.  rc
2ce0: 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65   = p->pReal->pMe
2cf0: 74 68 6f 64 73 2d 3e 78 44 65 76 69 63 65 43 68  thods->xDeviceCh
2d00: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 2d  aracteristics(p-
2d10: 3e 70 52 65 61 6c 29 3b 0a 20 20 74 20 3d 20 76  >pReal);.  t = v
2d20: 66 73 6c 6f 67 5f 74 69 6d 65 28 29 20 2d 20 74  fslog_time() - t
2d30: 3b 0a 20 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28  ;.  vfslog_call(
2d40: 70 2d 3e 70 56 66 73 6c 6f 67 2c 20 4f 53 5f 44  p->pVfslog, OS_D
2d50: 45 56 43 48 41 52 2c 20 70 2d 3e 69 46 69 6c 65  EVCHAR, p->iFile
2d60: 49 64 2c 20 74 2c 20 72 63 2c 20 30 2c 20 30 29  Id, t, rc, 0, 0)
2d70: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2d80: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e 20  ../*.** Open an 
2d90: 76 66 73 6c 6f 67 20 66 69 6c 65 20 68 61 6e 64  vfslog file hand
2da0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
2db0: 74 20 76 66 73 6c 6f 67 4f 70 65 6e 28 0a 20 20  t vfslogOpen(.  
2dc0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2dd0: 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  s,.  const char 
2de0: 2a 7a 4e 61 6d 65 2c 0a 20 20 73 71 6c 69 74 65  *zName,.  sqlite
2df0: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 0a 20  3_file *pFile,. 
2e00: 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 69 6e   int flags,.  in
2e10: 74 20 2a 70 4f 75 74 46 6c 61 67 73 0a 29 7b 0a  t *pOutFlags.){.
2e20: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
2e30: 74 65 33 5f 75 69 6e 74 36 34 20 74 3b 0a 20 20  te3_uint64 t;.  
2e40: 56 66 73 6c 6f 67 46 69 6c 65 20 2a 70 20 3d 20  VfslogFile *p = 
2e50: 28 56 66 73 6c 6f 67 46 69 6c 65 20 2a 29 70 46  (VfslogFile *)pF
2e60: 69 6c 65 3b 0a 20 20 56 66 73 6c 6f 67 56 66 73  ile;.  VfslogVfs
2e70: 20 2a 70 4c 6f 67 20 3d 20 28 56 66 73 6c 6f 67   *pLog = (Vfslog
2e80: 56 66 73 20 2a 29 70 56 66 73 3b 0a 0a 20 20 70  Vfs *)pVfs;..  p
2e90: 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 3d  File->pMethods =
2ea0: 20 26 76 66 73 6c 6f 67 5f 69 6f 5f 6d 65 74 68   &vfslog_io_meth
2eb0: 6f 64 73 3b 0a 20 20 70 2d 3e 70 52 65 61 6c 20  ods;.  p->pReal 
2ec0: 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
2ed0: 2a 29 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e 70 56  *)&p[1];.  p->pV
2ee0: 66 73 6c 6f 67 20 3d 20 70 56 66 73 3b 0a 20 20  fslog = pVfs;.  
2ef0: 70 2d 3e 69 46 69 6c 65 49 64 20 3d 20 2b 2b 70  p->iFileId = ++p
2f00: 4c 6f 67 2d 3e 69 4e 65 78 74 46 69 6c 65 49 64  Log->iNextFileId
2f10: 3b 0a 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f  ;..  t = vfslog_
2f20: 74 69 6d 65 28 29 3b 0a 20 20 72 63 20 3d 20 52  time();.  rc = R
2f30: 45 41 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 4f  EALVFS(pVfs)->xO
2f40: 70 65 6e 28 52 45 41 4c 56 46 53 28 70 56 66 73  pen(REALVFS(pVfs
2f50: 29 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 70 52 65  ), zName, p->pRe
2f60: 61 6c 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46  al, flags, pOutF
2f70: 6c 61 67 73 29 3b 0a 20 20 74 20 3d 20 76 66 73  lags);.  t = vfs
2f80: 6c 6f 67 5f 74 69 6d 65 28 29 20 2d 20 74 3b 0a  log_time() - t;.
2f90: 0a 20 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70  .  vfslog_call(p
2fa0: 56 66 73 2c 20 4f 53 5f 4f 50 45 4e 2c 20 70 2d  Vfs, OS_OPEN, p-
2fb0: 3e 69 46 69 6c 65 49 64 2c 20 74 2c 20 72 63 2c  >iFileId, t, rc,
2fc0: 20 30 2c 20 30 29 3b 0a 20 20 76 66 73 6c 6f 67   0, 0);.  vfslog
2fd0: 5f 73 74 72 69 6e 67 28 70 56 66 73 2c 20 7a 4e  _string(pVfs, zN
2fe0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ame);.  return r
2ff0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
3000: 74 65 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 61  te the file loca
3010: 74 65 64 20 61 74 20 7a 50 61 74 68 2e 20 49 66  ted at zPath. If
3020: 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67   the dirSync arg
3030: 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 0a 2a  ument is true,.*
3040: 2a 20 65 6e 73 75 72 65 20 74 68 65 20 66 69 6c  * ensure the fil
3050: 65 2d 73 79 73 74 65 6d 20 6d 6f 64 69 66 69 63  e-system modific
3060: 61 74 69 6f 6e 73 20 61 72 65 20 73 79 6e 63 65  ations are synce
3070: 64 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65  d to disk before
3080: 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  .** returning..*
3090: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73  /.static int vfs
30a0: 6c 6f 67 44 65 6c 65 74 65 28 73 71 6c 69 74 65  logDelete(sqlite
30b0: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e  3_vfs *pVfs, con
30c0: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
30d0: 69 6e 74 20 64 69 72 53 79 6e 63 29 7b 0a 20 20  int dirSync){.  
30e0: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
30f0: 33 5f 75 69 6e 74 36 34 20 74 3b 0a 20 20 74 20  3_uint64 t;.  t 
3100: 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29 3b  = vfslog_time();
3110: 0a 20 20 72 63 20 3d 20 52 45 41 4c 56 46 53 28  .  rc = REALVFS(
3120: 70 56 66 73 29 2d 3e 78 44 65 6c 65 74 65 28 52  pVfs)->xDelete(R
3130: 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20 7a 50  EALVFS(pVfs), zP
3140: 61 74 68 2c 20 64 69 72 53 79 6e 63 29 3b 0a 20  ath, dirSync);. 
3150: 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65   t = vfslog_time
3160: 28 29 20 2d 20 74 3b 0a 20 20 76 66 73 6c 6f 67  () - t;.  vfslog
3170: 5f 63 61 6c 6c 28 70 56 66 73 2c 20 4f 53 5f 44  _call(pVfs, OS_D
3180: 45 4c 45 54 45 2c 20 30 2c 20 74 2c 20 72 63 2c  ELETE, 0, t, rc,
3190: 20 64 69 72 53 79 6e 63 2c 20 30 29 3b 0a 20 20   dirSync, 0);.  
31a0: 76 66 73 6c 6f 67 5f 73 74 72 69 6e 67 28 70 56  vfslog_string(pV
31b0: 66 73 2c 20 7a 50 61 74 68 29 3b 0a 20 20 72 65  fs, zPath);.  re
31c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
31d0: 2a 20 54 65 73 74 20 66 6f 72 20 61 63 63 65 73  * Test for acces
31e0: 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 20 52  s permissions. R
31f0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
3200: 65 20 72 65 71 75 65 73 74 65 64 20 70 65 72 6d  e requested perm
3210: 69 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 76 61  ission.** is ava
3220: 69 6c 61 62 6c 65 2c 20 6f 72 20 66 61 6c 73 65  ilable, or false
3230: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
3240: 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67  tatic int vfslog
3250: 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65  Access(.  sqlite
3260: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20  3_vfs *pVfs, .  
3270: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
3280: 68 2c 20 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c  h, .  int flags,
3290: 20 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74   .  int *pResOut
32a0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
32b0: 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 74  sqlite3_uint64 t
32c0: 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74  ;.  t = vfslog_t
32d0: 69 6d 65 28 29 3b 0a 20 20 72 63 20 3d 20 52 45  ime();.  rc = RE
32e0: 41 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 41 63  ALVFS(pVfs)->xAc
32f0: 63 65 73 73 28 52 45 41 4c 56 46 53 28 70 56 66  cess(REALVFS(pVf
3300: 73 29 2c 20 7a 50 61 74 68 2c 20 66 6c 61 67 73  s), zPath, flags
3310: 2c 20 70 52 65 73 4f 75 74 29 3b 0a 20 20 74 20  , pResOut);.  t 
3320: 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29 20  = vfslog_time() 
3330: 2d 20 74 3b 0a 20 20 76 66 73 6c 6f 67 5f 63 61  - t;.  vfslog_ca
3340: 6c 6c 28 70 56 66 73 2c 20 4f 53 5f 41 43 43 45  ll(pVfs, OS_ACCE
3350: 53 53 2c 20 30 2c 20 74 2c 20 72 63 2c 20 66 6c  SS, 0, t, rc, fl
3360: 61 67 73 2c 20 2a 70 52 65 73 4f 75 74 29 3b 0a  ags, *pResOut);.
3370: 20 20 76 66 73 6c 6f 67 5f 73 74 72 69 6e 67 28    vfslog_string(
3380: 70 56 66 73 2c 20 7a 50 61 74 68 29 3b 0a 20 20  pVfs, zPath);.  
3390: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
33a0: 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 62 75 66  .** Populate buf
33b0: 66 65 72 20 7a 4f 75 74 20 77 69 74 68 20 74 68  fer zOut with th
33c0: 65 20 66 75 6c 6c 20 63 61 6e 6f 6e 69 63 61 6c  e full canonical
33d0: 20 70 61 74 68 6e 61 6d 65 20 63 6f 72 72 65 73   pathname corres
33e0: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 74 68  ponding.** to th
33f0: 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 7a 50  e pathname in zP
3400: 61 74 68 2e 20 7a 4f 75 74 20 69 73 20 67 75 61  ath. zOut is gua
3410: 72 61 6e 74 65 65 64 20 74 6f 20 70 6f 69 6e 74  ranteed to point
3420: 20 74 6f 20 61 20 62 75 66 66 65 72 0a 2a 2a 20   to a buffer.** 
3430: 6f 66 20 61 74 20 6c 65 61 73 74 20 28 49 4e 53  of at least (INS
3440: 54 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  T_MAX_PATHNAME+1
3450: 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  ) bytes..*/.stat
3460: 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 46 75 6c  ic int vfslogFul
3470: 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c  lPathname(.  sql
3480: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
3490: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
34a0: 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 6e 4f 75  Path, .  int nOu
34b0: 74 2c 20 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74  t, .  char *zOut
34c0: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 45 41  .){.  return REA
34d0: 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 46 75 6c  LVFS(pVfs)->xFul
34e0: 6c 50 61 74 68 6e 61 6d 65 28 52 45 41 4c 56 46  lPathname(REALVF
34f0: 53 28 70 56 66 73 29 2c 20 7a 50 61 74 68 2c 20  S(pVfs), zPath, 
3500: 6e 4f 75 74 2c 20 7a 4f 75 74 29 3b 0a 7d 0a 0a  nOut, zOut);.}..
3510: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 64  /*.** Open the d
3520: 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20 6c  ynamic library l
3530: 6f 63 61 74 65 64 20 61 74 20 7a 50 61 74 68 20  ocated at zPath 
3540: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 68 61 6e  and return a han
3550: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dle..*/.static v
3560: 6f 69 64 20 2a 76 66 73 6c 6f 67 44 6c 4f 70 65  oid *vfslogDlOpe
3570: 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  n(sqlite3_vfs *p
3580: 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Vfs, const char 
3590: 2a 7a 50 61 74 68 29 7b 0a 20 20 72 65 74 75 72  *zPath){.  retur
35a0: 6e 20 52 45 41 4c 56 46 53 28 70 56 66 73 29 2d  n REALVFS(pVfs)-
35b0: 3e 78 44 6c 4f 70 65 6e 28 52 45 41 4c 56 46 53  >xDlOpen(REALVFS
35c0: 28 70 56 66 73 29 2c 20 7a 50 61 74 68 29 3b 0a  (pVfs), zPath);.
35d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74  }../*.** Populat
35e0: 65 20 74 68 65 20 62 75 66 66 65 72 20 7a 45 72  e the buffer zEr
35f0: 72 4d 73 67 20 28 73 69 7a 65 20 6e 42 79 74 65  rMsg (size nByte
3600: 20 62 79 74 65 73 29 20 77 69 74 68 20 61 20 68   bytes) with a h
3610: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 0a 2a 2a  uman readable.**
3620: 20 75 74 66 2d 38 20 73 74 72 69 6e 67 20 64 65   utf-8 string de
3630: 73 63 72 69 62 69 6e 67 20 74 68 65 20 6d 6f 73  scribing the mos
3640: 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 65  t recent error e
3650: 6e 63 6f 75 6e 74 65 72 65 64 20 61 73 73 6f 63  ncountered assoc
3660: 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 64  iated .** with d
3670: 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 69 65 73  ynamic libraries
3680: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3690: 20 76 66 73 6c 6f 67 44 6c 45 72 72 6f 72 28 73   vfslogDlError(s
36a0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
36b0: 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61  , int nByte, cha
36c0: 72 20 2a 7a 45 72 72 4d 73 67 29 7b 0a 20 20 52  r *zErrMsg){.  R
36d0: 45 41 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 44  EALVFS(pVfs)->xD
36e0: 6c 45 72 72 6f 72 28 52 45 41 4c 56 46 53 28 70  lError(REALVFS(p
36f0: 56 66 73 29 2c 20 6e 42 79 74 65 2c 20 7a 45 72  Vfs), nByte, zEr
3700: 72 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rMsg);.}../*.** 
3710: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
3720: 20 74 6f 20 74 68 65 20 73 79 6d 62 6f 6c 20 7a   to the symbol z
3730: 53 79 6d 62 6f 6c 20 69 6e 20 74 68 65 20 64 79  Symbol in the dy
3740: 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20 70 48  namic library pH
3750: 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
3760: 20 76 6f 69 64 20 28 2a 76 66 73 6c 6f 67 44 6c   void (*vfslogDl
3770: 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
3780: 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 2c 20  *pVfs, void *p, 
3790: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d  const char *zSym
37a0: 29 29 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  ))(void){.  retu
37b0: 72 6e 20 52 45 41 4c 56 46 53 28 70 56 66 73 29  rn REALVFS(pVfs)
37c0: 2d 3e 78 44 6c 53 79 6d 28 52 45 41 4c 56 46 53  ->xDlSym(REALVFS
37d0: 28 70 56 66 73 29 2c 20 70 2c 20 7a 53 79 6d 29  (pVfs), p, zSym)
37e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
37f0: 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62   the dynamic lib
3800: 72 61 72 79 20 68 61 6e 64 6c 65 20 70 48 61 6e  rary handle pHan
3810: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dle..*/.static v
3820: 6f 69 64 20 76 66 73 6c 6f 67 44 6c 43 6c 6f 73  oid vfslogDlClos
3830: 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
3840: 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  Vfs, void *pHand
3850: 6c 65 29 7b 0a 20 20 52 45 41 4c 56 46 53 28 70  le){.  REALVFS(p
3860: 56 66 73 29 2d 3e 78 44 6c 43 6c 6f 73 65 28 52  Vfs)->xDlClose(R
3870: 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20 70 48  EALVFS(pVfs), pH
3880: 61 6e 64 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  andle);.}../*.**
3890: 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75   Populate the bu
38a0: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
38b0: 62 79 20 7a 42 75 66 4f 75 74 20 77 69 74 68 20  by zBufOut with 
38c0: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 0a  nByte bytes of .
38d0: 2a 2a 20 72 61 6e 64 6f 6d 20 64 61 74 61 2e 0a  ** random data..
38e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  */.static int vf
38f0: 73 6c 6f 67 52 61 6e 64 6f 6d 6e 65 73 73 28 73  slogRandomness(s
3900: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
3910: 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61  , int nByte, cha
3920: 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 72  r *zBufOut){.  r
3930: 65 74 75 72 6e 20 52 45 41 4c 56 46 53 28 70 56  eturn REALVFS(pV
3940: 66 73 29 2d 3e 78 52 61 6e 64 6f 6d 6e 65 73 73  fs)->xRandomness
3950: 28 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20  (REALVFS(pVfs), 
3960: 6e 42 79 74 65 2c 20 7a 42 75 66 4f 75 74 29 3b  nByte, zBufOut);
3970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  .}../*.** Sleep 
3980: 66 6f 72 20 6e 4d 69 63 72 6f 20 6d 69 63 72 6f  for nMicro micro
3990: 73 65 63 6f 6e 64 73 2e 20 52 65 74 75 72 6e 20  seconds. Return 
39a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
39b0: 63 72 6f 73 65 63 6f 6e 64 73 20 0a 2a 2a 20 61  croseconds .** a
39c0: 63 74 75 61 6c 6c 79 20 73 6c 65 70 74 2e 0a 2a  ctually slept..*
39d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73  /.static int vfs
39e0: 6c 6f 67 53 6c 65 65 70 28 73 71 6c 69 74 65 33  logSleep(sqlite3
39f0: 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
3a00: 6e 4d 69 63 72 6f 29 7b 0a 20 20 72 65 74 75 72  nMicro){.  retur
3a10: 6e 20 52 45 41 4c 56 46 53 28 70 56 66 73 29 2d  n REALVFS(pVfs)-
3a20: 3e 78 53 6c 65 65 70 28 52 45 41 4c 56 46 53 28  >xSleep(REALVFS(
3a30: 70 56 66 73 29 2c 20 6e 4d 69 63 72 6f 29 3b 0a  pVfs), nMicro);.
3a40: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3a50: 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
3a60: 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
3a70: 20 6e 75 6d 62 65 72 20 69 6e 20 2a 70 54 69 6d   number in *pTim
3a80: 65 4f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eOut..*/.static 
3a90: 69 6e 74 20 76 66 73 6c 6f 67 43 75 72 72 65 6e  int vfslogCurren
3aa0: 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
3ab0: 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20  s *pVfs, double 
3ac0: 2a 70 54 69 6d 65 4f 75 74 29 7b 0a 20 20 72 65  *pTimeOut){.  re
3ad0: 74 75 72 6e 20 52 45 41 4c 56 46 53 28 70 56 66  turn REALVFS(pVf
3ae0: 73 29 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65  s)->xCurrentTime
3af0: 28 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20  (REALVFS(pVfs), 
3b00: 70 54 69 6d 65 4f 75 74 29 3b 0a 7d 0a 0a 73 74  pTimeOut);.}..st
3b10: 61 74 69 63 20 76 6f 69 64 20 76 66 73 6c 6f 67  atic void vfslog
3b20: 5f 66 6c 75 73 68 28 56 66 73 6c 6f 67 56 66 73  _flush(VfslogVfs
3b30: 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c   *p){.#ifdef SQL
3b40: 49 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72  ITE_TEST.  exter
3b50: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
3b60: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
3b70: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
3b80: 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
3b90: 72 73 69 73 74 3b 0a 20 20 65 78 74 65 72 6e 20  rsist;.  extern 
3ba0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 69 73 6b  int sqlite3_disk
3bb0: 66 75 6c 6c 5f 70 65 6e 64 69 6e 67 3b 0a 0a 20  full_pending;.. 
3bc0: 20 69 6e 74 20 70 65 6e 64 69 6e 67 20 3d 20 73   int pending = s
3bd0: 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
3be0: 70 65 6e 64 69 6e 67 3b 0a 20 20 69 6e 74 20 70  pending;.  int p
3bf0: 65 72 73 69 73 74 20 3d 20 73 71 6c 69 74 65 33  ersist = sqlite3
3c00: 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 72 73 69 73  _io_error_persis
3c10: 74 3b 0a 20 20 69 6e 74 20 64 69 73 6b 66 75 6c  t;.  int diskful
3c20: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 64 69 73 6b  l = sqlite3_disk
3c30: 66 75 6c 6c 5f 70 65 6e 64 69 6e 67 3b 0a 0a 20  full_pending;.. 
3c40: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
3c50: 72 5f 70 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20  r_pending = 0;. 
3c60: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
3c70: 72 5f 70 65 72 73 69 73 74 20 3d 20 30 3b 0a 20  r_persist = 0;. 
3c80: 20 73 71 6c 69 74 65 33 5f 64 69 73 6b 66 75 6c   sqlite3_diskful
3c90: 6c 5f 70 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 23  l_pending = 0;.#
3ca0: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 2d 3e  endif..  if( p->
3cb0: 6e 42 75 66 20 29 7b 0a 20 20 20 20 70 2d 3e 70  nBuf ){.    p->p
3cc0: 4c 6f 67 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  Log->pMethods->x
3cd0: 57 72 69 74 65 28 70 2d 3e 70 4c 6f 67 2c 20 70  Write(p->pLog, p
3ce0: 2d 3e 61 42 75 66 2c 20 70 2d 3e 6e 42 75 66 2c  ->aBuf, p->nBuf,
3cf0: 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20   p->iOffset);.  
3d00: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 2b 3d 20    p->iOffset += 
3d10: 70 2d 3e 6e 42 75 66 3b 0a 20 20 20 20 70 2d 3e  p->nBuf;.    p->
3d20: 6e 42 75 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 23  nBuf = 0;.  }..#
3d30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
3d40: 54 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  T.  sqlite3_io_e
3d50: 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 70  rror_pending = p
3d60: 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
3d70: 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 72 73 69  3_io_error_persi
3d80: 73 74 20 3d 20 70 65 72 73 69 73 74 3b 0a 20 20  st = persist;.  
3d90: 73 71 6c 69 74 65 33 5f 64 69 73 6b 66 75 6c 6c  sqlite3_diskfull
3da0: 5f 70 65 6e 64 69 6e 67 20 3d 20 64 69 73 6b 66  _pending = diskf
3db0: 75 6c 6c 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 73  ull;.#endif.}..s
3dc0: 74 61 74 69 63 20 76 6f 69 64 20 70 75 74 33 32  tatic void put32
3dd0: 62 69 74 73 28 75 6e 73 69 67 6e 65 64 20 63 68  bits(unsigned ch
3de0: 61 72 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64 20  ar *p, unsigned 
3df0: 69 6e 74 20 76 29 7b 0a 20 20 70 5b 30 5d 20 3d  int v){.  p[0] =
3e00: 20 76 3e 3e 32 34 3b 0a 20 20 70 5b 31 5d 20 3d   v>>24;.  p[1] =
3e10: 20 76 3e 3e 31 36 3b 0a 20 20 70 5b 32 5d 20 3d   v>>16;.  p[2] =
3e20: 20 76 3e 3e 38 3b 0a 20 20 70 5b 33 5d 20 3d 20   v>>8;.  p[3] = 
3e30: 76 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  v;.}..static voi
3e40: 64 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 0a 20  d vfslog_call(. 
3e50: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
3e60: 66 73 2c 0a 20 20 69 6e 74 20 65 45 76 65 6e 74  fs,.  int eEvent
3e70: 2c 0a 20 20 69 6e 74 20 69 46 69 6c 65 69 64 2c  ,.  int iFileid,
3e80: 0a 20 20 69 6e 74 20 6e 43 6c 69 63 6b 2c 0a 20  .  int nClick,. 
3e90: 20 69 6e 74 20 72 65 74 75 72 6e 5f 63 6f 64 65   int return_code
3ea0: 2c 0a 20 20 69 6e 74 20 73 69 7a 65 2c 0a 20 20  ,.  int size,.  
3eb0: 69 6e 74 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20  int offset.){.  
3ec0: 56 66 73 6c 6f 67 56 66 73 20 2a 70 20 3d 20 28  VfslogVfs *p = (
3ed0: 56 66 73 6c 6f 67 56 66 73 20 2a 29 70 56 66 73  VfslogVfs *)pVfs
3ee0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
3ef0: 72 20 2a 7a 52 65 63 3b 0a 20 20 69 66 28 20 28  r *zRec;.  if( (
3f00: 32 34 2b 70 2d 3e 6e 42 75 66 29 3e 73 69 7a 65  24+p->nBuf)>size
3f10: 6f 66 28 70 2d 3e 61 42 75 66 29 20 29 7b 0a 20  of(p->aBuf) ){. 
3f20: 20 20 20 76 66 73 6c 6f 67 5f 66 6c 75 73 68 28     vfslog_flush(
3f30: 70 29 3b 0a 20 20 7d 0a 20 20 7a 52 65 63 20 3d  p);.  }.  zRec =
3f40: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
3f50: 2a 29 26 70 2d 3e 61 42 75 66 5b 70 2d 3e 6e 42  *)&p->aBuf[p->nB
3f60: 75 66 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73  uf];.  put32bits
3f70: 28 26 7a 52 65 63 5b 30 5d 2c 20 65 45 76 65 6e  (&zRec[0], eEven
3f80: 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  t);.  put32bits(
3f90: 26 7a 52 65 63 5b 34 5d 2c 20 69 46 69 6c 65 69  &zRec[4], iFilei
3fa0: 64 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  d);.  put32bits(
3fb0: 26 7a 52 65 63 5b 38 5d 2c 20 6e 43 6c 69 63 6b  &zRec[8], nClick
3fc0: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
3fd0: 7a 52 65 63 5b 31 32 5d 2c 20 72 65 74 75 72 6e  zRec[12], return
3fe0: 5f 63 6f 64 65 29 3b 0a 20 20 70 75 74 33 32 62  _code);.  put32b
3ff0: 69 74 73 28 26 7a 52 65 63 5b 31 36 5d 2c 20 73  its(&zRec[16], s
4000: 69 7a 65 29 3b 0a 20 20 70 75 74 33 32 62 69 74  ize);.  put32bit
4010: 73 28 26 7a 52 65 63 5b 32 30 5d 2c 20 6f 66 66  s(&zRec[20], off
4020: 73 65 74 29 3b 0a 20 20 70 2d 3e 6e 42 75 66 20  set);.  p->nBuf 
4030: 2b 3d 20 32 34 3b 0a 7d 0a 0a 73 74 61 74 69 63  += 24;.}..static
4040: 20 76 6f 69 64 20 76 66 73 6c 6f 67 5f 73 74 72   void vfslog_str
4050: 69 6e 67 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ing(sqlite3_vfs 
4060: 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61  *pVfs, const cha
4070: 72 20 2a 7a 53 74 72 29 7b 0a 20 20 56 66 73 6c  r *zStr){.  Vfsl
4080: 6f 67 56 66 73 20 2a 70 20 3d 20 28 56 66 73 6c  ogVfs *p = (Vfsl
4090: 6f 67 56 66 73 20 2a 29 70 56 66 73 3b 0a 20 20  ogVfs *)pVfs;.  
40a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
40b0: 52 65 63 3b 0a 20 20 69 6e 74 20 6e 53 74 72 20  Rec;.  int nStr 
40c0: 3d 20 7a 53 74 72 20 3f 20 73 74 72 6c 65 6e 28  = zStr ? strlen(
40d0: 7a 53 74 72 29 20 3a 20 30 3b 0a 20 20 69 66 28  zStr) : 0;.  if(
40e0: 20 28 34 2b 6e 53 74 72 2b 70 2d 3e 6e 42 75 66   (4+nStr+p->nBuf
40f0: 29 3e 73 69 7a 65 6f 66 28 70 2d 3e 61 42 75 66  )>sizeof(p->aBuf
4100: 29 20 29 7b 0a 20 20 20 20 76 66 73 6c 6f 67 5f  ) ){.    vfslog_
4110: 66 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a 20 20  flush(p);.  }.  
4120: 7a 52 65 63 20 3d 20 28 75 6e 73 69 67 6e 65 64  zRec = (unsigned
4130: 20 63 68 61 72 20 2a 29 26 70 2d 3e 61 42 75 66   char *)&p->aBuf
4140: 5b 70 2d 3e 6e 42 75 66 5d 3b 0a 20 20 70 75 74  [p->nBuf];.  put
4150: 33 32 62 69 74 73 28 26 7a 52 65 63 5b 30 5d 2c  32bits(&zRec[0],
4160: 20 6e 53 74 72 29 3b 0a 20 20 69 66 28 20 7a 53   nStr);.  if( zS
4170: 74 72 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  tr ){.    memcpy
4180: 28 26 7a 52 65 63 5b 34 5d 2c 20 7a 53 74 72 2c  (&zRec[4], zStr,
4190: 20 6e 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70 2d   nStr);.  }.  p-
41a0: 3e 6e 42 75 66 20 2b 3d 20 28 34 20 2b 20 6e 53  >nBuf += (4 + nS
41b0: 74 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  tr);.}..static v
41c0: 6f 69 64 20 76 66 73 6c 6f 67 5f 66 69 6e 61 6c  oid vfslog_final
41d0: 69 7a 65 28 56 66 73 6c 6f 67 56 66 73 20 2a 70  ize(VfslogVfs *p
41e0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67  ){.  if( p->pLog
41f0: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
4200: 20 20 76 66 73 6c 6f 67 5f 66 6c 75 73 68 28 70    vfslog_flush(p
4210: 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 6f 67 2d 3e  );.    p->pLog->
4220: 70 4d 65 74 68 6f 64 73 2d 3e 78 43 6c 6f 73 65  pMethods->xClose
4230: 28 70 2d 3e 70 4c 6f 67 29 3b 0a 20 20 7d 0a 20  (p->pLog);.  }. 
4240: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
4250: 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
4260: 5f 76 66 73 6c 6f 67 5f 66 69 6e 61 6c 69 7a 65  _vfslog_finalize
4270: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66  (const char *zVf
4280: 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
4290: 73 20 2a 70 56 66 73 3b 0a 20 20 70 56 66 73 20  s *pVfs;.  pVfs 
42a0: 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
42b0: 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20  nd(zVfs);.  if( 
42c0: 21 70 56 66 73 20 7c 7c 20 70 56 66 73 2d 3e 78  !pVfs || pVfs->x
42d0: 4f 70 65 6e 21 3d 76 66 73 6c 6f 67 4f 70 65 6e  Open!=vfslogOpen
42e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
42f0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
4300: 20 0a 20 20 76 66 73 6c 6f 67 5f 66 69 6e 61 6c   .  vfslog_final
4310: 69 7a 65 28 28 56 66 73 6c 6f 67 56 66 73 20 2a  ize((VfslogVfs *
4320: 29 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  )pVfs);.  return
4330: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69   SQLITE_OK;.}..i
4340: 6e 74 20 73 71 6c 69 74 65 33 5f 76 66 73 6c 6f  nt sqlite3_vfslo
4350: 67 5f 6e 65 77 28 0a 20 20 63 6f 6e 73 74 20 63  g_new(.  const c
4360: 68 61 72 20 2a 7a 56 66 73 2c 20 20 20 20 20 20  har *zVfs,      
4370: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
4380: 56 46 53 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f  VFS name */.  co
4390: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e  nst char *zParen
43a0: 74 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  tVfs,         /*
43b0: 20 50 61 72 65 6e 74 20 56 46 53 20 6e 61 6d 65   Parent VFS name
43c0: 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20   (or NULL) */.  
43d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 67  const char *zLog
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 2f 2a 20 4c 6f 67 20 66 69 6c 65 20 6e 61 6d 65  /* Log file name
4400: 20 2a 2f 0a 29 7b 0a 20 20 56 66 73 6c 6f 67 56   */.){.  VfslogV
4410: 66 73 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  fs *p;.  sqlite3
4420: 5f 76 66 73 20 2a 70 50 61 72 65 6e 74 3b 0a 20  _vfs *pParent;. 
4430: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
4440: 74 20 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 72  t flags;.  int r
4450: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  c;.  char *zFile
4460: 3b 0a 20 20 69 6e 74 20 6e 56 66 73 3b 0a 0a 20  ;.  int nVfs;.. 
4470: 20 70 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74   pParent = sqlit
4480: 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 50 61 72  e3_vfs_find(zPar
4490: 65 6e 74 56 66 73 29 3b 0a 20 20 69 66 28 20 21  entVfs);.  if( !
44a0: 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 72  pParent ){.    r
44b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
44c0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 6e 56 66 73 20  OR;.  }..  nVfs 
44d0: 3d 20 73 74 72 6c 65 6e 28 7a 56 66 73 29 3b 0a  = strlen(zVfs);.
44e0: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
44f0: 28 56 66 73 6c 6f 67 56 66 73 29 20 2b 20 70 50  (VfslogVfs) + pP
4500: 61 72 65 6e 74 2d 3e 73 7a 4f 73 46 69 6c 65 20  arent->szOsFile 
4510: 2b 20 6e 56 66 73 2b 31 2b 70 50 61 72 65 6e 74  + nVfs+1+pParent
4520: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
4530: 20 20 70 20 3d 20 28 56 66 73 6c 6f 67 56 66 73    p = (VfslogVfs
4540: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
4550: 63 28 6e 42 79 74 65 29 3b 0a 20 20 6d 65 6d 73  c(nByte);.  mems
4560: 65 74 28 70 2c 20 30 2c 20 6e 42 79 74 65 29 3b  et(p, 0, nByte);
4570: 0a 0a 20 20 70 2d 3e 70 56 66 73 20 3d 20 70 50  ..  p->pVfs = pP
4580: 61 72 65 6e 74 3b 0a 20 20 70 2d 3e 70 4c 6f 67  arent;.  p->pLog
4590: 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
45a0: 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 6d 65 6d 63   *)&p[1];.  memc
45b0: 70 79 28 26 70 2d 3e 62 61 73 65 2c 20 26 76 66  py(&p->base, &vf
45c0: 73 6c 6f 67 5f 76 66 73 2c 20 73 69 7a 65 6f 66  slog_vfs, sizeof
45d0: 28 73 71 6c 69 74 65 33 5f 76 66 73 29 29 3b 0a  (sqlite3_vfs));.
45e0: 20 20 70 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65 20    p->base.zName 
45f0: 3d 20 26 28 28 63 68 61 72 20 2a 29 70 2d 3e 70  = &((char *)p->p
4600: 4c 6f 67 29 5b 70 50 61 72 65 6e 74 2d 3e 73 7a  Log)[pParent->sz
4610: 4f 73 46 69 6c 65 5d 3b 0a 20 20 70 2d 3e 62 61  OsFile];.  p->ba
4620: 73 65 2e 73 7a 4f 73 46 69 6c 65 20 2b 3d 20 70  se.szOsFile += p
4630: 50 61 72 65 6e 74 2d 3e 73 7a 4f 73 46 69 6c 65  Parent->szOsFile
4640: 3b 0a 20 20 6d 65 6d 63 70 79 28 28 63 68 61 72  ;.  memcpy((char
4650: 20 2a 29 70 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65   *)p->base.zName
4660: 2c 20 7a 56 66 73 2c 20 6e 56 66 73 29 3b 0a 0a  , zVfs, nVfs);..
4670: 20 20 7a 46 69 6c 65 20 3d 20 28 63 68 61 72 20    zFile = (char 
4680: 2a 29 26 70 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65  *)&p->base.zName
4690: 5b 6e 56 66 73 2b 31 5d 3b 0a 20 20 70 50 61 72  [nVfs+1];.  pPar
46a0: 65 6e 74 2d 3e 78 46 75 6c 6c 50 61 74 68 6e 61  ent->xFullPathna
46b0: 6d 65 28 70 50 61 72 65 6e 74 2c 20 7a 4c 6f 67  me(pParent, zLog
46c0: 2c 20 70 50 61 72 65 6e 74 2d 3e 6d 78 50 61 74  , pParent->mxPat
46d0: 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 29 3b 0a 0a  hname, zFile);..
46e0: 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45    flags = SQLITE
46f0: 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
4700: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
4710: 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  TE|SQLITE_OPEN_M
4720: 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  ASTER_JOURNAL;. 
4730: 20 70 50 61 72 65 6e 74 2d 3e 78 44 65 6c 65 74   pParent->xDelet
4740: 65 28 70 50 61 72 65 6e 74 2c 20 7a 46 69 6c 65  e(pParent, zFile
4750: 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 70 50 61  , 0);.  rc = pPa
4760: 72 65 6e 74 2d 3e 78 4f 70 65 6e 28 70 50 61 72  rent->xOpen(pPar
4770: 65 6e 74 2c 20 7a 46 69 6c 65 2c 20 70 2d 3e 70  ent, zFile, p->p
4780: 4c 6f 67 2c 20 66 6c 61 67 73 2c 20 26 66 6c 61  Log, flags, &fla
4790: 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  gs);.  if( rc==S
47a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
47b0: 6d 65 6d 63 70 79 28 70 2d 3e 61 42 75 66 2c 20  memcpy(p->aBuf, 
47c0: 22 73 71 6c 69 74 65 5f 6f 73 74 72 61 63 65 31  "sqlite_ostrace1
47d0: 2e 2e 2e 2e 2e 22 2c 20 32 30 29 3b 0a 20 20 20  .....", 20);.   
47e0: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
47f0: 0a 20 20 20 20 70 2d 3e 6e 42 75 66 20 3d 20 32  .    p->nBuf = 2
4800: 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
4810: 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
4820: 28 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 29  ((sqlite3_vfs *)
4830: 70 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28  p, 1);.  }.  if(
4840: 20 72 63 20 29 7b 0a 20 20 20 20 76 66 73 6c 6f   rc ){.    vfslo
4850: 67 5f 66 69 6e 61 6c 69 7a 65 28 70 29 3b 0a 20  g_finalize(p);. 
4860: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4870: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  }..static const 
4880: 63 68 61 72 20 2a 76 66 73 6c 6f 67 5f 65 76 65  char *vfslog_eve
4890: 6e 74 6e 61 6d 65 28 69 6e 74 20 65 45 76 65 6e  ntname(int eEven
48a0: 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
48b0: 20 2a 7a 45 76 65 6e 74 20 3d 20 30 3b 0a 0a 20   *zEvent = 0;.. 
48c0: 20 73 77 69 74 63 68 28 20 65 45 76 65 6e 74 20   switch( eEvent 
48d0: 29 7b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 43  ){.    case OS_C
48e0: 4c 4f 53 45 3a 20 20 20 20 20 20 20 20 20 20 20  LOSE:           
48f0: 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 43 6c 6f    zEvent = "xClo
4900: 73 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  se"; break;.    
4910: 63 61 73 65 20 4f 53 5f 52 45 41 44 3a 20 20 20  case OS_READ:   
4920: 20 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e             zEven
4930: 74 20 3d 20 22 78 52 65 61 64 22 3b 20 62 72 65  t = "xRead"; bre
4940: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f  ak;.    case OS_
4950: 57 52 49 54 45 3a 20 20 20 20 20 20 20 20 20 20  WRITE:          
4960: 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 57 72     zEvent = "xWr
4970: 69 74 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ite"; break;.   
4980: 20 63 61 73 65 20 4f 53 5f 54 52 55 4e 43 41 54   case OS_TRUNCAT
4990: 45 3a 20 20 20 20 20 20 20 20 20 20 7a 45 76 65  E:          zEve
49a0: 6e 74 20 3d 20 22 78 54 72 75 6e 63 61 74 65 22  nt = "xTruncate"
49b0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
49c0: 65 20 4f 53 5f 53 59 4e 43 3a 20 20 20 20 20 20  e OS_SYNC:      
49d0: 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d          zEvent =
49e0: 20 22 78 53 79 6e 63 22 3b 20 62 72 65 61 6b 3b   "xSync"; break;
49f0: 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 46 49 4c  .    case OS_FIL
4a00: 45 53 49 5a 45 3a 20 20 20 20 20 20 20 20 20 20  ESIZE:          
4a10: 7a 45 76 65 6e 74 20 3d 20 22 78 46 69 6c 65 73  zEvent = "xFiles
4a20: 69 7a 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ize"; break;.   
4a30: 20 63 61 73 65 20 4f 53 5f 4c 4f 43 4b 3a 20 20   case OS_LOCK:  
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 7a 45 76 65              zEve
4a50: 6e 74 20 3d 20 22 78 4c 6f 63 6b 22 3b 20 62 72  nt = "xLock"; br
4a60: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53  eak;.    case OS
4a70: 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20  _UNLOCK:        
4a80: 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 55      zEvent = "xU
4a90: 6e 6c 6f 63 6b 22 3b 20 62 72 65 61 6b 3b 0a 20  nlock"; break;. 
4aa0: 20 20 20 63 61 73 65 20 4f 53 5f 43 48 45 43 4b     case OS_CHECK
4ab0: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a 20 7a 45  RESERVEDLOCK: zE
4ac0: 76 65 6e 74 20 3d 20 22 78 43 68 65 63 6b 52 65  vent = "xCheckRe
4ad0: 73 4c 6f 63 6b 22 3b 20 62 72 65 61 6b 3b 0a 20  sLock"; break;. 
4ae0: 20 20 20 63 61 73 65 20 4f 53 5f 46 49 4c 45 43     case OS_FILEC
4af0: 4f 4e 54 52 4f 4c 3a 20 20 20 20 20 20 20 7a 45  ONTROL:       zE
4b00: 76 65 6e 74 20 3d 20 22 78 46 69 6c 65 43 6f 6e  vent = "xFileCon
4b10: 74 72 6f 6c 22 3b 20 62 72 65 61 6b 3b 0a 20 20  trol"; break;.  
4b20: 20 20 63 61 73 65 20 4f 53 5f 53 45 43 54 4f 52    case OS_SECTOR
4b30: 53 49 5a 45 3a 20 20 20 20 20 20 20 20 7a 45 76  SIZE:        zEv
4b40: 65 6e 74 20 3d 20 22 78 53 65 63 74 6f 72 53 69  ent = "xSectorSi
4b50: 7a 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ze"; break;.    
4b60: 63 61 73 65 20 4f 53 5f 44 45 56 43 48 41 52 3a  case OS_DEVCHAR:
4b70: 20 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e             zEven
4b80: 74 20 3d 20 22 78 44 65 76 69 63 65 43 68 61 72  t = "xDeviceChar
4b90: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
4ba0: 73 65 20 4f 53 5f 4f 50 45 4e 3a 20 20 20 20 20  se OS_OPEN:     
4bb0: 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20           zEvent 
4bc0: 3d 20 22 78 4f 70 65 6e 22 3b 20 62 72 65 61 6b  = "xOpen"; break
4bd0: 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 44 45  ;.    case OS_DE
4be0: 4c 45 54 45 3a 20 20 20 20 20 20 20 20 20 20 20  LETE:           
4bf0: 20 7a 45 76 65 6e 74 20 3d 20 22 78 44 65 6c 65   zEvent = "xDele
4c00: 74 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  te"; break;.    
4c10: 63 61 73 65 20 4f 53 5f 41 43 43 45 53 53 3a 20  case OS_ACCESS: 
4c20: 20 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e             zEven
4c30: 74 20 3d 20 22 78 41 63 63 65 73 73 22 3b 20 62  t = "xAccess"; b
4c40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f  reak;.    case O
4c50: 53 5f 46 55 4c 4c 50 41 54 48 4e 41 4d 45 3a 20  S_FULLPATHNAME: 
4c60: 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78       zEvent = "x
4c70: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 22 3b 20 62  FullPathname"; b
4c80: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f  reak;.    case O
4c90: 53 5f 52 41 4e 44 4f 4d 4e 45 53 53 3a 20 20 20  S_RANDOMNESS:   
4ca0: 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78       zEvent = "x
4cb0: 52 61 6e 64 6f 6d 6e 65 73 73 22 3b 20 62 72 65  Randomness"; bre
4cc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f  ak;.    case OS_
4cd0: 53 4c 45 45 50 3a 20 20 20 20 20 20 20 20 20 20  SLEEP:          
4ce0: 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 53 6c     zEvent = "xSl
4cf0: 65 65 70 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  eep"; break;.   
4d00: 20 63 61 73 65 20 4f 53 5f 43 55 52 52 45 4e 54   case OS_CURRENT
4d10: 54 49 4d 45 3a 20 20 20 20 20 20 20 7a 45 76 65  TIME:       zEve
4d20: 6e 74 20 3d 20 22 78 43 75 72 72 65 6e 74 54 69  nt = "xCurrentTi
4d30: 6d 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  me"; break;.  }.
4d40: 0a 20 20 72 65 74 75 72 6e 20 7a 45 76 65 6e 74  .  return zEvent
4d50: 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  ;.}..typedef str
4d60: 75 63 74 20 56 66 73 6c 6f 67 56 74 61 62 20 56  uct VfslogVtab V
4d70: 66 73 6c 6f 67 56 74 61 62 3b 0a 74 79 70 65 64  fslogVtab;.typed
4d80: 65 66 20 73 74 72 75 63 74 20 56 66 73 6c 6f 67  ef struct Vfslog
4d90: 43 73 72 20 56 66 73 6c 6f 67 43 73 72 3b 0a 0a  Csr VfslogCsr;..
4da0: 2f 2a 0a 2a 2a 20 56 69 72 74 75 61 6c 20 74 61  /*.** Virtual ta
4db0: 62 6c 65 20 74 79 70 65 20 66 6f 72 20 74 68 65  ble type for the
4dc0: 20 76 66 73 6c 6f 67 20 72 65 61 64 65 72 20 6d   vfslog reader m
4dd0: 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  odule..*/.struct
4de0: 20 56 66 73 6c 6f 67 56 74 61 62 20 7b 0a 20 20   VfslogVtab {.  
4df0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 62 61 73  sqlite3_vtab bas
4e00: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4e10: 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 2a 2f  /* Base class */
4e20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
4e30: 2a 70 46 64 3b 20 20 20 20 20 20 20 20 20 20 20  *pFd;           
4e40: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
4e50: 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 76 66  iptor open on vf
4e60: 73 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20 73  slog file */.  s
4e70: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79  qlite3_int64 nBy
4e80: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  te;            /
4e90: 2a 20 53 69 7a 65 20 6f 66 20 66 69 6c 65 20 69  * Size of file i
4ea0: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61  n bytes */.  cha
4eb0: 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20  r *zFile;       
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4ed0: 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 70 46  File name for pF
4ee0: 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 56  d */.};../*.** V
4ef0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72  irtual table cur
4f00: 73 6f 72 20 74 79 70 65 20 66 6f 72 20 74 68 65  sor type for the
4f10: 20 76 66 73 6c 6f 67 20 72 65 61 64 65 72 20 6d   vfslog reader m
4f20: 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  odule..*/.struct
4f30: 20 56 66 73 6c 6f 67 43 73 72 20 7b 0a 20 20 73   VfslogCsr {.  s
4f40: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
4f50: 6f 72 20 62 61 73 65 3b 20 20 20 20 20 20 20 2f  or base;       /
4f60: 2a 20 42 61 73 65 20 63 6c 61 73 73 20 2a 2f 0a  * Base class */.
4f70: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
4f80: 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  iRowid;         
4f90: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77    /* Current row
4fa0: 69 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  id. */.  sqlite3
4fb0: 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74 3b 20  _int64 iOffset; 
4fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
4fd0: 65 74 20 6f 66 20 6e 65 78 74 20 72 65 63 6f 72  et of next recor
4fe0: 64 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 63  d in file */.  c
4ff0: 68 61 72 20 2a 7a 54 72 61 6e 73 69 65 6e 74 3b  har *zTransient;
5000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5010: 2a 20 54 72 61 6e 73 69 65 6e 74 20 27 66 69 6c  * Transient 'fil
5020: 65 27 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69  e' string */.  i
5030: 6e 74 20 6e 46 69 6c 65 3b 20 20 20 20 20 20 20  nt nFile;       
5040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5050: 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20  * Size of array 
5060: 61 7a 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20 63 68  azFile[] */.  ch
5070: 61 72 20 2a 2a 61 7a 46 69 6c 65 3b 20 20 20 20  ar **azFile;    
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5090: 20 46 69 6c 65 20 73 74 72 69 6e 67 73 20 2a 2f   File strings */
50a0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
50b0: 20 61 42 75 66 5b 31 30 32 34 5d 3b 20 20 20 20   aBuf[1024];    
50c0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 66     /* Current vf
50d0: 73 20 6c 6f 67 20 65 6e 74 72 79 20 28 72 65 61  s log entry (rea
50e0: 64 20 66 72 6f 6d 20 66 69 6c 65 29 20 2a 2f 0a  d from file) */.
50f0: 7d 3b 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67  };..static unsig
5100: 6e 65 64 20 69 6e 74 20 67 65 74 33 32 62 69 74  ned int get32bit
5110: 73 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  s(unsigned char 
5120: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  *p){.  return (p
5130: 5b 30 5d 3c 3c 32 34 29 20 2b 20 28 70 5b 31 5d  [0]<<24) + (p[1]
5140: 3c 3c 31 36 29 20 2b 20 28 70 5b 32 5d 3c 3c 38  <<16) + (p[2]<<8
5150: 29 20 2b 20 70 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a  ) + p[3];.}../*.
5160: 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
5170: 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
5180: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
5190: 67 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  g a nul-terminat
51a0: 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 49 66  ed string..** If
51b0: 20 74 68 65 20 73 74 72 69 6e 67 20 62 65 67 69   the string begi
51c0: 6e 73 20 77 69 74 68 20 61 6e 20 53 51 4c 20 71  ns with an SQL q
51d0: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 69  uote character i
51e0: 74 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  t is overwritten
51f0: 20 62 79 0a 2a 2a 20 74 68 65 20 64 65 71 75 6f   by.** the dequo
5200: 74 65 64 20 76 65 72 73 69 6f 6e 2e 20 4f 74 68  ted version. Oth
5210: 65 72 77 69 73 65 20 74 68 65 20 62 75 66 66 65  erwise the buffe
5220: 72 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69  r is left unmodi
5230: 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fied..*/.static 
5240: 76 6f 69 64 20 64 65 71 75 6f 74 65 28 63 68 61  void dequote(cha
5250: 72 20 2a 7a 29 7b 0a 20 20 63 68 61 72 20 71 75  r *z){.  char qu
5260: 6f 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ote;            
5270: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 6f 74           /* Quot
5280: 65 20 63 68 61 72 61 63 74 65 72 20 28 69 66 20  e character (if 
5290: 61 6e 79 20 29 20 2a 2f 0a 20 20 71 75 6f 74 65  any ) */.  quote
52a0: 20 3d 20 7a 5b 30 5d 3b 0a 20 20 69 66 28 20 71   = z[0];.  if( q
52b0: 75 6f 74 65 3d 3d 27 5b 27 20 7c 7c 20 71 75 6f  uote=='[' || quo
52c0: 74 65 3d 3d 27 5c 27 27 20 7c 7c 20 71 75 6f 74  te=='\'' || quot
52d0: 65 3d 3d 27 22 27 20 7c 7c 20 71 75 6f 74 65 3d  e=='"' || quote=
52e0: 3d 27 60 27 20 29 7b 0a 20 20 20 20 69 6e 74 20  ='`' ){.    int 
52f0: 69 49 6e 20 3d 20 31 3b 20 20 20 20 20 20 20 20  iIn = 1;        
5300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
5310: 65 78 20 6f 66 20 6e 65 78 74 20 62 79 74 65 20  ex of next byte 
5320: 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 69 6e 70  to read from inp
5330: 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f  ut */.    int iO
5340: 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ut = 0;         
5350: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
5360: 20 6f 66 20 6e 65 78 74 20 62 79 74 65 20 74 6f   of next byte to
5370: 20 77 72 69 74 65 20 74 6f 20 6f 75 74 70 75 74   write to output
5380: 20 2a 2f 0a 20 20 20 20 69 66 28 20 71 75 6f 74   */.    if( quot
5390: 65 3d 3d 27 5b 27 20 29 20 71 75 6f 74 65 20 3d  e=='[' ) quote =
53a0: 20 27 5d 27 3b 20 20 0a 20 20 20 20 77 68 69 6c   ']';  .    whil
53b0: 65 28 20 7a 5b 69 49 6e 5d 20 29 7b 0a 20 20 20  e( z[iIn] ){.   
53c0: 20 20 20 69 66 28 20 7a 5b 69 49 6e 5d 3d 3d 71     if( z[iIn]==q
53d0: 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  uote ){.        
53e0: 69 66 28 20 7a 5b 69 49 6e 2b 31 5d 21 3d 71 75  if( z[iIn+1]!=qu
53f0: 6f 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ote ) break;.   
5400: 20 20 20 20 20 7a 5b 69 4f 75 74 2b 2b 5d 20 3d       z[iOut++] =
5410: 20 71 75 6f 74 65 3b 0a 20 20 20 20 20 20 20 20   quote;.        
5420: 69 49 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  iIn += 2;.      
5430: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
5440: 5b 69 4f 75 74 2b 2b 5d 20 3d 20 7a 5b 69 49 6e  [iOut++] = z[iIn
5450: 2b 2b 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ++];.      }.   
5460: 20 7d 0a 20 20 20 20 7a 5b 69 4f 75 74 5d 20 3d   }.    z[iOut] =
5470: 20 27 5c 30 27 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   '\0';.  }.}../*
5480: 0a 2a 2a 20 43 6f 6e 6e 65 63 74 20 74 6f 20 6f  .** Connect to o
5490: 72 20 63 72 65 61 74 65 20 61 20 76 66 73 6c 6f  r create a vfslo
54a0: 67 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  g virtual table.
54b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
54c0: 6c 6f 67 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71  logConnect(.  sq
54d0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
54e0: 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61  d *pAux,.  int a
54f0: 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
5500: 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73  *const*argv,.  s
5510: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
5520: 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70  Vtab,.  char **p
5530: 7a 45 72 72 0a 29 7b 0a 20 20 73 71 6c 69 74 65  zErr.){.  sqlite
5540: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
5550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
5560: 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6c 6f   used to read lo
5570: 67 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  g file */.  int 
5580: 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  flags;          
5590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
55a0: 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 70  lags passed to p
55b0: 56 66 73 2d 3e 78 4f 70 65 6e 28 29 20 2a 2f 0a  Vfs->xOpen() */.
55c0: 20 20 56 66 73 6c 6f 67 56 74 61 62 20 2a 70 3b    VfslogVtab *p;
55d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
55e0: 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a   nByte;.  char *
55f0: 7a 46 69 6c 65 3b 0a 0a 20 20 2a 70 70 56 74 61  zFile;..  *ppVta
5600: 62 20 3d 20 30 3b 0a 20 20 70 56 66 73 20 3d 20  b = 0;.  pVfs = 
5610: 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
5620: 28 30 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  (0);.  nByte = s
5630: 69 7a 65 6f 66 28 56 66 73 6c 6f 67 56 74 61 62  izeof(VfslogVtab
5640: 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
5650: 6c 65 20 2b 20 70 56 66 73 2d 3e 6d 78 50 61 74  le + pVfs->mxPat
5660: 68 6e 61 6d 65 3b 0a 20 20 70 20 3d 20 73 71 6c  hname;.  p = sql
5670: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74  ite3_malloc(nByt
5680: 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
5690: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
56a0: 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
56b0: 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20  , 0, nByte);..  
56c0: 70 2d 3e 70 46 64 20 3d 20 28 73 71 6c 69 74 65  p->pFd = (sqlite
56d0: 33 5f 66 69 6c 65 20 2a 29 26 70 5b 31 5d 3b 0a  3_file *)&p[1];.
56e0: 20 20 70 2d 3e 7a 46 69 6c 65 20 3d 20 26 28 28    p->zFile = &((
56f0: 63 68 61 72 20 2a 29 70 2d 3e 70 46 64 29 5b 70  char *)p->pFd)[p
5700: 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 5d 3b 0a  Vfs->szOsFile];.
5710: 0a 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74  .  zFile = sqlit
5720: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
5730: 20 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28   argv[3]);.  if(
5740: 20 21 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 73   !zFile ){.    s
5750: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
5760: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5770: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 64  E_NOMEM;.  }.  d
5780: 65 71 75 6f 74 65 28 7a 46 69 6c 65 29 3b 0a 20  equote(zFile);. 
5790: 20 70 56 66 73 2d 3e 78 46 75 6c 6c 50 61 74 68   pVfs->xFullPath
57a0: 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
57b0: 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
57c0: 6d 65 2c 20 70 2d 3e 7a 46 69 6c 65 29 3b 0a 20  me, p->zFile);. 
57d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
57e0: 69 6c 65 29 3b 0a 0a 20 20 66 6c 61 67 73 20 3d  ile);..  flags =
57f0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
5800: 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
5810: 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
5820: 4c 3b 0a 20 20 72 63 20 3d 20 70 56 66 73 2d 3e  L;.  rc = pVfs->
5830: 78 4f 70 65 6e 28 70 56 66 73 2c 20 70 2d 3e 7a  xOpen(pVfs, p->z
5840: 46 69 6c 65 2c 20 70 2d 3e 70 46 64 2c 20 66 6c  File, p->pFd, fl
5850: 61 67 73 2c 20 26 66 6c 61 67 73 29 3b 0a 0a 20  ags, &flags);.. 
5860: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5870: 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 70 46 64  OK ){.    p->pFd
5880: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c  ->pMethods->xFil
5890: 65 53 69 7a 65 28 70 2d 3e 70 46 64 2c 20 26 70  eSize(p->pFd, &p
58a0: 2d 3e 6e 42 79 74 65 29 3b 0a 20 20 20 20 73 71  ->nByte);.    sq
58b0: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
58c0: 61 62 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20  ab(db, .        
58d0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78  "CREATE TABLE xx
58e0: 78 28 65 76 65 6e 74 2c 20 66 69 6c 65 2c 20 63  x(event, file, c
58f0: 6c 69 63 6b 2c 20 72 63 2c 20 73 69 7a 65 2c 20  lick, rc, size, 
5900: 6f 66 66 73 65 74 29 22 0a 20 20 20 20 29 3b 0a  offset)".    );.
5910: 20 20 20 20 2a 70 70 56 74 61 62 20 3d 20 26 70      *ppVtab = &p
5920: 2d 3e 62 61 73 65 3b 0a 20 20 7d 65 6c 73 65 7b  ->base;.  }else{
5930: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
5940: 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  e(p);.  }..  ret
5950: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5960: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 22 62 65   There is no "be
5970: 73 74 2d 69 6e 64 65 78 22 2e 20 54 68 69 73 20  st-index". This 
5980: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 6c  virtual table al
5990: 77 61 79 73 20 64 6f 65 73 20 61 20 6c 69 6e 65  ways does a line
59a0: 61 72 0a 2a 2a 20 73 63 61 6e 20 6f 66 20 74 68  ar.** scan of th
59b0: 65 20 62 69 6e 61 72 79 20 56 46 53 20 6c 6f 67  e binary VFS log
59c0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
59d0: 20 69 6e 74 20 76 6c 6f 67 42 65 73 74 49 6e 64   int vlogBestInd
59e0: 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  ex(sqlite3_vtab 
59f0: 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e  *tab, sqlite3_in
5a00: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
5a10: 66 6f 29 7b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  fo){.  pIdxInfo-
5a20: 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
5a30: 20 31 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20   10.0;.  return 
5a40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5a50: 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20 66  .** Disconnect f
5a60: 72 6f 6d 20 6f 72 20 64 65 73 74 72 6f 79 20 61  rom or destroy a
5a70: 20 76 66 73 6c 6f 67 20 76 69 72 74 75 61 6c 20   vfslog virtual 
5a80: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
5a90: 20 69 6e 74 20 76 6c 6f 67 44 69 73 63 6f 6e 6e   int vlogDisconn
5aa0: 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ect(sqlite3_vtab
5ab0: 20 2a 70 56 74 61 62 29 7b 0a 20 20 56 66 73 6c   *pVtab){.  Vfsl
5ac0: 6f 67 56 74 61 62 20 2a 70 20 3d 20 28 56 66 73  ogVtab *p = (Vfs
5ad0: 6c 6f 67 56 74 61 62 20 2a 29 70 56 74 61 62 3b  logVtab *)pVtab;
5ae0: 0a 20 20 69 66 28 20 70 2d 3e 70 46 64 2d 3e 70  .  if( p->pFd->p
5af0: 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 70  Methods ){.    p
5b00: 2d 3e 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  ->pFd->pMethods-
5b10: 3e 78 43 6c 6f 73 65 28 70 2d 3e 70 46 64 29 3b  >xClose(p->pFd);
5b20: 0a 20 20 20 20 70 2d 3e 70 46 64 2d 3e 70 4d 65  .    p->pFd->pMe
5b30: 74 68 6f 64 73 20 3d 20 30 3b 0a 20 20 7d 0a 20  thods = 0;.  }. 
5b40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
5b50: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
5b60: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  E_OK;.}../*.** O
5b70: 70 65 6e 20 61 20 6e 65 77 20 76 66 73 6c 6f 67  pen a new vfslog
5b80: 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   cursor..*/.stat
5b90: 69 63 20 69 6e 74 20 76 6c 6f 67 4f 70 65 6e 28  ic int vlogOpen(
5ba0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
5bb0: 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 76 74 61  Tab, sqlite3_vta
5bc0: 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72  b_cursor **ppCur
5bd0: 73 6f 72 29 7b 0a 20 20 56 66 73 6c 6f 67 43 73  sor){.  VfslogCs
5be0: 72 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20 20  r *pCsr;        
5bf0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79          /* Newly
5c00: 20 61 6c 6c 6f 63 61 74 65 64 20 63 75 72 73 6f   allocated curso
5c10: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 70  r object */..  p
5c20: 43 73 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Csr = sqlite3_ma
5c30: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 56 66 73 6c  lloc(sizeof(Vfsl
5c40: 6f 67 43 73 72 29 29 3b 0a 20 20 69 66 28 20 21  ogCsr));.  if( !
5c50: 70 43 73 72 20 29 20 72 65 74 75 72 6e 20 53 51  pCsr ) return SQ
5c60: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
5c70: 6d 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69  mset(pCsr, 0, si
5c80: 7a 65 6f 66 28 56 66 73 6c 6f 67 43 73 72 29 29  zeof(VfslogCsr))
5c90: 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72 20 3d 20  ;.  *ppCursor = 
5ca0: 26 70 43 73 72 2d 3e 62 61 73 65 3b 0a 20 20 72  &pCsr->base;.  r
5cb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5cc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
5cd0: 61 20 76 66 73 6c 6f 67 20 63 75 72 73 6f 72 2e  a vfslog cursor.
5ce0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
5cf0: 6c 6f 67 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  logClose(sqlite3
5d00: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43  _vtab_cursor *pC
5d10: 75 72 73 6f 72 29 7b 0a 20 20 56 66 73 6c 6f 67  ursor){.  Vfslog
5d20: 43 73 72 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67  Csr *p = (Vfslog
5d30: 43 73 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 20  Csr *)pCursor;. 
5d40: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
5d50: 30 3b 20 69 3c 70 2d 3e 6e 46 69 6c 65 3b 20 69  0; i<p->nFile; i
5d60: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
5d70: 5f 66 72 65 65 28 70 2d 3e 61 7a 46 69 6c 65 5b  _free(p->azFile[
5d80: 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  i]);.  }.  sqlit
5d90: 65 33 5f 66 72 65 65 28 70 2d 3e 61 7a 46 69 6c  e3_free(p->azFil
5da0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
5db0: 65 65 28 70 2d 3e 7a 54 72 61 6e 73 69 65 6e 74  ee(p->zTransient
5dc0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
5dd0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
5de0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5df0: 2a 2a 20 4d 6f 76 65 20 61 20 76 66 73 6c 6f 67  ** Move a vfslog
5e00: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
5e10: 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
5e20: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
5e30: 20 69 6e 74 20 76 6c 6f 67 4e 65 78 74 28 73 71   int vlogNext(sq
5e40: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
5e50: 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a 20 20 56  r *pCursor){.  V
5e60: 66 73 6c 6f 67 43 73 72 20 2a 70 43 73 72 20 3d  fslogCsr *pCsr =
5e70: 20 28 56 66 73 6c 6f 67 43 73 72 20 2a 29 70 43   (VfslogCsr *)pC
5e80: 75 72 73 6f 72 3b 0a 20 20 56 66 73 6c 6f 67 56  ursor;.  VfslogV
5e90: 74 61 62 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67  tab *p = (Vfslog
5ea0: 56 74 61 62 20 2a 29 70 43 75 72 73 6f 72 2d 3e  Vtab *)pCursor->
5eb0: 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20  pVtab;.  int rc 
5ec0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
5ed0: 6e 74 20 6e 52 65 61 64 3b 0a 0a 20 20 73 71 6c  nt nRead;..  sql
5ee0: 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e  ite3_free(pCsr->
5ef0: 7a 54 72 61 6e 73 69 65 6e 74 29 3b 0a 20 20 70  zTransient);.  p
5f00: 43 73 72 2d 3e 7a 54 72 61 6e 73 69 65 6e 74 20  Csr->zTransient 
5f10: 3d 20 30 3b 0a 0a 20 20 6e 52 65 61 64 20 3d 20  = 0;..  nRead = 
5f20: 32 34 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e  24;.  if( pCsr->
5f30: 69 4f 66 66 73 65 74 2b 6e 52 65 61 64 3c 3d 70  iOffset+nRead<=p
5f40: 2d 3e 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 69  ->nByte ){.    i
5f50: 6e 74 20 65 45 76 65 6e 74 3b 0a 20 20 20 20 72  nt eEvent;.    r
5f60: 63 20 3d 20 70 2d 3e 70 46 64 2d 3e 70 4d 65 74  c = p->pFd->pMet
5f70: 68 6f 64 73 2d 3e 78 52 65 61 64 28 70 2d 3e 70  hods->xRead(p->p
5f80: 46 64 2c 20 70 43 73 72 2d 3e 61 42 75 66 2c 20  Fd, pCsr->aBuf, 
5f90: 6e 52 65 61 64 2c 20 70 43 73 72 2d 3e 69 4f 66  nRead, pCsr->iOf
5fa0: 66 73 65 74 29 3b 0a 0a 20 20 20 20 65 45 76 65  fset);..    eEve
5fb0: 6e 74 20 3d 20 67 65 74 33 32 62 69 74 73 28 70  nt = get32bits(p
5fc0: 43 73 72 2d 3e 61 42 75 66 29 3b 0a 20 20 20 20  Csr->aBuf);.    
5fd0: 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
5fe0: 4f 4b 29 0a 20 20 20 20 20 26 26 20 28 65 45 76  OK).     && (eEv
5ff0: 65 6e 74 3d 3d 4f 53 5f 4f 50 45 4e 20 7c 7c 20  ent==OS_OPEN || 
6000: 65 45 76 65 6e 74 3d 3d 4f 53 5f 44 45 4c 45 54  eEvent==OS_DELET
6010: 45 20 7c 7c 20 65 45 76 65 6e 74 3d 3d 4f 53 5f  E || eEvent==OS_
6020: 41 43 43 45 53 53 29 20 0a 20 20 20 20 29 7b 0a  ACCESS) .    ){.
6030: 20 20 20 20 20 20 63 68 61 72 20 62 75 66 5b 34        char buf[4
6040: 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 2d  ];.      rc = p-
6050: 3e 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  >pFd->pMethods->
6060: 78 52 65 61 64 28 70 2d 3e 70 46 64 2c 20 62 75  xRead(p->pFd, bu
6070: 66 2c 20 34 2c 20 70 43 73 72 2d 3e 69 4f 66 66  f, 4, pCsr->iOff
6080: 73 65 74 2b 6e 52 65 61 64 29 3b 0a 20 20 20 20  set+nRead);.    
6090: 20 20 6e 52 65 61 64 20 2b 3d 20 34 3b 0a 20 20    nRead += 4;.  
60a0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
60b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
60c0: 20 69 6e 74 20 6e 53 74 72 20 3d 20 67 65 74 33   int nStr = get3
60d0: 32 62 69 74 73 28 28 75 6e 73 69 67 6e 65 64 20  2bits((unsigned 
60e0: 63 68 61 72 20 2a 29 62 75 66 29 3b 0a 20 20 20  char *)buf);.   
60f0: 20 20 20 20 20 63 68 61 72 20 2a 7a 53 74 72 20       char *zStr 
6100: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
6110: 28 6e 53 74 72 2b 31 29 3b 0a 20 20 20 20 20 20  (nStr+1);.      
6120: 20 20 72 63 20 3d 20 70 2d 3e 70 46 64 2d 3e 70    rc = p->pFd->p
6130: 4d 65 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70  Methods->xRead(p
6140: 2d 3e 70 46 64 2c 20 7a 53 74 72 2c 20 6e 53 74  ->pFd, zStr, nSt
6150: 72 2c 20 70 43 73 72 2d 3e 69 4f 66 66 73 65 74  r, pCsr->iOffset
6160: 2b 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 20  +nRead);.       
6170: 20 7a 53 74 72 5b 6e 53 74 72 5d 20 3d 20 27 5c   zStr[nStr] = '\
6180: 30 27 3b 0a 20 20 20 20 20 20 20 20 6e 52 65 61  0';.        nRea
6190: 64 20 2b 3d 20 6e 53 74 72 3b 0a 0a 20 20 20 20  d += nStr;..    
61a0: 20 20 20 20 69 66 28 20 65 45 76 65 6e 74 3d 3d      if( eEvent==
61b0: 4f 53 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20  OS_OPEN ){.     
61c0: 20 20 20 20 20 69 6e 74 20 69 46 69 6c 65 69 64       int iFileid
61d0: 20 3d 20 67 65 74 33 32 62 69 74 73 28 26 70 43   = get32bits(&pC
61e0: 73 72 2d 3e 61 42 75 66 5b 34 5d 29 3b 0a 20 20  sr->aBuf[4]);.  
61f0: 20 20 20 20 20 20 20 20 69 66 28 20 69 46 69 6c          if( iFil
6200: 65 69 64 3e 3d 70 43 73 72 2d 3e 6e 46 69 6c 65  eid>=pCsr->nFile
6210: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6220: 69 6e 74 20 6e 4e 65 77 20 3d 20 73 69 7a 65 6f  int nNew = sizeo
6230: 66 28 70 43 73 72 2d 3e 61 7a 46 69 6c 65 5b 30  f(pCsr->azFile[0
6240: 5d 29 2a 28 69 46 69 6c 65 69 64 2b 31 29 3b 0a  ])*(iFileid+1);.
6250: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73 72              pCsr
6260: 2d 3e 61 7a 46 69 6c 65 20 3d 20 28 63 68 61 72  ->azFile = (char
6270: 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c   **)sqlite3_real
6280: 6c 6f 63 28 70 43 73 72 2d 3e 61 7a 46 69 6c 65  loc(pCsr->azFile
6290: 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , nNew);.       
62a0: 20 20 20 20 20 6e 4e 65 77 20 2d 3d 20 73 69 7a       nNew -= siz
62b0: 65 6f 66 28 70 43 73 72 2d 3e 61 7a 46 69 6c 65  eof(pCsr->azFile
62c0: 5b 30 5d 29 2a 70 43 73 72 2d 3e 6e 46 69 6c 65  [0])*pCsr->nFile
62d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  ;.            me
62e0: 6d 73 65 74 28 26 70 43 73 72 2d 3e 61 7a 46 69  mset(&pCsr->azFi
62f0: 6c 65 5b 70 43 73 72 2d 3e 6e 46 69 6c 65 5d 2c  le[pCsr->nFile],
6300: 20 30 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20   0, nNew);.     
6310: 20 20 20 20 20 20 20 70 43 73 72 2d 3e 6e 46 69         pCsr->nFi
6320: 6c 65 20 3d 20 69 46 69 6c 65 69 64 2b 31 3b 0a  le = iFileid+1;.
6330: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
6350: 65 65 28 70 43 73 72 2d 3e 61 7a 46 69 6c 65 5b  ee(pCsr->azFile[
6360: 69 46 69 6c 65 69 64 5d 29 3b 0a 20 20 20 20 20  iFileid]);.     
6370: 20 20 20 20 20 70 43 73 72 2d 3e 61 7a 46 69 6c       pCsr->azFil
6380: 65 5b 69 46 69 6c 65 69 64 5d 20 3d 20 7a 53 74  e[iFileid] = zSt
6390: 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  r;.        }else
63a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 73 72  {.          pCsr
63b0: 2d 3e 7a 54 72 61 6e 73 69 65 6e 74 20 3d 20 7a  ->zTransient = z
63c0: 53 74 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Str;.        }. 
63d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
63e0: 0a 0a 20 20 70 43 73 72 2d 3e 69 52 6f 77 69 64  ..  pCsr->iRowid
63f0: 20 2b 3d 20 31 3b 0a 20 20 70 43 73 72 2d 3e 69   += 1;.  pCsr->i
6400: 4f 66 66 73 65 74 20 2b 3d 20 6e 52 65 61 64 3b  Offset += nRead;
6410: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6420: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 6c 6f 67  .static int vlog
6430: 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62  Eof(sqlite3_vtab
6440: 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72  _cursor *pCursor
6450: 29 7b 0a 20 20 56 66 73 6c 6f 67 43 73 72 20 2a  ){.  VfslogCsr *
6460: 70 43 73 72 20 3d 20 28 56 66 73 6c 6f 67 43 73  pCsr = (VfslogCs
6470: 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 56  r *)pCursor;.  V
6480: 66 73 6c 6f 67 56 74 61 62 20 2a 70 20 3d 20 28  fslogVtab *p = (
6490: 56 66 73 6c 6f 67 56 74 61 62 20 2a 29 70 43 75  VfslogVtab *)pCu
64a0: 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 72  rsor->pVtab;.  r
64b0: 65 74 75 72 6e 20 28 70 43 73 72 2d 3e 69 4f 66  eturn (pCsr->iOf
64c0: 66 73 65 74 3e 3d 70 2d 3e 6e 42 79 74 65 29 3b  fset>=p->nByte);
64d0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .}..static int v
64e0: 6c 6f 67 46 69 6c 74 65 72 28 0a 20 20 73 71 6c  logFilter(.  sql
64f0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
6500: 20 2a 70 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e   *pCursor, .  in
6510: 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20  t idxNum, const 
6520: 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20  char *idxStr,.  
6530: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
6540: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
6550: 7b 0a 20 20 56 66 73 6c 6f 67 43 73 72 20 2a 70  {.  VfslogCsr *p
6560: 43 73 72 20 3d 20 28 56 66 73 6c 6f 67 43 73 72  Csr = (VfslogCsr
6570: 20 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 70 43   *)pCursor;.  pC
6580: 73 72 2d 3e 69 52 6f 77 69 64 20 3d 20 30 3b 0a  sr->iRowid = 0;.
6590: 20 20 70 43 73 72 2d 3e 69 4f 66 66 73 65 74 20    pCsr->iOffset 
65a0: 3d 20 32 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  = 20;.  return v
65b0: 6c 6f 67 4e 65 78 74 28 70 43 75 72 73 6f 72 29  logNext(pCursor)
65c0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
65d0: 76 6c 6f 67 43 6f 6c 75 6d 6e 28 0a 20 20 73 71  vlogColumn(.  sq
65e0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
65f0: 72 20 2a 70 43 75 72 73 6f 72 2c 20 0a 20 20 73  r *pCursor, .  s
6600: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
6610: 63 74 78 2c 20 0a 20 20 69 6e 74 20 69 0a 29 7b  ctx, .  int i.){
6620: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
6630: 76 61 6c 3b 0a 20 20 56 66 73 6c 6f 67 43 73 72  val;.  VfslogCsr
6640: 20 2a 70 43 73 72 20 3d 20 28 56 66 73 6c 6f 67   *pCsr = (Vfslog
6650: 43 73 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 0a  Csr *)pCursor;..
6660: 20 20 61 73 73 65 72 74 28 20 69 3c 37 20 29 3b    assert( i<7 );
6670: 0a 20 20 76 61 6c 20 3d 20 67 65 74 33 32 62 69  .  val = get32bi
6680: 74 73 28 26 70 43 73 72 2d 3e 61 42 75 66 5b 34  ts(&pCsr->aBuf[4
6690: 2a 69 5d 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  *i]);..  switch(
66a0: 20 69 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30   i ){.    case 0
66b0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
66c0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74  3_result_text(ct
66d0: 78 2c 20 76 66 73 6c 6f 67 5f 65 76 65 6e 74 6e  x, vfslog_eventn
66e0: 61 6d 65 28 76 61 6c 29 2c 20 2d 31 2c 20 53 51  ame(val), -1, SQ
66f0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
6700: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6710: 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20  .    case 1: {. 
6720: 20 20 20 20 20 63 68 61 72 20 2a 7a 53 74 72 20       char *zStr 
6730: 3d 20 70 43 73 72 2d 3e 7a 54 72 61 6e 73 69 65  = pCsr->zTransie
6740: 6e 74 3b 0a 20 20 20 20 20 20 69 66 28 20 76 61  nt;.      if( va
6750: 6c 21 3d 30 20 26 26 20 76 61 6c 3c 70 43 73 72  l!=0 && val<pCsr
6760: 2d 3e 6e 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  ->nFile ){.     
6770: 20 20 20 7a 53 74 72 20 3d 20 70 43 73 72 2d 3e     zStr = pCsr->
6780: 61 7a 46 69 6c 65 5b 76 61 6c 5d 3b 0a 20 20 20  azFile[val];.   
6790: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
67a0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
67b0: 74 78 2c 20 7a 53 74 72 2c 20 2d 31 2c 20 53 51  tx, zStr, -1, SQ
67c0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
67d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
67e0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
67f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
6800: 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 76  esult_int(ctx, v
6810: 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  al);.      break
6820: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
6830: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
6840: 61 74 69 63 20 69 6e 74 20 76 6c 6f 67 52 6f 77  atic int vlogRow
6850: 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  id(sqlite3_vtab_
6860: 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c  cursor *pCursor,
6870: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
6880: 52 6f 77 69 64 29 7b 0a 20 20 56 66 73 6c 6f 67  Rowid){.  Vfslog
6890: 43 73 72 20 2a 70 43 73 72 20 3d 20 28 56 66 73  Csr *pCsr = (Vfs
68a0: 6c 6f 67 43 73 72 20 2a 29 70 43 75 72 73 6f 72  logCsr *)pCursor
68b0: 3b 0a 20 20 2a 70 52 6f 77 69 64 20 3d 20 70 43  ;.  *pRowid = pC
68c0: 73 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65  sr->iRowid;.  re
68d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
68e0: 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 76  }..int sqlite3_v
68f0: 66 73 6c 6f 67 5f 72 65 67 69 73 74 65 72 28 73  fslog_register(s
6900: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73  qlite3 *db){.  s
6910: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f  tatic sqlite3_mo
6920: 64 75 6c 65 20 76 66 73 6c 6f 67 5f 6d 6f 64 75  dule vfslog_modu
6930: 6c 65 20 3d 20 7b 0a 20 20 20 20 30 2c 20 20 20  le = {.    0,   
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6950: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
6960: 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 76 6c 6f 67  sion */.    vlog
6970: 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20  Connect,        
6980: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61          /* xCrea
6990: 74 65 20 2a 2f 0a 20 20 20 20 76 6c 6f 67 43 6f  te */.    vlogCo
69a0: 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20 20  nnect,          
69b0: 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63        /* xConnec
69c0: 74 20 2a 2f 0a 20 20 20 20 76 6c 6f 67 42 65 73  t */.    vlogBes
69d0: 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  tIndex,         
69e0: 20 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64       /* xBestInd
69f0: 65 78 20 2a 2f 0a 20 20 20 20 76 6c 6f 67 44 69  ex */.    vlogDi
6a00: 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20  sconnect,       
6a10: 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e        /* xDiscon
6a20: 6e 65 63 74 20 2a 2f 0a 20 20 20 20 76 6c 6f 67  nect */.    vlog
6a30: 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20  Disconnect,     
6a40: 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73 74          /* xDest
6a50: 72 6f 79 20 2a 2f 0a 20 20 20 20 76 6c 6f 67 4f  roy */.    vlogO
6a60: 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
6a70: 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
6a80: 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20  - open a cursor 
6a90: 2a 2f 0a 20 20 20 20 76 6c 6f 67 43 6c 6f 73 65  */.    vlogClose
6aa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6ab0: 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63     /* xClose - c
6ac0: 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f  lose a cursor */
6ad0: 0a 20 20 20 20 76 6c 6f 67 46 69 6c 74 65 72 2c  .    vlogFilter,
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6af0: 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f   /* xFilter - co
6b00: 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e  nfigure scan con
6b10: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
6b20: 76 6c 6f 67 4e 65 78 74 2c 20 20 20 20 20 20 20  vlogNext,       
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
6b40: 4e 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61  Next - advance a
6b50: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 76   cursor */.    v
6b60: 6c 6f 67 45 6f 66 2c 20 20 20 20 20 20 20 20 20  logEof,         
6b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 45             /* xE
6b80: 6f 66 20 2d 20 63 68 65 63 6b 20 66 6f 72 20 65  of - check for e
6b90: 6e 64 20 6f 66 20 73 63 61 6e 20 2a 2f 0a 20 20  nd of scan */.  
6ba0: 20 20 76 6c 6f 67 43 6f 6c 75 6d 6e 2c 20 20 20    vlogColumn,   
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6bc0: 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20   xColumn - read 
6bd0: 64 61 74 61 20 2a 2f 0a 20 20 20 20 76 6c 6f 67  data */.    vlog
6be0: 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20  Rowid,          
6bf0: 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69          /* xRowi
6c00: 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  d - read data */
6c10: 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
6c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c30: 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f     /* xUpdate */
6c40: 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
6c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c60: 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2a 2f 0a     /* xBegin */.
6c70: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
6c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c90: 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20    /* xSync */.  
6ca0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cc0: 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20  /* xCommit */.  
6cd0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cf0: 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  /* xRollback */.
6d00: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d20: 20 20 2f 2a 20 78 46 69 6e 64 4d 65 74 68 6f 64    /* xFindMethod
6d30: 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d50: 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65        /* xRename
6d60: 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 73 71 6c 69   */.  };..  sqli
6d70: 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c  te3_create_modul
6d80: 65 28 64 62 2c 20 22 76 66 73 6c 6f 67 22 2c 20  e(db, "vfslog", 
6d90: 26 76 66 73 6c 6f 67 5f 6d 6f 64 75 6c 65 2c 20  &vfslog_module, 
6da0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  0);.  return SQL
6db0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a  ITE_OK;.}.../***
6dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e00: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
6e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e50: 2a 2a 2a 0a 2a 2a 20 54 63 6c 20 69 6e 74 65 72  ***.** Tcl inter
6e60: 66 61 63 65 20 73 74 61 72 74 73 20 68 65 72 65  face starts here
6e70: 2e 0a 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  ..*/..#ifdef SQL
6e80: 49 54 45 5f 54 45 53 54 0a 0a 23 69 6e 63 6c 75  ITE_TEST..#inclu
6e90: 64 65 20 3c 74 63 6c 2e 68 3e 0a 0a 73 74 61 74  de <tcl.h>..stat
6ea0: 69 63 20 69 6e 74 20 74 65 73 74 5f 76 66 73 6c  ic int test_vfsl
6eb0: 6f 67 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65  og(.  void *clie
6ec0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
6ed0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
6ee0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
6ef0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
6f00: 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 71  ].){.  struct Sq
6f10: 6c 69 74 65 44 62 20 7b 20 73 71 6c 69 74 65 33  liteDb { sqlite3
6f20: 20 2a 64 62 3b 20 7d 3b 0a 20 20 73 71 6c 69 74   *db; };.  sqlit
6f30: 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 43 6d  e3 *db;.  Tcl_Cm
6f40: 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20  dInfo cmdInfo;. 
6f50: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
6f60: 5f 45 52 52 4f 52 3b 0a 0a 20 20 73 74 61 74 69  _ERROR;..  stati
6f70: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74  c const char *st
6f80: 72 73 5b 5d 20 3d 20 7b 20 22 66 69 6e 61 6c 69  rs[] = { "finali
6f90: 7a 65 22 2c 20 22 6e 65 77 22 2c 20 20 22 72 65  ze", "new",  "re
6fa0: 67 69 73 74 65 72 22 2c 20 20 30 20 7d 3b 0a 20  gister",  0 };. 
6fb0: 20 65 6e 75 6d 20 56 4c 5f 65 6e 75 6d 20 7b 20   enum VL_enum { 
6fc0: 56 4c 5f 46 49 4e 41 4c 49 5a 45 2c 20 56 4c 5f  VL_FINALIZE, VL_
6fd0: 4e 45 57 2c 20 56 4c 5f 52 45 47 49 53 54 45 52  NEW, VL_REGISTER
6fe0: 20 7d 3b 0a 20 20 69 6e 74 20 69 53 75 62 3b 0a   };.  int iSub;.
6ff0: 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b  .  if( objc<2 ){
7000: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
7010: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
7020: 20 6f 62 6a 76 2c 20 22 53 55 42 2d 43 4f 4d 4d   objv, "SUB-COMM
7030: 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72  AND ...");.    r
7040: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7050: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
7060: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
7070: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
7080: 73 74 72 73 2c 20 22 73 75 62 2d 63 6f 6d 6d 61  strs, "sub-comma
7090: 6e 64 22 2c 20 30 2c 20 26 69 53 75 62 29 20 29  nd", 0, &iSub) )
70a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
70b0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73  _ERROR;.  }..  s
70c0: 77 69 74 63 68 28 20 28 65 6e 75 6d 20 56 4c 5f  witch( (enum VL_
70d0: 65 6e 75 6d 29 69 53 75 62 20 29 7b 0a 20 20 20  enum)iSub ){.   
70e0: 20 63 61 73 65 20 56 4c 5f 46 49 4e 41 4c 49 5a   case VL_FINALIZ
70f0: 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  E: {.      int r
7100: 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  c;.      char *z
7110: 56 66 73 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  Vfs;.      if( o
7120: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
7130: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
7140: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
7150: 6a 76 2c 20 22 56 46 53 22 29 3b 0a 20 20 20 20  jv, "VFS");.    
7160: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
7170: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
7180: 20 20 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47      zVfs = Tcl_G
7190: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
71a0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
71b0: 6c 69 74 65 33 5f 76 66 73 6c 6f 67 5f 66 69 6e  lite3_vfslog_fin
71c0: 61 6c 69 7a 65 28 7a 56 66 73 29 3b 0a 20 20 20  alize(zVfs);.   
71d0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
71e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
71f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7200: 28 69 6e 74 65 72 70 2c 20 22 66 61 69 6c 65 64  (interp, "failed
7210: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  ", 0);.        r
7220: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7230: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
7240: 72 65 61 6b 3b 0a 20 20 20 20 7d 3b 0a 0a 20 20  reak;.    };..  
7250: 20 20 63 61 73 65 20 56 4c 5f 4e 45 57 3a 20 7b    case VL_NEW: {
7260: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
7270: 20 20 20 20 20 63 68 61 72 20 2a 7a 56 66 73 3b       char *zVfs;
7280: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 61  .      char *zPa
7290: 72 65 6e 74 3b 0a 20 20 20 20 20 20 63 68 61 72  rent;.      char
72a0: 20 2a 7a 4c 6f 67 3b 0a 20 20 20 20 20 20 69 66   *zLog;.      if
72b0: 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20  ( objc!=5 ){.   
72c0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
72d0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
72e0: 20 6f 62 6a 76 2c 20 22 56 46 53 20 50 41 52 45   objv, "VFS PARE
72f0: 4e 54 20 4c 4f 47 46 49 4c 45 22 29 3b 0a 20 20  NT LOGFILE");.  
7300: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
7310: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
7320: 20 20 20 20 20 20 7a 56 66 73 20 3d 20 54 63 6c        zVfs = Tcl
7330: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
7340: 32 5d 29 3b 0a 20 20 20 20 20 20 7a 50 61 72 65  2]);.      zPare
7350: 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  nt = Tcl_GetStri
7360: 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20  ng(objv[3]);.   
7370: 20 20 20 7a 4c 6f 67 20 3d 20 54 63 6c 5f 47 65     zLog = Tcl_Ge
7380: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29  tString(objv[4])
7390: 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 50 61  ;.      if( *zPa
73a0: 72 65 6e 74 3d 3d 27 5c 30 27 20 29 20 7a 50 61  rent=='\0' ) zPa
73b0: 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  rent = 0;.      
73c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  rc = sqlite3_vfs
73d0: 6c 6f 67 5f 6e 65 77 28 7a 56 66 73 2c 20 7a 50  log_new(zVfs, zP
73e0: 61 72 65 6e 74 2c 20 7a 4c 6f 67 29 3b 0a 20 20  arent, zLog);.  
73f0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
7400: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
7410: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7420: 74 28 69 6e 74 65 72 70 2c 20 22 66 61 69 6c 65  t(interp, "faile
7430: 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  d", 0);.        
7440: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7450: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7460: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 3b 0a 0a 20  break;.    };.. 
7470: 20 20 20 63 61 73 65 20 56 4c 5f 52 45 47 49 53     case VL_REGIS
7480: 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 68 61  TER: {.      cha
7490: 72 20 2a 7a 44 62 3b 0a 20 20 20 20 20 20 69 66  r *zDb;.      if
74a0: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
74b0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
74c0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
74d0: 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20   objv, "DB");.  
74e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
74f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
7500: 20 20 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f        zDb = Tcl_
7510: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
7520: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63  ]);.      if( Tc
7530: 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f  l_GetCommandInfo
7540: 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26 63  (interp, zDb, &c
7550: 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20  mdInfo) ){.     
7560: 20 20 20 64 62 20 3d 20 28 28 73 74 72 75 63 74     db = ((struct
7570: 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e   SqliteDb*)cmdIn
7580: 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61  fo.objClientData
7590: 29 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 72  )->db;.        r
75a0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 6c  c = sqlite3_vfsl
75b0: 6f 67 5f 72 65 67 69 73 74 65 72 28 64 62 29 3b  og_register(db);
75c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
75d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
75e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
75f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7600: 65 72 70 2c 20 22 42 61 64 20 73 71 6c 69 74 65  erp, "Bad sqlite
7610: 33 20 68 61 6e 64 6c 65 3a 20 22 2c 20 7a 44 62  3 handle: ", zDb
7620: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
7630: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
7650: 65 61 6b 3b 0a 20 20 20 20 7d 3b 0a 20 20 7d 0a  eak;.    };.  }.
7660: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
7670: 3b 0a 7d 0a 0a 69 6e 74 20 53 71 6c 69 74 65 74  ;.}..int Sqlitet
7680: 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54  estOsinst_Init(T
7690: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
76a0: 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  p){.  Tcl_Create
76b0: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
76c0: 70 2c 20 22 76 66 73 6c 6f 67 22 2c 20 74 65 73  p, "vfslog", tes
76d0: 74 5f 76 66 73 6c 6f 67 2c 20 30 2c 20 30 29 3b  t_vfslog, 0, 0);
76e0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
76f0: 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
7700: 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a     QLITE_TEST */..