SQLite
Hex Artifact Content
Not logged in

Artifact bf10ef0bc51e1ad6756629e1edb142f7a8db1178:


0000: 2f 2a 0a 2a 2a 20 32 30 31 36 2d 30 35 2d 32 37  /*.** 2016-05-27
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  file contains th
0190: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
01a0: 20 6f 66 20 61 6e 20 53 51 4c 69 74 65 20 76 66   of an SQLite vf
01b0: 73 20 73 68 69 6d 20 74 68 61 74 0a 2a 2a 20 74  s shim that.** t
01c0: 72 61 63 6b 73 20 49 2f 4f 2e 20 20 41 63 63 65  racks I/O.  Acce
01d0: 73 73 20 74 6f 20 74 68 65 20 61 63 63 75 6d 75  ss to the accumu
01e0: 6c 61 74 65 64 20 73 74 61 74 75 73 20 63 6f 75  lated status cou
01f0: 6e 74 73 20 69 73 20 70 72 6f 76 69 64 65 64 20  nts is provided 
0200: 75 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 70 6f 6e  using.** an epon
0210: 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61  ymous virtual ta
0220: 62 6c 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ble..*/.#include
0230: 20 3c 73 71 6c 69 74 65 33 65 78 74 2e 68 3e 0a   <sqlite3ext.h>.
0240: 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e  SQLITE_EXTENSION
0250: 5f 49 4e 49 54 31 0a 0a 2f 2a 0a 2a 2a 20 54 68  _INIT1../*.** Th
0260: 69 73 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69  is module contai
0270: 6e 73 20 63 6f 64 65 20 66 6f 72 20 61 20 77 72  ns code for a wr
0280: 61 70 70 65 72 20 56 46 53 20 74 68 61 74 20 63  apper VFS that c
0290: 61 75 73 65 20 73 74 61 74 73 20 66 6f 72 0a 2a  ause stats for.*
02a0: 2a 20 6d 6f 73 74 20 56 46 53 20 63 61 6c 6c 73  * most VFS calls
02b0: 20 74 6f 20 62 65 20 72 65 63 6f 72 64 65 64 2e   to be recorded.
02c0: 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 73 65 20 74 68  .**.** To use th
02d0: 69 73 20 6d 6f 64 75 6c 65 2c 20 66 69 72 73 74  is module, first
02e0: 20 63 6f 6d 70 69 6c 65 20 69 74 20 61 73 20 61   compile it as a
02f0: 20 6c 6f 61 64 61 62 6c 65 20 65 78 74 65 6e 73   loadable extens
0300: 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 68 74 74  ion.  See.** htt
0310: 70 73 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e  ps://www.sqlite.
0320: 6f 72 67 2f 6c 6f 61 64 65 78 74 2e 68 74 6d 6c  org/loadext.html
0330: 23 62 75 69 6c 64 20 66 6f 72 20 63 6f 6d 70 69  #build for compi
0340: 6c 61 74 69 6f 6e 73 20 69 6e 73 74 72 75 63 74  lations instruct
0350: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  ions..**.** Afte
0360: 72 20 63 6f 6d 70 6c 69 69 6e 67 2c 20 6c 6f 61  r compliing, loa
0370: 64 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e  d this extension
0380: 2c 20 74 68 65 6e 20 6f 70 65 6e 20 64 61 74 61  , then open data
0390: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
03a0: 20 74 6f 20 62 65 0a 2a 2a 20 6d 65 61 73 75 72   to be.** measur
03b0: 65 64 2e 20 20 51 75 65 72 79 20 75 73 61 67 65  ed.  Query usage
03c0: 73 20 73 74 61 74 75 73 20 75 73 69 6e 67 20 74  s status using t
03d0: 68 65 20 76 66 73 73 74 61 74 20 76 69 72 74 75  he vfsstat virtu
03e0: 61 6c 20 74 61 62 6c 65 3a 0a 2a 2a 0a 2a 2a 20  al table:.**.** 
03f0: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a          SELECT *
0400: 20 46 52 4f 4d 20 76 66 73 73 74 61 74 3b 0a 2a   FROM vfsstat;.*
0410: 2a 0a 2a 2a 20 52 65 73 65 74 20 63 6f 75 6e 74  *.** Reset count
0420: 65 72 73 20 75 73 69 6e 67 20 55 50 44 41 54 45  ers using UPDATE
0430: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 67 61 69   statements agai
0440: 6e 73 74 20 76 66 73 73 74 61 74 3a 0a 2a 2a 0a  nst vfsstat:.**.
0450: 2a 2a 20 20 20 20 20 20 20 20 20 55 50 44 41 54  **         UPDAT
0460: 45 20 76 66 73 73 74 61 74 20 53 45 54 20 63 6f  E vfsstat SET co
0470: 75 6e 74 3d 30 3b 0a 2a 2a 0a 2a 2a 20 45 58 41  unt=0;.**.** EXA
0480: 4d 50 4c 45 20 53 43 52 49 50 54 3a 0a 2a 2a 0a  MPLE SCRIPT:.**.
0490: 2a 2a 20 20 20 20 20 20 2e 6c 6f 61 64 20 2e 2f  **      .load ./
04a0: 76 66 73 73 74 61 74 0a 2a 2a 20 20 20 20 20 20  vfsstat.**      
04b0: 2e 6f 70 65 6e 20 74 65 73 74 2e 64 62 0a 2a 2a  .open test.db.**
04c0: 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45        DROP TABLE
04d0: 20 49 46 20 45 58 49 53 54 53 20 74 31 3b 0a 2a   IF EXISTS t1;.*
04e0: 2a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  *      CREATE TA
04f0: 42 4c 45 20 74 31 28 78 2c 79 29 3b 0a 2a 2a 20  BLE t1(x,y);.** 
0500: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
0510: 20 74 31 20 56 41 4c 55 45 53 28 31 32 33 2c 20   t1 VALUES(123, 
0520: 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 30 30 29  randomblob(5000)
0530: 29 3b 0a 2a 2a 20 20 20 20 20 20 43 52 45 41 54  );.**      CREAT
0540: 45 20 49 4e 44 45 58 20 74 31 78 20 4f 4e 20 74  E INDEX t1x ON t
0550: 31 28 78 29 3b 0a 2a 2a 20 20 20 20 20 20 44 52  1(x);.**      DR
0560: 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 2a 2a 20  OP TABLE t1;.** 
0570: 20 20 20 20 20 56 41 43 55 55 4d 3b 0a 2a 2a 20       VACUUM;.** 
0580: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
0590: 4f 4d 20 76 66 73 73 74 61 74 20 57 48 45 52 45  OM vfsstat WHERE
05a0: 20 63 6f 75 6e 74 3e 30 3b 0a 2a 2a 0a 2a 2a 20   count>0;.**.** 
05b0: 4c 49 4d 49 54 41 54 49 4f 4e 53 3a 0a 2a 2a 20  LIMITATIONS:.** 
05c0: 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20  .** This module 
05d0: 69 6e 63 72 65 6d 65 6e 74 73 20 63 6f 75 6e 74  increments count
05e0: 65 72 73 20 77 69 74 68 6f 75 74 20 75 73 69 6e  ers without usin
05f0: 67 20 6d 75 74 65 78 20 70 72 6f 74 65 63 74 69  g mutex protecti
0600: 6f 6e 2e 20 20 53 6f 20 69 66 0a 2a 2a 20 74 77  on.  So if.** tw
0610: 6f 20 6f 72 20 6d 6f 72 65 20 74 68 72 65 61 64  o or more thread
0620: 73 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69  s try to use thi
0630: 73 20 6d 6f 64 75 6c 65 20 61 74 20 74 68 65 20  s module at the 
0640: 73 61 6d 65 20 74 69 6d 65 2c 20 72 61 63 65 20  same time, race 
0650: 63 6f 6e 64 69 74 69 6f 6e 73 0a 2a 2a 20 6d 61  conditions.** ma
0660: 79 20 6f 63 63 75 72 20 77 68 69 63 68 20 6d 65  y occur which me
0670: 73 73 20 75 70 20 74 68 65 20 63 6f 75 6e 74 73  ss up the counts
0680: 2e 20 20 54 68 69 73 20 69 73 20 68 61 72 6d 6c  .  This is harml
0690: 65 73 73 2c 20 6f 74 68 65 72 20 74 68 61 6e 20  ess, other than 
06a0: 67 69 76 69 6e 67 0a 2a 2a 20 69 6e 63 6f 72 72  giving.** incorr
06b0: 65 63 74 20 73 74 61 74 69 73 74 69 63 73 2e 0a  ect statistics..
06c0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72  */.#include <str
06d0: 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ing.h>.#include 
06e0: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
06f0: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a  ude <assert.h>..
0700: 2f 2a 0a 2a 2a 20 46 69 6c 65 20 74 79 70 65 73  /*.** File types
0710: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 56 46 53 53  .*/.#define VFSS
0720: 54 41 54 5f 4d 41 49 4e 20 20 20 20 20 20 20 20  TAT_MAIN        
0730: 20 30 20 20 20 2f 2a 20 4d 61 69 6e 20 64 61 74   0   /* Main dat
0740: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 64  abase file */.#d
0750: 65 66 69 6e 65 20 56 46 53 53 54 41 54 5f 4a 4f  efine VFSSTAT_JO
0760: 55 52 4e 41 4c 20 20 20 20 20 20 31 20 20 20 2f  URNAL      1   /
0770: 2a 20 52 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * Rollback journ
0780: 61 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 56 46  al */.#define VF
0790: 53 53 54 41 54 5f 57 41 4c 20 20 20 20 20 20 20  SSTAT_WAL       
07a0: 20 20 20 32 20 20 20 2f 2a 20 57 72 69 74 65 2d     2   /* Write-
07b0: 61 68 65 61 64 20 6c 6f 67 20 66 69 6c 65 20 2a  ahead log file *
07c0: 2f 0a 23 64 65 66 69 6e 65 20 56 46 53 53 54 41  /.#define VFSSTA
07d0: 54 5f 4d 41 53 54 45 52 4a 52 4e 4c 20 20 20 33  T_MASTERJRNL   3
07e0: 20 20 20 2f 2a 20 4d 61 73 74 65 72 20 6a 6f 75     /* Master jou
07f0: 72 6e 61 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20  rnal */.#define 
0800: 56 46 53 53 54 41 54 5f 53 55 42 4a 52 4e 4c 20  VFSSTAT_SUBJRNL 
0810: 20 20 20 20 20 34 20 20 20 2f 2a 20 53 75 62 6a       4   /* Subj
0820: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 64 65 66 69 6e  ournal */.#defin
0830: 65 20 56 46 53 53 54 41 54 5f 54 45 4d 50 44 42  e VFSSTAT_TEMPDB
0840: 20 20 20 20 20 20 20 35 20 20 20 2f 2a 20 54 45         5   /* TE
0850: 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 23  MP database */.#
0860: 64 65 66 69 6e 65 20 56 46 53 53 54 41 54 5f 54  define VFSSTAT_T
0870: 45 4d 50 4a 52 4e 4c 20 20 20 20 20 36 20 20 20  EMPJRNL     6   
0880: 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 6f 72 20 54  /* Journal for T
0890: 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  EMP database */.
08a0: 23 64 65 66 69 6e 65 20 56 46 53 53 54 41 54 5f  #define VFSSTAT_
08b0: 54 52 41 4e 53 49 45 4e 54 20 20 20 20 37 20 20  TRANSIENT    7  
08c0: 20 2f 2a 20 54 72 61 6e 73 69 65 6e 74 20 64 61   /* Transient da
08d0: 74 61 62 61 73 65 20 2a 2f 0a 23 64 65 66 69 6e  tabase */.#defin
08e0: 65 20 56 46 53 53 54 41 54 5f 41 4e 59 20 20 20  e VFSSTAT_ANY   
08f0: 20 20 20 20 20 20 20 38 20 20 20 2f 2a 20 55 6e         8   /* Un
0900: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 74  specified file t
0910: 79 70 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 56  ype */.#define V
0920: 46 53 53 54 41 54 5f 6e 46 69 6c 65 20 20 20 20  FSSTAT_nFile    
0930: 20 20 20 20 39 20 20 20 2f 2a 20 54 68 69 73 20      9   /* This 
0940: 6d 61 6e 79 20 66 69 6c 65 20 74 79 70 65 73 20  many file types 
0950: 2a 2f 0a 0a 2f 2a 20 4e 61 6d 65 73 20 6f 66 20  */../* Names of 
0960: 74 68 65 20 66 69 6c 65 20 74 79 70 65 73 2e 20  the file types. 
0970: 20 54 68 65 73 65 20 61 72 65 20 61 6c 6c 6f 77   These are allow
0980: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  ed values for th
0990: 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d  e.** first colum
09a0: 6e 20 6f 66 20 74 68 65 20 76 66 73 73 74 61 74  n of the vfsstat
09b0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
09c0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
09d0: 63 68 61 72 20 2a 61 7a 46 69 6c 65 5b 5d 20 3d  char *azFile[] =
09e0: 20 7b 0a 20 20 22 64 61 74 61 62 61 73 65 22 2c   {.  "database",
09f0: 20 22 6a 6f 75 72 6e 61 6c 22 2c 20 22 77 61 6c   "journal", "wal
0a00: 22 2c 20 22 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  ", "master-journ
0a10: 61 6c 22 2c 20 22 73 75 62 2d 6a 6f 75 72 6e 61  al", "sub-journa
0a20: 6c 22 2c 0a 20 20 22 74 65 6d 70 2d 64 61 74 61  l",.  "temp-data
0a30: 62 61 73 65 22 2c 20 22 74 65 6d 70 2d 6a 6f 75  base", "temp-jou
0a40: 72 6e 61 6c 22 2c 20 22 74 72 61 6e 73 69 65 6e  rnal", "transien
0a50: 74 2d 64 62 22 2c 20 22 2a 22 0a 7d 3b 0a 0a 2f  t-db", "*".};../
0a60: 2a 0a 2a 2a 20 53 74 61 74 20 74 79 70 65 73 0a  *.** Stat types.
0a70: 2a 2f 0a 23 64 65 66 69 6e 65 20 56 46 53 53 54  */.#define VFSST
0a80: 41 54 5f 42 59 54 45 53 49 4e 20 20 20 20 20 20  AT_BYTESIN      
0a90: 30 20 20 20 2f 2a 20 42 79 74 65 73 20 72 65 61  0   /* Bytes rea
0aa0: 64 20 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  d in */.#define 
0ab0: 56 46 53 53 54 41 54 5f 42 59 54 45 53 4f 55 54  VFSSTAT_BYTESOUT
0ac0: 20 20 20 20 20 31 20 20 20 2f 2a 20 42 79 74 65       1   /* Byte
0ad0: 73 20 77 72 69 74 74 65 6e 20 6f 75 74 20 2a 2f  s written out */
0ae0: 20 20 20 0a 23 64 65 66 69 6e 65 20 56 46 53 53     .#define VFSS
0af0: 54 41 54 5f 52 45 41 44 20 20 20 20 20 20 20 20  TAT_READ        
0b00: 20 32 20 20 20 2f 2a 20 52 65 61 64 20 72 65 71   2   /* Read req
0b10: 75 65 73 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65  uests */.#define
0b20: 20 56 46 53 53 54 41 54 5f 57 52 49 54 45 20 20   VFSSTAT_WRITE  
0b30: 20 20 20 20 20 20 33 20 20 20 2f 2a 20 57 72 69        3   /* Wri
0b40: 74 65 20 72 65 71 75 65 73 74 73 20 2a 2f 0a 23  te requests */.#
0b50: 64 65 66 69 6e 65 20 56 46 53 53 54 41 54 5f 53  define VFSSTAT_S
0b60: 59 4e 43 20 20 20 20 20 20 20 20 20 34 20 20 20  YNC         4   
0b70: 2f 2a 20 53 79 6e 63 73 20 2a 2f 0a 23 64 65 66  /* Syncs */.#def
0b80: 69 6e 65 20 56 46 53 53 54 41 54 5f 4f 50 45 4e  ine VFSSTAT_OPEN
0b90: 20 20 20 20 20 20 20 20 20 35 20 20 20 2f 2a 20           5   /* 
0ba0: 46 69 6c 65 20 6f 70 65 6e 73 20 2a 2f 0a 23 64  File opens */.#d
0bb0: 65 66 69 6e 65 20 56 46 53 53 54 41 54 5f 4c 4f  efine VFSSTAT_LO
0bc0: 43 4b 20 20 20 20 20 20 20 20 20 36 20 20 20 2f  CK         6   /
0bd0: 2a 20 4c 6f 63 6b 20 72 65 71 75 65 73 74 73 20  * Lock requests 
0be0: 2a 2f 0a 23 64 65 66 69 6e 65 20 56 46 53 53 54  */.#define VFSST
0bf0: 41 54 5f 41 43 43 45 53 53 20 20 20 20 20 20 20  AT_ACCESS       
0c00: 30 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 63  0   /* xAccess c
0c10: 61 6c 6c 73 2e 20 20 66 69 6c 65 74 79 70 65 3d  alls.  filetype=
0c20: 3d 41 4e 59 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65  =ANY only */.#de
0c30: 66 69 6e 65 20 56 46 53 53 54 41 54 5f 44 45 4c  fine VFSSTAT_DEL
0c40: 45 54 45 20 20 20 20 20 20 20 31 20 20 20 2f 2a  ETE       1   /*
0c50: 20 78 44 65 6c 65 74 65 20 63 61 6c 6c 73 2e 20   xDelete calls. 
0c60: 20 66 69 6c 65 74 79 70 65 3d 3d 41 4e 59 20 6f   filetype==ANY o
0c70: 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 56  nly */.#define V
0c80: 46 53 53 54 41 54 5f 46 55 4c 4c 50 41 54 48 20  FSSTAT_FULLPATH 
0c90: 20 20 20 20 32 20 20 20 2f 2a 20 78 46 75 6c 6c      2   /* xFull
0ca0: 50 61 74 68 6e 61 6d 65 20 63 61 6c 6c 73 2e 20  Pathname calls. 
0cb0: 20 41 4e 59 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65   ANY only */.#de
0cc0: 66 69 6e 65 20 56 46 53 53 54 41 54 5f 52 41 4e  fine VFSSTAT_RAN
0cd0: 44 4f 4d 20 20 20 20 20 20 20 33 20 20 20 2f 2a  DOM       3   /*
0ce0: 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 63 61 6c   xRandomness cal
0cf0: 6c 73 2e 20 20 20 20 41 4e 59 20 6f 6e 6c 79 20  ls.    ANY only 
0d00: 2a 2f 0a 23 64 65 66 69 6e 65 20 56 46 53 53 54  */.#define VFSST
0d10: 41 54 5f 53 4c 45 45 50 20 20 20 20 20 20 20 20  AT_SLEEP        
0d20: 34 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 63 61  4   /* xSleep ca
0d30: 6c 6c 73 2e 20 20 20 20 20 20 20 20 20 41 4e 59  lls.         ANY
0d40: 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65   only */.#define
0d50: 20 56 46 53 53 54 41 54 5f 43 55 52 54 49 4d 45   VFSSTAT_CURTIME
0d60: 20 20 20 20 20 20 35 20 20 20 2f 2a 20 78 43 75        5   /* xCu
0d70: 72 72 65 6e 74 54 69 6d 65 20 63 61 6c 6c 73 2e  rrentTime calls.
0d80: 20 20 20 41 4e 59 20 6f 6e 6c 79 20 2a 2f 0a 23     ANY only */.#
0d90: 64 65 66 69 6e 65 20 56 46 53 53 54 41 54 5f 6e  define VFSSTAT_n
0da0: 53 74 61 74 20 20 20 20 20 20 20 20 37 20 20 20  Stat        7   
0db0: 2f 2a 20 54 68 69 73 20 6d 61 6e 79 20 73 74 61  /* This many sta
0dc0: 74 20 74 79 70 65 73 20 2a 2f 0a 0a 0a 2f 2a 20  t types */.../* 
0dd0: 4e 61 6d 65 73 20 66 6f 72 20 74 68 65 20 73 65  Names for the se
0de0: 63 6f 6e 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  cond column of t
0df0: 68 65 20 76 66 73 73 74 61 74 20 76 69 72 74 75  he vfsstat virtu
0e00: 61 6c 20 74 61 62 6c 65 20 66 6f 72 20 61 6c 6c  al table for all
0e10: 0a 2a 2a 20 63 61 73 65 73 20 65 78 63 65 70 74  .** cases except
0e20: 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
0e30: 63 6f 6c 75 6d 6e 20 69 73 20 22 2a 22 20 6f 72  column is "*" or
0e40: 20 56 46 53 53 54 41 54 5f 41 4e 59 2e 20 2a 2f   VFSSTAT_ANY. */
0e50: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
0e60: 61 72 20 2a 61 7a 53 74 61 74 5b 5d 20 3d 20 7b  ar *azStat[] = {
0e70: 0a 20 20 22 62 79 74 65 73 2d 69 6e 22 2c 20 22  .  "bytes-in", "
0e80: 62 79 74 65 73 2d 6f 75 74 22 2c 20 22 72 65 61  bytes-out", "rea
0e90: 64 22 2c 20 22 77 72 69 74 65 22 2c 20 22 73 79  d", "write", "sy
0ea0: 6e 63 22 2c 20 22 6f 70 65 6e 22 2c 20 22 6c 6f  nc", "open", "lo
0eb0: 63 6b 22 2c 0a 7d 3b 0a 73 74 61 74 69 63 20 63  ck",.};.static c
0ec0: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 53 74 61  onst char *azSta
0ed0: 74 41 6e 79 5b 5d 20 3d 20 7b 0a 20 20 22 61 63  tAny[] = {.  "ac
0ee0: 63 65 73 73 22 2c 20 22 64 65 6c 65 74 65 22 2c  cess", "delete",
0ef0: 20 22 66 75 6c 6c 70 61 74 68 6e 61 6d 65 22 2c   "fullpathname",
0f00: 20 22 72 61 6e 64 6f 6d 6e 65 73 73 22 2c 20 22   "randomness", "
0f10: 73 6c 65 65 70 22 2c 20 22 63 75 72 72 65 6e 74  sleep", "current
0f20: 74 69 6d 65 73 74 61 6d 70 22 2c 0a 20 20 22 6e  timestamp",.  "n
0f30: 6f 74 2d 75 73 65 64 22 0a 7d 3b 0a 0a 2f 2a 20  ot-used".};../* 
0f40: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
0f50: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 23 64 65 66  counters */.#def
0f60: 69 6e 65 20 56 46 53 53 54 41 54 5f 4d 58 43 4e  ine VFSSTAT_MXCN
0f70: 54 20 20 28 56 46 53 53 54 41 54 5f 6e 53 74 61  T  (VFSSTAT_nSta
0f80: 74 2a 56 46 53 53 54 41 54 5f 6e 46 69 6c 65 29  t*VFSSTAT_nFile)
0f90: 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 61  ../*.** Performa
0fa0: 6e 63 65 20 73 74 61 74 73 20 61 72 65 20 63 6f  nce stats are co
0fb0: 6c 6c 65 63 74 65 64 20 69 6e 20 61 6e 20 69 6e  llected in an in
0fc0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0fd0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 67 6c 6f 62 61  llowing.** globa
0fe0: 6c 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  l array..*/.stat
0ff0: 69 63 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36  ic sqlite3_uint6
1000: 34 20 61 56 66 73 43 6e 74 5b 56 46 53 53 54 41  4 aVfsCnt[VFSSTA
1010: 54 5f 4d 58 43 4e 54 5d 3b 0a 0a 2f 2a 0a 2a 2a  T_MXCNT];../*.**
1020: 20 41 63 63 65 73 73 20 74 6f 20 61 20 73 70 65   Access to a spe
1030: 63 69 66 69 63 20 63 6f 75 6e 74 65 72 0a 2a 2f  cific counter.*/
1040: 0a 23 64 65 66 69 6e 65 20 53 54 41 54 43 4e 54  .#define STATCNT
1050: 28 66 69 6c 65 74 79 70 65 2c 73 74 61 74 29 20  (filetype,stat) 
1060: 28 61 56 66 73 43 6e 74 5b 28 66 69 6c 65 74 79  (aVfsCnt[(filety
1070: 70 65 29 2a 56 46 53 53 54 41 54 5f 6e 53 74 61  pe)*VFSSTAT_nSta
1080: 74 2b 28 73 74 61 74 29 5d 29 0a 0a 2f 2a 0a 2a  t+(stat)])../*.*
1090: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
10a0: 61 74 69 6f 6e 20 6f 66 20 6f 62 6a 65 63 74 73  ation of objects
10b0: 20 75 73 65 64 20 62 79 20 74 68 69 73 20 75 74   used by this ut
10c0: 69 6c 69 74 79 0a 2a 2f 0a 74 79 70 65 64 65 66  ility.*/.typedef
10d0: 20 73 74 72 75 63 74 20 56 53 74 61 74 56 66 73   struct VStatVfs
10e0: 20 56 53 74 61 74 56 66 73 3b 0a 74 79 70 65 64   VStatVfs;.typed
10f0: 65 66 20 73 74 72 75 63 74 20 56 53 74 61 74 46  ef struct VStatF
1100: 69 6c 65 20 56 53 74 61 74 46 69 6c 65 3b 0a 0a  ile VStatFile;..
1110: 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  /* An instance o
1120: 66 20 74 68 65 20 56 46 53 20 2a 2f 0a 73 74 72  f the VFS */.str
1130: 75 63 74 20 56 53 74 61 74 56 66 73 20 7b 0a 20  uct VStatVfs {. 
1140: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 62 61 73   sqlite3_vfs bas
1150: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1160: 20 2f 2a 20 56 46 53 20 6d 65 74 68 6f 64 73 20   /* VFS methods 
1170: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
1180: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20   *pVfs;         
1190: 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 56       /* Parent V
11a0: 46 53 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 6e 20  FS */.};../* An 
11b0: 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 73 74 72  open file */.str
11c0: 75 63 74 20 56 53 74 61 74 46 69 6c 65 20 7b 0a  uct VStatFile {.
11d0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 62    sqlite3_file b
11e0: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
11f0: 20 20 2f 2a 20 49 4f 20 6d 65 74 68 6f 64 73 20    /* IO methods 
1200: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
1210: 65 20 2a 70 52 65 61 6c 3b 20 20 20 20 20 20 20  e *pReal;       
1220: 20 20 20 20 20 2f 2a 20 55 6e 64 65 72 6c 79 69       /* Underlyi
1230: 6e 67 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a  ng file handle *
1240: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1250: 72 20 65 46 69 6c 65 74 79 70 65 3b 20 20 20 20  r eFiletype;    
1260: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 79 70 65      /* What type
1270: 20 6f 66 20 66 69 6c 65 20 69 73 20 74 68 69 73   of file is this
1280: 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20   */.};..#define 
1290: 52 45 41 4c 56 46 53 28 70 29 20 28 28 28 56 53  REALVFS(p) (((VS
12a0: 74 61 74 56 66 73 2a 29 28 70 29 29 2d 3e 70 56  tatVfs*)(p))->pV
12b0: 66 73 29 0a 0a 2f 2a 0a 2a 2a 20 4d 65 74 68 6f  fs)../*.** Metho
12c0: 64 73 20 66 6f 72 20 56 53 74 61 74 46 69 6c 65  ds for VStatFile
12d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
12e0: 73 74 61 74 43 6c 6f 73 65 28 73 71 6c 69 74 65  statClose(sqlite
12f0: 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63  3_file*);.static
1300: 20 69 6e 74 20 76 73 74 61 74 52 65 61 64 28 73   int vstatRead(s
1310: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 76 6f  qlite3_file*, vo
1320: 69 64 2a 2c 20 69 6e 74 20 69 41 6d 74 2c 20 73  id*, int iAmt, s
1330: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66  qlite3_int64 iOf
1340: 73 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  st);.static int 
1350: 76 73 74 61 74 57 72 69 74 65 28 73 71 6c 69 74  vstatWrite(sqlit
1360: 65 33 5f 66 69 6c 65 2a 2c 63 6f 6e 73 74 20 76  e3_file*,const v
1370: 6f 69 64 2a 2c 69 6e 74 20 69 41 6d 74 2c 20 73  oid*,int iAmt, s
1380: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66  qlite3_int64 iOf
1390: 73 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  st);.static int 
13a0: 76 73 74 61 74 54 72 75 6e 63 61 74 65 28 73 71  vstatTruncate(sq
13b0: 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71 6c  lite3_file*, sql
13c0: 69 74 65 33 5f 69 6e 74 36 34 20 73 69 7a 65 29  ite3_int64 size)
13d0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 76 73 74  ;.static int vst
13e0: 61 74 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  atSync(sqlite3_f
13f0: 69 6c 65 2a 2c 20 69 6e 74 20 66 6c 61 67 73 29  ile*, int flags)
1400: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 76 73 74  ;.static int vst
1410: 61 74 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  atFileSize(sqlit
1420: 65 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69 74 65  e3_file*, sqlite
1430: 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 3b  3_int64 *pSize);
1440: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 73 74 61  .static int vsta
1450: 74 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  tLock(sqlite3_fi
1460: 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
1470: 63 20 69 6e 74 20 76 73 74 61 74 55 6e 6c 6f 63  c int vstatUnloc
1480: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
1490: 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
14a0: 74 20 76 73 74 61 74 43 68 65 63 6b 52 65 73 65  t vstatCheckRese
14b0: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
14c0: 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 2a 70 52 65  _file*, int *pRe
14d0: 73 4f 75 74 29 3b 0a 73 74 61 74 69 63 20 69 6e  sOut);.static in
14e0: 74 20 76 73 74 61 74 46 69 6c 65 43 6f 6e 74 72  t vstatFileContr
14f0: 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ol(sqlite3_file*
1500: 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
1510: 70 41 72 67 29 3b 0a 73 74 61 74 69 63 20 69 6e  pArg);.static in
1520: 74 20 76 73 74 61 74 53 65 63 74 6f 72 53 69 7a  t vstatSectorSiz
1530: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  e(sqlite3_file*)
1540: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 76 73 74  ;.static int vst
1550: 61 74 44 65 76 69 63 65 43 68 61 72 61 63 74 65  atDeviceCharacte
1560: 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f  ristics(sqlite3_
1570: 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69  file*);.static i
1580: 6e 74 20 76 73 74 61 74 53 68 6d 4d 61 70 28 73  nt vstatShmMap(s
1590: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
15a0: 74 20 69 50 67 2c 20 69 6e 74 20 70 67 73 7a 2c  t iPg, int pgsz,
15b0: 20 69 6e 74 2c 20 76 6f 69 64 20 76 6f 6c 61 74   int, void volat
15c0: 69 6c 65 2a 2a 29 3b 0a 73 74 61 74 69 63 20 69  ile**);.static i
15d0: 6e 74 20 76 73 74 61 74 53 68 6d 4c 6f 63 6b 28  nt vstatShmLock(
15e0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
15f0: 6e 74 20 6f 66 66 73 65 74 2c 20 69 6e 74 20 6e  nt offset, int n
1600: 2c 20 69 6e 74 20 66 6c 61 67 73 29 3b 0a 73 74  , int flags);.st
1610: 61 74 69 63 20 76 6f 69 64 20 76 73 74 61 74 53  atic void vstatS
1620: 68 6d 42 61 72 72 69 65 72 28 73 71 6c 69 74 65  hmBarrier(sqlite
1630: 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63  3_file*);.static
1640: 20 69 6e 74 20 76 73 74 61 74 53 68 6d 55 6e 6d   int vstatShmUnm
1650: 61 70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ap(sqlite3_file*
1660: 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67  , int deleteFlag
1670: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 76 73  );.static int vs
1680: 74 61 74 46 65 74 63 68 28 73 71 6c 69 74 65 33  tatFetch(sqlite3
1690: 5f 66 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f  _file*, sqlite3_
16a0: 69 6e 74 36 34 20 69 4f 66 73 74 2c 20 69 6e 74  int64 iOfst, int
16b0: 20 69 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70   iAmt, void **pp
16c0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 76 73  );.static int vs
16d0: 74 61 74 55 6e 66 65 74 63 68 28 73 71 6c 69 74  tatUnfetch(sqlit
16e0: 65 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69 74 65  e3_file*, sqlite
16f0: 33 5f 69 6e 74 36 34 20 69 4f 66 73 74 2c 20 76  3_int64 iOfst, v
1700: 6f 69 64 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20  oid *p);../*.** 
1710: 4d 65 74 68 6f 64 73 20 66 6f 72 20 56 53 74 61  Methods for VSta
1720: 74 56 66 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tVfs.*/.static i
1730: 6e 74 20 76 73 74 61 74 4f 70 65 6e 28 73 71 6c  nt vstatOpen(sql
1740: 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74  ite3_vfs*, const
1750: 20 63 68 61 72 20 2a 2c 20 73 71 6c 69 74 65 33   char *, sqlite3
1760: 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 2c 20 69 6e  _file*, int , in
1770: 74 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  t *);.static int
1780: 20 76 73 74 61 74 44 65 6c 65 74 65 28 73 71 6c   vstatDelete(sql
1790: 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74  ite3_vfs*, const
17a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
17b0: 74 20 73 79 6e 63 44 69 72 29 3b 0a 73 74 61 74  t syncDir);.stat
17c0: 69 63 20 69 6e 74 20 76 73 74 61 74 41 63 63 65  ic int vstatAcce
17d0: 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  ss(sqlite3_vfs*,
17e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
17f0: 6d 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69  me, int flags, i
1800: 6e 74 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  nt *);.static in
1810: 74 20 76 73 74 61 74 46 75 6c 6c 50 61 74 68 6e  t vstatFullPathn
1820: 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a  ame(sqlite3_vfs*
1830: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
1840: 61 6d 65 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a  ame, int, char *
1850: 7a 4f 75 74 29 3b 0a 73 74 61 74 69 63 20 76 6f  zOut);.static vo
1860: 69 64 20 2a 76 73 74 61 74 44 6c 4f 70 65 6e 28  id *vstatDlOpen(
1870: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f  sqlite3_vfs*, co
1880: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1890: 61 6d 65 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  ame);.static voi
18a0: 64 20 76 73 74 61 74 44 6c 45 72 72 6f 72 28 73  d vstatDlError(s
18b0: 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74  qlite3_vfs*, int
18c0: 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 45   nByte, char *zE
18d0: 72 72 4d 73 67 29 3b 0a 73 74 61 74 69 63 20 76  rrMsg);.static v
18e0: 6f 69 64 20 28 2a 76 73 74 61 74 44 6c 53 79 6d  oid (*vstatDlSym
18f0: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
1900: 66 73 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e  fs, void *p, con
1910: 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76  st char*zSym))(v
1920: 6f 69 64 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  oid);.static voi
1930: 64 20 76 73 74 61 74 44 6c 43 6c 6f 73 65 28 73  d vstatDlClose(s
1940: 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 76 6f 69  qlite3_vfs*, voi
1950: 64 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  d*);.static int 
1960: 76 73 74 61 74 52 61 6e 64 6f 6d 6e 65 73 73 28  vstatRandomness(
1970: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69 6e  sqlite3_vfs*, in
1980: 74 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a  t nByte, char *z
1990: 4f 75 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  Out);.static int
19a0: 20 76 73 74 61 74 53 6c 65 65 70 28 73 71 6c 69   vstatSleep(sqli
19b0: 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74 20 6d 69  te3_vfs*, int mi
19c0: 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 73 74 61  croseconds);.sta
19d0: 74 69 63 20 69 6e 74 20 76 73 74 61 74 43 75 72  tic int vstatCur
19e0: 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33  rentTime(sqlite3
19f0: 5f 76 66 73 2a 2c 20 64 6f 75 62 6c 65 2a 29 3b  _vfs*, double*);
1a00: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 73 74 61  .static int vsta
1a10: 74 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  tGetLastError(sq
1a20: 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74 2c  lite3_vfs*, int,
1a30: 20 63 68 61 72 20 2a 29 3b 0a 73 74 61 74 69 63   char *);.static
1a40: 20 69 6e 74 20 76 73 74 61 74 43 75 72 72 65 6e   int vstatCurren
1a50: 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
1a60: 65 33 5f 76 66 73 2a 2c 20 73 71 6c 69 74 65 33  e3_vfs*, sqlite3
1a70: 5f 69 6e 74 36 34 2a 29 3b 0a 0a 73 74 61 74 69  _int64*);..stati
1a80: 63 20 56 53 74 61 74 56 66 73 20 76 73 74 61 74  c VStatVfs vstat
1a90: 5f 76 66 73 20 3d 20 7b 0a 20 20 7b 0a 20 20 20  _vfs = {.  {.   
1aa0: 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   2,             
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ac0: 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
1ad0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 28 73 65 74  /* szOsFile (set
1b00: 20 62 79 20 72 65 67 69 73 74 65 72 5f 76 73 74   by register_vst
1b10: 61 74 28 29 29 20 2a 2f 0a 20 20 20 20 31 30 32  at()) */.    102
1b20: 34 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4,              
1b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78             /* mx
1b40: 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
1b50: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b70: 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 76   pNext */.    "v
1b80: 66 73 6c 6f 67 22 2c 20 20 20 20 20 20 20 20 20  fslog",         
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
1ba0: 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  Name */.    0,  
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70            /* pAp
1bd0: 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 76 73 74  pData */.    vst
1be0: 61 74 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  atOpen,         
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1c00: 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 76 73 74 61  Open */.    vsta
1c10: 74 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20  tDelete,        
1c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
1c30: 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 76 73 74  elete */.    vst
1c40: 61 74 41 63 63 65 73 73 2c 20 20 20 20 20 20 20  atAccess,       
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1c60: 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 76 73  Access */.    vs
1c70: 74 61 74 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  tatFullPathname,
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c90: 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f  xFullPathname */
1ca0: 0a 20 20 20 20 76 73 74 61 74 44 6c 4f 70 65 6e  .    vstatDlOpen
1cb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1cc0: 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
1cd0: 2f 0a 20 20 20 20 76 73 74 61 74 44 6c 45 72 72  /.    vstatDlErr
1ce0: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
1cf0: 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72       /* xDlError
1d00: 20 2a 2f 0a 20 20 20 20 76 73 74 61 74 44 6c 53   */.    vstatDlS
1d10: 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ym,             
1d20: 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d         /* xDlSym
1d30: 20 2a 2f 0a 20 20 20 20 76 73 74 61 74 44 6c 43   */.    vstatDlC
1d40: 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
1d50: 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f         /* xDlClo
1d60: 73 65 20 2a 2f 0a 20 20 20 20 76 73 74 61 74 52  se */.    vstatR
1d70: 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20  andomness,      
1d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e           /* xRan
1d90: 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 76  domness */.    v
1da0: 73 74 61 74 53 6c 65 65 70 2c 20 20 20 20 20 20  statSleep,      
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dc0: 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 76   xSleep */.    v
1dd0: 73 74 61 74 43 75 72 72 65 6e 74 54 69 6d 65 2c  statCurrentTime,
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1df0: 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
1e00: 0a 20 20 20 20 76 73 74 61 74 47 65 74 4c 61 73  .    vstatGetLas
1e10: 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  tError,         
1e20: 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45      /* xGetLastE
1e30: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 76 73 74 61  rror */.    vsta
1e40: 74 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  tCurrentTimeInt6
1e50: 34 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43  4          /* xC
1e60: 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
1e70: 2a 2f 0a 20 20 7d 2c 0a 20 20 30 0a 7d 3b 0a 0a  */.  },.  0.};..
1e80: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
1e90: 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1ea0: 76 73 74 61 74 5f 69 6f 5f 6d 65 74 68 6f 64 73  vstat_io_methods
1eb0: 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20   = {.  3,       
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed0: 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
1ee0: 6f 6e 20 2a 2f 0a 20 20 76 73 74 61 74 43 6c 6f  on */.  vstatClo
1ef0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
1f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
1f10: 73 65 20 2a 2f 0a 20 20 76 73 74 61 74 52 65 61  se */.  vstatRea
1f20: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
1f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61           /* xRea
1f40: 64 20 2a 2f 0a 20 20 76 73 74 61 74 57 72 69 74  d */.  vstatWrit
1f50: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1f60: 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
1f70: 65 20 2a 2f 0a 20 20 76 73 74 61 74 54 72 75 6e  e */.  vstatTrun
1f80: 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
1f90: 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
1fa0: 63 61 74 65 20 2a 2f 0a 20 20 76 73 74 61 74 53  cate */.  vstatS
1fb0: 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
1fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1fd0: 79 6e 63 20 2a 2f 0a 20 20 76 73 74 61 74 46 69  ync */.  vstatFi
1fe0: 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
1ff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
2000: 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 76 73 74 61  leSize */.  vsta
2010: 74 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  tLock,          
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2030: 78 4c 6f 63 6b 20 2a 2f 0a 20 20 76 73 74 61 74  xLock */.  vstat
2040: 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
2050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2060: 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 76 73 74 61  Unlock */.  vsta
2070: 74 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  tCheckReservedLo
2080: 63 6b 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ck,          /* 
2090: 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
20a0: 63 6b 20 2a 2f 0a 20 20 76 73 74 61 74 46 69 6c  ck */.  vstatFil
20b0: 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
20c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
20d0: 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 76 73  eControl */.  vs
20e0: 74 61 74 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  tatSectorSize,  
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2100: 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
2110: 0a 20 20 76 73 74 61 74 44 65 76 69 63 65 43 68  .  vstatDeviceCh
2120: 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20  aracteristics,  
2130: 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68      /* xDeviceCh
2140: 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
2150: 0a 20 20 76 73 74 61 74 53 68 6d 4d 61 70 2c 20  .  vstatShmMap, 
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2170: 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a      /* xShmMap *
2180: 2f 0a 20 20 76 73 74 61 74 53 68 6d 4c 6f 63 6b  /.  vstatShmLock
2190: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21a0: 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b       /* xShmLock
21b0: 20 2a 2f 0a 20 20 76 73 74 61 74 53 68 6d 42 61   */.  vstatShmBa
21c0: 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20  rrier,          
21d0: 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61         /* xShmBa
21e0: 72 72 69 65 72 20 2a 2f 0a 20 20 76 73 74 61 74  rrier */.  vstat
21f0: 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20  ShmUnmap,       
2200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2210: 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 76 73  ShmUnmap */.  vs
2220: 74 61 74 46 65 74 63 68 2c 20 20 20 20 20 20 20  tatFetch,       
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2240: 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20 20 76 73  * xFetch */.  vs
2250: 74 61 74 55 6e 66 65 74 63 68 20 20 20 20 20 20  tatUnfetch      
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2270: 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b  * xUnfetch */.};
2280: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  ..../*.** Close 
2290: 61 6e 20 76 73 74 61 74 2d 66 69 6c 65 2e 0a 2a  an vstat-file..*
22a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 73 74  /.static int vst
22b0: 61 74 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  atClose(sqlite3_
22c0: 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
22d0: 56 53 74 61 74 46 69 6c 65 20 2a 70 20 3d 20 28  VStatFile *p = (
22e0: 56 53 74 61 74 46 69 6c 65 20 2a 29 70 46 69 6c  VStatFile *)pFil
22f0: 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
2300: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
2310: 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
2320: 64 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  ds ){.    rc = p
2330: 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
2340: 73 2d 3e 78 43 6c 6f 73 65 28 70 2d 3e 70 52 65  s->xClose(p->pRe
2350: 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  al);.  }.  retur
2360: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2370: 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
2380: 6e 20 76 73 74 61 74 2d 66 69 6c 65 2e 0a 2a 2f  n vstat-file..*/
2390: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 73 74 61  .static int vsta
23a0: 74 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33  tRead(.  sqlite3
23b0: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20  _file *pFile, . 
23c0: 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20   void *zBuf, .  
23d0: 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c  int iAmt, .  sql
23e0: 69 74 65 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a  ite_int64 iOfst.
23f0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 56  ){.  int rc;.  V
2400: 53 74 61 74 46 69 6c 65 20 2a 70 20 3d 20 28 56  StatFile *p = (V
2410: 53 74 61 74 46 69 6c 65 20 2a 29 70 46 69 6c 65  StatFile *)pFile
2420: 3b 0a 0a 20 20 72 63 20 3d 20 70 2d 3e 70 52 65  ;..  rc = p->pRe
2430: 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52  al->pMethods->xR
2440: 65 61 64 28 70 2d 3e 70 52 65 61 6c 2c 20 7a 42  ead(p->pReal, zB
2450: 75 66 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29  uf, iAmt, iOfst)
2460: 3b 0a 20 20 53 54 41 54 43 4e 54 28 70 2d 3e 65  ;.  STATCNT(p->e
2470: 46 69 6c 65 74 79 70 65 2c 56 46 53 53 54 41 54  Filetype,VFSSTAT
2480: 5f 52 45 41 44 29 2b 2b 3b 0a 20 20 69 66 28 20  _READ)++;.  if( 
2490: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24a0: 0a 20 20 20 20 53 54 41 54 43 4e 54 28 70 2d 3e  .    STATCNT(p->
24b0: 65 46 69 6c 65 74 79 70 65 2c 56 46 53 53 54 41  eFiletype,VFSSTA
24c0: 54 5f 42 59 54 45 53 49 4e 29 20 2b 3d 20 69 41  T_BYTESIN) += iA
24d0: 6d 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  mt;.  }.  return
24e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
24f0: 69 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20 76  ite data to an v
2500: 73 74 61 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  stat-file..*/.st
2510: 61 74 69 63 20 69 6e 74 20 76 73 74 61 74 57 72  atic int vstatWr
2520: 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ite(.  sqlite3_f
2530: 69 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20 63 6f  ile *pFile,.  co
2540: 6e 73 74 20 76 6f 69 64 20 2a 7a 2c 0a 20 20 69  nst void *z,.  i
2550: 6e 74 20 69 41 6d 74 2c 0a 20 20 73 71 6c 69 74  nt iAmt,.  sqlit
2560: 65 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b  e_int64 iOfst.){
2570: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 56 53 74  .  int rc;.  VSt
2580: 61 74 46 69 6c 65 20 2a 70 20 3d 20 28 56 53 74  atFile *p = (VSt
2590: 61 74 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  atFile *)pFile;.
25a0: 0a 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c  .  rc = p->pReal
25b0: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 57 72 69  ->pMethods->xWri
25c0: 74 65 28 70 2d 3e 70 52 65 61 6c 2c 20 7a 2c 20  te(p->pReal, z, 
25d0: 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b 0a 20 20  iAmt, iOfst);.  
25e0: 53 54 41 54 43 4e 54 28 70 2d 3e 65 46 69 6c 65  STATCNT(p->eFile
25f0: 74 79 70 65 2c 56 46 53 53 54 41 54 5f 57 52 49  type,VFSSTAT_WRI
2600: 54 45 29 2b 2b 3b 0a 20 20 69 66 28 20 72 63 3d  TE)++;.  if( rc=
2610: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2620: 20 20 53 54 41 54 43 4e 54 28 70 2d 3e 65 46 69    STATCNT(p->eFi
2630: 6c 65 74 79 70 65 2c 56 46 53 53 54 41 54 5f 42  letype,VFSSTAT_B
2640: 59 54 45 53 4f 55 54 29 20 2b 3d 20 69 41 6d 74  YTESOUT) += iAmt
2650: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2660: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
2670: 63 61 74 65 20 61 6e 20 76 73 74 61 74 2d 66 69  cate an vstat-fi
2680: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
2690: 74 20 76 73 74 61 74 54 72 75 6e 63 61 74 65 28  t vstatTruncate(
26a0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
26b0: 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36  ile, sqlite_int6
26c0: 34 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  4 size){.  int r
26d0: 63 3b 0a 20 20 56 53 74 61 74 46 69 6c 65 20 2a  c;.  VStatFile *
26e0: 70 20 3d 20 28 56 53 74 61 74 46 69 6c 65 20 2a  p = (VStatFile *
26f0: 29 70 46 69 6c 65 3b 0a 20 20 72 63 20 3d 20 70  )pFile;.  rc = p
2700: 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
2710: 73 2d 3e 78 54 72 75 6e 63 61 74 65 28 70 2d 3e  s->xTruncate(p->
2720: 70 52 65 61 6c 2c 20 73 69 7a 65 29 3b 0a 20 20  pReal, size);.  
2730: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2740: 0a 2a 2a 20 53 79 6e 63 20 61 6e 20 76 73 74 61  .** Sync an vsta
2750: 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  t-file..*/.stati
2760: 63 20 69 6e 74 20 76 73 74 61 74 53 79 6e 63 28  c int vstatSync(
2770: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
2780: 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ile, int flags){
2790: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 56 53 74  .  int rc;.  VSt
27a0: 61 74 46 69 6c 65 20 2a 70 20 3d 20 28 56 53 74  atFile *p = (VSt
27b0: 61 74 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  atFile *)pFile;.
27c0: 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d    rc = p->pReal-
27d0: 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63  >pMethods->xSync
27e0: 28 70 2d 3e 70 52 65 61 6c 2c 20 66 6c 61 67 73  (p->pReal, flags
27f0: 29 3b 0a 20 20 53 54 41 54 43 4e 54 28 70 2d 3e  );.  STATCNT(p->
2800: 65 46 69 6c 65 74 79 70 65 2c 56 46 53 53 54 41  eFiletype,VFSSTA
2810: 54 5f 53 59 4e 43 29 2b 2b 3b 0a 20 20 72 65 74  T_SYNC)++;.  ret
2820: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2830: 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
2840: 65 6e 74 20 66 69 6c 65 2d 73 69 7a 65 20 6f 66  ent file-size of
2850: 20 61 6e 20 76 73 74 61 74 2d 66 69 6c 65 2e 0a   an vstat-file..
2860: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 73  */.static int vs
2870: 74 61 74 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  tatFileSize(sqli
2880: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
2890: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
28a0: 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
28b0: 0a 20 20 56 53 74 61 74 46 69 6c 65 20 2a 70 20  .  VStatFile *p 
28c0: 3d 20 28 56 53 74 61 74 46 69 6c 65 20 2a 29 70  = (VStatFile *)p
28d0: 46 69 6c 65 3b 0a 20 20 72 63 20 3d 20 70 2d 3e  File;.  rc = p->
28e0: 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
28f0: 3e 78 46 69 6c 65 53 69 7a 65 28 70 2d 3e 70 52  >xFileSize(p->pR
2900: 65 61 6c 2c 20 70 53 69 7a 65 29 3b 0a 20 20 72  eal, pSize);.  r
2910: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2920: 2a 2a 20 4c 6f 63 6b 20 61 6e 20 76 73 74 61 74  ** Lock an vstat
2930: 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
2940: 20 69 6e 74 20 76 73 74 61 74 4c 6f 63 6b 28 73   int vstatLock(s
2950: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
2960: 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  le, int eLock){.
2970: 20 20 69 6e 74 20 72 63 3b 0a 20 20 56 53 74 61    int rc;.  VSta
2980: 74 46 69 6c 65 20 2a 70 20 3d 20 28 56 53 74 61  tFile *p = (VSta
2990: 74 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  tFile *)pFile;. 
29a0: 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e   rc = p->pReal->
29b0: 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b 28  pMethods->xLock(
29c0: 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f 63 6b 29  p->pReal, eLock)
29d0: 3b 0a 20 20 53 54 41 54 43 4e 54 28 70 2d 3e 65  ;.  STATCNT(p->e
29e0: 46 69 6c 65 74 79 70 65 2c 56 46 53 53 54 41 54  Filetype,VFSSTAT
29f0: 5f 4c 4f 43 4b 29 2b 2b 3b 0a 20 20 72 65 74 75  _LOCK)++;.  retu
2a00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2a10: 55 6e 6c 6f 63 6b 20 61 6e 20 76 73 74 61 74 2d  Unlock an vstat-
2a20: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
2a30: 69 6e 74 20 76 73 74 61 74 55 6e 6c 6f 63 6b 28  int vstatUnlock(
2a40: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
2a50: 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ile, int eLock){
2a60: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 56 53 74  .  int rc;.  VSt
2a70: 61 74 46 69 6c 65 20 2a 70 20 3d 20 28 56 53 74  atFile *p = (VSt
2a80: 61 74 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  atFile *)pFile;.
2a90: 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d    rc = p->pReal-
2aa0: 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 55 6e 6c 6f  >pMethods->xUnlo
2ab0: 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f  ck(p->pReal, eLo
2ac0: 63 6b 29 3b 0a 20 20 53 54 41 54 43 4e 54 28 70  ck);.  STATCNT(p
2ad0: 2d 3e 65 46 69 6c 65 74 79 70 65 2c 56 46 53 53  ->eFiletype,VFSS
2ae0: 54 41 54 5f 4c 4f 43 4b 29 2b 2b 3b 0a 20 20 72  TAT_LOCK)++;.  r
2af0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2b00: 2a 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 6f 74  ** Check if anot
2b10: 68 65 72 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20  her file-handle 
2b20: 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
2b30: 20 6c 6f 63 6b 20 6f 6e 20 61 6e 20 76 73 74 61   lock on an vsta
2b40: 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  t-file..*/.stati
2b50: 63 20 69 6e 74 20 76 73 74 61 74 43 68 65 63 6b  c int vstatCheck
2b60: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
2b70: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
2b80: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
2b90: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 56 53 74  .  int rc;.  VSt
2ba0: 61 74 46 69 6c 65 20 2a 70 20 3d 20 28 56 53 74  atFile *p = (VSt
2bb0: 61 74 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  atFile *)pFile;.
2bc0: 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d    rc = p->pReal-
2bd0: 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43 68 65 63  >pMethods->xChec
2be0: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 2d  kReservedLock(p-
2bf0: 3e 70 52 65 61 6c 2c 20 70 52 65 73 4f 75 74 29  >pReal, pResOut)
2c00: 3b 0a 20 20 53 54 41 54 43 4e 54 28 70 2d 3e 65  ;.  STATCNT(p->e
2c10: 46 69 6c 65 74 79 70 65 2c 56 46 53 53 54 41 54  Filetype,VFSSTAT
2c20: 5f 4c 4f 43 4b 29 2b 2b 3b 0a 20 20 72 65 74 75  _LOCK)++;.  retu
2c30: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2c40: 46 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 6d 65 74  File control met
2c50: 68 6f 64 2e 20 46 6f 72 20 63 75 73 74 6f 6d 20  hod. For custom 
2c60: 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 61 6e  operations on an
2c70: 20 76 73 74 61 74 2d 66 69 6c 65 2e 0a 2a 2f 0a   vstat-file..*/.
2c80: 73 74 61 74 69 63 20 69 6e 74 20 76 73 74 61 74  static int vstat
2c90: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
2ca0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
2cb0: 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
2cc0: 41 72 67 29 7b 0a 20 20 56 53 74 61 74 46 69 6c  Arg){.  VStatFil
2cd0: 65 20 2a 70 20 3d 20 28 56 53 74 61 74 46 69 6c  e *p = (VStatFil
2ce0: 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
2cf0: 20 72 63 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 70   rc;.  rc = p->p
2d00: 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
2d10: 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 2d 3e  xFileControl(p->
2d20: 70 52 65 61 6c 2c 20 6f 70 2c 20 70 41 72 67 29  pReal, op, pArg)
2d30: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49  ;.  if( op==SQLI
2d40: 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45  TE_FCNTL_VFSNAME
2d50: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2d60: 4b 20 29 7b 0a 20 20 20 20 2a 28 63 68 61 72 2a  K ){.    *(char*
2d70: 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33  *)pArg = sqlite3
2d80: 5f 6d 70 72 69 6e 74 66 28 22 76 73 74 61 74 2f  _mprintf("vstat/
2d90: 25 7a 22 2c 20 2a 28 63 68 61 72 2a 2a 29 70 41  %z", *(char**)pA
2da0: 72 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rg);.  }.  retur
2db0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
2dc0: 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
2dd0: 2d 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 66  -size in bytes f
2de0: 6f 72 20 61 6e 20 76 73 74 61 74 2d 66 69 6c 65  or an vstat-file
2df0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e00: 76 73 74 61 74 53 65 63 74 6f 72 53 69 7a 65 28  vstatSectorSize(
2e10: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
2e20: 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ile){.  int rc;.
2e30: 20 20 56 53 74 61 74 46 69 6c 65 20 2a 70 20 3d    VStatFile *p =
2e40: 20 28 56 53 74 61 74 46 69 6c 65 20 2a 29 70 46   (VStatFile *)pF
2e50: 69 6c 65 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 70  ile;.  rc = p->p
2e60: 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
2e70: 78 53 65 63 74 6f 72 53 69 7a 65 28 70 2d 3e 70  xSectorSize(p->p
2e80: 52 65 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  Real);.  return 
2e90: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
2ea0: 75 72 6e 20 74 68 65 20 64 65 76 69 63 65 20 63  urn the device c
2eb0: 68 61 72 61 63 74 65 72 69 73 74 69 63 20 66 6c  haracteristic fl
2ec0: 61 67 73 20 73 75 70 70 6f 72 74 65 64 20 62 79  ags supported by
2ed0: 20 61 6e 20 76 73 74 61 74 2d 66 69 6c 65 2e 0a   an vstat-file..
2ee0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 73  */.static int vs
2ef0: 74 61 74 44 65 76 69 63 65 43 68 61 72 61 63 74  tatDeviceCharact
2f00: 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
2f10: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
2f20: 20 69 6e 74 20 72 63 3b 0a 20 20 56 53 74 61 74   int rc;.  VStat
2f30: 46 69 6c 65 20 2a 70 20 3d 20 28 56 53 74 61 74  File *p = (VStat
2f40: 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  File *)pFile;.  
2f50: 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  rc = p->pReal->p
2f60: 4d 65 74 68 6f 64 73 2d 3e 78 44 65 76 69 63 65  Methods->xDevice
2f70: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
2f80: 70 2d 3e 70 52 65 61 6c 29 3b 0a 20 20 72 65 74  p->pReal);.  ret
2f90: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 43 72  urn rc;.}../* Cr
2fa0: 65 61 74 65 20 61 20 73 68 61 72 65 64 20 6d 65  eate a shared me
2fb0: 6d 6f 72 79 20 66 69 6c 65 20 6d 61 70 70 69 6e  mory file mappin
2fc0: 67 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  g */.static int 
2fd0: 76 73 74 61 74 53 68 6d 4d 61 70 28 0a 20 20 73  vstatShmMap(.  s
2fe0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
2ff0: 6c 65 2c 0a 20 20 69 6e 74 20 69 50 67 2c 0a 20  le,.  int iPg,. 
3000: 20 69 6e 74 20 70 67 73 7a 2c 0a 20 20 69 6e 74   int pgsz,.  int
3010: 20 62 45 78 74 65 6e 64 2c 0a 20 20 76 6f 69 64   bExtend,.  void
3020: 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 0a 29   volatile **pp.)
3030: 7b 0a 20 20 56 53 74 61 74 46 69 6c 65 20 2a 70  {.  VStatFile *p
3040: 20 3d 20 28 56 53 74 61 74 46 69 6c 65 20 2a 29   = (VStatFile *)
3050: 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  pFile;.  return 
3060: 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
3070: 64 73 2d 3e 78 53 68 6d 4d 61 70 28 70 2d 3e 70  ds->xShmMap(p->p
3080: 52 65 61 6c 2c 20 69 50 67 2c 20 70 67 73 7a 2c  Real, iPg, pgsz,
3090: 20 62 45 78 74 65 6e 64 2c 20 70 70 29 3b 0a 7d   bExtend, pp);.}
30a0: 0a 0a 2f 2a 20 50 65 72 66 6f 72 6d 20 6c 6f 63  ../* Perform loc
30b0: 6b 69 6e 67 20 6f 6e 20 61 20 73 68 61 72 65 64  king on a shared
30c0: 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20  -memory segment 
30d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 73  */.static int vs
30e0: 74 61 74 53 68 6d 4c 6f 63 6b 28 73 71 6c 69 74  tatShmLock(sqlit
30f0: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
3100: 69 6e 74 20 6f 66 66 73 65 74 2c 20 69 6e 74 20  int offset, int 
3110: 6e 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  n, int flags){. 
3120: 20 56 53 74 61 74 46 69 6c 65 20 2a 70 20 3d 20   VStatFile *p = 
3130: 28 56 53 74 61 74 46 69 6c 65 20 2a 29 70 46 69  (VStatFile *)pFi
3140: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  le;.  return p->
3150: 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
3160: 3e 78 53 68 6d 4c 6f 63 6b 28 70 2d 3e 70 52 65  >xShmLock(p->pRe
3170: 61 6c 2c 20 6f 66 66 73 65 74 2c 20 6e 2c 20 66  al, offset, n, f
3180: 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 20 4d 65 6d  lags);.}../* Mem
3190: 6f 72 79 20 62 61 72 72 69 65 72 20 6f 70 65 72  ory barrier oper
31a0: 61 74 69 6f 6e 20 6f 6e 20 73 68 61 72 65 64 20  ation on shared 
31b0: 6d 65 6d 6f 72 79 20 2a 2f 0a 73 74 61 74 69 63  memory */.static
31c0: 20 76 6f 69 64 20 76 73 74 61 74 53 68 6d 42 61   void vstatShmBa
31d0: 72 72 69 65 72 28 73 71 6c 69 74 65 33 5f 66 69  rrier(sqlite3_fi
31e0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 56 53  le *pFile){.  VS
31f0: 74 61 74 46 69 6c 65 20 2a 70 20 3d 20 28 56 53  tatFile *p = (VS
3200: 74 61 74 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  tatFile *)pFile;
3210: 0a 20 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65  .  p->pReal->pMe
3220: 74 68 6f 64 73 2d 3e 78 53 68 6d 42 61 72 72 69  thods->xShmBarri
3230: 65 72 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a  er(p->pReal);.}.
3240: 0a 2f 2a 20 55 6e 6d 61 70 20 61 20 73 68 61 72  ./* Unmap a shar
3250: 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed memory segmen
3260: 74 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  t */.static int 
3270: 76 73 74 61 74 53 68 6d 55 6e 6d 61 70 28 73 71  vstatShmUnmap(sq
3280: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
3290: 65 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  e, int deleteFla
32a0: 67 29 7b 0a 20 20 56 53 74 61 74 46 69 6c 65 20  g){.  VStatFile 
32b0: 2a 70 20 3d 20 28 56 53 74 61 74 46 69 6c 65 20  *p = (VStatFile 
32c0: 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72  *)pFile;.  retur
32d0: 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74  n p->pReal->pMet
32e0: 68 6f 64 73 2d 3e 78 53 68 6d 55 6e 6d 61 70 28  hods->xShmUnmap(
32f0: 70 2d 3e 70 52 65 61 6c 2c 20 64 65 6c 65 74 65  p->pReal, delete
3300: 46 6c 61 67 29 3b 0a 7d 0a 0a 2f 2a 20 46 65 74  Flag);.}../* Fet
3310: 63 68 20 61 20 70 61 67 65 20 6f 66 20 61 20 6d  ch a page of a m
3320: 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 66 69 6c  emory-mapped fil
3330: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
3340: 76 73 74 61 74 46 65 74 63 68 28 0a 20 20 73 71  vstatFetch(.  sq
3350: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
3360: 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  e,.  sqlite3_int
3370: 36 34 20 69 4f 66 73 74 2c 0a 20 20 69 6e 74 20  64 iOfst,.  int 
3380: 69 41 6d 74 2c 0a 20 20 76 6f 69 64 20 2a 2a 70  iAmt,.  void **p
3390: 70 0a 29 7b 0a 20 20 56 53 74 61 74 46 69 6c 65  p.){.  VStatFile
33a0: 20 2a 70 20 3d 20 28 56 53 74 61 74 46 69 6c 65   *p = (VStatFile
33b0: 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75   *)pFile;.  retu
33c0: 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65  rn p->pReal->pMe
33d0: 74 68 6f 64 73 2d 3e 78 46 65 74 63 68 28 70 2d  thods->xFetch(p-
33e0: 3e 70 52 65 61 6c 2c 20 69 4f 66 73 74 2c 20 69  >pReal, iOfst, i
33f0: 41 6d 74 2c 20 70 70 29 3b 0a 7d 0a 0a 2f 2a 20  Amt, pp);.}../* 
3400: 52 65 6c 65 61 73 65 20 61 20 6d 65 6d 6f 72 79  Release a memory
3410: 2d 6d 61 70 70 65 64 20 70 61 67 65 20 2a 2f 0a  -mapped page */.
3420: 73 74 61 74 69 63 20 69 6e 74 20 76 73 74 61 74  static int vstat
3430: 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f  Unfetch(sqlite3_
3440: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c  file *pFile, sql
3450: 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 73 74  ite3_int64 iOfst
3460: 2c 20 76 6f 69 64 20 2a 70 50 61 67 65 29 7b 0a  , void *pPage){.
3470: 20 20 56 53 74 61 74 46 69 6c 65 20 2a 70 20 3d    VStatFile *p =
3480: 20 28 56 53 74 61 74 46 69 6c 65 20 2a 29 70 46   (VStatFile *)pF
3490: 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ile;.  return p-
34a0: 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
34b0: 2d 3e 78 55 6e 66 65 74 63 68 28 70 2d 3e 70 52  ->xUnfetch(p->pR
34c0: 65 61 6c 2c 20 69 4f 66 73 74 2c 20 70 50 61 67  eal, iOfst, pPag
34d0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  e);.}../*.** Ope
34e0: 6e 20 61 6e 20 76 73 74 61 74 20 66 69 6c 65 20  n an vstat file 
34f0: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
3500: 63 20 69 6e 74 20 76 73 74 61 74 4f 70 65 6e 28  c int vstatOpen(
3510: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
3520: 70 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68  pVfs,.  const ch
3530: 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 73 71 6c  ar *zName,.  sql
3540: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
3550: 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20  ,.  int flags,. 
3560: 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 0a   int *pOutFlags.
3570: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 56  ){.  int rc;.  V
3580: 53 74 61 74 46 69 6c 65 20 2a 70 20 3d 20 28 56  StatFile *p = (V
3590: 53 74 61 74 46 69 6c 65 2a 29 70 46 69 6c 65 3b  StatFile*)pFile;
35a0: 0a 0a 20 20 70 2d 3e 70 52 65 61 6c 20 3d 20 28  ..  p->pReal = (
35b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
35c0: 5b 31 5d 3b 0a 20 20 72 63 20 3d 20 52 45 41 4c  [1];.  rc = REAL
35d0: 56 46 53 28 70 56 66 73 29 2d 3e 78 4f 70 65 6e  VFS(pVfs)->xOpen
35e0: 28 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20  (REALVFS(pVfs), 
35f0: 7a 4e 61 6d 65 2c 20 70 2d 3e 70 52 65 61 6c 2c  zName, p->pReal,
3600: 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67   flags, pOutFlag
3610: 73 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  s);.  if( flags 
3620: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
3630: 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 70 2d 3e  IN_DB ){.    p->
3640: 65 46 69 6c 65 74 79 70 65 20 3d 20 56 46 53 53  eFiletype = VFSS
3650: 54 41 54 5f 4d 41 49 4e 3b 0a 20 20 7d 65 6c 73  TAT_MAIN;.  }els
3660: 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
3670: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
3680: 4f 55 52 4e 41 4c 20 29 7b 0a 20 20 20 20 70 2d  OURNAL ){.    p-
3690: 3e 65 46 69 6c 65 74 79 70 65 20 3d 20 56 46 53  >eFiletype = VFS
36a0: 53 54 41 54 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  STAT_JOURNAL;.  
36b0: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
36c0: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  & SQLITE_OPEN_WA
36d0: 4c 20 29 7b 0a 20 20 20 20 70 2d 3e 65 46 69 6c  L ){.    p->eFil
36e0: 65 74 79 70 65 20 3d 20 56 46 53 53 54 41 54 5f  etype = VFSSTAT_
36f0: 57 41 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  WAL;.  }else if(
3700: 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
3710: 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
3720: 4e 41 4c 20 29 7b 0a 20 20 20 20 70 2d 3e 65 46  NAL ){.    p->eF
3730: 69 6c 65 74 79 70 65 20 3d 20 56 46 53 53 54 41  iletype = VFSSTA
3740: 54 5f 4d 41 53 54 45 52 4a 52 4e 4c 3b 0a 20 20  T_MASTERJRNL;.  
3750: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
3760: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  & SQLITE_OPEN_SU
3770: 42 4a 4f 55 52 4e 41 4c 20 29 7b 0a 20 20 20 20  BJOURNAL ){.    
3780: 70 2d 3e 65 46 69 6c 65 74 79 70 65 20 3d 20 56  p->eFiletype = V
3790: 46 53 53 54 41 54 5f 53 55 42 4a 52 4e 4c 3b 0a  FSSTAT_SUBJRNL;.
37a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
37b0: 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
37c0: 54 45 4d 50 5f 44 42 20 29 7b 0a 20 20 20 20 70  TEMP_DB ){.    p
37d0: 2d 3e 65 46 69 6c 65 74 79 70 65 20 3d 20 56 46  ->eFiletype = VF
37e0: 53 53 54 41 54 5f 54 45 4d 50 44 42 3b 0a 20 20  SSTAT_TEMPDB;.  
37f0: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
3800: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  & SQLITE_OPEN_TE
3810: 4d 50 5f 4a 4f 55 52 4e 41 4c 20 29 7b 0a 20 20  MP_JOURNAL ){.  
3820: 20 20 70 2d 3e 65 46 69 6c 65 74 79 70 65 20 3d    p->eFiletype =
3830: 20 56 46 53 53 54 41 54 5f 54 45 4d 50 4a 52 4e   VFSSTAT_TEMPJRN
3840: 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
3850: 70 2d 3e 65 46 69 6c 65 74 79 70 65 20 3d 20 56  p->eFiletype = V
3860: 46 53 53 54 41 54 5f 54 52 41 4e 53 49 45 4e 54  FSSTAT_TRANSIENT
3870: 3b 0a 20 20 7d 0a 20 20 53 54 41 54 43 4e 54 28  ;.  }.  STATCNT(
3880: 70 2d 3e 65 46 69 6c 65 74 79 70 65 2c 56 46 53  p->eFiletype,VFS
3890: 53 54 41 54 5f 4f 50 45 4e 29 2b 2b 3b 0a 20 20  STAT_OPEN)++;.  
38a0: 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20  pFile->pMethods 
38b0: 3d 20 72 63 20 3f 20 30 20 3a 20 26 76 73 74 61  = rc ? 0 : &vsta
38c0: 74 5f 69 6f 5f 6d 65 74 68 6f 64 73 3b 0a 20 20  t_io_methods;.  
38d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
38e0: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66  .** Delete the f
38f0: 69 6c 65 20 6c 6f 63 61 74 65 64 20 61 74 20 7a  ile located at z
3900: 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72  Path. If the dir
3910: 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73  Sync argument is
3920: 20 74 72 75 65 2c 0a 2a 2a 20 65 6e 73 75 72 65   true,.** ensure
3930: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
3940: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 61   modifications a
3950: 72 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  re synced to dis
3960: 6b 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  k before.** retu
3970: 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
3980: 20 69 6e 74 20 76 73 74 61 74 44 65 6c 65 74 65   int vstatDelete
3990: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
39a0: 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fs, const char *
39b0: 7a 50 61 74 68 2c 20 69 6e 74 20 64 69 72 53 79  zPath, int dirSy
39c0: 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nc){.  int rc;. 
39d0: 20 72 63 20 3d 20 52 45 41 4c 56 46 53 28 70 56   rc = REALVFS(pV
39e0: 66 73 29 2d 3e 78 44 65 6c 65 74 65 28 52 45 41  fs)->xDelete(REA
39f0: 4c 56 46 53 28 70 56 66 73 29 2c 20 7a 50 61 74  LVFS(pVfs), zPat
3a00: 68 2c 20 64 69 72 53 79 6e 63 29 3b 0a 20 20 53  h, dirSync);.  S
3a10: 54 41 54 43 4e 54 28 56 46 53 53 54 41 54 5f 41  TATCNT(VFSSTAT_A
3a20: 4e 59 2c 56 46 53 53 54 41 54 5f 44 45 4c 45 54  NY,VFSSTAT_DELET
3a30: 45 29 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 72  E)++;.  return r
3a40: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74  c;.}../*.** Test
3a50: 20 66 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d   for access perm
3a60: 69 73 73 69 6f 6e 73 2e 20 52 65 74 75 72 6e 20  issions. Return 
3a70: 74 72 75 65 20 69 66 20 74 68 65 20 72 65 71 75  true if the requ
3a80: 65 73 74 65 64 20 70 65 72 6d 69 73 73 69 6f 6e  ested permission
3a90: 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
3aa0: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
3ab0: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
3ac0: 69 6e 74 20 76 73 74 61 74 41 63 63 65 73 73 28  int vstatAccess(
3ad0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
3ae0: 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63  pVfs, .  const c
3af0: 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69  har *zPath, .  i
3b00: 6e 74 20 66 6c 61 67 73 2c 20 0a 20 20 69 6e 74  nt flags, .  int
3b10: 20 2a 70 52 65 73 4f 75 74 0a 29 7b 0a 20 20 69   *pResOut.){.  i
3b20: 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 52 45  nt rc;.  rc = RE
3b30: 41 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 41 63  ALVFS(pVfs)->xAc
3b40: 63 65 73 73 28 52 45 41 4c 56 46 53 28 70 56 66  cess(REALVFS(pVf
3b50: 73 29 2c 20 7a 50 61 74 68 2c 20 66 6c 61 67 73  s), zPath, flags
3b60: 2c 20 70 52 65 73 4f 75 74 29 3b 0a 20 20 53 54  , pResOut);.  ST
3b70: 41 54 43 4e 54 28 56 46 53 53 54 41 54 5f 41 4e  ATCNT(VFSSTAT_AN
3b80: 59 2c 56 46 53 53 54 41 54 5f 41 43 43 45 53 53  Y,VFSSTAT_ACCESS
3b90: 29 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )++;.  return rc
3ba0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c  ;.}../*.** Popul
3bb0: 61 74 65 20 62 75 66 66 65 72 20 7a 4f 75 74 20  ate buffer zOut 
3bc0: 77 69 74 68 20 74 68 65 20 66 75 6c 6c 20 63 61  with the full ca
3bd0: 6e 6f 6e 69 63 61 6c 20 70 61 74 68 6e 61 6d 65  nonical pathname
3be0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
3bf0: 2a 20 74 6f 20 74 68 65 20 70 61 74 68 6e 61 6d  * to the pathnam
3c00: 65 20 69 6e 20 7a 50 61 74 68 2e 20 7a 4f 75 74  e in zPath. zOut
3c10: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
3c20: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
3c30: 66 65 72 0a 2a 2a 20 6f 66 20 61 74 20 6c 65 61  fer.** of at lea
3c40: 73 74 20 28 49 4e 53 54 5f 4d 41 58 5f 50 41 54  st (INST_MAX_PAT
3c50: 48 4e 41 4d 45 2b 31 29 20 62 79 74 65 73 2e 0a  HNAME+1) bytes..
3c60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 73  */.static int vs
3c70: 74 61 74 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  tatFullPathname(
3c80: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
3c90: 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63  pVfs, .  const c
3ca0: 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69  har *zPath, .  i
3cb0: 6e 74 20 6e 4f 75 74 2c 20 0a 20 20 63 68 61 72  nt nOut, .  char
3cc0: 20 2a 7a 4f 75 74 0a 29 7b 0a 20 20 53 54 41 54   *zOut.){.  STAT
3cd0: 43 4e 54 28 56 46 53 53 54 41 54 5f 41 4e 59 2c  CNT(VFSSTAT_ANY,
3ce0: 56 46 53 53 54 41 54 5f 46 55 4c 4c 50 41 54 48  VFSSTAT_FULLPATH
3cf0: 29 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 52 45  )++;.  return RE
3d00: 41 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 46 75  ALVFS(pVfs)->xFu
3d10: 6c 6c 50 61 74 68 6e 61 6d 65 28 52 45 41 4c 56  llPathname(REALV
3d20: 46 53 28 70 56 66 73 29 2c 20 7a 50 61 74 68 2c  FS(pVfs), zPath,
3d30: 20 6e 4f 75 74 2c 20 7a 4f 75 74 29 3b 0a 7d 0a   nOut, zOut);.}.
3d40: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
3d50: 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20  dynamic library 
3d60: 6c 6f 63 61 74 65 64 20 61 74 20 7a 50 61 74 68  located at zPath
3d70: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 68 61   and return a ha
3d80: 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
3d90: 76 6f 69 64 20 2a 76 73 74 61 74 44 6c 4f 70 65  void *vstatDlOpe
3da0: 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  n(sqlite3_vfs *p
3db0: 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Vfs, const char 
3dc0: 2a 7a 50 61 74 68 29 7b 0a 20 20 72 65 74 75 72  *zPath){.  retur
3dd0: 6e 20 52 45 41 4c 56 46 53 28 70 56 66 73 29 2d  n REALVFS(pVfs)-
3de0: 3e 78 44 6c 4f 70 65 6e 28 52 45 41 4c 56 46 53  >xDlOpen(REALVFS
3df0: 28 70 56 66 73 29 2c 20 7a 50 61 74 68 29 3b 0a  (pVfs), zPath);.
3e00: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74  }../*.** Populat
3e10: 65 20 74 68 65 20 62 75 66 66 65 72 20 7a 45 72  e the buffer zEr
3e20: 72 4d 73 67 20 28 73 69 7a 65 20 6e 42 79 74 65  rMsg (size nByte
3e30: 20 62 79 74 65 73 29 20 77 69 74 68 20 61 20 68   bytes) with a h
3e40: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 0a 2a 2a  uman readable.**
3e50: 20 75 74 66 2d 38 20 73 74 72 69 6e 67 20 64 65   utf-8 string de
3e60: 73 63 72 69 62 69 6e 67 20 74 68 65 20 6d 6f 73  scribing the mos
3e70: 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 65  t recent error e
3e80: 6e 63 6f 75 6e 74 65 72 65 64 20 61 73 73 6f 63  ncountered assoc
3e90: 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 64  iated .** with d
3ea0: 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 69 65 73  ynamic libraries
3eb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3ec0: 20 76 73 74 61 74 44 6c 45 72 72 6f 72 28 73 71   vstatDlError(sq
3ed0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
3ee0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72   int nByte, char
3ef0: 20 2a 7a 45 72 72 4d 73 67 29 7b 0a 20 20 52 45   *zErrMsg){.  RE
3f00: 41 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 44 6c  ALVFS(pVfs)->xDl
3f10: 45 72 72 6f 72 28 52 45 41 4c 56 46 53 28 70 56  Error(REALVFS(pV
3f20: 66 73 29 2c 20 6e 42 79 74 65 2c 20 7a 45 72 72  fs), nByte, zErr
3f30: 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Msg);.}../*.** R
3f40: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
3f50: 74 6f 20 74 68 65 20 73 79 6d 62 6f 6c 20 7a 53  to the symbol zS
3f60: 79 6d 62 6f 6c 20 69 6e 20 74 68 65 20 64 79 6e  ymbol in the dyn
3f70: 61 6d 69 63 20 6c 69 62 72 61 72 79 20 70 48 61  amic library pHa
3f80: 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
3f90: 76 6f 69 64 20 28 2a 76 73 74 61 74 44 6c 53 79  void (*vstatDlSy
3fa0: 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  m(sqlite3_vfs *p
3fb0: 56 66 73 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f  Vfs, void *p, co
3fc0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 29 29  nst char *zSym))
3fd0: 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
3fe0: 20 52 45 41 4c 56 46 53 28 70 56 66 73 29 2d 3e   REALVFS(pVfs)->
3ff0: 78 44 6c 53 79 6d 28 52 45 41 4c 56 46 53 28 70  xDlSym(REALVFS(p
4000: 56 66 73 29 2c 20 70 2c 20 7a 53 79 6d 29 3b 0a  Vfs), p, zSym);.
4010: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
4020: 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61  he dynamic libra
4030: 72 79 20 68 61 6e 64 6c 65 20 70 48 61 6e 64 6c  ry handle pHandl
4040: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
4050: 64 20 76 73 74 61 74 44 6c 43 6c 6f 73 65 28 73  d vstatDlClose(s
4060: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
4070: 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
4080: 7b 0a 20 20 52 45 41 4c 56 46 53 28 70 56 66 73  {.  REALVFS(pVfs
4090: 29 2d 3e 78 44 6c 43 6c 6f 73 65 28 52 45 41 4c  )->xDlClose(REAL
40a0: 56 46 53 28 70 56 66 73 29 2c 20 70 48 61 6e 64  VFS(pVfs), pHand
40b0: 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f  le);.}../*.** Po
40c0: 70 75 6c 61 74 65 20 74 68 65 20 62 75 66 66 65  pulate the buffe
40d0: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
40e0: 7a 42 75 66 4f 75 74 20 77 69 74 68 20 6e 42 79  zBufOut with nBy
40f0: 74 65 20 62 79 74 65 73 20 6f 66 20 0a 2a 2a 20  te bytes of .** 
4100: 72 61 6e 64 6f 6d 20 64 61 74 61 2e 0a 2a 2f 0a  random data..*/.
4110: 73 74 61 74 69 63 20 69 6e 74 20 76 73 74 61 74  static int vstat
4120: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74  Randomness(sqlit
4130: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
4140: 74 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a  t nByte, char *z
4150: 42 75 66 4f 75 74 29 7b 0a 20 20 53 54 41 54 43  BufOut){.  STATC
4160: 4e 54 28 56 46 53 53 54 41 54 5f 41 4e 59 2c 56  NT(VFSSTAT_ANY,V
4170: 46 53 53 54 41 54 5f 52 41 4e 44 4f 4d 29 2b 2b  FSSTAT_RANDOM)++
4180: 3b 0a 20 20 72 65 74 75 72 6e 20 52 45 41 4c 56  ;.  return REALV
4190: 46 53 28 70 56 66 73 29 2d 3e 78 52 61 6e 64 6f  FS(pVfs)->xRando
41a0: 6d 6e 65 73 73 28 52 45 41 4c 56 46 53 28 70 56  mness(REALVFS(pV
41b0: 66 73 29 2c 20 6e 42 79 74 65 2c 20 7a 42 75 66  fs), nByte, zBuf
41c0: 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Out);.}../*.** S
41d0: 6c 65 65 70 20 66 6f 72 20 6e 4d 69 63 72 6f 20  leep for nMicro 
41e0: 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 52 65  microseconds. Re
41f0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
4200: 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
4210: 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 73 6c 65  .** actually sle
4220: 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pt..*/.static in
4230: 74 20 76 73 74 61 74 53 6c 65 65 70 28 73 71 6c  t vstatSleep(sql
4240: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
4250: 69 6e 74 20 6e 4d 69 63 72 6f 29 7b 0a 20 20 53  int nMicro){.  S
4260: 54 41 54 43 4e 54 28 56 46 53 53 54 41 54 5f 41  TATCNT(VFSSTAT_A
4270: 4e 59 2c 56 46 53 53 54 41 54 5f 53 4c 45 45 50  NY,VFSSTAT_SLEEP
4280: 29 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 52 45  )++;.  return RE
4290: 41 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 53 6c  ALVFS(pVfs)->xSl
42a0: 65 65 70 28 52 45 41 4c 56 46 53 28 70 56 66 73  eep(REALVFS(pVfs
42b0: 29 2c 20 6e 4d 69 63 72 6f 29 3b 0a 7d 0a 0a 2f  ), nMicro);.}../
42c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
42d0: 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 73 20  current time as 
42e0: 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
42f0: 62 65 72 20 69 6e 20 2a 70 54 69 6d 65 4f 75 74  ber in *pTimeOut
4300: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4310: 76 73 74 61 74 43 75 72 72 65 6e 74 54 69 6d 65  vstatCurrentTime
4320: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
4330: 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 54 69 6d  fs, double *pTim
4340: 65 4f 75 74 29 7b 0a 20 20 53 54 41 54 43 4e 54  eOut){.  STATCNT
4350: 28 56 46 53 53 54 41 54 5f 41 4e 59 2c 56 46 53  (VFSSTAT_ANY,VFS
4360: 53 54 41 54 5f 43 55 52 54 49 4d 45 29 2b 2b 3b  STAT_CURTIME)++;
4370: 0a 20 20 72 65 74 75 72 6e 20 52 45 41 4c 56 46  .  return REALVF
4380: 53 28 70 56 66 73 29 2d 3e 78 43 75 72 72 65 6e  S(pVfs)->xCurren
4390: 74 54 69 6d 65 28 52 45 41 4c 56 46 53 28 70 56  tTime(REALVFS(pV
43a0: 66 73 29 2c 20 70 54 69 6d 65 4f 75 74 29 3b 0a  fs), pTimeOut);.
43b0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 76 73  }..static int vs
43c0: 74 61 74 47 65 74 4c 61 73 74 45 72 72 6f 72 28  tatGetLastError(
43d0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
43e0: 73 2c 20 69 6e 74 20 61 2c 20 63 68 61 72 20 2a  s, int a, char *
43f0: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 45 41  b){.  return REA
4400: 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 47 65 74  LVFS(pVfs)->xGet
4410: 4c 61 73 74 45 72 72 6f 72 28 52 45 41 4c 56 46  LastError(REALVF
4420: 53 28 70 56 66 73 29 2c 20 61 2c 20 62 29 3b 0a  S(pVfs), a, b);.
4430: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 76 73 74  }.static int vst
4440: 61 74 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  atCurrentTimeInt
4450: 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  64(sqlite3_vfs *
4460: 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pVfs, sqlite3_in
4470: 74 36 34 20 2a 70 29 7b 0a 20 20 53 54 41 54 43  t64 *p){.  STATC
4480: 4e 54 28 56 46 53 53 54 41 54 5f 41 4e 59 2c 56  NT(VFSSTAT_ANY,V
4490: 46 53 53 54 41 54 5f 43 55 52 54 49 4d 45 29 2b  FSSTAT_CURTIME)+
44a0: 2b 3b 0a 20 20 72 65 74 75 72 6e 20 52 45 41 4c  +;.  return REAL
44b0: 56 46 53 28 70 56 66 73 29 2d 3e 78 43 75 72 72  VFS(pVfs)->xCurr
44c0: 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 52 45 41  entTimeInt64(REA
44d0: 4c 56 46 53 28 70 56 66 73 29 2c 20 70 29 3b 0a  LVFS(pVfs), p);.
44e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 76 69 72 74 75  }../*.** A virtu
44f0: 61 6c 20 74 61 62 6c 65 20 66 6f 72 20 61 63 63  al table for acc
4500: 65 73 73 69 6e 67 20 74 68 65 20 73 74 61 74 73  essing the stats
4510: 20 63 6f 6c 6c 65 63 74 65 64 20 62 79 20 74 68   collected by th
4520: 69 73 20 56 46 53 20 73 68 69 6d 0a 2a 2f 0a 73  is VFS shim.*/.s
4530: 74 61 74 69 63 20 69 6e 74 20 76 73 74 61 74 74  tatic int vstatt
4540: 61 62 43 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65  abConnect(sqlite
4550: 33 2a 2c 20 76 6f 69 64 2a 2c 20 69 6e 74 2c 20  3*, void*, int, 
4560: 63 6f 6e 73 74 20 63 68 61 72 2a 63 6f 6e 73 74  const char*const
4570: 2a 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  *, .            
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4590: 71 6c 69 74 65 33 5f 76 74 61 62 2a 2a 2c 63 68  qlite3_vtab**,ch
45a0: 61 72 2a 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  ar**);.static in
45b0: 74 20 76 73 74 61 74 74 61 62 42 65 73 74 49 6e  t vstattabBestIn
45c0: 64 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61 62  dex(sqlite3_vtab
45d0: 2a 2c 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  *,sqlite3_index_
45e0: 69 6e 66 6f 2a 29 3b 0a 73 74 61 74 69 63 20 69  info*);.static i
45f0: 6e 74 20 76 73 74 61 74 74 61 62 44 69 73 63 6f  nt vstattabDisco
4600: 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74  nnect(sqlite3_vt
4610: 61 62 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  ab*);.static int
4620: 20 76 73 74 61 74 74 61 62 4f 70 65 6e 28 73 71   vstattabOpen(sq
4630: 6c 69 74 65 33 5f 76 74 61 62 2a 2c 20 73 71 6c  lite3_vtab*, sql
4640: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
4650: 2a 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  **);.static int 
4660: 76 73 74 61 74 74 61 62 43 6c 6f 73 65 28 73 71  vstattabClose(sq
4670: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
4680: 72 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  r*);.static int 
4690: 76 73 74 61 74 74 61 62 46 69 6c 74 65 72 28 73  vstattabFilter(s
46a0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
46b0: 6f 72 2a 2c 20 69 6e 74 20 69 64 78 4e 75 6d 2c  or*, int idxNum,
46c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78   const char *idx
46d0: 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Str,.           
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
46f0: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
4700: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 3b 0a  _value **argv);.
4710: 73 74 61 74 69 63 20 69 6e 74 20 76 73 74 61 74  static int vstat
4720: 74 61 62 4e 65 78 74 28 73 71 6c 69 74 65 33 5f  tabNext(sqlite3_
4730: 76 74 61 62 5f 63 75 72 73 6f 72 2a 29 3b 0a 73  vtab_cursor*);.s
4740: 74 61 74 69 63 20 69 6e 74 20 76 73 74 61 74 74  tatic int vstatt
4750: 61 62 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74  abEof(sqlite3_vt
4760: 61 62 5f 63 75 72 73 6f 72 2a 29 3b 0a 73 74 61  ab_cursor*);.sta
4770: 74 69 63 20 69 6e 74 20 76 73 74 61 74 74 61 62  tic int vstattab
4780: 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 5f 76  Column(sqlite3_v
4790: 74 61 62 5f 63 75 72 73 6f 72 2a 2c 73 71 6c 69  tab_cursor*,sqli
47a0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
47b0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 76 73  );.static int vs
47c0: 74 61 74 74 61 62 52 6f 77 69 64 28 73 71 6c 69  tattabRowid(sqli
47d0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 2a  te3_vtab_cursor*
47e0: 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29  ,sqlite3_int64*)
47f0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 76 73 74  ;.static int vst
4800: 61 74 74 61 62 55 70 64 61 74 65 28 73 71 6c 69  attabUpdate(sqli
4810: 74 65 33 5f 76 74 61 62 2a 2c 69 6e 74 2c 73 71  te3_vtab*,int,sq
4820: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 2c 73 71  lite3_value**,sq
4830: 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 3b 0a 0a  lite3_int64*);..
4840: 2f 2a 20 41 20 63 75 72 73 6f 72 20 66 6f 72 20  /* A cursor for 
4850: 74 68 65 20 76 66 73 73 74 61 74 20 76 69 72 74  the vfsstat virt
4860: 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 74 79 70  ual table */.typ
4870: 65 64 65 66 20 73 74 72 75 63 74 20 56 66 73 53  edef struct VfsS
4880: 74 61 74 43 75 72 73 6f 72 20 7b 0a 20 20 73 71  tatCursor {.  sq
4890: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
48a0: 72 20 62 61 73 65 3b 20 20 20 20 20 20 20 2f 2a  r base;       /*
48b0: 20 42 61 73 65 20 63 6c 61 73 73 2e 20 20 4d 75   Base class.  Mu
48c0: 73 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20  st be first */. 
48d0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48f0: 20 2f 2a 20 50 6f 69 6e 74 69 6e 67 20 74 6f 20   /* Pointing to 
4900: 74 68 69 73 20 61 56 66 73 43 6e 74 5b 5d 20 76  this aVfsCnt[] v
4910: 61 6c 75 65 20 2a 2f 0a 7d 20 56 66 73 53 74 61  alue */.} VfsSta
4920: 74 43 75 72 73 6f 72 3b 0a 0a 0a 73 74 61 74 69  tCursor;...stati
4930: 63 20 69 6e 74 20 76 73 74 61 74 74 61 62 43 6f  c int vstattabCo
4940: 6e 6e 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33  nnect(.  sqlite3
4950: 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41   *db,.  void *pA
4960: 75 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  ux,.  int argc, 
4970: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73  const char *cons
4980: 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65  t*argv,.  sqlite
4990: 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c  3_vtab **ppVtab,
49a0: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a  .  char **pzErr.
49b0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  ){.  sqlite3_vta
49c0: 62 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72  b *pNew;.  int r
49d0: 63 3b 0a 0a 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75  c;../* Column nu
49e0: 6d 62 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65  mbers */.#define
49f0: 20 56 53 54 41 54 5f 43 4f 4c 55 4d 4e 5f 46 49   VSTAT_COLUMN_FI
4a00: 4c 45 20 20 30 20 0a 23 64 65 66 69 6e 65 20 56  LE  0 .#define V
4a10: 53 54 41 54 5f 43 4f 4c 55 4d 4e 5f 53 54 41 54  STAT_COLUMN_STAT
4a20: 20 20 31 0a 23 64 65 66 69 6e 65 20 56 53 54 41    1.#define VSTA
4a30: 54 5f 43 4f 4c 55 4d 4e 5f 43 4f 55 4e 54 20 32  T_COLUMN_COUNT 2
4a40: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
4a50: 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62  _declare_vtab(db
4a60: 2c 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  ,"CREATE TABLE x
4a70: 28 66 69 6c 65 2c 73 74 61 74 2c 63 6f 75 6e 74  (file,stat,count
4a80: 29 22 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  )");.  if( rc==S
4a90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4aa0: 70 4e 65 77 20 3d 20 2a 70 70 56 74 61 62 20 3d  pNew = *ppVtab =
4ab0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
4ac0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
4ad0: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
4ae0: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
4af0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d  E_NOMEM;.    mem
4b00: 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
4b10: 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d  eof(*pNew));.  }
4b20: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4b30: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 74 68  ./*.** This meth
4b40: 6f 64 20 69 73 20 74 68 65 20 64 65 73 74 72 75  od is the destru
4b50: 63 74 6f 72 20 66 6f 72 20 76 73 74 61 74 20 74  ctor for vstat t
4b60: 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  able object..*/.
4b70: 73 74 61 74 69 63 20 69 6e 74 20 76 73 74 61 74  static int vstat
4b80: 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 73 71  tabDisconnect(sq
4b90: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
4ba0: 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  b){.  sqlite3_fr
4bb0: 65 65 28 70 56 74 61 62 29 3b 0a 20 20 72 65 74  ee(pVtab);.  ret
4bc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
4bd0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
4be0: 74 6f 72 20 66 6f 72 20 61 20 6e 65 77 20 76 73  tor for a new vs
4bf0: 74 61 74 20 74 61 62 6c 65 20 63 75 72 73 6f 72  tat table cursor
4c00: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
4c10: 69 63 20 69 6e 74 20 76 73 74 61 74 74 61 62 4f  ic int vstattabO
4c20: 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62  pen(sqlite3_vtab
4c30: 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61   *p, sqlite3_vta
4c40: 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72  b_cursor **ppCur
4c50: 73 6f 72 29 7b 0a 20 20 56 66 73 53 74 61 74 43  sor){.  VfsStatC
4c60: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 70  ursor *pCur;.  p
4c70: 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Cur = sqlite3_ma
4c80: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
4c90: 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
4ca0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
4cb0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
4cc0: 6d 73 65 74 28 70 43 75 72 2c 20 30 2c 20 73 69  mset(pCur, 0, si
4cd0: 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a 20 20  zeof(*pCur));.  
4ce0: 2a 70 70 43 75 72 73 6f 72 20 3d 20 26 70 43 75  *ppCursor = &pCu
4cf0: 72 2d 3e 62 61 73 65 3b 0a 20 20 72 65 74 75 72  r->base;.  retur
4d00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4d10: 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f  ./*.** Destructo
4d20: 72 20 66 6f 72 20 61 20 56 66 73 53 74 61 74 43  r for a VfsStatC
4d30: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
4d40: 20 69 6e 74 20 76 73 74 61 74 74 61 62 43 6c 6f   int vstattabClo
4d50: 73 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  se(sqlite3_vtab_
4d60: 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20  cursor *cur){.  
4d70: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63 75 72  sqlite3_free(cur
4d80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
4d90: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
4da0: 20 41 64 76 61 6e 63 65 20 61 20 56 66 73 53 74   Advance a VfsSt
4db0: 61 74 43 75 72 73 6f 72 20 74 6f 20 69 74 73 20  atCursor to its 
4dc0: 6e 65 78 74 20 72 6f 77 20 6f 66 20 6f 75 74 70  next row of outp
4dd0: 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ut..*/.static in
4de0: 74 20 76 73 74 61 74 74 61 62 4e 65 78 74 28 73  t vstattabNext(s
4df0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
4e00: 6f 72 20 2a 63 75 72 29 7b 0a 20 20 28 28 56 66  or *cur){.  ((Vf
4e10: 73 53 74 61 74 43 75 72 73 6f 72 2a 29 63 75 72  sStatCursor*)cur
4e20: 29 2d 3e 69 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  )->i++;.  return
4e30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4e40: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75  *.** Return valu
4e50: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 6f  es of columns fo
4e60: 72 20 74 68 65 20 72 6f 77 20 61 74 20 77 68 69  r the row at whi
4e70: 63 68 20 74 68 65 20 56 66 73 53 74 61 74 43 75  ch the VfsStatCu
4e80: 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72 65  rsor.** is curre
4e90: 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
4ea0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 73 74  /.static int vst
4eb0: 61 74 74 61 62 43 6f 6c 75 6d 6e 28 0a 20 20 73  attabColumn(.  s
4ec0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
4ed0: 6f 72 20 2a 63 75 72 2c 20 20 20 2f 2a 20 54 68  or *cur,   /* Th
4ee0: 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 71  e cursor */.  sq
4ef0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
4f00: 74 78 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72  tx,       /* Fir
4f10: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73  st argument to s
4f20: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 2e 2e  qlite3_result_..
4f30: 2e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69 20 20  .() */.  int i  
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f50: 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f       /* Which co
4f60: 6c 75 6d 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a  lumn to return *
4f70: 2f 0a 29 7b 0a 20 20 56 66 73 53 74 61 74 43 75  /.){.  VfsStatCu
4f80: 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 56 66  rsor *pCur = (Vf
4f90: 73 53 74 61 74 43 75 72 73 6f 72 2a 29 63 75 72  sStatCursor*)cur
4fa0: 3b 0a 20 20 73 77 69 74 63 68 28 20 69 20 29 7b  ;.  switch( i ){
4fb0: 0a 20 20 20 20 63 61 73 65 20 56 53 54 41 54 5f  .    case VSTAT_
4fc0: 43 4f 4c 55 4d 4e 5f 46 49 4c 45 3a 20 7b 0a 20  COLUMN_FILE: {. 
4fd0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
4fe0: 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 61 7a  ult_text(ctx, az
4ff0: 46 69 6c 65 5b 70 43 75 72 2d 3e 69 2f 56 46 53  File[pCur->i/VFS
5000: 53 54 41 54 5f 6e 53 74 61 74 5d 2c 20 2d 31 2c  STAT_nStat], -1,
5010: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
5020: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5030: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 56 53 54    }.    case VST
5040: 41 54 5f 43 4f 4c 55 4d 4e 5f 53 54 41 54 3a 20  AT_COLUMN_STAT: 
5050: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
5060: 61 72 20 2a 2a 61 7a 3b 0a 20 20 20 20 20 20 61  ar **az;.      a
5070: 7a 20 3d 20 28 70 43 75 72 2d 3e 69 2f 56 46 53  z = (pCur->i/VFS
5080: 53 54 41 54 5f 6e 53 74 61 74 29 3d 3d 56 46 53  STAT_nStat)==VFS
5090: 53 54 41 54 5f 41 4e 59 20 3f 20 61 7a 53 74 61  STAT_ANY ? azSta
50a0: 74 41 6e 79 20 3a 20 61 7a 53 74 61 74 3b 0a 20  tAny : azStat;. 
50b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
50c0: 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 61 7a  ult_text(ctx, az
50d0: 5b 70 43 75 72 2d 3e 69 25 56 46 53 53 54 41 54  [pCur->i%VFSSTAT
50e0: 5f 6e 53 74 61 74 5d 2c 20 2d 31 2c 20 53 51 4c  _nStat], -1, SQL
50f0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
5100: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5110: 20 20 20 20 63 61 73 65 20 56 53 54 41 54 5f 43      case VSTAT_C
5120: 4f 4c 55 4d 4e 5f 43 4f 55 4e 54 3a 20 7b 0a 20  OLUMN_COUNT: {. 
5130: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
5140: 75 6c 74 5f 69 6e 74 36 34 28 63 74 78 2c 20 61  ult_int64(ctx, a
5150: 56 66 73 43 6e 74 5b 70 43 75 72 2d 3e 69 5d 29  VfsCnt[pCur->i])
5160: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5170: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5180: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
5190: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
51a0: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63   rowid for the c
51b0: 75 72 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73  urrent row..*/.s
51c0: 74 61 74 69 63 20 69 6e 74 20 76 73 74 61 74 74  tatic int vstatt
51d0: 61 62 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f  abRowid(sqlite3_
51e0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
51f0: 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a  , sqlite_int64 *
5200: 70 52 6f 77 69 64 29 7b 0a 20 20 56 66 73 53 74  pRowid){.  VfsSt
5210: 61 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  atCursor *pCur =
5220: 20 28 56 66 73 53 74 61 74 43 75 72 73 6f 72 2a   (VfsStatCursor*
5230: 29 63 75 72 3b 0a 20 20 2a 70 52 6f 77 69 64 20  )cur;.  *pRowid 
5240: 3d 20 70 43 75 72 2d 3e 69 3b 0a 20 20 72 65 74  = pCur->i;.  ret
5250: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
5260: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
5270: 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
5280: 72 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64  r has been moved
5290: 20 6f 66 66 20 6f 66 20 74 68 65 20 6c 61 73 74   off of the last
52a0: 0a 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  .** row of outpu
52b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
52c0: 20 76 73 74 61 74 74 61 62 45 6f 66 28 73 71 6c   vstattabEof(sql
52d0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
52e0: 20 2a 63 75 72 29 7b 0a 20 20 56 66 73 53 74 61   *cur){.  VfsSta
52f0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  tCursor *pCur = 
5300: 28 56 66 73 53 74 61 74 43 75 72 73 6f 72 2a 29  (VfsStatCursor*)
5310: 63 75 72 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  cur;.  return pC
5320: 75 72 2d 3e 69 20 3e 3d 20 56 46 53 53 54 41 54  ur->i >= VFSSTAT
5330: 5f 4d 58 43 4e 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _MXCNT;.}../*.**
5340: 20 4f 6e 6c 79 20 61 20 66 75 6c 6c 20 74 61 62   Only a full tab
5350: 6c 65 20 73 63 61 6e 20 69 73 20 73 75 70 70 6f  le scan is suppo
5360: 72 74 65 64 2e 20 20 53 6f 20 78 46 69 6c 74 65  rted.  So xFilte
5370: 72 20 73 69 6d 70 6c 79 20 72 65 77 69 6e 64 73  r simply rewinds
5380: 20 74 6f 0a 2a 2a 20 74 68 65 20 62 65 67 69 6e   to.** the begin
5390: 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
53a0: 69 6e 74 20 76 73 74 61 74 74 61 62 46 69 6c 74  int vstattabFilt
53b0: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  er(.  sqlite3_vt
53c0: 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62  ab_cursor *pVtab
53d0: 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e 74 20 69  Cursor, .  int i
53e0: 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61  dxNum, const cha
53f0: 72 20 2a 69 64 78 53 74 72 2c 0a 20 20 69 6e 74  r *idxStr,.  int
5400: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
5410: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
5420: 20 56 66 73 53 74 61 74 43 75 72 73 6f 72 20 2a   VfsStatCursor *
5430: 70 43 75 72 20 3d 20 28 56 66 73 53 74 61 74 43  pCur = (VfsStatC
5440: 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73  ursor*)pVtabCurs
5450: 6f 72 3b 0a 20 20 70 43 75 72 2d 3e 69 20 3d 20  or;.  pCur->i = 
5460: 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
5470: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5480: 4f 6e 6c 79 20 61 20 66 6f 72 77 61 72 64 73 20  Only a forwards 
5490: 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  full table scan 
54a0: 69 73 20 73 75 70 70 6f 72 74 65 64 2e 20 20 78  is supported.  x
54b0: 42 65 73 74 49 6e 64 65 78 20 69 73 20 61 20 6e  BestIndex is a n
54c0: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
54d0: 69 6e 74 20 76 73 74 61 74 74 61 62 42 65 73 74  int vstattabBest
54e0: 49 6e 64 65 78 28 0a 20 20 73 71 6c 69 74 65 33  Index(.  sqlite3
54f0: 5f 76 74 61 62 20 2a 74 61 62 2c 0a 20 20 73 71  _vtab *tab,.  sq
5500: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
5510: 20 2a 70 49 64 78 49 6e 66 6f 0a 29 7b 0a 20 20   *pIdxInfo.){.  
5520: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5530: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 79 20 56  ;.}../*.** Any V
5540: 53 54 41 54 5f 43 4f 4c 55 4d 4e 5f 43 4f 55 4e  STAT_COLUMN_COUN
5550: 54 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64  T can be changed
5560: 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 20 69   to a positive i
5570: 6e 74 65 67 65 72 2e 0a 2a 2a 20 4e 6f 20 64 65  nteger..** No de
5580: 6c 65 74 69 6f 6e 73 20 6f 72 20 69 6e 73 65 72  letions or inser
5590: 74 69 6f 6e 73 20 61 72 65 20 61 6c 6c 6f 77 65  tions are allowe
55a0: 64 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 74  d.  No changes t
55b0: 6f 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 6c 75 6d  o other.** colum
55c0: 6e 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  ns are allowed..
55d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 73  */.static int vs
55e0: 74 61 74 74 61 62 55 70 64 61 74 65 28 0a 20 20  tattabUpdate(.  
55f0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61  sqlite3_vtab *ta
5600: 62 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 73  b,.  int argc, s
5610: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5620: 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  rgv,.  sqlite3_i
5630: 6e 74 36 34 20 2a 70 52 6f 77 69 64 0a 29 7b 0a  nt64 *pRowid.){.
5640: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
5650: 69 52 6f 77 69 64 2c 20 78 3b 0a 20 20 69 66 28  iRowid, x;.  if(
5660: 20 61 72 67 63 3d 3d 31 20 29 20 72 65 74 75 72   argc==1 ) retur
5670: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
5680: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
5690: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
56a0: 29 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  )!=SQLITE_INTEGE
56b0: 52 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  R ) return SQLIT
56c0: 45 5f 45 52 52 4f 52 3b 0a 20 20 69 52 6f 77 69  E_ERROR;.  iRowi
56d0: 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
56e0: 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29  e_int64(argv[0])
56f0: 3b 0a 20 20 69 66 28 20 69 52 6f 77 69 64 21 3d  ;.  if( iRowid!=
5700: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
5710: 74 36 34 28 61 72 67 76 5b 31 5d 29 20 29 20 72  t64(argv[1]) ) r
5720: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
5730: 4f 52 3b 0a 20 20 69 66 28 20 69 52 6f 77 69 64  OR;.  if( iRowid
5740: 3c 30 20 7c 7c 20 69 52 6f 77 69 64 3e 3d 56 46  <0 || iRowid>=VF
5750: 53 53 54 41 54 5f 4d 58 43 4e 54 20 29 20 72 65  SSTAT_MXCNT ) re
5760: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
5770: 52 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  R;.  if( sqlite3
5780: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
5790: 5b 56 53 54 41 54 5f 43 4f 4c 55 4d 4e 5f 43 4f  [VSTAT_COLUMN_CO
57a0: 55 4e 54 2b 32 5d 29 21 3d 53 51 4c 49 54 45 5f  UNT+2])!=SQLITE_
57b0: 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 72  INTEGER ){.    r
57c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
57d0: 4f 52 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 73 71  OR;.  }.  x = sq
57e0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
57f0: 34 28 61 72 67 76 5b 56 53 54 41 54 5f 43 4f 4c  4(argv[VSTAT_COL
5800: 55 4d 4e 5f 43 4f 55 4e 54 2b 32 5d 29 3b 0a 20  UMN_COUNT+2]);. 
5810: 20 69 66 28 20 78 3c 30 20 29 20 72 65 74 75 72   if( x<0 ) retur
5820: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
5830: 20 20 61 56 66 73 43 6e 74 5b 69 52 6f 77 69 64    aVfsCnt[iRowid
5840: 5d 20 3d 20 78 3b 0a 20 20 72 65 74 75 72 6e 20  ] = x;.  return 
5850: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
5860: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64  atic sqlite3_mod
5870: 75 6c 65 20 56 66 73 53 74 61 74 4d 6f 64 75 6c  ule VfsStatModul
5880: 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20  e = {.  0,      
5890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58a0: 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
58b0: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
58c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
58d0: 2a 20 78 43 72 65 61 74 65 20 2a 2f 0a 20 20 76  * xCreate */.  v
58e0: 73 74 61 74 74 61 62 43 6f 6e 6e 65 63 74 2c 20  stattabConnect, 
58f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
5900: 6e 6e 65 63 74 20 2a 2f 0a 20 20 76 73 74 61 74  nnect */.  vstat
5910: 74 61 62 42 65 73 74 49 6e 64 65 78 2c 20 20 20  tabBestIndex,   
5920: 20 20 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e        /* xBestIn
5930: 64 65 78 20 2a 2f 0a 20 20 76 73 74 61 74 74 61  dex */.  vstatta
5940: 62 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20  bDisconnect,    
5950: 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65      /* xDisconne
5960: 63 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  ct */.  0,      
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5980: 20 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2a     /* xDestroy *
5990: 2f 0a 20 20 76 73 74 61 74 74 61 62 4f 70 65 6e  /.  vstattabOpen
59a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
59b0: 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61  * xOpen - open a
59c0: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 76 73 74   cursor */.  vst
59d0: 61 74 74 61 62 43 6c 6f 73 65 2c 20 20 20 20 20  attabClose,     
59e0: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
59f0: 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73  e - close a curs
5a00: 6f 72 20 2a 2f 0a 20 20 76 73 74 61 74 74 61 62  or */.  vstattab
5a10: 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20  Filter,         
5a20: 20 20 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20     /* xFilter - 
5a30: 63 6f 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63  configure scan c
5a40: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
5a50: 76 73 74 61 74 74 61 62 4e 65 78 74 2c 20 20 20  vstattabNext,   
5a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e             /* xN
5a70: 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20  ext - advance a 
5a80: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 76 73 74 61  cursor */.  vsta
5a90: 74 74 61 62 45 6f 66 2c 20 20 20 20 20 20 20 20  ttabEof,        
5aa0: 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d         /* xEof -
5ab0: 20 63 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f   check for end o
5ac0: 66 20 73 63 61 6e 20 2a 2f 0a 20 20 76 73 74 61  f scan */.  vsta
5ad0: 74 74 61 62 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  ttabColumn,     
5ae0: 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d         /* xColum
5af0: 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  n - read data */
5b00: 0a 20 20 76 73 74 61 74 74 61 62 52 6f 77 69 64  .  vstattabRowid
5b10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
5b20: 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64 20 64   xRowid - read d
5b30: 61 74 61 20 2a 2f 0a 20 20 76 73 74 61 74 74 61  ata */.  vstatta
5b40: 62 55 70 64 61 74 65 2c 20 20 20 20 20 20 20 20  bUpdate,        
5b50: 20 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a      /* xUpdate *
5b60: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5b80: 2a 20 78 42 65 67 69 6e 20 2a 2f 0a 20 20 30 2c  * xBegin */.  0,
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
5bb0: 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  c */.  0,       
5bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bd0: 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a    /* xCommit */.
5be0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
5bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5c00: 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30  xRollback */.  0
5c10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
5c30: 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c  ndMethod */.  0,
5c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e           /* xRen
5c60: 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ame */.};../*.**
5c70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5c80: 20 61 6e 20 73 71 6c 69 74 65 33 5f 61 75 74 6f   an sqlite3_auto
5c90: 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 63 61 6c  _extension() cal
5ca0: 6c 62 61 63 6b 2c 20 69 6e 76 6f 6b 65 64 20 74  lback, invoked t
5cb0: 6f 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 74 68  o register.** th
5cc0: 65 20 76 66 73 73 74 61 74 20 76 69 72 74 75 61  e vfsstat virtua
5cd0: 6c 20 74 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20  l table for all 
5ce0: 6e 65 77 20 64 61 74 61 62 61 73 65 20 63 6f 6e  new database con
5cf0: 6e 65 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  nections..*/.sta
5d00: 74 69 63 20 69 6e 74 20 76 73 74 61 74 52 65 67  tic int vstatReg
5d10: 69 73 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ister(.  sqlite3
5d20: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
5d30: 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 0a 20  ar **pzErrMsg,. 
5d40: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71   const struct sq
5d50: 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
5d60: 65 73 20 2a 70 54 68 75 6e 6b 0a 29 7b 0a 20 20  es *pThunk.){.  
5d70: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63  return sqlite3_c
5d80: 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 64 62 2c  reate_module(db,
5d90: 20 22 76 66 73 73 74 61 74 22 2c 20 26 56 66 73   "vfsstat", &Vfs
5da0: 53 74 61 74 4d 6f 64 75 6c 65 2c 20 30 29 3b 0a  StatModule, 0);.
5db0: 7d 0a 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32  }..#ifdef _WIN32
5dc0: 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65  .__declspec(dlle
5dd0: 78 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a 2f 2a  xport).#endif./*
5de0: 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
5df0: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
5e00: 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 69   the extension i
5e10: 73 20 6c 6f 61 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  s loaded..**.** 
5e20: 52 65 67 69 73 74 65 72 20 74 68 65 20 6e 65 77  Register the new
5e30: 20 56 46 53 2e 20 20 4d 61 6b 65 20 61 72 72 61   VFS.  Make arra
5e40: 6e 67 65 6d 65 6e 74 20 74 6f 20 72 65 67 69 73  ngement to regis
5e50: 74 65 72 20 74 68 65 20 76 69 72 74 75 61 6c 20  ter the virtual 
5e60: 74 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 65 61 63  table.** for eac
5e70: 68 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 63  h new database c
5e80: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  onnection..*/.in
5e90: 74 20 73 71 6c 69 74 65 33 5f 76 66 73 73 74 61  t sqlite3_vfssta
5ea0: 74 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65  t_init(.  sqlite
5eb0: 33 20 2a 64 62 2c 20 0a 20 20 63 68 61 72 20 2a  3 *db, .  char *
5ec0: 2a 70 7a 45 72 72 4d 73 67 2c 20 0a 20 20 63 6f  *pzErrMsg, .  co
5ed0: 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
5ee0: 72 6f 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29  routines *pApi.)
5ef0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5f00: 49 54 45 5f 4f 4b 3b 0a 20 20 53 51 4c 49 54 45  ITE_OK;.  SQLITE
5f10: 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32  _EXTENSION_INIT2
5f20: 28 70 41 70 69 29 3b 0a 20 20 76 73 74 61 74 5f  (pApi);.  vstat_
5f30: 76 66 73 2e 70 56 66 73 20 3d 20 73 71 6c 69 74  vfs.pVfs = sqlit
5f40: 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
5f50: 20 20 76 73 74 61 74 5f 76 66 73 2e 62 61 73 65    vstat_vfs.base
5f60: 2e 73 7a 4f 73 46 69 6c 65 20 3d 20 73 69 7a 65  .szOsFile = size
5f70: 6f 66 28 56 53 74 61 74 46 69 6c 65 29 20 2b 20  of(VStatFile) + 
5f80: 76 73 74 61 74 5f 76 66 73 2e 70 56 66 73 2d 3e  vstat_vfs.pVfs->
5f90: 73 7a 4f 73 46 69 6c 65 3b 0a 20 20 72 63 20 3d  szOsFile;.  rc =
5fa0: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
5fb0: 69 73 74 65 72 28 26 76 73 74 61 74 5f 76 66 73  ister(&vstat_vfs
5fc0: 2e 62 61 73 65 2c 20 31 29 3b 0a 20 20 69 66 28  .base, 1);.  if(
5fd0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5fe0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
5ff0: 65 33 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f  e3_auto_extensio
6000: 6e 28 76 73 74 61 74 52 65 67 69 73 74 65 72 29  n(vstatRegister)
6010: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
6020: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
6030: 20 53 51 4c 49 54 45 5f 4f 4b 5f 4c 4f 41 44 5f   SQLITE_OK_LOAD_
6040: 50 45 52 4d 41 4e 45 4e 54 4c 59 3b 0a 20 20 72  PERMANENTLY;.  r
6050: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a              eturn rc;.}.