/ Hex Artifact Content
Login

Artifact 62b0b8ef21ce754cc94e17bb42377ed8795dba32:


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 6d 6f 73 74 20 56  log of.** most V
0290: 46 53 20 63 61 6c 6c 73 20 74 6f 20 62 65 20 77  FS calls to be w
02a0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 6e 6f  ritten into a no
02b0: 6d 69 6e 61 74 65 64 20 66 69 6c 65 20 6f 6e 20  minated file on 
02c0: 64 69 73 6b 2e 20 54 68 65 20 6c 6f 67 20 0a 2a  disk. The log .*
02d0: 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  * is stored in a
02e0: 20 63 6f 6d 70 72 65 73 73 65 64 20 62 69 6e 61   compressed bina
02f0: 72 79 20 66 6f 72 6d 61 74 20 74 6f 20 72 65 64  ry format to red
0300: 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  uce the amount o
0310: 66 20 49 4f 20 0a 2a 2a 20 6f 76 65 72 68 65 61  f IO .** overhea
0320: 64 20 69 6e 74 72 6f 64 75 63 65 64 20 69 6e 74  d introduced int
0330: 6f 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  o the applicatio
0340: 6e 20 62 79 20 6c 6f 67 67 69 6e 67 2e 0a 2a 2a  n by logging..**
0350: 0a 2a 2a 20 41 6c 6c 20 63 61 6c 6c 73 20 6f 6e  .** All calls on
0360: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62   sqlite3_file ob
0370: 6a 65 63 74 73 20 65 78 63 65 70 74 20 78 46 69  jects except xFi
0380: 6c 65 43 6f 6e 74 72 6f 6c 28 29 20 61 72 65 20  leControl() are 
0390: 6c 6f 67 67 65 64 2e 0a 2a 2a 20 41 64 64 69 74  logged..** Addit
03a0: 69 6f 6e 61 6c 6c 79 2c 20 63 61 6c 6c 73 20 74  ionally, calls t
03b0: 6f 20 74 68 65 20 78 41 63 63 65 73 73 28 29 2c  o the xAccess(),
03c0: 20 78 4f 70 65 6e 28 29 2c 20 61 6e 64 20 78 44   xOpen(), and xD
03d0: 65 6c 65 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f  elete().** metho
03e0: 64 73 20 61 72 65 20 6c 6f 67 67 65 64 2e 20 54  ds are logged. T
03f0: 68 65 20 6f 74 68 65 72 20 73 71 6c 69 74 65 33  he other sqlite3
0400: 5f 76 66 73 20 6f 62 6a 65 63 74 20 6d 65 74 68  _vfs object meth
0410: 6f 64 73 20 28 78 44 6c 58 58 58 2c 0a 2a 2a 20  ods (xDlXXX,.** 
0420: 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 78 53 6c  xRandomness, xSl
0430: 65 65 70 2c 20 78 43 75 72 72 65 6e 74 54 69 6d  eep, xCurrentTim
0440: 65 2c 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  e, xGetLastError
0450: 20 61 6e 64 20 78 43 75 72 72 65 6e 74 54 69 6d   and xCurrentTim
0460: 65 49 6e 74 36 34 29 20 0a 2a 2a 20 61 72 65 20  eInt64) .** are 
0470: 6e 6f 74 20 6c 6f 67 67 65 64 2e 0a 2a 2a 0a 2a  not logged..**.*
0480: 2a 20 54 68 65 20 62 69 6e 61 72 79 20 6c 6f 67  * The binary log
0490: 20 66 69 6c 65 73 20 61 72 65 20 72 65 61 64 20   files are read 
04a0: 75 73 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20  using a virtual 
04b0: 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61  table implementa
04c0: 74 69 6f 6e 0a 2a 2a 20 61 6c 73 6f 20 63 6f 6e  tion.** also con
04d0: 74 61 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66  tained in this f
04e0: 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 43 52 45 41  ile. .**.** CREA
04f0: 54 49 4e 47 20 4c 4f 47 20 46 49 4c 45 53 3a 0a  TING LOG FILES:.
0500: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  **.**       int 
0510: 73 71 6c 69 74 65 33 5f 76 66 73 6c 6f 67 5f 6e  sqlite3_vfslog_n
0520: 65 77 28 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  ew(.**         c
0530: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 2c  onst char *zVfs,
0540: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 61 6d            // Nam
0550: 65 20 6f 66 20 6e 65 77 20 56 46 53 0a 2a 2a 20  e of new VFS.** 
0560: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
0570: 61 72 20 2a 7a 50 61 72 65 6e 74 56 66 73 2c 20  ar *zParentVfs, 
0580: 20 20 20 2f 2f 20 4e 61 6d 65 20 6f 66 20 70 61     // Name of pa
0590: 72 65 6e 74 20 56 46 53 20 28 6f 72 20 4e 55 4c  rent VFS (or NUL
05a0: 4c 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  L).**         co
05b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 67 20 20  nst char *zLog  
05c0: 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 61 6d 65           // Name
05d0: 20 6f 66 20 6c 6f 67 20 66 69 6c 65 20 74 6f 20   of log file to 
05e0: 77 72 69 74 65 20 74 6f 0a 2a 2a 20 20 20 20 20  write to.**     
05f0: 20 20 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20    );.**.**      
0600: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 76 66 73   int sqlite3_vfs
0610: 6c 6f 67 5f 66 69 6e 61 6c 69 7a 65 28 63 6f 6e  log_finalize(con
0620: 73 74 20 63 68 61 72 20 2a 7a 56 66 73 29 3b 0a  st char *zVfs);.
0630: 2a 2a 0a 2a 2a 20 41 4e 4e 4f 54 41 54 49 4e 47  **.** ANNOTATING
0640: 20 4c 4f 47 20 46 49 4c 45 53 3a 0a 2a 2a 0a 2a   LOG FILES:.**.*
0650: 2a 20 20 20 54 6f 20 77 72 69 74 65 20 61 6e 20  *   To write an 
0660: 61 72 62 69 74 72 61 72 79 20 6d 65 73 73 61 67  arbitrary messag
0670: 65 20 69 6e 74 6f 20 61 20 6c 6f 67 20 66 69 6c  e into a log fil
0680: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69  e:.**.**       i
0690: 6e 74 20 73 71 6c 69 74 65 33 5f 76 66 73 6c 6f  nt sqlite3_vfslo
06a0: 67 5f 61 6e 6e 6f 74 61 74 65 28 63 6f 6e 73 74  g_annotate(const
06b0: 20 63 68 61 72 20 2a 7a 56 66 73 2c 20 63 6f 6e   char *zVfs, con
06c0: 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 29 3b 0a  st char *zMsg);.
06d0: 2a 2a 0a 2a 2a 20 52 45 41 44 49 4e 47 20 4c 4f  **.** READING LO
06e0: 47 20 46 49 4c 45 53 3a 0a 2a 2a 0a 2a 2a 20 20  G FILES:.**.**  
06f0: 20 4c 6f 67 20 66 69 6c 65 73 20 61 72 65 20 72   Log files are r
0700: 65 61 64 20 75 73 69 6e 67 20 74 68 65 20 22 76  ead using the "v
0710: 66 73 6c 6f 67 22 20 76 69 72 74 75 61 6c 20 74  fslog" virtual t
0720: 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  able implementat
0730: 69 6f 6e 0a 2a 2a 20 20 20 69 6e 20 74 68 69 73  ion.**   in this
0740: 20 66 69 6c 65 2e 20 54 6f 20 72 65 67 69 73 74   file. To regist
0750: 65 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  er the virtual t
0760: 61 62 6c 65 20 77 69 74 68 20 53 51 4c 69 74 65  able with SQLite
0770: 2c 20 75 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  , use:.**.**    
0780: 20 20 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 76     int sqlite3_v
0790: 66 73 6c 6f 67 5f 72 65 67 69 73 74 65 72 28 73  fslog_register(s
07a0: 71 6c 69 74 65 33 20 2a 64 62 29 3b 0a 2a 2a 0a  qlite3 *db);.**.
07b0: 2a 2a 20 20 20 54 68 65 6e 2c 20 69 66 20 74 68  **   Then, if th
07c0: 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 6e 61  e log file is na
07d0: 6d 65 64 20 22 76 66 73 2e 6c 6f 67 22 2c 20 74  med "vfs.log", t
07e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c  he following SQL
07f0: 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20   command:.**.** 
0800: 20 20 20 20 20 20 43 52 45 41 54 45 20 56 49 52        CREATE VIR
0810: 54 55 41 4c 20 54 41 42 4c 45 20 76 20 55 53 49  TUAL TABLE v USI
0820: 4e 47 20 76 66 73 6c 6f 67 28 27 76 66 73 2e 6c  NG vfslog('vfs.l
0830: 6f 67 27 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 63 72  og');.**.**   cr
0840: 65 61 74 65 73 20 61 20 76 69 72 74 75 61 6c 20  eates a virtual 
0850: 74 61 62 6c 65 20 77 69 74 68 20 36 20 63 6f 6c  table with 6 col
0860: 75 6d 6e 73 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  umns, as follows
0870: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 43 52  :.**.**       CR
0880: 45 41 54 45 20 54 41 42 4c 45 20 76 28 0a 2a 2a  EATE TABLE v(.**
0890: 20 20 20 20 20 20 20 20 20 65 76 65 6e 74 20 20           event  
08a0: 20 20 54 45 58 54 2c 20 20 20 20 20 20 20 20 20    TEXT,         
08b0: 20 20 20 20 2f 2f 20 22 78 4f 70 65 6e 22 2c 20      // "xOpen", 
08c0: 22 78 52 65 61 64 22 20 65 74 63 2e 0a 2a 2a 20  "xRead" etc..** 
08d0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
08e0: 20 54 45 58 54 2c 20 20 20 20 20 20 20 20 20 20   TEXT,          
08f0: 20 20 20 2f 2f 20 4e 61 6d 65 20 6f 66 20 66 69     // Name of fi
0900: 6c 65 20 74 68 69 73 20 63 61 6c 6c 20 61 70 70  le this call app
0910: 6c 69 65 73 20 74 6f 0a 2a 2a 20 20 20 20 20 20  lies to.**      
0920: 20 20 20 63 6c 69 63 6b 73 20 20 20 49 4e 54 45     clicks   INTE
0930: 47 45 52 2c 20 20 20 20 20 20 20 20 20 20 2f 2f  GER,          //
0940: 20 54 69 6d 65 20 73 70 65 6e 74 20 69 6e 20 63   Time spent in c
0950: 61 6c 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 72  all.**         r
0960: 63 20 20 20 20 20 20 20 49 4e 54 45 47 45 52 2c  c       INTEGER,
0970: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 52 65 74            // Ret
0980: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 20  urn value.**    
0990: 20 20 20 20 20 73 69 7a 65 20 20 20 20 20 49 4e       size     IN
09a0: 54 45 47 45 52 2c 20 20 20 20 20 20 20 20 20 20  TEGER,          
09b0: 2f 2f 20 42 79 74 65 73 20 72 65 61 64 20 6f 72  // Bytes read or
09c0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20 20   written.**     
09d0: 20 20 20 20 6f 66 66 73 65 74 20 20 20 49 4e 54      offset   INT
09e0: 45 47 45 52 20 20 20 20 20 20 20 20 20 20 20 2f  EGER           /
09f0: 2f 20 46 69 6c 65 20 6f 66 66 73 65 74 20 72 65  / File offset re
0a00: 61 64 20 6f 72 20 77 72 69 74 74 65 6e 0a 2a 2a  ad or written.**
0a10: 20 20 20 20 20 20 20 29 3b 0a 2a 2f 0a 0a 23 69         );.*/..#i
0a20: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e  nclude "sqlite3.
0a30: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72  h".#include <str
0a40: 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ing.h>.#include 
0a50: 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 0a 2f 2a 0a  <assert.h>.../*.
0a60: 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e  ** Maximum pathn
0a70: 61 6d 65 20 6c 65 6e 67 74 68 20 73 75 70 70 6f  ame length suppo
0a80: 72 74 65 64 20 62 79 20 74 68 65 20 76 66 73 6c  rted by the vfsl
0a90: 6f 67 20 62 61 63 6b 65 6e 64 2e 0a 2a 2f 0a 23  og backend..*/.#
0aa0: 64 65 66 69 6e 65 20 49 4e 53 54 5f 4d 41 58 5f  define INST_MAX_
0ab0: 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a 23 64  PATHNAME 512..#d
0ac0: 65 66 69 6e 65 20 4f 53 5f 41 43 43 45 53 53 20  efine OS_ACCESS 
0ad0: 20 20 20 20 20 20 20 20 20 20 20 31 0a 23 64 65             1.#de
0ae0: 66 69 6e 65 20 4f 53 5f 43 48 45 43 4b 52 45 53  fine OS_CHECKRES
0af0: 45 52 56 45 44 4c 4f 43 4b 20 32 0a 23 64 65 66  ERVEDLOCK 2.#def
0b00: 69 6e 65 20 4f 53 5f 43 4c 4f 53 45 20 20 20 20  ine OS_CLOSE    
0b10: 20 20 20 20 20 20 20 20 20 33 0a 23 64 65 66 69           3.#defi
0b20: 6e 65 20 4f 53 5f 43 55 52 52 45 4e 54 54 49 4d  ne OS_CURRENTTIM
0b30: 45 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e  E       4.#defin
0b40: 65 20 4f 53 5f 44 45 4c 45 54 45 20 20 20 20 20  e OS_DELETE     
0b50: 20 20 20 20 20 20 20 35 0a 23 64 65 66 69 6e 65         5.#define
0b60: 20 4f 53 5f 44 45 56 43 48 41 52 20 20 20 20 20   OS_DEVCHAR     
0b70: 20 20 20 20 20 20 36 0a 23 64 65 66 69 6e 65 20        6.#define 
0b80: 4f 53 5f 46 49 4c 45 43 4f 4e 54 52 4f 4c 20 20  OS_FILECONTROL  
0b90: 20 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20 4f       7.#define O
0ba0: 53 5f 46 49 4c 45 53 49 5a 45 20 20 20 20 20 20  S_FILESIZE      
0bb0: 20 20 20 20 38 0a 23 64 65 66 69 6e 65 20 4f 53      8.#define OS
0bc0: 5f 46 55 4c 4c 50 41 54 48 4e 41 4d 45 20 20 20  _FULLPATHNAME   
0bd0: 20 20 20 39 0a 23 64 65 66 69 6e 65 20 4f 53 5f     9.#define OS_
0be0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  LOCK            
0bf0: 20 20 31 31 0a 23 64 65 66 69 6e 65 20 4f 53 5f    11.#define OS_
0c00: 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20 20  OPEN            
0c10: 20 20 31 32 0a 23 64 65 66 69 6e 65 20 4f 53 5f    12.#define OS_
0c20: 52 41 4e 44 4f 4d 4e 45 53 53 20 20 20 20 20 20  RANDOMNESS      
0c30: 20 20 31 33 0a 23 64 65 66 69 6e 65 20 4f 53 5f    13.#define OS_
0c40: 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20  READ            
0c50: 20 20 31 34 20 0a 23 64 65 66 69 6e 65 20 4f 53    14 .#define OS
0c60: 5f 53 45 43 54 4f 52 53 49 5a 45 20 20 20 20 20  _SECTORSIZE     
0c70: 20 20 20 31 35 0a 23 64 65 66 69 6e 65 20 4f 53     15.#define OS
0c80: 5f 53 4c 45 45 50 20 20 20 20 20 20 20 20 20 20  _SLEEP          
0c90: 20 20 20 31 36 0a 23 64 65 66 69 6e 65 20 4f 53     16.#define OS
0ca0: 5f 53 59 4e 43 20 20 20 20 20 20 20 20 20 20 20  _SYNC           
0cb0: 20 20 20 31 37 0a 23 64 65 66 69 6e 65 20 4f 53     17.#define OS
0cc0: 5f 54 52 55 4e 43 41 54 45 20 20 20 20 20 20 20  _TRUNCATE       
0cd0: 20 20 20 31 38 0a 23 64 65 66 69 6e 65 20 4f 53     18.#define OS
0ce0: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 20  _UNLOCK         
0cf0: 20 20 20 31 39 0a 23 64 65 66 69 6e 65 20 4f 53     19.#define OS
0d00: 5f 57 52 49 54 45 20 20 20 20 20 20 20 20 20 20  _WRITE          
0d10: 20 20 20 32 30 0a 23 64 65 66 69 6e 65 20 4f 53     20.#define OS
0d20: 5f 53 48 4d 55 4e 4d 41 50 20 20 20 20 20 20 20  _SHMUNMAP       
0d30: 20 20 20 32 32 0a 23 64 65 66 69 6e 65 20 4f 53     22.#define OS
0d40: 5f 53 48 4d 4d 41 50 20 20 20 20 20 20 20 20 20  _SHMMAP         
0d50: 20 20 20 32 33 0a 23 64 65 66 69 6e 65 20 4f 53     23.#define OS
0d60: 5f 53 48 4d 4c 4f 43 4b 20 20 20 20 20 20 20 20  _SHMLOCK        
0d70: 20 20 20 32 35 0a 23 64 65 66 69 6e 65 20 4f 53     25.#define OS
0d80: 5f 53 48 4d 42 41 52 52 49 45 52 20 20 20 20 20  _SHMBARRIER     
0d90: 20 20 20 32 36 0a 23 64 65 66 69 6e 65 20 4f 53     26.#define OS
0da0: 5f 41 4e 4e 4f 54 41 54 45 20 20 20 20 20 20 20  _ANNOTATE       
0db0: 20 20 20 32 38 0a 0a 23 64 65 66 69 6e 65 20 4f     28..#define O
0dc0: 53 5f 4e 55 4d 45 56 45 4e 54 53 20 20 20 20 20  S_NUMEVENTS     
0dd0: 20 20 20 20 32 39 0a 0a 23 64 65 66 69 6e 65 20      29..#define 
0de0: 56 46 53 4c 4f 47 5f 42 55 46 46 45 52 53 49 5a  VFSLOG_BUFFERSIZ
0df0: 45 20 38 31 39 32 0a 0a 74 79 70 65 64 65 66 20  E 8192..typedef 
0e00: 73 74 72 75 63 74 20 56 66 73 6c 6f 67 56 66 73  struct VfslogVfs
0e10: 20 56 66 73 6c 6f 67 56 66 73 3b 0a 74 79 70 65   VfslogVfs;.type
0e20: 64 65 66 20 73 74 72 75 63 74 20 56 66 73 6c 6f  def struct Vfslo
0e30: 67 46 69 6c 65 20 56 66 73 6c 6f 67 46 69 6c 65  gFile VfslogFile
0e40: 3b 0a 0a 73 74 72 75 63 74 20 56 66 73 6c 6f 67  ;..struct Vfslog
0e50: 56 66 73 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Vfs {.  sqlite3_
0e60: 76 66 73 20 62 61 73 65 3b 20 20 20 20 20 20 20  vfs base;       
0e70: 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 6d          /* VFS m
0e80: 65 74 68 6f 64 73 20 2a 2f 0a 20 20 73 71 6c 69  ethods */.  sqli
0e90: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
0eb0: 61 72 65 6e 74 20 56 46 53 20 2a 2f 0a 20 20 69  arent VFS */.  i
0ec0: 6e 74 20 69 4e 65 78 74 46 69 6c 65 49 64 3b 20  nt iNextFileId; 
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0ee0: 2a 20 4e 65 78 74 20 66 69 6c 65 20 69 64 20 2a  * Next file id *
0ef0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
0f00: 20 2a 70 4c 6f 67 3b 20 20 20 20 20 20 20 20 20   *pLog;         
0f10: 20 20 20 20 2f 2a 20 4c 6f 67 20 66 69 6c 65 20      /* Log file 
0f20: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  handle */.  sqli
0f30: 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65  te3_int64 iOffse
0f40: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  t;          /* L
0f50: 6f 67 20 66 69 6c 65 20 6f 66 66 73 65 74 20 6f  og file offset o
0f60: 66 20 73 74 61 72 74 20 6f 66 20 77 72 69 74 65  f start of write
0f70: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
0f80: 20 6e 42 75 66 3b 20 20 20 20 20 20 20 20 20 20   nBuf;          
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0fa0: 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
0fb0: 62 79 74 65 73 20 69 6e 20 61 42 75 66 5b 5d 20  bytes in aBuf[] 
0fc0: 2a 2f 0a 20 20 63 68 61 72 20 61 42 75 66 5b 56  */.  char aBuf[V
0fd0: 46 53 4c 4f 47 5f 42 55 46 46 45 52 53 49 5a 45  FSLOG_BUFFERSIZE
0fe0: 5d 3b 20 20 20 2f 2a 20 57 72 69 74 65 20 62 75  ];   /* Write bu
0ff0: 66 66 65 72 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75  ffer */.};..stru
1000: 63 74 20 56 66 73 6c 6f 67 46 69 6c 65 20 7b 0a  ct VfslogFile {.
1010: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 62    sqlite3_file b
1020: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
1030: 20 20 2f 2a 20 49 4f 20 6d 65 74 68 6f 64 73 20    /* IO methods 
1040: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
1050: 65 20 2a 70 52 65 61 6c 3b 20 20 20 20 20 20 20  e *pReal;       
1060: 20 20 20 20 20 2f 2a 20 55 6e 64 65 72 6c 79 69       /* Underlyi
1070: 6e 67 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a  ng file handle *
1080: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
1090: 2a 70 56 66 73 6c 6f 67 3b 20 20 20 20 20 20 20  *pVfslog;       
10a0: 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65      /* Associate
10b0: 64 20 56 73 66 6c 6f 67 56 66 73 20 6f 62 6a 65  d VsflogVfs obje
10c0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 6c  ct */.  int iFil
10d0: 65 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  eId;            
10e0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
10f0: 69 64 20 6e 75 6d 62 65 72 20 2a 2f 0a 7d 3b 0a  id number */.};.
1100: 0a 23 64 65 66 69 6e 65 20 52 45 41 4c 56 46 53  .#define REALVFS
1110: 28 70 29 20 28 28 28 56 66 73 6c 6f 67 56 66 73  (p) (((VfslogVfs
1120: 20 2a 29 28 70 29 29 2d 3e 70 56 66 73 29 0a 0a   *)(p))->pVfs)..
1130: 0a 0a 2f 2a 0a 2a 2a 20 4d 65 74 68 6f 64 20 64  ../*.** Method d
1140: 65 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f 72 20  eclarations for 
1150: 76 66 73 6c 6f 67 5f 66 69 6c 65 2e 0a 2a 2f 0a  vfslog_file..*/.
1160: 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f  static int vfslo
1170: 67 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  gClose(sqlite3_f
1180: 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  ile*);.static in
1190: 74 20 76 66 73 6c 6f 67 52 65 61 64 28 73 71 6c  t vfslogRead(sql
11a0: 69 74 65 33 5f 66 69 6c 65 2a 2c 20 76 6f 69 64  ite3_file*, void
11b0: 2a 2c 20 69 6e 74 20 69 41 6d 74 2c 20 73 71 6c  *, int iAmt, sql
11c0: 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 73 74  ite3_int64 iOfst
11d0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  );.static int vf
11e0: 73 6c 6f 67 57 72 69 74 65 28 73 71 6c 69 74 65  slogWrite(sqlite
11f0: 33 5f 66 69 6c 65 2a 2c 63 6f 6e 73 74 20 76 6f  3_file*,const vo
1200: 69 64 2a 2c 69 6e 74 20 69 41 6d 74 2c 20 73 71  id*,int iAmt, sq
1210: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 73  lite3_int64 iOfs
1220: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 76  t);.static int v
1230: 66 73 6c 6f 67 54 72 75 6e 63 61 74 65 28 73 71  fslogTruncate(sq
1240: 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71 6c  lite3_file*, sql
1250: 69 74 65 33 5f 69 6e 74 36 34 20 73 69 7a 65 29  ite3_int64 size)
1260: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73  ;.static int vfs
1270: 6c 6f 67 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  logSync(sqlite3_
1280: 66 69 6c 65 2a 2c 20 69 6e 74 20 66 6c 61 67 73  file*, int flags
1290: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  );.static int vf
12a0: 73 6c 6f 67 46 69 6c 65 53 69 7a 65 28 73 71 6c  slogFileSize(sql
12b0: 69 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69  ite3_file*, sqli
12c0: 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65  te3_int64 *pSize
12d0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  );.static int vf
12e0: 73 6c 6f 67 4c 6f 63 6b 28 73 71 6c 69 74 65 33  slogLock(sqlite3
12f0: 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74  _file*, int);.st
1300: 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 55  atic int vfslogU
1310: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
1320: 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
1330: 63 20 69 6e 74 20 76 66 73 6c 6f 67 43 68 65 63  c int vfslogChec
1340: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
1350: 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
1360: 20 2a 70 52 65 73 4f 75 74 29 3b 0a 73 74 61 74   *pResOut);.stat
1370: 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 46 69 6c  ic int vfslogFil
1380: 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
1390: 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 6f 70 2c 20  _file*, int op, 
13a0: 76 6f 69 64 20 2a 70 41 72 67 29 3b 0a 73 74 61  void *pArg);.sta
13b0: 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 53 65  tic int vfslogSe
13c0: 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
13d0: 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20  _file*);.static 
13e0: 69 6e 74 20 76 66 73 6c 6f 67 44 65 76 69 63 65  int vfslogDevice
13f0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1400: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a  sqlite3_file*);.
1410: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c  .static int vfsl
1420: 6f 67 53 68 6d 4c 6f 63 6b 28 73 71 6c 69 74 65  ogShmLock(sqlite
1430: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
1440: 6e 74 20 6f 66 73 74 2c 20 69 6e 74 20 6e 2c 20  nt ofst, int n, 
1450: 69 6e 74 20 66 6c 61 67 73 29 3b 0a 73 74 61 74  int flags);.stat
1460: 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 53 68 6d  ic int vfslogShm
1470: 4d 61 70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  Map(sqlite3_file
1480: 20 2a 70 46 69 6c 65 2c 69 6e 74 2c 69 6e 74 2c   *pFile,int,int,
1490: 69 6e 74 2c 76 6f 6c 61 74 69 6c 65 20 76 6f 69  int,volatile voi
14a0: 64 20 2a 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  d **);.static vo
14b0: 69 64 20 76 66 73 6c 6f 67 53 68 6d 42 61 72 72  id vfslogShmBarr
14c0: 69 65 72 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ier(sqlite3_file
14d0: 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 76  *);.static int v
14e0: 66 73 6c 6f 67 53 68 6d 55 6e 6d 61 70 28 73 71  fslogShmUnmap(sq
14f0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
1500: 65 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  e, int deleteFla
1510: 67 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 65 74 68 6f  g);../*.** Metho
1520: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 66  d declarations f
1530: 6f 72 20 76 66 73 6c 6f 67 5f 76 66 73 2e 0a 2a  or vfslog_vfs..*
1540: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73  /.static int vfs
1550: 6c 6f 67 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  logOpen(sqlite3_
1560: 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  vfs*, const char
1570: 20 2a 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   *, sqlite3_file
1580: 2a 2c 20 69 6e 74 20 2c 20 69 6e 74 20 2a 29 3b  *, int , int *);
1590: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c  .static int vfsl
15a0: 6f 67 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  ogDelete(sqlite3
15b0: 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61  _vfs*, const cha
15c0: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 73 79  r *zName, int sy
15d0: 6e 63 44 69 72 29 3b 0a 73 74 61 74 69 63 20 69  ncDir);.static i
15e0: 6e 74 20 76 66 73 6c 6f 67 41 63 63 65 73 73 28  nt vfslogAccess(
15f0: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f  sqlite3_vfs*, co
1600: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1610: 20 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74 20   int flags, int 
1620: 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 76  *);.static int v
1630: 66 73 6c 6f 67 46 75 6c 6c 50 61 74 68 6e 61 6d  fslogFullPathnam
1640: 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20  e(sqlite3_vfs*, 
1650: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1660: 65 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 7a 4f  e, int, char *zO
1670: 75 74 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  ut);.static void
1680: 20 2a 76 66 73 6c 6f 67 44 6c 4f 70 65 6e 28 73   *vfslogDlOpen(s
1690: 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e  qlite3_vfs*, con
16a0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
16b0: 6d 65 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  me);.static void
16c0: 20 76 66 73 6c 6f 67 44 6c 45 72 72 6f 72 28 73   vfslogDlError(s
16d0: 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74  qlite3_vfs*, int
16e0: 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 45   nByte, char *zE
16f0: 72 72 4d 73 67 29 3b 0a 73 74 61 74 69 63 20 76  rrMsg);.static v
1700: 6f 69 64 20 28 2a 76 66 73 6c 6f 67 44 6c 53 79  oid (*vfslogDlSy
1710: 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  m(sqlite3_vfs *p
1720: 56 66 73 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f  Vfs, void *p, co
1730: 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28  nst char*zSym))(
1740: 76 6f 69 64 29 3b 0a 73 74 61 74 69 63 20 76 6f  void);.static vo
1750: 69 64 20 76 66 73 6c 6f 67 44 6c 43 6c 6f 73 65  id vfslogDlClose
1760: 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 76  (sqlite3_vfs*, v
1770: 6f 69 64 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  oid*);.static in
1780: 74 20 76 66 73 6c 6f 67 52 61 6e 64 6f 6d 6e 65  t vfslogRandomne
1790: 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  ss(sqlite3_vfs*,
17a0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72   int nByte, char
17b0: 20 2a 7a 4f 75 74 29 3b 0a 73 74 61 74 69 63 20   *zOut);.static 
17c0: 69 6e 74 20 76 66 73 6c 6f 67 53 6c 65 65 70 28  int vfslogSleep(
17d0: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69 6e  sqlite3_vfs*, in
17e0: 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b  t microseconds);
17f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c  .static int vfsl
1800: 6f 67 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  ogCurrentTime(sq
1810: 6c 69 74 65 33 5f 76 66 73 2a 2c 20 64 6f 75 62  lite3_vfs*, doub
1820: 6c 65 2a 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e  le*);..static in
1830: 74 20 76 66 73 6c 6f 67 47 65 74 4c 61 73 74 45  t vfslogGetLastE
1840: 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
1850: 2a 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 29 3b  *, int, char *);
1860: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c  .static int vfsl
1870: 6f 67 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  ogCurrentTimeInt
1880: 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  64(sqlite3_vfs*,
1890: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29   sqlite3_int64*)
18a0: 3b 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  ;..static sqlite
18b0: 33 5f 76 66 73 20 76 66 73 6c 6f 67 5f 76 66 73  3_vfs vfslog_vfs
18c0: 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20 20 20   = {.  1,       
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
18f0: 6f 6e 20 2a 2f 0a 20 20 73 69 7a 65 6f 66 28 56  on */.  sizeof(V
1900: 66 73 6c 6f 67 46 69 6c 65 29 2c 20 20 20 20 20  fslogFile),     
1910: 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46          /* szOsF
1920: 69 6c 65 20 2a 2f 0a 20 20 49 4e 53 54 5f 4d 41  ile */.  INST_MA
1930: 58 5f 50 41 54 48 4e 41 4d 45 2c 20 20 20 20 20  X_PATHNAME,     
1940: 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61           /* mxPa
1950: 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20  thname */.  0,  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
1980: 4e 65 78 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20  Next */.  0,    
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61            /* zNa
19b0: 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  me */.  0,      
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44          /* pAppD
19e0: 61 74 61 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 4f  ata */.  vfslogO
19f0: 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
1a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
1a10: 6e 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 44 65 6c  n */.  vfslogDel
1a20: 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ete,            
1a30: 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
1a40: 65 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 41 63 63  e */.  vfslogAcc
1a50: 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ess,            
1a60: 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
1a70: 73 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 46 75 6c  s */.  vfslogFul
1a80: 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 20  lPathname,      
1a90: 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50         /* xFullP
1aa0: 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 76 66 73  athname */.  vfs
1ab0: 6c 6f 67 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20  logDlOpen,      
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ad0: 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 76 66 73  xDlOpen */.  vfs
1ae0: 6c 6f 67 44 6c 45 72 72 6f 72 2c 20 20 20 20 20  logDlError,     
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b00: 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 76 66  xDlError */.  vf
1b10: 73 6c 6f 67 44 6c 53 79 6d 2c 20 20 20 20 20 20  slogDlSym,      
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b30: 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 76 66 73   xDlSym */.  vfs
1b40: 6c 6f 67 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  logDlClose,     
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b60: 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 76 66  xDlClose */.  vf
1b70: 73 6c 6f 67 52 61 6e 64 6f 6d 6e 65 73 73 2c 20  slogRandomness, 
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b90: 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a   xRandomness */.
1ba0: 20 20 76 66 73 6c 6f 67 53 6c 65 65 70 2c 20 20    vfslogSleep,  
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20    /* xSleep */. 
1bd0: 20 76 66 73 6c 6f 67 43 75 72 72 65 6e 74 54 69   vfslogCurrentTi
1be0: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
1bf0: 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
1c00: 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 47 65 74 4c   */.  vfslogGetL
1c10: 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20  astError,       
1c20: 20 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73        /* xGetLas
1c30: 74 45 72 72 6f 72 20 2a 2f 0a 20 20 76 66 73 6c  tError */.  vfsl
1c40: 6f 67 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  ogCurrentTimeInt
1c50: 36 34 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  64          /* x
1c60: 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 7d  CurrentTime */.}
1c70: 3b 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  ;..static sqlite
1c80: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 76 66 73  3_io_methods vfs
1c90: 6c 6f 67 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 3d  log_io_methods =
1ca0: 20 7b 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20   {.  2,         
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
1cd0: 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 43 6c 6f 73   */.  vfslogClos
1ce0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1cf0: 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
1d00: 2a 2f 0a 20 20 76 66 73 6c 6f 67 52 65 61 64 2c  */.  vfslogRead,
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f       /* xRead */
1d30: 0a 20 20 76 66 73 6c 6f 67 57 72 69 74 65 2c 20  .  vfslogWrite, 
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d50: 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a     /* xWrite */.
1d60: 20 20 76 66 73 6c 6f 67 54 72 75 6e 63 61 74 65    vfslogTruncate
1d70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d80: 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
1d90: 2f 0a 20 20 76 66 73 6c 6f 67 53 79 6e 63 2c 20  /.  vfslogSync, 
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db0: 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a      /* xSync */.
1dc0: 20 20 76 66 73 6c 6f 67 46 69 6c 65 53 69 7a 65    vfslogFileSize
1dd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1de0: 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
1df0: 2f 0a 20 20 76 66 73 6c 6f 67 4c 6f 63 6b 2c 20  /.  vfslogLock, 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a      /* xLock */.
1e20: 20 20 76 66 73 6c 6f 67 55 6e 6c 6f 63 6b 2c 20    vfslogUnlock, 
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a    /* xUnlock */.
1e50: 20 20 76 66 73 6c 6f 67 43 68 65 63 6b 52 65 73    vfslogCheckRes
1e60: 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20  ervedLock,      
1e70: 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
1e80: 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 76 66 73  vedLock */.  vfs
1e90: 6c 6f 67 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20  logFileControl, 
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eb0: 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a  xFileControl */.
1ec0: 20 20 76 66 73 6c 6f 67 53 65 63 74 6f 72 53 69    vfslogSectorSi
1ed0: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
1ee0: 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
1ef0: 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 44 65 76 69   */.  vfslogDevi
1f00: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1f10: 73 2c 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65  s,    /* xDevice
1f20: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1f30: 2a 2f 0a 20 20 76 66 73 6c 6f 67 53 68 6d 4d 61  */.  vfslogShmMa
1f40: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1f50: 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
1f60: 2a 2f 0a 20 20 76 66 73 6c 6f 67 53 68 6d 4c 6f  */.  vfslogShmLo
1f70: 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1f80: 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b       /* xShmLock
1f90: 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 53 68 6d 42   */.  vfslogShmB
1fa0: 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20  arrier,         
1fb0: 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
1fc0: 72 69 65 72 20 2a 2f 0a 20 20 76 66 73 6c 6f 67  rier */.  vfslog
1fd0: 53 68 6d 55 6e 6d 61 70 20 20 20 20 20 20 20 20  ShmUnmap        
1fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
1ff0: 6d 55 6e 6d 61 70 20 2a 2f 0a 7d 3b 0a 0a 23 69  mUnmap */.};..#i
2000: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58  f SQLITE_OS_UNIX
2010: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f   && !defined(NO_
2020: 47 45 54 54 4f 44 29 0a 23 69 6e 63 6c 75 64 65  GETTOD).#include
2030: 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 73 74   <sys/time.h>.st
2040: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 75 69 6e  atic sqlite3_uin
2050: 74 36 34 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28  t64 vfslog_time(
2060: 29 7b 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  ){.  struct time
2070: 76 61 6c 20 73 54 69 6d 65 3b 0a 20 20 67 65 74  val sTime;.  get
2080: 74 69 6d 65 6f 66 64 61 79 28 26 73 54 69 6d 65  timeofday(&sTime
2090: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  , 0);.  return s
20a0: 54 69 6d 65 2e 74 76 5f 75 73 65 63 20 2b 20 28  Time.tv_usec + (
20b0: 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 73  sqlite3_uint64)s
20c0: 54 69 6d 65 2e 74 76 5f 73 65 63 20 2a 20 31 30  Time.tv_sec * 10
20d0: 30 30 30 30 30 3b 0a 7d 0a 23 65 6c 69 66 20 53  00000;.}.#elif S
20e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 23 69 6e  QLITE_OS_WIN.#in
20f0: 63 6c 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68  clude <windows.h
2100: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65  >.#include <time
2110: 2e 68 3e 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .h>.static sqlit
2120: 65 33 5f 75 69 6e 74 36 34 20 76 66 73 6c 6f 67  e3_uint64 vfslog
2130: 5f 74 69 6d 65 28 29 7b 0a 20 20 46 49 4c 45 54  _time(){.  FILET
2140: 49 4d 45 20 66 74 3b 0a 20 20 73 71 6c 69 74 65  IME ft;.  sqlite
2150: 33 5f 75 69 6e 74 36 34 20 75 36 34 74 69 6d 65  3_uint64 u64time
2160: 20 3d 20 30 3b 0a 20 0a 20 20 47 65 74 53 79 73   = 0;. .  GetSys
2170: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
2180: 65 28 26 66 74 29 3b 0a 0a 20 20 75 36 34 74 69  e(&ft);..  u64ti
2190: 6d 65 20 7c 3d 20 66 74 2e 64 77 48 69 67 68 44  me |= ft.dwHighD
21a0: 61 74 65 54 69 6d 65 3b 0a 20 20 75 36 34 74 69  ateTime;.  u64ti
21b0: 6d 65 20 3c 3c 3d 20 33 32 3b 0a 20 20 75 36 34  me <<= 32;.  u64
21c0: 74 69 6d 65 20 7c 3d 20 66 74 2e 64 77 4c 6f 77  time |= ft.dwLow
21d0: 44 61 74 65 54 69 6d 65 3b 0a 0a 20 20 2f 2a 20  DateTime;..  /* 
21e0: 66 74 20 69 73 20 31 30 30 2d 6e 61 6e 6f 73 65  ft is 100-nanose
21f0: 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 2c 20  cond intervals, 
2200: 77 65 20 77 61 6e 74 20 6d 69 63 72 6f 73 65 63  we want microsec
2210: 6f 6e 64 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e  onds */.  return
2220: 20 75 36 34 74 69 6d 65 20 2f 28 73 71 6c 69 74   u64time /(sqlit
2230: 65 33 5f 75 69 6e 74 36 34 29 31 30 3b 0a 7d 0a  e3_uint64)10;.}.
2240: 23 65 6c 73 65 0a 73 74 61 74 69 63 20 73 71 6c  #else.static sql
2250: 69 74 65 33 5f 75 69 6e 74 36 34 20 76 66 73 6c  ite3_uint64 vfsl
2260: 6f 67 5f 74 69 6d 65 28 29 7b 0a 20 20 72 65 74  og_time(){.  ret
2270: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
2280: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 66 73  .static void vfs
2290: 6c 6f 67 5f 63 61 6c 6c 28 73 71 6c 69 74 65 33  log_call(sqlite3
22a0: 5f 76 66 73 20 2a 2c 20 69 6e 74 2c 20 69 6e 74  _vfs *, int, int
22b0: 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 2c  , int, int, int,
22c0: 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 76 6f   int);.static vo
22d0: 69 64 20 76 66 73 6c 6f 67 5f 73 74 72 69 6e 67  id vfslog_string
22e0: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20  (sqlite3_vfs *, 
22f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a  const char *);..
2300: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 76  /*.** Close an v
2310: 66 73 6c 6f 67 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  fslog-file..*/.s
2320: 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67  tatic int vfslog
2330: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
2340: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 71  le *pFile){.  sq
2350: 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 74 3b 0a  lite3_uint64 t;.
2360: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2370: 45 5f 4f 4b 3b 0a 20 20 56 66 73 6c 6f 67 46 69  E_OK;.  VfslogFi
2380: 6c 65 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67 46  le *p = (VfslogF
2390: 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 0a 20 20  ile *)pFile;..  
23a0: 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28  t = vfslog_time(
23b0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61  );.  if( p->pRea
23c0: 6c 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  l->pMethods ){. 
23d0: 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c     rc = p->pReal
23e0: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43 6c 6f  ->pMethods->xClo
23f0: 73 65 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 20 20  se(p->pReal);.  
2400: 7d 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74  }.  t = vfslog_t
2410: 69 6d 65 28 29 20 2d 20 74 3b 0a 20 20 76 66 73  ime() - t;.  vfs
2420: 6c 6f 67 5f 63 61 6c 6c 28 70 2d 3e 70 56 66 73  log_call(p->pVfs
2430: 6c 6f 67 2c 20 4f 53 5f 43 4c 4f 53 45 2c 20 70  log, OS_CLOSE, p
2440: 2d 3e 69 46 69 6c 65 49 64 2c 20 74 2c 20 72 63  ->iFileId, t, rc
2450: 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  , 0, 0);.  retur
2460: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
2470: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e  ead data from an
2480: 20 76 66 73 6c 6f 67 2d 66 69 6c 65 2e 0a 2a 2f   vfslog-file..*/
2490: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c  .static int vfsl
24a0: 6f 67 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  ogRead(.  sqlite
24b0: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a  3_file *pFile, .
24c0: 20 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20    void *zBuf, . 
24d0: 20 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20 73 71   int iAmt, .  sq
24e0: 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f 66 73 74  lite_int64 iOfst
24f0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
2500: 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 74  sqlite3_uint64 t
2510: 3b 0a 20 20 56 66 73 6c 6f 67 46 69 6c 65 20 2a  ;.  VfslogFile *
2520: 70 20 3d 20 28 56 66 73 6c 6f 67 46 69 6c 65 20  p = (VfslogFile 
2530: 2a 29 70 46 69 6c 65 3b 0a 20 20 74 20 3d 20 76  *)pFile;.  t = v
2540: 66 73 6c 6f 67 5f 74 69 6d 65 28 29 3b 0a 20 20  fslog_time();.  
2550: 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  rc = p->pReal->p
2560: 4d 65 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70  Methods->xRead(p
2570: 2d 3e 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69  ->pReal, zBuf, i
2580: 41 6d 74 2c 20 69 4f 66 73 74 29 3b 0a 20 20 74  Amt, iOfst);.  t
2590: 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29   = vfslog_time()
25a0: 20 2d 20 74 3b 0a 20 20 76 66 73 6c 6f 67 5f 63   - t;.  vfslog_c
25b0: 61 6c 6c 28 70 2d 3e 70 56 66 73 6c 6f 67 2c 20  all(p->pVfslog, 
25c0: 4f 53 5f 52 45 41 44 2c 20 70 2d 3e 69 46 69 6c  OS_READ, p->iFil
25d0: 65 49 64 2c 20 74 2c 20 72 63 2c 20 69 41 6d 74  eId, t, rc, iAmt
25e0: 2c 20 28 69 6e 74 29 69 4f 66 73 74 29 3b 0a 20  , (int)iOfst);. 
25f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2600: 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
2610: 74 6f 20 61 6e 20 76 66 73 6c 6f 67 2d 66 69 6c  to an vfslog-fil
2620: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2630: 20 76 66 73 6c 6f 67 57 72 69 74 65 28 0a 20 20   vfslogWrite(.  
2640: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
2650: 69 6c 65 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  ile,.  const voi
2660: 64 20 2a 7a 2c 0a 20 20 69 6e 74 20 69 41 6d 74  d *z,.  int iAmt
2670: 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  ,.  sqlite_int64
2680: 20 69 4f 66 73 74 0a 29 7b 0a 20 20 69 6e 74 20   iOfst.){.  int 
2690: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75 69  rc;.  sqlite3_ui
26a0: 6e 74 36 34 20 74 3b 0a 20 20 56 66 73 6c 6f 67  nt64 t;.  Vfslog
26b0: 46 69 6c 65 20 2a 70 20 3d 20 28 56 66 73 6c 6f  File *p = (Vfslo
26c0: 67 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  gFile *)pFile;. 
26d0: 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65   t = vfslog_time
26e0: 28 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 70 52  ();.  rc = p->pR
26f0: 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
2700: 57 72 69 74 65 28 70 2d 3e 70 52 65 61 6c 2c 20  Write(p->pReal, 
2710: 7a 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b  z, iAmt, iOfst);
2720: 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69  .  t = vfslog_ti
2730: 6d 65 28 29 20 2d 20 74 3b 0a 20 20 76 66 73 6c  me() - t;.  vfsl
2740: 6f 67 5f 63 61 6c 6c 28 70 2d 3e 70 56 66 73 6c  og_call(p->pVfsl
2750: 6f 67 2c 20 4f 53 5f 57 52 49 54 45 2c 20 70 2d  og, OS_WRITE, p-
2760: 3e 69 46 69 6c 65 49 64 2c 20 74 2c 20 72 63 2c  >iFileId, t, rc,
2770: 20 69 41 6d 74 2c 20 28 69 6e 74 29 69 4f 66 73   iAmt, (int)iOfs
2780: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  t);.  return rc;
2790: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
27a0: 74 65 20 61 6e 20 76 66 73 6c 6f 67 2d 66 69 6c  te an vfslog-fil
27b0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
27c0: 20 76 66 73 6c 6f 67 54 72 75 6e 63 61 74 65 28   vfslogTruncate(
27d0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
27e0: 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36  ile, sqlite_int6
27f0: 34 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  4 size){.  int r
2800: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e  c;.  sqlite3_uin
2810: 74 36 34 20 74 3b 0a 20 20 56 66 73 6c 6f 67 46  t64 t;.  VfslogF
2820: 69 6c 65 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67  ile *p = (Vfslog
2830: 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  File *)pFile;.  
2840: 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28  t = vfslog_time(
2850: 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 70 52 65  );.  rc = p->pRe
2860: 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 54  al->pMethods->xT
2870: 72 75 6e 63 61 74 65 28 70 2d 3e 70 52 65 61 6c  runcate(p->pReal
2880: 2c 20 73 69 7a 65 29 3b 0a 20 20 74 20 3d 20 76  , size);.  t = v
2890: 66 73 6c 6f 67 5f 74 69 6d 65 28 29 20 2d 20 74  fslog_time() - t
28a0: 3b 0a 20 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28  ;.  vfslog_call(
28b0: 70 2d 3e 70 56 66 73 6c 6f 67 2c 20 4f 53 5f 54  p->pVfslog, OS_T
28c0: 52 55 4e 43 41 54 45 2c 20 70 2d 3e 69 46 69 6c  RUNCATE, p->iFil
28d0: 65 49 64 2c 20 74 2c 20 72 63 2c 20 30 2c 20 28  eId, t, rc, 0, (
28e0: 69 6e 74 29 73 69 7a 65 29 3b 0a 20 20 72 65 74  int)size);.  ret
28f0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2900: 20 53 79 6e 63 20 61 6e 20 76 66 73 6c 6f 67 2d   Sync an vfslog-
2910: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
2920: 69 6e 74 20 76 66 73 6c 6f 67 53 79 6e 63 28 73  int vfslogSync(s
2930: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
2940: 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  le, int flags){.
2950: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
2960: 74 65 33 5f 75 69 6e 74 36 34 20 74 3b 0a 20 20  te3_uint64 t;.  
2970: 56 66 73 6c 6f 67 46 69 6c 65 20 2a 70 20 3d 20  VfslogFile *p = 
2980: 28 56 66 73 6c 6f 67 46 69 6c 65 20 2a 29 70 46  (VfslogFile *)pF
2990: 69 6c 65 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f  ile;.  t = vfslo
29a0: 67 5f 74 69 6d 65 28 29 3b 0a 20 20 72 63 20 3d  g_time();.  rc =
29b0: 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68   p->pReal->pMeth
29c0: 6f 64 73 2d 3e 78 53 79 6e 63 28 70 2d 3e 70 52  ods->xSync(p->pR
29d0: 65 61 6c 2c 20 66 6c 61 67 73 29 3b 0a 20 20 74  eal, flags);.  t
29e0: 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29   = vfslog_time()
29f0: 20 2d 20 74 3b 0a 20 20 76 66 73 6c 6f 67 5f 63   - t;.  vfslog_c
2a00: 61 6c 6c 28 70 2d 3e 70 56 66 73 6c 6f 67 2c 20  all(p->pVfslog, 
2a10: 4f 53 5f 53 59 4e 43 2c 20 70 2d 3e 69 46 69 6c  OS_SYNC, p->iFil
2a20: 65 49 64 2c 20 74 2c 20 72 63 2c 20 66 6c 61 67  eId, t, rc, flag
2a30: 73 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  s, 0);.  return 
2a40: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
2a50: 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
2a60: 66 69 6c 65 2d 73 69 7a 65 20 6f 66 20 61 6e 20  file-size of an 
2a70: 76 66 73 6c 6f 67 2d 66 69 6c 65 2e 0a 2a 2f 0a  vfslog-file..*/.
2a80: 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f  static int vfslo
2a90: 67 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  gFileSize(sqlite
2aa0: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73  3_file *pFile, s
2ab0: 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 53 69  qlite_int64 *pSi
2ac0: 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ze){.  int rc;. 
2ad0: 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20   sqlite3_uint64 
2ae0: 74 3b 0a 20 20 56 66 73 6c 6f 67 46 69 6c 65 20  t;.  VfslogFile 
2af0: 2a 70 20 3d 20 28 56 66 73 6c 6f 67 46 69 6c 65  *p = (VfslogFile
2b00: 20 2a 29 70 46 69 6c 65 3b 0a 20 20 74 20 3d 20   *)pFile;.  t = 
2b10: 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29 3b 0a 20  vfslog_time();. 
2b20: 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e   rc = p->pReal->
2b30: 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c 65 53  pMethods->xFileS
2b40: 69 7a 65 28 70 2d 3e 70 52 65 61 6c 2c 20 70 53  ize(p->pReal, pS
2b50: 69 7a 65 29 3b 0a 20 20 74 20 3d 20 76 66 73 6c  ize);.  t = vfsl
2b60: 6f 67 5f 74 69 6d 65 28 29 20 2d 20 74 3b 0a 20  og_time() - t;. 
2b70: 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70 2d 3e   vfslog_call(p->
2b80: 70 56 66 73 6c 6f 67 2c 20 4f 53 5f 46 49 4c 45  pVfslog, OS_FILE
2b90: 53 49 5a 45 2c 20 70 2d 3e 69 46 69 6c 65 49 64  SIZE, p->iFileId
2ba0: 2c 20 74 2c 20 72 63 2c 20 30 2c 20 28 69 6e 74  , t, rc, 0, (int
2bb0: 29 2a 70 53 69 7a 65 29 3b 0a 20 20 72 65 74 75  )*pSize);.  retu
2bc0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2bd0: 4c 6f 63 6b 20 61 6e 20 76 66 73 6c 6f 67 2d 66  Lock an vfslog-f
2be0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
2bf0: 6e 74 20 76 66 73 6c 6f 67 4c 6f 63 6b 28 73 71  nt vfslogLock(sq
2c00: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
2c10: 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  e, int eLock){. 
2c20: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
2c30: 65 33 5f 75 69 6e 74 36 34 20 74 3b 0a 20 20 56  e3_uint64 t;.  V
2c40: 66 73 6c 6f 67 46 69 6c 65 20 2a 70 20 3d 20 28  fslogFile *p = (
2c50: 56 66 73 6c 6f 67 46 69 6c 65 20 2a 29 70 46 69  VfslogFile *)pFi
2c60: 6c 65 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67  le;.  t = vfslog
2c70: 5f 74 69 6d 65 28 29 3b 0a 20 20 72 63 20 3d 20  _time();.  rc = 
2c80: 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
2c90: 64 73 2d 3e 78 4c 6f 63 6b 28 70 2d 3e 70 52 65  ds->xLock(p->pRe
2ca0: 61 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 74 20  al, eLock);.  t 
2cb0: 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29 20  = vfslog_time() 
2cc0: 2d 20 74 3b 0a 20 20 76 66 73 6c 6f 67 5f 63 61  - t;.  vfslog_ca
2cd0: 6c 6c 28 70 2d 3e 70 56 66 73 6c 6f 67 2c 20 4f  ll(p->pVfslog, O
2ce0: 53 5f 4c 4f 43 4b 2c 20 70 2d 3e 69 46 69 6c 65  S_LOCK, p->iFile
2cf0: 49 64 2c 20 74 2c 20 72 63 2c 20 65 4c 6f 63 6b  Id, t, rc, eLock
2d00: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  , 0);.  return r
2d10: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  c;.}../*.** Unlo
2d20: 63 6b 20 61 6e 20 76 66 73 6c 6f 67 2d 66 69 6c  ck an vfslog-fil
2d30: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2d40: 20 76 66 73 6c 6f 67 55 6e 6c 6f 63 6b 28 73 71   vfslogUnlock(sq
2d50: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
2d60: 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  e, int eLock){. 
2d70: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
2d80: 65 33 5f 75 69 6e 74 36 34 20 74 3b 0a 20 20 56  e3_uint64 t;.  V
2d90: 66 73 6c 6f 67 46 69 6c 65 20 2a 70 20 3d 20 28  fslogFile *p = (
2da0: 56 66 73 6c 6f 67 46 69 6c 65 20 2a 29 70 46 69  VfslogFile *)pFi
2db0: 6c 65 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67  le;.  t = vfslog
2dc0: 5f 74 69 6d 65 28 29 3b 0a 20 20 72 63 20 3d 20  _time();.  rc = 
2dd0: 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
2de0: 64 73 2d 3e 78 55 6e 6c 6f 63 6b 28 70 2d 3e 70  ds->xUnlock(p->p
2df0: 52 65 61 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20  Real, eLock);.  
2e00: 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28  t = vfslog_time(
2e10: 29 20 2d 20 74 3b 0a 20 20 76 66 73 6c 6f 67 5f  ) - t;.  vfslog_
2e20: 63 61 6c 6c 28 70 2d 3e 70 56 66 73 6c 6f 67 2c  call(p->pVfslog,
2e30: 20 4f 53 5f 55 4e 4c 4f 43 4b 2c 20 70 2d 3e 69   OS_UNLOCK, p->i
2e40: 46 69 6c 65 49 64 2c 20 74 2c 20 72 63 2c 20 65  FileId, t, rc, e
2e50: 4c 6f 63 6b 2c 20 30 29 3b 0a 20 20 72 65 74 75  Lock, 0);.  retu
2e60: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2e70: 43 68 65 63 6b 20 69 66 20 61 6e 6f 74 68 65 72  Check if another
2e80: 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20 68 6f 6c   file-handle hol
2e90: 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
2ea0: 63 6b 20 6f 6e 20 61 6e 20 76 66 73 6c 6f 67 2d  ck on an vfslog-
2eb0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
2ec0: 69 6e 74 20 76 66 73 6c 6f 67 43 68 65 63 6b 52  int vfslogCheckR
2ed0: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
2ee0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
2ef0: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
2f00: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
2f10: 74 65 33 5f 75 69 6e 74 36 34 20 74 3b 0a 20 20  te3_uint64 t;.  
2f20: 56 66 73 6c 6f 67 46 69 6c 65 20 2a 70 20 3d 20  VfslogFile *p = 
2f30: 28 56 66 73 6c 6f 67 46 69 6c 65 20 2a 29 70 46  (VfslogFile *)pF
2f40: 69 6c 65 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f  ile;.  t = vfslo
2f50: 67 5f 74 69 6d 65 28 29 3b 0a 20 20 72 63 20 3d  g_time();.  rc =
2f60: 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68   p->pReal->pMeth
2f70: 6f 64 73 2d 3e 78 43 68 65 63 6b 52 65 73 65 72  ods->xCheckReser
2f80: 76 65 64 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c  vedLock(p->pReal
2f90: 2c 20 70 52 65 73 4f 75 74 29 3b 0a 20 20 74 20  , pResOut);.  t 
2fa0: 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29 20  = vfslog_time() 
2fb0: 2d 20 74 3b 0a 20 20 76 66 73 6c 6f 67 5f 63 61  - t;.  vfslog_ca
2fc0: 6c 6c 28 70 2d 3e 70 56 66 73 6c 6f 67 2c 20 4f  ll(p->pVfslog, O
2fd0: 53 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  S_CHECKRESERVEDL
2fe0: 4f 43 4b 2c 20 70 2d 3e 69 46 69 6c 65 49 64 2c  OCK, p->iFileId,
2ff0: 20 74 2c 20 72 63 2c 20 2a 70 52 65 73 4f 75 74   t, rc, *pResOut
3000: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  , 0);.  return r
3010: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 65  c;.}../*.** File
3020: 20 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 2e   control method.
3030: 20 46 6f 72 20 63 75 73 74 6f 6d 20 6f 70 65 72   For custom oper
3040: 61 74 69 6f 6e 73 20 6f 6e 20 61 6e 20 76 66 73  ations on an vfs
3050: 6c 6f 67 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  log-file..*/.sta
3060: 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 46 69  tic int vfslogFi
3070: 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
3080: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
3090: 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
30a0: 67 29 7b 0a 20 20 56 66 73 6c 6f 67 46 69 6c 65  g){.  VfslogFile
30b0: 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67 46 69 6c   *p = (VfslogFil
30c0: 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74  e *)pFile;.  ret
30d0: 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  urn p->pReal->pM
30e0: 65 74 68 6f 64 73 2d 3e 78 46 69 6c 65 43 6f 6e  ethods->xFileCon
30f0: 74 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20 6f  trol(p->pReal, o
3100: 70 2c 20 70 41 72 67 29 3b 0a 7d 0a 0a 2f 2a 0a  p, pArg);.}../*.
3110: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
3120: 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 62 79 74  ctor-size in byt
3130: 65 73 20 66 6f 72 20 61 6e 20 76 66 73 6c 6f 67  es for an vfslog
3140: 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
3150: 20 69 6e 74 20 76 66 73 6c 6f 67 53 65 63 74 6f   int vfslogSecto
3160: 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
3170: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
3180: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
3190: 75 69 6e 74 36 34 20 74 3b 0a 20 20 56 66 73 6c  uint64 t;.  Vfsl
31a0: 6f 67 46 69 6c 65 20 2a 70 20 3d 20 28 56 66 73  ogFile *p = (Vfs
31b0: 6c 6f 67 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  logFile *)pFile;
31c0: 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69  .  t = vfslog_ti
31d0: 6d 65 28 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e  me();.  rc = p->
31e0: 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
31f0: 3e 78 53 65 63 74 6f 72 53 69 7a 65 28 70 2d 3e  >xSectorSize(p->
3200: 70 52 65 61 6c 29 3b 0a 20 20 74 20 3d 20 76 66  pReal);.  t = vf
3210: 73 6c 6f 67 5f 74 69 6d 65 28 29 20 2d 20 74 3b  slog_time() - t;
3220: 0a 20 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70  .  vfslog_call(p
3230: 2d 3e 70 56 66 73 6c 6f 67 2c 20 4f 53 5f 53 45  ->pVfslog, OS_SE
3240: 43 54 4f 52 53 49 5a 45 2c 20 70 2d 3e 69 46 69  CTORSIZE, p->iFi
3250: 6c 65 49 64 2c 20 74 2c 20 72 63 2c 20 30 2c 20  leId, t, rc, 0, 
3260: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  0);.  return rc;
3270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3280: 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72   the device char
3290: 61 63 74 65 72 69 73 74 69 63 20 66 6c 61 67 73  acteristic flags
32a0: 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 61 6e   supported by an
32b0: 20 76 66 73 6c 6f 67 2d 66 69 6c 65 2e 0a 2a 2f   vfslog-file..*/
32c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c  .static int vfsl
32d0: 6f 67 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ogDeviceCharacte
32e0: 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f  ristics(sqlite3_
32f0: 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
3300: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
3310: 33 5f 75 69 6e 74 36 34 20 74 3b 0a 20 20 56 66  3_uint64 t;.  Vf
3320: 73 6c 6f 67 46 69 6c 65 20 2a 70 20 3d 20 28 56  slogFile *p = (V
3330: 66 73 6c 6f 67 46 69 6c 65 20 2a 29 70 46 69 6c  fslogFile *)pFil
3340: 65 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f  e;.  t = vfslog_
3350: 74 69 6d 65 28 29 3b 0a 20 20 72 63 20 3d 20 70  time();.  rc = p
3360: 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
3370: 73 2d 3e 78 44 65 76 69 63 65 43 68 61 72 61 63  s->xDeviceCharac
3380: 74 65 72 69 73 74 69 63 73 28 70 2d 3e 70 52 65  teristics(p->pRe
3390: 61 6c 29 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f  al);.  t = vfslo
33a0: 67 5f 74 69 6d 65 28 29 20 2d 20 74 3b 0a 20 20  g_time() - t;.  
33b0: 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70 2d 3e 70  vfslog_call(p->p
33c0: 56 66 73 6c 6f 67 2c 20 4f 53 5f 44 45 56 43 48  Vfslog, OS_DEVCH
33d0: 41 52 2c 20 70 2d 3e 69 46 69 6c 65 49 64 2c 20  AR, p->iFileId, 
33e0: 74 2c 20 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20  t, rc, 0, 0);.  
33f0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
3400: 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 53  atic int vfslogS
3410: 68 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  hmLock(sqlite3_f
3420: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
3430: 6f 66 73 74 2c 20 69 6e 74 20 6e 2c 20 69 6e 74  ofst, int n, int
3440: 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72   flags){.  int r
3450: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e  c;.  sqlite3_uin
3460: 74 36 34 20 74 3b 0a 20 20 56 66 73 6c 6f 67 46  t64 t;.  VfslogF
3470: 69 6c 65 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67  ile *p = (Vfslog
3480: 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  File *)pFile;.  
3490: 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28  t = vfslog_time(
34a0: 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 70 52 65  );.  rc = p->pRe
34b0: 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53  al->pMethods->xS
34c0: 68 6d 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c  hmLock(p->pReal,
34d0: 20 6f 66 73 74 2c 20 6e 2c 20 66 6c 61 67 73 29   ofst, n, flags)
34e0: 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74  ;.  t = vfslog_t
34f0: 69 6d 65 28 29 20 2d 20 74 3b 0a 20 20 76 66 73  ime() - t;.  vfs
3500: 6c 6f 67 5f 63 61 6c 6c 28 70 2d 3e 70 56 66 73  log_call(p->pVfs
3510: 6c 6f 67 2c 20 4f 53 5f 53 48 4d 4c 4f 43 4b 2c  log, OS_SHMLOCK,
3520: 20 70 2d 3e 69 46 69 6c 65 49 64 2c 20 74 2c 20   p->iFileId, t, 
3530: 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74  rc, 0, 0);.  ret
3540: 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
3550: 20 69 6e 74 20 76 66 73 6c 6f 67 53 68 6d 4d 61   int vfslogShmMa
3560: 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
3570: 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 69 6e 74  e *pFile, .  int
3580: 20 69 52 65 67 69 6f 6e 2c 20 0a 20 20 69 6e 74   iRegion, .  int
3590: 20 73 7a 52 65 67 69 6f 6e 2c 20 0a 20 20 69 6e   szRegion, .  in
35a0: 74 20 69 73 57 72 69 74 65 2c 20 0a 20 20 76 6f  t isWrite, .  vo
35b0: 6c 61 74 69 6c 65 20 76 6f 69 64 20 2a 2a 70 70  latile void **pp
35c0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
35d0: 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 74  sqlite3_uint64 t
35e0: 3b 0a 20 20 56 66 73 6c 6f 67 46 69 6c 65 20 2a  ;.  VfslogFile *
35f0: 70 20 3d 20 28 56 66 73 6c 6f 67 46 69 6c 65 20  p = (VfslogFile 
3600: 2a 29 70 46 69 6c 65 3b 0a 20 20 74 20 3d 20 76  *)pFile;.  t = v
3610: 66 73 6c 6f 67 5f 74 69 6d 65 28 29 3b 0a 20 20  fslog_time();.  
3620: 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  rc = p->pReal->p
3630: 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70  Methods->xShmMap
3640: 28 70 2d 3e 70 52 65 61 6c 2c 20 69 52 65 67 69  (p->pReal, iRegi
3650: 6f 6e 2c 20 73 7a 52 65 67 69 6f 6e 2c 20 69 73  on, szRegion, is
3660: 57 72 69 74 65 2c 20 70 70 29 3b 0a 20 20 74 20  Write, pp);.  t 
3670: 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29 20  = vfslog_time() 
3680: 2d 20 74 3b 0a 20 20 76 66 73 6c 6f 67 5f 63 61  - t;.  vfslog_ca
3690: 6c 6c 28 70 2d 3e 70 56 66 73 6c 6f 67 2c 20 4f  ll(p->pVfslog, O
36a0: 53 5f 53 48 4d 4d 41 50 2c 20 70 2d 3e 69 46 69  S_SHMMAP, p->iFi
36b0: 6c 65 49 64 2c 20 74 2c 20 72 63 2c 20 30 2c 20  leId, t, rc, 0, 
36c0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  0);.  return rc;
36d0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  .}.static void v
36e0: 66 73 6c 6f 67 53 68 6d 42 61 72 72 69 65 72 28  fslogShmBarrier(
36f0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
3700: 69 6c 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ile){.  sqlite3_
3710: 75 69 6e 74 36 34 20 74 3b 0a 20 20 56 66 73 6c  uint64 t;.  Vfsl
3720: 6f 67 46 69 6c 65 20 2a 70 20 3d 20 28 56 66 73  ogFile *p = (Vfs
3730: 6c 6f 67 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  logFile *)pFile;
3740: 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69  .  t = vfslog_ti
3750: 6d 65 28 29 3b 0a 20 20 70 2d 3e 70 52 65 61 6c  me();.  p->pReal
3760: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d  ->pMethods->xShm
3770: 42 61 72 72 69 65 72 28 70 2d 3e 70 52 65 61 6c  Barrier(p->pReal
3780: 29 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f  );.  t = vfslog_
3790: 74 69 6d 65 28 29 20 2d 20 74 3b 0a 20 20 76 66  time() - t;.  vf
37a0: 73 6c 6f 67 5f 63 61 6c 6c 28 70 2d 3e 70 56 66  slog_call(p->pVf
37b0: 73 6c 6f 67 2c 20 4f 53 5f 53 48 4d 42 41 52 52  slog, OS_SHMBARR
37c0: 49 45 52 2c 20 70 2d 3e 69 46 69 6c 65 49 64 2c  IER, p->iFileId,
37d0: 20 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30   t, SQLITE_OK, 0
37e0: 2c 20 30 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  , 0);.}.static i
37f0: 6e 74 20 76 66 73 6c 6f 67 53 68 6d 55 6e 6d 61  nt vfslogShmUnma
3800: 70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  p(sqlite3_file *
3810: 70 46 69 6c 65 2c 20 69 6e 74 20 64 65 6c 65 74  pFile, int delet
3820: 65 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 72 63  eFlag){.  int rc
3830: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74  ;.  sqlite3_uint
3840: 36 34 20 74 3b 0a 20 20 56 66 73 6c 6f 67 46 69  64 t;.  VfslogFi
3850: 6c 65 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67 46  le *p = (VfslogF
3860: 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 74  ile *)pFile;.  t
3870: 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29   = vfslog_time()
3880: 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61  ;.  rc = p->pRea
3890: 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68  l->pMethods->xSh
38a0: 6d 55 6e 6d 61 70 28 70 2d 3e 70 52 65 61 6c 2c  mUnmap(p->pReal,
38b0: 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20   deleteFlag);.  
38c0: 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28  t = vfslog_time(
38d0: 29 20 2d 20 74 3b 0a 20 20 76 66 73 6c 6f 67 5f  ) - t;.  vfslog_
38e0: 63 61 6c 6c 28 70 2d 3e 70 56 66 73 6c 6f 67 2c  call(p->pVfslog,
38f0: 20 4f 53 5f 53 48 4d 55 4e 4d 41 50 2c 20 70 2d   OS_SHMUNMAP, p-
3900: 3e 69 46 69 6c 65 49 64 2c 20 74 2c 20 72 63 2c  >iFileId, t, rc,
3910: 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e   0, 0);.  return
3920: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f   rc;.}.../*.** O
3930: 70 65 6e 20 61 6e 20 76 66 73 6c 6f 67 20 66 69  pen an vfslog fi
3940: 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  le handle..*/.st
3950: 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 4f  atic int vfslogO
3960: 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
3970: 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73  fs *pVfs,.  cons
3980: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20  t char *zName,. 
3990: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
39a0: 46 69 6c 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67  File,.  int flag
39b0: 73 2c 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c  s,.  int *pOutFl
39c0: 61 67 73 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ags.){.  int rc;
39d0: 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36  .  sqlite3_uint6
39e0: 34 20 74 3b 0a 20 20 56 66 73 6c 6f 67 46 69 6c  4 t;.  VfslogFil
39f0: 65 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67 46 69  e *p = (VfslogFi
3a00: 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 56 66  le *)pFile;.  Vf
3a10: 73 6c 6f 67 56 66 73 20 2a 70 4c 6f 67 20 3d 20  slogVfs *pLog = 
3a20: 28 56 66 73 6c 6f 67 56 66 73 20 2a 29 70 56 66  (VfslogVfs *)pVf
3a30: 73 3b 0a 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65  s;..  pFile->pMe
3a40: 74 68 6f 64 73 20 3d 20 26 76 66 73 6c 6f 67 5f  thods = &vfslog_
3a50: 69 6f 5f 6d 65 74 68 6f 64 73 3b 0a 20 20 70 2d  io_methods;.  p-
3a60: 3e 70 52 65 61 6c 20 3d 20 28 73 71 6c 69 74 65  >pReal = (sqlite
3a70: 33 5f 66 69 6c 65 20 2a 29 26 70 5b 31 5d 3b 0a  3_file *)&p[1];.
3a80: 20 20 70 2d 3e 70 56 66 73 6c 6f 67 20 3d 20 70    p->pVfslog = p
3a90: 56 66 73 3b 0a 20 20 70 2d 3e 69 46 69 6c 65 49  Vfs;.  p->iFileI
3aa0: 64 20 3d 20 2b 2b 70 4c 6f 67 2d 3e 69 4e 65 78  d = ++pLog->iNex
3ab0: 74 46 69 6c 65 49 64 3b 0a 0a 20 20 74 20 3d 20  tFileId;..  t = 
3ac0: 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29 3b 0a 20  vfslog_time();. 
3ad0: 20 72 63 20 3d 20 52 45 41 4c 56 46 53 28 70 56   rc = REALVFS(pV
3ae0: 66 73 29 2d 3e 78 4f 70 65 6e 28 52 45 41 4c 56  fs)->xOpen(REALV
3af0: 46 53 28 70 56 66 73 29 2c 20 7a 4e 61 6d 65 2c  FS(pVfs), zName,
3b00: 20 70 2d 3e 70 52 65 61 6c 2c 20 66 6c 61 67 73   p->pReal, flags
3b10: 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20  , pOutFlags);.  
3b20: 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28  t = vfslog_time(
3b30: 29 20 2d 20 74 3b 0a 0a 20 20 76 66 73 6c 6f 67  ) - t;..  vfslog
3b40: 5f 63 61 6c 6c 28 70 56 66 73 2c 20 4f 53 5f 4f  _call(pVfs, OS_O
3b50: 50 45 4e 2c 20 70 2d 3e 69 46 69 6c 65 49 64 2c  PEN, p->iFileId,
3b60: 20 74 2c 20 72 63 2c 20 30 2c 20 30 29 3b 0a 20   t, rc, 0, 0);. 
3b70: 20 76 66 73 6c 6f 67 5f 73 74 72 69 6e 67 28 70   vfslog_string(p
3b80: 56 66 73 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  Vfs, zName);.  r
3b90: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3ba0: 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69  ** Delete the fi
3bb0: 6c 65 20 6c 6f 63 61 74 65 64 20 61 74 20 7a 50  le located at zP
3bc0: 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53  ath. If the dirS
3bd0: 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ync argument is 
3be0: 74 72 75 65 2c 0a 2a 2a 20 65 6e 73 75 72 65 20  true,.** ensure 
3bf0: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
3c00: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 61 72  modifications ar
3c10: 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  e synced to disk
3c20: 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72   before.** retur
3c30: 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
3c40: 69 6e 74 20 76 66 73 6c 6f 67 44 65 6c 65 74 65  int vfslogDelete
3c50: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
3c60: 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fs, const char *
3c70: 7a 50 61 74 68 2c 20 69 6e 74 20 64 69 72 53 79  zPath, int dirSy
3c80: 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nc){.  int rc;. 
3c90: 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20   sqlite3_uint64 
3ca0: 74 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f  t;.  t = vfslog_
3cb0: 74 69 6d 65 28 29 3b 0a 20 20 72 63 20 3d 20 52  time();.  rc = R
3cc0: 45 41 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 44  EALVFS(pVfs)->xD
3cd0: 65 6c 65 74 65 28 52 45 41 4c 56 46 53 28 70 56  elete(REALVFS(pV
3ce0: 66 73 29 2c 20 7a 50 61 74 68 2c 20 64 69 72 53  fs), zPath, dirS
3cf0: 79 6e 63 29 3b 0a 20 20 74 20 3d 20 76 66 73 6c  ync);.  t = vfsl
3d00: 6f 67 5f 74 69 6d 65 28 29 20 2d 20 74 3b 0a 20  og_time() - t;. 
3d10: 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70 56 66   vfslog_call(pVf
3d20: 73 2c 20 4f 53 5f 44 45 4c 45 54 45 2c 20 30 2c  s, OS_DELETE, 0,
3d30: 20 74 2c 20 72 63 2c 20 64 69 72 53 79 6e 63 2c   t, rc, dirSync,
3d40: 20 30 29 3b 0a 20 20 76 66 73 6c 6f 67 5f 73 74   0);.  vfslog_st
3d50: 72 69 6e 67 28 70 56 66 73 2c 20 7a 50 61 74 68  ring(pVfs, zPath
3d60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
3d70: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 66 6f  }../*.** Test fo
3d80: 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  r access permiss
3d90: 69 6f 6e 73 2e 20 52 65 74 75 72 6e 20 74 72 75  ions. Return tru
3da0: 65 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74  e if the request
3db0: 65 64 20 70 65 72 6d 69 73 73 69 6f 6e 0a 2a 2a  ed permission.**
3dc0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f   is available, o
3dd0: 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
3de0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
3df0: 20 76 66 73 6c 6f 67 41 63 63 65 73 73 28 0a 20   vfslogAccess(. 
3e00: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
3e10: 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  fs, .  const cha
3e20: 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74  r *zPath, .  int
3e30: 20 66 6c 61 67 73 2c 20 0a 20 20 69 6e 74 20 2a   flags, .  int *
3e40: 70 52 65 73 4f 75 74 0a 29 7b 0a 20 20 69 6e 74  pResOut.){.  int
3e50: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75   rc;.  sqlite3_u
3e60: 69 6e 74 36 34 20 74 3b 0a 20 20 74 20 3d 20 76  int64 t;.  t = v
3e70: 66 73 6c 6f 67 5f 74 69 6d 65 28 29 3b 0a 20 20  fslog_time();.  
3e80: 72 63 20 3d 20 52 45 41 4c 56 46 53 28 70 56 66  rc = REALVFS(pVf
3e90: 73 29 2d 3e 78 41 63 63 65 73 73 28 52 45 41 4c  s)->xAccess(REAL
3ea0: 56 46 53 28 70 56 66 73 29 2c 20 7a 50 61 74 68  VFS(pVfs), zPath
3eb0: 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f 75 74  , flags, pResOut
3ec0: 29 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f  );.  t = vfslog_
3ed0: 74 69 6d 65 28 29 20 2d 20 74 3b 0a 20 20 76 66  time() - t;.  vf
3ee0: 73 6c 6f 67 5f 63 61 6c 6c 28 70 56 66 73 2c 20  slog_call(pVfs, 
3ef0: 4f 53 5f 41 43 43 45 53 53 2c 20 30 2c 20 74 2c  OS_ACCESS, 0, t,
3f00: 20 72 63 2c 20 66 6c 61 67 73 2c 20 2a 70 52 65   rc, flags, *pRe
3f10: 73 4f 75 74 29 3b 0a 20 20 76 66 73 6c 6f 67 5f  sOut);.  vfslog_
3f20: 73 74 72 69 6e 67 28 70 56 66 73 2c 20 7a 50 61  string(pVfs, zPa
3f30: 74 68 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  th);.  return rc
3f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c  ;.}../*.** Popul
3f50: 61 74 65 20 62 75 66 66 65 72 20 7a 4f 75 74 20  ate buffer zOut 
3f60: 77 69 74 68 20 74 68 65 20 66 75 6c 6c 20 63 61  with the full ca
3f70: 6e 6f 6e 69 63 61 6c 20 70 61 74 68 6e 61 6d 65  nonical pathname
3f80: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
3f90: 2a 20 74 6f 20 74 68 65 20 70 61 74 68 6e 61 6d  * to the pathnam
3fa0: 65 20 69 6e 20 7a 50 61 74 68 2e 20 7a 4f 75 74  e in zPath. zOut
3fb0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
3fc0: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
3fd0: 66 65 72 0a 2a 2a 20 6f 66 20 61 74 20 6c 65 61  fer.** of at lea
3fe0: 73 74 20 28 49 4e 53 54 5f 4d 41 58 5f 50 41 54  st (INST_MAX_PAT
3ff0: 48 4e 41 4d 45 2b 31 29 20 62 79 74 65 73 2e 0a  HNAME+1) bytes..
4000: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  */.static int vf
4010: 73 6c 6f 67 46 75 6c 6c 50 61 74 68 6e 61 6d 65  slogFullPathname
4020: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
4030: 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20  *pVfs, .  const 
4040: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20  char *zPath, .  
4050: 69 6e 74 20 6e 4f 75 74 2c 20 0a 20 20 63 68 61  int nOut, .  cha
4060: 72 20 2a 7a 4f 75 74 0a 29 7b 0a 20 20 72 65 74  r *zOut.){.  ret
4070: 75 72 6e 20 52 45 41 4c 56 46 53 28 70 56 66 73  urn REALVFS(pVfs
4080: 29 2d 3e 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  )->xFullPathname
4090: 28 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20  (REALVFS(pVfs), 
40a0: 7a 50 61 74 68 2c 20 6e 4f 75 74 2c 20 7a 4f 75  zPath, nOut, zOu
40b0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  t);.}../*.** Ope
40c0: 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69  n the dynamic li
40d0: 62 72 61 72 79 20 6c 6f 63 61 74 65 64 20 61 74  brary located at
40e0: 20 7a 50 61 74 68 20 61 6e 64 20 72 65 74 75 72   zPath and retur
40f0: 6e 20 61 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  n a handle..*/.s
4100: 74 61 74 69 63 20 76 6f 69 64 20 2a 76 66 73 6c  tatic void *vfsl
4110: 6f 67 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  ogDlOpen(sqlite3
4120: 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73  _vfs *pVfs, cons
4130: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 29 7b 0a  t char *zPath){.
4140: 20 20 72 65 74 75 72 6e 20 52 45 41 4c 56 46 53    return REALVFS
4150: 28 70 56 66 73 29 2d 3e 78 44 6c 4f 70 65 6e 28  (pVfs)->xDlOpen(
4160: 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20 7a  REALVFS(pVfs), z
4170: 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Path);.}../*.** 
4180: 50 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75 66  Populate the buf
4190: 66 65 72 20 7a 45 72 72 4d 73 67 20 28 73 69 7a  fer zErrMsg (siz
41a0: 65 20 6e 42 79 74 65 20 62 79 74 65 73 29 20 77  e nByte bytes) w
41b0: 69 74 68 20 61 20 68 75 6d 61 6e 20 72 65 61 64  ith a human read
41c0: 61 62 6c 65 0a 2a 2a 20 75 74 66 2d 38 20 73 74  able.** utf-8 st
41d0: 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20  ring describing 
41e0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
41f0: 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
4200: 64 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a  d associated .**
4210: 20 77 69 74 68 20 64 79 6e 61 6d 69 63 20 6c 69   with dynamic li
4220: 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  braries..*/.stat
4230: 69 63 20 76 6f 69 64 20 76 66 73 6c 6f 67 44 6c  ic void vfslogDl
4240: 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
4250: 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79  s *pVfs, int nBy
4260: 74 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  te, char *zErrMs
4270: 67 29 7b 0a 20 20 52 45 41 4c 56 46 53 28 70 56  g){.  REALVFS(pV
4280: 66 73 29 2d 3e 78 44 6c 45 72 72 6f 72 28 52 45  fs)->xDlError(RE
4290: 41 4c 56 46 53 28 70 56 66 73 29 2c 20 6e 42 79  ALVFS(pVfs), nBy
42a0: 74 65 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 7d 0a  te, zErrMsg);.}.
42b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
42c0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
42d0: 79 6d 62 6f 6c 20 7a 53 79 6d 62 6f 6c 20 69 6e  ymbol zSymbol in
42e0: 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62   the dynamic lib
42f0: 72 61 72 79 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f  rary pHandle..*/
4300: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 76  .static void (*v
4310: 66 73 6c 6f 67 44 6c 53 79 6d 28 73 71 6c 69 74  fslogDlSym(sqlit
4320: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
4330: 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  id *p, const cha
4340: 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b  r *zSym))(void){
4350: 0a 20 20 72 65 74 75 72 6e 20 52 45 41 4c 56 46  .  return REALVF
4360: 53 28 70 56 66 73 29 2d 3e 78 44 6c 53 79 6d 28  S(pVfs)->xDlSym(
4370: 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20 70  REALVFS(pVfs), p
4380: 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , zSym);.}../*.*
4390: 2a 20 43 6c 6f 73 65 20 74 68 65 20 64 79 6e 61  * Close the dyna
43a0: 6d 69 63 20 6c 69 62 72 61 72 79 20 68 61 6e 64  mic library hand
43b0: 6c 65 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  le pHandle..*/.s
43c0: 74 61 74 69 63 20 76 6f 69 64 20 76 66 73 6c 6f  tatic void vfslo
43d0: 67 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  gDlClose(sqlite3
43e0: 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
43f0: 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 52 45   *pHandle){.  RE
4400: 41 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 44 6c  ALVFS(pVfs)->xDl
4410: 43 6c 6f 73 65 28 52 45 41 4c 56 46 53 28 70 56  Close(REALVFS(pV
4420: 66 73 29 2c 20 70 48 61 6e 64 6c 65 29 3b 0a 7d  fs), pHandle);.}
4430: 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ../*.** Populate
4440: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
4450: 74 65 64 20 74 6f 20 62 79 20 7a 42 75 66 4f 75  ted to by zBufOu
4460: 74 20 77 69 74 68 20 6e 42 79 74 65 20 62 79 74  t with nByte byt
4470: 65 73 20 6f 66 20 0a 2a 2a 20 72 61 6e 64 6f 6d  es of .** random
4480: 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
4490: 20 69 6e 74 20 76 66 73 6c 6f 67 52 61 6e 64 6f   int vfslogRando
44a0: 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
44b0: 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79  s *pVfs, int nBy
44c0: 74 65 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  te, char *zBufOu
44d0: 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 45 41  t){.  return REA
44e0: 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 52 61 6e  LVFS(pVfs)->xRan
44f0: 64 6f 6d 6e 65 73 73 28 52 45 41 4c 56 46 53 28  domness(REALVFS(
4500: 70 56 66 73 29 2c 20 6e 42 79 74 65 2c 20 7a 42  pVfs), nByte, zB
4510: 75 66 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ufOut);.}../*.**
4520: 20 53 6c 65 65 70 20 66 6f 72 20 6e 4d 69 63 72   Sleep for nMicr
4530: 6f 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20  o microseconds. 
4540: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
4550: 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
4560: 73 20 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 73  s .** actually s
4570: 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lept..*/.static 
4580: 69 6e 74 20 76 66 73 6c 6f 67 53 6c 65 65 70 28  int vfslogSleep(
4590: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
45a0: 73 2c 20 69 6e 74 20 6e 4d 69 63 72 6f 29 7b 0a  s, int nMicro){.
45b0: 20 20 72 65 74 75 72 6e 20 52 45 41 4c 56 46 53    return REALVFS
45c0: 28 70 56 66 73 29 2d 3e 78 53 6c 65 65 70 28 52  (pVfs)->xSleep(R
45d0: 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20 6e 4d  EALVFS(pVfs), nM
45e0: 69 63 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  icro);.}../*.** 
45f0: 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
4600: 6e 74 20 74 69 6d 65 20 61 73 20 61 20 4a 75 6c  nt time as a Jul
4610: 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
4620: 6e 20 2a 70 54 69 6d 65 4f 75 74 2e 0a 2a 2f 0a  n *pTimeOut..*/.
4630: 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f  static int vfslo
4640: 67 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  gCurrentTime(sql
4650: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
4660: 64 6f 75 62 6c 65 20 2a 70 54 69 6d 65 4f 75 74  double *pTimeOut
4670: 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 45 41 4c  ){.  return REAL
4680: 56 46 53 28 70 56 66 73 29 2d 3e 78 43 75 72 72  VFS(pVfs)->xCurr
4690: 65 6e 74 54 69 6d 65 28 52 45 41 4c 56 46 53 28  entTime(REALVFS(
46a0: 70 56 66 73 29 2c 20 70 54 69 6d 65 4f 75 74 29  pVfs), pTimeOut)
46b0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
46c0: 76 66 73 6c 6f 67 47 65 74 4c 61 73 74 45 72 72  vfslogGetLastErr
46d0: 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
46e0: 70 56 66 73 2c 20 69 6e 74 20 61 2c 20 63 68 61  pVfs, int a, cha
46f0: 72 20 2a 62 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *b){.  return 
4700: 52 45 41 4c 56 46 53 28 70 56 66 73 29 2d 3e 78  REALVFS(pVfs)->x
4710: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 52 45 41  GetLastError(REA
4720: 4c 56 46 53 28 70 56 66 73 29 2c 20 61 2c 20 62  LVFS(pVfs), a, b
4730: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  );.}.static int 
4740: 76 66 73 6c 6f 67 43 75 72 72 65 6e 74 54 69 6d  vfslogCurrentTim
4750: 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76  eInt64(sqlite3_v
4760: 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65  fs *pVfs, sqlite
4770: 33 5f 69 6e 74 36 34 20 2a 70 29 7b 0a 20 20 72  3_int64 *p){.  r
4780: 65 74 75 72 6e 20 52 45 41 4c 56 46 53 28 70 56  eturn REALVFS(pV
4790: 66 73 29 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d  fs)->xCurrentTim
47a0: 65 49 6e 74 36 34 28 52 45 41 4c 56 46 53 28 70  eInt64(REALVFS(p
47b0: 56 66 73 29 2c 20 70 29 3b 0a 7d 0a 0a 73 74 61  Vfs), p);.}..sta
47c0: 74 69 63 20 76 6f 69 64 20 76 66 73 6c 6f 67 5f  tic void vfslog_
47d0: 66 6c 75 73 68 28 56 66 73 6c 6f 67 56 66 73 20  flush(VfslogVfs 
47e0: 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
47f0: 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72 6e  TE_TEST.  extern
4800: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
4810: 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
4820: 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
4830: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 72  te3_io_error_per
4840: 73 69 73 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  sist;.  extern i
4850: 6e 74 20 73 71 6c 69 74 65 33 5f 64 69 73 6b 66  nt sqlite3_diskf
4860: 75 6c 6c 5f 70 65 6e 64 69 6e 67 3b 0a 0a 20 20  ull_pending;..  
4870: 69 6e 74 20 70 65 6e 64 69 6e 67 20 3d 20 73 71  int pending = sq
4880: 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
4890: 65 6e 64 69 6e 67 3b 0a 20 20 69 6e 74 20 70 65  ending;.  int pe
48a0: 72 73 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f  rsist = sqlite3_
48b0: 69 6f 5f 65 72 72 6f 72 5f 70 65 72 73 69 73 74  io_error_persist
48c0: 3b 0a 20 20 69 6e 74 20 64 69 73 6b 66 75 6c 6c  ;.  int diskfull
48d0: 20 3d 20 73 71 6c 69 74 65 33 5f 64 69 73 6b 66   = sqlite3_diskf
48e0: 75 6c 6c 5f 70 65 6e 64 69 6e 67 3b 0a 0a 20 20  ull_pending;..  
48f0: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
4900: 5f 70 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20  _pending = 0;.  
4910: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
4920: 5f 70 65 72 73 69 73 74 20 3d 20 30 3b 0a 20 20  _persist = 0;.  
4930: 73 71 6c 69 74 65 33 5f 64 69 73 6b 66 75 6c 6c  sqlite3_diskfull
4940: 5f 70 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 23 65  _pending = 0;.#e
4950: 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 2d 3e 6e  ndif..  if( p->n
4960: 42 75 66 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c  Buf ){.    p->pL
4970: 6f 67 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 57  og->pMethods->xW
4980: 72 69 74 65 28 70 2d 3e 70 4c 6f 67 2c 20 70 2d  rite(p->pLog, p-
4990: 3e 61 42 75 66 2c 20 70 2d 3e 6e 42 75 66 2c 20  >aBuf, p->nBuf, 
49a0: 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  p->iOffset);.   
49b0: 20 70 2d 3e 69 4f 66 66 73 65 74 20 2b 3d 20 70   p->iOffset += p
49c0: 2d 3e 6e 42 75 66 3b 0a 20 20 20 20 70 2d 3e 6e  ->nBuf;.    p->n
49d0: 42 75 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 23 69  Buf = 0;.  }..#i
49e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
49f0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
4a00: 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 70 65  ror_pending = pe
4a10: 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
4a20: 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 72 73 69 73  _io_error_persis
4a30: 74 20 3d 20 70 65 72 73 69 73 74 3b 0a 20 20 73  t = persist;.  s
4a40: 71 6c 69 74 65 33 5f 64 69 73 6b 66 75 6c 6c 5f  qlite3_diskfull_
4a50: 70 65 6e 64 69 6e 67 20 3d 20 64 69 73 6b 66 75  pending = diskfu
4a60: 6c 6c 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 73 74  ll;.#endif.}..st
4a70: 61 74 69 63 20 76 6f 69 64 20 70 75 74 33 32 62  atic void put32b
4a80: 69 74 73 28 75 6e 73 69 67 6e 65 64 20 63 68 61  its(unsigned cha
4a90: 72 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64 20 69  r *p, unsigned i
4aa0: 6e 74 20 76 29 7b 0a 20 20 70 5b 30 5d 20 3d 20  nt v){.  p[0] = 
4ab0: 76 3e 3e 32 34 3b 0a 20 20 70 5b 31 5d 20 3d 20  v>>24;.  p[1] = 
4ac0: 76 3e 3e 31 36 3b 0a 20 20 70 5b 32 5d 20 3d 20  v>>16;.  p[2] = 
4ad0: 76 3e 3e 38 3b 0a 20 20 70 5b 33 5d 20 3d 20 76  v>>8;.  p[3] = v
4ae0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
4af0: 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 0a 20 20   vfslog_call(.  
4b00: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
4b10: 73 2c 0a 20 20 69 6e 74 20 65 45 76 65 6e 74 2c  s,.  int eEvent,
4b20: 0a 20 20 69 6e 74 20 69 46 69 6c 65 69 64 2c 0a  .  int iFileid,.
4b30: 20 20 69 6e 74 20 6e 43 6c 69 63 6b 2c 0a 20 20    int nClick,.  
4b40: 69 6e 74 20 72 65 74 75 72 6e 5f 63 6f 64 65 2c  int return_code,
4b50: 0a 20 20 69 6e 74 20 73 69 7a 65 2c 0a 20 20 69  .  int size,.  i
4b60: 6e 74 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 56  nt offset.){.  V
4b70: 66 73 6c 6f 67 56 66 73 20 2a 70 20 3d 20 28 56  fslogVfs *p = (V
4b80: 66 73 6c 6f 67 56 66 73 20 2a 29 70 56 66 73 3b  fslogVfs *)pVfs;
4b90: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4ba0: 20 2a 7a 52 65 63 3b 0a 20 20 69 66 28 20 28 32   *zRec;.  if( (2
4bb0: 34 2b 70 2d 3e 6e 42 75 66 29 3e 73 69 7a 65 6f  4+p->nBuf)>sizeo
4bc0: 66 28 70 2d 3e 61 42 75 66 29 20 29 7b 0a 20 20  f(p->aBuf) ){.  
4bd0: 20 20 76 66 73 6c 6f 67 5f 66 6c 75 73 68 28 70    vfslog_flush(p
4be0: 29 3b 0a 20 20 7d 0a 20 20 7a 52 65 63 20 3d 20  );.  }.  zRec = 
4bf0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
4c00: 29 26 70 2d 3e 61 42 75 66 5b 70 2d 3e 6e 42 75  )&p->aBuf[p->nBu
4c10: 66 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  f];.  put32bits(
4c20: 26 7a 52 65 63 5b 30 5d 2c 20 65 45 76 65 6e 74  &zRec[0], eEvent
4c30: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
4c40: 7a 52 65 63 5b 34 5d 2c 20 69 46 69 6c 65 69 64  zRec[4], iFileid
4c50: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
4c60: 7a 52 65 63 5b 38 5d 2c 20 6e 43 6c 69 63 6b 29  zRec[8], nClick)
4c70: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
4c80: 52 65 63 5b 31 32 5d 2c 20 72 65 74 75 72 6e 5f  Rec[12], return_
4c90: 63 6f 64 65 29 3b 0a 20 20 70 75 74 33 32 62 69  code);.  put32bi
4ca0: 74 73 28 26 7a 52 65 63 5b 31 36 5d 2c 20 73 69  ts(&zRec[16], si
4cb0: 7a 65 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  ze);.  put32bits
4cc0: 28 26 7a 52 65 63 5b 32 30 5d 2c 20 6f 66 66 73  (&zRec[20], offs
4cd0: 65 74 29 3b 0a 20 20 70 2d 3e 6e 42 75 66 20 2b  et);.  p->nBuf +
4ce0: 3d 20 32 34 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  = 24;.}..static 
4cf0: 76 6f 69 64 20 76 66 73 6c 6f 67 5f 73 74 72 69  void vfslog_stri
4d00: 6e 67 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ng(sqlite3_vfs *
4d10: 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72  pVfs, const char
4d20: 20 2a 7a 53 74 72 29 7b 0a 20 20 56 66 73 6c 6f   *zStr){.  Vfslo
4d30: 67 56 66 73 20 2a 70 20 3d 20 28 56 66 73 6c 6f  gVfs *p = (Vfslo
4d40: 67 56 66 73 20 2a 29 70 56 66 73 3b 0a 20 20 75  gVfs *)pVfs;.  u
4d50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 52  nsigned char *zR
4d60: 65 63 3b 0a 20 20 69 6e 74 20 6e 53 74 72 20 3d  ec;.  int nStr =
4d70: 20 7a 53 74 72 20 3f 20 73 74 72 6c 65 6e 28 7a   zStr ? strlen(z
4d80: 53 74 72 29 20 3a 20 30 3b 0a 20 20 69 66 28 20  Str) : 0;.  if( 
4d90: 28 34 2b 6e 53 74 72 2b 70 2d 3e 6e 42 75 66 29  (4+nStr+p->nBuf)
4da0: 3e 73 69 7a 65 6f 66 28 70 2d 3e 61 42 75 66 29  >sizeof(p->aBuf)
4db0: 20 29 7b 0a 20 20 20 20 76 66 73 6c 6f 67 5f 66   ){.    vfslog_f
4dc0: 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a 20 20 7a  lush(p);.  }.  z
4dd0: 52 65 63 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  Rec = (unsigned 
4de0: 63 68 61 72 20 2a 29 26 70 2d 3e 61 42 75 66 5b  char *)&p->aBuf[
4df0: 70 2d 3e 6e 42 75 66 5d 3b 0a 20 20 70 75 74 33  p->nBuf];.  put3
4e00: 32 62 69 74 73 28 26 7a 52 65 63 5b 30 5d 2c 20  2bits(&zRec[0], 
4e10: 6e 53 74 72 29 3b 0a 20 20 69 66 28 20 7a 53 74  nStr);.  if( zSt
4e20: 72 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  r ){.    memcpy(
4e30: 26 7a 52 65 63 5b 34 5d 2c 20 7a 53 74 72 2c 20  &zRec[4], zStr, 
4e40: 6e 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  nStr);.  }.  p->
4e50: 6e 42 75 66 20 2b 3d 20 28 34 20 2b 20 6e 53 74  nBuf += (4 + nSt
4e60: 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  r);.}..static vo
4e70: 69 64 20 76 66 73 6c 6f 67 5f 66 69 6e 61 6c 69  id vfslog_finali
4e80: 7a 65 28 56 66 73 6c 6f 67 56 66 73 20 2a 70 29  ze(VfslogVfs *p)
4e90: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67 2d  {.  if( p->pLog-
4ea0: 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
4eb0: 20 76 66 73 6c 6f 67 5f 66 6c 75 73 68 28 70 29   vfslog_flush(p)
4ec0: 3b 0a 20 20 20 20 70 2d 3e 70 4c 6f 67 2d 3e 70  ;.    p->pLog->p
4ed0: 4d 65 74 68 6f 64 73 2d 3e 78 43 6c 6f 73 65 28  Methods->xClose(
4ee0: 70 2d 3e 70 4c 6f 67 29 3b 0a 20 20 7d 0a 20 20  p->pLog);.  }.  
4ef0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
4f00: 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .}..int sqlite3_
4f10: 76 66 73 6c 6f 67 5f 66 69 6e 61 6c 69 7a 65 28  vfslog_finalize(
4f20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
4f30: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
4f40: 20 2a 70 56 66 73 3b 0a 20 20 70 56 66 73 20 3d   *pVfs;.  pVfs =
4f50: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
4f60: 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 21  d(zVfs);.  if( !
4f70: 70 56 66 73 20 7c 7c 20 70 56 66 73 2d 3e 78 4f  pVfs || pVfs->xO
4f80: 70 65 6e 21 3d 76 66 73 6c 6f 67 4f 70 65 6e 20  pen!=vfslogOpen 
4f90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4fa0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 20  LITE_ERROR;.  } 
4fb0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75  .  sqlite3_vfs_u
4fc0: 6e 72 65 67 69 73 74 65 72 28 70 56 66 73 29 3b  nregister(pVfs);
4fd0: 0a 20 20 76 66 73 6c 6f 67 5f 66 69 6e 61 6c 69  .  vfslog_finali
4fe0: 7a 65 28 28 56 66 73 6c 6f 67 56 66 73 20 2a 29  ze((VfslogVfs *)
4ff0: 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
5000: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e  SQLITE_OK;.}..in
5010: 74 20 73 71 6c 69 74 65 33 5f 76 66 73 6c 6f 67  t sqlite3_vfslog
5020: 5f 6e 65 77 28 0a 20 20 63 6f 6e 73 74 20 63 68  _new(.  const ch
5030: 61 72 20 2a 7a 56 66 73 2c 20 20 20 20 20 20 20  ar *zVfs,       
5040: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 56          /* New V
5050: 46 53 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e  FS name */.  con
5060: 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74  st char *zParent
5070: 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Vfs,         /* 
5080: 50 61 72 65 6e 74 20 56 46 53 20 6e 61 6d 65 20  Parent VFS name 
5090: 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 63  (or NULL) */.  c
50a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 67 20  onst char *zLog 
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
50c0: 2a 20 4c 6f 67 20 66 69 6c 65 20 6e 61 6d 65 20  * Log file name 
50d0: 2a 2f 0a 29 7b 0a 20 20 56 66 73 6c 6f 67 56 66  */.){.  VfslogVf
50e0: 73 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f  s *p;.  sqlite3_
50f0: 76 66 73 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20  vfs *pParent;.  
5100: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
5110: 20 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 72 63   flags;.  int rc
5120: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  ;.  char *zFile;
5130: 0a 20 20 69 6e 74 20 6e 56 66 73 3b 0a 0a 20 20  .  int nVfs;..  
5140: 70 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74 65  pParent = sqlite
5150: 33 5f 76 66 73 5f 66 69 6e 64 28 7a 50 61 72 65  3_vfs_find(zPare
5160: 6e 74 56 66 73 29 3b 0a 20 20 69 66 28 20 21 70  ntVfs);.  if( !p
5170: 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 72 65  Parent ){.    re
5180: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
5190: 52 3b 0a 20 20 7d 0a 0a 20 20 6e 56 66 73 20 3d  R;.  }..  nVfs =
51a0: 20 73 74 72 6c 65 6e 28 7a 56 66 73 29 3b 0a 20   strlen(zVfs);. 
51b0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
51c0: 56 66 73 6c 6f 67 56 66 73 29 20 2b 20 70 50 61  VfslogVfs) + pPa
51d0: 72 65 6e 74 2d 3e 73 7a 4f 73 46 69 6c 65 20 2b  rent->szOsFile +
51e0: 20 6e 56 66 73 2b 31 2b 70 50 61 72 65 6e 74 2d   nVfs+1+pParent-
51f0: 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
5200: 20 70 20 3d 20 28 56 66 73 6c 6f 67 56 66 73 20   p = (VfslogVfs 
5210: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
5220: 28 6e 42 79 74 65 29 3b 0a 20 20 6d 65 6d 73 65  (nByte);.  memse
5230: 74 28 70 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  t(p, 0, nByte);.
5240: 0a 20 20 70 2d 3e 70 56 66 73 20 3d 20 70 50 61  .  p->pVfs = pPa
5250: 72 65 6e 74 3b 0a 20 20 70 2d 3e 70 4c 6f 67 20  rent;.  p->pLog 
5260: 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
5270: 2a 29 26 70 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70  *)&p[1];.  memcp
5280: 79 28 26 70 2d 3e 62 61 73 65 2c 20 26 76 66 73  y(&p->base, &vfs
5290: 6c 6f 67 5f 76 66 73 2c 20 73 69 7a 65 6f 66 28  log_vfs, sizeof(
52a0: 73 71 6c 69 74 65 33 5f 76 66 73 29 29 3b 0a 20  sqlite3_vfs));. 
52b0: 20 70 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65 20 3d   p->base.zName =
52c0: 20 26 28 28 63 68 61 72 20 2a 29 70 2d 3e 70 4c   &((char *)p->pL
52d0: 6f 67 29 5b 70 50 61 72 65 6e 74 2d 3e 73 7a 4f  og)[pParent->szO
52e0: 73 46 69 6c 65 5d 3b 0a 20 20 70 2d 3e 62 61 73  sFile];.  p->bas
52f0: 65 2e 73 7a 4f 73 46 69 6c 65 20 2b 3d 20 70 50  e.szOsFile += pP
5300: 61 72 65 6e 74 2d 3e 73 7a 4f 73 46 69 6c 65 3b  arent->szOsFile;
5310: 0a 20 20 6d 65 6d 63 70 79 28 28 63 68 61 72 20  .  memcpy((char 
5320: 2a 29 70 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65 2c  *)p->base.zName,
5330: 20 7a 56 66 73 2c 20 6e 56 66 73 29 3b 0a 0a 20   zVfs, nVfs);.. 
5340: 20 7a 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a   zFile = (char *
5350: 29 26 70 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65 5b  )&p->base.zName[
5360: 6e 56 66 73 2b 31 5d 3b 0a 20 20 70 50 61 72 65  nVfs+1];.  pPare
5370: 6e 74 2d 3e 78 46 75 6c 6c 50 61 74 68 6e 61 6d  nt->xFullPathnam
5380: 65 28 70 50 61 72 65 6e 74 2c 20 7a 4c 6f 67 2c  e(pParent, zLog,
5390: 20 70 50 61 72 65 6e 74 2d 3e 6d 78 50 61 74 68   pParent->mxPath
53a0: 6e 61 6d 65 2c 20 7a 46 69 6c 65 29 3b 0a 0a 20  name, zFile);.. 
53b0: 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
53c0: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
53d0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
53e0: 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
53f0: 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  STER_JOURNAL;.  
5400: 70 50 61 72 65 6e 74 2d 3e 78 44 65 6c 65 74 65  pParent->xDelete
5410: 28 70 50 61 72 65 6e 74 2c 20 7a 46 69 6c 65 2c  (pParent, zFile,
5420: 20 30 29 3b 0a 20 20 72 63 20 3d 20 70 50 61 72   0);.  rc = pPar
5430: 65 6e 74 2d 3e 78 4f 70 65 6e 28 70 50 61 72 65  ent->xOpen(pPare
5440: 6e 74 2c 20 7a 46 69 6c 65 2c 20 70 2d 3e 70 4c  nt, zFile, p->pL
5450: 6f 67 2c 20 66 6c 61 67 73 2c 20 26 66 6c 61 67  og, flags, &flag
5460: 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  s);.  if( rc==SQ
5470: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d  LITE_OK ){.    m
5480: 65 6d 63 70 79 28 70 2d 3e 61 42 75 66 2c 20 22  emcpy(p->aBuf, "
5490: 73 71 6c 69 74 65 5f 6f 73 74 72 61 63 65 31 2e  sqlite_ostrace1.
54a0: 2e 2e 2e 2e 22 2c 20 32 30 29 3b 0a 20 20 20 20  ....", 20);.    
54b0: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->iOffset = 0;.
54c0: 20 20 20 20 70 2d 3e 6e 42 75 66 20 3d 20 32 30      p->nBuf = 20
54d0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
54e0: 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
54f0: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 29 70  (sqlite3_vfs *)p
5500: 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 1);.  }.  if( 
5510: 72 63 20 29 7b 0a 20 20 20 20 76 66 73 6c 6f 67  rc ){.    vfslog
5520: 5f 66 69 6e 61 6c 69 7a 65 28 70 29 3b 0a 20 20  _finalize(p);.  
5530: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
5540: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 76 66  ..int sqlite3_vf
5550: 73 6c 6f 67 5f 61 6e 6e 6f 74 61 74 65 28 63 6f  slog_annotate(co
5560: 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 2c 20  nst char *zVfs, 
5570: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67  const char *zMsg
5580: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
5590: 20 2a 70 56 66 73 3b 0a 20 20 70 56 66 73 20 3d   *pVfs;.  pVfs =
55a0: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
55b0: 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 21  d(zVfs);.  if( !
55c0: 70 56 66 73 20 7c 7c 20 70 56 66 73 2d 3e 78 4f  pVfs || pVfs->xO
55d0: 70 65 6e 21 3d 76 66 73 6c 6f 67 4f 70 65 6e 20  pen!=vfslogOpen 
55e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
55f0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 20  LITE_ERROR;.  } 
5600: 0a 20 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70  .  vfslog_call(p
5610: 56 66 73 2c 20 4f 53 5f 41 4e 4e 4f 54 41 54 45  Vfs, OS_ANNOTATE
5620: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  , 0, 0, 0, 0, 0)
5630: 3b 0a 20 20 76 66 73 6c 6f 67 5f 73 74 72 69 6e  ;.  vfslog_strin
5640: 67 28 70 56 66 73 2c 20 7a 4d 73 67 29 3b 0a 20  g(pVfs, zMsg);. 
5650: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5660: 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e  K;.}..static con
5670: 73 74 20 63 68 61 72 20 2a 76 66 73 6c 6f 67 5f  st char *vfslog_
5680: 65 76 65 6e 74 6e 61 6d 65 28 69 6e 74 20 65 45  eventname(int eE
5690: 76 65 6e 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  vent){.  const c
56a0: 68 61 72 20 2a 7a 45 76 65 6e 74 20 3d 20 30 3b  har *zEvent = 0;
56b0: 0a 0a 20 20 73 77 69 74 63 68 28 20 65 45 76 65  ..  switch( eEve
56c0: 6e 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4f  nt ){.    case O
56d0: 53 5f 43 4c 4f 53 45 3a 20 20 20 20 20 20 20 20  S_CLOSE:        
56e0: 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78       zEvent = "x
56f0: 43 6c 6f 73 65 22 3b 20 62 72 65 61 6b 3b 0a 20  Close"; break;. 
5700: 20 20 20 63 61 73 65 20 4f 53 5f 52 45 41 44 3a     case OS_READ:
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 45                zE
5720: 76 65 6e 74 20 3d 20 22 78 52 65 61 64 22 3b 20  vent = "xRead"; 
5730: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5740: 4f 53 5f 57 52 49 54 45 3a 20 20 20 20 20 20 20  OS_WRITE:       
5750: 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22        zEvent = "
5760: 78 57 72 69 74 65 22 3b 20 62 72 65 61 6b 3b 0a  xWrite"; break;.
5770: 20 20 20 20 63 61 73 65 20 4f 53 5f 54 52 55 4e      case OS_TRUN
5780: 43 41 54 45 3a 20 20 20 20 20 20 20 20 20 20 7a  CATE:          z
5790: 45 76 65 6e 74 20 3d 20 22 78 54 72 75 6e 63 61  Event = "xTrunca
57a0: 74 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  te"; break;.    
57b0: 63 61 73 65 20 4f 53 5f 53 59 4e 43 3a 20 20 20  case OS_SYNC:   
57c0: 20 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e             zEven
57d0: 74 20 3d 20 22 78 53 79 6e 63 22 3b 20 62 72 65  t = "xSync"; bre
57e0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f  ak;.    case OS_
57f0: 46 49 4c 45 53 49 5a 45 3a 20 20 20 20 20 20 20  FILESIZE:       
5800: 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 46 69     zEvent = "xFi
5810: 6c 65 73 69 7a 65 22 3b 20 62 72 65 61 6b 3b 0a  lesize"; break;.
5820: 20 20 20 20 63 61 73 65 20 4f 53 5f 4c 4f 43 4b      case OS_LOCK
5830: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
5840: 45 76 65 6e 74 20 3d 20 22 78 4c 6f 63 6b 22 3b  Event = "xLock";
5850: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5860: 20 4f 53 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20   OS_UNLOCK:     
5870: 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20         zEvent = 
5880: 22 78 55 6e 6c 6f 63 6b 22 3b 20 62 72 65 61 6b  "xUnlock"; break
5890: 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 43 48  ;.    case OS_CH
58a0: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a  ECKRESERVEDLOCK:
58b0: 20 7a 45 76 65 6e 74 20 3d 20 22 78 43 68 65 63   zEvent = "xChec
58c0: 6b 52 65 73 4c 6f 63 6b 22 3b 20 62 72 65 61 6b  kResLock"; break
58d0: 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 46 49  ;.    case OS_FI
58e0: 4c 45 43 4f 4e 54 52 4f 4c 3a 20 20 20 20 20 20  LECONTROL:      
58f0: 20 7a 45 76 65 6e 74 20 3d 20 22 78 46 69 6c 65   zEvent = "xFile
5900: 43 6f 6e 74 72 6f 6c 22 3b 20 62 72 65 61 6b 3b  Control"; break;
5910: 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 53 45 43  .    case OS_SEC
5920: 54 4f 52 53 49 5a 45 3a 20 20 20 20 20 20 20 20  TORSIZE:        
5930: 7a 45 76 65 6e 74 20 3d 20 22 78 53 65 63 74 6f  zEvent = "xSecto
5940: 72 53 69 7a 65 22 3b 20 62 72 65 61 6b 3b 0a 20  rSize"; break;. 
5950: 20 20 20 63 61 73 65 20 4f 53 5f 44 45 56 43 48     case OS_DEVCH
5960: 41 52 3a 20 20 20 20 20 20 20 20 20 20 20 7a 45  AR:           zE
5970: 76 65 6e 74 20 3d 20 22 78 44 65 76 69 63 65 43  vent = "xDeviceC
5980: 68 61 72 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  har"; break;.   
5990: 20 63 61 73 65 20 4f 53 5f 4f 50 45 4e 3a 20 20   case OS_OPEN:  
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 45 76 65              zEve
59b0: 6e 74 20 3d 20 22 78 4f 70 65 6e 22 3b 20 62 72  nt = "xOpen"; br
59c0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53  eak;.    case OS
59d0: 5f 44 45 4c 45 54 45 3a 20 20 20 20 20 20 20 20  _DELETE:        
59e0: 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 44      zEvent = "xD
59f0: 65 6c 65 74 65 22 3b 20 62 72 65 61 6b 3b 0a 20  elete"; break;. 
5a00: 20 20 20 63 61 73 65 20 4f 53 5f 41 43 43 45 53     case OS_ACCES
5a10: 53 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 45  S:            zE
5a20: 76 65 6e 74 20 3d 20 22 78 41 63 63 65 73 73 22  vent = "xAccess"
5a30: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5a40: 65 20 4f 53 5f 46 55 4c 4c 50 41 54 48 4e 41 4d  e OS_FULLPATHNAM
5a50: 45 3a 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d  E:      zEvent =
5a60: 20 22 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 22   "xFullPathname"
5a70: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5a80: 65 20 4f 53 5f 52 41 4e 44 4f 4d 4e 45 53 53 3a  e OS_RANDOMNESS:
5a90: 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d          zEvent =
5aa0: 20 22 78 52 61 6e 64 6f 6d 6e 65 73 73 22 3b 20   "xRandomness"; 
5ab0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5ac0: 4f 53 5f 53 4c 45 45 50 3a 20 20 20 20 20 20 20  OS_SLEEP:       
5ad0: 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22        zEvent = "
5ae0: 78 53 6c 65 65 70 22 3b 20 62 72 65 61 6b 3b 0a  xSleep"; break;.
5af0: 20 20 20 20 63 61 73 65 20 4f 53 5f 43 55 52 52      case OS_CURR
5b00: 45 4e 54 54 49 4d 45 3a 20 20 20 20 20 20 20 7a  ENTTIME:       z
5b10: 45 76 65 6e 74 20 3d 20 22 78 43 75 72 72 65 6e  Event = "xCurren
5b20: 74 54 69 6d 65 22 3b 20 62 72 65 61 6b 3b 0a 0a  tTime"; break;..
5b30: 20 20 20 20 63 61 73 65 20 4f 53 5f 53 48 4d 55      case OS_SHMU
5b40: 4e 4d 41 50 3a 20 20 20 20 20 20 20 20 20 20 7a  NMAP:          z
5b50: 45 76 65 6e 74 20 3d 20 22 78 53 68 6d 55 6e 6d  Event = "xShmUnm
5b60: 61 70 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ap"; break;.    
5b70: 63 61 73 65 20 4f 53 5f 53 48 4d 4c 4f 43 4b 3a  case OS_SHMLOCK:
5b80: 20 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e             zEven
5b90: 74 20 3d 20 22 78 53 68 6d 4c 6f 63 6b 22 3b 20  t = "xShmLock"; 
5ba0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5bb0: 4f 53 5f 53 48 4d 42 41 52 52 49 45 52 3a 20 20  OS_SHMBARRIER:  
5bc0: 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22        zEvent = "
5bd0: 78 53 68 6d 42 61 72 72 69 65 72 22 3b 20 62 72  xShmBarrier"; br
5be0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53  eak;.    case OS
5bf0: 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20 20 20 20  _SHMMAP:        
5c00: 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 53      zEvent = "xS
5c10: 68 6d 4d 61 70 22 3b 20 62 72 65 61 6b 3b 0a 0a  hmMap"; break;..
5c20: 20 20 20 20 63 61 73 65 20 4f 53 5f 41 4e 4e 4f      case OS_ANNO
5c30: 54 41 54 45 3a 20 20 20 20 20 20 20 20 20 20 7a  TATE:          z
5c40: 45 76 65 6e 74 20 3d 20 22 61 6e 6e 6f 74 61 74  Event = "annotat
5c50: 69 6f 6e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 7d  ion"; break;.  }
5c60: 0a 0a 20 20 72 65 74 75 72 6e 20 7a 45 76 65 6e  ..  return zEven
5c70: 74 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74  t;.}..typedef st
5c80: 72 75 63 74 20 56 66 73 6c 6f 67 56 74 61 62 20  ruct VfslogVtab 
5c90: 56 66 73 6c 6f 67 56 74 61 62 3b 0a 74 79 70 65  VfslogVtab;.type
5ca0: 64 65 66 20 73 74 72 75 63 74 20 56 66 73 6c 6f  def struct Vfslo
5cb0: 67 43 73 72 20 56 66 73 6c 6f 67 43 73 72 3b 0a  gCsr VfslogCsr;.
5cc0: 0a 2f 2a 0a 2a 2a 20 56 69 72 74 75 61 6c 20 74  ./*.** Virtual t
5cd0: 61 62 6c 65 20 74 79 70 65 20 66 6f 72 20 74 68  able type for th
5ce0: 65 20 76 66 73 6c 6f 67 20 72 65 61 64 65 72 20  e vfslog reader 
5cf0: 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63  module..*/.struc
5d00: 74 20 56 66 73 6c 6f 67 56 74 61 62 20 7b 0a 20  t VfslogVtab {. 
5d10: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 62 61   sqlite3_vtab ba
5d20: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
5d30: 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 2a   /* Base class *
5d40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
5d50: 20 2a 70 46 64 3b 20 20 20 20 20 20 20 20 20 20   *pFd;          
5d60: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
5d70: 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 76  riptor open on v
5d80: 66 73 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20  fslog file */.  
5d90: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
5da0: 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
5db0: 2f 2a 20 53 69 7a 65 20 6f 66 20 66 69 6c 65 20  /* Size of file 
5dc0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
5dd0: 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20  ar *zFile;      
5de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5df0: 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 70   File name for p
5e00: 46 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  Fd */.};../*.** 
5e10: 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75  Virtual table cu
5e20: 72 73 6f 72 20 74 79 70 65 20 66 6f 72 20 74 68  rsor type for th
5e30: 65 20 76 66 73 6c 6f 67 20 72 65 61 64 65 72 20  e vfslog reader 
5e40: 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63  module..*/.struc
5e50: 74 20 56 66 73 6c 6f 67 43 73 72 20 7b 0a 20 20  t VfslogCsr {.  
5e60: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
5e70: 73 6f 72 20 62 61 73 65 3b 20 20 20 20 20 20 20  sor base;       
5e80: 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 2a 2f  /* Base class */
5e90: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
5ea0: 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20   iRowid;        
5eb0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f     /* Current ro
5ec0: 77 69 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  wid. */.  sqlite
5ed0: 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74 3b  3_int64 iOffset;
5ee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
5ef0: 73 65 74 20 6f 66 20 6e 65 78 74 20 72 65 63 6f  set of next reco
5f00: 72 64 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20 20  rd in file */.  
5f10: 63 68 61 72 20 2a 7a 54 72 61 6e 73 69 65 6e 74  char *zTransient
5f20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5f30: 2f 2a 20 54 72 61 6e 73 69 65 6e 74 20 27 66 69  /* Transient 'fi
5f40: 6c 65 27 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  le' string */.  
5f50: 69 6e 74 20 6e 46 69 6c 65 3b 20 20 20 20 20 20  int nFile;      
5f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f70: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79  /* Size of array
5f80: 20 61 7a 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20 63   azFile[] */.  c
5f90: 68 61 72 20 2a 2a 61 7a 46 69 6c 65 3b 20 20 20  har **azFile;   
5fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5fb0: 2a 20 46 69 6c 65 20 73 74 72 69 6e 67 73 20 2a  * File strings *
5fc0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
5fd0: 72 20 61 42 75 66 5b 31 30 32 34 5d 3b 20 20 20  r aBuf[1024];   
5fe0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 76      /* Current v
5ff0: 66 73 20 6c 6f 67 20 65 6e 74 72 79 20 28 72 65  fs log entry (re
6000: 61 64 20 66 72 6f 6d 20 66 69 6c 65 29 20 2a 2f  ad from file) */
6010: 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 75 6e 73 69  .};..static unsi
6020: 67 6e 65 64 20 69 6e 74 20 67 65 74 33 32 62 69  gned int get32bi
6030: 74 73 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ts(unsigned char
6040: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *p){.  return (
6050: 70 5b 30 5d 3c 3c 32 34 29 20 2b 20 28 70 5b 31  p[0]<<24) + (p[1
6060: 5d 3c 3c 31 36 29 20 2b 20 28 70 5b 32 5d 3c 3c  ]<<16) + (p[2]<<
6070: 38 29 20 2b 20 70 5b 33 5d 3b 0a 7d 0a 0a 2f 2a  8) + p[3];.}../*
6080: 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
6090: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
60a0: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
60b0: 6e 67 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  ng a nul-termina
60c0: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 49  ted string..** I
60d0: 66 20 74 68 65 20 73 74 72 69 6e 67 20 62 65 67  f the string beg
60e0: 69 6e 73 20 77 69 74 68 20 61 6e 20 53 51 4c 20  ins with an SQL 
60f0: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20  quote character 
6100: 69 74 20 69 73 20 6f 76 65 72 77 72 69 74 74 65  it is overwritte
6110: 6e 20 62 79 0a 2a 2a 20 74 68 65 20 64 65 71 75  n by.** the dequ
6120: 6f 74 65 64 20 76 65 72 73 69 6f 6e 2e 20 4f 74  oted version. Ot
6130: 68 65 72 77 69 73 65 20 74 68 65 20 62 75 66 66  herwise the buff
6140: 65 72 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64  er is left unmod
6150: 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ified..*/.static
6160: 20 76 6f 69 64 20 64 65 71 75 6f 74 65 28 63 68   void dequote(ch
6170: 61 72 20 2a 7a 29 7b 0a 20 20 63 68 61 72 20 71  ar *z){.  char q
6180: 75 6f 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  uote;           
6190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 6f            /* Quo
61a0: 74 65 20 63 68 61 72 61 63 74 65 72 20 28 69 66  te character (if
61b0: 20 61 6e 79 20 29 20 2a 2f 0a 20 20 71 75 6f 74   any ) */.  quot
61c0: 65 20 3d 20 7a 5b 30 5d 3b 0a 20 20 69 66 28 20  e = z[0];.  if( 
61d0: 71 75 6f 74 65 3d 3d 27 5b 27 20 7c 7c 20 71 75  quote=='[' || qu
61e0: 6f 74 65 3d 3d 27 5c 27 27 20 7c 7c 20 71 75 6f  ote=='\'' || quo
61f0: 74 65 3d 3d 27 22 27 20 7c 7c 20 71 75 6f 74 65  te=='"' || quote
6200: 3d 3d 27 60 27 20 29 7b 0a 20 20 20 20 69 6e 74  =='`' ){.    int
6210: 20 69 49 6e 20 3d 20 31 3b 20 20 20 20 20 20 20   iIn = 1;       
6220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
6230: 64 65 78 20 6f 66 20 6e 65 78 74 20 62 79 74 65  dex of next byte
6240: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 69 6e   to read from in
6250: 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  put */.    int i
6260: 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Out = 0;        
6270: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
6280: 78 20 6f 66 20 6e 65 78 74 20 62 79 74 65 20 74  x of next byte t
6290: 6f 20 77 72 69 74 65 20 74 6f 20 6f 75 74 70 75  o write to outpu
62a0: 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 71 75 6f  t */.    if( quo
62b0: 74 65 3d 3d 27 5b 27 20 29 20 71 75 6f 74 65 20  te=='[' ) quote 
62c0: 3d 20 27 5d 27 3b 20 20 0a 20 20 20 20 77 68 69  = ']';  .    whi
62d0: 6c 65 28 20 7a 5b 69 49 6e 5d 20 29 7b 0a 20 20  le( z[iIn] ){.  
62e0: 20 20 20 20 69 66 28 20 7a 5b 69 49 6e 5d 3d 3d      if( z[iIn]==
62f0: 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20  quote ){.       
6300: 20 69 66 28 20 7a 5b 69 49 6e 2b 31 5d 21 3d 71   if( z[iIn+1]!=q
6310: 75 6f 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20  uote ) break;.  
6320: 20 20 20 20 20 20 7a 5b 69 4f 75 74 2b 2b 5d 20        z[iOut++] 
6330: 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 20 20 20  = quote;.       
6340: 20 69 49 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20   iIn += 2;.     
6350: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6360: 7a 5b 69 4f 75 74 2b 2b 5d 20 3d 20 7a 5b 69 49  z[iOut++] = z[iI
6370: 6e 2b 2b 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n++];.      }.  
6380: 20 20 7d 0a 20 20 20 20 7a 5b 69 4f 75 74 5d 20    }.    z[iOut] 
6390: 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 7d 0a 0a 23  = '\0';.  }.}..#
63a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
63b0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
63c0: 2f 2a 0a 2a 2a 20 43 6f 6e 6e 65 63 74 20 74 6f  /*.** Connect to
63d0: 20 6f 72 20 63 72 65 61 74 65 20 61 20 76 66 73   or create a vfs
63e0: 6c 6f 67 20 76 69 72 74 75 61 6c 20 74 61 62 6c  log virtual tabl
63f0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
6400: 20 76 6c 6f 67 43 6f 6e 6e 65 63 74 28 0a 20 20   vlogConnect(.  
6410: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
6420: 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74  oid *pAux,.  int
6430: 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61   argc, const cha
6440: 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20  r *const*argv,. 
6450: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
6460: 70 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a  ppVtab,.  char *
6470: 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 73 71 6c 69  *pzErr.){.  sqli
6480: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
6490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
64a0: 46 53 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  FS used to read 
64b0: 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  log file */.  in
64c0: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
64e0: 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   flags passed to
64f0: 20 70 56 66 73 2d 3e 78 4f 70 65 6e 28 29 20 2a   pVfs->xOpen() *
6500: 2f 0a 20 20 56 66 73 6c 6f 67 56 74 61 62 20 2a  /.  VfslogVtab *
6510: 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  p;.  int rc;.  i
6520: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72  nt nByte;.  char
6530: 20 2a 7a 46 69 6c 65 3b 0a 0a 20 20 2a 70 70 56   *zFile;..  *ppV
6540: 74 61 62 20 3d 20 30 3b 0a 20 20 70 56 66 73 20  tab = 0;.  pVfs 
6550: 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
6560: 6e 64 28 30 29 3b 0a 20 20 6e 42 79 74 65 20 3d  nd(0);.  nByte =
6570: 20 73 69 7a 65 6f 66 28 56 66 73 6c 6f 67 56 74   sizeof(VfslogVt
6580: 61 62 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73  ab) + pVfs->szOs
6590: 46 69 6c 65 20 2b 20 70 56 66 73 2d 3e 6d 78 50  File + pVfs->mxP
65a0: 61 74 68 6e 61 6d 65 3b 0a 20 20 70 20 3d 20 73  athname;.  p = s
65b0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
65c0: 79 74 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  yte);.  if( p==0
65d0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
65e0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74  _NOMEM;.  memset
65f0: 28 70 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 0a  (p, 0, nByte);..
6600: 20 20 70 2d 3e 70 46 64 20 3d 20 28 73 71 6c 69    p->pFd = (sqli
6610: 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 5b 31 5d  te3_file *)&p[1]
6620: 3b 0a 20 20 70 2d 3e 7a 46 69 6c 65 20 3d 20 26  ;.  p->zFile = &
6630: 28 28 63 68 61 72 20 2a 29 70 2d 3e 70 46 64 29  ((char *)p->pFd)
6640: 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 5d  [pVfs->szOsFile]
6650: 3b 0a 0a 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c  ;..  zFile = sql
6660: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
6670: 22 2c 20 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69  ", argv[3]);.  i
6680: 66 28 20 21 7a 46 69 6c 65 20 29 7b 0a 20 20 20  f( !zFile ){.   
6690: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
66a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
66b0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
66c0: 20 64 65 71 75 6f 74 65 28 7a 46 69 6c 65 29 3b   dequote(zFile);
66d0: 0a 20 20 70 56 66 73 2d 3e 78 46 75 6c 6c 50 61  .  pVfs->xFullPa
66e0: 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
66f0: 6c 65 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  le, pVfs->mxPath
6700: 6e 61 6d 65 2c 20 70 2d 3e 7a 46 69 6c 65 29 3b  name, p->zFile);
6710: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
6720: 7a 46 69 6c 65 29 3b 0a 0a 20 20 66 6c 61 67 73  zFile);..  flags
6730: 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
6740: 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
6750: 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
6760: 4e 41 4c 3b 0a 20 20 72 63 20 3d 20 70 56 66 73  NAL;.  rc = pVfs
6770: 2d 3e 78 4f 70 65 6e 28 70 56 66 73 2c 20 70 2d  ->xOpen(pVfs, p-
6780: 3e 7a 46 69 6c 65 2c 20 70 2d 3e 70 46 64 2c 20  >zFile, p->pFd, 
6790: 66 6c 61 67 73 2c 20 26 66 6c 61 67 73 29 3b 0a  flags, &flags);.
67a0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
67b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 70  E_OK ){.    p->p
67c0: 46 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46  Fd->pMethods->xF
67d0: 69 6c 65 53 69 7a 65 28 70 2d 3e 70 46 64 2c 20  ileSize(p->pFd, 
67e0: 26 70 2d 3e 6e 42 79 74 65 29 3b 0a 20 20 20 20  &p->nByte);.    
67f0: 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
6800: 76 74 61 62 28 64 62 2c 20 0a 20 20 20 20 20 20  vtab(db, .      
6810: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
6820: 78 78 78 28 65 76 65 6e 74 2c 20 66 69 6c 65 2c  xxx(event, file,
6830: 20 63 6c 69 63 6b 2c 20 72 63 2c 20 73 69 7a 65   click, rc, size
6840: 2c 20 6f 66 66 73 65 74 29 22 0a 20 20 20 20 29  , offset)".    )
6850: 3b 0a 20 20 20 20 2a 70 70 56 74 61 62 20 3d 20  ;.    *ppVtab = 
6860: 26 70 2d 3e 62 61 73 65 3b 0a 20 20 7d 65 6c 73  &p->base;.  }els
6870: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  e{.    sqlite3_f
6880: 72 65 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 72  ree(p);.  }..  r
6890: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
68a0: 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 22  ** There is no "
68b0: 62 65 73 74 2d 69 6e 64 65 78 22 2e 20 54 68 69  best-index". Thi
68c0: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  s virtual table 
68d0: 61 6c 77 61 79 73 20 64 6f 65 73 20 61 20 6c 69  always does a li
68e0: 6e 65 61 72 0a 2a 2a 20 73 63 61 6e 20 6f 66 20  near.** scan of 
68f0: 74 68 65 20 62 69 6e 61 72 79 20 56 46 53 20 6c  the binary VFS l
6900: 6f 67 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  og file..*/.stat
6910: 69 63 20 69 6e 74 20 76 6c 6f 67 42 65 73 74 49  ic int vlogBestI
6920: 6e 64 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61  ndex(sqlite3_vta
6930: 62 20 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f  b *tab, sqlite3_
6940: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
6950: 49 6e 66 6f 29 7b 0a 20 20 70 49 64 78 49 6e 66  Info){.  pIdxInf
6960: 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
6970: 20 3d 20 31 30 2e 30 3b 0a 20 20 72 65 74 75 72   = 10.0;.  retur
6980: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
6990: 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74  /*.** Disconnect
69a0: 20 66 72 6f 6d 20 6f 72 20 64 65 73 74 72 6f 79   from or destroy
69b0: 20 61 20 76 66 73 6c 6f 67 20 76 69 72 74 75 61   a vfslog virtua
69c0: 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  l table..*/.stat
69d0: 69 63 20 69 6e 74 20 76 6c 6f 67 44 69 73 63 6f  ic int vlogDisco
69e0: 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74  nnect(sqlite3_vt
69f0: 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 56 66  ab *pVtab){.  Vf
6a00: 73 6c 6f 67 56 74 61 62 20 2a 70 20 3d 20 28 56  slogVtab *p = (V
6a10: 66 73 6c 6f 67 56 74 61 62 20 2a 29 70 56 74 61  fslogVtab *)pVta
6a20: 62 3b 0a 20 20 69 66 28 20 70 2d 3e 70 46 64 2d  b;.  if( p->pFd-
6a30: 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
6a40: 20 70 2d 3e 70 46 64 2d 3e 70 4d 65 74 68 6f 64   p->pFd->pMethod
6a50: 73 2d 3e 78 43 6c 6f 73 65 28 70 2d 3e 70 46 64  s->xClose(p->pFd
6a60: 29 3b 0a 20 20 20 20 70 2d 3e 70 46 64 2d 3e 70  );.    p->pFd->p
6a70: 4d 65 74 68 6f 64 73 20 3d 20 30 3b 0a 20 20 7d  Methods = 0;.  }
6a80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
6a90: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
6aa0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6ab0: 20 4f 70 65 6e 20 61 20 6e 65 77 20 76 66 73 6c   Open a new vfsl
6ac0: 6f 67 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74  og cursor..*/.st
6ad0: 61 74 69 63 20 69 6e 74 20 76 6c 6f 67 4f 70 65  atic int vlogOpe
6ae0: 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  n(sqlite3_vtab *
6af0: 70 56 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 76  pVTab, sqlite3_v
6b00: 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43  tab_cursor **ppC
6b10: 75 72 73 6f 72 29 7b 0a 20 20 56 66 73 6c 6f 67  ursor){.  Vfslog
6b20: 43 73 72 20 2a 70 43 73 72 3b 20 20 20 20 20 20  Csr *pCsr;      
6b30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
6b40: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 75 72  ly allocated cur
6b50: 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  sor object */.. 
6b60: 20 70 43 73 72 20 3d 20 73 71 6c 69 74 65 33 5f   pCsr = sqlite3_
6b70: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 56 66  malloc(sizeof(Vf
6b80: 73 6c 6f 67 43 73 72 29 29 3b 0a 20 20 69 66 28  slogCsr));.  if(
6b90: 20 21 70 43 73 72 20 29 20 72 65 74 75 72 6e 20   !pCsr ) return 
6ba0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6bb0: 6d 65 6d 73 65 74 28 70 43 73 72 2c 20 30 2c 20  memset(pCsr, 0, 
6bc0: 73 69 7a 65 6f 66 28 56 66 73 6c 6f 67 43 73 72  sizeof(VfslogCsr
6bd0: 29 29 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72 20  ));.  *ppCursor 
6be0: 3d 20 26 70 43 73 72 2d 3e 62 61 73 65 3b 0a 20  = &pCsr->base;. 
6bf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6c00: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
6c10: 65 20 61 20 76 66 73 6c 6f 67 20 63 75 72 73 6f  e a vfslog curso
6c20: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
6c30: 20 76 6c 6f 67 43 6c 6f 73 65 28 73 71 6c 69 74   vlogClose(sqlit
6c40: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
6c50: 70 43 75 72 73 6f 72 29 7b 0a 20 20 56 66 73 6c  pCursor){.  Vfsl
6c60: 6f 67 43 73 72 20 2a 70 20 3d 20 28 56 66 73 6c  ogCsr *p = (Vfsl
6c70: 6f 67 43 73 72 20 2a 29 70 43 75 72 73 6f 72 3b  ogCsr *)pCursor;
6c80: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
6c90: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 46 69 6c 65 3b  i=0; i<p->nFile;
6ca0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
6cb0: 65 33 5f 66 72 65 65 28 70 2d 3e 61 7a 46 69 6c  e3_free(p->azFil
6cc0: 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  e[i]);.  }.  sql
6cd0: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 7a 46  ite3_free(p->azF
6ce0: 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ile);.  sqlite3_
6cf0: 66 72 65 65 28 70 2d 3e 7a 54 72 61 6e 73 69 65  free(p->zTransie
6d00: 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  nt);.  sqlite3_f
6d10: 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
6d20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
6d30: 2a 0a 2a 2a 20 4d 6f 76 65 20 61 20 76 66 73 6c  *.** Move a vfsl
6d40: 6f 67 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  og cursor to the
6d50: 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
6d60: 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
6d70: 69 63 20 69 6e 74 20 76 6c 6f 67 4e 65 78 74 28  ic int vlogNext(
6d80: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
6d90: 73 6f 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a 20  sor *pCursor){. 
6da0: 20 56 66 73 6c 6f 67 43 73 72 20 2a 70 43 73 72   VfslogCsr *pCsr
6db0: 20 3d 20 28 56 66 73 6c 6f 67 43 73 72 20 2a 29   = (VfslogCsr *)
6dc0: 70 43 75 72 73 6f 72 3b 0a 20 20 56 66 73 6c 6f  pCursor;.  Vfslo
6dd0: 67 56 74 61 62 20 2a 70 20 3d 20 28 56 66 73 6c  gVtab *p = (Vfsl
6de0: 6f 67 56 74 61 62 20 2a 29 70 43 75 72 73 6f 72  ogVtab *)pCursor
6df0: 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72  ->pVtab;.  int r
6e00: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6e10: 20 69 6e 74 20 6e 52 65 61 64 3b 0a 0a 20 20 73   int nRead;..  s
6e20: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72  qlite3_free(pCsr
6e30: 2d 3e 7a 54 72 61 6e 73 69 65 6e 74 29 3b 0a 20  ->zTransient);. 
6e40: 20 70 43 73 72 2d 3e 7a 54 72 61 6e 73 69 65 6e   pCsr->zTransien
6e50: 74 20 3d 20 30 3b 0a 0a 20 20 6e 52 65 61 64 20  t = 0;..  nRead 
6e60: 3d 20 32 34 3b 0a 20 20 69 66 28 20 70 43 73 72  = 24;.  if( pCsr
6e70: 2d 3e 69 4f 66 66 73 65 74 2b 6e 52 65 61 64 3c  ->iOffset+nRead<
6e80: 3d 70 2d 3e 6e 42 79 74 65 20 29 7b 0a 20 20 20  =p->nByte ){.   
6e90: 20 69 6e 74 20 65 45 76 65 6e 74 3b 0a 20 20 20   int eEvent;.   
6ea0: 20 72 63 20 3d 20 70 2d 3e 70 46 64 2d 3e 70 4d   rc = p->pFd->pM
6eb0: 65 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70 2d  ethods->xRead(p-
6ec0: 3e 70 46 64 2c 20 70 43 73 72 2d 3e 61 42 75 66  >pFd, pCsr->aBuf
6ed0: 2c 20 6e 52 65 61 64 2c 20 70 43 73 72 2d 3e 69  , nRead, pCsr->i
6ee0: 4f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 65 45  Offset);..    eE
6ef0: 76 65 6e 74 20 3d 20 67 65 74 33 32 62 69 74 73  vent = get32bits
6f00: 28 70 43 73 72 2d 3e 61 42 75 66 29 3b 0a 20 20  (pCsr->aBuf);.  
6f10: 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54    if( (rc==SQLIT
6f20: 45 5f 4f 4b 29 0a 20 20 20 20 20 26 26 20 28 65  E_OK).     && (e
6f30: 45 76 65 6e 74 3d 3d 4f 53 5f 4f 50 45 4e 20 7c  Event==OS_OPEN |
6f40: 7c 20 65 45 76 65 6e 74 3d 3d 4f 53 5f 44 45 4c  | eEvent==OS_DEL
6f50: 45 54 45 20 7c 7c 20 65 45 76 65 6e 74 3d 3d 4f  ETE || eEvent==O
6f60: 53 5f 41 43 43 45 53 53 29 20 0a 20 20 20 20 29  S_ACCESS) .    )
6f70: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 62 75 66  {.      char buf
6f80: 5b 34 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  [4];.      rc = 
6f90: 70 2d 3e 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73  p->pFd->pMethods
6fa0: 2d 3e 78 52 65 61 64 28 70 2d 3e 70 46 64 2c 20  ->xRead(p->pFd, 
6fb0: 62 75 66 2c 20 34 2c 20 70 43 73 72 2d 3e 69 4f  buf, 4, pCsr->iO
6fc0: 66 66 73 65 74 2b 6e 52 65 61 64 29 3b 0a 20 20  ffset+nRead);.  
6fd0: 20 20 20 20 6e 52 65 61 64 20 2b 3d 20 34 3b 0a      nRead += 4;.
6fe0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
6ff0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7000: 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 67 65     int nStr = ge
7010: 74 33 32 62 69 74 73 28 28 75 6e 73 69 67 6e 65  t32bits((unsigne
7020: 64 20 63 68 61 72 20 2a 29 62 75 66 29 3b 0a 20  d char *)buf);. 
7030: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 74         char *zSt
7040: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r = sqlite3_mall
7050: 6f 63 28 6e 53 74 72 2b 31 29 3b 0a 20 20 20 20  oc(nStr+1);.    
7060: 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 46 64 2d      rc = p->pFd-
7070: 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52 65 61 64  >pMethods->xRead
7080: 28 70 2d 3e 70 46 64 2c 20 7a 53 74 72 2c 20 6e  (p->pFd, zStr, n
7090: 53 74 72 2c 20 70 43 73 72 2d 3e 69 4f 66 66 73  Str, pCsr->iOffs
70a0: 65 74 2b 6e 52 65 61 64 29 3b 0a 20 20 20 20 20  et+nRead);.     
70b0: 20 20 20 7a 53 74 72 5b 6e 53 74 72 5d 20 3d 20     zStr[nStr] = 
70c0: 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 6e 52  '\0';.        nR
70d0: 65 61 64 20 2b 3d 20 6e 53 74 72 3b 0a 0a 20 20  ead += nStr;..  
70e0: 20 20 20 20 20 20 69 66 28 20 65 45 76 65 6e 74        if( eEvent
70f0: 3d 3d 4f 53 5f 4f 50 45 4e 20 29 7b 0a 20 20 20  ==OS_OPEN ){.   
7100: 20 20 20 20 20 20 20 69 6e 74 20 69 46 69 6c 65         int iFile
7110: 69 64 20 3d 20 67 65 74 33 32 62 69 74 73 28 26  id = get32bits(&
7120: 70 43 73 72 2d 3e 61 42 75 66 5b 34 5d 29 3b 0a  pCsr->aBuf[4]);.
7130: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46            if( iF
7140: 69 6c 65 69 64 3e 3d 70 43 73 72 2d 3e 6e 46 69  ileid>=pCsr->nFi
7150: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
7160: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 73 69 7a    int nNew = siz
7170: 65 6f 66 28 70 43 73 72 2d 3e 61 7a 46 69 6c 65  eof(pCsr->azFile
7180: 5b 30 5d 29 2a 28 69 46 69 6c 65 69 64 2b 31 29  [0])*(iFileid+1)
7190: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
71a0: 73 72 2d 3e 61 7a 46 69 6c 65 20 3d 20 28 63 68  sr->azFile = (ch
71b0: 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65  ar **)sqlite3_re
71c0: 61 6c 6c 6f 63 28 70 43 73 72 2d 3e 61 7a 46 69  alloc(pCsr->azFi
71d0: 6c 65 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20  le, nNew);.     
71e0: 20 20 20 20 20 20 20 6e 4e 65 77 20 2d 3d 20 73         nNew -= s
71f0: 69 7a 65 6f 66 28 70 43 73 72 2d 3e 61 7a 46 69  izeof(pCsr->azFi
7200: 6c 65 5b 30 5d 29 2a 70 43 73 72 2d 3e 6e 46 69  le[0])*pCsr->nFi
7210: 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
7220: 6d 65 6d 73 65 74 28 26 70 43 73 72 2d 3e 61 7a  memset(&pCsr->az
7230: 46 69 6c 65 5b 70 43 73 72 2d 3e 6e 46 69 6c 65  File[pCsr->nFile
7240: 5d 2c 20 30 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  ], 0, nNew);.   
7250: 20 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 6e           pCsr->n
7260: 46 69 6c 65 20 3d 20 69 46 69 6c 65 69 64 2b 31  File = iFileid+1
7270: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
7280: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7290: 66 72 65 65 28 70 43 73 72 2d 3e 61 7a 46 69 6c  free(pCsr->azFil
72a0: 65 5b 69 46 69 6c 65 69 64 5d 29 3b 0a 20 20 20  e[iFileid]);.   
72b0: 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61 7a 46         pCsr->azF
72c0: 69 6c 65 5b 69 46 69 6c 65 69 64 5d 20 3d 20 7a  ile[iFileid] = z
72d0: 53 74 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  Str;.        }el
72e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43  se{.          pC
72f0: 73 72 2d 3e 7a 54 72 61 6e 73 69 65 6e 74 20 3d  sr->zTransient =
7300: 20 7a 53 74 72 3b 0a 20 20 20 20 20 20 20 20 7d   zStr;.        }
7310: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7320: 20 7d 0a 0a 20 20 70 43 73 72 2d 3e 69 52 6f 77   }..  pCsr->iRow
7330: 69 64 20 2b 3d 20 31 3b 0a 20 20 70 43 73 72 2d  id += 1;.  pCsr-
7340: 3e 69 4f 66 66 73 65 74 20 2b 3d 20 6e 52 65 61  >iOffset += nRea
7350: 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
7360: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 76 6c  }..static int vl
7370: 6f 67 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74  ogEof(sqlite3_vt
7380: 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73  ab_cursor *pCurs
7390: 6f 72 29 7b 0a 20 20 56 66 73 6c 6f 67 43 73 72  or){.  VfslogCsr
73a0: 20 2a 70 43 73 72 20 3d 20 28 56 66 73 6c 6f 67   *pCsr = (Vfslog
73b0: 43 73 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 20  Csr *)pCursor;. 
73c0: 20 56 66 73 6c 6f 67 56 74 61 62 20 2a 70 20 3d   VfslogVtab *p =
73d0: 20 28 56 66 73 6c 6f 67 56 74 61 62 20 2a 29 70   (VfslogVtab *)p
73e0: 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20  Cursor->pVtab;. 
73f0: 20 72 65 74 75 72 6e 20 28 70 43 73 72 2d 3e 69   return (pCsr->i
7400: 4f 66 66 73 65 74 3e 3d 70 2d 3e 6e 42 79 74 65  Offset>=p->nByte
7410: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
7420: 20 76 6c 6f 67 46 69 6c 74 65 72 28 0a 20 20 73   vlogFilter(.  s
7430: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
7440: 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20 0a 20 20  or *pCursor, .  
7450: 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73  int idxNum, cons
7460: 74 20 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a  t char *idxStr,.
7470: 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69    int argc, sqli
7480: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
7490: 0a 29 7b 0a 20 20 56 66 73 6c 6f 67 43 73 72 20  .){.  VfslogCsr 
74a0: 2a 70 43 73 72 20 3d 20 28 56 66 73 6c 6f 67 43  *pCsr = (VfslogC
74b0: 73 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20  sr *)pCursor;.  
74c0: 70 43 73 72 2d 3e 69 52 6f 77 69 64 20 3d 20 30  pCsr->iRowid = 0
74d0: 3b 0a 20 20 70 43 73 72 2d 3e 69 4f 66 66 73 65  ;.  pCsr->iOffse
74e0: 74 20 3d 20 32 30 3b 0a 20 20 72 65 74 75 72 6e  t = 20;.  return
74f0: 20 76 6c 6f 67 4e 65 78 74 28 70 43 75 72 73 6f   vlogNext(pCurso
7500: 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  r);.}..static in
7510: 74 20 76 6c 6f 67 43 6f 6c 75 6d 6e 28 0a 20 20  t vlogColumn(.  
7520: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
7530: 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20 0a 20  sor *pCursor, . 
7540: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
7550: 20 2a 63 74 78 2c 20 0a 20 20 69 6e 74 20 69 0a   *ctx, .  int i.
7560: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
7570: 74 20 76 61 6c 3b 0a 20 20 56 66 73 6c 6f 67 43  t val;.  VfslogC
7580: 73 72 20 2a 70 43 73 72 20 3d 20 28 56 66 73 6c  sr *pCsr = (Vfsl
7590: 6f 67 43 73 72 20 2a 29 70 43 75 72 73 6f 72 3b  ogCsr *)pCursor;
75a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3c 37 20  ..  assert( i<7 
75b0: 29 3b 0a 20 20 76 61 6c 20 3d 20 67 65 74 33 32  );.  val = get32
75c0: 62 69 74 73 28 26 70 43 73 72 2d 3e 61 42 75 66  bits(&pCsr->aBuf
75d0: 5b 34 2a 69 5d 29 3b 0a 0a 20 20 73 77 69 74 63  [4*i]);..  switc
75e0: 68 28 20 69 20 29 7b 0a 20 20 20 20 63 61 73 65  h( i ){.    case
75f0: 20 30 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69   0: {.      sqli
7600: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
7610: 63 74 78 2c 20 76 66 73 6c 6f 67 5f 65 76 65 6e  ctx, vfslog_even
7620: 74 6e 61 6d 65 28 76 61 6c 29 2c 20 2d 31 2c 20  tname(val), -1, 
7630: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
7640: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7650: 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b   }.    case 1: {
7660: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 74  .      char *zSt
7670: 72 20 3d 20 70 43 73 72 2d 3e 7a 54 72 61 6e 73  r = pCsr->zTrans
7680: 69 65 6e 74 3b 0a 20 20 20 20 20 20 69 66 28 20  ient;.      if( 
7690: 76 61 6c 21 3d 30 20 26 26 20 76 61 6c 3c 70 43  val!=0 && val<pC
76a0: 73 72 2d 3e 6e 46 69 6c 65 20 29 7b 0a 20 20 20  sr->nFile ){.   
76b0: 20 20 20 20 20 7a 53 74 72 20 3d 20 70 43 73 72       zStr = pCsr
76c0: 2d 3e 61 7a 46 69 6c 65 5b 76 61 6c 5d 3b 0a 20  ->azFile[val];. 
76d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
76e0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
76f0: 28 63 74 78 2c 20 7a 53 74 72 2c 20 2d 31 2c 20  (ctx, zStr, -1, 
7700: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
7710: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7720: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
7730: 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t:.      sqlite3
7740: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c  _result_int(ctx,
7750: 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65   val);.      bre
7760: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ak;.  }..  retur
7770: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7780: 73 74 61 74 69 63 20 69 6e 74 20 76 6c 6f 67 52  static int vlogR
7790: 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61  owid(sqlite3_vta
77a0: 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f  b_cursor *pCurso
77b0: 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  r, sqlite_int64 
77c0: 2a 70 52 6f 77 69 64 29 7b 0a 20 20 56 66 73 6c  *pRowid){.  Vfsl
77d0: 6f 67 43 73 72 20 2a 70 43 73 72 20 3d 20 28 56  ogCsr *pCsr = (V
77e0: 66 73 6c 6f 67 43 73 72 20 2a 29 70 43 75 72 73  fslogCsr *)pCurs
77f0: 6f 72 3b 0a 20 20 2a 70 52 6f 77 69 64 20 3d 20  or;.  *pRowid = 
7800: 70 43 73 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20  pCsr->iRowid;.  
7810: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7820: 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
7830: 5f 76 66 73 6c 6f 67 5f 72 65 67 69 73 74 65 72  _vfslog_register
7840: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
7850: 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
7860: 6d 6f 64 75 6c 65 20 76 66 73 6c 6f 67 5f 6d 6f  module vfslog_mo
7870: 64 75 6c 65 20 3d 20 7b 0a 20 20 20 20 30 2c 20  dule = {.    0, 
7880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
78a0: 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 76 6c  ersion */.    vl
78b0: 6f 67 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20  ogConnect,      
78c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 72            /* xCr
78d0: 65 61 74 65 20 2a 2f 0a 20 20 20 20 76 6c 6f 67  eate */.    vlog
78e0: 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20  Connect,        
78f0: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e          /* xConn
7900: 65 63 74 20 2a 2f 0a 20 20 20 20 76 6c 6f 67 42  ect */.    vlogB
7910: 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20  estIndex,       
7920: 20 20 20 20 20 20 20 2f 2a 20 78 42 65 73 74 49         /* xBestI
7930: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 76 6c 6f 67  ndex */.    vlog
7940: 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20  Disconnect,     
7950: 20 20 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63          /* xDisc
7960: 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 76 6c  onnect */.    vl
7970: 6f 67 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20  ogDisconnect,   
7980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
7990: 73 74 72 6f 79 20 2a 2f 0a 20 20 20 20 76 6c 6f  stroy */.    vlo
79a0: 67 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  gOpen,          
79b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
79c0: 6e 20 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f  n - open a curso
79d0: 72 20 2a 2f 0a 20 20 20 20 76 6c 6f 67 43 6c 6f  r */.    vlogClo
79e0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
79f0: 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d       /* xClose -
7a00: 20 63 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20   close a cursor 
7a10: 2a 2f 0a 20 20 20 20 76 6c 6f 67 46 69 6c 74 65  */.    vlogFilte
7a20: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
7a30: 20 20 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20     /* xFilter - 
7a40: 63 6f 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63  configure scan c
7a50: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
7a60: 20 20 76 6c 6f 67 4e 65 78 74 2c 20 20 20 20 20    vlogNext,     
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7a80: 20 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63 65   xNext - advance
7a90: 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 20   a cursor */.   
7aa0: 20 76 6c 6f 67 45 6f 66 2c 20 20 20 20 20 20 20   vlogEof,       
7ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7ac0: 78 45 6f 66 20 2d 20 63 68 65 63 6b 20 66 6f 72  xEof - check for
7ad0: 20 65 6e 64 20 6f 66 20 73 63 61 6e 20 2a 2f 0a   end of scan */.
7ae0: 20 20 20 20 76 6c 6f 67 43 6f 6c 75 6d 6e 2c 20      vlogColumn, 
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b00: 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61  /* xColumn - rea
7b10: 64 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 76 6c  d data */.    vl
7b20: 6f 67 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20  ogRowid,        
7b30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
7b40: 77 69 64 20 2d 20 72 65 61 64 20 64 61 74 61 20  wid - read data 
7b50: 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
7b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b70: 20 20 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20       /* xUpdate 
7b80: 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ba0: 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2a       /* xBegin *
7bb0: 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bd0: 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a      /* xSync */.
7be0: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c00: 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a    /* xCommit */.
7c10: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c30: 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a    /* xRollback *
7c40: 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c60: 20 20 20 20 2f 2a 20 78 46 69 6e 64 4d 65 74 68      /* xFindMeth
7c70: 6f 64 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  od */.    0,    
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c90: 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61          /* xRena
7ca0: 6d 65 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 73 71  me */.  };..  sq
7cb0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64  lite3_create_mod
7cc0: 75 6c 65 28 64 62 2c 20 22 76 66 73 6c 6f 67 22  ule(db, "vfslog"
7cd0: 2c 20 26 76 66 73 6c 6f 67 5f 6d 6f 64 75 6c 65  , &vfslog_module
7ce0: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  , 0);.  return S
7cf0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
7d00: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
7d10: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
7d20: 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
7d30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
7d70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 63  **********.** Tc
7dc0: 6c 20 69 6e 74 65 72 66 61 63 65 20 73 74 61 72  l interface star
7dd0: 74 73 20 68 65 72 65 2e 0a 2a 2f 0a 0a 23 69 66  ts here..*/..#if
7de0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
7df0: 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64  TEST) || defined
7e00: 28 54 43 4c 53 48 29 0a 0a 23 69 6e 63 6c 75 64  (TCLSH)..#includ
7e10: 65 20 3c 74 63 6c 2e 68 3e 0a 0a 73 74 61 74 69  e <tcl.h>..stati
7e20: 63 20 69 6e 74 20 74 65 73 74 5f 76 66 73 6c 6f  c int test_vfslo
7e30: 67 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e  g(.  void *clien
7e40: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
7e50: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
7e60: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
7e70: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
7e80: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 71 6c  .){.  struct Sql
7e90: 69 74 65 44 62 20 7b 20 73 71 6c 69 74 65 33 20  iteDb { sqlite3 
7ea0: 2a 64 62 3b 20 7d 3b 0a 20 20 73 71 6c 69 74 65  *db; };.  sqlite
7eb0: 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 43 6d 64  3 *db;.  Tcl_Cmd
7ec0: 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20  Info cmdInfo;.  
7ed0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
7ee0: 45 52 52 4f 52 3b 0a 0a 20 20 73 74 61 74 69 63  ERROR;..  static
7ef0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 72   const char *str
7f00: 73 5b 5d 20 3d 20 7b 20 22 61 6e 6e 6f 74 61 74  s[] = { "annotat
7f10: 65 22 2c 20 22 66 69 6e 61 6c 69 7a 65 22 2c 20  e", "finalize", 
7f20: 22 6e 65 77 22 2c 20 20 22 72 65 67 69 73 74 65  "new",  "registe
7f30: 72 22 2c 20 30 20 7d 3b 0a 20 20 65 6e 75 6d 20  r", 0 };.  enum 
7f40: 56 4c 5f 65 6e 75 6d 20 7b 20 56 4c 5f 41 4e 4e  VL_enum { VL_ANN
7f50: 4f 54 41 54 45 2c 20 56 4c 5f 46 49 4e 41 4c 49  OTATE, VL_FINALI
7f60: 5a 45 2c 20 56 4c 5f 4e 45 57 2c 20 56 4c 5f 52  ZE, VL_NEW, VL_R
7f70: 45 47 49 53 54 45 52 20 7d 3b 0a 20 20 69 6e 74  EGISTER };.  int
7f80: 20 69 53 75 62 3b 0a 0a 20 20 69 66 28 20 6f 62   iSub;..  if( ob
7f90: 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc<2 ){.    Tcl_
7fa0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
7fb0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
7fc0: 55 42 2d 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29  UB-COMMAND ...")
7fd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
7fe0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
7ff0: 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  ( Tcl_GetIndexFr
8000: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
8010: 6a 76 5b 31 5d 2c 20 73 74 72 73 2c 20 22 73 75  jv[1], strs, "su
8020: 62 2d 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26  b-command", 0, &
8030: 69 53 75 62 29 20 29 7b 0a 20 20 20 20 72 65 74  iSub) ){.    ret
8040: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8050: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65   }..  switch( (e
8060: 6e 75 6d 20 56 4c 5f 65 6e 75 6d 29 69 53 75 62  num VL_enum)iSub
8070: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 56 4c 5f   ){.    case VL_
8080: 41 4e 4e 4f 54 41 54 45 3a 20 7b 0a 20 20 20 20  ANNOTATE: {.    
8090: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
80a0: 63 68 61 72 20 2a 7a 56 66 73 3b 0a 20 20 20 20  char *zVfs;.    
80b0: 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20    char *zMsg;.  
80c0: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20      if( objc!=4 
80d0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
80e0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
80f0: 72 70 2c 20 33 2c 20 6f 62 6a 76 2c 20 22 56 46  rp, 3, objv, "VF
8100: 53 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  S");.        ret
8110: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8120: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 56 66       }.      zVf
8130: 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  s = Tcl_GetStrin
8140: 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20  g(objv[2]);.    
8150: 20 20 7a 4d 73 67 20 3d 20 54 63 6c 5f 47 65 74    zMsg = Tcl_Get
8160: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
8170: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
8180: 74 65 33 5f 76 66 73 6c 6f 67 5f 61 6e 6e 6f 74  te3_vfslog_annot
8190: 61 74 65 28 7a 56 66 73 2c 20 7a 4d 73 67 29 3b  ate(zVfs, zMsg);
81a0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
81b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
81c0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
81d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 66 61  sult(interp, "fa
81e0: 69 6c 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20  iled", 0);.     
81f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8200: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
8210: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8220: 20 20 20 20 63 61 73 65 20 56 4c 5f 46 49 4e 41      case VL_FINA
8230: 4c 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e  LIZE: {.      in
8240: 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72  t rc;.      char
8250: 20 2a 7a 56 66 73 3b 0a 20 20 20 20 20 20 69 66   *zVfs;.      if
8260: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
8270: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
8280: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
8290: 20 6f 62 6a 76 2c 20 22 56 46 53 22 29 3b 0a 20   objv, "VFS");. 
82a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
82b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
82c0: 0a 20 20 20 20 20 20 7a 56 66 73 20 3d 20 54 63  .      zVfs = Tc
82d0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
82e0: 5b 32 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  [2]);.      rc =
82f0: 20 73 71 6c 69 74 65 33 5f 76 66 73 6c 6f 67 5f   sqlite3_vfslog_
8300: 66 69 6e 61 6c 69 7a 65 28 7a 56 66 73 29 3b 0a  finalize(zVfs);.
8310: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
8320: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8330: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8340: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 66 61 69  ult(interp, "fai
8350: 6c 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  led", 0);.      
8360: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
8370: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
8380: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 3b 0a    break;.    };.
8390: 0a 20 20 20 20 63 61 73 65 20 56 4c 5f 4e 45 57  .    case VL_NEW
83a0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  : {.      int rc
83b0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56  ;.      char *zV
83c0: 66 73 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  fs;.      char *
83d0: 7a 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 63  zParent;.      c
83e0: 68 61 72 20 2a 7a 4c 6f 67 3b 0a 20 20 20 20 20  har *zLog;.     
83f0: 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
8400: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
8410: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
8420: 20 32 2c 20 6f 62 6a 76 2c 20 22 56 46 53 20 50   2, objv, "VFS P
8430: 41 52 45 4e 54 20 4c 4f 47 46 49 4c 45 22 29 3b  ARENT LOGFILE");
8440: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8450: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
8460: 20 7d 0a 20 20 20 20 20 20 7a 56 66 73 20 3d 20   }.      zVfs = 
8470: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
8480: 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7a 50  jv[2]);.      zP
8490: 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53  arent = Tcl_GetS
84a0: 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
84b0: 20 20 20 20 20 20 7a 4c 6f 67 20 3d 20 54 63 6c        zLog = Tcl
84c0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
84d0: 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 2a  4]);.      if( *
84e0: 7a 50 61 72 65 6e 74 3d 3d 27 5c 30 27 20 29 20  zParent=='\0' ) 
84f0: 7a 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20  zParent = 0;.   
8500: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
8510: 76 66 73 6c 6f 67 5f 6e 65 77 28 7a 56 66 73 2c  vfslog_new(zVfs,
8520: 20 7a 50 61 72 65 6e 74 2c 20 7a 4c 6f 67 29 3b   zParent, zLog);
8530: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
8540: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8550: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8560: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 66 61  sult(interp, "fa
8570: 69 6c 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20  iled", 0);.     
8580: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8590: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
85a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 3b     break;.    };
85b0: 0a 0a 20 20 20 20 63 61 73 65 20 56 4c 5f 52 45  ..    case VL_RE
85c0: 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
85d0: 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20 20 20  char *zDb;.     
85e0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
85f0: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
8600: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
8610: 20 32 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b   2, objv, "DB");
8620: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8630: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
8640: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
8650: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
8660: 4c 45 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  LE.      Tcl_App
8670: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8680: 2c 20 22 76 66 73 6c 6f 67 20 6e 6f 74 20 61 76  , "vfslog not av
8690: 61 69 6c 61 62 6c 65 20 62 65 63 61 75 73 65 20  ailable because 
86a0: 6f 66 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  of ".           
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86c0: 20 20 20 20 22 53 51 4c 49 54 45 5f 4f 4d 49 54      "SQLITE_OMIT
86d0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 22 2c 20  _VIRTUALTABLE", 
86e0: 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 20 20 20  (void*)0);.     
86f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8700: 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 7a  R;.#else.      z
8710: 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
8720: 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  ng(objv[2]);.   
8730: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 43 6f     if( Tcl_GetCo
8740: 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70  mmandInfo(interp
8750: 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29  , zDb, &cmdInfo)
8760: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 20 3d   ){.        db =
8770: 20 28 28 73 74 72 75 63 74 20 53 71 6c 69 74 65   ((struct Sqlite
8780: 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43  Db*)cmdInfo.objC
8790: 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a  lientData)->db;.
87a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
87b0: 69 74 65 33 5f 76 66 73 6c 6f 67 5f 72 65 67 69  ite3_vfslog_regi
87c0: 73 74 65 72 28 64 62 29 3b 0a 20 20 20 20 20 20  ster(db);.      
87d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
87e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
87f0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
8800: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
8810: 61 64 20 73 71 6c 69 74 65 33 20 68 61 6e 64 6c  ad sqlite3 handl
8820: 65 3a 20 22 2c 20 7a 44 62 2c 20 28 76 6f 69 64  e: ", zDb, (void
8830: 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  *)0);.        re
8840: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8850: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
8860: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  eak;.#endif.    
8870: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
8880: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 53  TCL_OK;.}..int S
8890: 71 6c 69 74 65 74 65 73 74 4f 73 69 6e 73 74 5f  qlitetestOsinst_
88a0: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
88b0: 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f  *interp){.  Tcl_
88c0: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
88d0: 28 69 6e 74 65 72 70 2c 20 22 76 66 73 6c 6f 67  (interp, "vfslog
88e0: 22 2c 20 74 65 73 74 5f 76 66 73 6c 6f 67 2c 20  ", test_vfslog, 
88f0: 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0, 0);.  return 
8900: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  TCL_OK;.}..#endi
8910: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  f /* SQLITE_TEST
8920: 20 2a 2f 0a                                       */.