/ Hex Artifact Content
Login

Artifact 90fb03d396f39956897dfb4bd0e62c6711db1cca:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 41 70 72 69 6c  /*.** 2008 April
0010: 20 31 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75   10.**.** The au
0020: 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63  thor disclaims c
0030: 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73  opyright to this
0040: 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49   source code.  I
0050: 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20  n place of.** a 
0060: 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65  legal notice, he
0070: 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67  re is a blessing
0080: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79  :.**.**    May y
0090: 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e  ou do good and n
00a0: 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d  ot evil..**    M
00b0: 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67  ay you find forg
00c0: 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72  iveness for your
00d0: 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65  self and forgive
00e0: 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d   others..**    M
00f0: 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65  ay you share fre
0100: 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e  ely, never takin
0110: 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20  g more than you 
0120: 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  give..**.*******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
0180: 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  is file contains
0190: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
01a0: 69 6f 6e 20 6f 66 20 61 6e 20 53 51 4c 69 74 65  ion of an SQLite
01b0: 20 76 66 73 20 77 72 61 70 70 65 72 20 74 68 61   vfs wrapper tha
01c0: 74 0a 2a 2a 20 61 64 64 73 20 69 6e 73 74 72 75  t.** adds instru
01d0: 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20 61 6c 6c  mentation to all
01e0: 20 76 66 73 20 61 6e 64 20 66 69 6c 65 20 6d 65   vfs and file me
01f0: 74 68 6f 64 73 2e 20 43 20 61 6e 64 20 54 63 6c  thods. C and Tcl
0200: 20 69 6e 74 65 72 66 61 63 65 73 0a 2a 2a 20 61   interfaces.** a
0210: 72 65 20 70 72 6f 76 69 64 65 64 20 74 6f 20 63  re provided to c
0220: 6f 6e 74 72 6f 6c 20 74 68 65 20 69 6e 73 74 72  ontrol the instr
0230: 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 0a  umentation..*/..
0240: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
0250: 41 42 4c 45 5f 49 4e 53 54 56 46 53 0a 2f 2a 0a  ABLE_INSTVFS./*.
0260: 2a 2a 20 43 20 69 6e 74 65 72 66 61 63 65 3a 0a  ** C interface:.
0270: 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f  **.**   sqlite3_
0280: 69 6e 73 74 76 66 73 5f 63 72 65 61 74 65 28 29  instvfs_create()
0290: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  .**   sqlite3_in
02a0: 73 74 76 66 73 5f 64 65 73 74 72 6f 79 28 29 0a  stvfs_destroy().
02b0: 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 73  **   sqlite3_ins
02c0: 74 76 66 73 5f 63 6f 6e 66 69 67 75 72 65 28 29  tvfs_configure()
02d0: 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33  .**.**   sqlite3
02e0: 5f 69 6e 73 74 76 66 73 5f 72 65 73 65 74 28 29  _instvfs_reset()
02f0: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  .**   sqlite3_in
0300: 73 74 76 66 73 5f 67 65 74 28 29 0a 2a 2a 0a 2a  stvfs_get().**.*
0310: 2a 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 74  *   sqlite3_inst
0320: 76 66 73 5f 62 69 6e 61 72 79 6c 6f 67 0a 2a 2a  vfs_binarylog.**
0330: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76     sqlite3_instv
0340: 66 73 5f 62 69 6e 61 72 79 6c 6f 67 5f 6d 61 72  fs_binarylog_mar
0350: 6b 65 72 0a 2a 2a 0a 2a 2a 20 54 63 6c 20 69 6e  ker.**.** Tcl in
0360: 74 65 72 66 61 63 65 20 28 6f 6d 69 74 74 65 64  terface (omitted
0370: 20 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20   if SQLITE_TEST 
0380: 69 73 20 6e 6f 74 20 73 65 74 29 3a 0a 2a 2a 20  is not set):.** 
0390: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  .**   sqlite3_in
03a0: 73 74 76 66 73 20 63 72 65 61 74 65 20 4e 41 4d  stvfs create NAM
03b0: 45 20 3f 50 41 52 45 4e 54 3f 0a 2a 2a 0a 2a 2a  E ?PARENT?.**.**
03c0: 20 20 20 20 20 20 20 43 72 65 61 74 65 20 61 6e         Create an
03d0: 64 20 72 65 67 69 73 74 65 72 20 6e 65 77 20 76  d register new v
03e0: 66 73 20 63 61 6c 6c 65 64 20 24 4e 41 4d 45 2c  fs called $NAME,
03f0: 20 77 68 69 63 68 20 69 73 20 61 20 77 72 61 70   which is a wrap
0400: 70 65 72 20 61 72 6f 75 6e 64 0a 2a 2a 20 20 20  per around.**   
0410: 20 20 20 20 74 68 65 20 65 78 69 73 74 69 6e 67      the existing
0420: 20 76 66 73 20 24 50 41 52 45 4e 54 2e 20 49 66   vfs $PARENT. If
0430: 20 74 68 65 20 50 41 52 45 4e 54 20 61 72 67 75   the PARENT argu
0440: 6d 65 6e 74 20 69 73 20 6f 6d 69 74 74 65 64 2c  ment is omitted,
0450: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 65   the.**       ne
0460: 77 20 76 66 73 20 69 73 20 61 20 77 72 61 70 70  w vfs is a wrapp
0470: 65 72 20 61 72 6f 75 6e 64 20 74 68 65 20 63 75  er around the cu
0480: 72 72 65 6e 74 20 64 65 66 61 75 6c 74 20 76 66  rrent default vf
0490: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74  s..**.**   sqlit
04a0: 65 33 5f 69 6e 73 74 76 66 73 20 64 65 73 74 72  e3_instvfs destr
04b0: 6f 79 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 20 20  oy NAME.**.**   
04c0: 20 20 20 20 44 65 72 65 67 69 73 74 65 72 20 61      Deregister a
04d0: 6e 64 20 64 65 73 74 72 6f 79 20 74 68 65 20 76  nd destroy the v
04e0: 66 73 20 6e 61 6d 65 64 20 24 4e 41 4d 45 2c 20  fs named $NAME, 
04f0: 77 68 69 63 68 20 6d 75 73 74 20 68 61 76 65 20  which must have 
0500: 62 65 65 6e 0a 2a 2a 20 20 20 20 20 20 20 63 72  been.**       cr
0510: 65 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c  eated by an earl
0520: 69 65 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ier invocation o
0530: 66 20 5b 73 71 6c 69 74 65 33 5f 69 6e 73 74 76  f [sqlite3_instv
0540: 66 73 20 63 72 65 61 74 65 5d 2e 0a 2a 2a 0a 2a  fs create]..**.*
0550: 2a 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 74  *   sqlite3_inst
0560: 76 66 73 20 63 6f 6e 66 69 67 75 72 65 20 4e 41  vfs configure NA
0570: 4d 45 20 53 43 52 49 50 54 0a 2a 2a 0a 2a 2a 20  ME SCRIPT.**.** 
0580: 20 20 20 20 20 20 43 6f 6e 66 69 67 75 72 65 20        Configure 
0590: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 63 72  the callback scr
05a0: 69 70 74 20 66 6f 72 20 74 68 65 20 76 66 73 20  ipt for the vfs 
05b0: 24 4e 41 4d 45 2c 20 77 68 69 63 68 20 6d 75 63  $NAME, which muc
05c0: 68 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 20 20  h have.**       
05d0: 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20  been created by 
05e0: 61 6e 20 65 61 72 6c 69 65 72 20 69 6e 76 6f 63  an earlier invoc
05f0: 61 74 69 6f 6e 20 6f 66 20 5b 73 71 6c 69 74 65  ation of [sqlite
0600: 33 5f 69 6e 73 74 76 66 73 20 63 72 65 61 74 65  3_instvfs create
0610: 5d 2e 0a 2a 2a 20 20 20 20 20 20 20 41 66 74 65  ]..**       Afte
0620: 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 73 63 72  r a callback scr
0630: 69 70 74 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  ipt has been con
0640: 66 69 67 75 72 65 64 2c 20 69 74 20 69 73 20 69  figured, it is i
0650: 6e 76 6f 6b 65 64 20 65 61 63 68 0a 2a 2a 20 20  nvoked each.**  
0660: 20 20 20 20 20 74 69 6d 65 20 61 20 76 66 73 20       time a vfs 
0670: 6f 72 20 66 69 6c 65 20 6d 65 74 68 6f 64 20 69  or file method i
0680: 73 20 63 61 6c 6c 65 64 20 62 79 20 53 51 4c 69  s called by SQLi
0690: 74 65 2e 20 42 65 66 6f 72 65 20 69 6e 76 6f 6b  te. Before invok
06a0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 74 68 65  ing.**       the
06b0: 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74   callback script
06c0: 2c 20 66 69 76 65 20 61 72 67 75 6d 65 6e 74 73  , five arguments
06d0: 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f   are appended to
06e0: 20 69 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   it:.**.**      
06f0: 20 20 20 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66     * The name of
0700: 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 6d 65 74   the invoked met
0710: 68 6f 64 20 2d 20 69 2e 65 2e 20 22 78 52 65 61  hod - i.e. "xRea
0720: 64 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  d"..**.**       
0730: 20 20 2a 20 54 68 65 20 74 69 6d 65 20 63 6f 6e    * The time con
0740: 73 75 6d 65 64 20 62 79 20 74 68 65 20 6d 65 74  sumed by the met
0750: 68 6f 64 20 63 61 6c 6c 20 61 73 20 6d 65 61 73  hod call as meas
0760: 75 72 65 64 20 62 79 20 0a 2a 2a 20 20 20 20 20  ured by .**     
0770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 77 74        sqlite3Hwt
0780: 69 6d 65 28 29 20 28 61 6e 20 69 6e 74 65 67 65  ime() (an intege
0790: 72 20 76 61 6c 75 65 29 0a 2a 2a 0a 2a 2a 20 20  r value).**.**  
07a0: 20 20 20 20 20 20 20 2a 20 41 20 73 74 72 69 6e         * A strin
07b0: 67 20 76 61 6c 75 65 20 77 69 74 68 20 61 20 64  g value with a d
07c0: 69 66 66 65 72 65 6e 74 20 6d 65 61 6e 69 6e 67  ifferent meaning
07d0: 20 66 6f 72 20 64 69 66 66 65 72 65 6e 74 20 63   for different c
07e0: 61 6c 6c 73 2e 20 0a 2a 2a 20 20 20 20 20 20 20  alls. .**       
07f0: 20 20 20 20 46 6f 72 20 66 69 6c 65 20 6d 65 74      For file met
0800: 68 6f 64 73 2c 20 74 68 65 20 6e 61 6d 65 20 6f  hods, the name o
0810: 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
0820: 20 6f 70 65 72 61 74 65 64 20 6f 6e 2e 20 46 6f   operated on. Fo
0830: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6f  r.**           o
0840: 74 68 65 72 20 6d 65 74 68 6f 64 73 20 69 74 20  ther methods it 
0850: 69 73 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  is the filename 
0860: 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 61 6e 79  argument, if any
0870: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  ..**.**         
0880: 2a 20 41 20 33 32 2d 62 69 74 20 69 6e 74 65 67  * A 32-bit integ
0890: 65 72 20 76 61 6c 75 65 20 77 69 74 68 20 61 20  er value with a 
08a0: 63 61 6c 6c 2d 73 70 65 63 69 66 69 63 20 6d 65  call-specific me
08b0: 61 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  aning..**.**    
08c0: 20 20 20 20 20 2a 20 41 20 36 34 2d 62 69 74 20       * A 64-bit 
08d0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 20 46  integer value. F
08e0: 6f 72 20 78 52 65 61 64 28 29 20 61 6e 64 20 78  or xRead() and x
08f0: 57 72 69 74 65 28 29 20 63 61 6c 6c 73 20 74 68  Write() calls th
0900: 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  is.**           
0910: 69 73 20 74 68 65 20 66 69 6c 65 20 6f 66 66 73  is the file offs
0920: 65 74 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  et being written
0930: 20 74 6f 20 6f 72 20 72 65 61 64 20 66 72 6f 6d   to or read from
0940: 2e 20 55 6e 75 73 65 64 20 62 79 0a 2a 2a 20 20  . Unused by.**  
0950: 20 20 20 20 20 20 20 20 20 61 6c 6c 20 6f 74 68           all oth
0960: 65 72 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  er calls..**.** 
0970: 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66    sqlite3_instvf
0980: 73 20 72 65 73 65 74 20 4e 41 4d 45 0a 2a 2a 0a  s reset NAME.**.
0990: 2a 2a 20 20 20 20 20 20 20 5a 65 72 6f 20 74 68  **       Zero th
09a0: 65 20 69 6e 74 65 72 6e 61 6c 20 65 76 65 6e 74  e internal event
09b0: 20 63 6f 75 6e 74 65 72 73 20 61 73 73 6f 63 69   counters associ
09c0: 61 74 65 64 20 77 69 74 68 20 76 66 73 20 24 4e  ated with vfs $N
09d0: 41 4d 45 2c 20 0a 2a 2a 20 20 20 20 20 20 20 77  AME, .**       w
09e0: 68 69 63 68 20 6d 75 73 74 20 68 61 76 65 20 62  hich must have b
09f0: 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20 61  een created by a
0a00: 6e 20 65 61 72 6c 69 65 72 20 69 6e 76 6f 63 61  n earlier invoca
0a10: 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 20 20 20 20  tion of .**     
0a20: 20 20 5b 73 71 6c 69 74 65 33 5f 69 6e 73 74 76    [sqlite3_instv
0a30: 66 73 20 63 72 65 61 74 65 5d 2e 0a 2a 2a 0a 2a  fs create]..**.*
0a40: 2a 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 74  *   sqlite3_inst
0a50: 76 66 73 20 72 65 70 6f 72 74 20 4e 41 4d 45 0a  vfs report NAME.
0a60: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74 75  **.**       Retu
0a70: 72 6e 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  rn the values of
0a80: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 65 76   the internal ev
0a90: 65 6e 74 20 63 6f 75 6e 74 65 72 73 20 61 73 73  ent counters ass
0aa0: 6f 63 69 61 74 65 64 20 0a 2a 2a 20 20 20 20 20  ociated .**     
0ab0: 20 20 77 69 74 68 20 76 66 73 20 24 4e 41 4d 45    with vfs $NAME
0ac0: 2e 20 54 68 65 20 72 65 70 6f 72 74 20 66 6f 72  . The report for
0ad0: 6d 61 74 20 69 73 20 61 20 6c 69 73 74 20 77 69  mat is a list wi
0ae0: 74 68 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 0a 2a  th one element.*
0af0: 2a 20 20 20 20 20 20 20 66 6f 72 20 65 61 63 68  *       for each
0b00: 20 6d 65 74 68 6f 64 20 63 61 6c 6c 20 28 78 57   method call (xW
0b10: 72 69 74 65 2c 20 78 52 65 61 64 20 65 74 63 2e  rite, xRead etc.
0b20: 29 2e 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20  ). Each element 
0b30: 69 73 0a 2a 2a 20 20 20 20 20 20 20 69 74 73 65  is.**       itse
0b40: 6c 66 20 61 20 6c 69 73 74 20 77 69 74 68 20 74  lf a list with t
0b50: 68 72 65 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a  hree elements:.*
0b60: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 2a 20 54  *.**         * T
0b70: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6d  he name of the m
0b80: 65 74 68 6f 64 20 63 61 6c 6c 20 2d 20 69 2e 65  ethod call - i.e
0b90: 2e 20 22 78 57 72 69 74 65 22 2c 0a 2a 2a 20 20  . "xWrite",.**  
0ba0: 20 20 20 20 20 20 20 2a 20 54 68 65 20 74 6f 74         * The tot
0bb0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c  al number of cal
0bc0: 6c 73 20 74 6f 20 74 68 65 20 6d 65 74 68 6f 64  ls to the method
0bd0: 20 28 61 6e 20 69 6e 74 65 67 65 72 29 2e 0a 2a   (an integer)..*
0be0: 2a 20 20 20 20 20 20 20 20 20 2a 20 54 68 65 20  *         * The 
0bf0: 61 67 67 72 65 67 61 74 65 20 74 69 6d 65 20 63  aggregate time c
0c00: 6f 6e 73 75 6d 65 64 20 62 79 20 61 6c 6c 20 63  onsumed by all c
0c10: 61 6c 6c 73 20 74 6f 20 74 68 65 20 6d 65 74 68  alls to the meth
0c20: 6f 64 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 20  od as.**        
0c30: 20 20 20 6d 65 61 73 75 72 65 64 20 62 79 20 73     measured by s
0c40: 71 6c 69 74 65 33 48 77 74 69 6d 65 28 29 20 28  qlite3Hwtime() (
0c50: 61 6e 20 69 6e 74 65 67 65 72 29 2e 0a 2a 2f 0a  an integer)..*/.
0c60: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0c70: 65 33 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  e3.h".#include <
0c80: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
0c90: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 2f  de <assert.h>../
0ca0: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74  *.** Maximum pat
0cb0: 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 73 75 70  hname length sup
0cc0: 70 6f 72 74 65 64 20 62 79 20 74 68 65 20 69 6e  ported by the in
0cd0: 73 74 20 62 61 63 6b 65 6e 64 2e 0a 2a 2f 0a 23  st backend..*/.#
0ce0: 64 65 66 69 6e 65 20 49 4e 53 54 5f 4d 41 58 5f  define INST_MAX_
0cf0: 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a 0a 2f  PATHNAME 512.../
0d00: 2a 20 46 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a  * File methods *
0d10: 2f 0a 2f 2a 20 56 66 73 20 6d 65 74 68 6f 64 73  /./* Vfs methods
0d20: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 53 5f 41   */.#define OS_A
0d30: 43 43 45 53 53 20 20 20 20 20 20 20 20 20 20 20  CCESS           
0d40: 20 31 0a 23 64 65 66 69 6e 65 20 4f 53 5f 43 48   1.#define OS_CH
0d50: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 20  ECKRESERVEDLOCK 
0d60: 32 0a 23 64 65 66 69 6e 65 20 4f 53 5f 43 4c 4f  2.#define OS_CLO
0d70: 53 45 20 20 20 20 20 20 20 20 20 20 20 20 20 33  SE             3
0d80: 0a 23 64 65 66 69 6e 65 20 4f 53 5f 43 55 52 52  .#define OS_CURR
0d90: 45 4e 54 54 49 4d 45 20 20 20 20 20 20 20 34 0a  ENTTIME       4.
0da0: 23 64 65 66 69 6e 65 20 4f 53 5f 44 45 4c 45 54  #define OS_DELET
0db0: 45 20 20 20 20 20 20 20 20 20 20 20 20 35 0a 23  E            5.#
0dc0: 64 65 66 69 6e 65 20 4f 53 5f 44 45 56 43 48 41  define OS_DEVCHA
0dd0: 52 20 20 20 20 20 20 20 20 20 20 20 36 0a 23 64  R           6.#d
0de0: 65 66 69 6e 65 20 4f 53 5f 46 49 4c 45 43 4f 4e  efine OS_FILECON
0df0: 54 52 4f 4c 20 20 20 20 20 20 20 37 0a 23 64 65  TROL       7.#de
0e00: 66 69 6e 65 20 4f 53 5f 46 49 4c 45 53 49 5a 45  fine OS_FILESIZE
0e10: 20 20 20 20 20 20 20 20 20 20 38 0a 23 64 65 66            8.#def
0e20: 69 6e 65 20 4f 53 5f 46 55 4c 4c 50 41 54 48 4e  ine OS_FULLPATHN
0e30: 41 4d 45 20 20 20 20 20 20 39 0a 23 64 65 66 69  AME      9.#defi
0e40: 6e 65 20 4f 53 5f 4c 4f 43 4b 20 20 20 20 20 20  ne OS_LOCK      
0e50: 20 20 20 20 20 20 20 20 31 31 0a 23 64 65 66 69          11.#defi
0e60: 6e 65 20 4f 53 5f 4f 50 45 4e 20 20 20 20 20 20  ne OS_OPEN      
0e70: 20 20 20 20 20 20 20 20 31 32 0a 23 64 65 66 69          12.#defi
0e80: 6e 65 20 4f 53 5f 52 41 4e 44 4f 4d 4e 45 53 53  ne OS_RANDOMNESS
0e90: 20 20 20 20 20 20 20 20 31 33 0a 23 64 65 66 69          13.#defi
0ea0: 6e 65 20 4f 53 5f 52 45 41 44 20 20 20 20 20 20  ne OS_READ      
0eb0: 20 20 20 20 20 20 20 20 31 34 20 0a 23 64 65 66          14 .#def
0ec0: 69 6e 65 20 4f 53 5f 53 45 43 54 4f 52 53 49 5a  ine OS_SECTORSIZ
0ed0: 45 20 20 20 20 20 20 20 20 31 35 0a 23 64 65 66  E        15.#def
0ee0: 69 6e 65 20 4f 53 5f 53 4c 45 45 50 20 20 20 20  ine OS_SLEEP    
0ef0: 20 20 20 20 20 20 20 20 20 31 36 0a 23 64 65 66           16.#def
0f00: 69 6e 65 20 4f 53 5f 53 59 4e 43 20 20 20 20 20  ine OS_SYNC     
0f10: 20 20 20 20 20 20 20 20 20 31 37 0a 23 64 65 66           17.#def
0f20: 69 6e 65 20 4f 53 5f 54 52 55 4e 43 41 54 45 20  ine OS_TRUNCATE 
0f30: 20 20 20 20 20 20 20 20 20 31 38 0a 23 64 65 66           18.#def
0f40: 69 6e 65 20 4f 53 5f 55 4e 4c 4f 43 4b 20 20 20  ine OS_UNLOCK   
0f50: 20 20 20 20 20 20 20 20 20 31 39 0a 23 64 65 66           19.#def
0f60: 69 6e 65 20 4f 53 5f 57 52 49 54 45 20 20 20 20  ine OS_WRITE    
0f70: 20 20 20 20 20 20 20 20 20 32 30 0a 0a 23 64 65           20..#de
0f80: 66 69 6e 65 20 4f 53 5f 4e 55 4d 45 56 45 4e 54  fine OS_NUMEVENT
0f90: 53 20 20 20 20 20 20 20 20 20 32 31 0a 0a 23 64  S         21..#d
0fa0: 65 66 69 6e 65 20 42 49 4e 41 52 59 4c 4f 47 5f  efine BINARYLOG_
0fb0: 53 54 52 49 4e 47 20 20 20 20 20 33 30 0a 23 64  STRING     30.#d
0fc0: 65 66 69 6e 65 20 42 49 4e 41 52 59 4c 4f 47 5f  efine BINARYLOG_
0fd0: 4d 41 52 4b 45 52 20 20 20 20 20 33 31 0a 0a 23  MARKER     31..#
0fe0: 64 65 66 69 6e 65 20 42 49 4e 41 52 59 4c 4f 47  define BINARYLOG
0ff0: 5f 50 52 45 50 41 52 45 5f 56 32 20 36 34 0a 23  _PREPARE_V2 64.#
1000: 64 65 66 69 6e 65 20 42 49 4e 41 52 59 4c 4f 47  define BINARYLOG
1010: 5f 53 54 45 50 20 20 20 20 20 20 20 36 35 0a 23  _STEP       65.#
1020: 64 65 66 69 6e 65 20 42 49 4e 41 52 59 4c 4f 47  define BINARYLOG
1030: 5f 46 49 4e 41 4c 49 5a 45 20 20 20 36 36 0a 0a  _FINALIZE   66..
1040: 73 74 72 75 63 74 20 49 6e 73 74 56 66 73 20 7b  struct InstVfs {
1050: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 62  .  sqlite3_vfs b
1060: 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ase;.  sqlite3_v
1070: 66 73 20 2a 70 56 66 73 3b 0a 0a 20 20 76 6f 69  fs *pVfs;..  voi
1080: 64 20 2a 70 43 6c 69 65 6e 74 3b 0a 20 20 76 6f  d *pClient;.  vo
1090: 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 20  id (*xDel)(void 
10a0: 2a 29 3b 0a 20 20 76 6f 69 64 20 28 2a 78 43 61  *);.  void (*xCa
10b0: 6c 6c 29 28 76 6f 69 64 20 2a 2c 20 69 6e 74 2c  ll)(void *, int,
10c0: 20 69 6e 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e   int, sqlite3_in
10d0: 74 36 34 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20  t64, int, const 
10e0: 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20 69 6e 74  char *, int, int
10f0: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  , sqlite3_int64)
1100: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 65 72 73  ;..  /* Counters
1110: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1120: 74 36 34 20 61 54 69 6d 65 5b 4f 53 5f 4e 55 4d  t64 aTime[OS_NUM
1130: 45 56 45 4e 54 53 5d 3b 0a 20 20 69 6e 74 20 61  EVENTS];.  int a
1140: 43 6f 75 6e 74 5b 4f 53 5f 4e 55 4d 45 56 45 4e  Count[OS_NUMEVEN
1150: 54 53 5d 3b 0a 0a 20 20 69 6e 74 20 69 4e 65 78  TS];..  int iNex
1160: 74 46 69 6c 65 49 64 3b 0a 7d 3b 0a 74 79 70 65  tFileId;.};.type
1170: 64 65 66 20 73 74 72 75 63 74 20 49 6e 73 74 56  def struct InstV
1180: 66 73 20 49 6e 73 74 56 66 73 3b 0a 0a 23 64 65  fs InstVfs;..#de
1190: 66 69 6e 65 20 52 45 41 4c 56 46 53 28 70 29 20  fine REALVFS(p) 
11a0: 28 28 28 49 6e 73 74 56 66 73 20 2a 29 28 70 29  (((InstVfs *)(p)
11b0: 29 2d 3e 70 56 66 73 29 0a 0a 74 79 70 65 64 65  )->pVfs)..typede
11c0: 66 20 73 74 72 75 63 74 20 69 6e 73 74 5f 66 69  f struct inst_fi
11d0: 6c 65 20 69 6e 73 74 5f 66 69 6c 65 3b 0a 73 74  le inst_file;.st
11e0: 72 75 63 74 20 69 6e 73 74 5f 66 69 6c 65 20 7b  ruct inst_file {
11f0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1200: 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  base;.  sqlite3_
1210: 66 69 6c 65 20 2a 70 52 65 61 6c 3b 0a 20 20 49  file *pReal;.  I
1220: 6e 73 74 56 66 73 20 2a 70 49 6e 73 74 56 66 73  nstVfs *pInstVfs
1230: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1240: 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 46 69  zName;.  int iFi
1250: 6c 65 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  leId;           
1260: 20 20 20 20 2f 2a 20 46 69 6c 65 20 69 64 20 6e      /* File id n
1270: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66  umber */.  int f
1280: 6c 61 67 73 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  lags;.};../*.** 
1290: 4d 65 74 68 6f 64 20 64 65 63 6c 61 72 61 74 69  Method declarati
12a0: 6f 6e 73 20 66 6f 72 20 69 6e 73 74 5f 66 69 6c  ons for inst_fil
12b0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
12c0: 20 69 6e 73 74 43 6c 6f 73 65 28 73 71 6c 69 74   instClose(sqlit
12d0: 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69  e3_file*);.stati
12e0: 63 20 69 6e 74 20 69 6e 73 74 52 65 61 64 28 73  c int instRead(s
12f0: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 76 6f  qlite3_file*, vo
1300: 69 64 2a 2c 20 69 6e 74 20 69 41 6d 74 2c 20 73  id*, int iAmt, s
1310: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66  qlite3_int64 iOf
1320: 73 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  st);.static int 
1330: 69 6e 73 74 57 72 69 74 65 28 73 71 6c 69 74 65  instWrite(sqlite
1340: 33 5f 66 69 6c 65 2a 2c 63 6f 6e 73 74 20 76 6f  3_file*,const vo
1350: 69 64 2a 2c 69 6e 74 20 69 41 6d 74 2c 20 73 71  id*,int iAmt, sq
1360: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 73  lite3_int64 iOfs
1370: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69  t);.static int i
1380: 6e 73 74 54 72 75 6e 63 61 74 65 28 73 71 6c 69  nstTruncate(sqli
1390: 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69 74  te3_file*, sqlit
13a0: 65 33 5f 69 6e 74 36 34 20 73 69 7a 65 29 3b 0a  e3_int64 size);.
13b0: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 53  static int instS
13c0: 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ync(sqlite3_file
13d0: 2a 2c 20 69 6e 74 20 66 6c 61 67 73 29 3b 0a 73  *, int flags);.s
13e0: 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 46 69  tatic int instFi
13f0: 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
1400: 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e  ile*, sqlite3_in
1410: 74 36 34 20 2a 70 53 69 7a 65 29 3b 0a 73 74 61  t64 *pSize);.sta
1420: 74 69 63 20 69 6e 74 20 69 6e 73 74 4c 6f 63 6b  tic int instLock
1430: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
1440: 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
1450: 20 69 6e 73 74 55 6e 6c 6f 63 6b 28 73 71 6c 69   instUnlock(sqli
1460: 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b  te3_file*, int);
1470: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74  .static int inst
1480: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1490: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
14a0: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 3b 0a   int *pResOut);.
14b0: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 46  static int instF
14c0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
14d0: 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 6f 70  e3_file*, int op
14e0: 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 3b 0a 73  , void *pArg);.s
14f0: 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 53 65  tatic int instSe
1500: 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
1510: 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20  _file*);.static 
1520: 69 6e 74 20 69 6e 73 74 44 65 76 69 63 65 43 68  int instDeviceCh
1530: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
1540: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 0a 2f  lite3_file*);../
1550: 2a 0a 2a 2a 20 4d 65 74 68 6f 64 20 64 65 63 6c  *.** Method decl
1560: 61 72 61 74 69 6f 6e 73 20 66 6f 72 20 69 6e 73  arations for ins
1570: 74 5f 76 66 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  t_vfs..*/.static
1580: 20 69 6e 74 20 69 6e 73 74 4f 70 65 6e 28 73 71   int instOpen(sq
1590: 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73  lite3_vfs*, cons
15a0: 74 20 63 68 61 72 20 2a 2c 20 73 71 6c 69 74 65  t char *, sqlite
15b0: 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 2c 20 69  3_file*, int , i
15c0: 6e 74 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  nt *);.static in
15d0: 74 20 69 6e 73 74 44 65 6c 65 74 65 28 73 71 6c  t instDelete(sql
15e0: 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74  ite3_vfs*, const
15f0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
1600: 74 20 73 79 6e 63 44 69 72 29 3b 0a 73 74 61 74  t syncDir);.stat
1610: 69 63 20 69 6e 74 20 69 6e 73 74 41 63 63 65 73  ic int instAcces
1620: 73 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20  s(sqlite3_vfs*, 
1630: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1640: 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e  e, int flags, in
1650: 74 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  t *);.static int
1660: 20 69 6e 73 74 46 75 6c 6c 50 61 74 68 6e 61 6d   instFullPathnam
1670: 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20  e(sqlite3_vfs*, 
1680: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1690: 65 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 7a 4f  e, int, char *zO
16a0: 75 74 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  ut);.static void
16b0: 20 2a 69 6e 73 74 44 6c 4f 70 65 6e 28 73 71 6c   *instDlOpen(sql
16c0: 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74  ite3_vfs*, const
16d0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
16e0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  );.static void i
16f0: 6e 73 74 44 6c 45 72 72 6f 72 28 73 71 6c 69 74  nstDlError(sqlit
1700: 65 33 5f 76 66 73 2a 2c 20 69 6e 74 20 6e 42 79  e3_vfs*, int nBy
1710: 74 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  te, char *zErrMs
1720: 67 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  g);.static void 
1730: 28 2a 69 6e 73 74 44 6c 53 79 6d 28 73 71 6c 69  (*instDlSym(sqli
1740: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76  te3_vfs *pVfs, v
1750: 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  oid *p, const ch
1760: 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 3b  ar*zSym))(void);
1770: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73  .static void ins
1780: 74 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  tDlClose(sqlite3
1790: 5f 76 66 73 2a 2c 20 76 6f 69 64 2a 29 3b 0a 73  _vfs*, void*);.s
17a0: 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 52 61  tatic int instRa
17b0: 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33  ndomness(sqlite3
17c0: 5f 76 66 73 2a 2c 20 69 6e 74 20 6e 42 79 74 65  _vfs*, int nByte
17d0: 2c 20 63 68 61 72 20 2a 7a 4f 75 74 29 3b 0a 73  , char *zOut);.s
17e0: 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 53 6c  tatic int instSl
17f0: 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 2a  eep(sqlite3_vfs*
1800: 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e  , int microsecon
1810: 64 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  ds);.static int 
1820: 69 6e 73 74 43 75 72 72 65 6e 74 54 69 6d 65 28  instCurrentTime(
1830: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 64 6f  sqlite3_vfs*, do
1840: 75 62 6c 65 2a 29 3b 0a 0a 73 74 61 74 69 63 20  uble*);..static 
1850: 76 6f 69 64 20 62 69 6e 61 72 79 6c 6f 67 5f 62  void binarylog_b
1860: 6c 6f 62 28 73 71 6c 69 74 65 33 5f 76 66 73 20  lob(sqlite3_vfs 
1870: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c  *, const char *,
1880: 20 69 6e 74 2c 20 69 6e 74 29 3b 20 0a 0a 73 74   int, int); ..st
1890: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
18a0: 20 69 6e 73 74 5f 76 66 73 20 3d 20 7b 0a 20 20   inst_vfs = {.  
18b0: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
18c0: 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
18d0: 69 6f 6e 20 2a 2f 0a 20 20 73 69 7a 65 6f 66 28  ion */.  sizeof(
18e0: 69 6e 73 74 5f 66 69 6c 65 29 2c 20 20 20 20 20  inst_file),     
18f0: 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
1900: 20 20 49 4e 53 54 5f 4d 41 58 5f 50 41 54 48 4e    INST_MAX_PATHN
1910: 41 4d 45 2c 20 20 20 20 20 20 2f 2a 20 6d 78 50  AME,      /* mxP
1920: 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20  athname */.  0, 
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1940: 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f       /* pNext */
1950: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
1960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e             /* zN
1970: 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ame */.  0,     
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a   /* pAppData */.
19a0: 20 20 69 6e 73 74 4f 70 65 6e 2c 20 20 20 20 20    instOpen,     
19b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70            /* xOp
19c0: 65 6e 20 2a 2f 0a 20 20 69 6e 73 74 44 65 6c 65  en */.  instDele
19d0: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
19e0: 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20  /* xDelete */.  
19f0: 69 6e 73 74 41 63 63 65 73 73 2c 20 20 20 20 20  instAccess,     
1a00: 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65          /* xAcce
1a10: 73 73 20 2a 2f 0a 20 20 69 6e 73 74 46 75 6c 6c  ss */.  instFull
1a20: 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 20 20  Pathname,       
1a30: 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
1a40: 20 2a 2f 0a 20 20 69 6e 73 74 44 6c 4f 70 65 6e   */.  instDlOpen
1a50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1a60: 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 69 6e   xDlOpen */.  in
1a70: 73 74 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  stDlError,      
1a80: 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f        /* xDlErro
1a90: 72 20 2a 2f 0a 20 20 69 6e 73 74 44 6c 53 79 6d  r */.  instDlSym
1aa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1ab0: 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 69 6e  * xDlSym */.  in
1ac0: 73 74 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20  stDlClose,      
1ad0: 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
1ae0: 65 20 2a 2f 0a 20 20 69 6e 73 74 52 61 6e 64 6f  e */.  instRando
1af0: 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20 2f  mness,         /
1b00: 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
1b10: 0a 20 20 69 6e 73 74 53 6c 65 65 70 2c 20 20 20  .  instSleep,   
1b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1b30: 6c 65 65 70 20 2a 2f 0a 20 20 69 6e 73 74 43 75  leep */.  instCu
1b40: 72 72 65 6e 74 54 69 6d 65 20 20 20 20 20 20 20  rrentTime       
1b50: 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
1b60: 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  e */.};..static 
1b70: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1b80: 64 73 20 69 6e 73 74 5f 69 6f 5f 6d 65 74 68 6f  ds inst_io_metho
1b90: 64 73 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20  ds = {.  1,     
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb0: 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
1bc0: 6f 6e 20 2a 2f 0a 20 20 69 6e 73 74 43 6c 6f 73  on */.  instClos
1bd0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1be0: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
1bf0: 65 20 2a 2f 0a 20 20 69 6e 73 74 52 65 61 64 2c  e */.  instRead,
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c10: 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
1c20: 2a 2f 0a 20 20 69 6e 73 74 57 72 69 74 65 2c 20  */.  instWrite, 
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
1c50: 2f 0a 20 20 69 6e 73 74 54 72 75 6e 63 61 74 65  /.  instTruncate
1c60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c70: 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
1c80: 20 2a 2f 0a 20 20 69 6e 73 74 53 79 6e 63 2c 20   */.  instSync, 
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
1cb0: 2f 0a 20 20 69 6e 73 74 46 69 6c 65 53 69 7a 65  /.  instFileSize
1cc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1cd0: 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
1ce0: 20 2a 2f 0a 20 20 69 6e 73 74 4c 6f 63 6b 2c 20   */.  instLock, 
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d00: 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
1d10: 2f 0a 20 20 69 6e 73 74 55 6e 6c 6f 63 6b 2c 20  /.  instUnlock, 
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
1d40: 2f 0a 20 20 69 6e 73 74 43 68 65 63 6b 52 65 73  /.  instCheckRes
1d50: 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20  ervedLock,      
1d60: 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
1d70: 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 69  ervedLock */.  i
1d80: 6e 73 74 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20  nstFileControl, 
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1da0: 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
1db0: 2f 0a 20 20 69 6e 73 74 53 65 63 74 6f 72 53 69  /.  instSectorSi
1dc0: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
1dd0: 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
1de0: 7a 65 20 2a 2f 0a 20 20 69 6e 73 74 44 65 76 69  ze */.  instDevi
1df0: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1e00: 73 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69  s       /* xDevi
1e10: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1e20: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20  s */.};../* .** 
1e30: 68 77 74 69 6d 65 2e 68 20 63 6f 6e 74 61 69 6e  hwtime.h contain
1e40: 73 20 69 6e 6c 69 6e 65 20 61 73 73 65 6d 62 6c  s inline assembl
1e50: 65 72 20 63 6f 64 65 20 66 6f 72 20 69 6d 70 6c  er code for impl
1e60: 65 6d 65 6e 74 69 6e 67 20 0a 2a 2a 20 68 69 67  ementing .** hig
1e70: 68 2d 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 69  h-performance ti
1e80: 6d 69 6e 67 20 72 6f 75 74 69 6e 65 73 2e 0a 2a  ming routines..*
1e90: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 68 77 74 69  /.#include "hwti
1ea0: 6d 65 2e 68 22 0a 0a 23 64 65 66 69 6e 65 20 4f  me.h"..#define O
1eb0: 53 5f 54 49 4d 45 5f 49 4f 28 65 45 76 65 6e 74  S_TIME_IO(eEvent
1ec0: 2c 20 41 2c 20 42 2c 20 43 61 6c 6c 29 20 7b 20  , A, B, Call) { 
1ed0: 20 20 20 20 5c 0a 20 20 69 6e 73 74 5f 66 69 6c      \.  inst_fil
1ee0: 65 20 2a 70 20 3d 20 28 69 6e 73 74 5f 66 69 6c  e *p = (inst_fil
1ef0: 65 20 2a 29 70 46 69 6c 65 3b 20 20 20 20 20 20  e *)pFile;      
1f00: 20 20 20 5c 0a 20 20 49 6e 73 74 56 66 73 20 2a     \.  InstVfs *
1f10: 70 49 6e 73 74 56 66 73 20 3d 20 70 2d 3e 70 49  pInstVfs = p->pI
1f20: 6e 73 74 56 66 73 3b 20 20 20 20 20 20 20 20 20  nstVfs;         
1f30: 20 20 5c 0a 20 20 69 6e 74 20 72 63 3b 20 20 20    \.  int rc;   
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 20 5c 0a 20 20 73 71 6c 69 74 65 5f 75 69 6e 74   \.  sqlite_uint
1f70: 36 34 20 74 20 3d 20 73 71 6c 69 74 65 33 48 77  64 t = sqlite3Hw
1f80: 74 69 6d 65 28 29 3b 20 20 20 20 20 20 20 20 20  time();         
1f90: 5c 0a 20 20 72 63 20 3d 20 43 61 6c 6c 3b 20 20  \.  rc = Call;  
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1fc0: 0a 20 20 74 20 3d 20 73 71 6c 69 74 65 33 48 77  .  t = sqlite3Hw
1fd0: 74 69 6d 65 28 29 20 2d 20 74 3b 20 20 20 20 20  time() - t;     
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1ff0: 20 20 70 49 6e 73 74 56 66 73 2d 3e 61 54 69 6d    pInstVfs->aTim
2000: 65 5b 65 45 76 65 6e 74 5d 20 2b 3d 20 74 3b 20  e[eEvent] += t; 
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2020: 20 70 49 6e 73 74 56 66 73 2d 3e 61 43 6f 75 6e   pInstVfs->aCoun
2030: 74 5b 65 45 76 65 6e 74 5d 20 2b 3d 20 31 3b 20  t[eEvent] += 1; 
2040: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2050: 69 66 28 20 70 49 6e 73 74 56 66 73 2d 3e 78 43  if( pInstVfs->xC
2060: 61 6c 6c 20 29 7b 20 20 20 20 20 20 20 20 20 20  all ){          
2070: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2080: 20 70 49 6e 73 74 56 66 73 2d 3e 78 43 61 6c 6c   pInstVfs->xCall
2090: 28 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (               
20a0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
20b0: 20 20 70 49 6e 73 74 56 66 73 2d 3e 70 43 6c 69    pInstVfs->pCli
20c0: 65 6e 74 2c 65 45 76 65 6e 74 2c 70 2d 3e 69 46  ent,eEvent,p->iF
20d0: 69 6c 65 49 64 2c 74 2c 72 63 2c 70 2d 3e 7a 4e  ileId,t,rc,p->zN
20e0: 61 6d 65 2c 70 2d 3e 66 6c 61 67 73 2c 41 2c 42  ame,p->flags,A,B
20f0: 20 20 5c 0a 20 20 20 20 29 3b 20 20 20 20 20 20    \.    );      
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 5c 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20   \.  }          
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 5c 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  \.  return rc;  
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2180: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4f 53 5f 54  .}..#define OS_T
2190: 49 4d 45 5f 56 46 53 28 65 45 76 65 6e 74 2c 20  IME_VFS(eEvent, 
21a0: 5a 2c 20 66 6c 61 67 73 2c 20 41 2c 20 42 2c 20  Z, flags, A, B, 
21b0: 43 61 6c 6c 29 20 7b 20 20 20 20 20 20 5c 0a 20  Call) {      \. 
21c0: 20 49 6e 73 74 56 66 73 20 2a 70 49 6e 73 74 56   InstVfs *pInstV
21d0: 66 73 20 3d 20 28 49 6e 73 74 56 66 73 20 2a 29  fs = (InstVfs *)
21e0: 70 56 66 73 3b 20 20 20 5c 0a 20 20 69 6e 74 20  pVfs;   \.  int 
21f0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 5c 0a 20 20 73 71 6c 69 74 65 5f 75 69     \.  sqlite_ui
2220: 6e 74 36 34 20 74 20 3d 20 73 71 6c 69 74 65 33  nt64 t = sqlite3
2230: 48 77 74 69 6d 65 28 29 3b 20 20 20 20 20 5c 0a  Hwtime();     \.
2240: 20 20 72 63 20 3d 20 43 61 6c 6c 3b 20 20 20 20    rc = Call;    
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 74 20 3d           \.  t =
2270: 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28 29   sqlite3Hwtime()
2280: 20 2d 20 74 3b 20 20 20 20 20 20 20 20 20 20 20   - t;           
2290: 20 20 20 20 5c 0a 20 20 70 49 6e 73 74 56 66 73      \.  pInstVfs
22a0: 2d 3e 61 54 69 6d 65 5b 65 45 76 65 6e 74 5d 20  ->aTime[eEvent] 
22b0: 2b 3d 20 74 3b 20 20 20 20 20 20 20 20 20 20 5c  += t;          \
22c0: 0a 20 20 70 49 6e 73 74 56 66 73 2d 3e 61 43 6f  .  pInstVfs->aCo
22d0: 75 6e 74 5b 65 45 76 65 6e 74 5d 20 2b 3d 20 31  unt[eEvent] += 1
22e0: 3b 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66  ;         \.  if
22f0: 28 20 70 49 6e 73 74 56 66 73 2d 3e 78 43 61 6c  ( pInstVfs->xCal
2300: 6c 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  l ){            
2310: 20 20 20 20 20 5c 0a 20 20 20 20 70 49 6e 73 74       \.    pInst
2320: 56 66 73 2d 3e 78 43 61 6c 6c 28 70 49 6e 73 74  Vfs->xCall(pInst
2330: 56 66 73 2d 3e 70 43 6c 69 65 6e 74 2c 65 45 76  Vfs->pClient,eEv
2340: 65 6e 74 2c 30 2c 20 74 2c 20 72 63 2c 20 5a 2c  ent,0, t, rc, Z,
2350: 20 66 6c 61 67 73 2c 20 41 2c 20 42 29 3b 20 5c   flags, A, B); \
2360: 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  .  }            
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2380: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65            \.  re
2390: 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20  turn rc;        
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b0: 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20       \.}../*.** 
23c0: 43 6c 6f 73 65 20 61 6e 20 69 6e 73 74 2d 66 69  Close an inst-fi
23d0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
23e0: 74 20 69 6e 73 74 43 6c 6f 73 65 28 73 71 6c 69  t instClose(sqli
23f0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  te3_file *pFile)
2400: 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f  {.  OS_TIME_IO(O
2410: 53 5f 43 4c 4f 53 45 2c 20 30 2c 20 30 2c 20 0a  S_CLOSE, 0, 0, .
2420: 20 20 20 20 28 70 2d 3e 70 52 65 61 6c 2d 3e 70      (p->pReal->p
2430: 4d 65 74 68 6f 64 73 20 3f 20 70 2d 3e 70 52 65  Methods ? p->pRe
2440: 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43  al->pMethods->xC
2450: 6c 6f 73 65 28 70 2d 3e 70 52 65 61 6c 29 20 3a  lose(p->pReal) :
2460: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 29 3b   SQLITE_OK).  );
2470: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
2480: 61 74 61 20 66 72 6f 6d 20 61 6e 20 69 6e 73 74  ata from an inst
2490: 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
24a0: 20 69 6e 74 20 69 6e 73 74 52 65 61 64 28 0a 20   int instRead(. 
24b0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
24c0: 46 69 6c 65 2c 20 0a 20 20 76 6f 69 64 20 2a 7a  File, .  void *z
24d0: 42 75 66 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74  Buf, .  int iAmt
24e0: 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  , .  sqlite_int6
24f0: 34 20 69 4f 66 73 74 0a 29 7b 0a 20 20 73 71 6c  4 iOfst.){.  sql
2500: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
2510: 20 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 29   (sqlite3_vfs *)
2520: 28 28 28 69 6e 73 74 5f 66 69 6c 65 20 2a 29 70  (((inst_file *)p
2530: 46 69 6c 65 29 2d 3e 70 49 6e 73 74 56 66 73 29  File)->pInstVfs)
2540: 3b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f  ;.  OS_TIME_IO(O
2550: 53 5f 52 45 41 44 2c 20 69 41 6d 74 2c 20 28 62  S_READ, iAmt, (b
2560: 69 6e 61 72 79 6c 6f 67 5f 62 6c 6f 62 28 70 56  inarylog_blob(pV
2570: 66 73 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20  fs, zBuf, iAmt, 
2580: 31 29 2c 20 69 4f 66 73 74 29 2c 20 0a 20 20 20  1), iOfst), .   
2590: 20 20 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65     p->pReal->pMe
25a0: 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70 2d 3e  thods->xRead(p->
25b0: 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d  pReal, zBuf, iAm
25c0: 74 2c 20 69 4f 66 73 74 29 0a 20 20 29 3b 0a 7d  t, iOfst).  );.}
25d0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
25e0: 74 61 20 74 6f 20 61 6e 20 69 6e 73 74 2d 66 69  ta to an inst-fi
25f0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
2600: 74 20 69 6e 73 74 57 72 69 74 65 28 0a 20 20 73  t instWrite(.  s
2610: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
2620: 6c 65 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  le,.  const void
2630: 20 2a 7a 2c 0a 20 20 69 6e 74 20 69 41 6d 74 2c   *z,.  int iAmt,
2640: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
2650: 69 4f 66 73 74 0a 29 7b 0a 20 20 73 71 6c 69 74  iOfst.){.  sqlit
2660: 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 28  e3_vfs *pVfs = (
2670: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 29 28 28  sqlite3_vfs *)((
2680: 28 69 6e 73 74 5f 66 69 6c 65 20 2a 29 70 46 69  (inst_file *)pFi
2690: 6c 65 29 2d 3e 70 49 6e 73 74 56 66 73 29 3b 0a  le)->pInstVfs);.
26a0: 20 20 62 69 6e 61 72 79 6c 6f 67 5f 62 6c 6f 62    binarylog_blob
26b0: 28 70 56 66 73 2c 20 7a 2c 20 69 41 6d 74 2c 20  (pVfs, z, iAmt, 
26c0: 31 29 3b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f  1);.  OS_TIME_IO
26d0: 28 4f 53 5f 57 52 49 54 45 2c 20 69 41 6d 74 2c  (OS_WRITE, iAmt,
26e0: 20 69 4f 66 73 74 2c 20 0a 20 20 20 20 20 20 70   iOfst, .      p
26f0: 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
2700: 73 2d 3e 78 57 72 69 74 65 28 70 2d 3e 70 52 65  s->xWrite(p->pRe
2710: 61 6c 2c 20 7a 2c 20 69 41 6d 74 2c 20 69 4f 66  al, z, iAmt, iOf
2720: 73 74 29 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  st).  );.}../*.*
2730: 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 69 6e  * Truncate an in
2740: 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  st-file..*/.stat
2750: 69 63 20 69 6e 74 20 69 6e 73 74 54 72 75 6e 63  ic int instTrunc
2760: 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ate(sqlite3_file
2770: 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f   *pFile, sqlite_
2780: 69 6e 74 36 34 20 73 69 7a 65 29 7b 0a 20 20 4f  int64 size){.  O
2790: 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f 54 52 55  S_TIME_IO(OS_TRU
27a0: 4e 43 41 54 45 2c 20 30 2c 20 28 69 6e 74 29 73  NCATE, 0, (int)s
27b0: 69 7a 65 2c 20 0a 20 20 20 20 70 2d 3e 70 52 65  ize, .    p->pRe
27c0: 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 54  al->pMethods->xT
27d0: 72 75 6e 63 61 74 65 28 70 2d 3e 70 52 65 61 6c  runcate(p->pReal
27e0: 2c 20 73 69 7a 65 29 0a 20 20 29 3b 0a 7d 0a 0a  , size).  );.}..
27f0: 2f 2a 0a 2a 2a 20 53 79 6e 63 20 61 6e 20 69 6e  /*.** Sync an in
2800: 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  st-file..*/.stat
2810: 69 63 20 69 6e 74 20 69 6e 73 74 53 79 6e 63 28  ic int instSync(
2820: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
2830: 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ile, int flags){
2840: 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f 53  .  OS_TIME_IO(OS
2850: 5f 53 59 4e 43 2c 20 66 6c 61 67 73 2c 20 30 2c  _SYNC, flags, 0,
2860: 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68   p->pReal->pMeth
2870: 6f 64 73 2d 3e 78 53 79 6e 63 28 70 2d 3e 70 52  ods->xSync(p->pR
2880: 65 61 6c 2c 20 66 6c 61 67 73 29 29 3b 0a 7d 0a  eal, flags));.}.
2890: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
28a0: 65 20 63 75 72 72 65 6e 74 20 66 69 6c 65 2d 73  e current file-s
28b0: 69 7a 65 20 6f 66 20 61 6e 20 69 6e 73 74 2d 66  ize of an inst-f
28c0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
28d0: 6e 74 20 69 6e 73 74 46 69 6c 65 53 69 7a 65 28  nt instFileSize(
28e0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
28f0: 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36  ile, sqlite_int6
2900: 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 4f 53 5f  4 *pSize){.  OS_
2910: 54 49 4d 45 5f 49 4f 28 4f 53 5f 46 49 4c 45 53  TIME_IO(OS_FILES
2920: 49 5a 45 2c 20 28 69 6e 74 29 28 2a 70 53 69 7a  IZE, (int)(*pSiz
2930: 65 29 2c 20 30 2c 20 0a 20 20 20 20 70 2d 3e 70  e), 0, .    p->p
2940: 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
2950: 78 46 69 6c 65 53 69 7a 65 28 70 2d 3e 70 52 65  xFileSize(p->pRe
2960: 61 6c 2c 20 70 53 69 7a 65 29 0a 20 20 29 3b 0a  al, pSize).  );.
2970: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 6e  }../*.** Lock an
2980: 20 69 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73   inst-file..*/.s
2990: 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 4c 6f  tatic int instLo
29a0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
29b0: 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63  *pFile, int eLoc
29c0: 6b 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f  k){.  OS_TIME_IO
29d0: 28 4f 53 5f 4c 4f 43 4b 2c 20 65 4c 6f 63 6b 2c  (OS_LOCK, eLock,
29e0: 20 30 2c 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d   0, p->pReal->pM
29f0: 65 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b 28 70 2d  ethods->xLock(p-
2a00: 3e 70 52 65 61 6c 2c 20 65 4c 6f 63 6b 29 29 3b  >pReal, eLock));
2a10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
2a20: 20 61 6e 20 69 6e 73 74 2d 66 69 6c 65 2e 0a 2a   an inst-file..*
2a30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73  /.static int ins
2a40: 74 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  tUnlock(sqlite3_
2a50: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
2a60: 20 65 4c 6f 63 6b 29 7b 0a 20 20 4f 53 5f 54 49   eLock){.  OS_TI
2a70: 4d 45 5f 49 4f 28 4f 53 5f 55 4e 4c 4f 43 4b 2c  ME_IO(OS_UNLOCK,
2a80: 20 65 4c 6f 63 6b 2c 20 30 2c 20 70 2d 3e 70 52   eLock, 0, p->pR
2a90: 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
2aa0: 55 6e 6c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c  Unlock(p->pReal,
2ab0: 20 65 4c 6f 63 6b 29 29 3b 0a 7d 0a 0a 2f 2a 0a   eLock));.}../*.
2ac0: 2a 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 6f 74  ** Check if anot
2ad0: 68 65 72 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20  her file-handle 
2ae0: 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
2af0: 20 6c 6f 63 6b 20 6f 6e 20 61 6e 20 69 6e 73 74   lock on an inst
2b00: 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
2b10: 20 69 6e 74 20 69 6e 73 74 43 68 65 63 6b 52 65   int instCheckRe
2b20: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
2b30: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
2b40: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
2b50: 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f 43   OS_TIME_IO(OS_C
2b60: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
2b70: 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 70  , 0, 0, .      p
2b80: 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
2b90: 73 2d 3e 78 43 68 65 63 6b 52 65 73 65 72 76 65  s->xCheckReserve
2ba0: 64 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20  dLock(p->pReal, 
2bb0: 70 52 65 73 4f 75 74 29 0a 20 20 29 3b 0a 7d 0a  pResOut).  );.}.
2bc0: 0a 2f 2a 0a 2a 2a 20 46 69 6c 65 20 63 6f 6e 74  ./*.** File cont
2bd0: 72 6f 6c 20 6d 65 74 68 6f 64 2e 20 46 6f 72 20  rol method. For 
2be0: 63 75 73 74 6f 6d 20 6f 70 65 72 61 74 69 6f 6e  custom operation
2bf0: 73 20 6f 6e 20 61 6e 20 69 6e 73 74 2d 66 69 6c  s on an inst-fil
2c00: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2c10: 20 69 6e 73 74 46 69 6c 65 43 6f 6e 74 72 6f 6c   instFileControl
2c20: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
2c30: 46 69 6c 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f  File, int op, vo
2c40: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 4f 53 5f  id *pArg){.  OS_
2c50: 54 49 4d 45 5f 49 4f 28 4f 53 5f 46 49 4c 45 43  TIME_IO(OS_FILEC
2c60: 4f 4e 54 52 4f 4c 2c 20 30 2c 20 30 2c 20 70 2d  ONTROL, 0, 0, p-
2c70: 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
2c80: 2d 3e 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  ->xFileControl(p
2c90: 2d 3e 70 52 65 61 6c 2c 20 6f 70 2c 20 70 41 72  ->pReal, op, pAr
2ca0: 67 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  g));.}../*.** Re
2cb0: 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 2d  turn the sector-
2cc0: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 66 6f  size in bytes fo
2cd0: 72 20 61 6e 20 69 6e 73 74 2d 66 69 6c 65 2e 0a  r an inst-file..
2ce0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
2cf0: 73 74 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  stSectorSize(sql
2d00: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
2d10: 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28  ){.  OS_TIME_IO(
2d20: 4f 53 5f 53 45 43 54 4f 52 53 49 5a 45 2c 20 30  OS_SECTORSIZE, 0
2d30: 2c 20 30 2c 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  , 0, p->pReal->p
2d40: 4d 65 74 68 6f 64 73 2d 3e 78 53 65 63 74 6f 72  Methods->xSector
2d50: 53 69 7a 65 28 70 2d 3e 70 52 65 61 6c 29 29 3b  Size(p->pReal));
2d60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2d70: 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72   the device char
2d80: 61 63 74 65 72 69 73 74 69 63 20 66 6c 61 67 73  acteristic flags
2d90: 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 61 6e   supported by an
2da0: 20 69 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73   inst-file..*/.s
2db0: 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 44 65  tatic int instDe
2dc0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
2dd0: 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ics(sqlite3_file
2de0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 4f 53 5f 54   *pFile){.  OS_T
2df0: 49 4d 45 5f 49 4f 28 4f 53 5f 44 45 56 43 48 41  IME_IO(OS_DEVCHA
2e00: 52 2c 20 30 2c 20 30 2c 20 70 2d 3e 70 52 65 61  R, 0, 0, p->pRea
2e10: 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 44 65  l->pMethods->xDe
2e20: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
2e30: 69 63 73 28 70 2d 3e 70 52 65 61 6c 29 29 3b 0a  ics(p->pReal));.
2e40: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e  }../*.** Open an
2e50: 20 69 6e 73 74 20 66 69 6c 65 20 68 61 6e 64 6c   inst file handl
2e60: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2e70: 20 69 6e 73 74 4f 70 65 6e 28 0a 20 20 73 71 6c   instOpen(.  sql
2e80: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a  ite3_vfs *pVfs,.
2e90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
2ea0: 61 6d 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 66  ame,.  sqlite3_f
2eb0: 69 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20 69 6e  ile *pFile,.  in
2ec0: 74 20 66 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a  t flags,.  int *
2ed0: 70 4f 75 74 46 6c 61 67 73 0a 29 7b 0a 20 20 69  pOutFlags.){.  i
2ee0: 6e 73 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28 69  nst_file *p = (i
2ef0: 6e 73 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  nst_file *)pFile
2f00: 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  ;.  pFile->pMeth
2f10: 6f 64 73 20 3d 20 26 69 6e 73 74 5f 69 6f 5f 6d  ods = &inst_io_m
2f20: 65 74 68 6f 64 73 3b 0a 20 20 70 2d 3e 70 52 65  ethods;.  p->pRe
2f30: 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  al = (sqlite3_fi
2f40: 6c 65 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 70 2d  le *)&p[1];.  p-
2f50: 3e 70 49 6e 73 74 56 66 73 20 3d 20 28 49 6e 73  >pInstVfs = (Ins
2f60: 74 56 66 73 20 2a 29 70 56 66 73 3b 0a 20 20 70  tVfs *)pVfs;.  p
2f70: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
2f80: 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 66 6c  .  p->flags = fl
2f90: 61 67 73 3b 0a 20 20 70 2d 3e 69 46 69 6c 65 49  ags;.  p->iFileI
2fa0: 64 20 3d 20 2b 2b 70 2d 3e 70 49 6e 73 74 56 66  d = ++p->pInstVf
2fb0: 73 2d 3e 69 4e 65 78 74 46 69 6c 65 49 64 3b 0a  s->iNextFileId;.
2fc0: 0a 20 20 62 69 6e 61 72 79 6c 6f 67 5f 62 6c 6f  .  binarylog_blo
2fd0: 62 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 2d  b(pVfs, zName, -
2fe0: 31 2c 20 30 29 3b 0a 20 20 4f 53 5f 54 49 4d 45  1, 0);.  OS_TIME
2ff0: 5f 56 46 53 28 4f 53 5f 4f 50 45 4e 2c 20 7a 4e  _VFS(OS_OPEN, zN
3000: 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70 2d 3e 69  ame, flags, p->i
3010: 46 69 6c 65 49 64 2c 20 30 2c 0a 20 20 20 20 52  FileId, 0,.    R
3020: 45 41 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 4f  EALVFS(pVfs)->xO
3030: 70 65 6e 28 52 45 41 4c 56 46 53 28 70 56 66 73  pen(REALVFS(pVfs
3040: 29 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 70 52 65  ), zName, p->pRe
3050: 61 6c 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46  al, flags, pOutF
3060: 6c 61 67 73 29 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a  lags).  );.}../*
3070: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66  .** Delete the f
3080: 69 6c 65 20 6c 6f 63 61 74 65 64 20 61 74 20 7a  ile located at z
3090: 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72  Path. If the dir
30a0: 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73  Sync argument is
30b0: 20 74 72 75 65 2c 0a 2a 2a 20 65 6e 73 75 72 65   true,.** ensure
30c0: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
30d0: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 61   modifications a
30e0: 72 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  re synced to dis
30f0: 6b 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  k before.** retu
3100: 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
3110: 20 69 6e 74 20 69 6e 73 74 44 65 6c 65 74 65 28   int instDelete(
3120: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
3130: 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  s, const char *z
3140: 50 61 74 68 2c 20 69 6e 74 20 64 69 72 53 79 6e  Path, int dirSyn
3150: 63 29 7b 0a 20 20 62 69 6e 61 72 79 6c 6f 67 5f  c){.  binarylog_
3160: 62 6c 6f 62 28 70 56 66 73 2c 20 7a 50 61 74 68  blob(pVfs, zPath
3170: 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 4f 53 5f 54  , -1, 0);.  OS_T
3180: 49 4d 45 5f 56 46 53 28 4f 53 5f 44 45 4c 45 54  IME_VFS(OS_DELET
3190: 45 2c 20 7a 50 61 74 68 2c 20 30 2c 20 64 69 72  E, zPath, 0, dir
31a0: 53 79 6e 63 2c 20 30 2c 0a 20 20 20 20 52 45 41  Sync, 0,.    REA
31b0: 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 44 65 6c  LVFS(pVfs)->xDel
31c0: 65 74 65 28 52 45 41 4c 56 46 53 28 70 56 66 73  ete(REALVFS(pVfs
31d0: 29 2c 20 7a 50 61 74 68 2c 20 64 69 72 53 79 6e  ), zPath, dirSyn
31e0: 63 29 20 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  c) .  );.}../*.*
31f0: 2a 20 54 65 73 74 20 66 6f 72 20 61 63 63 65 73  * Test for acces
3200: 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 20 52  s permissions. R
3210: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
3220: 65 20 72 65 71 75 65 73 74 65 64 20 70 65 72 6d  e requested perm
3230: 69 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 76 61  ission.** is ava
3240: 69 6c 61 62 6c 65 2c 20 6f 72 20 66 61 6c 73 65  ilable, or false
3250: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
3260: 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 41 63  tatic int instAc
3270: 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
3280: 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f  vfs *pVfs, .  co
3290: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
32a0: 20 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 0a   .  int flags, .
32b0: 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 0a 29    int *pResOut.)
32c0: 7b 0a 20 20 62 69 6e 61 72 79 6c 6f 67 5f 62 6c  {.  binarylog_bl
32d0: 6f 62 28 70 56 66 73 2c 20 7a 50 61 74 68 2c 20  ob(pVfs, zPath, 
32e0: 2d 31 2c 20 30 29 3b 0a 20 20 4f 53 5f 54 49 4d  -1, 0);.  OS_TIM
32f0: 45 5f 56 46 53 28 4f 53 5f 41 43 43 45 53 53 2c  E_VFS(OS_ACCESS,
3300: 20 7a 50 61 74 68 2c 20 30 2c 20 66 6c 61 67 73   zPath, 0, flags
3310: 2c 20 2a 70 52 65 73 4f 75 74 2c 20 0a 20 20 20  , *pResOut, .   
3320: 20 52 45 41 4c 56 46 53 28 70 56 66 73 29 2d 3e   REALVFS(pVfs)->
3330: 78 41 63 63 65 73 73 28 52 45 41 4c 56 46 53 28  xAccess(REALVFS(
3340: 70 56 66 73 29 2c 20 7a 50 61 74 68 2c 20 66 6c  pVfs), zPath, fl
3350: 61 67 73 2c 20 70 52 65 73 4f 75 74 29 20 0a 20  ags, pResOut) . 
3360: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70   );.}../*.** Pop
3370: 75 6c 61 74 65 20 62 75 66 66 65 72 20 7a 4f 75  ulate buffer zOu
3380: 74 20 77 69 74 68 20 74 68 65 20 66 75 6c 6c 20  t with the full 
3390: 63 61 6e 6f 6e 69 63 61 6c 20 70 61 74 68 6e 61  canonical pathna
33a0: 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  me corresponding
33b0: 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 74 68 6e  .** to the pathn
33c0: 61 6d 65 20 69 6e 20 7a 50 61 74 68 2e 20 7a 4f  ame in zPath. zO
33d0: 75 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ut is guaranteed
33e0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
33f0: 75 66 66 65 72 0a 2a 2a 20 6f 66 20 61 74 20 6c  uffer.** of at l
3400: 65 61 73 74 20 28 49 4e 53 54 5f 4d 41 58 5f 50  east (INST_MAX_P
3410: 41 54 48 4e 41 4d 45 2b 31 29 20 62 79 74 65 73  ATHNAME+1) bytes
3420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3430: 69 6e 73 74 46 75 6c 6c 50 61 74 68 6e 61 6d 65  instFullPathname
3440: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
3450: 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20  *pVfs, .  const 
3460: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20  char *zPath, .  
3470: 69 6e 74 20 6e 4f 75 74 2c 20 0a 20 20 63 68 61  int nOut, .  cha
3480: 72 20 2a 7a 4f 75 74 0a 29 7b 0a 20 20 4f 53 5f  r *zOut.){.  OS_
3490: 54 49 4d 45 5f 56 46 53 28 20 4f 53 5f 46 55 4c  TIME_VFS( OS_FUL
34a0: 4c 50 41 54 48 4e 41 4d 45 2c 20 7a 50 61 74 68  LPATHNAME, zPath
34b0: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 52  , 0, 0, 0,.    R
34c0: 45 41 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 46  EALVFS(pVfs)->xF
34d0: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 52 45 41 4c  ullPathname(REAL
34e0: 56 46 53 28 70 56 66 73 29 2c 20 7a 50 61 74 68  VFS(pVfs), zPath
34f0: 2c 20 6e 4f 75 74 2c 20 7a 4f 75 74 29 3b 0a 20  , nOut, zOut);. 
3500: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65   );.}../*.** Ope
3510: 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69  n the dynamic li
3520: 62 72 61 72 79 20 6c 6f 63 61 74 65 64 20 61 74  brary located at
3530: 20 7a 50 61 74 68 20 61 6e 64 20 72 65 74 75 72   zPath and retur
3540: 6e 20 61 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  n a handle..*/.s
3550: 74 61 74 69 63 20 76 6f 69 64 20 2a 69 6e 73 74  tatic void *inst
3560: 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
3570: 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20  fs *pVfs, const 
3580: 63 68 61 72 20 2a 7a 50 61 74 68 29 7b 0a 20 20  char *zPath){.  
3590: 72 65 74 75 72 6e 20 52 45 41 4c 56 46 53 28 70  return REALVFS(p
35a0: 56 66 73 29 2d 3e 78 44 6c 4f 70 65 6e 28 52 45  Vfs)->xDlOpen(RE
35b0: 41 4c 56 46 53 28 70 56 66 73 29 2c 20 7a 50 61  ALVFS(pVfs), zPa
35c0: 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f  th);.}../*.** Po
35d0: 70 75 6c 61 74 65 20 74 68 65 20 62 75 66 66 65  pulate the buffe
35e0: 72 20 7a 45 72 72 4d 73 67 20 28 73 69 7a 65 20  r zErrMsg (size 
35f0: 6e 42 79 74 65 20 62 79 74 65 73 29 20 77 69 74  nByte bytes) wit
3600: 68 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62  h a human readab
3610: 6c 65 0a 2a 2a 20 75 74 66 2d 38 20 73 74 72 69  le.** utf-8 stri
3620: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ng describing th
3630: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72  e most recent er
3640: 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ror encountered 
3650: 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77  associated .** w
3660: 69 74 68 20 64 79 6e 61 6d 69 63 20 6c 69 62 72  ith dynamic libr
3670: 61 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  aries..*/.static
3680: 20 76 6f 69 64 20 69 6e 73 74 44 6c 45 72 72 6f   void instDlErro
3690: 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
36a0: 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  Vfs, int nByte, 
36b0: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 29 7b 0a  char *zErrMsg){.
36c0: 20 20 52 45 41 4c 56 46 53 28 70 56 66 73 29 2d    REALVFS(pVfs)-
36d0: 3e 78 44 6c 45 72 72 6f 72 28 52 45 41 4c 56 46  >xDlError(REALVF
36e0: 53 28 70 56 66 73 29 2c 20 6e 42 79 74 65 2c 20  S(pVfs), nByte, 
36f0: 7a 45 72 72 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a  zErrMsg);.}../*.
3700: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
3710: 74 65 72 20 74 6f 20 74 68 65 20 73 79 6d 62 6f  ter to the symbo
3720: 6c 20 7a 53 79 6d 62 6f 6c 20 69 6e 20 74 68 65  l zSymbol in the
3730: 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79   dynamic library
3740: 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61   pHandle..*/.sta
3750: 74 69 63 20 76 6f 69 64 20 28 2a 69 6e 73 74 44  tic void (*instD
3760: 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
3770: 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 2c   *pVfs, void *p,
3780: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79   const char *zSy
3790: 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 72 65 74  m))(void){.  ret
37a0: 75 72 6e 20 52 45 41 4c 56 46 53 28 70 56 66 73  urn REALVFS(pVfs
37b0: 29 2d 3e 78 44 6c 53 79 6d 28 52 45 41 4c 56 46  )->xDlSym(REALVF
37c0: 53 28 70 56 66 73 29 2c 20 70 2c 20 7a 53 79 6d  S(pVfs), p, zSym
37d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
37e0: 65 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69  e the dynamic li
37f0: 62 72 61 72 79 20 68 61 6e 64 6c 65 20 70 48 61  brary handle pHa
3800: 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
3810: 76 6f 69 64 20 69 6e 73 74 44 6c 43 6c 6f 73 65  void instDlClose
3820: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
3830: 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c  fs, void *pHandl
3840: 65 29 7b 0a 20 20 52 45 41 4c 56 46 53 28 70 56  e){.  REALVFS(pV
3850: 66 73 29 2d 3e 78 44 6c 43 6c 6f 73 65 28 52 45  fs)->xDlClose(RE
3860: 41 4c 56 46 53 28 70 56 66 73 29 2c 20 70 48 61  ALVFS(pVfs), pHa
3870: 6e 64 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndle);.}../*.** 
3880: 50 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75 66  Populate the buf
3890: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
38a0: 79 20 7a 42 75 66 4f 75 74 20 77 69 74 68 20 6e  y zBufOut with n
38b0: 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 0a 2a  Byte bytes of .*
38c0: 2a 20 72 61 6e 64 6f 6d 20 64 61 74 61 2e 0a 2a  * random data..*
38d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73  /.static int ins
38e0: 74 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69  tRandomness(sqli
38f0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
3900: 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a  nt nByte, char *
3910: 7a 42 75 66 4f 75 74 29 7b 0a 20 20 4f 53 5f 54  zBufOut){.  OS_T
3920: 49 4d 45 5f 56 46 53 28 20 4f 53 5f 52 41 4e 44  IME_VFS( OS_RAND
3930: 4f 4d 4e 45 53 53 2c 20 30 2c 20 30 2c 20 6e 42  OMNESS, 0, 0, nB
3940: 79 74 65 2c 20 30 2c 0a 20 20 20 20 52 45 41 4c  yte, 0,.    REAL
3950: 56 46 53 28 70 56 66 73 29 2d 3e 78 52 61 6e 64  VFS(pVfs)->xRand
3960: 6f 6d 6e 65 73 73 28 52 45 41 4c 56 46 53 28 70  omness(REALVFS(p
3970: 56 66 73 29 2c 20 6e 42 79 74 65 2c 20 7a 42 75  Vfs), nByte, zBu
3980: 66 4f 75 74 29 3b 0a 20 20 29 3b 0a 7d 0a 0a 2f  fOut);.  );.}../
3990: 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 6e  *.** Sleep for n
39a0: 4d 69 63 72 6f 20 6d 69 63 72 6f 73 65 63 6f 6e  Micro microsecon
39b0: 64 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ds. Return the n
39c0: 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
39d0: 63 6f 6e 64 73 20 0a 2a 2a 20 61 63 74 75 61 6c  conds .** actual
39e0: 6c 79 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61  ly slept..*/.sta
39f0: 74 69 63 20 69 6e 74 20 69 6e 73 74 53 6c 65 65  tic int instSlee
3a00: 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  p(sqlite3_vfs *p
3a10: 56 66 73 2c 20 69 6e 74 20 6e 4d 69 63 72 6f 29  Vfs, int nMicro)
3a20: 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 56 46 53 28  {.  OS_TIME_VFS(
3a30: 20 4f 53 5f 53 4c 45 45 50 2c 20 30 2c 20 30 2c   OS_SLEEP, 0, 0,
3a40: 20 6e 4d 69 63 72 6f 2c 20 30 2c 20 0a 20 20 20   nMicro, 0, .   
3a50: 20 52 45 41 4c 56 46 53 28 70 56 66 73 29 2d 3e   REALVFS(pVfs)->
3a60: 78 53 6c 65 65 70 28 52 45 41 4c 56 46 53 28 70  xSleep(REALVFS(p
3a70: 56 66 73 29 2c 20 6e 4d 69 63 72 6f 29 20 0a 20  Vfs), nMicro) . 
3a80: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   );.}../*.** Ret
3a90: 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
3aa0: 74 69 6d 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  time as a Julian
3ab0: 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 20 2a   Day number in *
3ac0: 70 54 69 6d 65 4f 75 74 2e 0a 2a 2f 0a 73 74 61  pTimeOut..*/.sta
3ad0: 74 69 63 20 69 6e 74 20 69 6e 73 74 43 75 72 72  tic int instCurr
3ae0: 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f  entTime(sqlite3_
3af0: 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c  vfs *pVfs, doubl
3b00: 65 20 2a 70 54 69 6d 65 4f 75 74 29 7b 0a 20 20  e *pTimeOut){.  
3b10: 4f 53 5f 54 49 4d 45 5f 56 46 53 28 20 4f 53 5f  OS_TIME_VFS( OS_
3b20: 43 55 52 52 45 4e 54 54 49 4d 45 2c 20 30 2c 20  CURRENTTIME, 0, 
3b30: 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 52 45 41  0, 0, 0,.    REA
3b40: 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 43 75 72  LVFS(pVfs)->xCur
3b50: 72 65 6e 74 54 69 6d 65 28 52 45 41 4c 56 46 53  rentTime(REALVFS
3b60: 28 70 56 66 73 29 2c 20 70 54 69 6d 65 4f 75 74  (pVfs), pTimeOut
3b70: 29 20 0a 20 20 29 3b 0a 7d 0a 0a 73 71 6c 69 74  ) .  );.}..sqlit
3b80: 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 5f  e3_vfs *sqlite3_
3b90: 69 6e 73 74 76 66 73 5f 63 72 65 61 74 65 28 63  instvfs_create(c
3ba0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
3bb0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
3bc0: 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74 20 6e 42  arent){.  int nB
3bd0: 79 74 65 3b 0a 20 20 49 6e 73 74 56 66 73 20 2a  yte;.  InstVfs *
3be0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  p;.  sqlite3_vfs
3bf0: 20 2a 70 50 61 72 65 6e 74 3b 0a 0a 20 20 70 50   *pParent;..  pP
3c00: 61 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  arent = sqlite3_
3c10: 76 66 73 5f 66 69 6e 64 28 7a 50 61 72 65 6e 74  vfs_find(zParent
3c20: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72 65 6e  );.  if( !pParen
3c30: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
3c40: 30 3b 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65 20  0;.  }..  nByte 
3c50: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20  = strlen(zName) 
3c60: 2b 20 31 20 2b 20 73 69 7a 65 6f 66 28 49 6e 73  + 1 + sizeof(Ins
3c70: 74 56 66 73 29 3b 0a 20 20 70 20 3d 20 28 49 6e  tVfs);.  p = (In
3c80: 73 74 56 66 73 20 2a 29 73 71 6c 69 74 65 33 5f  stVfs *)sqlite3_
3c90: 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20  malloc(nByte);. 
3ca0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68   if( p ){.    ch
3cb0: 61 72 20 2a 7a 43 6f 70 79 20 3d 20 28 63 68 61  ar *zCopy = (cha
3cc0: 72 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 6d  r *)&p[1];.    m
3cd0: 65 6d 73 65 74 28 70 2c 20 30 2c 20 6e 42 79 74  emset(p, 0, nByt
3ce0: 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  e);.    memcpy(p
3cf0: 2c 20 26 69 6e 73 74 5f 76 66 73 2c 20 73 69 7a  , &inst_vfs, siz
3d00: 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29  eof(sqlite3_vfs)
3d10: 29 3b 0a 20 20 20 20 70 2d 3e 70 56 66 73 20 3d  );.    p->pVfs =
3d20: 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 6d 65   pParent;.    me
3d30: 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 4e 61 6d  mcpy(zCopy, zNam
3d40: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
3d50: 29 3b 0a 20 20 20 20 70 2d 3e 62 61 73 65 2e 7a  );.    p->base.z
3d60: 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
3d70: 61 72 20 2a 29 7a 43 6f 70 79 3b 0a 20 20 20 20  ar *)zCopy;.    
3d80: 70 2d 3e 62 61 73 65 2e 73 7a 4f 73 46 69 6c 65  p->base.szOsFile
3d90: 20 2b 3d 20 70 50 61 72 65 6e 74 2d 3e 73 7a 4f   += pParent->szO
3da0: 73 46 69 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74  sFile;.    sqlit
3db0: 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
3dc0: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 29 70  (sqlite3_vfs *)p
3dd0: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  , 0);.  }..  ret
3de0: 75 72 6e 20 28 73 71 6c 69 74 65 33 5f 76 66 73  urn (sqlite3_vfs
3df0: 20 2a 29 70 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71   *)p;.}..void sq
3e00: 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 63 6f  lite3_instvfs_co
3e10: 6e 66 69 67 75 72 65 28 0a 20 20 73 71 6c 69 74  nfigure(.  sqlit
3e20: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20  e3_vfs *pVfs,.  
3e30: 76 6f 69 64 20 28 2a 78 43 61 6c 6c 29 28 0a 20  void (*xCall)(. 
3e40: 20 20 20 20 20 76 6f 69 64 2a 2c 20 0a 20 20 20       void*, .   
3e50: 20 20 20 69 6e 74 2c 20 20 20 20 20 20 20 20 20     int,         
3e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e70: 20 20 2f 2a 20 46 69 6c 65 20 69 64 20 2a 2f 0a    /* File id */.
3e80: 20 20 20 20 20 20 69 6e 74 2c 20 20 20 20 20 20        int,      
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ea0: 20 20 20 20 20 2f 2a 20 45 76 65 6e 74 20 63 6f       /* Event co
3eb0: 64 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  de */.      sqli
3ec0: 74 65 33 5f 69 6e 74 36 34 2c 20 0a 20 20 20 20  te3_int64, .    
3ed0: 20 20 69 6e 74 2c 20 20 20 20 20 20 20 20 20 20    int,          
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
3f00: 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
3f10: 68 61 72 2a 2c 20 20 20 20 20 20 20 20 20 20 20  har*,           
3f20: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
3f30: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  name */.      in
3f40: 74 2c 20 0a 20 20 20 20 20 20 69 6e 74 2c 20 0a  t, .      int, .
3f50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
3f60: 74 36 34 0a 20 20 29 2c 0a 20 20 76 6f 69 64 20  t64.  ),.  void 
3f70: 2a 70 43 6c 69 65 6e 74 2c 0a 20 20 76 6f 69 64  *pClient,.  void
3f80: 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 20 2a 29   (*xDel)(void *)
3f90: 0a 29 7b 0a 20 20 49 6e 73 74 56 66 73 20 2a 70  .){.  InstVfs *p
3fa0: 20 3d 20 28 49 6e 73 74 56 66 73 20 2a 29 70 56   = (InstVfs *)pV
3fb0: 66 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56  fs;.  assert( pV
3fc0: 66 73 2d 3e 78 4f 70 65 6e 3d 3d 69 6e 73 74 4f  fs->xOpen==instO
3fd0: 70 65 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  pen );.  if( p->
3fe0: 78 44 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 78  xDel ){.    p->x
3ff0: 44 65 6c 28 70 2d 3e 70 43 6c 69 65 6e 74 29 3b  Del(p->pClient);
4000: 0a 20 20 7d 0a 20 20 70 2d 3e 78 43 61 6c 6c 20  .  }.  p->xCall 
4010: 3d 20 78 43 61 6c 6c 3b 0a 20 20 70 2d 3e 78 44  = xCall;.  p->xD
4020: 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 2d 3e  el = xDel;.  p->
4030: 70 43 6c 69 65 6e 74 20 3d 20 70 43 6c 69 65 6e  pClient = pClien
4040: 74 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74  t;.}..void sqlit
4050: 65 33 5f 69 6e 73 74 76 66 73 5f 64 65 73 74 72  e3_instvfs_destr
4060: 6f 79 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  oy(sqlite3_vfs *
4070: 70 56 66 73 29 7b 0a 20 20 69 66 28 20 70 56 66  pVfs){.  if( pVf
4080: 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
4090: 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28  _vfs_unregister(
40a0: 70 56 66 73 29 3b 0a 20 20 20 20 73 71 6c 69 74  pVfs);.    sqlit
40b0: 65 33 5f 69 6e 73 74 76 66 73 5f 63 6f 6e 66 69  e3_instvfs_confi
40c0: 67 75 72 65 28 70 56 66 73 2c 20 30 2c 20 30 2c  gure(pVfs, 0, 0,
40d0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
40e0: 5f 66 72 65 65 28 70 56 66 73 29 3b 0a 20 20 7d  _free(pVfs);.  }
40f0: 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .}..void sqlite3
4100: 5f 69 6e 73 74 76 66 73 5f 72 65 73 65 74 28 73  _instvfs_reset(s
4110: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
4120: 29 7b 0a 20 20 49 6e 73 74 56 66 73 20 2a 70 20  ){.  InstVfs *p 
4130: 3d 20 28 49 6e 73 74 56 66 73 20 2a 29 70 56 66  = (InstVfs *)pVf
4140: 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  s;.  assert( pVf
4150: 73 2d 3e 78 4f 70 65 6e 3d 3d 69 6e 73 74 4f 70  s->xOpen==instOp
4160: 65 6e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  en );.  memset(p
4170: 2d 3e 61 54 69 6d 65 2c 20 30 2c 20 73 69 7a 65  ->aTime, 0, size
4180: 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  of(sqlite3_int64
4190: 29 2a 4f 53 5f 4e 55 4d 45 56 45 4e 54 53 29 3b  )*OS_NUMEVENTS);
41a0: 0a 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61 43 6f  .  memset(p->aCo
41b0: 75 6e 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  unt, 0, sizeof(i
41c0: 6e 74 29 2a 4f 53 5f 4e 55 4d 45 56 45 4e 54 53  nt)*OS_NUMEVENTS
41d0: 29 3b 0a 7d 0a 0a 63 6f 6e 73 74 20 63 68 61 72  );.}..const char
41e0: 20 2a 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66   *sqlite3_instvf
41f0: 73 5f 6e 61 6d 65 28 69 6e 74 20 65 45 76 65 6e  s_name(int eEven
4200: 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
4210: 20 2a 7a 45 76 65 6e 74 20 3d 20 30 3b 0a 0a 20   *zEvent = 0;.. 
4220: 20 73 77 69 74 63 68 28 20 65 45 76 65 6e 74 20   switch( eEvent 
4230: 29 7b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 43  ){.    case OS_C
4240: 4c 4f 53 45 3a 20 20 20 20 20 20 20 20 20 20 20  LOSE:           
4250: 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 43 6c 6f    zEvent = "xClo
4260: 73 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  se"; break;.    
4270: 63 61 73 65 20 4f 53 5f 52 45 41 44 3a 20 20 20  case OS_READ:   
4280: 20 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e             zEven
4290: 74 20 3d 20 22 78 52 65 61 64 22 3b 20 62 72 65  t = "xRead"; bre
42a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f  ak;.    case OS_
42b0: 57 52 49 54 45 3a 20 20 20 20 20 20 20 20 20 20  WRITE:          
42c0: 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 57 72     zEvent = "xWr
42d0: 69 74 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ite"; break;.   
42e0: 20 63 61 73 65 20 4f 53 5f 54 52 55 4e 43 41 54   case OS_TRUNCAT
42f0: 45 3a 20 20 20 20 20 20 20 20 20 20 7a 45 76 65  E:          zEve
4300: 6e 74 20 3d 20 22 78 54 72 75 6e 63 61 74 65 22  nt = "xTruncate"
4310: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
4320: 65 20 4f 53 5f 53 59 4e 43 3a 20 20 20 20 20 20  e OS_SYNC:      
4330: 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d          zEvent =
4340: 20 22 78 53 79 6e 63 22 3b 20 62 72 65 61 6b 3b   "xSync"; break;
4350: 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 46 49 4c  .    case OS_FIL
4360: 45 53 49 5a 45 3a 20 20 20 20 20 20 20 20 20 20  ESIZE:          
4370: 7a 45 76 65 6e 74 20 3d 20 22 78 46 69 6c 65 73  zEvent = "xFiles
4380: 69 7a 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ize"; break;.   
4390: 20 63 61 73 65 20 4f 53 5f 4c 4f 43 4b 3a 20 20   case OS_LOCK:  
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 45 76 65              zEve
43b0: 6e 74 20 3d 20 22 78 4c 6f 63 6b 22 3b 20 62 72  nt = "xLock"; br
43c0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53  eak;.    case OS
43d0: 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20  _UNLOCK:        
43e0: 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 55      zEvent = "xU
43f0: 6e 6c 6f 63 6b 22 3b 20 62 72 65 61 6b 3b 0a 20  nlock"; break;. 
4400: 20 20 20 63 61 73 65 20 4f 53 5f 43 48 45 43 4b     case OS_CHECK
4410: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a 20 7a 45  RESERVEDLOCK: zE
4420: 76 65 6e 74 20 3d 20 22 78 43 68 65 63 6b 52 65  vent = "xCheckRe
4430: 73 65 72 76 65 64 4c 6f 63 6b 22 3b 20 62 72 65  servedLock"; bre
4440: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f  ak;.    case OS_
4450: 46 49 4c 45 43 4f 4e 54 52 4f 4c 3a 20 20 20 20  FILECONTROL:    
4460: 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 46 69     zEvent = "xFi
4470: 6c 65 43 6f 6e 74 72 6f 6c 22 3b 20 62 72 65 61  leControl"; brea
4480: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 53  k;.    case OS_S
4490: 45 43 54 4f 52 53 49 5a 45 3a 20 20 20 20 20 20  ECTORSIZE:      
44a0: 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 53 65 63    zEvent = "xSec
44b0: 74 6f 72 53 69 7a 65 22 3b 20 62 72 65 61 6b 3b  torSize"; break;
44c0: 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 44 45 56  .    case OS_DEV
44d0: 43 48 41 52 3a 20 20 20 20 20 20 20 20 20 20 20  CHAR:           
44e0: 7a 45 76 65 6e 74 20 3d 20 22 78 44 65 76 69 63  zEvent = "xDevic
44f0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
4500: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
4510: 73 65 20 4f 53 5f 4f 50 45 4e 3a 20 20 20 20 20  se OS_OPEN:     
4520: 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20           zEvent 
4530: 3d 20 22 78 4f 70 65 6e 22 3b 20 62 72 65 61 6b  = "xOpen"; break
4540: 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 44 45  ;.    case OS_DE
4550: 4c 45 54 45 3a 20 20 20 20 20 20 20 20 20 20 20  LETE:           
4560: 20 7a 45 76 65 6e 74 20 3d 20 22 78 44 65 6c 65   zEvent = "xDele
4570: 74 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  te"; break;.    
4580: 63 61 73 65 20 4f 53 5f 41 43 43 45 53 53 3a 20  case OS_ACCESS: 
4590: 20 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e             zEven
45a0: 74 20 3d 20 22 78 41 63 63 65 73 73 22 3b 20 62  t = "xAccess"; b
45b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f  reak;.    case O
45c0: 53 5f 46 55 4c 4c 50 41 54 48 4e 41 4d 45 3a 20  S_FULLPATHNAME: 
45d0: 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78       zEvent = "x
45e0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 22 3b 20 62  FullPathname"; b
45f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f  reak;.    case O
4600: 53 5f 52 41 4e 44 4f 4d 4e 45 53 53 3a 20 20 20  S_RANDOMNESS:   
4610: 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78       zEvent = "x
4620: 52 61 6e 64 6f 6d 6e 65 73 73 22 3b 20 62 72 65  Randomness"; bre
4630: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f  ak;.    case OS_
4640: 53 4c 45 45 50 3a 20 20 20 20 20 20 20 20 20 20  SLEEP:          
4650: 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 53 6c     zEvent = "xSl
4660: 65 65 70 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  eep"; break;.   
4670: 20 63 61 73 65 20 4f 53 5f 43 55 52 52 45 4e 54   case OS_CURRENT
4680: 54 49 4d 45 3a 20 20 20 20 20 20 20 7a 45 76 65  TIME:       zEve
4690: 6e 74 20 3d 20 22 78 43 75 72 72 65 6e 74 54 69  nt = "xCurrentTi
46a0: 6d 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  me"; break;.  }.
46b0: 0a 20 20 72 65 74 75 72 6e 20 7a 45 76 65 6e 74  .  return zEvent
46c0: 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  ;.}..void sqlite
46d0: 33 5f 69 6e 73 74 76 66 73 5f 67 65 74 28 0a 20  3_instvfs_get(. 
46e0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
46f0: 66 73 2c 20 0a 20 20 69 6e 74 20 65 45 76 65 6e  fs, .  int eEven
4700: 74 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t, .  const char
4710: 20 2a 2a 70 7a 45 76 65 6e 74 2c 20 0a 20 20 73   **pzEvent, .  s
4720: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 6e  qlite3_int64 *pn
4730: 43 6c 69 63 6b 2c 20 0a 20 20 69 6e 74 20 2a 70  Click, .  int *p
4740: 6e 43 61 6c 6c 0a 29 7b 0a 20 20 49 6e 73 74 56  nCall.){.  InstV
4750: 66 73 20 2a 70 20 3d 20 28 49 6e 73 74 56 66 73  fs *p = (InstVfs
4760: 20 2a 29 70 56 66 73 3b 0a 20 20 61 73 73 65 72   *)pVfs;.  asser
4770: 74 28 20 70 56 66 73 2d 3e 78 4f 70 65 6e 3d 3d  t( pVfs->xOpen==
4780: 69 6e 73 74 4f 70 65 6e 20 29 3b 0a 20 20 69 66  instOpen );.  if
4790: 28 20 65 45 76 65 6e 74 3c 31 20 7c 7c 20 65 45  ( eEvent<1 || eE
47a0: 76 65 6e 74 3e 3d 4f 53 5f 4e 55 4d 45 56 45 4e  vent>=OS_NUMEVEN
47b0: 54 53 20 29 7b 0a 20 20 20 20 2a 70 7a 45 76 65  TS ){.    *pzEve
47c0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43  nt = 0;.    *pnC
47d0: 6c 69 63 6b 20 3d 20 30 3b 0a 20 20 20 20 2a 70  lick = 0;.    *p
47e0: 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 72  nCall = 0;.    r
47f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2a 70  eturn;.  }..  *p
4800: 7a 45 76 65 6e 74 20 3d 20 73 71 6c 69 74 65 33  zEvent = sqlite3
4810: 5f 69 6e 73 74 76 66 73 5f 6e 61 6d 65 28 65 45  _instvfs_name(eE
4820: 76 65 6e 74 29 3b 0a 20 20 2a 70 6e 43 6c 69 63  vent);.  *pnClic
4830: 6b 20 3d 20 70 2d 3e 61 54 69 6d 65 5b 65 45 76  k = p->aTime[eEv
4840: 65 6e 74 5d 3b 0a 20 20 2a 70 6e 43 61 6c 6c 20  ent];.  *pnCall 
4850: 3d 20 70 2d 3e 61 43 6f 75 6e 74 5b 65 45 76 65  = p->aCount[eEve
4860: 6e 74 5d 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20  nt];.}..#define 
4870: 42 49 4e 41 52 59 4c 4f 47 5f 42 55 46 46 45 52  BINARYLOG_BUFFER
4880: 53 49 5a 45 20 38 31 39 32 0a 0a 73 74 72 75 63  SIZE 8192..struc
4890: 74 20 49 6e 73 74 56 66 73 42 69 6e 61 72 79 4c  t InstVfsBinaryL
48a0: 6f 67 20 7b 0a 20 20 69 6e 74 20 6e 42 75 66 3b  og {.  int nBuf;
48b0: 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20  .  char *zBuf;. 
48c0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
48d0: 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 6c 6f  Offset;.  int lo
48e0: 67 5f 64 61 74 61 3b 0a 20 20 73 71 6c 69 74 65  g_data;.  sqlite
48f0: 33 5f 66 69 6c 65 20 2a 70 4f 75 74 3b 0a 20 20  3_file *pOut;.  
4900: 63 68 61 72 20 2a 7a 4f 75 74 3b 20 20 20 20 20  char *zOut;     
4910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4920: 20 20 2f 2a 20 4c 6f 67 20 66 69 6c 65 20 6e 61    /* Log file na
4930: 6d 65 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66  me */.};.typedef
4940: 20 73 74 72 75 63 74 20 49 6e 73 74 56 66 73 42   struct InstVfsB
4950: 69 6e 61 72 79 4c 6f 67 20 49 6e 73 74 56 66 73  inaryLog InstVfs
4960: 42 69 6e 61 72 79 4c 6f 67 3b 0a 0a 73 74 61 74  BinaryLog;..stat
4970: 69 63 20 76 6f 69 64 20 70 75 74 33 32 62 69 74  ic void put32bit
4980: 73 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  s(unsigned char 
4990: 2a 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  *p, unsigned int
49a0: 20 76 29 7b 0a 20 20 70 5b 30 5d 20 3d 20 76 3e   v){.  p[0] = v>
49b0: 3e 32 34 3b 0a 20 20 70 5b 31 5d 20 3d 20 76 3e  >24;.  p[1] = v>
49c0: 3e 31 36 3b 0a 20 20 70 5b 32 5d 20 3d 20 76 3e  >16;.  p[2] = v>
49d0: 3e 38 3b 0a 20 20 70 5b 33 5d 20 3d 20 76 3b 0a  >8;.  p[3] = v;.
49e0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  }..static void b
49f0: 69 6e 61 72 79 6c 6f 67 5f 66 6c 75 73 68 28 49  inarylog_flush(I
4a00: 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20  nstVfsBinaryLog 
4a10: 2a 70 4c 6f 67 29 7b 0a 20 20 73 71 6c 69 74 65  *pLog){.  sqlite
4a20: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  3_file *pFile = 
4a30: 70 4c 6f 67 2d 3e 70 4f 75 74 3b 0a 0a 23 69 66  pLog->pOut;..#if
4a40: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
4a50: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
4a60: 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
4a70: 6e 64 69 6e 67 3b 0a 20 20 65 78 74 65 72 6e 20  nding;.  extern 
4a80: 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
4a90: 72 72 6f 72 5f 70 65 72 73 69 73 74 3b 0a 20 20  rror_persist;.  
4aa0: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
4ab0: 65 33 5f 64 69 73 6b 66 75 6c 6c 5f 70 65 6e 64  e3_diskfull_pend
4ac0: 69 6e 67 3b 0a 0a 20 20 69 6e 74 20 70 65 6e 64  ing;..  int pend
4ad0: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  ing = sqlite3_io
4ae0: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
4af0: 20 20 69 6e 74 20 70 65 72 73 69 73 74 20 3d 20    int persist = 
4b00: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
4b10: 5f 70 65 72 73 69 73 74 3b 0a 20 20 69 6e 74 20  _persist;.  int 
4b20: 64 69 73 6b 66 75 6c 6c 20 3d 20 73 71 6c 69 74  diskfull = sqlit
4b30: 65 33 5f 64 69 73 6b 66 75 6c 6c 5f 70 65 6e 64  e3_diskfull_pend
4b40: 69 6e 67 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ing;..  sqlite3_
4b50: 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
4b60: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
4b70: 69 6f 5f 65 72 72 6f 72 5f 70 65 72 73 69 73 74  io_error_persist
4b80: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
4b90: 64 69 73 6b 66 75 6c 6c 5f 70 65 6e 64 69 6e 67  diskfull_pending
4ba0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
4bb0: 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d  pFile->pMethods-
4bc0: 3e 78 57 72 69 74 65 28 70 46 69 6c 65 2c 20 70  >xWrite(pFile, p
4bd0: 4c 6f 67 2d 3e 7a 42 75 66 2c 20 70 4c 6f 67 2d  Log->zBuf, pLog-
4be0: 3e 6e 42 75 66 2c 20 70 4c 6f 67 2d 3e 69 4f 66  >nBuf, pLog->iOf
4bf0: 66 73 65 74 29 3b 0a 20 20 70 4c 6f 67 2d 3e 69  fset);.  pLog->i
4c00: 4f 66 66 73 65 74 20 2b 3d 20 70 4c 6f 67 2d 3e  Offset += pLog->
4c10: 6e 42 75 66 3b 0a 20 20 70 4c 6f 67 2d 3e 6e 42  nBuf;.  pLog->nB
4c20: 75 66 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  uf = 0;..#ifdef 
4c30: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
4c40: 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
4c50: 65 6e 64 69 6e 67 20 3d 20 70 65 6e 64 69 6e 67  ending = pending
4c60: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  ;.  sqlite3_io_e
4c70: 72 72 6f 72 5f 70 65 72 73 69 73 74 20 3d 20 70  rror_persist = p
4c80: 65 72 73 69 73 74 3b 0a 20 20 73 71 6c 69 74 65  ersist;.  sqlite
4c90: 33 5f 64 69 73 6b 66 75 6c 6c 5f 70 65 6e 64 69  3_diskfull_pendi
4ca0: 6e 67 20 3d 20 64 69 73 6b 66 75 6c 6c 3b 0a 23  ng = diskfull;.#
4cb0: 65 6e 64 69 66 0a 7d 0a 0a 73 74 61 74 69 63 20  endif.}..static 
4cc0: 76 6f 69 64 20 62 69 6e 61 72 79 6c 6f 67 5f 78  void binarylog_x
4cd0: 63 61 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 70 2c  call(.  void *p,
4ce0: 0a 20 20 69 6e 74 20 65 45 76 65 6e 74 2c 0a 20  .  int eEvent,. 
4cf0: 20 69 6e 74 20 69 46 69 6c 65 49 64 2c 0a 20 20   int iFileId,.  
4d00: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 43  sqlite3_int64 nC
4d10: 6c 69 63 6b 2c 0a 20 20 69 6e 74 20 72 65 74 75  lick,.  int retu
4d20: 72 6e 5f 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74  rn_code,.  const
4d30: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
4d40: 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 69 6e 74  int flags,.  int
4d50: 20 6e 42 79 74 65 2c 0a 20 20 73 71 6c 69 74 65   nByte,.  sqlite
4d60: 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74 0a  3_int64 iOffset.
4d70: 29 7b 0a 20 20 49 6e 73 74 56 66 73 42 69 6e 61  ){.  InstVfsBina
4d80: 72 79 4c 6f 67 20 2a 70 4c 6f 67 20 3d 20 28 49  ryLog *pLog = (I
4d90: 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20  nstVfsBinaryLog 
4da0: 2a 29 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  *)p;.  unsigned 
4db0: 63 68 61 72 20 2a 7a 52 65 63 3b 0a 20 20 69 66  char *zRec;.  if
4dc0: 28 20 28 32 38 2b 70 4c 6f 67 2d 3e 6e 42 75 66  ( (28+pLog->nBuf
4dd0: 29 3e 42 49 4e 41 52 59 4c 4f 47 5f 42 55 46 46  )>BINARYLOG_BUFF
4de0: 45 52 53 49 5a 45 20 29 7b 0a 20 20 20 20 62 69  ERSIZE ){.    bi
4df0: 6e 61 72 79 6c 6f 67 5f 66 6c 75 73 68 28 70 4c  narylog_flush(pL
4e00: 6f 67 29 3b 0a 20 20 7d 0a 20 20 7a 52 65 63 20  og);.  }.  zRec 
4e10: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
4e20: 20 2a 29 26 70 4c 6f 67 2d 3e 7a 42 75 66 5b 70   *)&pLog->zBuf[p
4e30: 4c 6f 67 2d 3e 6e 42 75 66 5d 3b 0a 20 20 70 75  Log->nBuf];.  pu
4e40: 74 33 32 62 69 74 73 28 26 7a 52 65 63 5b 30 5d  t32bits(&zRec[0]
4e50: 2c 20 65 45 76 65 6e 74 29 3b 0a 20 20 70 75 74  , eEvent);.  put
4e60: 33 32 62 69 74 73 28 26 7a 52 65 63 5b 34 5d 2c  32bits(&zRec[4],
4e70: 20 28 69 6e 74 29 69 46 69 6c 65 49 64 29 3b 0a   (int)iFileId);.
4e80: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 52 65    put32bits(&zRe
4e90: 63 5b 38 5d 2c 20 28 69 6e 74 29 6e 43 6c 69 63  c[8], (int)nClic
4ea0: 6b 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  k);.  put32bits(
4eb0: 26 7a 52 65 63 5b 31 32 5d 2c 20 72 65 74 75 72  &zRec[12], retur
4ec0: 6e 5f 63 6f 64 65 29 3b 0a 20 20 70 75 74 33 32  n_code);.  put32
4ed0: 62 69 74 73 28 26 7a 52 65 63 5b 31 36 5d 2c 20  bits(&zRec[16], 
4ee0: 66 6c 61 67 73 29 3b 0a 20 20 70 75 74 33 32 62  flags);.  put32b
4ef0: 69 74 73 28 26 7a 52 65 63 5b 32 30 5d 2c 20 6e  its(&zRec[20], n
4f00: 42 79 74 65 29 3b 0a 20 20 70 75 74 33 32 62 69  Byte);.  put32bi
4f10: 74 73 28 26 7a 52 65 63 5b 32 34 5d 2c 20 28 69  ts(&zRec[24], (i
4f20: 6e 74 29 69 4f 66 66 73 65 74 29 3b 0a 20 20 70  nt)iOffset);.  p
4f30: 4c 6f 67 2d 3e 6e 42 75 66 20 2b 3d 20 32 38 3b  Log->nBuf += 28;
4f40: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
4f50: 62 69 6e 61 72 79 6c 6f 67 5f 78 64 65 6c 28 76  binarylog_xdel(v
4f60: 6f 69 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 43 6c  oid *p){.  /* Cl
4f70: 6f 73 65 20 74 68 65 20 6c 6f 67 20 66 69 6c 65  ose the log file
4f80: 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 6d 65   and free the me
4f90: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 66  mory allocated f
4fa0: 6f 72 20 74 68 65 20 0a 20 20 2a 2a 20 49 6e 73  or the .  ** Ins
4fb0: 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 73 74  tVfsBinaryLog st
4fc0: 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20  ructure..  */.  
4fd0: 49 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67  InstVfsBinaryLog
4fe0: 20 2a 70 4c 6f 67 20 3d 20 28 49 6e 73 74 56 66   *pLog = (InstVf
4ff0: 73 42 69 6e 61 72 79 4c 6f 67 20 2a 29 70 3b 0a  sBinaryLog *)p;.
5000: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
5010: 70 46 69 6c 65 20 3d 20 70 4c 6f 67 2d 3e 70 4f  pFile = pLog->pO
5020: 75 74 3b 0a 20 20 69 66 28 20 70 4c 6f 67 2d 3e  ut;.  if( pLog->
5030: 6e 42 75 66 20 29 7b 0a 20 20 20 20 62 69 6e 61  nBuf ){.    bina
5040: 72 79 6c 6f 67 5f 66 6c 75 73 68 28 70 4c 6f 67  rylog_flush(pLog
5050: 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  );.  }.  pFile->
5060: 70 4d 65 74 68 6f 64 73 2d 3e 78 43 6c 6f 73 65  pMethods->xClose
5070: 28 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74  (pFile);.  sqlit
5080: 65 33 5f 66 72 65 65 28 70 4c 6f 67 2d 3e 70 4f  e3_free(pLog->pO
5090: 75 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ut);.  sqlite3_f
50a0: 72 65 65 28 70 4c 6f 67 2d 3e 7a 42 75 66 29 3b  ree(pLog->zBuf);
50b0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
50c0: 70 4c 6f 67 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  pLog);.}..static
50d0: 20 76 6f 69 64 20 62 69 6e 61 72 79 6c 6f 67 5f   void binarylog_
50e0: 62 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65 33 5f  blob(.  sqlite3_
50f0: 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e  vfs *pVfs,.  con
5100: 73 74 20 63 68 61 72 20 2a 7a 42 6c 6f 62 2c 0a  st char *zBlob,.
5110: 20 20 69 6e 74 20 6e 42 6c 6f 62 2c 0a 20 20 69    int nBlob,.  i
5120: 6e 74 20 69 73 42 69 6e 61 72 79 0a 29 7b 0a 20  nt isBinary.){. 
5130: 20 49 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f   InstVfsBinaryLo
5140: 67 20 2a 70 4c 6f 67 3b 0a 20 20 49 6e 73 74 56  g *pLog;.  InstV
5150: 66 73 20 2a 70 49 6e 73 74 56 66 73 20 3d 20 28  fs *pInstVfs = (
5160: 49 6e 73 74 56 66 73 20 2a 29 70 56 66 73 3b 0a  InstVfs *)pVfs;.
5170: 0a 20 20 69 66 28 20 70 56 66 73 2d 3e 78 4f 70  .  if( pVfs->xOp
5180: 65 6e 21 3d 69 6e 73 74 4f 70 65 6e 20 7c 7c 20  en!=instOpen || 
5190: 70 49 6e 73 74 56 66 73 2d 3e 78 43 61 6c 6c 21  pInstVfs->xCall!
51a0: 3d 62 69 6e 61 72 79 6c 6f 67 5f 78 63 61 6c 6c  =binarylog_xcall
51b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
51c0: 20 20 7d 0a 20 20 70 4c 6f 67 20 3d 20 28 49 6e    }.  pLog = (In
51d0: 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 2a  stVfsBinaryLog *
51e0: 29 70 49 6e 73 74 56 66 73 2d 3e 70 43 6c 69 65  )pInstVfs->pClie
51f0: 6e 74 3b 0a 20 20 69 66 28 20 7a 42 6c 6f 62 20  nt;.  if( zBlob 
5200: 26 26 20 28 21 69 73 42 69 6e 61 72 79 20 7c 7c  && (!isBinary ||
5210: 20 70 4c 6f 67 2d 3e 6c 6f 67 5f 64 61 74 61 29   pLog->log_data)
5220: 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   ){.    unsigned
5230: 20 63 68 61 72 20 2a 7a 52 65 63 3b 0a 20 20 20   char *zRec;.   
5240: 20 69 6e 74 20 6e 57 72 69 74 65 3b 0a 0a 20 20   int nWrite;..  
5250: 20 20 69 66 28 20 6e 42 6c 6f 62 3c 30 20 29 7b    if( nBlob<0 ){
5260: 0a 20 20 20 20 20 20 6e 42 6c 6f 62 20 3d 20 73  .      nBlob = s
5270: 74 72 6c 65 6e 28 7a 42 6c 6f 62 29 3b 0a 20 20  trlen(zBlob);.  
5280: 20 20 7d 0a 20 20 20 20 6e 57 72 69 74 65 20 3d    }.    nWrite =
5290: 20 6e 42 6c 6f 62 20 2b 20 32 38 3b 0a 20 20 0a   nBlob + 28;.  .
52a0: 20 20 20 20 69 66 28 20 28 6e 57 72 69 74 65 2b      if( (nWrite+
52b0: 70 4c 6f 67 2d 3e 6e 42 75 66 29 3e 42 49 4e 41  pLog->nBuf)>BINA
52c0: 52 59 4c 4f 47 5f 42 55 46 46 45 52 53 49 5a 45  RYLOG_BUFFERSIZE
52d0: 20 29 7b 0a 20 20 20 20 20 20 62 69 6e 61 72 79   ){.      binary
52e0: 6c 6f 67 5f 66 6c 75 73 68 28 70 4c 6f 67 29 3b  log_flush(pLog);
52f0: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 7a 52  .    }.  .    zR
5300: 65 63 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ec = (unsigned c
5310: 68 61 72 20 2a 29 26 70 4c 6f 67 2d 3e 7a 42 75  har *)&pLog->zBu
5320: 66 5b 70 4c 6f 67 2d 3e 6e 42 75 66 5d 3b 0a 20  f[pLog->nBuf];. 
5330: 20 20 20 6d 65 6d 73 65 74 28 7a 52 65 63 2c 20     memset(zRec, 
5340: 30 2c 20 6e 57 72 69 74 65 29 3b 0a 20 20 20 20  0, nWrite);.    
5350: 70 75 74 33 32 62 69 74 73 28 26 7a 52 65 63 5b  put32bits(&zRec[
5360: 30 5d 2c 20 42 49 4e 41 52 59 4c 4f 47 5f 53 54  0], BINARYLOG_ST
5370: 52 49 4e 47 29 3b 0a 20 20 20 20 70 75 74 33 32  RING);.    put32
5380: 62 69 74 73 28 26 7a 52 65 63 5b 34 5d 2c 20 28  bits(&zRec[4], (
5390: 69 6e 74 29 6e 42 6c 6f 62 29 3b 0a 20 20 20 20  int)nBlob);.    
53a0: 70 75 74 33 32 62 69 74 73 28 26 7a 52 65 63 5b  put32bits(&zRec[
53b0: 38 5d 2c 20 28 69 6e 74 29 69 73 42 69 6e 61 72  8], (int)isBinar
53c0: 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  y);.    memcpy(&
53d0: 7a 52 65 63 5b 32 38 5d 2c 20 7a 42 6c 6f 62 2c  zRec[28], zBlob,
53e0: 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 70 4c 6f   nBlob);.    pLo
53f0: 67 2d 3e 6e 42 75 66 20 2b 3d 20 6e 57 72 69 74  g->nBuf += nWrit
5400: 65 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 73  e;.  }.}..void s
5410: 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 62  qlite3_instvfs_b
5420: 69 6e 61 72 79 6c 6f 67 5f 63 61 6c 6c 28 0a 20  inarylog_call(. 
5430: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
5440: 66 73 2c 0a 20 20 69 6e 74 20 65 45 76 65 6e 74  fs,.  int eEvent
5450: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ,.  sqlite3_int6
5460: 34 20 6e 43 6c 69 63 6b 2c 0a 20 20 69 6e 74 20  4 nClick,.  int 
5470: 72 65 74 75 72 6e 5f 63 6f 64 65 2c 0a 20 20 63  return_code,.  c
5480: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 69  onst char *zStri
5490: 6e 67 0a 29 7b 0a 20 20 49 6e 73 74 56 66 73 20  ng.){.  InstVfs 
54a0: 2a 70 49 6e 73 74 56 66 73 20 3d 20 28 49 6e 73  *pInstVfs = (Ins
54b0: 74 56 66 73 20 2a 29 70 56 66 73 3b 0a 20 20 49  tVfs *)pVfs;.  I
54c0: 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20  nstVfsBinaryLog 
54d0: 2a 70 4c 6f 67 20 3d 20 28 49 6e 73 74 56 66 73  *pLog = (InstVfs
54e0: 42 69 6e 61 72 79 4c 6f 67 20 2a 29 70 49 6e 73  BinaryLog *)pIns
54f0: 74 56 66 73 2d 3e 70 43 6c 69 65 6e 74 3b 0a 0a  tVfs->pClient;..
5500: 20 20 69 66 28 20 7a 53 74 72 69 6e 67 20 29 7b    if( zString ){
5510: 0a 20 20 20 20 62 69 6e 61 72 79 6c 6f 67 5f 62  .    binarylog_b
5520: 6c 6f 62 28 70 56 66 73 2c 20 7a 53 74 72 69 6e  lob(pVfs, zStrin
5530: 67 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 7d 0a 20  g, -1, 0);.  }. 
5540: 20 62 69 6e 61 72 79 6c 6f 67 5f 78 63 61 6c 6c   binarylog_xcall
5550: 28 70 4c 6f 67 2c 20 65 45 76 65 6e 74 2c 20 30  (pLog, eEvent, 0
5560: 2c 20 6e 43 6c 69 63 6b 2c 20 72 65 74 75 72 6e  , nClick, return
5570: 5f 63 6f 64 65 2c 20 30 2c 20 30 2c 20 30 2c 20  _code, 0, 0, 0, 
5580: 30 29 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69  0);.}..void sqli
5590: 74 65 33 5f 69 6e 73 74 76 66 73 5f 62 69 6e 61  te3_instvfs_bina
55a0: 72 79 6c 6f 67 5f 6d 61 72 6b 65 72 28 0a 20 20  rylog_marker(.  
55b0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
55c0: 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  s,.  const char 
55d0: 2a 7a 4d 61 72 6b 65 72 0a 29 7b 0a 20 20 49 6e  *zMarker.){.  In
55e0: 73 74 56 66 73 20 2a 70 49 6e 73 74 56 66 73 20  stVfs *pInstVfs 
55f0: 3d 20 28 49 6e 73 74 56 66 73 20 2a 29 70 56 66  = (InstVfs *)pVf
5600: 73 3b 0a 20 20 49 6e 73 74 56 66 73 42 69 6e 61  s;.  InstVfsBina
5610: 72 79 4c 6f 67 20 2a 70 4c 6f 67 20 3d 20 28 49  ryLog *pLog = (I
5620: 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20  nstVfsBinaryLog 
5630: 2a 29 70 49 6e 73 74 56 66 73 2d 3e 70 43 6c 69  *)pInstVfs->pCli
5640: 65 6e 74 3b 0a 20 20 62 69 6e 61 72 79 6c 6f 67  ent;.  binarylog
5650: 5f 62 6c 6f 62 28 70 56 66 73 2c 20 7a 4d 61 72  _blob(pVfs, zMar
5660: 6b 65 72 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 62  ker, -1, 0);.  b
5670: 69 6e 61 72 79 6c 6f 67 5f 78 63 61 6c 6c 28 70  inarylog_xcall(p
5680: 4c 6f 67 2c 20 42 49 4e 41 52 59 4c 4f 47 5f 4d  Log, BINARYLOG_M
5690: 41 52 4b 45 52 2c 20 30 2c 20 30 2c 20 30 2c 20  ARKER, 0, 0, 0, 
56a0: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  0, 0, 0, 0);.}..
56b0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c  sqlite3_vfs *sql
56c0: 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 62 69 6e  ite3_instvfs_bin
56d0: 61 72 79 6c 6f 67 28 0a 20 20 63 6f 6e 73 74 20  arylog(.  const 
56e0: 63 68 61 72 20 2a 7a 56 66 73 2c 0a 20 20 63 6f  char *zVfs,.  co
56f0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e  nst char *zParen
5700: 74 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63  tVfs, .  const c
5710: 68 61 72 20 2a 7a 4c 6f 67 2c 0a 20 20 69 6e 74  har *zLog,.  int
5720: 20 6c 6f 67 5f 64 61 74 61 0a 29 7b 0a 20 20 49   log_data.){.  I
5730: 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20  nstVfsBinaryLog 
5740: 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  *p;.  sqlite3_vf
5750: 73 20 2a 70 56 66 73 3b 0a 20 20 73 71 6c 69 74  s *pVfs;.  sqlit
5760: 65 33 5f 76 66 73 20 2a 70 50 61 72 65 6e 74 3b  e3_vfs *pParent;
5770: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
5780: 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 69 6e 74  int flags;.  int
5790: 20 72 63 3b 0a 0a 20 20 70 50 61 72 65 6e 74 20   rc;..  pParent 
57a0: 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
57b0: 6e 64 28 7a 50 61 72 65 6e 74 56 66 73 29 3b 0a  nd(zParentVfs);.
57c0: 20 20 69 66 28 20 21 70 50 61 72 65 6e 74 20 29    if( !pParent )
57d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
57e0: 20 20 7d 0a 0a 20 20 6e 42 79 74 65 20 3d 20 73    }..  nByte = s
57f0: 69 7a 65 6f 66 28 49 6e 73 74 56 66 73 42 69 6e  izeof(InstVfsBin
5800: 61 72 79 4c 6f 67 29 20 2b 20 70 50 61 72 65 6e  aryLog) + pParen
5810: 74 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  t->mxPathname+1;
5820: 0a 20 20 70 20 3d 20 28 49 6e 73 74 56 66 73 42  .  p = (InstVfsB
5830: 69 6e 61 72 79 4c 6f 67 20 2a 29 73 71 6c 69 74  inaryLog *)sqlit
5840: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29  e3_malloc(nByte)
5850: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
5860: 20 6e 42 79 74 65 29 3b 0a 20 20 70 2d 3e 7a 42   nByte);.  p->zB
5870: 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  uf = sqlite3_mal
5880: 6c 6f 63 28 42 49 4e 41 52 59 4c 4f 47 5f 42 55  loc(BINARYLOG_BU
5890: 46 46 45 52 53 49 5a 45 29 3b 0a 20 20 70 2d 3e  FFERSIZE);.  p->
58a0: 7a 4f 75 74 20 3d 20 28 63 68 61 72 20 2a 29 26  zOut = (char *)&
58b0: 70 5b 31 5d 3b 0a 20 20 70 2d 3e 70 4f 75 74 20  p[1];.  p->pOut 
58c0: 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
58d0: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
58e0: 28 70 50 61 72 65 6e 74 2d 3e 73 7a 4f 73 46 69  (pParent->szOsFi
58f0: 6c 65 29 3b 0a 20 20 70 2d 3e 6c 6f 67 5f 64 61  le);.  p->log_da
5900: 74 61 20 3d 20 6c 6f 67 5f 64 61 74 61 3b 0a 20  ta = log_data;. 
5910: 20 70 50 61 72 65 6e 74 2d 3e 78 46 75 6c 6c 50   pParent->xFullP
5920: 61 74 68 6e 61 6d 65 28 70 50 61 72 65 6e 74 2c  athname(pParent,
5930: 20 7a 4c 6f 67 2c 20 70 50 61 72 65 6e 74 2d 3e   zLog, pParent->
5940: 6d 78 50 61 74 68 6e 61 6d 65 2c 20 70 2d 3e 7a  mxPathname, p->z
5950: 4f 75 74 29 3b 0a 20 20 66 6c 61 67 73 20 3d 20  Out);.  flags = 
5960: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
5970: 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
5980: 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f  N_CREATE|SQLITE_
5990: 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
59a0: 4e 41 4c 3b 0a 20 20 70 50 61 72 65 6e 74 2d 3e  NAL;.  pParent->
59b0: 78 44 65 6c 65 74 65 28 70 50 61 72 65 6e 74 2c  xDelete(pParent,
59c0: 20 70 2d 3e 7a 4f 75 74 2c 20 30 29 3b 0a 20 20   p->zOut, 0);.  
59d0: 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 78 4f  rc = pParent->xO
59e0: 70 65 6e 28 70 50 61 72 65 6e 74 2c 20 70 2d 3e  pen(pParent, p->
59f0: 7a 4f 75 74 2c 20 70 2d 3e 70 4f 75 74 2c 20 66  zOut, p->pOut, f
5a00: 6c 61 67 73 2c 20 26 66 6c 61 67 73 29 3b 0a 20  lags, &flags);. 
5a10: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5a20: 4f 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  OK ){.    memcpy
5a30: 28 70 2d 3e 7a 42 75 66 2c 20 22 73 71 6c 69 74  (p->zBuf, "sqlit
5a40: 65 5f 6f 73 74 72 61 63 65 31 2e 2e 2e 2e 2e 22  e_ostrace1....."
5a50: 2c 20 32 30 29 3b 0a 20 20 20 20 70 2d 3e 69 4f  , 20);.    p->iO
5a60: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
5a70: 2d 3e 6e 42 75 66 20 3d 20 32 30 3b 0a 20 20 7d  ->nBuf = 20;.  }
5a80: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
5a90: 20 62 69 6e 61 72 79 6c 6f 67 5f 78 64 65 6c 28   binarylog_xdel(
5aa0: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  p);.    return 0
5ab0: 3b 0a 20 20 7d 0a 0a 20 20 70 56 66 73 20 3d 20  ;.  }..  pVfs = 
5ac0: 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f  sqlite3_instvfs_
5ad0: 63 72 65 61 74 65 28 7a 56 66 73 2c 20 7a 50 61  create(zVfs, zPa
5ae0: 72 65 6e 74 56 66 73 29 3b 0a 20 20 69 66 28 20  rentVfs);.  if( 
5af0: 70 56 66 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  pVfs ){.    sqli
5b00: 74 65 33 5f 69 6e 73 74 76 66 73 5f 63 6f 6e 66  te3_instvfs_conf
5b10: 69 67 75 72 65 28 70 56 66 73 2c 20 62 69 6e 61  igure(pVfs, bina
5b20: 72 79 6c 6f 67 5f 78 63 61 6c 6c 2c 20 70 2c 20  rylog_xcall, p, 
5b30: 62 69 6e 61 72 79 6c 6f 67 5f 78 64 65 6c 29 3b  binarylog_xdel);
5b40: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
5b50: 56 66 73 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Vfs;.}.#endif /*
5b60: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
5b70: 4e 53 54 56 46 53 20 2a 2f 0a 0a 2f 2a 2a 2a 2a  NSTVFS */../****
5b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5bc0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
5bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c10: 2a 2a 0a 2a 2a 20 54 63 6c 20 69 6e 74 65 72 66  **.** Tcl interf
5c20: 61 63 65 20 73 74 61 72 74 73 20 68 65 72 65 2e  ace starts here.
5c30: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
5c40: 45 53 54 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 74  EST..#include <t
5c50: 63 6c 2e 68 3e 0a 0a 23 69 66 64 65 66 20 53 51  cl.h>..#ifdef SQ
5c60: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4e 53 54  LITE_ENABLE_INST
5c70: 56 46 53 0a 73 74 72 75 63 74 20 49 6e 73 74 56  VFS.struct InstV
5c80: 66 73 43 61 6c 6c 20 7b 0a 20 20 54 63 6c 5f 49  fsCall {.  Tcl_I
5c90: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20  nterp *interp;. 
5ca0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
5cb0: 74 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74  t;.};.typedef st
5cc0: 72 75 63 74 20 49 6e 73 74 56 66 73 43 61 6c 6c  ruct InstVfsCall
5cd0: 20 49 6e 73 74 56 66 73 43 61 6c 6c 3b 0a 0a 73   InstVfsCall;..s
5ce0: 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
5cf0: 69 6e 73 74 76 66 73 5f 78 63 61 6c 6c 28 0a 20  instvfs_xcall(. 
5d00: 20 76 6f 69 64 20 2a 70 2c 0a 20 20 69 6e 74 20   void *p,.  int 
5d10: 65 45 76 65 6e 74 2c 0a 20 20 69 6e 74 20 69 46  eEvent,.  int iF
5d20: 69 6c 65 49 64 2c 0a 20 20 73 71 6c 69 74 65 33  ileId,.  sqlite3
5d30: 5f 69 6e 74 36 34 20 6e 43 6c 69 63 6b 2c 0a 20  _int64 nClick,. 
5d40: 20 69 6e 74 20 72 65 74 75 72 6e 5f 63 6f 64 65   int return_code
5d50: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
5d60: 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 66 6c 61  zName,.  int fla
5d70: 67 73 2c 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c  gs,.  int nByte,
5d80: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
5d90: 20 69 4f 66 66 73 65 74 0a 29 7b 0a 20 20 69 6e   iOffset.){.  in
5da0: 74 20 72 63 3b 0a 20 20 49 6e 73 74 56 66 73 43  t rc;.  InstVfsC
5db0: 61 6c 6c 20 2a 70 43 61 6c 6c 20 3d 20 28 49 6e  all *pCall = (In
5dc0: 73 74 56 66 73 43 61 6c 6c 20 2a 29 70 3b 0a 20  stVfsCall *)p;. 
5dd0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 20 3d   Tcl_Obj *pObj =
5de0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
5df0: 6a 28 20 70 43 61 6c 6c 2d 3e 70 53 63 72 69 70  j( pCall->pScrip
5e00: 74 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t);.  const char
5e10: 20 2a 7a 45 76 65 6e 74 20 3d 20 73 71 6c 69 74   *zEvent = sqlit
5e20: 65 33 5f 69 6e 73 74 76 66 73 5f 6e 61 6d 65 28  e3_instvfs_name(
5e30: 65 45 76 65 6e 74 29 3b 0a 0a 20 20 54 63 6c 5f  eEvent);..  Tcl_
5e40: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 4f 62  IncrRefCount(pOb
5e50: 6a 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  j);.  Tcl_ListOb
5e60: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
5e70: 2c 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53  , pObj, Tcl_NewS
5e80: 74 72 69 6e 67 4f 62 6a 28 7a 45 76 65 6e 74 2c  tringObj(zEvent,
5e90: 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
5ea0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5eb0: 74 28 30 2c 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e  t(0, pObj, Tcl_N
5ec0: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 6e 43 6c  ewWideIntObj(nCl
5ed0: 69 63 6b 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  ick));.  Tcl_Lis
5ee0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5ef0: 74 28 30 2c 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e  t(0, pObj, Tcl_N
5f00: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d  ewStringObj(zNam
5f10: 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  e, -1));.  Tcl_L
5f20: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5f30: 65 6e 74 28 30 2c 20 70 4f 62 6a 2c 20 54 63 6c  ent(0, pObj, Tcl
5f40: 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 42 79 74 65  _NewIntObj(nByte
5f50: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
5f60: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
5f70: 2c 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 57  , pObj, Tcl_NewW
5f80: 69 64 65 49 6e 74 4f 62 6a 28 69 4f 66 66 73 65  ideIntObj(iOffse
5f90: 74 29 29 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c  t));..  rc = Tcl
5fa0: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 43 61 6c 6c  _EvalObjEx(pCall
5fb0: 2d 3e 69 6e 74 65 72 70 2c 20 70 4f 62 6a 2c 20  ->interp, pObj, 
5fc0: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c  TCL_EVAL_GLOBAL|
5fd0: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
5fe0: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
5ff0: 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64    Tcl_Background
6000: 45 72 72 6f 72 28 70 43 61 6c 6c 2d 3e 69 6e 74  Error(pCall->int
6010: 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  erp);.  }.  Tcl_
6020: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 4f 62  DecrRefCount(pOb
6030: 6a 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  j);.}..static vo
6040: 69 64 20 74 65 73 74 5f 69 6e 73 74 76 66 73 5f  id test_instvfs_
6050: 78 64 65 6c 28 76 6f 69 64 20 2a 70 29 7b 0a 20  xdel(void *p){. 
6060: 20 49 6e 73 74 56 66 73 43 61 6c 6c 20 2a 70 43   InstVfsCall *pC
6070: 61 6c 6c 20 3d 20 28 49 6e 73 74 56 66 73 43 61  all = (InstVfsCa
6080: 6c 6c 20 2a 29 70 3b 0a 20 20 54 63 6c 5f 44 65  ll *)p;.  Tcl_De
6090: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 61 6c 6c  crRefCount(pCall
60a0: 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 73 71  ->pScript);.  sq
60b0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 61 6c 6c  lite3_free(pCall
60c0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
60d0: 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 69 6e   test_sqlite3_in
60e0: 73 74 76 66 73 28 0a 20 20 76 6f 69 64 20 2a 20  stvfs(.  void * 
60f0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
6100: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
6110: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
6120: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
6130: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69  bjv[].){.  stati
6140: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 49 56  c const char *IV
6150: 5f 73 74 72 73 5b 5d 20 3d 20 0a 20 20 20 20 20  _strs[] = .     
6160: 20 20 20 20 20 20 20 20 20 20 7b 20 22 63 72 65            { "cre
6170: 61 74 65 22 2c 20 20 22 64 65 73 74 72 6f 79 22  ate",  "destroy"
6180: 2c 20 20 22 72 65 73 65 74 22 2c 20 20 22 72 65  ,  "reset",  "re
6190: 70 6f 72 74 22 2c 20 22 63 6f 6e 66 69 67 75 72  port", "configur
61a0: 65 22 2c 20 22 62 69 6e 61 72 79 6c 6f 67 22 2c  e", "binarylog",
61b0: 20 22 6d 61 72 6b 65 72 22 2c 20 30 20 7d 3b 0a   "marker", 0 };.
61c0: 20 20 65 6e 75 6d 20 49 56 5f 65 6e 75 6d 20 7b    enum IV_enum {
61d0: 20 49 56 5f 43 52 45 41 54 45 2c 20 49 56 5f 44   IV_CREATE, IV_D
61e0: 45 53 54 52 4f 59 2c 20 49 56 5f 52 45 53 45 54  ESTROY, IV_RESET
61f0: 2c 20 49 56 5f 52 45 50 4f 52 54 2c 20 49 56 5f  , IV_REPORT, IV_
6200: 43 4f 4e 46 49 47 55 52 45 2c 20 49 56 5f 42 49  CONFIGURE, IV_BI
6210: 4e 41 52 59 4c 4f 47 2c 20 49 56 5f 4d 41 52 4b  NARYLOG, IV_MARK
6220: 45 52 20 7d 3b 0a 20 20 69 6e 74 20 69 53 75 62  ER };.  int iSub
6230: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20  ;..  if( objc<2 
6240: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
6250: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
6260: 31 2c 20 6f 62 6a 76 2c 20 22 53 55 42 2d 43 4f  1, objv, "SUB-CO
6270: 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 7d  MMAND ...");.  }
6280: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
6290: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
62a0: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 49 56 5f 73  p, objv[1], IV_s
62b0: 74 72 73 2c 20 22 73 75 62 2d 63 6f 6d 6d 61 6e  trs, "sub-comman
62c0: 64 22 2c 20 30 2c 20 26 69 53 75 62 29 20 29 7b  d", 0, &iSub) ){
62d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
62e0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77  ERROR;.  }..  sw
62f0: 69 74 63 68 28 20 28 65 6e 75 6d 20 49 56 5f 65  itch( (enum IV_e
6300: 6e 75 6d 29 69 53 75 62 20 29 7b 0a 20 20 20 20  num)iSub ){.    
6310: 63 61 73 65 20 49 56 5f 43 52 45 41 54 45 3a 20  case IV_CREATE: 
6320: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50  {.      char *zP
6330: 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  arent = 0;.     
6340: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 3b   sqlite3_vfs *p;
6350: 0a 20 20 20 20 20 20 69 6e 74 20 69 73 44 65 66  .      int isDef
6360: 61 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ault = 0;.      
6370: 69 66 28 20 6f 62 6a 63 3e 32 20 26 26 20 30 3d  if( objc>2 && 0=
6380: 3d 73 74 72 63 6d 70 28 22 2d 64 65 66 61 75 6c  =strcmp("-defaul
6390: 74 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t", Tcl_GetStrin
63a0: 67 28 6f 62 6a 76 5b 32 5d 29 29 20 29 7b 0a 20  g(objv[2])) ){. 
63b0: 20 20 20 20 20 20 20 69 73 44 65 66 61 75 6c 74         isDefault
63c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
63d0: 20 20 20 20 69 66 28 20 28 6f 62 6a 63 2d 69 73      if( (objc-is
63e0: 44 65 66 61 75 6c 74 29 21 3d 34 20 26 26 20 28  Default)!=4 && (
63f0: 6f 62 6a 63 2d 69 73 44 65 66 61 75 6c 74 29 21  objc-isDefault)!
6400: 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =3 ){.        Tc
6410: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
6420: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
6430: 22 3f 2d 64 65 66 61 75 6c 74 3f 20 4e 41 4d 45  "?-default? NAME
6440: 20 3f 50 41 52 45 4e 54 2d 56 46 53 3f 22 29 3b   ?PARENT-VFS?");
6450: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6460: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
6470: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a   }.      if( obj
6480: 63 3d 3d 28 34 2b 69 73 44 65 66 61 75 6c 74 29  c==(4+isDefault)
6490: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 61 72   ){.        zPar
64a0: 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ent = Tcl_GetStr
64b0: 69 6e 67 28 6f 62 6a 76 5b 33 2b 69 73 44 65 66  ing(objv[3+isDef
64c0: 61 75 6c 74 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  ault]);.      }.
64d0: 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65        p = sqlite
64e0: 33 5f 69 6e 73 74 76 66 73 5f 63 72 65 61 74 65  3_instvfs_create
64f0: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  (Tcl_GetString(o
6500: 62 6a 76 5b 32 2b 69 73 44 65 66 61 75 6c 74 5d  bjv[2+isDefault]
6510: 29 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20  ), zParent);.   
6520: 20 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20     if( !p ){.   
6530: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
6540: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65  esult(interp, "e
6550: 72 72 6f 72 20 63 72 65 61 74 69 6e 67 20 76 66  rror creating vf
6560: 73 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  s ", 0);.       
6570: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6580: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
6590: 20 69 66 28 20 69 73 44 65 66 61 75 6c 74 20 29   if( isDefault )
65a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
65b0: 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 70  3_vfs_register(p
65c0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
65d0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
65e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
65f0: 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 62 72 65  v[2]);.      bre
6600: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6610: 73 65 20 49 56 5f 42 49 4e 41 52 59 4c 4f 47 3a  se IV_BINARYLOG:
6620: 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a   {.      char *z
6630: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
6640: 63 68 61 72 20 2a 7a 4c 6f 67 20 3d 20 30 3b 0a  char *zLog = 0;.
6650: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 61 72        char *zPar
6660: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ent = 0;.      s
6670: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 3b 0a 20  qlite3_vfs *p;. 
6680: 20 20 20 20 20 69 6e 74 20 69 73 44 65 66 61 75       int isDefau
6690: 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  lt = 0;.      in
66a0: 74 20 69 73 4c 6f 67 64 61 74 61 20 3d 20 30 3b  t isLogdata = 0;
66b0: 0a 20 20 20 20 20 20 69 6e 74 20 61 72 67 62 61  .      int argba
66c0: 73 65 20 3d 20 32 3b 0a 0a 20 20 20 20 20 20 66  se = 2;..      f
66d0: 6f 72 28 61 72 67 62 61 73 65 3d 32 3b 20 61 72  or(argbase=2; ar
66e0: 67 62 61 73 65 3c 28 6f 62 6a 63 2d 32 29 3b 20  gbase<(objc-2); 
66f0: 61 72 67 62 61 73 65 2b 2b 29 7b 0a 20 20 20 20  argbase++){.    
6700: 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
6710: 70 28 22 2d 64 65 66 61 75 6c 74 22 2c 20 54 63  p("-default", Tc
6720: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
6730: 5b 61 72 67 62 61 73 65 5d 29 29 20 29 7b 0a 20  [argbase])) ){. 
6740: 20 20 20 20 20 20 20 20 20 69 73 44 65 66 61 75           isDefau
6750: 6c 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  lt = 1;.        
6760: 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69  }.        else i
6770: 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 22 2d 70  f( 0==strcmp("-p
6780: 61 72 65 6e 74 22 2c 20 54 63 6c 5f 47 65 74 53  arent", Tcl_GetS
6790: 74 72 69 6e 67 28 6f 62 6a 76 5b 61 72 67 62 61  tring(objv[argba
67a0: 73 65 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 20  se])) ){.       
67b0: 20 20 20 61 72 67 62 61 73 65 2b 2b 3b 0a 20 20     argbase++;.  
67c0: 20 20 20 20 20 20 20 20 7a 50 61 72 65 6e 74 20          zParent 
67d0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
67e0: 6f 62 6a 76 5b 61 72 67 62 61 73 65 5d 29 3b 0a  objv[argbase]);.
67f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6800: 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d 73 74    else if( 0==st
6810: 72 63 6d 70 28 22 2d 6c 6f 67 64 61 74 61 22 2c  rcmp("-logdata",
6820: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
6830: 62 6a 76 5b 61 72 67 62 61 73 65 5d 29 29 20 29  bjv[argbase])) )
6840: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4c 6f  {.          isLo
6850: 67 64 61 74 61 20 3d 20 31 3b 0a 20 20 20 20 20  gdata = 1;.     
6860: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6870: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6880: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
6890: 20 20 20 20 69 66 28 20 28 6f 62 6a 63 2d 61 72      if( (objc-ar
68a0: 67 62 61 73 65 29 21 3d 32 20 29 7b 0a 20 20 20  gbase)!=2 ){.   
68b0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
68c0: 6d 41 72 67 73 28 0a 20 20 20 20 20 20 20 20 20  mArgs(.         
68d0: 20 20 20 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62     interp, 2, ob
68e0: 6a 76 2c 20 22 3f 2d 64 65 66 61 75 6c 74 3f 20  jv, "?-default? 
68f0: 3f 2d 70 61 72 65 6e 74 20 56 46 53 3f 20 3f 2d  ?-parent VFS? ?-
6900: 6c 6f 67 64 61 74 61 3f 20 4e 41 4d 45 20 4c 4f  logdata? NAME LO
6910: 47 46 49 4c 45 22 0a 20 20 20 20 20 20 20 20 29  GFILE".        )
6920: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
6930: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6940: 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20    }.      zName 
6950: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
6960: 6f 62 6a 76 5b 61 72 67 62 61 73 65 5d 29 3b 0a  objv[argbase]);.
6970: 20 20 20 20 20 20 7a 4c 6f 67 20 3d 20 54 63 6c        zLog = Tcl
6980: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
6990: 61 72 67 62 61 73 65 2b 31 5d 29 3b 0a 20 20 20  argbase+1]);.   
69a0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 69     p = sqlite3_i
69b0: 6e 73 74 76 66 73 5f 62 69 6e 61 72 79 6c 6f 67  nstvfs_binarylog
69c0: 28 7a 4e 61 6d 65 2c 20 7a 50 61 72 65 6e 74 2c  (zName, zParent,
69d0: 20 7a 4c 6f 67 2c 20 69 73 4c 6f 67 64 61 74 61   zLog, isLogdata
69e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 20  );.      if( !p 
69f0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
6a00: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
6a10: 72 70 2c 20 22 65 72 72 6f 72 20 63 72 65 61 74  rp, "error creat
6a20: 69 6e 67 20 76 66 73 20 22 2c 20 30 29 3b 0a 20  ing vfs ", 0);. 
6a30: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
6a40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
6a50: 0a 20 20 20 20 20 20 69 66 28 20 69 73 44 65 66  .      if( isDef
6a60: 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
6a70: 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
6a80: 73 74 65 72 28 70 2c 20 31 29 3b 0a 20 20 20 20  ster(p, 1);.    
6a90: 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 53 65    }.      Tcl_Se
6aa0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
6ab0: 70 2c 20 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  p, objv[2]);.   
6ac0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6ad0: 0a 20 20 20 20 63 61 73 65 20 49 56 5f 4d 41 52  .    case IV_MAR
6ae0: 4b 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  KER: {.      sql
6af0: 69 74 65 33 5f 76 66 73 20 2a 70 3b 0a 20 20 20  ite3_vfs *p;.   
6b00: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29     if( objc!=4 )
6b10: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72  {.        Tcl_Wr
6b20: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
6b30: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 56 46 53  p, 2, objv, "VFS
6b40: 20 4d 41 52 4b 45 52 22 29 3b 0a 20 20 20 20 20   MARKER");.     
6b50: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
6b60: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
6b70: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 76     p = sqlite3_v
6b80: 66 73 5f 66 69 6e 64 28 54 63 6c 5f 47 65 74 53  fs_find(Tcl_GetS
6b90: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 3b  tring(objv[2]));
6ba0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 20 7c 7c  .      if( !p ||
6bb0: 20 70 2d 3e 78 4f 70 65 6e 21 3d 69 6e 73 74 4f   p->xOpen!=instO
6bc0: 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 54  pen ){.        T
6bd0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
6be0: 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75 63 68  interp, "no such
6bf0: 20 76 66 73 3a 20 22 2c 20 54 63 6c 5f 47 65 74   vfs: ", Tcl_Get
6c00: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c  String(objv[2]),
6c10: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   0);.        ret
6c20: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6c30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
6c40: 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 62 69 6e  ite3_instvfs_bin
6c50: 61 72 79 6c 6f 67 5f 6d 61 72 6b 65 72 28 70 2c  arylog_marker(p,
6c60: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
6c70: 62 6a 76 5b 33 5d 29 29 3b 0a 20 20 20 20 20 20  bjv[3]));.      
6c80: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
6c90: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 62  interp);.      b
6ca0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
6cb0: 20 63 61 73 65 20 49 56 5f 43 4f 4e 46 49 47 55   case IV_CONFIGU
6cc0: 52 45 3a 20 7b 0a 20 20 20 20 20 20 49 6e 73 74  RE: {.      Inst
6cd0: 56 66 73 43 61 6c 6c 20 2a 70 43 61 6c 6c 3b 0a  VfsCall *pCall;.
6ce0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
6cf0: 66 73 20 2a 70 3b 0a 20 20 20 20 20 20 69 66 28  fs *p;.      if(
6d00: 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
6d10: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
6d20: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
6d30: 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52 49  objv, "NAME SCRI
6d40: 50 54 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  PT");.        re
6d50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6d60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 20        }.      p 
6d70: 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
6d80: 6e 64 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  nd(Tcl_GetString
6d90: 28 6f 62 6a 76 5b 32 5d 29 29 3b 0a 20 20 20 20  (objv[2]));.    
6da0: 20 20 69 66 28 20 21 70 20 7c 7c 20 70 2d 3e 78    if( !p || p->x
6db0: 4f 70 65 6e 21 3d 69 6e 73 74 4f 70 65 6e 20 29  Open!=instOpen )
6dc0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
6dd0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
6de0: 70 2c 20 22 6e 6f 20 73 75 63 68 20 76 66 73 3a  p, "no such vfs:
6df0: 20 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e   ", Tcl_GetStrin
6e00: 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 30 29 3b 0a  g(objv[2]), 0);.
6e10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
6e20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
6e30: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  }..      if( str
6e40: 6c 65 6e 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  len(Tcl_GetStrin
6e50: 67 28 6f 62 6a 76 5b 33 5d 29 29 20 29 7b 0a 20  g(objv[3])) ){. 
6e60: 20 20 20 20 20 20 20 70 43 61 6c 6c 20 3d 20 28         pCall = (
6e70: 49 6e 73 74 56 66 73 43 61 6c 6c 20 2a 29 73 71  InstVfsCall *)sq
6e80: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
6e90: 65 6f 66 28 49 6e 73 74 56 66 73 43 61 6c 6c 29  eof(InstVfsCall)
6ea0: 29 3b 0a 20 20 20 20 20 20 20 20 70 43 61 6c 6c  );.        pCall
6eb0: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
6ec0: 70 3b 0a 20 20 20 20 20 20 20 20 70 43 61 6c 6c  p;.        pCall
6ed0: 2d 3e 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f  ->pScript = Tcl_
6ee0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a  DuplicateObj(obj
6ef0: 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20 20 20 54  v[3]);.        T
6f00: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
6f10: 70 43 61 6c 6c 2d 3e 70 53 63 72 69 70 74 29 3b  pCall->pScript);
6f20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6f30: 5f 69 6e 73 74 76 66 73 5f 63 6f 6e 66 69 67 75  _instvfs_configu
6f40: 72 65 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20  re(p, .         
6f50: 20 20 20 74 65 73 74 5f 69 6e 73 74 76 66 73 5f     test_instvfs_
6f60: 78 63 61 6c 6c 2c 20 28 76 6f 69 64 20 2a 29 70  xcall, (void *)p
6f70: 43 61 6c 6c 2c 20 74 65 73 74 5f 69 6e 73 74 76  Call, test_instv
6f80: 66 73 5f 78 64 65 6c 0a 20 20 20 20 20 20 20 20  fs_xdel.        
6f90: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6fa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
6fb0: 69 6e 73 74 76 66 73 5f 63 6f 6e 66 69 67 75 72  instvfs_configur
6fc0: 65 28 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  e(p, 0, 0, 0);. 
6fd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
6fe0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
6ff0: 61 73 65 20 49 56 5f 52 45 50 4f 52 54 3a 0a 20  ase IV_REPORT:. 
7000: 20 20 20 63 61 73 65 20 49 56 5f 44 45 53 54 52     case IV_DESTR
7010: 4f 59 3a 0a 20 20 20 20 63 61 73 65 20 49 56 5f  OY:.    case IV_
7020: 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20 20 73  RESET: {.      s
7030: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 3b 0a 20  qlite3_vfs *p;. 
7040: 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33       if( objc!=3
7050: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
7060: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
7070: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
7080: 41 4d 45 22 29 3b 0a 20 20 20 20 20 20 20 20 72  AME");.        r
7090: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
70a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
70b0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
70c0: 69 6e 64 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  ind(Tcl_GetStrin
70d0: 67 28 6f 62 6a 76 5b 32 5d 29 29 3b 0a 20 20 20  g(objv[2]));.   
70e0: 20 20 20 69 66 28 20 21 70 20 7c 7c 20 70 2d 3e     if( !p || p->
70f0: 78 4f 70 65 6e 21 3d 69 6e 73 74 4f 70 65 6e 20  xOpen!=instOpen 
7100: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
7110: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7120: 72 70 2c 20 22 6e 6f 20 73 75 63 68 20 76 66 73  rp, "no such vfs
7130: 3a 20 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  : ", Tcl_GetStri
7140: 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 30 29 3b  ng(objv[2]), 0);
7150: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7160: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
7170: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 28 28   }..      if( ((
7180: 65 6e 75 6d 20 49 56 5f 65 6e 75 6d 29 69 53 75  enum IV_enum)iSu
7190: 62 29 3d 3d 49 56 5f 44 45 53 54 52 4f 59 20 29  b)==IV_DESTROY )
71a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
71b0: 33 5f 69 6e 73 74 76 66 73 5f 64 65 73 74 72 6f  3_instvfs_destro
71c0: 79 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  y(p);.      }.  
71d0: 20 20 20 20 69 66 28 20 28 28 65 6e 75 6d 20 49      if( ((enum I
71e0: 56 5f 65 6e 75 6d 29 69 53 75 62 29 3d 3d 49 56  V_enum)iSub)==IV
71f0: 5f 52 45 53 45 54 20 29 7b 0a 20 20 20 20 20 20  _RESET ){.      
7200: 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66    sqlite3_instvf
7210: 73 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20  s_reset(p);.    
7220: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 28    }.      if( ((
7230: 65 6e 75 6d 20 49 56 5f 65 6e 75 6d 29 69 53 75  enum IV_enum)iSu
7240: 62 29 3d 3d 49 56 5f 52 45 50 4f 52 54 20 29 7b  b)==IV_REPORT ){
7250: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
7260: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  .        Tcl_Obj
7270: 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77   *pRet = Tcl_New
7280: 4f 62 6a 28 29 3b 0a 0a 20 20 20 20 20 20 20 20  Obj();..        
7290: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
72a0: 65 20 3d 20 28 63 68 61 72 20 2a 29 31 3b 0a 20  e = (char *)1;. 
72b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
72c0: 6e 74 36 34 20 6e 43 6c 69 63 6b 3b 0a 20 20 20  nt64 nClick;.   
72d0: 20 20 20 20 20 69 6e 74 20 6e 43 61 6c 6c 3b 0a       int nCall;.
72e0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 31          for(ii=1
72f0: 3b 20 7a 4e 61 6d 65 3b 20 69 69 2b 2b 29 7b 0a  ; zName; ii++){.
7300: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7310: 33 5f 69 6e 73 74 76 66 73 5f 67 65 74 28 70 2c  3_instvfs_get(p,
7320: 20 69 69 2c 20 26 7a 4e 61 6d 65 2c 20 26 6e 43   ii, &zName, &nC
7330: 6c 69 63 6b 2c 20 26 6e 43 61 6c 6c 29 3b 0a 20  lick, &nCall);. 
7340: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61           if( zNa
7350: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
7360: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 45 6c 65 6d    Tcl_Obj *pElem
7370: 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
7380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c  .            Tcl
7390: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
73a0: 65 6d 65 6e 74 28 30 2c 20 70 45 6c 65 6d 2c 20  ement(0, pElem, 
73b0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
73c0: 28 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20  (zName, -1));.  
73d0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69            Tcl_Li
73e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
73f0: 6e 74 28 30 2c 20 70 45 6c 65 6d 2c 20 54 63 6c  nt(0, pElem, Tcl
7400: 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 43 61 6c 6c  _NewIntObj(nCall
7410: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
7420: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
7430: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 45 6c 65  dElement(0, pEle
7440: 6d 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  m, Tcl_NewWideIn
7450: 74 4f 62 6a 28 6e 43 6c 69 63 6b 29 29 3b 0a 20  tObj(nClick));. 
7460: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c             Tcl_L
7470: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
7480: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 70 45 6c  ent(0, pRet, pEl
7490: 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  em);.          }
74a0: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
74b0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
74c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
74d0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  t);.      }..   
74e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
74f0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
7500: 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  L_OK;.}.#endif /
7510: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
7520: 49 4e 53 54 56 46 53 20 2a 2f 0a 0a 2f 2a 20 41  INSTVFS */../* A
7530: 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c 65  lternative imple
7540: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c  mentation of sql
7550: 69 74 65 33 5f 69 6e 73 74 76 66 73 20 77 68 65  ite3_instvfs whe
7560: 6e 20 74 68 65 20 72 65 61 6c 0a 2a 2a 20 69 6d  n the real.** im
7570: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
7580: 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 0a 2a 2f  unavailable. .*/
7590: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
75a0: 45 4e 41 42 4c 45 5f 49 4e 53 54 56 46 53 0a 73  ENABLE_INSTVFS.s
75b0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
75c0: 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 28 0a  qlite3_instvfs(.
75d0: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
75e0: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
75f0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
7600: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
7610: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
7620: 7b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  {.  Tcl_AppendRe
7630: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20  sult(interp, .  
7640: 20 20 20 22 6e 6f 74 20 63 6f 6d 70 69 6c 65 64     "not compiled
7650: 20 77 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 45   with -DSQLITE_E
7660: 4e 41 42 4c 45 5f 49 4e 53 54 56 46 53 3b 20 73  NABLE_INSTVFS; s
7670: 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 20 69  qlite3_instvfs i
7680: 73 20 22 0a 20 20 20 20 20 22 75 6e 61 76 61 69  s ".     "unavai
7690: 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 2a 29 30  lable", (char*)0
76a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
76b0: 45 52 52 4f 52 3b 0a 7d 0a 23 65 6e 64 69 66 20  ERROR;.}.#endif 
76c0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
76d0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4e 53 54 56 46  TE_ENABLE_INSTVF
76e0: 53 29 20 2a 2f 0a 0a 69 6e 74 20 53 71 6c 69 74  S) */..int Sqlit
76f0: 65 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74  etestOsinst_Init
7700: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
7710: 65 72 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61  erp){.  Tcl_Crea
7720: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
7730: 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 69 6e  erp, "sqlite3_in
7740: 73 74 76 66 73 22 2c 20 74 65 73 74 5f 73 71 6c  stvfs", test_sql
7750: 69 74 65 33 5f 69 6e 73 74 76 66 73 2c 20 30 2c  ite3_instvfs, 0,
7760: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
7770: 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  L_OK;.}..#endif 
7780: 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a  /* SQLITE_TEST *
7790: 2f 0a                                            /.