/ Hex Artifact Content
Login

Artifact 3d0340bc31a9f3d8a3547e0272373e80f78dde25:


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 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73  h"..#include "os
0a40: 5f 73 65 74 75 70 2e 68 22 0a 23 69 66 20 53 51  _setup.h".#if SQ
0a50: 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 23 20 20 69  LITE_OS_WIN.#  i
0a60: 6e 63 6c 75 64 65 20 22 6f 73 5f 77 69 6e 2e 68  nclude "os_win.h
0a70: 22 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63 6c 75  ".#endif..#inclu
0a80: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69  de <string.h>.#i
0a90: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
0aa0: 3e 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75  >.../*.** Maximu
0ab0: 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74  m pathname lengt
0ac0: 68 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 74  h supported by t
0ad0: 68 65 20 76 66 73 6c 6f 67 20 62 61 63 6b 65 6e  he vfslog backen
0ae0: 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4e  d..*/.#define IN
0af0: 53 54 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  ST_MAX_PATHNAME 
0b00: 35 31 32 0a 0a 23 64 65 66 69 6e 65 20 4f 53 5f  512..#define OS_
0b10: 41 43 43 45 53 53 20 20 20 20 20 20 20 20 20 20  ACCESS          
0b20: 20 20 31 0a 23 64 65 66 69 6e 65 20 4f 53 5f 43    1.#define OS_C
0b30: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
0b40: 20 32 0a 23 64 65 66 69 6e 65 20 4f 53 5f 43 4c   2.#define OS_CL
0b50: 4f 53 45 20 20 20 20 20 20 20 20 20 20 20 20 20  OSE             
0b60: 33 0a 23 64 65 66 69 6e 65 20 4f 53 5f 43 55 52  3.#define OS_CUR
0b70: 52 45 4e 54 54 49 4d 45 20 20 20 20 20 20 20 34  RENTTIME       4
0b80: 0a 23 64 65 66 69 6e 65 20 4f 53 5f 44 45 4c 45  .#define OS_DELE
0b90: 54 45 20 20 20 20 20 20 20 20 20 20 20 20 35 0a  TE            5.
0ba0: 23 64 65 66 69 6e 65 20 4f 53 5f 44 45 56 43 48  #define OS_DEVCH
0bb0: 41 52 20 20 20 20 20 20 20 20 20 20 20 36 0a 23  AR           6.#
0bc0: 64 65 66 69 6e 65 20 4f 53 5f 46 49 4c 45 43 4f  define OS_FILECO
0bd0: 4e 54 52 4f 4c 20 20 20 20 20 20 20 37 0a 23 64  NTROL       7.#d
0be0: 65 66 69 6e 65 20 4f 53 5f 46 49 4c 45 53 49 5a  efine OS_FILESIZ
0bf0: 45 20 20 20 20 20 20 20 20 20 20 38 0a 23 64 65  E          8.#de
0c00: 66 69 6e 65 20 4f 53 5f 46 55 4c 4c 50 41 54 48  fine OS_FULLPATH
0c10: 4e 41 4d 45 20 20 20 20 20 20 39 0a 23 64 65 66  NAME      9.#def
0c20: 69 6e 65 20 4f 53 5f 4c 4f 43 4b 20 20 20 20 20  ine OS_LOCK     
0c30: 20 20 20 20 20 20 20 20 20 31 31 0a 23 64 65 66           11.#def
0c40: 69 6e 65 20 4f 53 5f 4f 50 45 4e 20 20 20 20 20  ine OS_OPEN     
0c50: 20 20 20 20 20 20 20 20 20 31 32 0a 23 64 65 66           12.#def
0c60: 69 6e 65 20 4f 53 5f 52 41 4e 44 4f 4d 4e 45 53  ine OS_RANDOMNES
0c70: 53 20 20 20 20 20 20 20 20 31 33 0a 23 64 65 66  S        13.#def
0c80: 69 6e 65 20 4f 53 5f 52 45 41 44 20 20 20 20 20  ine OS_READ     
0c90: 20 20 20 20 20 20 20 20 20 31 34 20 0a 23 64 65           14 .#de
0ca0: 66 69 6e 65 20 4f 53 5f 53 45 43 54 4f 52 53 49  fine OS_SECTORSI
0cb0: 5a 45 20 20 20 20 20 20 20 20 31 35 0a 23 64 65  ZE        15.#de
0cc0: 66 69 6e 65 20 4f 53 5f 53 4c 45 45 50 20 20 20  fine OS_SLEEP   
0cd0: 20 20 20 20 20 20 20 20 20 20 31 36 0a 23 64 65            16.#de
0ce0: 66 69 6e 65 20 4f 53 5f 53 59 4e 43 20 20 20 20  fine OS_SYNC    
0cf0: 20 20 20 20 20 20 20 20 20 20 31 37 0a 23 64 65            17.#de
0d00: 66 69 6e 65 20 4f 53 5f 54 52 55 4e 43 41 54 45  fine OS_TRUNCATE
0d10: 20 20 20 20 20 20 20 20 20 20 31 38 0a 23 64 65            18.#de
0d20: 66 69 6e 65 20 4f 53 5f 55 4e 4c 4f 43 4b 20 20  fine OS_UNLOCK  
0d30: 20 20 20 20 20 20 20 20 20 20 31 39 0a 23 64 65            19.#de
0d40: 66 69 6e 65 20 4f 53 5f 57 52 49 54 45 20 20 20  fine OS_WRITE   
0d50: 20 20 20 20 20 20 20 20 20 20 32 30 0a 23 64 65            20.#de
0d60: 66 69 6e 65 20 4f 53 5f 53 48 4d 55 4e 4d 41 50  fine OS_SHMUNMAP
0d70: 20 20 20 20 20 20 20 20 20 20 32 32 0a 23 64 65            22.#de
0d80: 66 69 6e 65 20 4f 53 5f 53 48 4d 4d 41 50 20 20  fine OS_SHMMAP  
0d90: 20 20 20 20 20 20 20 20 20 20 32 33 0a 23 64 65            23.#de
0da0: 66 69 6e 65 20 4f 53 5f 53 48 4d 4c 4f 43 4b 20  fine OS_SHMLOCK 
0db0: 20 20 20 20 20 20 20 20 20 20 32 35 0a 23 64 65            25.#de
0dc0: 66 69 6e 65 20 4f 53 5f 53 48 4d 42 41 52 52 49  fine OS_SHMBARRI
0dd0: 45 52 20 20 20 20 20 20 20 20 32 36 0a 23 64 65  ER        26.#de
0de0: 66 69 6e 65 20 4f 53 5f 41 4e 4e 4f 54 41 54 45  fine OS_ANNOTATE
0df0: 20 20 20 20 20 20 20 20 20 20 32 38 0a 0a 23 64            28..#d
0e00: 65 66 69 6e 65 20 4f 53 5f 4e 55 4d 45 56 45 4e  efine OS_NUMEVEN
0e10: 54 53 20 20 20 20 20 20 20 20 20 32 39 0a 0a 23  TS         29..#
0e20: 64 65 66 69 6e 65 20 56 46 53 4c 4f 47 5f 42 55  define VFSLOG_BU
0e30: 46 46 45 52 53 49 5a 45 20 38 31 39 32 0a 0a 74  FFERSIZE 8192..t
0e40: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56 66  ypedef struct Vf
0e50: 73 6c 6f 67 56 66 73 20 56 66 73 6c 6f 67 56 66  slogVfs VfslogVf
0e60: 73 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  s;.typedef struc
0e70: 74 20 56 66 73 6c 6f 67 46 69 6c 65 20 56 66 73  t VfslogFile Vfs
0e80: 6c 6f 67 46 69 6c 65 3b 0a 0a 73 74 72 75 63 74  logFile;..struct
0e90: 20 56 66 73 6c 6f 67 56 66 73 20 7b 0a 20 20 73   VfslogVfs {.  s
0ea0: 71 6c 69 74 65 33 5f 76 66 73 20 62 61 73 65 3b  qlite3_vfs base;
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0ec0: 2a 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f  * VFS methods */
0ed0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
0ee0: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20  pVfs;           
0ef0: 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 56 46 53     /* Parent VFS
0f00: 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 78 74 46   */.  int iNextF
0f10: 69 6c 65 49 64 3b 20 20 20 20 20 20 20 20 20 20  ileId;          
0f20: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69        /* Next fi
0f30: 6c 65 20 69 64 20 2a 2f 0a 20 20 73 71 6c 69 74  le id */.  sqlit
0f40: 65 33 5f 66 69 6c 65 20 2a 70 4c 6f 67 3b 20 20  e3_file *pLog;  
0f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
0f60: 67 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f  g file handle */
0f70: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
0f80: 20 69 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20   iOffset;       
0f90: 20 20 20 2f 2a 20 4c 6f 67 20 66 69 6c 65 20 6f     /* Log file o
0fa0: 66 66 73 65 74 20 6f 66 20 73 74 61 72 74 20 6f  ffset of start o
0fb0: 66 20 77 72 69 74 65 20 62 75 66 66 65 72 20 2a  f write buffer *
0fc0: 2f 0a 20 20 69 6e 74 20 6e 42 75 66 3b 20 20 20  /.  int nBuf;   
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fe0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0ff0: 20 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e 20   valid bytes in 
1000: 61 42 75 66 5b 5d 20 2a 2f 0a 20 20 63 68 61 72  aBuf[] */.  char
1010: 20 61 42 75 66 5b 56 46 53 4c 4f 47 5f 42 55 46   aBuf[VFSLOG_BUF
1020: 46 45 52 53 49 5a 45 5d 3b 20 20 20 2f 2a 20 57  FERSIZE];   /* W
1030: 72 69 74 65 20 62 75 66 66 65 72 20 2a 2f 0a 7d  rite buffer */.}
1040: 3b 0a 0a 73 74 72 75 63 74 20 56 66 73 6c 6f 67  ;..struct Vfslog
1050: 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  File {.  sqlite3
1060: 5f 66 69 6c 65 20 62 61 73 65 3b 20 20 20 20 20  _file base;     
1070: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4f 20 6d           /* IO m
1080: 65 74 68 6f 64 73 20 2a 2f 0a 20 20 73 71 6c 69  ethods */.  sqli
1090: 74 65 33 5f 66 69 6c 65 20 2a 70 52 65 61 6c 3b  te3_file *pReal;
10a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
10b0: 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 68  nderlying file h
10c0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  andle */.  sqlit
10d0: 65 33 5f 76 66 73 20 2a 70 56 66 73 6c 6f 67 3b  e3_vfs *pVfslog;
10e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
10f0: 73 6f 63 69 61 74 65 64 20 56 73 66 6c 6f 67 56  sociated VsflogV
1100: 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  fs object */.  i
1110: 6e 74 20 69 46 69 6c 65 49 64 3b 20 20 20 20 20  nt iFileId;     
1120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1130: 2a 20 46 69 6c 65 20 69 64 20 6e 75 6d 62 65 72  * File id number
1140: 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20   */.};..#define 
1150: 52 45 41 4c 56 46 53 28 70 29 20 28 28 28 56 66  REALVFS(p) (((Vf
1160: 73 6c 6f 67 56 66 73 20 2a 29 28 70 29 29 2d 3e  slogVfs *)(p))->
1170: 70 56 66 73 29 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  pVfs)..../*.** M
1180: 65 74 68 6f 64 20 64 65 63 6c 61 72 61 74 69 6f  ethod declaratio
1190: 6e 73 20 66 6f 72 20 76 66 73 6c 6f 67 5f 66 69  ns for vfslog_fi
11a0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
11b0: 74 20 76 66 73 6c 6f 67 43 6c 6f 73 65 28 73 71  t vfslogClose(sq
11c0: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74  lite3_file*);.st
11d0: 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 52  atic int vfslogR
11e0: 65 61 64 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ead(sqlite3_file
11f0: 2a 2c 20 76 6f 69 64 2a 2c 20 69 6e 74 20 69 41  *, void*, int iA
1200: 6d 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  mt, sqlite3_int6
1210: 34 20 69 4f 66 73 74 29 3b 0a 73 74 61 74 69 63  4 iOfst);.static
1220: 20 69 6e 74 20 76 66 73 6c 6f 67 57 72 69 74 65   int vfslogWrite
1230: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 63  (sqlite3_file*,c
1240: 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 20 69  onst void*,int i
1250: 41 6d 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  Amt, sqlite3_int
1260: 36 34 20 69 4f 66 73 74 29 3b 0a 73 74 61 74 69  64 iOfst);.stati
1270: 63 20 69 6e 74 20 76 66 73 6c 6f 67 54 72 75 6e  c int vfslogTrun
1280: 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  cate(sqlite3_fil
1290: 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  e*, sqlite3_int6
12a0: 34 20 73 69 7a 65 29 3b 0a 73 74 61 74 69 63 20  4 size);.static 
12b0: 69 6e 74 20 76 66 73 6c 6f 67 53 79 6e 63 28 73  int vfslogSync(s
12c0: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
12d0: 74 20 66 6c 61 67 73 29 3b 0a 73 74 61 74 69 63  t flags);.static
12e0: 20 69 6e 74 20 76 66 73 6c 6f 67 46 69 6c 65 53   int vfslogFileS
12f0: 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
1300: 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  *, sqlite3_int64
1310: 20 2a 70 53 69 7a 65 29 3b 0a 73 74 61 74 69 63   *pSize);.static
1320: 20 69 6e 74 20 76 66 73 6c 6f 67 4c 6f 63 6b 28   int vfslogLock(
1330: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
1340: 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  nt);.static int 
1350: 76 66 73 6c 6f 67 55 6e 6c 6f 63 6b 28 73 71 6c  vfslogUnlock(sql
1360: 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
1370: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73  ;.static int vfs
1380: 6c 6f 67 43 68 65 63 6b 52 65 73 65 72 76 65 64  logCheckReserved
1390: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
13a0: 65 2a 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  e*, int *pResOut
13b0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  );.static int vf
13c0: 73 6c 6f 67 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  slogFileControl(
13d0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
13e0: 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
13f0: 67 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 76  g);.static int v
1400: 66 73 6c 6f 67 53 65 63 74 6f 72 53 69 7a 65 28  fslogSectorSize(
1410: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a  sqlite3_file*);.
1420: 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f  static int vfslo
1430: 67 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  gDeviceCharacter
1440: 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66  istics(sqlite3_f
1450: 69 6c 65 2a 29 3b 0a 0a 73 74 61 74 69 63 20 69  ile*);..static i
1460: 6e 74 20 76 66 73 6c 6f 67 53 68 6d 4c 6f 63 6b  nt vfslogShmLock
1470: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
1480: 46 69 6c 65 2c 20 69 6e 74 20 6f 66 73 74 2c 20  File, int ofst, 
1490: 69 6e 74 20 6e 2c 20 69 6e 74 20 66 6c 61 67 73  int n, int flags
14a0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  );.static int vf
14b0: 73 6c 6f 67 53 68 6d 4d 61 70 28 73 71 6c 69 74  slogShmMap(sqlit
14c0: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 69  e3_file *pFile,i
14d0: 6e 74 2c 69 6e 74 2c 69 6e 74 2c 76 6f 6c 61 74  nt,int,int,volat
14e0: 69 6c 65 20 76 6f 69 64 20 2a 2a 29 3b 0a 73 74  ile void **);.st
14f0: 61 74 69 63 20 76 6f 69 64 20 76 66 73 6c 6f 67  atic void vfslog
1500: 53 68 6d 42 61 72 72 69 65 72 28 73 71 6c 69 74  ShmBarrier(sqlit
1510: 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69  e3_file*);.stati
1520: 63 20 69 6e 74 20 76 66 73 6c 6f 67 53 68 6d 55  c int vfslogShmU
1530: 6e 6d 61 70 28 73 71 6c 69 74 65 33 5f 66 69 6c  nmap(sqlite3_fil
1540: 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 64 65  e *pFile, int de
1550: 6c 65 74 65 46 6c 61 67 29 3b 0a 0a 2f 2a 0a 2a  leteFlag);../*.*
1560: 2a 20 4d 65 74 68 6f 64 20 64 65 63 6c 61 72 61  * Method declara
1570: 74 69 6f 6e 73 20 66 6f 72 20 76 66 73 6c 6f 67  tions for vfslog
1580: 5f 76 66 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  _vfs..*/.static 
1590: 69 6e 74 20 76 66 73 6c 6f 67 4f 70 65 6e 28 73  int vfslogOpen(s
15a0: 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e  qlite3_vfs*, con
15b0: 73 74 20 63 68 61 72 20 2a 2c 20 73 71 6c 69 74  st char *, sqlit
15c0: 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 2c 20  e3_file*, int , 
15d0: 69 6e 74 20 2a 29 3b 0a 73 74 61 74 69 63 20 69  int *);.static i
15e0: 6e 74 20 76 66 73 6c 6f 67 44 65 6c 65 74 65 28  nt vfslogDelete(
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 73 79 6e 63 44 69 72 29 3b 0a 73   int syncDir);.s
1620: 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67  tatic int vfslog
1630: 41 63 63 65 73 73 28 73 71 6c 69 74 65 33 5f 76  Access(sqlite3_v
1640: 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  fs*, const char 
1650: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 66 6c 61 67  *zName, int flag
1660: 73 2c 20 69 6e 74 20 2a 29 3b 0a 73 74 61 74 69  s, int *);.stati
1670: 63 20 69 6e 74 20 76 66 73 6c 6f 67 46 75 6c 6c  c int vfslogFull
1680: 50 61 74 68 6e 61 6d 65 28 73 71 6c 69 74 65 33  Pathname(sqlite3
1690: 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61  _vfs*, const cha
16a0: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 2c 20 63  r *zName, int, c
16b0: 68 61 72 20 2a 7a 4f 75 74 29 3b 0a 73 74 61 74  har *zOut);.stat
16c0: 69 63 20 76 6f 69 64 20 2a 76 66 73 6c 6f 67 44  ic void *vfslogD
16d0: 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
16e0: 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  s*, const char *
16f0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 73 74 61 74  zFilename);.stat
1700: 69 63 20 76 6f 69 64 20 76 66 73 6c 6f 67 44 6c  ic void vfslogDl
1710: 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
1720: 73 2a 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63  s*, int nByte, c
1730: 68 61 72 20 2a 7a 45 72 72 4d 73 67 29 3b 0a 73  har *zErrMsg);.s
1740: 74 61 74 69 63 20 76 6f 69 64 20 28 2a 76 66 73  tatic void (*vfs
1750: 6c 6f 67 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  logDlSym(sqlite3
1760: 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
1770: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a   *p, const char*
1780: 7a 53 79 6d 29 29 28 76 6f 69 64 29 3b 0a 73 74  zSym))(void);.st
1790: 61 74 69 63 20 76 6f 69 64 20 76 66 73 6c 6f 67  atic void vfslog
17a0: 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  DlClose(sqlite3_
17b0: 76 66 73 2a 2c 20 76 6f 69 64 2a 29 3b 0a 73 74  vfs*, void*);.st
17c0: 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 52  atic int vfslogR
17d0: 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65  andomness(sqlite
17e0: 33 5f 76 66 73 2a 2c 20 69 6e 74 20 6e 42 79 74  3_vfs*, int nByt
17f0: 65 2c 20 63 68 61 72 20 2a 7a 4f 75 74 29 3b 0a  e, char *zOut);.
1800: 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f  static int vfslo
1810: 67 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76  gSleep(sqlite3_v
1820: 66 73 2a 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  fs*, int microse
1830: 63 6f 6e 64 73 29 3b 0a 73 74 61 74 69 63 20 69  conds);.static i
1840: 6e 74 20 76 66 73 6c 6f 67 43 75 72 72 65 6e 74  nt vfslogCurrent
1850: 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  Time(sqlite3_vfs
1860: 2a 2c 20 64 6f 75 62 6c 65 2a 29 3b 0a 0a 73 74  *, double*);..st
1870: 61 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 47  atic int vfslogG
1880: 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
1890: 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74 2c 20 63  te3_vfs*, int, c
18a0: 68 61 72 20 2a 29 3b 0a 73 74 61 74 69 63 20 69  har *);.static i
18b0: 6e 74 20 76 66 73 6c 6f 67 43 75 72 72 65 6e 74  nt vfslogCurrent
18c0: 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65  TimeInt64(sqlite
18d0: 33 5f 76 66 73 2a 2c 20 73 71 6c 69 74 65 33 5f  3_vfs*, sqlite3_
18e0: 69 6e 74 36 34 2a 29 3b 0a 0a 73 74 61 74 69 63  int64*);..static
18f0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 76 66 73   sqlite3_vfs vfs
1900: 6c 6f 67 5f 76 66 73 20 3d 20 7b 0a 20 20 31 2c  log_vfs = {.  1,
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1930: 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 73   iVersion */.  s
1940: 69 7a 65 6f 66 28 56 66 73 6c 6f 67 46 69 6c 65  izeof(VfslogFile
1950: 29 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ),             /
1960: 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20  * szOsFile */.  
1970: 49 4e 53 54 5f 4d 41 58 5f 50 41 54 48 4e 41 4d  INST_MAX_PATHNAM
1980: 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E,              
1990: 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
19a0: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c0: 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
19d0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 30   /* zName */.  0
1a00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a20: 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20  * pAppData */.  
1a30: 76 66 73 6c 6f 67 4f 70 65 6e 2c 20 20 20 20 20  vfslogOpen,     
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a50: 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 76 66  /* xOpen */.  vf
1a60: 73 6c 6f 67 44 65 6c 65 74 65 2c 20 20 20 20 20  slogDelete,     
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a80: 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 76 66   xDelete */.  vf
1a90: 73 6c 6f 67 41 63 63 65 73 73 2c 20 20 20 20 20  slogAccess,     
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ab0: 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 76 66   xAccess */.  vf
1ac0: 73 6c 6f 67 46 75 6c 6c 50 61 74 68 6e 61 6d 65  slogFullPathname
1ad0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1ae0: 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
1af0: 2f 0a 20 20 76 66 73 6c 6f 67 44 6c 4f 70 65 6e  /.  vfslogDlOpen
1b00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b10: 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
1b20: 2f 0a 20 20 76 66 73 6c 6f 67 44 6c 45 72 72 6f  /.  vfslogDlErro
1b30: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
1b40: 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20      /* xDlError 
1b50: 2a 2f 0a 20 20 76 66 73 6c 6f 67 44 6c 53 79 6d  */.  vfslogDlSym
1b60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b70: 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
1b80: 2f 0a 20 20 76 66 73 6c 6f 67 44 6c 43 6c 6f 73  /.  vfslogDlClos
1b90: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1ba0: 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20      /* xDlClose 
1bb0: 2a 2f 0a 20 20 76 66 73 6c 6f 67 52 61 6e 64 6f  */.  vfslogRando
1bc0: 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  mness,          
1bd0: 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
1be0: 65 73 73 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 53  ess */.  vfslogS
1bf0: 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20  leep,           
1c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
1c10: 65 70 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 43 75  ep */.  vfslogCu
1c20: 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
1c30: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72          /* xCurr
1c40: 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 76 66 73  entTime */.  vfs
1c50: 6c 6f 67 47 65 74 4c 61 73 74 45 72 72 6f 72 2c  logGetLastError,
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c70: 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f  xGetLastError */
1c80: 0a 20 20 76 66 73 6c 6f 67 43 75 72 72 65 6e 74  .  vfslogCurrent
1c90: 54 69 6d 65 49 6e 74 36 34 20 20 20 20 20 20 20  TimeInt64       
1ca0: 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
1cb0: 6d 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63  me */.};..static
1cc0: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1cd0: 6f 64 73 20 76 66 73 6c 6f 67 5f 69 6f 5f 6d 65  ods vfslog_io_me
1ce0: 74 68 6f 64 73 20 3d 20 7b 0a 20 20 32 2c 20 20  thods = {.  2,  
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1d10: 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 76 66 73  Version */.  vfs
1d20: 6c 6f 67 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  logClose,       
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d40: 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 76 66 73 6c  xClose */.  vfsl
1d50: 6f 67 52 65 61 64 2c 20 20 20 20 20 20 20 20 20  ogRead,         
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1d70: 52 65 61 64 20 2a 2f 0a 20 20 76 66 73 6c 6f 67  Read */.  vfslog
1d80: 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
1d90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
1da0: 69 74 65 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 54  ite */.  vfslogT
1db0: 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
1dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
1dd0: 6e 63 61 74 65 20 2a 2f 0a 20 20 76 66 73 6c 6f  ncate */.  vfslo
1de0: 67 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20  gSync,          
1df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1e00: 79 6e 63 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 46  ync */.  vfslogF
1e10: 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
1e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
1e30: 65 53 69 7a 65 20 2a 2f 0a 20 20 76 66 73 6c 6f  eSize */.  vfslo
1e40: 67 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  gLock,          
1e50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
1e60: 6f 63 6b 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 55  ock */.  vfslogU
1e70: 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
1e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
1e90: 6f 63 6b 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 43  ock */.  vfslogC
1ea0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1eb0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ,        /* xChe
1ec0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
1ed0: 2f 0a 20 20 76 66 73 6c 6f 67 46 69 6c 65 43 6f  /.  vfslogFileCo
1ee0: 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  ntrol,          
1ef0: 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74      /* xFileCont
1f00: 72 6f 6c 20 2a 2f 0a 20 20 76 66 73 6c 6f 67 53  rol */.  vfslogS
1f10: 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20  ectorSize,      
1f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
1f30: 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 76 66 73  torSize */.  vfs
1f40: 6c 6f 67 44 65 76 69 63 65 43 68 61 72 61 63 74  logDeviceCharact
1f50: 65 72 69 73 74 69 63 73 2c 20 20 20 20 2f 2a 20  eristics,    /* 
1f60: 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
1f70: 69 73 74 69 63 73 20 2a 2f 0a 20 20 76 66 73 6c  istics */.  vfsl
1f80: 6f 67 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20  ogShmMap,       
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1fa0: 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 76 66 73 6c  ShmMap */.  vfsl
1fb0: 6f 67 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20  ogShmLock,      
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1fd0: 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 76 66 73  ShmLock */.  vfs
1fe0: 6c 6f 67 53 68 6d 42 61 72 72 69 65 72 2c 20 20  logShmBarrier,  
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2000: 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20  xShmBarrier */. 
2010: 20 76 66 73 6c 6f 67 53 68 6d 55 6e 6d 61 70 20   vfslogShmUnmap 
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2030: 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f   /* xShmUnmap */
2040: 0a 7d 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  .};..#if SQLITE_
2050: 4f 53 5f 55 4e 49 58 20 26 26 20 21 64 65 66 69  OS_UNIX && !defi
2060: 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 23  ned(NO_GETTOD).#
2070: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d  include <sys/tim
2080: 65 2e 68 3e 0a 73 74 61 74 69 63 20 73 71 6c 69  e.h>.static sqli
2090: 74 65 33 5f 75 69 6e 74 36 34 20 76 66 73 6c 6f  te3_uint64 vfslo
20a0: 67 5f 74 69 6d 65 28 29 7b 0a 20 20 73 74 72 75  g_time(){.  stru
20b0: 63 74 20 74 69 6d 65 76 61 6c 20 73 54 69 6d 65  ct timeval sTime
20c0: 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79  ;.  gettimeofday
20d0: 28 26 73 54 69 6d 65 2c 20 30 29 3b 0a 20 20 72  (&sTime, 0);.  r
20e0: 65 74 75 72 6e 20 73 54 69 6d 65 2e 74 76 5f 75  eturn sTime.tv_u
20f0: 73 65 63 20 2b 20 28 73 71 6c 69 74 65 33 5f 75  sec + (sqlite3_u
2100: 69 6e 74 36 34 29 73 54 69 6d 65 2e 74 76 5f 73  int64)sTime.tv_s
2110: 65 63 20 2a 20 31 30 30 30 30 30 30 3b 0a 7d 0a  ec * 1000000;.}.
2120: 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  #elif SQLITE_OS_
2130: 57 49 4e 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69  WIN.#include <ti
2140: 6d 65 2e 68 3e 0a 73 74 61 74 69 63 20 73 71 6c  me.h>.static sql
2150: 69 74 65 33 5f 75 69 6e 74 36 34 20 76 66 73 6c  ite3_uint64 vfsl
2160: 6f 67 5f 74 69 6d 65 28 29 7b 0a 20 20 46 49 4c  og_time(){.  FIL
2170: 45 54 49 4d 45 20 66 74 3b 0a 20 20 73 71 6c 69  ETIME ft;.  sqli
2180: 74 65 33 5f 75 69 6e 74 36 34 20 75 36 34 74 69  te3_uint64 u64ti
2190: 6d 65 20 3d 20 30 3b 0a 20 0a 20 20 47 65 74 53  me = 0;. .  GetS
21a0: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
21b0: 69 6d 65 28 26 66 74 29 3b 0a 0a 20 20 75 36 34  ime(&ft);..  u64
21c0: 74 69 6d 65 20 7c 3d 20 66 74 2e 64 77 48 69 67  time |= ft.dwHig
21d0: 68 44 61 74 65 54 69 6d 65 3b 0a 20 20 75 36 34  hDateTime;.  u64
21e0: 74 69 6d 65 20 3c 3c 3d 20 33 32 3b 0a 20 20 75  time <<= 32;.  u
21f0: 36 34 74 69 6d 65 20 7c 3d 20 66 74 2e 64 77 4c  64time |= ft.dwL
2200: 6f 77 44 61 74 65 54 69 6d 65 3b 0a 0a 20 20 2f  owDateTime;..  /
2210: 2a 20 66 74 20 69 73 20 31 30 30 2d 6e 61 6e 6f  * ft is 100-nano
2220: 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73  second intervals
2230: 2c 20 77 65 20 77 61 6e 74 20 6d 69 63 72 6f 73  , we want micros
2240: 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 72 65 74 75  econds */.  retu
2250: 72 6e 20 75 36 34 74 69 6d 65 20 2f 28 73 71 6c  rn u64time /(sql
2260: 69 74 65 33 5f 75 69 6e 74 36 34 29 31 30 3b 0a  ite3_uint64)10;.
2270: 7d 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 73  }.#else.static s
2280: 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 76 66  qlite3_uint64 vf
2290: 73 6c 6f 67 5f 74 69 6d 65 28 29 7b 0a 20 20 72  slog_time(){.  r
22a0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
22b0: 66 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  f..static void v
22c0: 66 73 6c 6f 67 5f 63 61 6c 6c 28 73 71 6c 69 74  fslog_call(sqlit
22d0: 65 33 5f 76 66 73 20 2a 2c 20 69 6e 74 2c 20 69  e3_vfs *, int, i
22e0: 6e 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nt, sqlite3_int6
22f0: 34 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74  4, int, int, int
2300: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  );.static void v
2310: 66 73 6c 6f 67 5f 73 74 72 69 6e 67 28 73 71 6c  fslog_string(sql
2320: 69 74 65 33 5f 76 66 73 20 2a 2c 20 63 6f 6e 73  ite3_vfs *, cons
2330: 74 20 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a  t char *);../*.*
2340: 2a 20 43 6c 6f 73 65 20 61 6e 20 76 66 73 6c 6f  * Close an vfslo
2350: 67 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  g-file..*/.stati
2360: 63 20 69 6e 74 20 76 66 73 6c 6f 67 43 6c 6f 73  c int vfslogClos
2370: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
2380: 70 46 69 6c 65 29 7b 0a 20 20 73 71 6c 69 74 65  pFile){.  sqlite
2390: 33 5f 75 69 6e 74 36 34 20 74 3b 0a 20 20 69 6e  3_uint64 t;.  in
23a0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
23b0: 3b 0a 20 20 56 66 73 6c 6f 67 46 69 6c 65 20 2a  ;.  VfslogFile *
23c0: 70 20 3d 20 28 56 66 73 6c 6f 67 46 69 6c 65 20  p = (VfslogFile 
23d0: 2a 29 70 46 69 6c 65 3b 0a 0a 20 20 74 20 3d 20  *)pFile;..  t = 
23e0: 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29 3b 0a 20  vfslog_time();. 
23f0: 20 69 66 28 20 70 2d 3e 70 52 65 61 6c 2d 3e 70   if( p->pReal->p
2400: 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72  Methods ){.    r
2410: 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  c = p->pReal->pM
2420: 65 74 68 6f 64 73 2d 3e 78 43 6c 6f 73 65 28 70  ethods->xClose(p
2430: 2d 3e 70 52 65 61 6c 29 3b 0a 20 20 7d 0a 20 20  ->pReal);.  }.  
2440: 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28  t = vfslog_time(
2450: 29 20 2d 20 74 3b 0a 20 20 76 66 73 6c 6f 67 5f  ) - t;.  vfslog_
2460: 63 61 6c 6c 28 70 2d 3e 70 56 66 73 6c 6f 67 2c  call(p->pVfslog,
2470: 20 4f 53 5f 43 4c 4f 53 45 2c 20 70 2d 3e 69 46   OS_CLOSE, p->iF
2480: 69 6c 65 49 64 2c 20 74 2c 20 72 63 2c 20 30 2c  ileId, t, rc, 0,
2490: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63   0);.  return rc
24a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
24b0: 64 61 74 61 20 66 72 6f 6d 20 61 6e 20 76 66 73  data from an vfs
24c0: 6c 6f 67 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  log-file..*/.sta
24d0: 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 52 65  tic int vfslogRe
24e0: 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
24f0: 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 76 6f  le *pFile, .  vo
2500: 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74  id *zBuf, .  int
2510: 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65   iAmt, .  sqlite
2520: 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a  _int64 iOfst.){.
2530: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
2540: 74 65 33 5f 75 69 6e 74 36 34 20 74 3b 0a 20 20  te3_uint64 t;.  
2550: 56 66 73 6c 6f 67 46 69 6c 65 20 2a 70 20 3d 20  VfslogFile *p = 
2560: 28 56 66 73 6c 6f 67 46 69 6c 65 20 2a 29 70 46  (VfslogFile *)pF
2570: 69 6c 65 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f  ile;.  t = vfslo
2580: 67 5f 74 69 6d 65 28 29 3b 0a 20 20 72 63 20 3d  g_time();.  rc =
2590: 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68   p->pReal->pMeth
25a0: 6f 64 73 2d 3e 78 52 65 61 64 28 70 2d 3e 70 52  ods->xRead(p->pR
25b0: 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c  eal, zBuf, iAmt,
25c0: 20 69 4f 66 73 74 29 3b 0a 20 20 74 20 3d 20 76   iOfst);.  t = v
25d0: 66 73 6c 6f 67 5f 74 69 6d 65 28 29 20 2d 20 74  fslog_time() - t
25e0: 3b 0a 20 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28  ;.  vfslog_call(
25f0: 70 2d 3e 70 56 66 73 6c 6f 67 2c 20 4f 53 5f 52  p->pVfslog, OS_R
2600: 45 41 44 2c 20 70 2d 3e 69 46 69 6c 65 49 64 2c  EAD, p->iFileId,
2610: 20 74 2c 20 72 63 2c 20 69 41 6d 74 2c 20 28 69   t, rc, iAmt, (i
2620: 6e 74 29 69 4f 66 73 74 29 3b 0a 20 20 72 65 74  nt)iOfst);.  ret
2630: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2640: 20 57 72 69 74 65 20 64 61 74 61 20 74 6f 20 61   Write data to a
2650: 6e 20 76 66 73 6c 6f 67 2d 66 69 6c 65 2e 0a 2a  n vfslog-file..*
2660: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73  /.static int vfs
2670: 6c 6f 67 57 72 69 74 65 28 0a 20 20 73 71 6c 69  logWrite(.  sqli
2680: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
2690: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
26a0: 2c 0a 20 20 69 6e 74 20 69 41 6d 74 2c 0a 20 20  ,.  int iAmt,.  
26b0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f 66  sqlite_int64 iOf
26c0: 73 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  st.){.  int rc;.
26d0: 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34    sqlite3_uint64
26e0: 20 74 3b 0a 20 20 56 66 73 6c 6f 67 46 69 6c 65   t;.  VfslogFile
26f0: 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67 46 69 6c   *p = (VfslogFil
2700: 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 74 20 3d  e *)pFile;.  t =
2710: 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29 3b 0a   vfslog_time();.
2720: 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d    rc = p->pReal-
2730: 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 57 72 69 74  >pMethods->xWrit
2740: 65 28 70 2d 3e 70 52 65 61 6c 2c 20 7a 2c 20 69  e(p->pReal, z, i
2750: 41 6d 74 2c 20 69 4f 66 73 74 29 3b 0a 20 20 74  Amt, iOfst);.  t
2760: 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29   = vfslog_time()
2770: 20 2d 20 74 3b 0a 20 20 76 66 73 6c 6f 67 5f 63   - t;.  vfslog_c
2780: 61 6c 6c 28 70 2d 3e 70 56 66 73 6c 6f 67 2c 20  all(p->pVfslog, 
2790: 4f 53 5f 57 52 49 54 45 2c 20 70 2d 3e 69 46 69  OS_WRITE, p->iFi
27a0: 6c 65 49 64 2c 20 74 2c 20 72 63 2c 20 69 41 6d  leId, t, rc, iAm
27b0: 74 2c 20 28 69 6e 74 29 69 4f 66 73 74 29 3b 0a  t, (int)iOfst);.
27c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27d0: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
27e0: 6e 20 76 66 73 6c 6f 67 2d 66 69 6c 65 2e 0a 2a  n vfslog-file..*
27f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73  /.static int vfs
2800: 6c 6f 67 54 72 75 6e 63 61 74 65 28 73 71 6c 69  logTruncate(sqli
2810: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
2820: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 69   sqlite_int64 si
2830: 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ze){.  int rc;. 
2840: 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20   sqlite3_uint64 
2850: 74 3b 0a 20 20 56 66 73 6c 6f 67 46 69 6c 65 20  t;.  VfslogFile 
2860: 2a 70 20 3d 20 28 56 66 73 6c 6f 67 46 69 6c 65  *p = (VfslogFile
2870: 20 2a 29 70 46 69 6c 65 3b 0a 20 20 74 20 3d 20   *)pFile;.  t = 
2880: 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29 3b 0a 20  vfslog_time();. 
2890: 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e   rc = p->pReal->
28a0: 70 4d 65 74 68 6f 64 73 2d 3e 78 54 72 75 6e 63  pMethods->xTrunc
28b0: 61 74 65 28 70 2d 3e 70 52 65 61 6c 2c 20 73 69  ate(p->pReal, si
28c0: 7a 65 29 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f  ze);.  t = vfslo
28d0: 67 5f 74 69 6d 65 28 29 20 2d 20 74 3b 0a 20 20  g_time() - t;.  
28e0: 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70 2d 3e 70  vfslog_call(p->p
28f0: 56 66 73 6c 6f 67 2c 20 4f 53 5f 54 52 55 4e 43  Vfslog, OS_TRUNC
2900: 41 54 45 2c 20 70 2d 3e 69 46 69 6c 65 49 64 2c  ATE, p->iFileId,
2910: 20 74 2c 20 72 63 2c 20 30 2c 20 28 69 6e 74 29   t, rc, 0, (int)
2920: 73 69 7a 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  size);.  return 
2930: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  rc;.}../*.** Syn
2940: 63 20 61 6e 20 76 66 73 6c 6f 67 2d 66 69 6c 65  c an vfslog-file
2950: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2960: 76 66 73 6c 6f 67 53 79 6e 63 28 73 71 6c 69 74  vfslogSync(sqlit
2970: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
2980: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
2990: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
29a0: 75 69 6e 74 36 34 20 74 3b 0a 20 20 56 66 73 6c  uint64 t;.  Vfsl
29b0: 6f 67 46 69 6c 65 20 2a 70 20 3d 20 28 56 66 73  ogFile *p = (Vfs
29c0: 6c 6f 67 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  logFile *)pFile;
29d0: 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69  .  t = vfslog_ti
29e0: 6d 65 28 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e  me();.  rc = p->
29f0: 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
2a00: 3e 78 53 79 6e 63 28 70 2d 3e 70 52 65 61 6c 2c  >xSync(p->pReal,
2a10: 20 66 6c 61 67 73 29 3b 0a 20 20 74 20 3d 20 76   flags);.  t = v
2a20: 66 73 6c 6f 67 5f 74 69 6d 65 28 29 20 2d 20 74  fslog_time() - t
2a30: 3b 0a 20 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28  ;.  vfslog_call(
2a40: 70 2d 3e 70 56 66 73 6c 6f 67 2c 20 4f 53 5f 53  p->pVfslog, OS_S
2a50: 59 4e 43 2c 20 70 2d 3e 69 46 69 6c 65 49 64 2c  YNC, p->iFileId,
2a60: 20 74 2c 20 72 63 2c 20 66 6c 61 67 73 2c 20 30   t, rc, flags, 0
2a70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2a80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2a90: 74 68 65 20 63 75 72 72 65 6e 74 20 66 69 6c 65  the current file
2aa0: 2d 73 69 7a 65 20 6f 66 20 61 6e 20 76 66 73 6c  -size of an vfsl
2ab0: 6f 67 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  og-file..*/.stat
2ac0: 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 46 69 6c  ic int vfslogFil
2ad0: 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  eSize(sqlite3_fi
2ae0: 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74  le *pFile, sqlit
2af0: 65 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b  e_int64 *pSize){
2b00: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
2b10: 69 74 65 33 5f 75 69 6e 74 36 34 20 74 3b 0a 20  ite3_uint64 t;. 
2b20: 20 56 66 73 6c 6f 67 46 69 6c 65 20 2a 70 20 3d   VfslogFile *p =
2b30: 20 28 56 66 73 6c 6f 67 46 69 6c 65 20 2a 29 70   (VfslogFile *)p
2b40: 46 69 6c 65 3b 0a 20 20 74 20 3d 20 76 66 73 6c  File;.  t = vfsl
2b50: 6f 67 5f 74 69 6d 65 28 29 3b 0a 20 20 72 63 20  og_time();.  rc 
2b60: 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74  = p->pReal->pMet
2b70: 68 6f 64 73 2d 3e 78 46 69 6c 65 53 69 7a 65 28  hods->xFileSize(
2b80: 70 2d 3e 70 52 65 61 6c 2c 20 70 53 69 7a 65 29  p->pReal, pSize)
2b90: 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74  ;.  t = vfslog_t
2ba0: 69 6d 65 28 29 20 2d 20 74 3b 0a 20 20 76 66 73  ime() - t;.  vfs
2bb0: 6c 6f 67 5f 63 61 6c 6c 28 70 2d 3e 70 56 66 73  log_call(p->pVfs
2bc0: 6c 6f 67 2c 20 4f 53 5f 46 49 4c 45 53 49 5a 45  log, OS_FILESIZE
2bd0: 2c 20 70 2d 3e 69 46 69 6c 65 49 64 2c 20 74 2c  , p->iFileId, t,
2be0: 20 72 63 2c 20 30 2c 20 28 69 6e 74 29 2a 70 53   rc, 0, (int)*pS
2bf0: 69 7a 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ize);.  return r
2c00: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
2c10: 20 61 6e 20 76 66 73 6c 6f 67 2d 66 69 6c 65 2e   an vfslog-file.
2c20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
2c30: 66 73 6c 6f 67 4c 6f 63 6b 28 73 71 6c 69 74 65  fslogLock(sqlite
2c40: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
2c50: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  nt eLock){.  int
2c60: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75   rc;.  sqlite3_u
2c70: 69 6e 74 36 34 20 74 3b 0a 20 20 56 66 73 6c 6f  int64 t;.  Vfslo
2c80: 67 46 69 6c 65 20 2a 70 20 3d 20 28 56 66 73 6c  gFile *p = (Vfsl
2c90: 6f 67 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  ogFile *)pFile;.
2ca0: 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d    t = vfslog_tim
2cb0: 65 28 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 70  e();.  rc = p->p
2cc0: 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
2cd0: 78 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20  xLock(p->pReal, 
2ce0: 65 4c 6f 63 6b 29 3b 0a 20 20 74 20 3d 20 76 66  eLock);.  t = vf
2cf0: 73 6c 6f 67 5f 74 69 6d 65 28 29 20 2d 20 74 3b  slog_time() - t;
2d00: 0a 20 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70  .  vfslog_call(p
2d10: 2d 3e 70 56 66 73 6c 6f 67 2c 20 4f 53 5f 4c 4f  ->pVfslog, OS_LO
2d20: 43 4b 2c 20 70 2d 3e 69 46 69 6c 65 49 64 2c 20  CK, p->iFileId, 
2d30: 74 2c 20 72 63 2c 20 65 4c 6f 63 6b 2c 20 30 29  t, rc, eLock, 0)
2d40: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2d50: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61  ../*.** Unlock a
2d60: 6e 20 76 66 73 6c 6f 67 2d 66 69 6c 65 2e 0a 2a  n vfslog-file..*
2d70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73  /.static int vfs
2d80: 6c 6f 67 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  logUnlock(sqlite
2d90: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
2da0: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  nt eLock){.  int
2db0: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75   rc;.  sqlite3_u
2dc0: 69 6e 74 36 34 20 74 3b 0a 20 20 56 66 73 6c 6f  int64 t;.  Vfslo
2dd0: 67 46 69 6c 65 20 2a 70 20 3d 20 28 56 66 73 6c  gFile *p = (Vfsl
2de0: 6f 67 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  ogFile *)pFile;.
2df0: 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d    t = vfslog_tim
2e00: 65 28 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 70  e();.  rc = p->p
2e10: 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
2e20: 78 55 6e 6c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c  xUnlock(p->pReal
2e30: 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 74 20 3d 20  , eLock);.  t = 
2e40: 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29 20 2d 20  vfslog_time() - 
2e50: 74 3b 0a 20 20 76 66 73 6c 6f 67 5f 63 61 6c 6c  t;.  vfslog_call
2e60: 28 70 2d 3e 70 56 66 73 6c 6f 67 2c 20 4f 53 5f  (p->pVfslog, OS_
2e70: 55 4e 4c 4f 43 4b 2c 20 70 2d 3e 69 46 69 6c 65  UNLOCK, p->iFile
2e80: 49 64 2c 20 74 2c 20 72 63 2c 20 65 4c 6f 63 6b  Id, t, rc, eLock
2e90: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  , 0);.  return r
2ea0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  c;.}../*.** Chec
2eb0: 6b 20 69 66 20 61 6e 6f 74 68 65 72 20 66 69 6c  k if another fil
2ec0: 65 2d 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20 61  e-handle holds a
2ed0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
2ee0: 6e 20 61 6e 20 76 66 73 6c 6f 67 2d 66 69 6c 65  n an vfslog-file
2ef0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2f00: 76 66 73 6c 6f 67 43 68 65 63 6b 52 65 73 65 72  vfslogCheckReser
2f10: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
2f20: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
2f30: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
2f40: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
2f50: 75 69 6e 74 36 34 20 74 3b 0a 20 20 56 66 73 6c  uint64 t;.  Vfsl
2f60: 6f 67 46 69 6c 65 20 2a 70 20 3d 20 28 56 66 73  ogFile *p = (Vfs
2f70: 6c 6f 67 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  logFile *)pFile;
2f80: 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69  .  t = vfslog_ti
2f90: 6d 65 28 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e  me();.  rc = p->
2fa0: 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
2fb0: 3e 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  >xCheckReservedL
2fc0: 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 70 52  ock(p->pReal, pR
2fd0: 65 73 4f 75 74 29 3b 0a 20 20 74 20 3d 20 76 66  esOut);.  t = vf
2fe0: 73 6c 6f 67 5f 74 69 6d 65 28 29 20 2d 20 74 3b  slog_time() - t;
2ff0: 0a 20 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70  .  vfslog_call(p
3000: 2d 3e 70 56 66 73 6c 6f 67 2c 20 4f 53 5f 43 48  ->pVfslog, OS_CH
3010: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 2c  ECKRESERVEDLOCK,
3020: 20 70 2d 3e 69 46 69 6c 65 49 64 2c 20 74 2c 20   p->iFileId, t, 
3030: 72 63 2c 20 2a 70 52 65 73 4f 75 74 2c 20 30 29  rc, *pResOut, 0)
3040: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
3050: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 65 20 63 6f 6e  ../*.** File con
3060: 74 72 6f 6c 20 6d 65 74 68 6f 64 2e 20 46 6f 72  trol method. For
3070: 20 63 75 73 74 6f 6d 20 6f 70 65 72 61 74 69 6f   custom operatio
3080: 6e 73 20 6f 6e 20 61 6e 20 76 66 73 6c 6f 67 2d  ns on an vfslog-
3090: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
30a0: 69 6e 74 20 76 66 73 6c 6f 67 46 69 6c 65 43 6f  int vfslogFileCo
30b0: 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
30c0: 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 6f  le *pFile, int o
30d0: 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
30e0: 20 20 56 66 73 6c 6f 67 46 69 6c 65 20 2a 70 20    VfslogFile *p 
30f0: 3d 20 28 56 66 73 6c 6f 67 46 69 6c 65 20 2a 29  = (VfslogFile *)
3100: 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20  pFile;.  int rc 
3110: 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74  = p->pReal->pMet
3120: 68 6f 64 73 2d 3e 78 46 69 6c 65 43 6f 6e 74 72  hods->xFileContr
3130: 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20 6f 70 2c  ol(p->pReal, op,
3140: 20 70 41 72 67 29 3b 0a 20 20 69 66 28 20 6f 70   pArg);.  if( op
3150: 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  ==SQLITE_FCNTL_V
3160: 46 53 4e 41 4d 45 20 26 26 20 72 63 3d 3d 53 51  FSNAME && rc==SQ
3170: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
3180: 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73  (char**)pArg = s
3190: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
31a0: 76 66 73 6c 6f 67 2f 25 7a 22 2c 20 2a 28 63 68  vfslog/%z", *(ch
31b0: 61 72 2a 2a 29 70 41 72 67 29 3b 0a 20 20 7d 0a  ar**)pArg);.  }.
31c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
31d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
31e0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20   sector-size in 
31f0: 62 79 74 65 73 20 66 6f 72 20 61 6e 20 76 66 73  bytes for an vfs
3200: 6c 6f 67 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  log-file..*/.sta
3210: 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 53 65  tic int vfslogSe
3220: 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
3230: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
3240: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
3250: 65 33 5f 75 69 6e 74 36 34 20 74 3b 0a 20 20 56  e3_uint64 t;.  V
3260: 66 73 6c 6f 67 46 69 6c 65 20 2a 70 20 3d 20 28  fslogFile *p = (
3270: 56 66 73 6c 6f 67 46 69 6c 65 20 2a 29 70 46 69  VfslogFile *)pFi
3280: 6c 65 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67  le;.  t = vfslog
3290: 5f 74 69 6d 65 28 29 3b 0a 20 20 72 63 20 3d 20  _time();.  rc = 
32a0: 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
32b0: 64 73 2d 3e 78 53 65 63 74 6f 72 53 69 7a 65 28  ds->xSectorSize(
32c0: 70 2d 3e 70 52 65 61 6c 29 3b 0a 20 20 74 20 3d  p->pReal);.  t =
32d0: 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29 20 2d   vfslog_time() -
32e0: 20 74 3b 0a 20 20 76 66 73 6c 6f 67 5f 63 61 6c   t;.  vfslog_cal
32f0: 6c 28 70 2d 3e 70 56 66 73 6c 6f 67 2c 20 4f 53  l(p->pVfslog, OS
3300: 5f 53 45 43 54 4f 52 53 49 5a 45 2c 20 70 2d 3e  _SECTORSIZE, p->
3310: 69 46 69 6c 65 49 64 2c 20 74 2c 20 72 63 2c 20  iFileId, t, rc, 
3320: 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0, 0);.  return 
3330: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
3340: 75 72 6e 20 74 68 65 20 64 65 76 69 63 65 20 63  urn the device c
3350: 68 61 72 61 63 74 65 72 69 73 74 69 63 20 66 6c  haracteristic fl
3360: 61 67 73 20 73 75 70 70 6f 72 74 65 64 20 62 79  ags supported by
3370: 20 61 6e 20 76 66 73 6c 6f 67 2d 66 69 6c 65 2e   an vfslog-file.
3380: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
3390: 66 73 6c 6f 67 44 65 76 69 63 65 43 68 61 72 61  fslogDeviceChara
33a0: 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
33b0: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b  e3_file *pFile){
33c0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
33d0: 69 74 65 33 5f 75 69 6e 74 36 34 20 74 3b 0a 20  ite3_uint64 t;. 
33e0: 20 56 66 73 6c 6f 67 46 69 6c 65 20 2a 70 20 3d   VfslogFile *p =
33f0: 20 28 56 66 73 6c 6f 67 46 69 6c 65 20 2a 29 70   (VfslogFile *)p
3400: 46 69 6c 65 3b 0a 20 20 74 20 3d 20 76 66 73 6c  File;.  t = vfsl
3410: 6f 67 5f 74 69 6d 65 28 29 3b 0a 20 20 72 63 20  og_time();.  rc 
3420: 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74  = p->pReal->pMet
3430: 68 6f 64 73 2d 3e 78 44 65 76 69 63 65 43 68 61  hods->xDeviceCha
3440: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 2d 3e  racteristics(p->
3450: 70 52 65 61 6c 29 3b 0a 20 20 74 20 3d 20 76 66  pReal);.  t = vf
3460: 73 6c 6f 67 5f 74 69 6d 65 28 29 20 2d 20 74 3b  slog_time() - t;
3470: 0a 20 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70  .  vfslog_call(p
3480: 2d 3e 70 56 66 73 6c 6f 67 2c 20 4f 53 5f 44 45  ->pVfslog, OS_DE
3490: 56 43 48 41 52 2c 20 70 2d 3e 69 46 69 6c 65 49  VCHAR, p->iFileI
34a0: 64 2c 20 74 2c 20 72 63 2c 20 30 2c 20 30 29 3b  d, t, rc, 0, 0);
34b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
34c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c  .static int vfsl
34d0: 6f 67 53 68 6d 4c 6f 63 6b 28 73 71 6c 69 74 65  ogShmLock(sqlite
34e0: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
34f0: 6e 74 20 6f 66 73 74 2c 20 69 6e 74 20 6e 2c 20  nt ofst, int n, 
3500: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
3510: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
3520: 75 69 6e 74 36 34 20 74 3b 0a 20 20 56 66 73 6c  uint64 t;.  Vfsl
3530: 6f 67 46 69 6c 65 20 2a 70 20 3d 20 28 56 66 73  ogFile *p = (Vfs
3540: 6c 6f 67 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  logFile *)pFile;
3550: 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69  .  t = vfslog_ti
3560: 6d 65 28 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e  me();.  rc = p->
3570: 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
3580: 3e 78 53 68 6d 4c 6f 63 6b 28 70 2d 3e 70 52 65  >xShmLock(p->pRe
3590: 61 6c 2c 20 6f 66 73 74 2c 20 6e 2c 20 66 6c 61  al, ofst, n, fla
35a0: 67 73 29 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f  gs);.  t = vfslo
35b0: 67 5f 74 69 6d 65 28 29 20 2d 20 74 3b 0a 20 20  g_time() - t;.  
35c0: 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70 2d 3e 70  vfslog_call(p->p
35d0: 56 66 73 6c 6f 67 2c 20 4f 53 5f 53 48 4d 4c 4f  Vfslog, OS_SHMLO
35e0: 43 4b 2c 20 70 2d 3e 69 46 69 6c 65 49 64 2c 20  CK, p->iFileId, 
35f0: 74 2c 20 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20  t, rc, 0, 0);.  
3600: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
3610: 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 53 68  tic int vfslogSh
3620: 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
3630: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20  file *pFile, .  
3640: 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 0a 20 20  int iRegion, .  
3650: 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 0a 20  int szRegion, . 
3660: 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20 0a 20   int isWrite, . 
3670: 20 76 6f 6c 61 74 69 6c 65 20 76 6f 69 64 20 2a   volatile void *
3680: 2a 70 70 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pp.){.  int rc;
3690: 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36  .  sqlite3_uint6
36a0: 34 20 74 3b 0a 20 20 56 66 73 6c 6f 67 46 69 6c  4 t;.  VfslogFil
36b0: 65 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67 46 69  e *p = (VfslogFi
36c0: 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 74 20  le *)pFile;.  t 
36d0: 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29 3b  = vfslog_time();
36e0: 0a 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c  .  rc = p->pReal
36f0: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d  ->pMethods->xShm
3700: 4d 61 70 28 70 2d 3e 70 52 65 61 6c 2c 20 69 52  Map(p->pReal, iR
3710: 65 67 69 6f 6e 2c 20 73 7a 52 65 67 69 6f 6e 2c  egion, szRegion,
3720: 20 69 73 57 72 69 74 65 2c 20 70 70 29 3b 0a 20   isWrite, pp);. 
3730: 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65   t = vfslog_time
3740: 28 29 20 2d 20 74 3b 0a 20 20 76 66 73 6c 6f 67  () - t;.  vfslog
3750: 5f 63 61 6c 6c 28 70 2d 3e 70 56 66 73 6c 6f 67  _call(p->pVfslog
3760: 2c 20 4f 53 5f 53 48 4d 4d 41 50 2c 20 70 2d 3e  , OS_SHMMAP, p->
3770: 69 46 69 6c 65 49 64 2c 20 74 2c 20 72 63 2c 20  iFileId, t, rc, 
3780: 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0, 0);.  return 
3790: 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  rc;.}.static voi
37a0: 64 20 76 66 73 6c 6f 67 53 68 6d 42 61 72 72 69  d vfslogShmBarri
37b0: 65 72 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  er(sqlite3_file 
37c0: 2a 70 46 69 6c 65 29 7b 0a 20 20 73 71 6c 69 74  *pFile){.  sqlit
37d0: 65 33 5f 75 69 6e 74 36 34 20 74 3b 0a 20 20 56  e3_uint64 t;.  V
37e0: 66 73 6c 6f 67 46 69 6c 65 20 2a 70 20 3d 20 28  fslogFile *p = (
37f0: 56 66 73 6c 6f 67 46 69 6c 65 20 2a 29 70 46 69  VfslogFile *)pFi
3800: 6c 65 3b 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67  le;.  t = vfslog
3810: 5f 74 69 6d 65 28 29 3b 0a 20 20 70 2d 3e 70 52  _time();.  p->pR
3820: 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
3830: 53 68 6d 42 61 72 72 69 65 72 28 70 2d 3e 70 52  ShmBarrier(p->pR
3840: 65 61 6c 29 3b 0a 20 20 74 20 3d 20 76 66 73 6c  eal);.  t = vfsl
3850: 6f 67 5f 74 69 6d 65 28 29 20 2d 20 74 3b 0a 20  og_time() - t;. 
3860: 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70 2d 3e   vfslog_call(p->
3870: 70 56 66 73 6c 6f 67 2c 20 4f 53 5f 53 48 4d 42  pVfslog, OS_SHMB
3880: 41 52 52 49 45 52 2c 20 70 2d 3e 69 46 69 6c 65  ARRIER, p->iFile
3890: 49 64 2c 20 74 2c 20 53 51 4c 49 54 45 5f 4f 4b  Id, t, SQLITE_OK
38a0: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 73 74 61 74 69  , 0, 0);.}.stati
38b0: 63 20 69 6e 74 20 76 66 73 6c 6f 67 53 68 6d 55  c int vfslogShmU
38c0: 6e 6d 61 70 28 73 71 6c 69 74 65 33 5f 66 69 6c  nmap(sqlite3_fil
38d0: 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 64 65  e *pFile, int de
38e0: 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20 69 6e 74  leteFlag){.  int
38f0: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75   rc;.  sqlite3_u
3900: 69 6e 74 36 34 20 74 3b 0a 20 20 56 66 73 6c 6f  int64 t;.  Vfslo
3910: 67 46 69 6c 65 20 2a 70 20 3d 20 28 56 66 73 6c  gFile *p = (Vfsl
3920: 6f 67 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  ogFile *)pFile;.
3930: 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d    t = vfslog_tim
3940: 65 28 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 70  e();.  rc = p->p
3950: 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
3960: 78 53 68 6d 55 6e 6d 61 70 28 70 2d 3e 70 52 65  xShmUnmap(p->pRe
3970: 61 6c 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b  al, deleteFlag);
3980: 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69  .  t = vfslog_ti
3990: 6d 65 28 29 20 2d 20 74 3b 0a 20 20 76 66 73 6c  me() - t;.  vfsl
39a0: 6f 67 5f 63 61 6c 6c 28 70 2d 3e 70 56 66 73 6c  og_call(p->pVfsl
39b0: 6f 67 2c 20 4f 53 5f 53 48 4d 55 4e 4d 41 50 2c  og, OS_SHMUNMAP,
39c0: 20 70 2d 3e 69 46 69 6c 65 49 64 2c 20 74 2c 20   p->iFileId, t, 
39d0: 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74  rc, 0, 0);.  ret
39e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
39f0: 2a 20 4f 70 65 6e 20 61 6e 20 76 66 73 6c 6f 67  * Open an vfslog
3a00: 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
3a10: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 6c  .static int vfsl
3a20: 6f 67 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  ogOpen(.  sqlite
3a30: 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 63  3_vfs *pVfs,.  c
3a40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
3a50: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ,.  sqlite3_file
3a60: 20 2a 70 46 69 6c 65 2c 0a 20 20 69 6e 74 20 66   *pFile,.  int f
3a70: 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70 4f 75  lags,.  int *pOu
3a80: 74 46 6c 61 67 73 0a 29 7b 0a 20 20 69 6e 74 20  tFlags.){.  int 
3a90: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75 69  rc;.  sqlite3_ui
3aa0: 6e 74 36 34 20 74 3b 0a 20 20 56 66 73 6c 6f 67  nt64 t;.  Vfslog
3ab0: 46 69 6c 65 20 2a 70 20 3d 20 28 56 66 73 6c 6f  File *p = (Vfslo
3ac0: 67 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  gFile *)pFile;. 
3ad0: 20 56 66 73 6c 6f 67 56 66 73 20 2a 70 4c 6f 67   VfslogVfs *pLog
3ae0: 20 3d 20 28 56 66 73 6c 6f 67 56 66 73 20 2a 29   = (VfslogVfs *)
3af0: 70 56 66 73 3b 0a 0a 20 20 70 46 69 6c 65 2d 3e  pVfs;..  pFile->
3b00: 70 4d 65 74 68 6f 64 73 20 3d 20 26 76 66 73 6c  pMethods = &vfsl
3b10: 6f 67 5f 69 6f 5f 6d 65 74 68 6f 64 73 3b 0a 20  og_io_methods;. 
3b20: 20 70 2d 3e 70 52 65 61 6c 20 3d 20 28 73 71 6c   p->pReal = (sql
3b30: 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 5b 31  ite3_file *)&p[1
3b40: 5d 3b 0a 20 20 70 2d 3e 70 56 66 73 6c 6f 67 20  ];.  p->pVfslog 
3b50: 3d 20 70 56 66 73 3b 0a 20 20 70 2d 3e 69 46 69  = pVfs;.  p->iFi
3b60: 6c 65 49 64 20 3d 20 2b 2b 70 4c 6f 67 2d 3e 69  leId = ++pLog->i
3b70: 4e 65 78 74 46 69 6c 65 49 64 3b 0a 0a 20 20 74  NextFileId;..  t
3b80: 20 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29   = vfslog_time()
3b90: 3b 0a 20 20 72 63 20 3d 20 52 45 41 4c 56 46 53  ;.  rc = REALVFS
3ba0: 28 70 56 66 73 29 2d 3e 78 4f 70 65 6e 28 52 45  (pVfs)->xOpen(RE
3bb0: 41 4c 56 46 53 28 70 56 66 73 29 2c 20 7a 4e 61  ALVFS(pVfs), zNa
3bc0: 6d 65 2c 20 70 2d 3e 70 52 65 61 6c 2c 20 66 6c  me, p->pReal, fl
3bd0: 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b  ags, pOutFlags);
3be0: 0a 20 20 74 20 3d 20 76 66 73 6c 6f 67 5f 74 69  .  t = vfslog_ti
3bf0: 6d 65 28 29 20 2d 20 74 3b 0a 0a 20 20 76 66 73  me() - t;..  vfs
3c00: 6c 6f 67 5f 63 61 6c 6c 28 70 56 66 73 2c 20 4f  log_call(pVfs, O
3c10: 53 5f 4f 50 45 4e 2c 20 70 2d 3e 69 46 69 6c 65  S_OPEN, p->iFile
3c20: 49 64 2c 20 74 2c 20 72 63 2c 20 30 2c 20 30 29  Id, t, rc, 0, 0)
3c30: 3b 0a 20 20 76 66 73 6c 6f 67 5f 73 74 72 69 6e  ;.  vfslog_strin
3c40: 67 28 70 56 66 73 2c 20 7a 4e 61 6d 65 29 3b 0a  g(pVfs, zName);.
3c50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
3c60: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
3c70: 20 66 69 6c 65 20 6c 6f 63 61 74 65 64 20 61 74   file located at
3c80: 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64   zPath. If the d
3c90: 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20  irSync argument 
3ca0: 69 73 20 74 72 75 65 2c 0a 2a 2a 20 65 6e 73 75  is true,.** ensu
3cb0: 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  re the file-syst
3cc0: 65 6d 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73  em modifications
3cd0: 20 61 72 65 20 73 79 6e 63 65 64 20 74 6f 20 64   are synced to d
3ce0: 69 73 6b 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65  isk before.** re
3cf0: 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
3d00: 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 44 65 6c  ic int vfslogDel
3d10: 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ete(sqlite3_vfs 
3d20: 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61  *pVfs, const cha
3d30: 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 64 69  r *zPath, int di
3d40: 72 53 79 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63  rSync){.  int rc
3d50: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74  ;.  sqlite3_uint
3d60: 36 34 20 74 3b 0a 20 20 74 20 3d 20 76 66 73 6c  64 t;.  t = vfsl
3d70: 6f 67 5f 74 69 6d 65 28 29 3b 0a 20 20 72 63 20  og_time();.  rc 
3d80: 3d 20 52 45 41 4c 56 46 53 28 70 56 66 73 29 2d  = REALVFS(pVfs)-
3d90: 3e 78 44 65 6c 65 74 65 28 52 45 41 4c 56 46 53  >xDelete(REALVFS
3da0: 28 70 56 66 73 29 2c 20 7a 50 61 74 68 2c 20 64  (pVfs), zPath, d
3db0: 69 72 53 79 6e 63 29 3b 0a 20 20 74 20 3d 20 76  irSync);.  t = v
3dc0: 66 73 6c 6f 67 5f 74 69 6d 65 28 29 20 2d 20 74  fslog_time() - t
3dd0: 3b 0a 20 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28  ;.  vfslog_call(
3de0: 70 56 66 73 2c 20 4f 53 5f 44 45 4c 45 54 45 2c  pVfs, OS_DELETE,
3df0: 20 30 2c 20 74 2c 20 72 63 2c 20 64 69 72 53 79   0, t, rc, dirSy
3e00: 6e 63 2c 20 30 29 3b 0a 20 20 76 66 73 6c 6f 67  nc, 0);.  vfslog
3e10: 5f 73 74 72 69 6e 67 28 70 56 66 73 2c 20 7a 50  _string(pVfs, zP
3e20: 61 74 68 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ath);.  return r
3e30: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74  c;.}../*.** Test
3e40: 20 66 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d   for access perm
3e50: 69 73 73 69 6f 6e 73 2e 20 52 65 74 75 72 6e 20  issions. Return 
3e60: 74 72 75 65 20 69 66 20 74 68 65 20 72 65 71 75  true if the requ
3e70: 65 73 74 65 64 20 70 65 72 6d 69 73 73 69 6f 6e  ested permission
3e80: 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
3e90: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
3ea0: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
3eb0: 69 6e 74 20 76 66 73 6c 6f 67 41 63 63 65 73 73  int vfslogAccess
3ec0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
3ed0: 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20  *pVfs, .  const 
3ee0: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20  char *zPath, .  
3ef0: 69 6e 74 20 66 6c 61 67 73 2c 20 0a 20 20 69 6e  int flags, .  in
3f00: 74 20 2a 70 52 65 73 4f 75 74 0a 29 7b 0a 20 20  t *pResOut.){.  
3f10: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
3f20: 33 5f 75 69 6e 74 36 34 20 74 3b 0a 20 20 74 20  3_uint64 t;.  t 
3f30: 3d 20 76 66 73 6c 6f 67 5f 74 69 6d 65 28 29 3b  = vfslog_time();
3f40: 0a 20 20 72 63 20 3d 20 52 45 41 4c 56 46 53 28  .  rc = REALVFS(
3f50: 70 56 66 73 29 2d 3e 78 41 63 63 65 73 73 28 52  pVfs)->xAccess(R
3f60: 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20 7a 50  EALVFS(pVfs), zP
3f70: 61 74 68 2c 20 66 6c 61 67 73 2c 20 70 52 65 73  ath, flags, pRes
3f80: 4f 75 74 29 3b 0a 20 20 74 20 3d 20 76 66 73 6c  Out);.  t = vfsl
3f90: 6f 67 5f 74 69 6d 65 28 29 20 2d 20 74 3b 0a 20  og_time() - t;. 
3fa0: 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70 56 66   vfslog_call(pVf
3fb0: 73 2c 20 4f 53 5f 41 43 43 45 53 53 2c 20 30 2c  s, OS_ACCESS, 0,
3fc0: 20 74 2c 20 72 63 2c 20 66 6c 61 67 73 2c 20 2a   t, rc, flags, *
3fd0: 70 52 65 73 4f 75 74 29 3b 0a 20 20 76 66 73 6c  pResOut);.  vfsl
3fe0: 6f 67 5f 73 74 72 69 6e 67 28 70 56 66 73 2c 20  og_string(pVfs, 
3ff0: 7a 50 61 74 68 29 3b 0a 20 20 72 65 74 75 72 6e  zPath);.  return
4000: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f   rc;.}../*.** Po
4010: 70 75 6c 61 74 65 20 62 75 66 66 65 72 20 7a 4f  pulate buffer zO
4020: 75 74 20 77 69 74 68 20 74 68 65 20 66 75 6c 6c  ut with the full
4030: 20 63 61 6e 6f 6e 69 63 61 6c 20 70 61 74 68 6e   canonical pathn
4040: 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ame correspondin
4050: 67 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 74 68  g.** to the path
4060: 6e 61 6d 65 20 69 6e 20 7a 50 61 74 68 2e 20 7a  name in zPath. z
4070: 4f 75 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  Out is guarantee
4080: 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  d to point to a 
4090: 62 75 66 66 65 72 0a 2a 2a 20 6f 66 20 61 74 20  buffer.** of at 
40a0: 6c 65 61 73 74 20 28 49 4e 53 54 5f 4d 41 58 5f  least (INST_MAX_
40b0: 50 41 54 48 4e 41 4d 45 2b 31 29 20 62 79 74 65  PATHNAME+1) byte
40c0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
40d0: 20 76 66 73 6c 6f 67 46 75 6c 6c 50 61 74 68 6e   vfslogFullPathn
40e0: 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
40f0: 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e  fs *pVfs, .  con
4100: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
4110: 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 0a 20 20  .  int nOut, .  
4120: 63 68 61 72 20 2a 7a 4f 75 74 0a 29 7b 0a 20 20  char *zOut.){.  
4130: 72 65 74 75 72 6e 20 52 45 41 4c 56 46 53 28 70  return REALVFS(p
4140: 56 66 73 29 2d 3e 78 46 75 6c 6c 50 61 74 68 6e  Vfs)->xFullPathn
4150: 61 6d 65 28 52 45 41 4c 56 46 53 28 70 56 66 73  ame(REALVFS(pVfs
4160: 29 2c 20 7a 50 61 74 68 2c 20 6e 4f 75 74 2c 20  ), zPath, nOut, 
4170: 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zOut);.}../*.** 
4180: 4f 70 65 6e 20 74 68 65 20 64 79 6e 61 6d 69 63  Open the dynamic
4190: 20 6c 69 62 72 61 72 79 20 6c 6f 63 61 74 65 64   library located
41a0: 20 61 74 20 7a 50 61 74 68 20 61 6e 64 20 72 65   at zPath and re
41b0: 74 75 72 6e 20 61 20 68 61 6e 64 6c 65 2e 0a 2a  turn a handle..*
41c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 76  /.static void *v
41d0: 66 73 6c 6f 67 44 6c 4f 70 65 6e 28 73 71 6c 69  fslogDlOpen(sqli
41e0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
41f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
4200: 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 45 41 4c  ){.  return REAL
4210: 56 46 53 28 70 56 66 73 29 2d 3e 78 44 6c 4f 70  VFS(pVfs)->xDlOp
4220: 65 6e 28 52 45 41 4c 56 46 53 28 70 56 66 73 29  en(REALVFS(pVfs)
4230: 2c 20 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a  , zPath);.}../*.
4240: 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  ** Populate the 
4250: 62 75 66 66 65 72 20 7a 45 72 72 4d 73 67 20 28  buffer zErrMsg (
4260: 73 69 7a 65 20 6e 42 79 74 65 20 62 79 74 65 73  size nByte bytes
4270: 29 20 77 69 74 68 20 61 20 68 75 6d 61 6e 20 72  ) with a human r
4280: 65 61 64 61 62 6c 65 0a 2a 2a 20 75 74 66 2d 38  eadable.** utf-8
4290: 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69   string describi
42a0: 6e 67 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ng the most rece
42b0: 6e 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74  nt error encount
42c0: 65 72 65 64 20 61 73 73 6f 63 69 61 74 65 64 20  ered associated 
42d0: 0a 2a 2a 20 77 69 74 68 20 64 79 6e 61 6d 69 63  .** with dynamic
42e0: 20 6c 69 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 73   libraries..*/.s
42f0: 74 61 74 69 63 20 76 6f 69 64 20 76 66 73 6c 6f  tatic void vfslo
4300: 67 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33  gDlError(sqlite3
4310: 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
4320: 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 45 72  nByte, char *zEr
4330: 72 4d 73 67 29 7b 0a 20 20 52 45 41 4c 56 46 53  rMsg){.  REALVFS
4340: 28 70 56 66 73 29 2d 3e 78 44 6c 45 72 72 6f 72  (pVfs)->xDlError
4350: 28 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20  (REALVFS(pVfs), 
4360: 6e 42 79 74 65 2c 20 7a 45 72 72 4d 73 67 29 3b  nByte, zErrMsg);
4370: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4380: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
4390: 65 20 73 79 6d 62 6f 6c 20 7a 53 79 6d 62 6f 6c  e symbol zSymbol
43a0: 20 69 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 20   in the dynamic 
43b0: 6c 69 62 72 61 72 79 20 70 48 61 6e 64 6c 65 2e  library pHandle.
43c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
43d0: 28 2a 76 66 73 6c 6f 67 44 6c 53 79 6d 28 73 71  (*vfslogDlSym(sq
43e0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
43f0: 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20   void *p, const 
4400: 63 68 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69  char *zSym))(voi
4410: 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 45 41  d){.  return REA
4420: 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 44 6c 53  LVFS(pVfs)->xDlS
4430: 79 6d 28 52 45 41 4c 56 46 53 28 70 56 66 73 29  ym(REALVFS(pVfs)
4440: 2c 20 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 0a 2f  , p, zSym);.}../
4450: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 64  *.** Close the d
4460: 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20 68  ynamic library h
4470: 61 6e 64 6c 65 20 70 48 61 6e 64 6c 65 2e 0a 2a  andle pHandle..*
4480: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 66  /.static void vf
4490: 73 6c 6f 67 44 6c 43 6c 6f 73 65 28 73 71 6c 69  slogDlClose(sqli
44a0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76  te3_vfs *pVfs, v
44b0: 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20  oid *pHandle){. 
44c0: 20 52 45 41 4c 56 46 53 28 70 56 66 73 29 2d 3e   REALVFS(pVfs)->
44d0: 78 44 6c 43 6c 6f 73 65 28 52 45 41 4c 56 46 53  xDlClose(REALVFS
44e0: 28 70 56 66 73 29 2c 20 70 48 61 6e 64 6c 65 29  (pVfs), pHandle)
44f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c  ;.}../*.** Popul
4500: 61 74 65 20 74 68 65 20 62 75 66 66 65 72 20 70  ate the buffer p
4510: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 42 75  ointed to by zBu
4520: 66 4f 75 74 20 77 69 74 68 20 6e 42 79 74 65 20  fOut with nByte 
4530: 62 79 74 65 73 20 6f 66 20 0a 2a 2a 20 72 61 6e  bytes of .** ran
4540: 64 6f 6d 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  dom data..*/.sta
4550: 74 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 52 61  tic int vfslogRa
4560: 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33  ndomness(sqlite3
4570: 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
4580: 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 42 75  nByte, char *zBu
4590: 66 4f 75 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  fOut){.  return 
45a0: 52 45 41 4c 56 46 53 28 70 56 66 73 29 2d 3e 78  REALVFS(pVfs)->x
45b0: 52 61 6e 64 6f 6d 6e 65 73 73 28 52 45 41 4c 56  Randomness(REALV
45c0: 46 53 28 70 56 66 73 29 2c 20 6e 42 79 74 65 2c  FS(pVfs), nByte,
45d0: 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a   zBufOut);.}../*
45e0: 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 6e 4d  .** Sleep for nM
45f0: 69 63 72 6f 20 6d 69 63 72 6f 73 65 63 6f 6e 64  icro microsecond
4600: 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  s. Return the nu
4610: 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63  mber of microsec
4620: 6f 6e 64 73 20 0a 2a 2a 20 61 63 74 75 61 6c 6c  onds .** actuall
4630: 79 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74  y slept..*/.stat
4640: 69 63 20 69 6e 74 20 76 66 73 6c 6f 67 53 6c 65  ic int vfslogSle
4650: 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ep(sqlite3_vfs *
4660: 70 56 66 73 2c 20 69 6e 74 20 6e 4d 69 63 72 6f  pVfs, int nMicro
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 53 6c 65 65  VFS(pVfs)->xSlee
4690: 70 28 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c  p(REALVFS(pVfs),
46a0: 20 6e 4d 69 63 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a   nMicro);.}../*.
46b0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
46c0: 72 72 65 6e 74 20 74 69 6d 65 20 61 73 20 61 20  rrent time as a 
46d0: 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
46e0: 72 20 69 6e 20 2a 70 54 69 6d 65 4f 75 74 2e 0a  r in *pTimeOut..
46f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  */.static int vf
4700: 73 6c 6f 67 43 75 72 72 65 6e 74 54 69 6d 65 28  slogCurrentTime(
4710: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
4720: 73 2c 20 64 6f 75 62 6c 65 20 2a 70 54 69 6d 65  s, double *pTime
4730: 4f 75 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 52  Out){.  return R
4740: 45 41 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 43  EALVFS(pVfs)->xC
4750: 75 72 72 65 6e 74 54 69 6d 65 28 52 45 41 4c 56  urrentTime(REALV
4760: 46 53 28 70 56 66 73 29 2c 20 70 54 69 6d 65 4f  FS(pVfs), pTimeO
4770: 75 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  ut);.}..static i
4780: 6e 74 20 76 66 73 6c 6f 67 47 65 74 4c 61 73 74  nt vfslogGetLast
4790: 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
47a0: 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 61 2c 20  s *pVfs, int a, 
47b0: 63 68 61 72 20 2a 62 29 7b 0a 20 20 72 65 74 75  char *b){.  retu
47c0: 72 6e 20 52 45 41 4c 56 46 53 28 70 56 66 73 29  rn REALVFS(pVfs)
47d0: 2d 3e 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  ->xGetLastError(
47e0: 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20 61  REALVFS(pVfs), a
47f0: 2c 20 62 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  , b);.}.static i
4800: 6e 74 20 76 66 73 6c 6f 67 43 75 72 72 65 6e 74  nt vfslogCurrent
4810: 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65  TimeInt64(sqlite
4820: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c  3_vfs *pVfs, sql
4830: 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 29 7b 0a  ite3_int64 *p){.
4840: 20 20 72 65 74 75 72 6e 20 52 45 41 4c 56 46 53    return REALVFS
4850: 28 70 56 66 73 29 2d 3e 78 43 75 72 72 65 6e 74  (pVfs)->xCurrent
4860: 54 69 6d 65 49 6e 74 36 34 28 52 45 41 4c 56 46  TimeInt64(REALVF
4870: 53 28 70 56 66 73 29 2c 20 70 29 3b 0a 7d 0a 0a  S(pVfs), p);.}..
4880: 73 74 61 74 69 63 20 76 6f 69 64 20 76 66 73 6c  static void vfsl
4890: 6f 67 5f 66 6c 75 73 68 28 56 66 73 6c 6f 67 56  og_flush(VfslogV
48a0: 66 73 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  fs *p){.#ifdef S
48b0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65 78 74  QLITE_TEST.  ext
48c0: 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
48d0: 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
48e0: 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
48f0: 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
4900: 70 65 72 73 69 73 74 3b 0a 20 20 65 78 74 65 72  persist;.  exter
4910: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 69  n int sqlite3_di
4920: 73 6b 66 75 6c 6c 5f 70 65 6e 64 69 6e 67 3b 0a  skfull_pending;.
4930: 0a 20 20 69 6e 74 20 70 65 6e 64 69 6e 67 20 3d  .  int pending =
4940: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
4950: 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 69 6e 74  r_pending;.  int
4960: 20 70 65 72 73 69 73 74 20 3d 20 73 71 6c 69 74   persist = sqlit
4970: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 72 73  e3_io_error_pers
4980: 69 73 74 3b 0a 20 20 69 6e 74 20 64 69 73 6b 66  ist;.  int diskf
4990: 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 64 69  ull = sqlite3_di
49a0: 73 6b 66 75 6c 6c 5f 70 65 6e 64 69 6e 67 3b 0a  skfull_pending;.
49b0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
49c0: 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 30 3b  ror_pending = 0;
49d0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
49e0: 72 6f 72 5f 70 65 72 73 69 73 74 20 3d 20 30 3b  ror_persist = 0;
49f0: 0a 20 20 73 71 6c 69 74 65 33 5f 64 69 73 6b 66  .  sqlite3_diskf
4a00: 75 6c 6c 5f 70 65 6e 64 69 6e 67 20 3d 20 30 3b  ull_pending = 0;
4a10: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
4a20: 2d 3e 6e 42 75 66 20 29 7b 0a 20 20 20 20 70 2d  ->nBuf ){.    p-
4a30: 3e 70 4c 6f 67 2d 3e 70 4d 65 74 68 6f 64 73 2d  >pLog->pMethods-
4a40: 3e 78 57 72 69 74 65 28 70 2d 3e 70 4c 6f 67 2c  >xWrite(p->pLog,
4a50: 20 70 2d 3e 61 42 75 66 2c 20 70 2d 3e 6e 42 75   p->aBuf, p->nBu
4a60: 66 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a  f, p->iOffset);.
4a70: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 2b      p->iOffset +
4a80: 3d 20 70 2d 3e 6e 42 75 66 3b 0a 20 20 20 20 70  = p->nBuf;.    p
4a90: 2d 3e 6e 42 75 66 20 3d 20 30 3b 0a 20 20 7d 0a  ->nBuf = 0;.  }.
4aa0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
4ab0: 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  EST.  sqlite3_io
4ac0: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
4ad0: 20 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69   pending;.  sqli
4ae0: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 72  te3_io_error_per
4af0: 73 69 73 74 20 3d 20 70 65 72 73 69 73 74 3b 0a  sist = persist;.
4b00: 20 20 73 71 6c 69 74 65 33 5f 64 69 73 6b 66 75    sqlite3_diskfu
4b10: 6c 6c 5f 70 65 6e 64 69 6e 67 20 3d 20 64 69 73  ll_pending = dis
4b20: 6b 66 75 6c 6c 3b 0a 23 65 6e 64 69 66 0a 7d 0a  kfull;.#endif.}.
4b30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 74  .static void put
4b40: 33 32 62 69 74 73 28 75 6e 73 69 67 6e 65 64 20  32bits(unsigned 
4b50: 63 68 61 72 20 2a 70 2c 20 75 6e 73 69 67 6e 65  char *p, unsigne
4b60: 64 20 69 6e 74 20 76 29 7b 0a 20 20 70 5b 30 5d  d int v){.  p[0]
4b70: 20 3d 20 76 3e 3e 32 34 3b 0a 20 20 70 5b 31 5d   = v>>24;.  p[1]
4b80: 20 3d 20 76 3e 3e 31 36 3b 0a 20 20 70 5b 32 5d   = v>>16;.  p[2]
4b90: 20 3d 20 76 3e 3e 38 3b 0a 20 20 70 5b 33 5d 20   = v>>8;.  p[3] 
4ba0: 3d 20 76 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  = v;.}..static v
4bb0: 6f 69 64 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28  oid vfslog_call(
4bc0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
4bd0: 70 56 66 73 2c 0a 20 20 69 6e 74 20 65 45 76 65  pVfs,.  int eEve
4be0: 6e 74 2c 0a 20 20 69 6e 74 20 69 46 69 6c 65 69  nt,.  int iFilei
4bf0: 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  d,.  sqlite3_int
4c00: 36 34 20 6e 43 6c 69 63 6b 2c 0a 20 20 69 6e 74  64 nClick,.  int
4c10: 20 72 65 74 75 72 6e 5f 63 6f 64 65 2c 0a 20 20   return_code,.  
4c20: 69 6e 74 20 73 69 7a 65 2c 0a 20 20 69 6e 74 20  int size,.  int 
4c30: 6f 66 66 73 65 74 0a 29 7b 0a 20 20 56 66 73 6c  offset.){.  Vfsl
4c40: 6f 67 56 66 73 20 2a 70 20 3d 20 28 56 66 73 6c  ogVfs *p = (Vfsl
4c50: 6f 67 56 66 73 20 2a 29 70 56 66 73 3b 0a 20 20  ogVfs *)pVfs;.  
4c60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
4c70: 52 65 63 3b 0a 20 20 69 66 28 20 28 32 34 2b 70  Rec;.  if( (24+p
4c80: 2d 3e 6e 42 75 66 29 3e 73 69 7a 65 6f 66 28 70  ->nBuf)>sizeof(p
4c90: 2d 3e 61 42 75 66 29 20 29 7b 0a 20 20 20 20 76  ->aBuf) ){.    v
4ca0: 66 73 6c 6f 67 5f 66 6c 75 73 68 28 70 29 3b 0a  fslog_flush(p);.
4cb0: 20 20 7d 0a 20 20 7a 52 65 63 20 3d 20 28 75 6e    }.  zRec = (un
4cc0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 26 70  signed char *)&p
4cd0: 2d 3e 61 42 75 66 5b 70 2d 3e 6e 42 75 66 5d 3b  ->aBuf[p->nBuf];
4ce0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 52  .  put32bits(&zR
4cf0: 65 63 5b 30 5d 2c 20 65 45 76 65 6e 74 29 3b 0a  ec[0], eEvent);.
4d00: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 52 65    put32bits(&zRe
4d10: 63 5b 34 5d 2c 20 69 46 69 6c 65 69 64 29 3b 0a  c[4], iFileid);.
4d20: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 52 65    put32bits(&zRe
4d30: 63 5b 38 5d 2c 20 28 75 6e 73 69 67 6e 65 64 20  c[8], (unsigned 
4d40: 69 6e 74 29 28 6e 43 6c 69 63 6b 26 30 78 66 66  int)(nClick&0xff
4d50: 66 66 29 29 3b 0a 20 20 70 75 74 33 32 62 69 74  ff));.  put32bit
4d60: 73 28 26 7a 52 65 63 5b 31 32 5d 2c 20 72 65 74  s(&zRec[12], ret
4d70: 75 72 6e 5f 63 6f 64 65 29 3b 0a 20 20 70 75 74  urn_code);.  put
4d80: 33 32 62 69 74 73 28 26 7a 52 65 63 5b 31 36 5d  32bits(&zRec[16]
4d90: 2c 20 73 69 7a 65 29 3b 0a 20 20 70 75 74 33 32  , size);.  put32
4da0: 62 69 74 73 28 26 7a 52 65 63 5b 32 30 5d 2c 20  bits(&zRec[20], 
4db0: 6f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 6e 42  offset);.  p->nB
4dc0: 75 66 20 2b 3d 20 32 34 3b 0a 7d 0a 0a 73 74 61  uf += 24;.}..sta
4dd0: 74 69 63 20 76 6f 69 64 20 76 66 73 6c 6f 67 5f  tic void vfslog_
4de0: 73 74 72 69 6e 67 28 73 71 6c 69 74 65 33 5f 76  string(sqlite3_v
4df0: 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20  fs *pVfs, const 
4e00: 63 68 61 72 20 2a 7a 53 74 72 29 7b 0a 20 20 56  char *zStr){.  V
4e10: 66 73 6c 6f 67 56 66 73 20 2a 70 20 3d 20 28 56  fslogVfs *p = (V
4e20: 66 73 6c 6f 67 56 66 73 20 2a 29 70 56 66 73 3b  fslogVfs *)pVfs;
4e30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4e40: 20 2a 7a 52 65 63 3b 0a 20 20 69 6e 74 20 6e 53   *zRec;.  int nS
4e50: 74 72 20 3d 20 7a 53 74 72 20 3f 20 28 69 6e 74  tr = zStr ? (int
4e60: 29 73 74 72 6c 65 6e 28 7a 53 74 72 29 20 3a 20  )strlen(zStr) : 
4e70: 30 3b 0a 20 20 69 66 28 20 28 34 2b 6e 53 74 72  0;.  if( (4+nStr
4e80: 2b 70 2d 3e 6e 42 75 66 29 3e 73 69 7a 65 6f 66  +p->nBuf)>sizeof
4e90: 28 70 2d 3e 61 42 75 66 29 20 29 7b 0a 20 20 20  (p->aBuf) ){.   
4ea0: 20 76 66 73 6c 6f 67 5f 66 6c 75 73 68 28 70 29   vfslog_flush(p)
4eb0: 3b 0a 20 20 7d 0a 20 20 7a 52 65 63 20 3d 20 28  ;.  }.  zRec = (
4ec0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
4ed0: 26 70 2d 3e 61 42 75 66 5b 70 2d 3e 6e 42 75 66  &p->aBuf[p->nBuf
4ee0: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  ];.  put32bits(&
4ef0: 7a 52 65 63 5b 30 5d 2c 20 6e 53 74 72 29 3b 0a  zRec[0], nStr);.
4f00: 20 20 69 66 28 20 7a 53 74 72 20 29 7b 0a 20 20    if( zStr ){.  
4f10: 20 20 6d 65 6d 63 70 79 28 26 7a 52 65 63 5b 34    memcpy(&zRec[4
4f20: 5d 2c 20 7a 53 74 72 2c 20 6e 53 74 72 29 3b 0a  ], zStr, nStr);.
4f30: 20 20 7d 0a 20 20 70 2d 3e 6e 42 75 66 20 2b 3d    }.  p->nBuf +=
4f40: 20 28 34 20 2b 20 6e 53 74 72 29 3b 0a 7d 0a 0a   (4 + nStr);.}..
4f50: 73 74 61 74 69 63 20 76 6f 69 64 20 76 66 73 6c  static void vfsl
4f60: 6f 67 5f 66 69 6e 61 6c 69 7a 65 28 56 66 73 6c  og_finalize(Vfsl
4f70: 6f 67 56 66 73 20 2a 70 29 7b 0a 20 20 69 66 28  ogVfs *p){.  if(
4f80: 20 70 2d 3e 70 4c 6f 67 2d 3e 70 4d 65 74 68 6f   p->pLog->pMetho
4f90: 64 73 20 29 7b 0a 20 20 20 20 76 66 73 6c 6f 67  ds ){.    vfslog
4fa0: 5f 66 6c 75 73 68 28 70 29 3b 0a 20 20 20 20 70  _flush(p);.    p
4fb0: 2d 3e 70 4c 6f 67 2d 3e 70 4d 65 74 68 6f 64 73  ->pLog->pMethods
4fc0: 2d 3e 78 43 6c 6f 73 65 28 70 2d 3e 70 4c 6f 67  ->xClose(p->pLog
4fd0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
4fe0: 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 69 6e 74  _free(p);.}..int
4ff0: 20 73 71 6c 69 74 65 33 5f 76 66 73 6c 6f 67 5f   sqlite3_vfslog_
5000: 66 69 6e 61 6c 69 7a 65 28 63 6f 6e 73 74 20 63  finalize(const c
5010: 68 61 72 20 2a 7a 56 66 73 29 7b 0a 20 20 73 71  har *zVfs){.  sq
5020: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
5030: 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65  .  pVfs = sqlite
5040: 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29  3_vfs_find(zVfs)
5050: 3b 0a 20 20 69 66 28 20 21 70 56 66 73 20 7c 7c  ;.  if( !pVfs ||
5060: 20 70 56 66 73 2d 3e 78 4f 70 65 6e 21 3d 76 66   pVfs->xOpen!=vf
5070: 73 6c 6f 67 4f 70 65 6e 20 29 7b 0a 20 20 20 20  slogOpen ){.    
5080: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
5090: 52 4f 52 3b 0a 20 20 7d 20 0a 20 20 73 71 6c 69  ROR;.  } .  sqli
50a0: 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
50b0: 65 72 28 70 56 66 73 29 3b 0a 20 20 76 66 73 6c  er(pVfs);.  vfsl
50c0: 6f 67 5f 66 69 6e 61 6c 69 7a 65 28 28 56 66 73  og_finalize((Vfs
50d0: 6c 6f 67 56 66 73 20 2a 29 70 56 66 73 29 3b 0a  logVfs *)pVfs);.
50e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
50f0: 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  OK;.}..int sqlit
5100: 65 33 5f 76 66 73 6c 6f 67 5f 6e 65 77 28 0a 20  e3_vfslog_new(. 
5110: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
5120: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
5130: 20 2f 2a 20 4e 65 77 20 56 46 53 20 6e 61 6d 65   /* New VFS name
5140: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
5150: 20 2a 7a 50 61 72 65 6e 74 56 66 73 2c 20 20 20   *zParentVfs,   
5160: 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20        /* Parent 
5170: 56 46 53 20 6e 61 6d 65 20 28 6f 72 20 4e 55 4c  VFS name (or NUL
5180: 4c 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  L) */.  const ch
5190: 61 72 20 2a 7a 4c 6f 67 20 20 20 20 20 20 20 20  ar *zLog        
51a0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 66          /* Log f
51b0: 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  ile name */.){. 
51c0: 20 56 66 73 6c 6f 67 56 66 73 20 2a 70 3b 0a 20   VfslogVfs *p;. 
51d0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 50   sqlite3_vfs *pP
51e0: 61 72 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 42 79  arent;.  int nBy
51f0: 74 65 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b  te;.  int flags;
5200: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
5210: 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 69 6e 74 20  r *zFile;.  int 
5220: 6e 56 66 73 3b 0a 0a 20 20 70 50 61 72 65 6e 74  nVfs;..  pParent
5230: 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
5240: 69 6e 64 28 7a 50 61 72 65 6e 74 56 66 73 29 3b  ind(zParentVfs);
5250: 0a 20 20 69 66 28 20 21 70 50 61 72 65 6e 74 20  .  if( !pParent 
5260: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
5270: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
5280: 0a 20 20 6e 56 66 73 20 3d 20 28 69 6e 74 29 73  .  nVfs = (int)s
5290: 74 72 6c 65 6e 28 7a 56 66 73 29 3b 0a 20 20 6e  trlen(zVfs);.  n
52a0: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 56 66  Byte = sizeof(Vf
52b0: 73 6c 6f 67 56 66 73 29 20 2b 20 70 50 61 72 65  slogVfs) + pPare
52c0: 6e 74 2d 3e 73 7a 4f 73 46 69 6c 65 20 2b 20 6e  nt->szOsFile + n
52d0: 56 66 73 2b 31 2b 70 50 61 72 65 6e 74 2d 3e 6d  Vfs+1+pParent->m
52e0: 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 70  xPathname+1;.  p
52f0: 20 3d 20 28 56 66 73 6c 6f 67 56 66 73 20 2a 29   = (VfslogVfs *)
5300: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
5310: 42 79 74 65 29 3b 0a 20 20 6d 65 6d 73 65 74 28  Byte);.  memset(
5320: 70 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 0a 20  p, 0, nByte);.. 
5330: 20 70 2d 3e 70 56 66 73 20 3d 20 70 50 61 72 65   p->pVfs = pPare
5340: 6e 74 3b 0a 20 20 70 2d 3e 70 4c 6f 67 20 3d 20  nt;.  p->pLog = 
5350: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
5360: 26 70 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28  &p[1];.  memcpy(
5370: 26 70 2d 3e 62 61 73 65 2c 20 26 76 66 73 6c 6f  &p->base, &vfslo
5380: 67 5f 76 66 73 2c 20 73 69 7a 65 6f 66 28 73 71  g_vfs, sizeof(sq
5390: 6c 69 74 65 33 5f 76 66 73 29 29 3b 0a 20 20 70  lite3_vfs));.  p
53a0: 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65 20 3d 20 26  ->base.zName = &
53b0: 28 28 63 68 61 72 20 2a 29 70 2d 3e 70 4c 6f 67  ((char *)p->pLog
53c0: 29 5b 70 50 61 72 65 6e 74 2d 3e 73 7a 4f 73 46  )[pParent->szOsF
53d0: 69 6c 65 5d 3b 0a 20 20 70 2d 3e 62 61 73 65 2e  ile];.  p->base.
53e0: 73 7a 4f 73 46 69 6c 65 20 2b 3d 20 70 50 61 72  szOsFile += pPar
53f0: 65 6e 74 2d 3e 73 7a 4f 73 46 69 6c 65 3b 0a 20  ent->szOsFile;. 
5400: 20 6d 65 6d 63 70 79 28 28 63 68 61 72 20 2a 29   memcpy((char *)
5410: 70 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65 2c 20 7a  p->base.zName, z
5420: 56 66 73 2c 20 6e 56 66 73 29 3b 0a 0a 20 20 7a  Vfs, nVfs);..  z
5430: 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 26  File = (char *)&
5440: 70 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65 5b 6e 56  p->base.zName[nV
5450: 66 73 2b 31 5d 3b 0a 20 20 70 50 61 72 65 6e 74  fs+1];.  pParent
5460: 2d 3e 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  ->xFullPathname(
5470: 70 50 61 72 65 6e 74 2c 20 7a 4c 6f 67 2c 20 70  pParent, zLog, p
5480: 50 61 72 65 6e 74 2d 3e 6d 78 50 61 74 68 6e 61  Parent->mxPathna
5490: 6d 65 2c 20 7a 46 69 6c 65 29 3b 0a 0a 20 20 66  me, zFile);..  f
54a0: 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
54b0: 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
54c0: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
54d0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
54e0: 45 52 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 70 50  ER_JOURNAL;.  pP
54f0: 61 72 65 6e 74 2d 3e 78 44 65 6c 65 74 65 28 70  arent->xDelete(p
5500: 50 61 72 65 6e 74 2c 20 7a 46 69 6c 65 2c 20 30  Parent, zFile, 0
5510: 29 3b 0a 20 20 72 63 20 3d 20 70 50 61 72 65 6e  );.  rc = pParen
5520: 74 2d 3e 78 4f 70 65 6e 28 70 50 61 72 65 6e 74  t->xOpen(pParent
5530: 2c 20 7a 46 69 6c 65 2c 20 70 2d 3e 70 4c 6f 67  , zFile, p->pLog
5540: 2c 20 66 6c 61 67 73 2c 20 26 66 6c 61 67 73 29  , flags, &flags)
5550: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
5560: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65 6d  TE_OK ){.    mem
5570: 63 70 79 28 70 2d 3e 61 42 75 66 2c 20 22 73 71  cpy(p->aBuf, "sq
5580: 6c 69 74 65 5f 6f 73 74 72 61 63 65 31 2e 2e 2e  lite_ostrace1...
5590: 2e 2e 22 2c 20 32 30 29 3b 0a 20 20 20 20 70 2d  ..", 20);.    p-
55a0: 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >iOffset = 0;.  
55b0: 20 20 70 2d 3e 6e 42 75 66 20 3d 20 32 30 3b 0a    p->nBuf = 20;.
55c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
55d0: 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 28 73  _vfs_register((s
55e0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 29 70 2c 20  qlite3_vfs *)p, 
55f0: 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  1);.  }.  if( rc
5600: 20 29 7b 0a 20 20 20 20 76 66 73 6c 6f 67 5f 66   ){.    vfslog_f
5610: 69 6e 61 6c 69 7a 65 28 70 29 3b 0a 20 20 7d 0a  inalize(p);.  }.
5620: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5630: 69 6e 74 20 73 71 6c 69 74 65 33 5f 76 66 73 6c  int sqlite3_vfsl
5640: 6f 67 5f 61 6e 6e 6f 74 61 74 65 28 63 6f 6e 73  og_annotate(cons
5650: 74 20 63 68 61 72 20 2a 7a 56 66 73 2c 20 63 6f  t char *zVfs, co
5660: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b  nst char *zMsg){
5670: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
5680: 70 56 66 73 3b 0a 20 20 70 56 66 73 20 3d 20 73  pVfs;.  pVfs = s
5690: 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
56a0: 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 21 70 56  zVfs);.  if( !pV
56b0: 66 73 20 7c 7c 20 70 56 66 73 2d 3e 78 4f 70 65  fs || pVfs->xOpe
56c0: 6e 21 3d 76 66 73 6c 6f 67 4f 70 65 6e 20 29 7b  n!=vfslogOpen ){
56d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
56e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 20 0a 20  TE_ERROR;.  } . 
56f0: 20 76 66 73 6c 6f 67 5f 63 61 6c 6c 28 70 56 66   vfslog_call(pVf
5700: 73 2c 20 4f 53 5f 41 4e 4e 4f 54 41 54 45 2c 20  s, OS_ANNOTATE, 
5710: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  0, 0, 0, 0, 0);.
5720: 20 20 76 66 73 6c 6f 67 5f 73 74 72 69 6e 67 28    vfslog_string(
5730: 70 56 66 73 2c 20 7a 4d 73 67 29 3b 0a 20 20 72  pVfs, zMsg);.  r
5740: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5750: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
5760: 20 63 68 61 72 20 2a 76 66 73 6c 6f 67 5f 65 76   char *vfslog_ev
5770: 65 6e 74 6e 61 6d 65 28 69 6e 74 20 65 45 76 65  entname(int eEve
5780: 6e 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  nt){.  const cha
5790: 72 20 2a 7a 45 76 65 6e 74 20 3d 20 30 3b 0a 0a  r *zEvent = 0;..
57a0: 20 20 73 77 69 74 63 68 28 20 65 45 76 65 6e 74    switch( eEvent
57b0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f   ){.    case OS_
57c0: 43 4c 4f 53 45 3a 20 20 20 20 20 20 20 20 20 20  CLOSE:          
57d0: 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 43 6c     zEvent = "xCl
57e0: 6f 73 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ose"; break;.   
57f0: 20 63 61 73 65 20 4f 53 5f 52 45 41 44 3a 20 20   case OS_READ:  
5800: 20 20 20 20 20 20 20 20 20 20 20 20 7a 45 76 65              zEve
5810: 6e 74 20 3d 20 22 78 52 65 61 64 22 3b 20 62 72  nt = "xRead"; br
5820: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53  eak;.    case OS
5830: 5f 57 52 49 54 45 3a 20 20 20 20 20 20 20 20 20  _WRITE:         
5840: 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 57      zEvent = "xW
5850: 72 69 74 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20  rite"; break;.  
5860: 20 20 63 61 73 65 20 4f 53 5f 54 52 55 4e 43 41    case OS_TRUNCA
5870: 54 45 3a 20 20 20 20 20 20 20 20 20 20 7a 45 76  TE:          zEv
5880: 65 6e 74 20 3d 20 22 78 54 72 75 6e 63 61 74 65  ent = "xTruncate
5890: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
58a0: 73 65 20 4f 53 5f 53 59 4e 43 3a 20 20 20 20 20  se OS_SYNC:     
58b0: 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20           zEvent 
58c0: 3d 20 22 78 53 79 6e 63 22 3b 20 62 72 65 61 6b  = "xSync"; break
58d0: 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 46 49  ;.    case OS_FI
58e0: 4c 45 53 49 5a 45 3a 20 20 20 20 20 20 20 20 20  LESIZE:         
58f0: 20 7a 45 76 65 6e 74 20 3d 20 22 78 46 69 6c 65   zEvent = "xFile
5900: 73 69 7a 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20  size"; break;.  
5910: 20 20 63 61 73 65 20 4f 53 5f 4c 4f 43 4b 3a 20    case OS_LOCK: 
5920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 45 76               zEv
5930: 65 6e 74 20 3d 20 22 78 4c 6f 63 6b 22 3b 20 62  ent = "xLock"; b
5940: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f  reak;.    case O
5950: 53 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20  S_UNLOCK:       
5960: 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78       zEvent = "x
5970: 55 6e 6c 6f 63 6b 22 3b 20 62 72 65 61 6b 3b 0a  Unlock"; break;.
5980: 20 20 20 20 63 61 73 65 20 4f 53 5f 43 48 45 43      case OS_CHEC
5990: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a 20 7a  KRESERVEDLOCK: z
59a0: 45 76 65 6e 74 20 3d 20 22 78 43 68 65 63 6b 52  Event = "xCheckR
59b0: 65 73 4c 6f 63 6b 22 3b 20 62 72 65 61 6b 3b 0a  esLock"; break;.
59c0: 20 20 20 20 63 61 73 65 20 4f 53 5f 46 49 4c 45      case OS_FILE
59d0: 43 4f 4e 54 52 4f 4c 3a 20 20 20 20 20 20 20 7a  CONTROL:       z
59e0: 45 76 65 6e 74 20 3d 20 22 78 46 69 6c 65 43 6f  Event = "xFileCo
59f0: 6e 74 72 6f 6c 22 3b 20 62 72 65 61 6b 3b 0a 20  ntrol"; break;. 
5a00: 20 20 20 63 61 73 65 20 4f 53 5f 53 45 43 54 4f     case OS_SECTO
5a10: 52 53 49 5a 45 3a 20 20 20 20 20 20 20 20 7a 45  RSIZE:        zE
5a20: 76 65 6e 74 20 3d 20 22 78 53 65 63 74 6f 72 53  vent = "xSectorS
5a30: 69 7a 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ize"; break;.   
5a40: 20 63 61 73 65 20 4f 53 5f 44 45 56 43 48 41 52   case OS_DEVCHAR
5a50: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 45 76 65  :           zEve
5a60: 6e 74 20 3d 20 22 78 44 65 76 69 63 65 43 68 61  nt = "xDeviceCha
5a70: 72 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  r"; break;.    c
5a80: 61 73 65 20 4f 53 5f 4f 50 45 4e 3a 20 20 20 20  ase OS_OPEN:    
5a90: 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74            zEvent
5aa0: 20 3d 20 22 78 4f 70 65 6e 22 3b 20 62 72 65 61   = "xOpen"; brea
5ab0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 44  k;.    case OS_D
5ac0: 45 4c 45 54 45 3a 20 20 20 20 20 20 20 20 20 20  ELETE:          
5ad0: 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 44 65 6c    zEvent = "xDel
5ae0: 65 74 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ete"; break;.   
5af0: 20 63 61 73 65 20 4f 53 5f 41 43 43 45 53 53 3a   case OS_ACCESS:
5b00: 20 20 20 20 20 20 20 20 20 20 20 20 7a 45 76 65              zEve
5b10: 6e 74 20 3d 20 22 78 41 63 63 65 73 73 22 3b 20  nt = "xAccess"; 
5b20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5b30: 4f 53 5f 46 55 4c 4c 50 41 54 48 4e 41 4d 45 3a  OS_FULLPATHNAME:
5b40: 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22        zEvent = "
5b50: 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 22 3b 20  xFullPathname"; 
5b60: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5b70: 4f 53 5f 52 41 4e 44 4f 4d 4e 45 53 53 3a 20 20  OS_RANDOMNESS:  
5b80: 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22        zEvent = "
5b90: 78 52 61 6e 64 6f 6d 6e 65 73 73 22 3b 20 62 72  xRandomness"; br
5ba0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53  eak;.    case OS
5bb0: 5f 53 4c 45 45 50 3a 20 20 20 20 20 20 20 20 20  _SLEEP:         
5bc0: 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 53      zEvent = "xS
5bd0: 6c 65 65 70 22 3b 20 62 72 65 61 6b 3b 0a 20 20  leep"; break;.  
5be0: 20 20 63 61 73 65 20 4f 53 5f 43 55 52 52 45 4e    case OS_CURREN
5bf0: 54 54 49 4d 45 3a 20 20 20 20 20 20 20 7a 45 76  TTIME:       zEv
5c00: 65 6e 74 20 3d 20 22 78 43 75 72 72 65 6e 74 54  ent = "xCurrentT
5c10: 69 6d 65 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20  ime"; break;..  
5c20: 20 20 63 61 73 65 20 4f 53 5f 53 48 4d 55 4e 4d    case OS_SHMUNM
5c30: 41 50 3a 20 20 20 20 20 20 20 20 20 20 7a 45 76  AP:          zEv
5c40: 65 6e 74 20 3d 20 22 78 53 68 6d 55 6e 6d 61 70  ent = "xShmUnmap
5c50: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5c60: 73 65 20 4f 53 5f 53 48 4d 4c 4f 43 4b 3a 20 20  se OS_SHMLOCK:  
5c70: 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20           zEvent 
5c80: 3d 20 22 78 53 68 6d 4c 6f 63 6b 22 3b 20 62 72  = "xShmLock"; br
5c90: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53  eak;.    case OS
5ca0: 5f 53 48 4d 42 41 52 52 49 45 52 3a 20 20 20 20  _SHMBARRIER:    
5cb0: 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 53      zEvent = "xS
5cc0: 68 6d 42 61 72 72 69 65 72 22 3b 20 62 72 65 61  hmBarrier"; brea
5cd0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 53  k;.    case OS_S
5ce0: 48 4d 4d 41 50 3a 20 20 20 20 20 20 20 20 20 20  HMMAP:          
5cf0: 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 53 68 6d    zEvent = "xShm
5d00: 4d 61 70 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20  Map"; break;..  
5d10: 20 20 63 61 73 65 20 4f 53 5f 41 4e 4e 4f 54 41    case OS_ANNOTA
5d20: 54 45 3a 20 20 20 20 20 20 20 20 20 20 7a 45 76  TE:          zEv
5d30: 65 6e 74 20 3d 20 22 61 6e 6e 6f 74 61 74 69 6f  ent = "annotatio
5d40: 6e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a  n"; break;.  }..
5d50: 20 20 72 65 74 75 72 6e 20 7a 45 76 65 6e 74 3b    return zEvent;
5d60: 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  .}..typedef stru
5d70: 63 74 20 56 66 73 6c 6f 67 56 74 61 62 20 56 66  ct VfslogVtab Vf
5d80: 73 6c 6f 67 56 74 61 62 3b 0a 74 79 70 65 64 65  slogVtab;.typede
5d90: 66 20 73 74 72 75 63 74 20 56 66 73 6c 6f 67 43  f struct VfslogC
5da0: 73 72 20 56 66 73 6c 6f 67 43 73 72 3b 0a 0a 2f  sr VfslogCsr;../
5db0: 2a 0a 2a 2a 20 56 69 72 74 75 61 6c 20 74 61 62  *.** Virtual tab
5dc0: 6c 65 20 74 79 70 65 20 66 6f 72 20 74 68 65 20  le type for the 
5dd0: 76 66 73 6c 6f 67 20 72 65 61 64 65 72 20 6d 6f  vfslog reader mo
5de0: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  dule..*/.struct 
5df0: 56 66 73 6c 6f 67 56 74 61 62 20 7b 0a 20 20 73  VfslogVtab {.  s
5e00: 71 6c 69 74 65 33 5f 76 74 61 62 20 62 61 73 65  qlite3_vtab base
5e10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
5e20: 2a 20 42 61 73 65 20 63 6c 61 73 73 20 2a 2f 0a  * Base class */.
5e30: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
5e40: 70 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  pFd;            
5e50: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
5e60: 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 76 66 73  ptor open on vfs
5e70: 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71  log file */.  sq
5e80: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74  lite3_int64 nByt
5e90: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
5ea0: 20 53 69 7a 65 20 6f 66 20 66 69 6c 65 20 69 6e   Size of file in
5eb0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
5ec0: 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20   *zFile;        
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
5ee0: 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 70 46 64  ile name for pFd
5ef0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 56 69   */.};../*.** Vi
5f00: 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73  rtual table curs
5f10: 6f 72 20 74 79 70 65 20 66 6f 72 20 74 68 65 20  or type for the 
5f20: 76 66 73 6c 6f 67 20 72 65 61 64 65 72 20 6d 6f  vfslog reader mo
5f30: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  dule..*/.struct 
5f40: 56 66 73 6c 6f 67 43 73 72 20 7b 0a 20 20 73 71  VfslogCsr {.  sq
5f50: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
5f60: 72 20 62 61 73 65 3b 20 20 20 20 20 20 20 2f 2a  r base;       /*
5f70: 20 42 61 73 65 20 63 6c 61 73 73 20 2a 2f 0a 20   Base class */. 
5f80: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
5f90: 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
5fa0: 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69   /* Current rowi
5fb0: 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  d. */.  sqlite3_
5fc0: 69 6e 74 36 34 20 69 4f 66 66 73 65 74 3b 20 20  int64 iOffset;  
5fd0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
5fe0: 74 20 6f 66 20 6e 65 78 74 20 72 65 63 6f 72 64  t of next record
5ff0: 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68   in file */.  ch
6000: 61 72 20 2a 7a 54 72 61 6e 73 69 65 6e 74 3b 20  ar *zTransient; 
6010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6020: 20 54 72 61 6e 73 69 65 6e 74 20 27 66 69 6c 65   Transient 'file
6030: 27 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e  ' string */.  in
6040: 74 20 6e 46 69 6c 65 3b 20 20 20 20 20 20 20 20  t nFile;        
6050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6060: 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
6070: 7a 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20 63 68 61  zFile[] */.  cha
6080: 72 20 2a 2a 61 7a 46 69 6c 65 3b 20 20 20 20 20  r **azFile;     
6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
60a0: 46 69 6c 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a  File strings */.
60b0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
60c0: 61 42 75 66 5b 31 30 32 34 5d 3b 20 20 20 20 20  aBuf[1024];     
60d0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 66 73    /* Current vfs
60e0: 20 6c 6f 67 20 65 6e 74 72 79 20 28 72 65 61 64   log entry (read
60f0: 20 66 72 6f 6d 20 66 69 6c 65 29 20 2a 2f 0a 7d   from file) */.}
6100: 3b 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  ;..static unsign
6110: 65 64 20 69 6e 74 20 67 65 74 33 32 62 69 74 73  ed int get32bits
6120: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
6130: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 5b  p){.  return (p[
6140: 30 5d 3c 3c 32 34 29 20 2b 20 28 70 5b 31 5d 3c  0]<<24) + (p[1]<
6150: 3c 31 36 29 20 2b 20 28 70 5b 32 5d 3c 3c 38 29  <16) + (p[2]<<8)
6160: 20 2b 20 70 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a   + p[3];.}../*.*
6170: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d  * The argument m
6180: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
6190: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
61a0: 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
61b0: 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 49 66 20  d string..** If 
61c0: 74 68 65 20 73 74 72 69 6e 67 20 62 65 67 69 6e  the string begin
61d0: 73 20 77 69 74 68 20 61 6e 20 53 51 4c 20 71 75  s with an SQL qu
61e0: 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 69 74  ote character it
61f0: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
6200: 62 79 0a 2a 2a 20 74 68 65 20 64 65 71 75 6f 74  by.** the dequot
6210: 65 64 20 76 65 72 73 69 6f 6e 2e 20 4f 74 68 65  ed version. Othe
6220: 72 77 69 73 65 20 74 68 65 20 62 75 66 66 65 72  rwise the buffer
6230: 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66   is left unmodif
6240: 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ied..*/.static v
6250: 6f 69 64 20 64 65 71 75 6f 74 65 28 63 68 61 72  oid dequote(char
6260: 20 2a 7a 29 7b 0a 20 20 63 68 61 72 20 71 75 6f   *z){.  char quo
6270: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
6280: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 6f 74 65          /* Quote
6290: 20 63 68 61 72 61 63 74 65 72 20 28 69 66 20 61   character (if a
62a0: 6e 79 20 29 20 2a 2f 0a 20 20 71 75 6f 74 65 20  ny ) */.  quote 
62b0: 3d 20 7a 5b 30 5d 3b 0a 20 20 69 66 28 20 71 75  = z[0];.  if( qu
62c0: 6f 74 65 3d 3d 27 5b 27 20 7c 7c 20 71 75 6f 74  ote=='[' || quot
62d0: 65 3d 3d 27 5c 27 27 20 7c 7c 20 71 75 6f 74 65  e=='\'' || quote
62e0: 3d 3d 27 22 27 20 7c 7c 20 71 75 6f 74 65 3d 3d  =='"' || quote==
62f0: 27 60 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  '`' ){.    int i
6300: 49 6e 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  In = 1;         
6310: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
6320: 78 20 6f 66 20 6e 65 78 74 20 62 79 74 65 20 74  x of next byte t
6330: 6f 20 72 65 61 64 20 66 72 6f 6d 20 69 6e 70 75  o read from inpu
6340: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75  t */.    int iOu
6350: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
6360: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
6370: 6f 66 20 6e 65 78 74 20 62 79 74 65 20 74 6f 20  of next byte to 
6380: 77 72 69 74 65 20 74 6f 20 6f 75 74 70 75 74 20  write to output 
6390: 2a 2f 0a 20 20 20 20 69 66 28 20 71 75 6f 74 65  */.    if( quote
63a0: 3d 3d 27 5b 27 20 29 20 71 75 6f 74 65 20 3d 20  =='[' ) quote = 
63b0: 27 5d 27 3b 20 20 0a 20 20 20 20 77 68 69 6c 65  ']';  .    while
63c0: 28 20 7a 5b 69 49 6e 5d 20 29 7b 0a 20 20 20 20  ( z[iIn] ){.    
63d0: 20 20 69 66 28 20 7a 5b 69 49 6e 5d 3d 3d 71 75    if( z[iIn]==qu
63e0: 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ote ){.        i
63f0: 66 28 20 7a 5b 69 49 6e 2b 31 5d 21 3d 71 75 6f  f( z[iIn+1]!=quo
6400: 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  te ) break;.    
6410: 20 20 20 20 7a 5b 69 4f 75 74 2b 2b 5d 20 3d 20      z[iOut++] = 
6420: 71 75 6f 74 65 3b 0a 20 20 20 20 20 20 20 20 69  quote;.        i
6430: 49 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d  In += 2;.      }
6440: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b  else{.        z[
6450: 69 4f 75 74 2b 2b 5d 20 3d 20 7a 5b 69 49 6e 2b  iOut++] = z[iIn+
6460: 2b 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +];.      }.    
6470: 7d 0a 20 20 20 20 7a 5b 69 4f 75 74 5d 20 3d 20  }.    z[iOut] = 
6480: 27 5c 30 27 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  '\0';.  }.}..#if
6490: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
64a0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
64b0: 0a 2a 2a 20 43 6f 6e 6e 65 63 74 20 74 6f 20 6f  .** Connect to o
64c0: 72 20 63 72 65 61 74 65 20 61 20 76 66 73 6c 6f  r create a vfslo
64d0: 67 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  g virtual table.
64e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
64f0: 6c 6f 67 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71  logConnect(.  sq
6500: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
6510: 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61  d *pAux,.  int a
6520: 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
6530: 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73  *const*argv,.  s
6540: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
6550: 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70  Vtab,.  char **p
6560: 7a 45 72 72 0a 29 7b 0a 20 20 73 71 6c 69 74 65  zErr.){.  sqlite
6570: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
6580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
6590: 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6c 6f   used to read lo
65a0: 67 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  g file */.  int 
65b0: 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  flags;          
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
65d0: 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 70  lags passed to p
65e0: 56 66 73 2d 3e 78 4f 70 65 6e 28 29 20 2a 2f 0a  Vfs->xOpen() */.
65f0: 20 20 56 66 73 6c 6f 67 56 74 61 62 20 2a 70 3b    VfslogVtab *p;
6600: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
6610: 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a   nByte;.  char *
6620: 7a 46 69 6c 65 3b 0a 0a 20 20 2a 70 70 56 74 61  zFile;..  *ppVta
6630: 62 20 3d 20 30 3b 0a 20 20 70 56 66 73 20 3d 20  b = 0;.  pVfs = 
6640: 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
6650: 28 30 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  (0);.  nByte = s
6660: 69 7a 65 6f 66 28 56 66 73 6c 6f 67 56 74 61 62  izeof(VfslogVtab
6670: 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
6680: 6c 65 20 2b 20 70 56 66 73 2d 3e 6d 78 50 61 74  le + pVfs->mxPat
6690: 68 6e 61 6d 65 3b 0a 20 20 70 20 3d 20 73 71 6c  hname;.  p = sql
66a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74  ite3_malloc(nByt
66b0: 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
66c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
66d0: 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
66e0: 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20  , 0, nByte);..  
66f0: 70 2d 3e 70 46 64 20 3d 20 28 73 71 6c 69 74 65  p->pFd = (sqlite
6700: 33 5f 66 69 6c 65 20 2a 29 26 70 5b 31 5d 3b 0a  3_file *)&p[1];.
6710: 20 20 70 2d 3e 7a 46 69 6c 65 20 3d 20 26 28 28    p->zFile = &((
6720: 63 68 61 72 20 2a 29 70 2d 3e 70 46 64 29 5b 70  char *)p->pFd)[p
6730: 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 5d 3b 0a  Vfs->szOsFile];.
6740: 0a 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74  .  zFile = sqlit
6750: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
6760: 20 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28   argv[3]);.  if(
6770: 20 21 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 73   !zFile ){.    s
6780: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
6790: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
67a0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 64  E_NOMEM;.  }.  d
67b0: 65 71 75 6f 74 65 28 7a 46 69 6c 65 29 3b 0a 20  equote(zFile);. 
67c0: 20 70 56 66 73 2d 3e 78 46 75 6c 6c 50 61 74 68   pVfs->xFullPath
67d0: 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
67e0: 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
67f0: 6d 65 2c 20 70 2d 3e 7a 46 69 6c 65 29 3b 0a 20  me, p->zFile);. 
6800: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
6810: 69 6c 65 29 3b 0a 0a 20 20 66 6c 61 67 73 20 3d  ile);..  flags =
6820: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
6830: 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
6840: 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
6850: 4c 3b 0a 20 20 72 63 20 3d 20 70 56 66 73 2d 3e  L;.  rc = pVfs->
6860: 78 4f 70 65 6e 28 70 56 66 73 2c 20 70 2d 3e 7a  xOpen(pVfs, p->z
6870: 46 69 6c 65 2c 20 70 2d 3e 70 46 64 2c 20 66 6c  File, p->pFd, fl
6880: 61 67 73 2c 20 26 66 6c 61 67 73 29 3b 0a 0a 20  ags, &flags);.. 
6890: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
68a0: 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 70 46 64  OK ){.    p->pFd
68b0: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c  ->pMethods->xFil
68c0: 65 53 69 7a 65 28 70 2d 3e 70 46 64 2c 20 26 70  eSize(p->pFd, &p
68d0: 2d 3e 6e 42 79 74 65 29 3b 0a 20 20 20 20 73 71  ->nByte);.    sq
68e0: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
68f0: 61 62 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20  ab(db, .        
6900: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78  "CREATE TABLE xx
6910: 78 28 65 76 65 6e 74 2c 20 66 69 6c 65 2c 20 63  x(event, file, c
6920: 6c 69 63 6b 2c 20 72 63 2c 20 73 69 7a 65 2c 20  lick, rc, size, 
6930: 6f 66 66 73 65 74 29 22 0a 20 20 20 20 29 3b 0a  offset)".    );.
6940: 20 20 20 20 2a 70 70 56 74 61 62 20 3d 20 26 70      *ppVtab = &p
6950: 2d 3e 62 61 73 65 3b 0a 20 20 7d 65 6c 73 65 7b  ->base;.  }else{
6960: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
6970: 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  e(p);.  }..  ret
6980: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6990: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 22 62 65   There is no "be
69a0: 73 74 2d 69 6e 64 65 78 22 2e 20 54 68 69 73 20  st-index". This 
69b0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 6c  virtual table al
69c0: 77 61 79 73 20 64 6f 65 73 20 61 20 6c 69 6e 65  ways does a line
69d0: 61 72 0a 2a 2a 20 73 63 61 6e 20 6f 66 20 74 68  ar.** scan of th
69e0: 65 20 62 69 6e 61 72 79 20 56 46 53 20 6c 6f 67  e binary VFS log
69f0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
6a00: 20 69 6e 74 20 76 6c 6f 67 42 65 73 74 49 6e 64   int vlogBestInd
6a10: 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  ex(sqlite3_vtab 
6a20: 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e  *tab, sqlite3_in
6a30: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
6a40: 66 6f 29 7b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  fo){.  pIdxInfo-
6a50: 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
6a60: 20 31 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20   10.0;.  return 
6a70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
6a80: 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20 66  .** Disconnect f
6a90: 72 6f 6d 20 6f 72 20 64 65 73 74 72 6f 79 20 61  rom or destroy a
6aa0: 20 76 66 73 6c 6f 67 20 76 69 72 74 75 61 6c 20   vfslog virtual 
6ab0: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
6ac0: 20 69 6e 74 20 76 6c 6f 67 44 69 73 63 6f 6e 6e   int vlogDisconn
6ad0: 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ect(sqlite3_vtab
6ae0: 20 2a 70 56 74 61 62 29 7b 0a 20 20 56 66 73 6c   *pVtab){.  Vfsl
6af0: 6f 67 56 74 61 62 20 2a 70 20 3d 20 28 56 66 73  ogVtab *p = (Vfs
6b00: 6c 6f 67 56 74 61 62 20 2a 29 70 56 74 61 62 3b  logVtab *)pVtab;
6b10: 0a 20 20 69 66 28 20 70 2d 3e 70 46 64 2d 3e 70  .  if( p->pFd->p
6b20: 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 70  Methods ){.    p
6b30: 2d 3e 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  ->pFd->pMethods-
6b40: 3e 78 43 6c 6f 73 65 28 70 2d 3e 70 46 64 29 3b  >xClose(p->pFd);
6b50: 0a 20 20 20 20 70 2d 3e 70 46 64 2d 3e 70 4d 65  .    p->pFd->pMe
6b60: 74 68 6f 64 73 20 3d 20 30 3b 0a 20 20 7d 0a 20  thods = 0;.  }. 
6b70: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
6b80: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
6b90: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  E_OK;.}../*.** O
6ba0: 70 65 6e 20 61 20 6e 65 77 20 76 66 73 6c 6f 67  pen a new vfslog
6bb0: 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   cursor..*/.stat
6bc0: 69 63 20 69 6e 74 20 76 6c 6f 67 4f 70 65 6e 28  ic int vlogOpen(
6bd0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
6be0: 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 76 74 61  Tab, sqlite3_vta
6bf0: 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72  b_cursor **ppCur
6c00: 73 6f 72 29 7b 0a 20 20 56 66 73 6c 6f 67 43 73  sor){.  VfslogCs
6c10: 72 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20 20  r *pCsr;        
6c20: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79          /* Newly
6c30: 20 61 6c 6c 6f 63 61 74 65 64 20 63 75 72 73 6f   allocated curso
6c40: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 70  r object */..  p
6c50: 43 73 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Csr = sqlite3_ma
6c60: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 56 66 73 6c  lloc(sizeof(Vfsl
6c70: 6f 67 43 73 72 29 29 3b 0a 20 20 69 66 28 20 21  ogCsr));.  if( !
6c80: 70 43 73 72 20 29 20 72 65 74 75 72 6e 20 53 51  pCsr ) return SQ
6c90: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
6ca0: 6d 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69  mset(pCsr, 0, si
6cb0: 7a 65 6f 66 28 56 66 73 6c 6f 67 43 73 72 29 29  zeof(VfslogCsr))
6cc0: 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72 20 3d 20  ;.  *ppCursor = 
6cd0: 26 70 43 73 72 2d 3e 62 61 73 65 3b 0a 20 20 72  &pCsr->base;.  r
6ce0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6cf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
6d00: 61 20 76 66 73 6c 6f 67 20 63 75 72 73 6f 72 2e  a vfslog cursor.
6d10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
6d20: 6c 6f 67 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  logClose(sqlite3
6d30: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43  _vtab_cursor *pC
6d40: 75 72 73 6f 72 29 7b 0a 20 20 56 66 73 6c 6f 67  ursor){.  Vfslog
6d50: 43 73 72 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67  Csr *p = (Vfslog
6d60: 43 73 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 20  Csr *)pCursor;. 
6d70: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
6d80: 30 3b 20 69 3c 70 2d 3e 6e 46 69 6c 65 3b 20 69  0; i<p->nFile; i
6d90: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
6da0: 5f 66 72 65 65 28 70 2d 3e 61 7a 46 69 6c 65 5b  _free(p->azFile[
6db0: 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  i]);.  }.  sqlit
6dc0: 65 33 5f 66 72 65 65 28 70 2d 3e 61 7a 46 69 6c  e3_free(p->azFil
6dd0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
6de0: 65 65 28 70 2d 3e 7a 54 72 61 6e 73 69 65 6e 74  ee(p->zTransient
6df0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
6e00: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
6e10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
6e20: 2a 2a 20 4d 6f 76 65 20 61 20 76 66 73 6c 6f 67  ** Move a vfslog
6e30: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
6e40: 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
6e50: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
6e60: 20 69 6e 74 20 76 6c 6f 67 4e 65 78 74 28 73 71   int vlogNext(sq
6e70: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
6e80: 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a 20 20 56  r *pCursor){.  V
6e90: 66 73 6c 6f 67 43 73 72 20 2a 70 43 73 72 20 3d  fslogCsr *pCsr =
6ea0: 20 28 56 66 73 6c 6f 67 43 73 72 20 2a 29 70 43   (VfslogCsr *)pC
6eb0: 75 72 73 6f 72 3b 0a 20 20 56 66 73 6c 6f 67 56  ursor;.  VfslogV
6ec0: 74 61 62 20 2a 70 20 3d 20 28 56 66 73 6c 6f 67  tab *p = (Vfslog
6ed0: 56 74 61 62 20 2a 29 70 43 75 72 73 6f 72 2d 3e  Vtab *)pCursor->
6ee0: 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20  pVtab;.  int rc 
6ef0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
6f00: 6e 74 20 6e 52 65 61 64 3b 0a 0a 20 20 73 71 6c  nt nRead;..  sql
6f10: 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e  ite3_free(pCsr->
6f20: 7a 54 72 61 6e 73 69 65 6e 74 29 3b 0a 20 20 70  zTransient);.  p
6f30: 43 73 72 2d 3e 7a 54 72 61 6e 73 69 65 6e 74 20  Csr->zTransient 
6f40: 3d 20 30 3b 0a 0a 20 20 6e 52 65 61 64 20 3d 20  = 0;..  nRead = 
6f50: 32 34 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e  24;.  if( pCsr->
6f60: 69 4f 66 66 73 65 74 2b 6e 52 65 61 64 3c 3d 70  iOffset+nRead<=p
6f70: 2d 3e 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 69  ->nByte ){.    i
6f80: 6e 74 20 65 45 76 65 6e 74 3b 0a 20 20 20 20 72  nt eEvent;.    r
6f90: 63 20 3d 20 70 2d 3e 70 46 64 2d 3e 70 4d 65 74  c = p->pFd->pMet
6fa0: 68 6f 64 73 2d 3e 78 52 65 61 64 28 70 2d 3e 70  hods->xRead(p->p
6fb0: 46 64 2c 20 70 43 73 72 2d 3e 61 42 75 66 2c 20  Fd, pCsr->aBuf, 
6fc0: 6e 52 65 61 64 2c 20 70 43 73 72 2d 3e 69 4f 66  nRead, pCsr->iOf
6fd0: 66 73 65 74 29 3b 0a 0a 20 20 20 20 65 45 76 65  fset);..    eEve
6fe0: 6e 74 20 3d 20 67 65 74 33 32 62 69 74 73 28 70  nt = get32bits(p
6ff0: 43 73 72 2d 3e 61 42 75 66 29 3b 0a 20 20 20 20  Csr->aBuf);.    
7000: 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
7010: 4f 4b 29 0a 20 20 20 20 20 26 26 20 28 65 45 76  OK).     && (eEv
7020: 65 6e 74 3d 3d 4f 53 5f 4f 50 45 4e 20 7c 7c 20  ent==OS_OPEN || 
7030: 65 45 76 65 6e 74 3d 3d 4f 53 5f 44 45 4c 45 54  eEvent==OS_DELET
7040: 45 20 7c 7c 20 65 45 76 65 6e 74 3d 3d 4f 53 5f  E || eEvent==OS_
7050: 41 43 43 45 53 53 29 20 0a 20 20 20 20 29 7b 0a  ACCESS) .    ){.
7060: 20 20 20 20 20 20 63 68 61 72 20 62 75 66 5b 34        char buf[4
7070: 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 2d  ];.      rc = p-
7080: 3e 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  >pFd->pMethods->
7090: 78 52 65 61 64 28 70 2d 3e 70 46 64 2c 20 62 75  xRead(p->pFd, bu
70a0: 66 2c 20 34 2c 20 70 43 73 72 2d 3e 69 4f 66 66  f, 4, pCsr->iOff
70b0: 73 65 74 2b 6e 52 65 61 64 29 3b 0a 20 20 20 20  set+nRead);.    
70c0: 20 20 6e 52 65 61 64 20 2b 3d 20 34 3b 0a 20 20    nRead += 4;.  
70d0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
70e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
70f0: 20 69 6e 74 20 6e 53 74 72 20 3d 20 67 65 74 33   int nStr = get3
7100: 32 62 69 74 73 28 28 75 6e 73 69 67 6e 65 64 20  2bits((unsigned 
7110: 63 68 61 72 20 2a 29 62 75 66 29 3b 0a 20 20 20  char *)buf);.   
7120: 20 20 20 20 20 63 68 61 72 20 2a 7a 53 74 72 20       char *zStr 
7130: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
7140: 28 6e 53 74 72 2b 31 29 3b 0a 20 20 20 20 20 20  (nStr+1);.      
7150: 20 20 72 63 20 3d 20 70 2d 3e 70 46 64 2d 3e 70    rc = p->pFd->p
7160: 4d 65 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70  Methods->xRead(p
7170: 2d 3e 70 46 64 2c 20 7a 53 74 72 2c 20 6e 53 74  ->pFd, zStr, nSt
7180: 72 2c 20 70 43 73 72 2d 3e 69 4f 66 66 73 65 74  r, pCsr->iOffset
7190: 2b 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 20  +nRead);.       
71a0: 20 7a 53 74 72 5b 6e 53 74 72 5d 20 3d 20 27 5c   zStr[nStr] = '\
71b0: 30 27 3b 0a 20 20 20 20 20 20 20 20 6e 52 65 61  0';.        nRea
71c0: 64 20 2b 3d 20 6e 53 74 72 3b 0a 0a 20 20 20 20  d += nStr;..    
71d0: 20 20 20 20 69 66 28 20 65 45 76 65 6e 74 3d 3d      if( eEvent==
71e0: 4f 53 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20  OS_OPEN ){.     
71f0: 20 20 20 20 20 69 6e 74 20 69 46 69 6c 65 69 64       int iFileid
7200: 20 3d 20 67 65 74 33 32 62 69 74 73 28 26 70 43   = get32bits(&pC
7210: 73 72 2d 3e 61 42 75 66 5b 34 5d 29 3b 0a 20 20  sr->aBuf[4]);.  
7220: 20 20 20 20 20 20 20 20 69 66 28 20 69 46 69 6c          if( iFil
7230: 65 69 64 3e 3d 70 43 73 72 2d 3e 6e 46 69 6c 65  eid>=pCsr->nFile
7240: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7250: 69 6e 74 20 6e 4e 65 77 20 3d 20 73 69 7a 65 6f  int nNew = sizeo
7260: 66 28 70 43 73 72 2d 3e 61 7a 46 69 6c 65 5b 30  f(pCsr->azFile[0
7270: 5d 29 2a 28 69 46 69 6c 65 69 64 2b 31 29 3b 0a  ])*(iFileid+1);.
7280: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73 72              pCsr
7290: 2d 3e 61 7a 46 69 6c 65 20 3d 20 28 63 68 61 72  ->azFile = (char
72a0: 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c   **)sqlite3_real
72b0: 6c 6f 63 28 70 43 73 72 2d 3e 61 7a 46 69 6c 65  loc(pCsr->azFile
72c0: 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , nNew);.       
72d0: 20 20 20 20 20 6e 4e 65 77 20 2d 3d 20 73 69 7a       nNew -= siz
72e0: 65 6f 66 28 70 43 73 72 2d 3e 61 7a 46 69 6c 65  eof(pCsr->azFile
72f0: 5b 30 5d 29 2a 70 43 73 72 2d 3e 6e 46 69 6c 65  [0])*pCsr->nFile
7300: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  ;.            me
7310: 6d 73 65 74 28 26 70 43 73 72 2d 3e 61 7a 46 69  mset(&pCsr->azFi
7320: 6c 65 5b 70 43 73 72 2d 3e 6e 46 69 6c 65 5d 2c  le[pCsr->nFile],
7330: 20 30 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20   0, nNew);.     
7340: 20 20 20 20 20 20 20 70 43 73 72 2d 3e 6e 46 69         pCsr->nFi
7350: 6c 65 20 3d 20 69 46 69 6c 65 69 64 2b 31 3b 0a  le = iFileid+1;.
7360: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
7380: 65 65 28 70 43 73 72 2d 3e 61 7a 46 69 6c 65 5b  ee(pCsr->azFile[
7390: 69 46 69 6c 65 69 64 5d 29 3b 0a 20 20 20 20 20  iFileid]);.     
73a0: 20 20 20 20 20 70 43 73 72 2d 3e 61 7a 46 69 6c       pCsr->azFil
73b0: 65 5b 69 46 69 6c 65 69 64 5d 20 3d 20 7a 53 74  e[iFileid] = zSt
73c0: 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  r;.        }else
73d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 73 72  {.          pCsr
73e0: 2d 3e 7a 54 72 61 6e 73 69 65 6e 74 20 3d 20 7a  ->zTransient = z
73f0: 53 74 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Str;.        }. 
7400: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7410: 0a 0a 20 20 70 43 73 72 2d 3e 69 52 6f 77 69 64  ..  pCsr->iRowid
7420: 20 2b 3d 20 31 3b 0a 20 20 70 43 73 72 2d 3e 69   += 1;.  pCsr->i
7430: 4f 66 66 73 65 74 20 2b 3d 20 6e 52 65 61 64 3b  Offset += nRead;
7440: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7450: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 6c 6f 67  .static int vlog
7460: 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62  Eof(sqlite3_vtab
7470: 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72  _cursor *pCursor
7480: 29 7b 0a 20 20 56 66 73 6c 6f 67 43 73 72 20 2a  ){.  VfslogCsr *
7490: 70 43 73 72 20 3d 20 28 56 66 73 6c 6f 67 43 73  pCsr = (VfslogCs
74a0: 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 56  r *)pCursor;.  V
74b0: 66 73 6c 6f 67 56 74 61 62 20 2a 70 20 3d 20 28  fslogVtab *p = (
74c0: 56 66 73 6c 6f 67 56 74 61 62 20 2a 29 70 43 75  VfslogVtab *)pCu
74d0: 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 72  rsor->pVtab;.  r
74e0: 65 74 75 72 6e 20 28 70 43 73 72 2d 3e 69 4f 66  eturn (pCsr->iOf
74f0: 66 73 65 74 3e 3d 70 2d 3e 6e 42 79 74 65 29 3b  fset>=p->nByte);
7500: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .}..static int v
7510: 6c 6f 67 46 69 6c 74 65 72 28 0a 20 20 73 71 6c  logFilter(.  sql
7520: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
7530: 20 2a 70 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e   *pCursor, .  in
7540: 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20  t idxNum, const 
7550: 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20  char *idxStr,.  
7560: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
7570: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
7580: 7b 0a 20 20 56 66 73 6c 6f 67 43 73 72 20 2a 70  {.  VfslogCsr *p
7590: 43 73 72 20 3d 20 28 56 66 73 6c 6f 67 43 73 72  Csr = (VfslogCsr
75a0: 20 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 70 43   *)pCursor;.  pC
75b0: 73 72 2d 3e 69 52 6f 77 69 64 20 3d 20 30 3b 0a  sr->iRowid = 0;.
75c0: 20 20 70 43 73 72 2d 3e 69 4f 66 66 73 65 74 20    pCsr->iOffset 
75d0: 3d 20 32 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  = 20;.  return v
75e0: 6c 6f 67 4e 65 78 74 28 70 43 75 72 73 6f 72 29  logNext(pCursor)
75f0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
7600: 76 6c 6f 67 43 6f 6c 75 6d 6e 28 0a 20 20 73 71  vlogColumn(.  sq
7610: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
7620: 72 20 2a 70 43 75 72 73 6f 72 2c 20 0a 20 20 73  r *pCursor, .  s
7630: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
7640: 63 74 78 2c 20 0a 20 20 69 6e 74 20 69 0a 29 7b  ctx, .  int i.){
7650: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
7660: 76 61 6c 3b 0a 20 20 56 66 73 6c 6f 67 43 73 72  val;.  VfslogCsr
7670: 20 2a 70 43 73 72 20 3d 20 28 56 66 73 6c 6f 67   *pCsr = (Vfslog
7680: 43 73 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 0a  Csr *)pCursor;..
7690: 20 20 61 73 73 65 72 74 28 20 69 3c 37 20 29 3b    assert( i<7 );
76a0: 0a 20 20 76 61 6c 20 3d 20 67 65 74 33 32 62 69  .  val = get32bi
76b0: 74 73 28 26 70 43 73 72 2d 3e 61 42 75 66 5b 34  ts(&pCsr->aBuf[4
76c0: 2a 69 5d 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  *i]);..  switch(
76d0: 20 69 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30   i ){.    case 0
76e0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
76f0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74  3_result_text(ct
7700: 78 2c 20 76 66 73 6c 6f 67 5f 65 76 65 6e 74 6e  x, vfslog_eventn
7710: 61 6d 65 28 76 61 6c 29 2c 20 2d 31 2c 20 53 51  ame(val), -1, SQ
7720: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
7730: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7740: 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20  .    case 1: {. 
7750: 20 20 20 20 20 63 68 61 72 20 2a 7a 53 74 72 20       char *zStr 
7760: 3d 20 70 43 73 72 2d 3e 7a 54 72 61 6e 73 69 65  = pCsr->zTransie
7770: 6e 74 3b 0a 20 20 20 20 20 20 69 66 28 20 76 61  nt;.      if( va
7780: 6c 21 3d 30 20 26 26 20 76 61 6c 3c 28 75 6e 73  l!=0 && val<(uns
7790: 69 67 6e 65 64 29 70 43 73 72 2d 3e 6e 46 69 6c  igned)pCsr->nFil
77a0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 74  e ){.        zSt
77b0: 72 20 3d 20 70 43 73 72 2d 3e 61 7a 46 69 6c 65  r = pCsr->azFile
77c0: 5b 76 61 6c 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  [val];.      }. 
77d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
77e0: 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 7a 53  ult_text(ctx, zS
77f0: 74 72 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  tr, -1, SQLITE_T
7800: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
7810: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7820: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
7830: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7840: 69 6e 74 28 63 74 78 2c 20 76 61 6c 29 3b 0a 20  int(ctx, val);. 
7850: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
7860: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7870: 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
7880: 6e 74 20 76 6c 6f 67 52 6f 77 69 64 28 73 71 6c  nt vlogRowid(sql
7890: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
78a0: 20 2a 70 43 75 72 73 6f 72 2c 20 73 71 6c 69 74   *pCursor, sqlit
78b0: 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 29  e_int64 *pRowid)
78c0: 7b 0a 20 20 56 66 73 6c 6f 67 43 73 72 20 2a 70  {.  VfslogCsr *p
78d0: 43 73 72 20 3d 20 28 56 66 73 6c 6f 67 43 73 72  Csr = (VfslogCsr
78e0: 20 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 2a 70   *)pCursor;.  *p
78f0: 52 6f 77 69 64 20 3d 20 70 43 73 72 2d 3e 69 52  Rowid = pCsr->iR
7900: 6f 77 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  owid;.  return S
7910: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74  QLITE_OK;.}..int
7920: 20 73 71 6c 69 74 65 33 5f 76 66 73 6c 6f 67 5f   sqlite3_vfslog_
7930: 72 65 67 69 73 74 65 72 28 73 71 6c 69 74 65 33  register(sqlite3
7940: 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20   *db){.  static 
7950: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 76  sqlite3_module v
7960: 66 73 6c 6f 67 5f 6d 6f 64 75 6c 65 20 3d 20 7b  fslog_module = {
7970: 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7990: 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
79a0: 2f 0a 20 20 20 20 76 6c 6f 67 43 6f 6e 6e 65 63  /.    vlogConnec
79b0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
79c0: 20 20 2f 2a 20 78 43 72 65 61 74 65 20 2a 2f 0a    /* xCreate */.
79d0: 20 20 20 20 76 6c 6f 67 43 6f 6e 6e 65 63 74 2c      vlogConnect,
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79f0: 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a 20  /* xConnect */. 
7a00: 20 20 20 76 6c 6f 67 42 65 73 74 49 6e 64 65 78     vlogBestIndex
7a10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7a20: 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a  * xBestIndex */.
7a30: 20 20 20 20 76 6c 6f 67 44 69 73 63 6f 6e 6e 65      vlogDisconne
7a40: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ct,             
7a50: 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2a  /* xDisconnect *
7a60: 2f 0a 20 20 20 20 76 6c 6f 67 44 69 73 63 6f 6e  /.    vlogDiscon
7a70: 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  nect,           
7a80: 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2a 2f    /* xDestroy */
7a90: 0a 20 20 20 20 76 6c 6f 67 4f 70 65 6e 2c 20 20  .    vlogOpen,  
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ab0: 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e   /* xOpen - open
7ac0: 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 20   a cursor */.   
7ad0: 20 76 6c 6f 67 43 6c 6f 73 65 2c 20 20 20 20 20   vlogClose,     
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7af0: 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61  xClose - close a
7b00: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 76   cursor */.    v
7b10: 6c 6f 67 46 69 6c 74 65 72 2c 20 20 20 20 20 20  logFilter,      
7b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
7b30: 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72  ilter - configur
7b40: 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e  e scan constrain
7b50: 74 73 20 2a 2f 0a 20 20 20 20 76 6c 6f 67 4e 65  ts */.    vlogNe
7b60: 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  xt,             
7b70: 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d        /* xNext -
7b80: 20 61 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f   advance a curso
7b90: 72 20 2a 2f 0a 20 20 20 20 76 6c 6f 67 45 6f 66  r */.    vlogEof
7ba0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7bb0: 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d 20 63       /* xEof - c
7bc0: 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f 66 20  heck for end of 
7bd0: 73 63 61 6e 20 2a 2f 0a 20 20 20 20 76 6c 6f 67  scan */.    vlog
7be0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
7bf0: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75          /* xColu
7c00: 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a  mn - read data *
7c10: 2f 0a 20 20 20 20 76 6c 6f 67 52 6f 77 69 64 2c  /.    vlogRowid,
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 77 69 64 20 2d 20 72 65    /* xRowid - re
7c40: 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 30  ad data */.    0
7c50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7c70: 78 55 70 64 61 74 65 20 2a 2f 0a 20 20 20 20 30  xUpdate */.    0
7c80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7ca0: 78 42 65 67 69 6e 20 2a 2f 0a 20 20 20 20 30 2c  xBegin */.    0,
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
7cd0: 53 79 6e 63 20 2a 2f 0a 20 20 20 20 30 2c 20 20  Sync */.    0,  
7ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
7d00: 6d 6d 69 74 20 2a 2f 0a 20 20 20 20 30 2c 20 20  mmit */.    0,  
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
7d30: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20 30 2c  llback */.    0,
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
7d60: 46 69 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20  FindMethod */.  
7d70: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d90: 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a 20 20  /* xRename */.  
7da0: 7d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 63 72  };..  sqlite3_cr
7db0: 65 61 74 65 5f 6d 6f 64 75 6c 65 28 64 62 2c 20  eate_module(db, 
7dc0: 22 76 66 73 6c 6f 67 22 2c 20 26 76 66 73 6c 6f  "vfslog", &vfslo
7dd0: 67 5f 6d 6f 64 75 6c 65 2c 20 30 29 3b 0a 20 20  g_module, 0);.  
7de0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7df0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
7e00: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
7e10: 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a  LTABLE */../****
7e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e60: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
7e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7eb0: 2a 2a 0a 2a 2a 20 54 63 6c 20 69 6e 74 65 72 66  **.** Tcl interf
7ec0: 61 63 65 20 73 74 61 72 74 73 20 68 65 72 65 2e  ace starts here.
7ed0: 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
7ee0: 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
7ef0: 20 64 65 66 69 6e 65 64 28 54 43 4c 53 48 29 0a   defined(TCLSH).
7f00: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 63 6c 2e 68  .#include <tcl.h
7f10: 3e 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  >..static int te
7f20: 73 74 5f 76 66 73 6c 6f 67 28 0a 20 20 76 6f 69  st_vfslog(.  voi
7f30: 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20  d *clientData,. 
7f40: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
7f50: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
7f60: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
7f70: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74  T objv[].){.  st
7f80: 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 7b 20  ruct SqliteDb { 
7f90: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 7d 3b 0a  sqlite3 *db; };.
7fa0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
7fb0: 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64   Tcl_CmdInfo cmd
7fc0: 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Info;.  int rc =
7fd0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a   SQLITE_ERROR;..
7fe0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
7ff0: 68 61 72 20 2a 73 74 72 73 5b 5d 20 3d 20 7b 20  har *strs[] = { 
8000: 22 61 6e 6e 6f 74 61 74 65 22 2c 20 22 66 69 6e  "annotate", "fin
8010: 61 6c 69 7a 65 22 2c 20 22 6e 65 77 22 2c 20 20  alize", "new",  
8020: 22 72 65 67 69 73 74 65 72 22 2c 20 30 20 7d 3b  "register", 0 };
8030: 0a 20 20 65 6e 75 6d 20 56 4c 5f 65 6e 75 6d 20  .  enum VL_enum 
8040: 7b 20 56 4c 5f 41 4e 4e 4f 54 41 54 45 2c 20 56  { VL_ANNOTATE, V
8050: 4c 5f 46 49 4e 41 4c 49 5a 45 2c 20 56 4c 5f 4e  L_FINALIZE, VL_N
8060: 45 57 2c 20 56 4c 5f 52 45 47 49 53 54 45 52 20  EW, VL_REGISTER 
8070: 7d 3b 0a 20 20 69 6e 74 20 69 53 75 62 3b 0a 0a  };.  int iSub;..
8080: 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a    if( objc<2 ){.
8090: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
80a0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
80b0: 6f 62 6a 76 2c 20 22 53 55 42 2d 43 4f 4d 4d 41  objv, "SUB-COMMA
80c0: 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65  ND ...");.    re
80d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
80e0: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
80f0: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
8100: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 73  terp, objv[1], s
8110: 74 72 73 2c 20 22 73 75 62 2d 63 6f 6d 6d 61 6e  trs, "sub-comman
8120: 64 22 2c 20 30 2c 20 26 69 53 75 62 29 20 29 7b  d", 0, &iSub) ){
8130: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
8140: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77  ERROR;.  }..  sw
8150: 69 74 63 68 28 20 28 65 6e 75 6d 20 56 4c 5f 65  itch( (enum VL_e
8160: 6e 75 6d 29 69 53 75 62 20 29 7b 0a 20 20 20 20  num)iSub ){.    
8170: 63 61 73 65 20 56 4c 5f 41 4e 4e 4f 54 41 54 45  case VL_ANNOTATE
8180: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  : {.      int rc
8190: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56  ;.      char *zV
81a0: 66 73 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  fs;.      char *
81b0: 7a 4d 73 67 3b 0a 20 20 20 20 20 20 69 66 28 20  zMsg;.      if( 
81c0: 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
81d0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
81e0: 72 67 73 28 69 6e 74 65 72 70 2c 20 33 2c 20 6f  rgs(interp, 3, o
81f0: 62 6a 76 2c 20 22 56 46 53 22 29 3b 0a 20 20 20  bjv, "VFS");.   
8200: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8210: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
8220: 20 20 20 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f       zVfs = Tcl_
8230: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
8240: 5d 29 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d  ]);.      zMsg =
8250: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
8260: 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20 72  bjv[3]);.      r
8270: 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 6c  c = sqlite3_vfsl
8280: 6f 67 5f 61 6e 6e 6f 74 61 74 65 28 7a 56 66 73  og_annotate(zVfs
8290: 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 69  , zMsg);.      i
82a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
82b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
82c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
82d0: 65 72 70 2c 20 22 66 61 69 6c 65 64 22 2c 20 30  erp, "failed", 0
82e0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
82f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8300: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
8310: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
8320: 20 56 4c 5f 46 49 4e 41 4c 49 5a 45 3a 20 7b 0a   VL_FINALIZE: {.
8330: 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
8340: 20 20 20 20 63 68 61 72 20 2a 7a 56 66 73 3b 0a      char *zVfs;.
8350: 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
8360: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  3 ){.        Tcl
8370: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
8380: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
8390: 56 46 53 22 29 3b 0a 20 20 20 20 20 20 20 20 72  VFS");.        r
83a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
83b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
83c0: 56 66 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Vfs = Tcl_GetStr
83d0: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
83e0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
83f0: 5f 76 66 73 6c 6f 67 5f 66 69 6e 61 6c 69 7a 65  _vfslog_finalize
8400: 28 7a 56 66 73 29 3b 0a 20 20 20 20 20 20 69 66  (zVfs);.      if
8410: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8420: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
8430: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8440: 72 70 2c 20 22 66 61 69 6c 65 64 22 2c 20 30 29  rp, "failed", 0)
8450: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
8460: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8470: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
8480: 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 63 61 73  .    };..    cas
8490: 65 20 56 4c 5f 4e 45 57 3a 20 7b 0a 20 20 20 20  e VL_NEW: {.    
84a0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
84b0: 63 68 61 72 20 2a 7a 56 66 73 3b 0a 20 20 20 20  char *zVfs;.    
84c0: 20 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 3b    char *zParent;
84d0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f  .      char *zLo
84e0: 67 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  g;.      if( obj
84f0: 63 21 3d 35 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=5 ){.        
8500: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
8510: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
8520: 2c 20 22 56 46 53 20 50 41 52 45 4e 54 20 4c 4f  , "VFS PARENT LO
8530: 47 46 49 4c 45 22 29 3b 0a 20 20 20 20 20 20 20  GFILE");.       
8540: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8550: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
8560: 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65 74 53   zVfs = Tcl_GetS
8570: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
8580: 20 20 20 20 20 20 7a 50 61 72 65 6e 74 20 3d 20        zParent = 
8590: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
85a0: 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20 7a 4c  jv[3]);.      zL
85b0: 6f 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  og = Tcl_GetStri
85c0: 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 20 20 20  ng(objv[4]);.   
85d0: 20 20 20 69 66 28 20 2a 7a 50 61 72 65 6e 74 3d     if( *zParent=
85e0: 3d 27 5c 30 27 20 29 20 7a 50 61 72 65 6e 74 20  ='\0' ) zParent 
85f0: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
8600: 73 71 6c 69 74 65 33 5f 76 66 73 6c 6f 67 5f 6e  sqlite3_vfslog_n
8610: 65 77 28 7a 56 66 73 2c 20 7a 50 61 72 65 6e 74  ew(zVfs, zParent
8620: 2c 20 7a 4c 6f 67 29 3b 0a 20 20 20 20 20 20 69  , zLog);.      i
8630: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8640: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
8650: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8660: 65 72 70 2c 20 22 66 61 69 6c 65 64 22 2c 20 30  erp, "failed", 0
8670: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
8680: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8690: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
86a0: 3b 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 63 61  ;.    };..    ca
86b0: 73 65 20 56 4c 5f 52 45 47 49 53 54 45 52 3a 20  se VL_REGISTER: 
86c0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 44  {.      char *zD
86d0: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  b;.      if( obj
86e0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=3 ){.        
86f0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
8700: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
8710: 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 20 20 20  , "DB");.       
8720: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8730: 52 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65  R;.      }.#ifde
8740: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
8750: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
8760: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8770: 74 28 69 6e 74 65 72 70 2c 20 22 76 66 73 6c 6f  t(interp, "vfslo
8780: 67 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  g not available 
8790: 62 65 63 61 75 73 65 20 6f 66 20 22 0a 20 20 20  because of ".   
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 51 4c              "SQL
87c0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
87d0: 54 41 42 4c 45 22 2c 20 28 76 6f 69 64 2a 29 30  TABLE", (void*)0
87e0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
87f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
8800: 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 54 63 6c  .      zDb = Tcl
8810: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
8820: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 54  2]);.      if( T
8830: 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
8840: 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26  o(interp, zDb, &
8850: 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  cmdInfo) ){.    
8860: 20 20 20 20 64 62 20 3d 20 28 28 73 74 72 75 63      db = ((struc
8870: 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49  t SqliteDb*)cmdI
8880: 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74  nfo.objClientDat
8890: 61 29 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  a)->db;.        
88a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  rc = sqlite3_vfs
88b0: 6c 6f 67 5f 72 65 67 69 73 74 65 72 28 64 62 29  log_register(db)
88c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
88d0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
88e0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  K ){.        Tcl
88f0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8900: 74 65 72 70 2c 20 22 62 61 64 20 73 71 6c 69 74  terp, "bad sqlit
8910: 65 33 20 68 61 6e 64 6c 65 3a 20 22 2c 20 7a 44  e3 handle: ", zD
8920: 62 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20  b, (void*)0);.  
8930: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8940: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
8950: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e        break;.#en
8960: 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  dif.    }.  }.. 
8970: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
8980: 7d 0a 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73  }..int Sqlitetes
8990: 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54 63 6c  tOsinst_Init(Tcl
89a0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
89b0: 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62  {.  Tcl_CreateOb
89c0: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
89d0: 20 22 76 66 73 6c 6f 67 22 2c 20 74 65 73 74 5f   "vfslog", test_
89e0: 76 66 73 6c 6f 67 2c 20 30 2c 20 30 29 3b 0a 20  vfslog, 0, 0);. 
89f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
8a00: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
8a10: 49 54 45 5f 54 45 53 54 20 2a 2f 0a              ITE_TEST */.